BZOJ1251 序列终结者

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1251 序列终结者相关的知识,希望对你有一定的参考价值。

传送门

为了这道题浪费了一天的时间。然而明天就要月考了

先是不停的TLE,然后查了半天才发现是数组下标打错了,但是数组下标打错不应该是RE吗...,因为这个查了一中午,肉查真的很重要..

然后又是随意内存的锅,没有注意0节点之类的,对拍什么的搞了很长时间,平衡树的处理应该要注意到这个点,很重要。

 

剩下的没什么好说了,代码实现还是比较直观的吧。

 

技术分享
  1 //BZOJ 1251
  2 //by Cydiater
  3 //2016.9.7
  4 #include <iostream>
  5 #include <cstdio>
  6 #include <cstdlib>
  7 #include <cstring>
  8 #include <string>
  9 #include <algorithm>
 10 #include <queue>
 11 #include <map>
 12 #include <ctime>
 13 #include <iomanip>
 14 #include <cmath>
 15 using namespace std;
 16 #define ll long long
 17 #define up(i,j,n)       for(int i=j;i<=n;i++)
 18 #define down(i,j,n)     for(int i=j;i>=n;i--)
 19 const int MAXN=1e6+5;
 20 const int oo=0x3f3f3f3f;
 21 inline int read(){
 22     char ch=getchar();int x=0,f=1;
 23     while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}
 24     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
 25     return x*f;
 26 }
 27 int N,M,tol=1,root=1,op,leftt,rightt,v,cnt=0;
 28 struct SplayTree{
 29     int son[2],siz,fa,v,tag,delta,id,max_value;
 30 }t[MAXN];
 31 namespace solution{
 32     void debug(int now){
 33         printf("now=%d t[now].id=%d t[now].max_value=%d t[now].delta=%d t[now].tag=%d t[now].son[0]=%d t[now].son[1]=%d t[now].siz=%d t[now].fa=%d t[now].v=%d\\n",now,t[now].id,t[now].max_value,t[now].delta,t[now].tag,t[now].son[0],t[now].son[1],t[now].siz,t[now].fa,t[now].v);
 34         if(t[now].son[0])debug(t[now].son[0]);
 35         if(t[now].son[1])debug(t[now].son[1]);
 36     }
 37     inline int get(int x){return t[t[x].fa].son[1]==x;}
 38     inline void updata(int x){
 39         if(x){
 40             t[x].siz=1;
 41             if(t[x].son[0])t[x].siz+=t[t[x].son[0]].siz;
 42             if(t[x].son[1])t[x].siz+=t[t[x].son[1]].siz;
 43             t[x].max_value=t[x].v;
 44             if(t[x].son[0])t[x].max_value=max(t[x].max_value,t[t[x].son[0]].max_value);
 45             if(t[x].son[1])t[x].max_value=max(t[x].max_value,t[t[x].son[1]].max_value);
 46         }
 47     }
 48     inline void downit(int node){
 49         if(t[node].tag){
 50             t[t[node].son[0]].tag^=1;t[t[node].son[1]].tag^=1;
 51             swap(t[node].son[1],t[node].son[0]);
 52             t[node].tag=0;
 53         }
 54         if(t[node].delta!=0){
 55             t[t[node].son[0]].delta+=t[node].delta;         t[t[node].son[1]].delta+=t[node].delta;
 56             t[t[node].son[0]].v+=t[node].delta;             t[t[node].son[1]].v+=t[node].delta;
 57             t[t[node].son[0]].max_value+=t[node].delta;     t[t[node].son[1]].max_value+=t[node].delta;
 58             t[node].delta=0;
 59         }
 60     }
 61     inline void rotate(int x){//rotate now node to root
 62         int old=t[x].fa,oldf=t[old].fa,which=get(x);
 63         t[old].son[which]=t[x].son[which^1];t[t[old].son[which]].fa=old;
 64         t[old].fa=x;t[x].son[which^1]=old;
 65         t[x].fa=oldf;
 66         if(oldf)t[oldf].son[t[oldf].son[1]==old]=x;
 67         updata(old);updata(x);
 68     }
 69     void splay(int node,int aim){
 70         for(int fa;(fa=t[node].fa);rotate(node)){
 71             if(node==aim)break;
 72             if(fa==aim){
 73                 rotate(node);
 74                 break;
 75             }
 76             if(t[fa].fa==aim){
 77                 rotate(get(node)==get(fa)?fa:node);
 78                 rotate(node);break;
 79             }
 80             else if(t[fa].fa!=aim)rotate(get(node)==get(fa)?fa:node);
 81         }
 82         if(aim==root)root=node;
 83     }
 84     inline int find(int num){
 85         int now=root;
 86         while(1){
 87             downit(now);
 88             int tmp=(t[now].son[0]?t[t[now].son[0]].siz:0);
 89             if(num<=tmp)now=t[now].son[0];
 90             else{
 91                 if(num==tmp+1)return now;
 92                 num-=(tmp+1);
 93                 now=t[now].son[1];
 94             }
 95         }
 96     }
 97     inline void build(int leftt,int rightt,int node,int fa){
 98         if(leftt==rightt){
 99             t[node].fa=fa;t[node].v=0;t[node].delta=0;t[node].tag=0;
100             t[node].son[0]=t[node].son[1]=0;t[node].siz=1;t[node].id=leftt;
101             return;
102         }
103         int mid=(leftt+rightt)>>1;
104         t[node].fa=fa;t[node].v=0;t[node].tag=0;t[node].delta=0;t[node].siz=1;
105         t[node].id=mid;
106         if(mid-1>=leftt){
107             tol++;t[node].son[0]=tol;
108             build(leftt,mid-1,tol,node);
109             t[node].siz+=t[t[node].son[0]].siz;
110         }
111         if(mid+1<=rightt){
112             tol++;t[node].son[1]=tol;
113             build(mid+1,rightt,tol,node);
114             t[node].siz+=t[t[node].son[1]].siz;
115         }
116         updata(node);
117     }
118     void init(){
119         N=read();M=read();
120         build(1,N+2,1,0);
121     }
122     inline void Add(int leftt,int rightt,int v){
123         int left_id=find(leftt),right_id=find(rightt+2);
124         splay(left_id,root);splay(right_id,t[root].son[1]);
125         int node=t[right_id].son[0];
126         t[node].delta+=v;t[node].v+=v;t[node].max_value+=v;
127     }
128     inline void Reverse(int leftt,int rightt){
129         int left_id=find(leftt),right_id=find(rightt+2);
130         splay(left_id,root);splay(right_id,t[root].son[1]);
131         int node=t[right_id].son[0];
132         t[node].tag^=1;
133     }
134     inline int Max(int leftt,int rightt){
135         int left_id=find(leftt),right_id=find(rightt+2);
136         splay(left_id,root);splay(right_id,t[root].son[1]);
137         int node=t[right_id].son[0];
138         return t[node].max_value;
139     }
140     inline void slove(){
141         while(M--){
142             op=read();leftt=read();rightt=read();
143             if(op==1){
144                 v=read();
145                 Add(leftt,rightt,v);
146             }
147             if(op==2)Reverse(leftt,rightt);
148             if(op==3){
149                 int ans=Max(leftt,rightt);
150                 printf("%d\\n",ans);
151             }
152             //debug(root);puts("");
153             //printf("Time has passed:%d ms!\\n",clock());
154         }
155     }
156 }
157 int main(){
158     //freopen("input.in","r",stdin);
159     //freopen("out1.out","w",stdout);
160     using namespace solution;
161     init();
162     slove();
163     //cout<<"Time has passed:"<<1.0*clock()/1000<<"s!"<<endl;
164     return 0;
165 }
View Code

 

以上是关于BZOJ1251 序列终结者的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1251: 序列终结者 2011-12-20

BZOJ 1251: 序列终结者

[BZOJ1251]序列终结者

BZOJ 1251 序列终结者

BZOJ1251序列终结者 Splay

[bzoj 1251]序列终结者