loj#6169. 相似序列 hash+主席树

因为他的相似是在排完序下的

那我就在排序的情况下hash啊

这怎么hash啊

主席树啊!

没了

  1 #include <bits/stdc++.h>
  2 #define MAXNODE 5000000
  3 #define MAX 200000
  4 using namespace std;
  5 int NODE,T,n,q,_l,_r,L,R;
  6 int a[MAX],val[MAX],ma[MAX],root[MAX];
  7 int tr[MAXNODE],c[MAXNODE][2];
  8 int change(int acc,int l,int r,int x,int y)
  9 {
 10     if(l==r)
 11     {
 12         tr[++NODE]=y+tr[acc];
 13         c[NODE][0]=c[NODE][1]=0;
 14         return NODE;
 15     }
 16     int now=++NODE,mid=l+r>>1;
 17     if(x<=mid)
 18         c[now][0]=change(c[acc][0],l,mid,x,y),
 19         c[now][1]=c[acc][1];
 20     else
 21         c[now][0]=c[acc][0],
 22         c[now][1]=change(c[acc][1],mid+1,r,x,y);
 23     tr[now]=tr[c[now][0]]+tr[c[now][1]];
 24     return now;
 25 }
 26 int tre(int rt,int x)
 27 {
 28     int ret=0;
 29     for(int now=root[rt],l=1,r=MAX;l<r;)
 30     {
 31         int mid=l+r>>1;
 32         if(x<=mid)
 33         {
 34             r=mid,now=c[now][0];
 35             if(r==x) return ret+tr[now];
 36         }
 37         if(x>mid)
 38             l=mid+1,ret+=tr[c[now][0]],now=c[now][1];
 39     }
 40     return ret;
 41 }
 42 int ha(int l,int r,int L,int R)
 43 {
 44     return tre(r,R)-tre(r,L-1)-tre(l-1,R)+tre(l-1,L-1);
 45 }
 46 int main()
 47 {
 48     srand(time(0));
 49     for(scanf("%d",&T);T;T--)
 50     {
 51         scanf("%d%d",&n,&q);
 52         for(int i=1;i<=n;i++)
 53         {
 54             scanf("%d",&a[i]);
 55             val[i]=ma[a[i]]?ma[a[i]]:(ma[a[i]]=rand());
 56     //        val[i]=a[i];
 57         }
 58         root[0]=1;c[1][0]=c[1][1]=0;tr[1]=0;NODE=1;
 59         for(int i=1;i<=n;i++)
 60             root[i]=change(root[i-1],1,MAX,a[i],val[i]);
 61         for(int i=1;i<=q;i++)
 62         {
 63             scanf("%d%d%d%d",&_l,&_r,&L,&R);
 64             bool gg=0;
 65             for(int l=1,r=MAX;l<r;)
 66             {
 67                 int mid=l+r>>1;
 68                 if(ha(_l,_r,l,mid)==ha(L,R,l,mid))
 69                     l=mid+1;
 70                 else
 71                 if(ha(_l,_r,mid+1,r)==ha(L,R,mid+1,r))
 72                     r=mid;
 73                 else
 74                 {
 75                     int ll=l,rr=mid;
 76                     for(;ll<rr;)
 77                     {
 78                         int mm=ll+rr>>1;
 79                         if(ha(_l,_r,ll,mm)==ha(L,R,ll,mm)) ll=mm+1;
 80                         else rr=mm;
 81                     }
 82                     int tt=ll;
 83                     ll=mid+1,rr=r;
 84                     for(;ll<rr;)
 85                     {
 86                         int mm=ll+rr>>1;
 87                         if(ha(_l,_r,mm+1,rr)==ha(L,R,mm+1,rr)) rr=mm;
 88                         else ll=mm+1;
 89                     }
 90                     int ttt=ll;
 91                     if(tt==ttt-1 || ha(_l,_r,tt+1,ttt-1)==0 && ha(L,R,tt+1,ttt-1)==0) break;
 92                     else
 93                     {
 94                         gg=1;
 95                         break;
 96                     }
 97                 }
 98             }
 99             puts((gg==1)?"NO":"YES");
100         }
101     }
102     return 0;
103 } 

 

posted @ 2017-07-31 09:40  汪立超  阅读(146)  评论(0编辑  收藏