hdu3333 线段树点修改区间求和(离散化判重)+离线算法

  1 #include<stdio.h>
  2 #include<string.h>
  3 int ql,qr,p;
  4 long long fsum,v;
  5 int f[100005],g[100005],a[100005],b[100005];
  6 int r[100005],l[100005],hash[100005],real[100005];
  7 long long ans[100005],sumv[300005];
  8 void mysort(int l,int r)
  9 {
 10     int i=l,j=r,x=a[(i+j)/2],y;
 11     while (i<=j)
 12     {
 13         while (a[i]<x) i++;
 14         while (x<a[j]) j--;
 15         if (i<=j)
 16         {
 17             y=a[i]; a[i]=a[j]; a[j]=y;
 18             y=g[i]; g[i]=g[j]; g[j]=y;
 19             i++; j--;
 20         }
 21     }
 22     if (i<r) mysort(i,r);
 23     if (l<j) mysort(l,j);
 24 }
 25 void yoursort(int ll,int rr)
 26 {
 27     int i=ll,j=rr,x=r[(i+j)/2],y;
 28     while (i<=j)
 29     {
 30         while (r[i]<x) i++;
 31         while (x<r[j]) j--;
 32         if (i<=j)
 33         {
 34             y=r[i]; r[i]=r[j]; r[j]=y;
 35             y=l[i]; l[i]=l[j]; l[j]=y;
 36             y=f[i]; f[i]=f[j]; f[j]=y;
 37             i++; j--;
 38         }
 39     }
 40     if (ll<j) yoursort(ll,j);
 41     if (i<rr) yoursort(i,rr);
 42 }
 43 void update(int o,int l,int r)
 44 {
 45     int mid=l+(r-l)/2;
 46     if (l==r) sumv[o]=v;
 47     else{
 48         if (p<=mid) update(o*2,l,mid);
 49         else update(o*2+1,mid+1,r);
 50         sumv[o]=sumv[o*2]+sumv[o*2+1];
 51     }
 52 }
 53 void query(int o,int l,int r)
 54 {
 55     int mid=l+(r-l)/2;
 56     if (ql<=l&&r<=qr) fsum+=sumv[o];
 57     else{
 58         if (ql<=mid) query(o*2,l,mid);
 59         if (mid<qr) query(o*2+1,mid+1,r);
 60     }
 61 }
 62 int main()
 63 {
 64     int T,n,i,m,j;
 65     scanf("%d",&T);
 66     while (T--)
 67     {
 68         scanf("%d",&n);
 69         for (i=1;i<=n;i++) { scanf("%d",&a[i]); g[i]=i; real[i]=a[i];}
 70         mysort(1,n);
 71         b[g[1]]=1;
 72         for (i=2;i<=n;i++)
 73         if (a[i]==a[i-1]) b[g[i]]=b[g[i-1]];
 74         else b[g[i]]=i;
 75         memset(hash,0,sizeof(hash));
 76         memset(sumv,0,sizeof(sumv));
 77         scanf("%d",&m);
 78         for (i=1;i<=m;i++) {f[i]=i; scanf("%d%d",&l[i],&r[i]); }
 79         yoursort(1,m);
 80         for (i=1;i<=r[1];i++)
 81         {
 82             if (hash[b[i]]!=0)
 83             {
 84                 p=hash[b[i]]; v=0;
 85                 update(1,1,n);
 86             }
 87             p=i; v=real[i];
 88             update(1,1,n);
 89             hash[b[i]]=i;
 90         }
 91         ql=l[1]; qr=r[1]; fsum=0;
 92         query(1,1,n);
 93         ans[f[1]]=fsum;
 94         for (i=2;i<=m;i++)
 95         {
 96             for (j=r[i-1]+1;j<=r[i];j++)
 97             {
 98             if (hash[b[j]]!=0)
 99             {
100                 p=hash[b[j]]; v=0;
101                 update(1,1,n);
102             }
103             p=j; v=real[j];
104             update(1,1,n);
105             hash[b[j]]=j;
106             }
107             ql=l[i]; qr=r[i]; fsum=0;
108             query(1,1,n);
109             ans[f[i]]=fsum;
110         }
111         for (i=1;i<=m;i++) printf("%I64d\n",ans[i]);
112     }
113 }

http://acm.hdu.edu.cn/showproblem.php?pid=3333

posted on 2014-07-25 03:12  xiao_xin  阅读(184)  评论(0编辑  收藏  举报

导航