codeforces817F MEX Queries -- 线段树
来源:互联网 发布:淘宝客服规则 编辑:程序博客网 时间:2024/06/06 18:36
先将
用线段树维护区间出现的数的个数。对于
查询时在线段树上二分。
注意因为求的是
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 100010#define ll long longinline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if(p1==p2){ p2=(p1=buf)+fread(buf,1,100000,stdin); if(p1==p2)return EOF; } return *p1++;}inline void Read(int& x){ char c=nc(); for(;c<'0'||c>'9';c=nc()); for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());}inline void Read(ll& x){ char c=nc(); for(;c<'0'||c>'9';c=nc()); for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());}char ss[30];int Len;inline void Print(ll x){ for(Len=0;x;x/=10)ss[++Len]=x%10; while(Len)putchar(ss[Len--]+48); putchar('\n');}struct Node{ int w,l,r,p1; bool p2;}c[N*70];struct P{ int k,x,y;}q[N];struct Ls{ ll w; int f;}a[N<<2];ll w[N<<2];int Rt,Num,k,t,n,i,M;inline int Max(int x,int y){ return x<y?y:x;}inline int New_Node(){ int x=++Num; c[x].p1=-1; return x;}inline void Update_set(int& x,int y,int l){ if(!x)x=New_Node(); c[x].w=l*y; c[x].p1=y;c[x].p2=0;}inline void Update_xor(int& x,int l){ if(!x)x=New_Node(); c[x].w=l-c[x].w; c[x].p2^=1;}inline void Down(int x,int l){ if(c[x].p1!=-1){ Update_set(c[x].l,c[x].p1,l+1>>1); Update_set(c[x].r,c[x].p1,l>>1); c[x].p1=-1; } if(c[x].p2){ Update_xor(c[x].l,l+1>>1); Update_xor(c[x].r,l>>1); c[x].p2=0; }}inline void Update1(int& x,int l,int r,int L,int R,int y){ if(!x)x=New_Node(); if(l>=L&&r<=R){ Update_set(x,y,r-l+1); return; } Down(x,r-l+1); int Mid=l+r>>1; if(Mid>=L)Update1(c[x].l,l,Mid,L,R,y); if(Mid<R)Update1(c[x].r,Mid+1,r,L,R,y); c[x].w=c[c[x].l].w+c[c[x].r].w;}inline void Update2(int& x,int l,int r,int L,int R){ if(!x)x=New_Node(); if(l>=L&&r<=R){ Update_xor(x,r-l+1); return; } Down(x,r-l+1); int Mid=l+r>>1; if(Mid>=L)Update2(c[x].l,l,Mid,L,R); if(Mid<R)Update2(c[x].r,Mid+1,r,L,R); c[x].w=c[c[x].l].w+c[c[x].r].w;}inline int Find(int x,int l,int r){ if(!x||l==r)return l; Down(x,r-l+1); int Mid=l+r>>1; if(c[c[x].l].w==Mid-l+1)return Find(c[x].r,Mid+1,r); return Find(c[x].l,l,Mid);}inline bool Cmp(Ls a,Ls b){ return a.w<b.w;}int main(){ Read(n); for(i=1;i<=n;i++)Read(q[i].k),a[++t].f=i*2-1,a[++t].f=i<<1,Read(a[t-1].w),Read(a[t].w),a[t+1].w=a[t-1].w+1,a[t+2].w=a[t].w+1,t+=2; sort(a+1,a+n*4+1,Cmp); if(a[1].w>1)w[++M]=1; w[++M]=a[1].w;if(a[1].f&1)q[a[1].f+1>>1].x=M;else if(a[i].f)q[a[1].f>>1].y=M; for(i=2;i<=n<<2;i++) if(a[i].w==a[i-1].w){ if(a[i].f&1)q[a[i].f+1>>1].x=M;else if(a[i].f)q[a[i].f>>1].y=M; }else{ w[++M]=a[i].w; if(a[i].f&1)q[a[i].f+1>>1].x=M;else if(a[i].f)q[a[i].f>>1].y=M; } for(i=1;i<=n;i++){ if(q[i].k==1)Update1(Rt,1,M,q[i].x,q[i].y,1);else if(q[i].k==2)Update1(Rt,1,M,q[i].x,q[i].y,0);else Update2(Rt,1,M,q[i].x,q[i].y); Print(w[Find(Rt,1,M)]); } return 0;}
阅读全文
2 0
- codeforces817F MEX Queries -- 线段树
- [Codeforces]817F. MEX Queries 离散化+线段树维护
- Educational Codeforces Round 23 F. MEX Queries(离散化+线段树)
- [Codeforces 817F] Mex Queries 模型构建与转化+线段树
- Educational Codeforces Round 23 F. MEX Queries(线段树区间设值)
- hdu4747 mex 线段树
- Mex(线段树)
- [HDU 4747 Mex] Mex函数 线段树
- 区间MEX 线段树维护mex数组
- hdu 4747 Mex (线段树)
- hdu 4747 Mex 线段树
- 【Tsinsen】A1513. mex 线段树
- HDU 4747 Mex (线段树)
- hdu 4747Mex【线段树】
- bzoj3585 mex(离线+线段树)
- [bzoj3339]mex(线段树)
- 【BZOJ3585】mex【离线】【线段树】【mex】【离散化】
- HDU 4747 Mex (线段树)
- 安卓自定义控件之自动换行ViewGroup
- URI的组成与介绍
- Android中onActivityResult和setResult方法的使用
- EditText利用InputFilter过滤特殊字符或改变输入的内容
- TCP重传机制
- codeforces817F MEX Queries -- 线段树
- 每天五分钟linux(10)-cat
- PowerDesigner16.5版本显示工具箱
- uva 815 Flooded!
- caffe利用lenet_5模型跑MNIST数据
- 线程间的协调
- 2017多校联合(hdu6043)KazaQ's Socks找规律
- HDU1273-漫步深林
- 零基础写Java知乎爬虫之获取知乎编辑推荐内容