1. 程式人生 > >洛谷P4344 [SHOI2015]腦洞治療儀(珂朵莉樹)

洛谷P4344 [SHOI2015]腦洞治療儀(珂朵莉樹)

傳送門

 

看到區間推倒……推平就想到珂朵莉樹

挖腦洞直接assign,填坑先數一遍再assign再暴力填,數數的話暴力數

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<set>
 5 #define IT set<node>::iterator
 6 using std::set;
 7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 8
char buf[1<<21],*p1=buf,*p2=buf; 9 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;} 10 int read(){ 11 #define num ch-'0' 12 char ch;bool flag=0;int res; 13 while(!isdigit(ch=getc())) 14 (ch=='-')&&(flag=true); 15 for(res=num;isdigit(ch=getc());res=res*10
+num); 16 (flag)&&(res=-res); 17 #undef num 18 return res; 19 } 20 char sr[1<<21],z[20];int C=-1,Z; 21 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;} 22 void print(int x){ 23 if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x; 24 while(z[++Z]=x%10+48,x/=10); 25 while
(sr[++C]=z[Z],--Z);sr[++C]='\n'; 26 } 27 const int N=2e5+5; 28 struct node{ 29 int l,r;mutable bool v; 30 node(int L,int R=-1,bool V=0):l(L),r(R),v(V){} 31 inline bool operator <(const node &b)const 32 {return l<b.l;} 33 };set<node> s; 34 IT split(int pos){ 35 IT it=s.lower_bound(node(pos)); 36 if(it!=s.end()&&it->l==pos) return it; 37 --it;int l=it->l,r=it->r;bool v=it->v; 38 s.erase(it),s.insert(node(l,pos-1,v)); 39 return s.insert(node(pos,r,v)).first; 40 } 41 void assign(int l,int r){ 42 IT itr=split(r+1),itl=split(l); 43 s.erase(itl,itr),s.insert(node(l,r,0)); 44 } 45 int count(int l,int r){ 46 IT itr=split(r+1),itl=split(l);int res=0; 47 for(IT it=itl;it!=itr;++it) res+=it->v?it->r-it->l+1:0; 48 s.erase(itl,itr),s.insert(node(l,r,0)); 49 return res; 50 } 51 void fi(int l,int r,int cnt){ 52 IT itr=split(r+1),itl=split(l); 53 for(;itl!=itr;++itl) 54 if(itl->v==0){ 55 if(cnt<=itl->r-itl->l+1){ 56 if(cnt==itl->r-itl->l+1) itl->v=1; 57 else{ 58 int ql=itl->l,qr=itl->r; 59 s.erase(itl),s.insert(node(ql,ql+cnt-1,1)),s.insert(node(ql+cnt,qr,0)); 60 } 61 return; 62 }else itl->v=1,cnt-=itl->r-itl->l+1; 63 } 64 } 65 void recov(int l,int r,int ql,int qr){ 66 int res=count(l,r); 67 if(res) fi(ql,qr,res); 68 } 69 int sum(int l,int r){ 70 IT itr=split(r+1),itl=split(l);int res=0,tmp=0; 71 for(;itl!=itr;++itl) 72 itl->v==0?(tmp+=itl->r-itl->l+1):(cmax(res,tmp),tmp=0); 73 return std::max(res,tmp); 74 } 75 int main(){ 76 // freopen("testdata.in","r",stdin); 77 int n=read(),m=read(); 78 s.insert(node(1,n,1)); 79 while(m--){ 80 int op=read(),l=read(),r=read(),ql,qr; 81 switch(op){ 82 case 0:assign(l,r);break; 83 case 1:ql=read(),qr=read(),recov(l,r,ql,qr);break; 84 case 2:print(sum(l,r));break; 85 } 86 } 87 return Ot(),0; 88 }