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 }
以上是关于BZOJ1251 序列终结者的主要内容,如果未能解决你的问题,请参考以下文章