好久没有更新博客了 更新一波吧,,,

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5239

——————————————————————————————————————

Doom

Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 1524 Accepted Submission(s): 419

Problem Description
THE END IS COMINGGGGGG!

Mike has got stuck on a mystery machine. If he cannot solve this problem,he will go to his doom.

This machine is consist of n cells,and a screen. The i-th cell contains a number ai(1≤i≤n). The screen also contains a number s,which is initially 0.

There is a button on each cell. When the i-th is pushed,Mike observes that,the number on the screen will be changed to s+ai,where s is the original number. and the number on the i-th cell will be changed to a2i.

Mike observes that the number is stored in radix p,where p=9223372034707292160. In other words,the operation is under modulo p.

And Now,Mike has got a list of operations. One operation is to push buttons between from l-th to r-th (both included),and record the number on the screen. He is tired of this stupid work,so he asks for your help. Can you tell him,what are the numbers recorded.

Input
The first line contains an integer T(T≤5),denoting the number of test cases.

For each test case,the first line contains two integers n,m(1≤n,m≤105).

The next line contains n integers ai(0≤ai< p),which means the initial values of the n cells.

The next m lines describe operations. In each line,there are two integers l,r(1≤l≤r≤n),representing the operation.

Output
For each test case,output ”Case #t:”,to represent this is the t-th case. And then output the answer for each query operation,one answer in a line.

For more details you can take a look at the example.

Sample Input
2
4 4
2 3 4 5
1 2
2 3
3 4
1 4
1 3
2
1 1
1 1
1 1

Sample Output
Case #1:
5
18
39
405
Case #2:
2
6
22

——————————————————-.

题目大意:
给你一个序列,每个序列有一个值.

每次选择一个区间,将这个区间的数的和加起来,然后让这个区间的每个数都平方.

所有数都是对9223372034707292160取模的

注意这个模数,和正常的模数不一样,那么就一定有问题

然后通过打表能发现,每个数不断自身平方对p取模后经过有限次 就不会变化了,

测试少于30次

所以也就是说每个节点至多会被更新30次,

所以可以直接维护线段树,打上平方标记后,还要打一个标记表示这个区间的数已经不会变化了,这样这个位置就不用再更新了

这样的话 复杂度就是 O(nlogn30)

附本题代码

#include <bits/stdc++.h>
typedef unsigned long long int LLu;
typedef unsigned __int64 LL;
using namespace std;

const int N   = 100000+7;
const LL  MOD = (LL)9223372034707292160 ;

#define lal puts("****");
#define pb push_back
#define mp make_pair

inline int read(){
    int x = 0,f=1;char ch = getchar();
    for(;ch<'0'||'9'<ch;ch=getchar()) if(ch == '-') getchar();
    for(;'0'<=ch&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
    return x*f;
}

/********************************************************/
int n,m,x;
LL a[N];
LL qmul(LL a,LL b){
    LL res = 0;
    while(b){
        if(b&1) res=(res+a)%MOD;
        b>>=1,a=(a+a)%MOD;
    }
    return res;
}

LL sum[N<<2];
bool vis[N<<2];
void pushup(int rt){
    vis[rt]=vis[rt<<1]&vis[rt<<1|1];
    sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%MOD;
}
void build(int rt,int l,int r){
    sum[rt]=0,vis[rt]=false;
    if(l==r) {sum[rt]=a[l];return ;}
    int m = r+l >>1;
    build(rt<<1,l,m);
    build(rt<<1|1,m+1,r);
    pushup(rt);
}

void update(int rt,int r,int L,int R){
    if(vis[rt]&&L<=l&&r<=R)return ;
    if(l==r){
        LL tmp = qmul(sum[rt],sum[rt]);
        if(tmp == sum[rt]) vis[rt]=true;
        sum[rt]=tmp;
        return ;
    }
    int m =r+l >> 1;
    if(L<=m) update(rt<<1,L,R);
    if(R> m) update(rt<<1|1,r,R);
    pushup(rt);
}

LL query(int rt,int R){
    if(L<=l&&r<=R) return sum[rt];
    int m = r+l >> 1;
    LL ans = 0;
    if(L<=m) ans+= query(rt<<1,R),ans%=MOD;
    if(R> m) ans+= query(rt<<1|1,ans%=MOD;
    return ans;
}

int main(){
// cout << MOD << endl;
// for(int i=2;i<=10;i++){
// LL x=i;
// for(int j=1;j<=100;j++){
// cout<<x<<"\n";
// x=qmul(x,x);
// }
// puts("-------------------------------");
// }

    int _ = 1,kcase = 0;
    for(scanf("%d",&_);_--;){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%llu",&a[i]);
        LL ans = 0;
        build(1,1,n);
        printf("Case #%d:\n",++kcase);
        for(int l,r;m--;){
            scanf("%d%d",&l,&r);
            ans += query(1,n,r);ans%=MOD;
            update(1,r);
            printf("%llu\n",ans);
        }
    }
    return 0;
}

HDU 5239 Doom [线段树,更新有上界]【数据结构】的更多相关文章

  1. Data 解析 Doom 的 WAD 文件

    本文会重点介绍作为值类型的Data是如何封装NSData的。这个应用会读取和解析一个Doom毁灭战士的WAD文件2。我认为这是相对NSData的一大进步。数据转换另一方面,从现有的变量内容里得到Data缓冲,虽然与下面的Doom的例子不相关,但是非常容易实现,解析DoomWAD文件我小时候非常热爱Doom这个游戏。以下两个文件解释了DoomWAD文件的设计。IWAD表明是官方的DoomWAD文件,PWAD表明是在运行时补充内容到主要WAD文件的补丁文件。目录的长度取决于WAD头文件里给出的数字。

  2. Java数据结构之线段树的原理与实现

    线段树是一种二叉搜索树,是用来维护区间信息的数据结构。本文将利用示例详细讲讲Java数据结构中线段树的原理与实现,需要的可以参考一下

  3. Java数据结构之线段树中的懒操作详解

    对于线段树,若要求对区间中的所有点都进行更新,可以引入懒操作。懒操作包括区间更新和区间查询操作。本文将通过一个示例和大家详细聊聊线段树中的懒操作,需要的可以参考一下

  4. ajax – 在加载彗星/服务器推送iframe的时候停止浏览器“throbber of doom”

    当使用Comet或AjaxLongPull技术时–通常使用iframe。虽然那个iframe正在等待长连接关闭,浏览器正在旋转其throbber。一些网站,例如etherpad.com,设法使它停止。它也是一个标准的工作草案,而不是像整个iframe彗星事物的黑客。>XMLHttpRequest–在Firefox和Safari中,但不是在IE中,它可以用于长拉页面加载,使其能够处理每个readyStateChange事件上显示的片段。–见下面的评论>ActiveXObject–可以在IE中使用,以创建在当

  5. POJ2823 Sliding Window(单调队列,线段树,set,deque)

    这种方法每求一个f,都要进行k-1次的比较,复杂度为O(N*k)。当然主要是i的前k-1个数中的最大值了。答案是可以,这就要用到单调递减队列。所以当index[队首元素]<i-k+1时,将队首元素删除。一般来说,deque是STL总的双端队列容器,用deque可以很方便的实现单调队列代码单调队列:set做法线段树:

  6. BZOJ 1798 [Ahoi2009] Seq 维护序列seq [线段树+多重标记下传]【数据结构】

    有长为N的数列,不妨设为a1,a2,…Input第一行两个整数N和P。第二行含有N个非负整数,从左到右依次为a1,aN,。表示把所有满足t≤i≤g的ai改为ai×c。操作2:“2tgc”。同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。Output对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。SampleInput7431234567512553242379313347SampleOutput2358HINT初始时数列为。对第5次操作,和为29+34+15+16=

  7. Codeforces 794F - Leha and security system [线段树-区间更新]【数据结构】

    MeanwhilehackerLehaarrivedinBankopolisanddecidedtotestthesystem!

  8. HDU 5239 Doom [线段树,更新有上界]【数据结构】

    好久没有更新博客了更新一波吧,,,题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5239——————————————————————————————————————DoomTimeLimit:12000/6000MS(Java/Others)MemoryLimit:524288/524288K(Java/Others)TotalSubmission(

  9. 【数据结构】[BZOJ4771] 七彩树【无实现】

    Description给出一棵n个点的树,每个点有颜色多次询问以点x为根的子树中距离不超过d的点中不同颜色种类数强制在线n,m

  10. 【数据结构】【图论】[JZOJ4864] Dash Speed【无实现】

    Description给出n个点的一棵树,每条边有一个承受区间[L,R]接下来m个询问,每次询问一个x,表示需要回答所有承受区间包含x的边组成的森林的直径n,m

随机推荐

  1. 【数据结构】单调栈

    显然,每个发射站发来的能量有可能被0或1或2个其他发射站所接受,特别是为了安全,每个发射站接收到的能量总和是我们很关心的问题。由于数据很多,现只需要你帮忙计算出接收最多能量的发射站接收的能量是多少。输入输出格式输入格式:第1行:一个整数N;第2到N+1行:第i+1行有两个整数Hi和Vi,表示第i个人发射站的高度和发射的能量值。输入输出样例输入样例:34235610输出样例:7题解中有讲解代码实现

  2. BZOJ 1798 [Ahoi2009] Seq 维护序列seq [线段树+多重标记下传]【数据结构】

    有长为N的数列,不妨设为a1,a2,…Input第一行两个整数N和P。第二行含有N个非负整数,从左到右依次为a1,aN,。表示把所有满足t≤i≤g的ai改为ai×c。操作2:“2tgc”。同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。Output对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。SampleInput7431234567512553242379313347SampleOutput2358HINT初始时数列为。对第5次操作,和为29+34+15+16=

  3. 陈越《数据结构》第一讲 基本概念

    陈越《数据结构》第一讲基本概念1什么是数据结构1.1引子例子:如何在书架上摆放图书?数据结构是:1.数据对象在计算机中的组织方式;2.数据对象必定与一系列加在其上的操作相关联;3.完成这些操作所用的方法就是算法。抽象数据类型数据类型-数据对象集;-数据集合相关联的操作集。抽象-与存放数据的机器无关;-与数据存储的物理结构无关;-与实现操作的算法和编程语言均无关。

  4. 陈越《数据结构》第二章 线性结构

    表中元素个数称为线性表的长度;线性表没有元素时,称为空表;表起始位置称表头,表结束位置称表尾。插入和删除操作只能在链栈的栈顶进行。

  5. 【数据结构】

    非线性结构:线性结构的元素之间具有线性关系,非线性结构中的元素之间不再是序列的关系,他们呈现的是更复杂的层次关系,即一个数据元素有且仅有一个直接前驱,但可有另个或者多个直接后继,显然比序列关系复杂常见非线性结构:树,图散列表PHP中的hashtable就是哈希表就是由数组和链表组成,一个长度为16的数组中,每个元素存储的是一个链表的头结点。

  6. 【数据结构】【C++STL】FIFO队列&amp;优先队列

    首先都需要打头文件queueFIFO队列是先进先出的就好像排队一样STL定义FIFO队列优先队列的话是有优先级存在的STL定义优先队列定义方式都是大根堆FIFO队列和优先队列都有一些操作COYG

  7. 【数据结构】 堆

    自底向上://增加/减少已有节点值Heap_Increase_Key//向堆插入新的节点HeapInsert自顶向下://替换堆顶后,维持堆函数KeepHeap//弹出堆顶函数Pop

  8. 【数据结构】链表

    线性表的顺序存储结构有存储密度高及能够随机存取等优点,但存在以下不足:线性表的链式存储(单链表)的实现单向循环链表的实现

  9. 伸展树(SPLAY)个人总结+模板 [平衡树]【数据结构】【模板】

    前言最近3个月内,无论是现场赛还线上赛中SPLAY出现的概率大的惊人啊啊啊!!!然而不会的我就GG了,同时发现大家都会SPLAY,,,,然后就学习了一波。——————————————————————————-附上整体代码-md贴上来太卡了,去题解里看吧维护序列的维护一堆数的

  10. BZOJ 1895 &amp; POJ 3580 supermemo [SPLAY]【数据结构】

    Ay}Ttimes.Forexample,performing“REVOLVE242”on{1,5}INSERTxP:insertPafterAx.Forexample,performing“INSERT24”on{1,5}DELETEx:deleteAx.Forexample,performing“DELETE2”on{1,5}MINxy:querytheparticipantwhatistheminimumnumberinsub-sequence{Ax…Ay}.Forexample,thecorrec

返回
顶部