zoukankan      html  css  js  c++  java
  • bzoj1251 序列终结者

    题目链接

    splay练手题

    轩神教了我神奇的split:返回需要提取的一段区间的root

    注意在两端开了两个虚拟结点

      1 #include<algorithm>
      2 #include<iostream>
      3 #include<cstdlib>
      4 #include<cstring>
      5 #include<cstdio>
      6 #include<string>
      7 #include<cmath>
      8 #include<ctime>
      9 #include<queue>
     10 #include<stack>
     11 #include<map>
     12 #include<set>
     13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
     14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
     15 #define Clear(a,b) memset(a,b,sizeof(a))
     16 #define inout(x) printf("%d",(x))
     17 #define douin(x) scanf("%lf",&x)
     18 #define strin(x) scanf("%s",(x))
     19 #define LLin(x) scanf("%lld",&x)
     20 #define op operator
     21 #define CSC main
     22 typedef unsigned long long ULL;
     23 typedef const int cint;
     24 typedef long long LL;
     25 using namespace std;
     26 void inin(int &ret)
     27 {
     28     ret=0;int f=0;char ch=getchar();
     29     while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
     30     while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar();
     31     ret=f?-ret:ret;
     32 }
     33 int ch[50050][2],fa[50050],w[50050],s[50050],Max[50050];
     34 int add[50050],rev[50050],root,ed;
     35 int newnode(int v,int f)
     36 {
     37     ed++;
     38     w[ed]=Max[ed]=v,fa[ed]=f;
     39     s[ed]=1;ch[ed][0]=ch[ed][1]=0;
     40     add[ed]=rev[ed]=0;
     41     return ed;
     42 }
     43 void addtag(int x,int d)
     44 {
     45     if(!x)return ;
     46     w[x]+=d;
     47     add[x]+=d,Max[x]+=d;
     48 }
     49 void down(int k)
     50 {
     51     if(rev[k])swap(ch[k][0],ch[k][1]),rev[ch[k][0]]^=1,rev[ch[k][1]]^=1,rev[k]=0;
     52     if(add[k])addtag(ch[k][0],add[k]),addtag(ch[k][1],add[k]),add[k]=0;
     53 }
     54 void maintain(int k)
     55 {
     56     Max[k]=max(max(Max[ch[k][0]],Max[ch[k][1]]),w[k]);
     57     s[k]=1+s[ch[k][0]]+s[ch[k][1]];
     58 }
     59 void rotate(int x)
     60 {
     61     int y=fa[x],z=fa[y];
     62     if(z)ch[z][ch[z][1]==y]=x;
     63     int l=ch[y][1]==x,r=l^1;
     64     fa[y]=x,fa[x]=z;
     65     if(ch[x][r])fa[ch[x][r]]=y;
     66     ch[y][l]=ch[x][r],ch[x][r]=y;
     67     maintain(y);
     68 }
     69 void splay(int x,int f)
     70 {
     71     static int sta[50050],top;
     72     top=0;
     73     for(int i=x;i!=f;i=fa[i])sta[++top]=i;
     74     while(top)down(sta[top--]);
     75     while(fa[x]!=f)
     76     {
     77         int y=fa[x],z=fa[y];
     78         if(z!=f)
     79             if((ch[z][1]==y)^(ch[y][1]==x))rotate(x);
     80             else rotate(y);else ;
     81         rotate(x);
     82     }
     83     maintain(x);
     84     if(!f)root=x;
     85 }
     86 int tot;
     87 int kth(int k)
     88 {
     89     int x=root;
     90     while(x)
     91     {
     92         down(x);
     93         int pp=s[ch[x][0]]+1;
     94         if(pp==k)return x;
     95         if(pp<k)k-=pp,x=ch[x][1];
     96         else x=ch[x][0];
     97     }return 0;
     98 }
     99 int build(int fa,int l,int r)
    100 {
    101     if(l>r)return 0;
    102     int k=newnode(0,fa);
    103     int mid=(l+r)>>1;
    104     ch[k][0]=build(k,l,mid-1);
    105     ch[k][1]=build(k,mid+1,r);
    106     maintain(k);return k;
    107 }
    108 int split(int l,int r)
    109 {
    110     int x=kth(l),y=kth(r+2);
    111     splay(x,0);splay(y,x);
    112     return ch[y][0];
    113 }
    114 int n,m;
    115 int CSC()
    116 {
    117     inin(n),inin(m);
    118     root=build(0,1,n+2);
    119     Max[0]=-2147483647;
    120     re(i,1,m)
    121     {
    122         int opt,q,w,e;
    123         inin(opt),inin(q),inin(w);
    124         int r=split(q,w);
    125         if(opt==1)
    126         {
    127             inin(e);
    128             addtag(r,e);
    129         }
    130         else if(opt==2)rev[r]^=1;
    131         else printf("%d
    ",Max[r]);
    132     }
    133     return 0;
    134 }
  • 相关阅读:
    新手如何运营自媒体?必看!
    公众号停更,短视频岗位暴增,2020年,新媒体人如何更值钱?
    别再费力讨好,先看看你的标题有没有入这些坑!
    经常反思自己的自媒体账号,为什么还只是几百的阅读量?
    文章发布显示“敏感词汇”怎么办?如何提升文章原创率?
    如何利用标题最大化引流,让属于自己原创、混剪视频的推荐量直线上升?
    【转载】JAVA字符串格式化-String.format()的使用
    【转载】浅谈大型网络入侵检测建设
    渗透测试工具 —— Nmap
    【转载】任意用户密码重置的10种常见姿势
  • 原文地址:https://www.cnblogs.com/HugeGun/p/5154513.html
Copyright © 2011-2022 走看看