zoukankan      html  css  js  c++  java
  • 洛谷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]='
    ';
    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 }
  • 相关阅读:
    System.Xml.XmlException: There is no Unicode byte order mark. Cannot switch to Unicode.
    ClientSide Cookie Management optanoncategoryC0004
    How is OAuth 2 different from OAuth 1?
    Why OAuth 1.0a?
    Converting PKCS#12 certificate into PEM using OpenSSL
    OneTrust Cookie AutoBlocking™
    Ruby on rails开发从头来(windows)(二十二)测试Controller
    Ruby on rails开发从头来(windows)(十九)测试开始
    Ruby on rails开发从头来(windows)(十五)添加用户
    Ruby on rails开发从头来(windows)(十六)登录
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9811088.html
Copyright © 2011-2022 走看看