Time Limit: 15000/5000 MS
(Java/Others) Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s): 2447 Accepted
Submission(s): 865
#include<iostream> #include<cstdio> #include<map> #include<algorithm> using namespace std; int dit[50010]; __int64 ans[200010]; __int64 f[50010]; inline int lowbit(int x){ return x&(-x);} struct query { int lp,rp,id; }q[200010]; bool mycomp(const query &a,const query &b) { if(a.rp==b.rp) return a.lp<b.lp; return a.rp<b.rp; } void swap(int &a,int &b){ int t=a;a=b;b=t;} void add(int x,int d,int n) { while(x<=n){ f[x]+=d;x+=lowbit(x); } } __int64 sum(int x) { __int64 ret=0; while(x>=1){ ret+=f[x];x-=lowbit(x); } return ret; } int main() { int n,m,i,rp,t,x; map<int,int> mp; scanf("%d",&t); while(t--) { mp.clear(); memset(f,0,sizeof(f)); scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&dit[i]); scanf("%d",&m); for(i=0;i<m;i++) { scanf("%d %d",&q[i].lp,&q[i].rp); if(q[i].lp>q[i].rp) swap(q[i].lp,q[i].rp); q[i].id=i; } sort(q,q+m,mycomp); rp=1; for(i=0;i<m;i++) { while(rp<=q[i].rp) { x=dit[rp]; if(mp[x]!=0) add(mp[x],-x,n); add(rp,x,n); mp[x]=rp; rp++; } ans[q[i].id]=sum(q[i].rp)-sum(q[i].lp-1); } for(i=0;i<m;i++) printf("%I64d\n",ans[i]); } return 0; }
原文:http://www.cnblogs.com/xiong-/p/3585206.html