[HDU3333]Turing Tree

莫队模板题...

不过树状数组也可以做...跟HH的项链几乎一模一样,离线询问,然后记录前缀,更新的时候把前缀删掉就好了,然而这题开long long,卡空间

 

 1 //hgs AK IOI,IMO,ICHO,IPHO
 2 #include<bits/stdc++.h>
 3 #define int long long
 4 #define writeln(x)  write(x),puts("")
 5 #define writep(x)   write(x),putchar(' ')
 6 using namespace std;
 7 inline int read(){
 8     int ans=0,f=1;char chr=getchar();
 9     while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();}
10     while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
11     return ans*f;
12 }void write(int x){
13     if(x<0) putchar('-'),x=-x;
14     if(x>9) write(x/10);
15     putchar(x%10+'0');
16 }const int M = 3e5+5;
17 int n,m,a[M],pos[M],pre[M],b[M],len,Ans[M];
18 struct Que{int l,r,id;}q[M];
19 bool cmp(const Que&x,const Que&y){return x.r<y.r;}
20 int s[M];
21 #define lowbit(x) (x&-x)
22 inline void Update(int x,int y){if(x==0)return;for(;x<=n;x+=lowbit(x))s[x]+=y;}
23 inline int  Query (int x){int ans=0;for(;x;x-=lowbit(x))ans+=s[x];return ans;}
24 signed main(){
25     int Time=read();
26     while(Time--){memset(pre,0,sizeof(pre)),memset(pos,0,sizeof(pos));
27         n=read();for(int i=1;i<=n;++i)b[i]=a[i]=read();
28         sort(b+1,b+n+1),len=unique(b+1,b+n+1)-b-1;memset(s,0,sizeof(s));
29         for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+len+1,a[i])-b,pre[i]=pos[a[i]],pos[a[i]]=i;
30         m=read();for(int i=1;i<=m;++i)q[i].l=read(),q[i].r=read(),q[i].id=i;sort(q+1,q+m+1,cmp);
31         for(int i=1,j=1;i<=m;i++){
32             for(;j<=q[i].r;j++)Update(pre[j],-b[a[pre[j]]]),Update(j,b[a[j]]);
33             Ans[q[i].id]=Query(q[i].r)-Query(q[i].l-1);
34         }for(int i=1;i<=m;i++)printf("%lld\n",Ans[i]);
35     }
36     return 0;
37 }

 

posted @ 2019-11-02 10:51  zheng_liwen  阅读(204)  评论(0编辑  收藏  举报
/*去广告*/