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

猜你喜欢

转载自www.cnblogs.com/bztMinamoto/p/9811993.html