先上题目:
Time Limit: 15000/5000 MS
(Java/Others) Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s): 2330 Accepted
Submission(s): 831
#include <cstdio> #include <cstring> #include <algorithm> #define MAX 50000 #define NUM 1000000 #define Qu 200000 #define LL __int64 using namespace std; LL c[MAX+4]; LL s[MAX+4]; LL qu[Qu+4]; int vis[NUM+4]; int n,m; typedef struct{ int l,r; int id; }Q; Q q[Qu+4]; bool cmp(Q x,Q y){ if(x.r==y.r) return x.l<y.l; return x.r<y.r; } int lowbit(int a){ return a&(-a); } void add(int r,LL v){ for(int i=r;i<=n;i+=lowbit(i)){ s[i]+=v; } } LL sum(int r){ LL ans=0; for(int i=r;i>0;i-=lowbit(i)){ ans+=s[i]; } return ans; } int main() { int t; //freopen("data.txt","r",stdin); scanf("%d",&t); while(t--){ memset(c,0,sizeof(c)); memset(s,0,sizeof(s)); memset(vis,0,sizeof(vis)); memset(q,0,sizeof(q)); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%I64d",&c[i]); } scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d %d",&q[i].l,&q[i].r); q[i].id=i; } sort(q,q+m,cmp); int k=1; for(int i=0;i<m;i++){ while(k<=q[i].r){ if(vis[c[k]]!=0){ add(vis[ c[k] ],-c[k]); } vis[c[k]]=k; add(vis[c[k]],c[k]); k++; } qu[q[i].id]=sum(q[i].r)-sum(q[i].l-1); } for(int i=0;i<m;i++){ printf("%I64d\n",qu[i]); } } return 0; }
原文:http://www.cnblogs.com/sineatos/p/3561323.html