2017 3 17 线段树套主席树

    写了半场考试你告我正解是bitset??而且竟然比我跑得快??

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<vector>
  6 #define inf 0x3f3f3f3f
  7 #define N 50005
  8 #define ls a[x].l,a[y].l,l,mid
  9 #define rs a[x].r,a[y].r,mid+1,r
 10 using namespace std;
 11 int n;
 12 const int mx=50000;
 13 inline int read()
 14 {
 15     char c=getchar();int p=0,f=1;
 16     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
 17     while(c>='0'&&c<='9')p=p*10+c-'0',c=getchar();
 18     return p*f;
 19 }
 20 struct fk
 21 {
 22     struct point
 23     {
 24         int x,y;
 25         friend bool operator < (const point &aa,const point &bb)
 26         {
 27             if(aa.y!=bb.y)return aa.y<bb.y;
 28             return aa.x<bb.x;
 29         }
 30     }dian[N];
 31     int lix[N+5],liy[N+5],cnt1,cnt2,pre[mx+5],now[mx+5];
 32     struct node
 33     {
 34         int l,r,sum;
 35     }a[N*350];int cnt;
 36     int qur(int x,int y,int l,int r,int ll,int rr)
 37     {
 38         if(l>=ll&&r<=rr)return a[x].sum-a[y].sum;
 39         int mid=(l+r)>>1;
 40         if(ll>mid)return qur(rs,ll,rr);
 41         if(rr<=mid)return qur(ls,ll,rr);
 42         return qur(ls,ll,rr)+qur(rs,ll,rr);
 43     }
 44     void insert(int x,int y,int l,int r,int pos)
 45     {
 46         if(l==r)
 47         {
 48             a[x].sum=a[y].sum+1;
 49             return ;
 50         }
 51         int mid=(l+r)>>1;
 52         if(pos<=mid)
 53         {
 54             if(!a[x].l)a[x].l=++cnt;
 55             a[x].r=a[y].r;
 56             insert(ls,pos);
 57         }
 58         else 
 59         {
 60             if(!a[x].r)a[x].r=++cnt;
 61             a[x].l=a[y].l;
 62             insert(rs,pos);
 63         }
 64         a[x].sum=a[a[x].l].sum+a[a[x].r].sum;
 65         return ;
 66     }
 67     vector<int>root[N*3],xx[N*3];
 68     vector<int>::iterator it;
 69     struct nd
 70     {
 71         int pr,yuan;
 72         nd(int x,int y)
 73         {
 74             yuan=x;pr=y;
 75         }
 76         friend bool operator < (const nd &aa,const nd &bb)
 77         {
 78             return aa.pr<bb.pr;
 79         }
 80     };
 81     vector<nd>pai[N*3];
 82     void jia(int x)
 83     {
 84         int pr=-1,prroot=0;
 85         root[x].push_back(0);xx[x].push_back(-1);
 86         for(int i=0;i<pai[x].size();i++)
 87         {
 88             int pp=pai[x][i].yuan;
 89             if(pre[pp]==pr)
 90             {
 91                 root[x][root[x].size()-1]=++cnt;
 92                 insert(root[x][root[x].size()-1],prroot,0,mx,dian[pp].x);
 93             }
 94             else
 95             {
 96                 root[x].push_back(++cnt);
 97                 xx[x].push_back(pre[pp]);
 98                 insert(root[x][root[x].size()-1],prroot,0,mx,dian[pp].x);
 99             }
100             pr=pre[pp];
101             prroot=root[x][root[x].size()-1];
102         }
103         xx[x].push_back(0x3f3f3f3f);
104         return ;
105     }
106     void build(int x,int l,int r,int ll,int rr)
107     {
108         if(ll>rr)return ;
109         int mid=(l+r)>>1;
110         int ed=rr;
111         for(int i=ll;i<=rr;i++)
112         {
113             if(dian[i].y<=mid)ed=i;
114             pai[x].push_back(nd(i,pre[i]));
115         }
116         sort(pai[x].begin(),pai[x].end());
117         jia(x);
118         if(l==r)return ;
119         build(x*2,l,mid,ll,ed);
120         build(x*2+1,mid+1,r,ed+1,rr);
121     }
122     int qu(int x,int l,int r,int ll,int rr,int qx,int qy)
123     {
124         if(ll<=l&&rr>=r)
125         {
126             int ha=0;int ta=xx[x].size()-1;
127             while(ha<=ta)
128             {
129                 int mid=(ha+ta)>>1;
130                 if(xx[x][mid]<ll)ha=mid+1;
131                 else ta=mid-1;
132             }
133             return qur(root[x][ta],0,0,mx,qx,qy);
134         }
135         int mid=(l+r)>>1;
136         if(ll>mid)return qu(x*2+1,mid+1,r,ll,rr,qx,qy);
137         if(rr<=mid)return qu(x*2,l,mid,ll,rr,qx,qy);
138         return qu(x*2+1,mid+1,r,ll,rr,qx,qy)+qu(x*2,l,mid,ll,rr,qx,qy);
139     }
140     int que(int x1,int y1,int x2,int y2)
141     {
142         if(y1>liy[cnt2]||x1>lix[cnt1])return 0;
143         if(y2<liy[1]||x2<lix[1])return 0;
144         y1=lower_bound(liy+1,liy+cnt2+1,y1)-liy;
145         x1=lower_bound(lix+1,lix+cnt1+1,x1)-lix;
146         if(y2<liy[cnt2])y2=upper_bound(liy+1,liy+cnt2+1,y2)-liy-1;else y2=cnt2;
147         if(x2<lix[cnt1])x2=upper_bound(lix+1,lix+cnt1+1,x2)-lix-1;else x2=cnt1;
148         return qu(1,1,mx,y1,y2,x1,x2);
149     }
150     void srt()
151     {
152         sort(dian+1,dian+n+1);
153         for(int i=1;i<=n;i++)
154         {
155             lix[++cnt1]=dian[i].x;
156             liy[++cnt2]=dian[i].y;
157         }
158         sort(lix+1,lix+cnt1+1);sort(liy+1,liy+cnt2+1);
159         cnt1=unique(lix+1,lix+cnt1+1)-lix-1;
160         cnt2=unique(liy+1,liy+cnt2+1)-liy-1;
161         for(int i=1;i<=n;i++)
162         {
163             dian[i].x=lower_bound(lix+1,lix+cnt1+1,dian[i].x)-lix;
164             dian[i].y=lower_bound(liy+1,liy+cnt2+1,dian[i].y)-liy;
165         }
166         return ;
167     }
168     void yu()
169     {
170         for(int i=1;i<=n;i++)
171         {
172             pre[i]=now[dian[i].x];
173             now[dian[i].x]=dian[i].y;
174         }
175     }
176 }sx,sy;
177 int on,t1,t2,t3,t4,t5;
178 int main()
179 {
180     scanf("%d",&on);
181     scanf("%d",&n);
182     for(int i=1;i<=n;i++)
183     {
184         t1=read();t2=read();
185         sy.dian[i].x=t1;sy.dian[i].y=t2;
186         sx.dian[i].x=t2;sx.dian[i].y=t1;
187     }
188     sx.srt();
189     sy.srt();
190     sx.yu();
191     sy.yu();
192     sx.build(1,1,mx,1,n);
193     sy.build(1,1,mx,1,n);
194     int cas;
195     scanf("%d",&cas);int lax=0,lay=0;
196     while(cas--)
197     {
198         t1=read();t2=read();t3=read();t4=read();
199         t1=t1+(lax+lay)*on;
200         t2=t2+(lax+lay)*on;
201         t3=t3+(lax+lay)*on;
202         t4=t4+(lax+lay)*on;
203         lay=sx.que(t2,t1,t4,t3);
204         lax=sy.que(t1,t2,t3,t4);
205         printf("%d %d
",lax,lay);
206     }
207     return 0;
208 }
原文地址:https://www.cnblogs.com/ezyzy/p/6567893.html