洛谷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 }

 

posted @ 2018-10-18 16:01  bztMinamoto  阅读(427)  评论(1编辑  收藏  举报
Live2D