1. 程式人生 > >洛谷P2572 [SCOI2010]序列操作(珂朵莉樹)

洛谷P2572 [SCOI2010]序列操作(珂朵莉樹)

傳送門

 

珂朵莉樹是個吼東西啊

這題線段樹程式碼4k起步……珂朵莉樹只要2k……

雖然因為這題資料不隨機所以珂朵莉樹的複雜度實際上是錯的……

然而能過就行對不對……

(不過要是到時候noip我還真不敢打……畢竟CCF那機子……)

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