• noi 2005维修数列


    OI生涯中最想过的一题=v=

    splay加上各种各样的操作,样例又不敢拿来调了。。。

    感觉指针写splay好难调,所以以后写splay都用数组吧(其实是因为黄大神也用数组orz)

    好像是2小时敲完。。debug了2天TAT一开始把操作6和某提混了。。。

    然后搞来搞去才发现读入有个毛病0A0

    再然后又发现一直以来自己的pushdown和别人是不一样的。。(那些题我居然过了。。。)

    最后被内存限制卡住,时间换空间。。(然而本地测试90.。。难道是我的电脑太慢?)

    虽然很累,但学了不少,值了

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<iostream>
      4 #include<algorithm>
      5 #include<queue>
      6 #define inc(i,l,r) for(i=l;i<=r;i++)
      7 #define dec(i,l,r) for(i=l;i>=r;i--)
      8 #define inf 1e9
      9 #define mem(a) memset(a,0,sizeof(a))
     10 #define ll long long
     11 #define NM 1000000+5
     12 using namespace std;
     13 int read(){
     14     int x=0,f=1;char ch=getchar();
     15     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
     16     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
     17     return x*f;
     18 }
     19 int n,m,i,x,t,w[NM];
     20     int root,tot,c[NM][2],f[NM],a[NM],b[NM],L[NM],R[NM],M[NM],val[NM],s[NM],z[NM];
     21     bool v[NM];
     22     queue<int>q;
     23     void newnode(int &r,int fa,int k){
     24         if(!q.empty())r=q.front(),q.pop();else r=++tot;
     25         f[r]=fa;c[r][0]=c[r][1]=0;
     26         b[r]=1;
     27         s[r]=a[r]=M[r]=k;
     28         if(k>0)L[r]=R[r]=k;else L[r]=R[r]=0;
     29         val[r]=v[r]=z[r]=0;
     30     }
     31     void rev(int x){
     32         swap(c[x][0],c[x][1]);swap(L[x],R[x]);z[x]^=1;
     33     }
     34     void ch(int x,int k){
     35         val[x]=a[x]=k;v[x]=1;s[x]=b[x]*val[x];
     36         if(val[x]>0)
     37         L[x]=R[x]=M[x]=s[x];
     38         else L[x]=R[x]=0,M[x]=val[x];
     39     }
     40     void update(int r){
     41         int x=c[r][0],y=c[r][1];
     42         if(x==0)x=tot+1,M[x]=-inf;
     43         if(y==0)y=tot+1,M[y]=-inf;
     44         b[r]=b[x]+b[y]+1;
     45         s[r]=s[x]+s[y]+a[r];
     46         L[r]=max(L[x],s[x]+L[y]+a[r]);
     47         R[r]=max(R[y],R[x]+s[y]+a[r]);
     48         M[r]=max(M[x],M[y]);
     49         M[r]=max(M[r],R[x]+a[r]+L[y]);
     50     }
     51     void pushdown(int x){
     52         if(v[x]){
     53             ch(c[x][0],val[x]);ch(c[x][1],val[x]);
     54             v[x]=0;z[x]=0;
     55         }
     56         if(z[x]){
     57             rev(c[x][0]);rev(c[x][1]);
     58             z[x]=0;
     59         }
     60     }
     61     int d(int x){
     62         return c[f[x]][1]==x;
     63     }
     64     void rot(int x){
     65         int y=f[x],kind=!d(x);
     66         pushdown(c[x][kind]);
     67         c[y][!kind]=c[x][kind];
     68         f[c[x][kind]]=y;
     69         if(f[y])c[f[y]][d(y)]=x;
     70         f[x]=f[y];
     71         c[x][kind]=y;
     72         f[y]=x;
     73         update(y);
     74         update(x);
     75     }
     76     void splay(int x,int goal=0){
     77         for(int y=f[x];y!=goal;y=f[x]){
     78             pushdown(y);pushdown(x);
     79             if(f[y]!=goal)
     80             d(y)==d(x)?rot(y):rot(x);
     81             rot(x);
     82         }
     83         if(goal==0)root=x;
     84     }
     85     int sel(int x){
     86         int r=root;
     87         while(x>0){
     88             pushdown(r);
     89             int t=b[c[r][0]];
     90             if(x==t+1)return r;
     91             if(x>t){
     92                 x-=t+1;r=c[r][1];
     93             }else r=c[r][0];
     94         }
     95     }
     96     int pick(int x,int y){
     97         x++;y++;
     98         y=sel(y);x=sel(x);
     99         splay(x);splay(y,x);
    100         return y;
    101     }
    102     void rec(int x){
    103         q.push(x);
    104         if(c[x][0])rec(c[x][0]);
    105         if(c[x][1])rec(c[x][1]);
    106     }
    107     void del(int x,int t){
    108         x=pick(x-1,x+t);
    109         rec(c[x][0]);
    110         f[c[x][0]]=0;c[x][0]=0;
    111         update(x);
    112         splay(x);
    113     }
    114     int sum(int x,int t){
    115         x=pick(x-1,x+t);
    116         return s[c[x][0]];
    117     }
    118     int link(){
    119         int r=root;
    120         pushdown(c[r][0]);pushdown(c[r][1]);
    121         update(r);
    122         return M[r];
    123     }
    124     void build(int x,int y,int fa,int &r){
    125         int t=x+y>>1;
    126         if(x>y)return;
    127         newnode(r,fa,w[t]);
    128         build(x,t-1,r,c[r][0]);
    129         build(t+1,y,r,c[r][1]);
    130         update(r);
    131     }
    132     void ins(int x,int t){
    133         int i;
    134         x=pick(x,x+1);
    135         inc(i,1,t)w[i]=read();
    136         build(1,t,x,c[x][0]);
    137         update(x);
    138         splay(c[x][0]);
    139     }
    140 int main(){
    141 //    freopen("sequence.in","r",stdin);
    142 //    freopen("sequence.ans","w",stdout);
    143     n=read();m=read();
    144     newnode(root,0,-inf);newnode(c[root][1],root,-inf);update(root);
    145     ins(0,n);
    146     inc(i,1,m){
    147         char s=getchar();
    148         while(s<'A'||s>'Z')s=getchar();
    149         s=getchar();s=getchar();
    150         if(s=='X'){
    151         printf("%d
    ",link());
    152         while(('A'<=s&&s<='Z')||s=='-')s=getchar();
    153         }
    154         else{
    155             getchar();getchar();
    156             x=read();t=read();
    157             if(s=='L')del(x,t);
    158             else if(s=='T')printf("%d
    ",sum(x,t));
    159             else if(s=='V'){
    160                 x=pick(x-1,x+t);
    161                 x=c[x][0];
    162                 if(v[x])continue;
    163                 rev(x);
    164                 pushdown(x);
    165                 splay(x);
    166             }
    167             else if(s=='K'){
    168                 x=pick(x-1,x+t);
    169                 x=c[x][0];
    170                 val[x]=read();v[x]=1;
    171                 ch(x,val[x]);
    172                 pushdown(x);
    173                 splay(x);
    174             }
    175             else ins(x,t);
    176         }
    177     }
    178     return 0;
    179 }
    View Code
  • 相关阅读:
    在eclipse 中添加 Tomcat
    eclipse启动报错:code13
    基础_cup给出的内存地址
    巫师3_战斗_水中水鬼
    git checkout
    git学习
    Linux软件包管理之yum在线管理
    Vagrant入门1
    mvn java项目README.md文件范例
    深入理解yum工作原理
  • 原文地址:https://www.cnblogs.com/onlyRP/p/4763774.html
Copyright © 2020-2023  润新知