hdu 3874 Necklace 线段树

来源:互联网 发布:淘宝网店装修多少钱 编辑:程序博客网 时间:2024/05/22 00:07

跟hdu3333相同,改下N和Q数据范围即可

#include<iostream>#include<cstdio>#include<algorithm>#include<map>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int N=50005;const int Q=200005;typedef long long LL;int n,tt,qq;map<LL,int> hashs;LL sum[N*4],A[N],ans[Q];struct QN{int l,r,index;}q[Q];int cmp(QN a,QN b){return a.r<b.r;}void build(int l,int r,int rt){sum[rt]=0;if(l==r) return;int m=(l+r)/2;build(lson);build(rson);}void push_up(int rt){sum[rt]=sum[rt*2]+sum[rt*2+1];}void update(int a,LL c,int l,int r,int rt){//单点更新a的值为cif(l==r){sum[rt]=c;return;}int m=(l+r)/2;if(a<=m)update(a,c,lson);elseupdate(a,c,rson);push_up(rt);}LL query(int a,int b,int l,int r,int rt){if(a<=l&&b>=r)return sum[rt];int m=(l+r)/2;LL rst=0;if(a<=m)rst+=query(a,b,lson);if(b>m)rst+=query(a,b,rson);return rst;}void solve(){int pos=1;for(int i=0;i<qq;i++){while(q[i].r>=pos){//加入aif(hashs[A[pos]])//删除前一个update(hashs[A[pos]],0,1,n,1);hashs[A[pos]]=pos;update(pos,A[pos],1,n,1);pos++;//pos放上面好像出问题}ans[q[i].index]=query(q[i].l,q[i].r,1,n,1);}}int main(){for(cin>>tt;tt>0;tt--){hashs.clear();cin>>n;build(1,n,1);for(int i=1;i<=n;i++)scanf("%d",&A[i]);cin>>qq;for(int i=0;i<qq;i++){//按r排序,离线查scanf("%d %d",&q[i].l,&q[i].r);q[i].index=i;}sort(q,q+qq,cmp);solve();for(int i=0;i<qq;i++)printf("%I64d\n",ans[i]);}return 0;}


0 0
原创粉丝点击