bzoj 1500

再写一次毒瘤题,改变代码风格改用了指针,以为会不太适应,事实上不会撒。。

对拍数据要等20分钟才出来= =

  1 //#include<bits/stdc++.h>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<iostream>
  6 #include<queue>
  7 #define inc(i,l,r) for(int i=l;i<=r;i++)
  8 #define dec(i,l,r) for(int i=l;i>=r;i--)
  9 #define link(x) for(edge *j=h[x];j;j=j->next)
 10 #define mem(a) memset(a,0,sizeof(a))
 11 #define inf 10000
 12 #define ll long long
 13 #define succ(x) (1<<x)
 14 #define lowbit(x) (x&(-x))
 15 #define NM 1000000+5
 16 using namespace std;
 17 int read(){
 18     int x=0,f=1;char ch=getchar();
 19     while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
 20     while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();
 21     return x*f;
 22 }
 23 struct node* null;
 24 struct node{
 25     int s,sm,lm,rm,tag,rev,size,v;
 26     node *c[2],*f;
 27     void clr(){
 28         s=sm=lm=rm=v=size=rev=0;c[0]=c[1]=0;tag=inf;
 29     }
 30     void in(int x){
 31         v=s=sm=lm=rm=x;
 32     }
 33     int d(){return f->c[1]==this;}
 34     void setc(node *r,int d){
 35         c[d]=r;r->f=this;
 36     }
 37     void Rev(){rev^=1;swap(c[0],c[1]);swap(lm,rm);}
 38     void Tag(int x){if(this==null)return;v=tag=x;lm=rm=sm=s=size*tag;if(tag<0)lm=rm=sm=tag;}
 39     void push(){
 40         if(tag<inf){
 41             inc(i,0,1)if(c[i])c[i]->Tag(tag);
 42             tag=inf;rev=0;
 43         }
 44         if(rev){
 45             inc(i,0,1)if(c[i])c[i]->Rev();
 46             rev=0;
 47         }
 48     }
 49     void upd(){
 50         node *l=c[0];node*r=c[1];
 51         s=l->s+r->s+v;
 52         sm=max(l->sm,r->sm);
 53         sm=max(sm,max(l->rm,0)+max(r->lm,0)+v);
 54         lm=max(l->lm,l->s+v+max(r->lm,0));
 55         rm=max(r->rm,r->s+v+max(l->rm,0));
 56         size=l->size+r->size+1;
 57     }
 58 }T[NM],*o=T,*root;
 59 int n,m,_x,_y,_t;
 60 queue<node*>q;
 61 char st[20];
 62 node* newnode(){
 63     node *r;
 64     if(q.empty())r=o++;else{
 65         r=q.front();q.pop();r->push();
 66         inc(i,0,1)if(r->c[i]!=null)q.push(r->c[i]);
 67     }
 68     r->clr();r->size=1;r->c[0]=r->c[1]=r->f=null;return r;
 69 }
 70 node *build(int x,int y){
 71     if(x>y)return null;
 72     int t=x+y>>1;node *r=newnode();
 73     if(x==y){
 74         r->in(read());
 75         return r;
 76     }
 77     r->setc(build(x,t-1),0);
 78     r->in(read());
 79     r->setc(build(t+1,y),1);
 80     r->upd();
 81     return r;
 82 }
 83 void rot(node *x){
 84     node *y=x->f;int d=!x->d();
 85     y->push();x->push();
 86     y->f->setc(x,y->d());
 87     y->setc(x->c[d],!d);
 88     x->setc(y,d);
 89     y->upd();
 90 }
 91 void splay(node *x,node *f=null){
 92     for(node *y=x->f;y!=f;y=x->f){
 93         if(y->f!=f)x->d()==y->d()?rot(y):rot(x);
 94         rot(x);
 95     }
 96     x->upd();
 97     if(f==null)root=x;
 98 }
 99 node *find(int x){
100     for(node *r=root;x;r->push())
101     if(x<=r->c[0]->size)r=r->c[0];
102     else{
103         x-=r->c[0]->size;x--;
104         if(!x)return r;
105         r=r->c[1];
106     }
107 }
108 node *pick(int x,int y){
109     node *r=find(x);node *t=find(y);
110     splay(r);splay(t,r);
111     return t;
112 }
113 void out(node *r){
114     if(r==null)return;r->push();
115     out(r->c[0]);printf("%d ",r->v);out(r->c[1]);
116 }
117 int main(){
118 //    freopen("data.in","r",stdin);
119 //    freopen("test.out","w",stdout);
120     null=o++;null->clr();null->in(-inf);null->v=null->s=0;
121     root=newnode();root->setc(newnode(),1);
122     root->in(-inf);root->c[1]->in(-inf);
123     root->upd();
124     n=read();m=read();
125     root->c[1]->setc(build(1,n),0);splay(root->c[1]->c[0]);
126     while(m--){
127         scanf("%s",st);
128         if(st[2]==‘X‘)printf("%d\n",root->sm);
129         else if(st[2]==‘S‘){
130             _x=read();_t=read();
131             node *r=pick(_x+1,_x+2);
132             r->setc(build(1,_t),0);
133             splay(r->c[0]);
134         }else{
135             _x=read();_y=_x+1+read();
136             node *r=pick(_x,_y);
137             if(st[2]==‘L‘){
138                 if(r->c[0]!=null)q.push(r->c[0]);
139                 r->c[0]->f=null;r->c[0]=null;splay(r);
140             }else if(st[2]==‘K‘) r->c[0]->Tag(read()),splay(r->c[0]);
141             else if(st[2]==‘V‘) r->c[0]->Rev(),splay(r->c[0]);
142             else printf("%d\n",r->c[0]->s);
143         }
144 //        out(root);putchar(‘\n‘);
145     }
146     return 0;
147 }

时间: 2024-10-10 17:56:43

bzoj 1500的相关文章

BZOJ 1500: [NOI2005]维修数列

1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 12880  Solved: 4112[Submit][Status][Discuss] Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一条命令,格式参见问题描述中的表格.任何时刻数列中最多含有500 000个数,

BZOJ 1500 维修数列

Description Input 输入文件的第1行包含两个数N和M,N表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一条命令,格式参见问题描述中的表格. Output 对于输入数据中的GET-SUM和MAX-SUM操作,向输出文件依次打印结果,每个答案(数字)占一行. Sample Input 9 8 2 -6 3 5 1 -5 -3 6 3 GET-SUM 5 4 MAX-SUM INSERT 8 3 -5 7 2 DELETE 12

BZOJ 1500: [NOI2005]维修数列( splay )

splay..... ------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #define rep( i , n ) for( int i = 0 ; i < n ; ++

[代码] bzoj 1500 维修数列(无旋treap)

- 传送门 - http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1500: [NOI2005]维修数列 Time Limit:?10 Sec??Memory Limit:?64 MB Submit:?15301??Solved:?5063 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目. 第2行包含N个数字,描述初始时的数列. 以下M行,每行

BZOJ 1500 NOI 2005 维修数列 Splay

题意:见下图 传说级别的NOI数据结构神题,像我这种弱渣花了一下午的时间才A掉,最后发现竟然是边界值的问题没处理好.. 这个题对Splay的所有操作基本是全了. 插入:新建一颗Splay Tree,然后把对应节点Splay到根的右儿子上,再把新建的树连上. 删除:把要删除的区间Splay到根的右儿子的左儿子上,递归free掉.(这里可以用数组优化,可以避免递归free节省时间) 修改,翻转:打标记,在需要的时候下传标记,和线段树差不多,翻转标记下传时,要将左右儿子的左右儿子分别交换. 求和:维护

bzoj 1500 [NOI 2005] 维修数列

题目大意不多说了 貌似每个苦逼的acmer都要做一下这个splay树的模版题目吧 还是有很多操作的,估计够以后当模版了.... 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <cmath> 6 7 using namespace std; 8 const int N = 1000010; 9 cons

伸展树总结

最近做的一些Splay题及思路 BZOJ 1588 就是求一个数的前驱和后继,用Splay很简单 POJ 3468  很经典的线段树题目,用Splay做练习懒惰标记 HDU 1890  涉及区间翻转,注意直接以数列下标建树,对原数列排序后,直接查找,找到后删除. HDU 3436  很好的一道题,首先离散化,Splay 树中每个节点表示的是一段区间, TOP:首先删除这个元素,再将其插入到队首 RANK:即寻找第K大,经典操作 QUERY:将该元素Splay 到根部,size[ch[root][

数据结构&#183;SPlay

Splay嘛是什么?网上一大堆教程我就懒得说了,毕竟自己表达能力超烂超烂的. 原理很简单,但是写起代码来就各种WARETLE了晕. 也没去看其他大神的Splay模版,然后就自己一边找题做一边摸索出一套适合自己的模版,打得顺手才好用嘛=v= BZOJ 1503 [Code] BZOJ 1500 [Code] BZOJ 1507 [Code] BZOJ 3223 [Code] BZOJ 1269 [Code] 大概就这些题了. 明天该搞LCT了.

博客开更!!

好颓啊!!  做题好慢!! 各种错误!! 1014: [JSOI2008]火星人prefix 额 splay没啥说的 字符串hash蒟蒻不会啊 搞半天才懂 好玄学啊 unsigned的自然溢出也是玄学啊 (话说我 int的自然溢出也A了smg?? 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std