zoukankan      html  css  js  c++  java
  • 洛谷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]='
    ';
    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 }
  • 相关阅读:
    Redis安装配置
    Git本地服务器搭建
    JDK安装配置
    ssh免密登录
    设计模式
    IDEA 快捷键
    LeetCode Sliding Window Maximum
    ElasticSearch 使用小结
    LeetCode Product of Array Except Self
    LeetCode Delete Node in a Linked List
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9811993.html
Copyright © 2011-2022 走看看