zoukankan      html  css  js  c++  java
  • NOI 2005 维修数列

    妈妈呀我终于过了!!!原来是数据坑我!!!

    弃疗弃疗弃疗弃疗!!!!我调了一天呢。。。。被GET_SUM 8 0打败了。。。。

    啥也不说了。。。。还是我太年轻。。。。

    更新了一下常数,跑的还是可以的:

    更新代码去看COJ 0982 我懒癌没有搬运。。。。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<algorithm>
      5 #include<queue>
      6 #include<cstring>
      7 #define PAU putchar(' ')
      8 #define ENT putchar('
    ')
      9 #define CH for(int d=0;d<=1;d++) if(ch[d])
     10 using namespace std;
     11 const int maxn=500000+10,inf=-1u>>1;
     12 int max(int a,int b,int c){return max(a,max(b,c));}
     13 struct node{
     14     node*fa,*ch[2];
     15     int x;bool rev;int siz,sm,set,lx,rx,mx;
     16     node(){ch[0]=ch[1]=NULL;x=sm=0;lx=rx=mx=-inf;set=inf;rev=false;siz=1;}
     17     void init(){ch[0]=ch[1]=NULL;x=sm=0;lx=rx=mx=-inf;set=inf;rev=false;siz=1;return;}
     18     void revt(){swap(ch[0],ch[1]);swap(lx,rx);rev^=1;return;}
     19     void sett(int tag){x=set=tag;sm=tag*siz;lx=rx=mx=max(tag,tag*siz);return;}
     20     void update();
     21     void down(){
     22         if(rev){CH{ch[d]->revt();}rev=false;}
     23         if(set!=inf){CH{ch[d]->sett(set);}set=inf;}
     24         return;
     25     }
     26 }Splay[maxn],*root;int nodecnt=0;
     27 queue<node*>RAM;
     28 node*newnode(){
     29     node*t;if(!RAM.empty()) t=RAM.front(),RAM.pop();
     30     else t=&Splay[nodecnt++];t->init();return t;
     31 }
     32 void del(node*&x){RAM.push(x);return;}
     33 void deltree(node*&x){
     34     if(!x)return;deltree(x->ch[0]);deltree(x->ch[1]);del(x);return;
     35 }
     36 void copy(node*&x,node*y){
     37     x->x=y->x;
     38     x->lx=y->lx;
     39     x->mx=y->mx;
     40     x->rx=y->rx;
     41     x->sm=y->sm;
     42     x->siz=y->siz;
     43     x->set=y->set;
     44     x->rev=y->rev;
     45     return;
     46 }
     47 void node::update(){
     48     siz=1;sm=x;lx=mx=rx=0;node*n[2];n[0]=newnode();n[1]=newnode();
     49     CH{siz+=ch[d]->siz;sm+=ch[d]->sm;copy(n[d],ch[d]);}
     50     lx=max(n[0]->lx,n[0]->sm+x+max(0,n[1]->lx));
     51     rx=max(n[1]->rx,n[1]->sm+x+max(0,n[0]->rx));
     52     mx=max(0,n[0]->rx)+x+max(0,n[1]->lx);
     53     mx=max(n[0]->mx,n[1]->mx,mx);
     54     del(n[0]);del(n[1]);
     55     return;
     56 }
     57 int parent(node*x,node*&y){return (y=x->fa)?y->ch[1]==x?1:y->ch[0]==x?0:-1:-1;}
     58 void rotate(node*x){
     59     node*y,*z;int d1=parent(x,y),d2=parent(y,z);
     60     if(y->ch[d1]=x->ch[d1^1]) y->ch[d1]->fa=y;
     61     y->fa=x;x->fa=z;x->ch[d1^1]=y;
     62     if(d2!=-1) z->ch[d2]=x;
     63     y->update();return;
     64 }
     65 void pushdown(node*x){
     66     static node*s[maxn];int top=0;
     67     for(node*y;;x=y){
     68         s[top++]=x;y=x->fa;
     69         if(!y||(y->ch[0]!=x&&y->ch[1]!=x)) break;
     70     } while(top--) s[top]->down();return;
     71 }
     72 node*splay(node*x){
     73     pushdown(x);node*y,*z;int d1,d2;
     74     while(true){
     75         if((d1=parent(x,y))<0) break;
     76         if((d2=parent(y,z))<0){rotate(x);break;}
     77         if(d1==d2) rotate(y),rotate(x);
     78         else rotate(x),rotate(x);
     79     } x->update();return x;
     80 }
     81 node*find(node*x,int rank){
     82     x->down();int kth=1;if(x->ch[0]) kth=x->ch[0]->siz+1;
     83     if(rank==kth) return x;
     84     if(rank<kth) return find(x->ch[0],rank);
     85     else return find(x->ch[1],rank-kth);
     86 }
     87 void split(node*&x,node*&y,int a){
     88     if(!a){y=x;x=NULL;return;}
     89     x=splay(find(x,a));y=x->ch[1];
     90     x->ch[1]=NULL;if(y)y->fa=NULL;x->update();return;
     91 }
     92 void split(node*&x,node*&y,node*&z,int a,int b){
     93     split(x,z,b);split(x,y,a-1);return;
     94 }
     95 void join(node*&x,node*y){
     96     if(!x){x=y;return;}if(!y)return;
     97     x=splay(find(x,x->siz));x->ch[1]=y;
     98     if(y)y->fa=x;x->update();return;
     99 }
    100 void join(node*&x,node*y,node*z){
    101     join(y,z);join(x,y);return;
    102 }
    103 inline int read(){
    104     int x=0,sig=1;char ch=getchar();
    105     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
    106     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
    107     return x*sig;
    108 }
    109 inline void write(int x){
    110     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    111     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    112     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    113 }
    114 int s[maxn];
    115 void build(node*&x,int L,int R){
    116     if(L>R)return;int M=L+R>>1;
    117     x=newnode();x->x=s[M];
    118     build(x->ch[0],L,M-1);
    119     build(x->ch[1],M+1,R);
    120     if(x->ch[0]) x->ch[0]->fa=x;
    121     if(x->ch[1]) x->ch[1]->fa=x;
    122     x->update();return;
    123 }
    124 void insert(int pos,int num){
    125     int ms=0;for(int i=0;i<num;i++) s[ms++]=read();
    126     node*x,*y;build(x,0,num-1);
    127     split(root,y,pos);join(root,x,y);return;
    128 }
    129 void remove(int L,int R){
    130     node*x,*y;split(root,x,y,L,R);deltree(x);join(root,y);return;
    131 }
    132 void settag(int L,int R,int tag){
    133     node*x,*y;split(root,x,y,L,R);x->sett(tag);join(root,x,y);return;
    134 }
    135 int getsum(int L,int R){
    136     node*x,*y;split(root,x,y,L,R);int sm=x->sm;join(root,x,y);return sm;
    137 }
    138 int getssm(int L,int R){
    139     node*x,*y;split(root,x,y,L,R);int mx=x->mx;join(root,x,y);return mx;
    140 }
    141 void reverse(int L,int R){
    142     node*x,*y;split(root,x,y,L,R);x->revt();join(root,x,y);return;
    143 }
    144 void init(){
    145     int n,Q;int pos,k,v;char str[15];
    146     while(scanf("%d%d",&n,&Q)==2){
    147         for(int i=0;i<n;i++) s[i]=read();build(root,0,n-1);
    148         while(Q--){
    149             scanf("%s",str);
    150             if(str[0]=='I'){
    151                 pos=read();k=read();
    152                 insert(pos,k);
    153             }
    154             else if(str[0]=='D'){
    155                 pos=read();k=read();
    156                 remove(pos,pos+k-1);
    157             }
    158             else if(!strcmp(str,"MAKE-SAME")){
    159                 pos=read();k=read();v=read();
    160                 settag(pos,pos+k-1,v);
    161             }
    162             else if(!strcmp(str,"REVERSE")){
    163                 pos=read();k=read();
    164                 reverse(pos,pos+k-1);
    165             }
    166             else if(!strcmp(str,"GET-SUM")){
    167                 pos=read();k=read();
    168                 if(!k){puts("0");continue;}
    169                 write(getsum(pos,pos+k-1));ENT;
    170             }
    171             else write(getssm(1,root->siz)),ENT;
    172         } deltree(root);
    173     }
    174     return;
    175 }
    176 void work(){
    177     return;
    178 }
    179 void print(){
    180     return;
    181 }
    182 int main(){init();work();print();return 0;}
  • 相关阅读:
    软件工程 实验二 结对编程(第一阶段)
    C#中的线程(一)入门
    C# Using与Try..Finally 语句探究
    中兴一面归来
    Log4Net 入门示例
    C++ 临时对象
    C宏定义探析
    MFC 对话框 快捷键设置(alt+s)
    C#中的线程(二) 线程同步基础
    Ip地址的正则表达式
  • 原文地址:https://www.cnblogs.com/chxer/p/4558546.html
Copyright © 2011-2022 走看看