NOI 2005 维修数列
妈妈呀我终于过了!!!原来是数据坑我!!!

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

啥也不说了。。。。还是我太年轻。。。。
更新了一下常数,跑的还是可以的:

更新代码去看COJ 0982 我懒癌没有搬运。。。。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define CH for(int d=0;d<=1;d++) if(ch[d])
using namespace std;
const int maxn=+,inf=-1u>>;
int max(int a,int b,int c){return max(a,max(b,c));}
struct node{
node*fa,*ch[];
int x;bool rev;int siz,sm,set,lx,rx,mx;
node(){ch[]=ch[]=NULL;x=sm=;lx=rx=mx=-inf;set=inf;rev=false;siz=;}
void init(){ch[]=ch[]=NULL;x=sm=;lx=rx=mx=-inf;set=inf;rev=false;siz=;return;}
void revt(){swap(ch[],ch[]);swap(lx,rx);rev^=;return;}
void sett(int tag){x=set=tag;sm=tag*siz;lx=rx=mx=max(tag,tag*siz);return;}
void update();
void down(){
if(rev){CH{ch[d]->revt();}rev=false;}
if(set!=inf){CH{ch[d]->sett(set);}set=inf;}
return;
}
}Splay[maxn],*root;int nodecnt=;
queue<node*>RAM;
node*newnode(){
node*t;if(!RAM.empty()) t=RAM.front(),RAM.pop();
else t=&Splay[nodecnt++];t->init();return t;
}
void del(node*&x){RAM.push(x);return;}
void deltree(node*&x){
if(!x)return;deltree(x->ch[]);deltree(x->ch[]);del(x);return;
}
void copy(node*&x,node*y){
x->x=y->x;
x->lx=y->lx;
x->mx=y->mx;
x->rx=y->rx;
x->sm=y->sm;
x->siz=y->siz;
x->set=y->set;
x->rev=y->rev;
return;
}
void node::update(){
siz=;sm=x;lx=mx=rx=;node*n[];n[]=newnode();n[]=newnode();
CH{siz+=ch[d]->siz;sm+=ch[d]->sm;copy(n[d],ch[d]);}
lx=max(n[]->lx,n[]->sm+x+max(,n[]->lx));
rx=max(n[]->rx,n[]->sm+x+max(,n[]->rx));
mx=max(,n[]->rx)+x+max(,n[]->lx);
mx=max(n[]->mx,n[]->mx,mx);
del(n[]);del(n[]);
return;
}
int parent(node*x,node*&y){return (y=x->fa)?y->ch[]==x?:y->ch[]==x?:-:-;}
void rotate(node*x){
node*y,*z;int d1=parent(x,y),d2=parent(y,z);
if(y->ch[d1]=x->ch[d1^]) y->ch[d1]->fa=y;
y->fa=x;x->fa=z;x->ch[d1^]=y;
if(d2!=-) z->ch[d2]=x;
y->update();return;
}
void pushdown(node*x){
static node*s[maxn];int top=;
for(node*y;;x=y){
s[top++]=x;y=x->fa;
if(!y||(y->ch[]!=x&&y->ch[]!=x)) break;
} while(top--) s[top]->down();return;
}
node*splay(node*x){
pushdown(x);node*y,*z;int d1,d2;
while(true){
if((d1=parent(x,y))<) break;
if((d2=parent(y,z))<){rotate(x);break;}
if(d1==d2) rotate(y),rotate(x);
else rotate(x),rotate(x);
} x->update();return x;
}
node*find(node*x,int rank){
x->down();int kth=;if(x->ch[]) kth=x->ch[]->siz+;
if(rank==kth) return x;
if(rank<kth) return find(x->ch[],rank);
else return find(x->ch[],rank-kth);
}
void split(node*&x,node*&y,int a){
if(!a){y=x;x=NULL;return;}
x=splay(find(x,a));y=x->ch[];
x->ch[]=NULL;if(y)y->fa=NULL;x->update();return;
}
void split(node*&x,node*&y,node*&z,int a,int b){
split(x,z,b);split(x,y,a-);return;
}
void join(node*&x,node*y){
if(!x){x=y;return;}if(!y)return;
x=splay(find(x,x->siz));x->ch[]=y;
if(y)y->fa=x;x->update();return;
}
void join(node*&x,node*y,node*z){
join(y,z);join(x,y);return;
}
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int s[maxn];
void build(node*&x,int L,int R){
if(L>R)return;int M=L+R>>;
x=newnode();x->x=s[M];
build(x->ch[],L,M-);
build(x->ch[],M+,R);
if(x->ch[]) x->ch[]->fa=x;
if(x->ch[]) x->ch[]->fa=x;
x->update();return;
}
void insert(int pos,int num){
int ms=;for(int i=;i<num;i++) s[ms++]=read();
node*x,*y;build(x,,num-);
split(root,y,pos);join(root,x,y);return;
}
void remove(int L,int R){
node*x,*y;split(root,x,y,L,R);deltree(x);join(root,y);return;
}
void settag(int L,int R,int tag){
node*x,*y;split(root,x,y,L,R);x->sett(tag);join(root,x,y);return;
}
int getsum(int L,int R){
node*x,*y;split(root,x,y,L,R);int sm=x->sm;join(root,x,y);return sm;
}
int getssm(int L,int R){
node*x,*y;split(root,x,y,L,R);int mx=x->mx;join(root,x,y);return mx;
}
void reverse(int L,int R){
node*x,*y;split(root,x,y,L,R);x->revt();join(root,x,y);return;
}
void init(){
int n,Q;int pos,k,v;char str[];
while(scanf("%d%d",&n,&Q)==){
for(int i=;i<n;i++) s[i]=read();build(root,,n-);
while(Q--){
scanf("%s",str);
if(str[]=='I'){
pos=read();k=read();
insert(pos,k);
}
else if(str[]=='D'){
pos=read();k=read();
remove(pos,pos+k-);
}
else if(!strcmp(str,"MAKE-SAME")){
pos=read();k=read();v=read();
settag(pos,pos+k-,v);
}
else if(!strcmp(str,"REVERSE")){
pos=read();k=read();
reverse(pos,pos+k-);
}
else if(!strcmp(str,"GET-SUM")){
pos=read();k=read();
if(!k){puts("");continue;}
write(getsum(pos,pos+k-));ENT;
}
else write(getssm(,root->siz)),ENT;
} deltree(root);
}
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}
NOI 2005 维修数列的更多相关文章
- bzoj 1500 [NOI 2005] 维修数列
题目大意不多说了 貌似每个苦逼的acmer都要做一下这个splay树的模版题目吧 还是有很多操作的,估计够以后当模版了.... #include <cstdio> #include < ...
- NOI 2005维护数列
题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格) 输入输出格式 输入格式: 输入文件的第 1 行包含两个数 N 和 M, ...
- 洛谷 2042 BZOJ 1500 NOI 2005 维护数列
[题意概述] 维护一个数列,要求支持以下6种操作: [题解] 大Boss...可以用Treap解决 需要用到垃圾回收.线性建树. #include<cstdio> #include< ...
- 【BZOJ-1500】维修数列 Splay
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 11047 Solved: 3460[Submit][Statu ...
- [NOI2005] 维修数列
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 8397 Solved: 2530 Description In ...
- bzoj 1500: [NOI2005]维修数列 splay
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 6556 Solved: 1963[Submit][Status ...
- [BZOJ1500][NOI2005]维修数列---解题报告
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- [BZOJ 1500]维修数列 [Splay Tree从进阶到住院]
历尽艰辛终于A掉了这题QwQ 贴COGS评论区几句话=.= 策爷:"splay/块状链表的自虐题.".深刻理解到如果没有M倾向就不要去写这题了.. -Chenyao2333 记得b ...
- 【BZOJ1500】【NOI2005】维修数列(Splay)
[BZOJ1500][NOI2005]维修数列(Splay) 题面 不想再看见这种毒瘤题,自己去BZOJ看 题解 Splay良心模板题 真的很简单 我一言不发 #include<iostream ...
随机推荐
- bzoj 3225: [Sdoi2008] 立方体覆盖 题解
[原题] 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 51 Solved: 36 [Submit][S ...
- cocos2d-x 背景音乐播放
Code // on "init" you need to initialize your instance bool HelloWorld::init() { bool ...
- POJ 2653 Pick-up sticks (判断线段相交)
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 10330 Accepted: 3833 D ...
- JSON 遍历转为Model Bean
@RequestMapping(value = "/batchAddPageIndexBrand") @ResponseBody public HashMap<String, ...
- Day2 - Python基础2 列表、字典、集合
Python之路,Day2 - Python基础2 本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一, ...
- 9.13noip模拟试题
题目名称 “与” 小象涂色 行动!行动! 输入文件 and.in elephant.in move.in 输出文件 and.out elephant.in move.in 时间限制 1s 1s 1s ...
- Content-Disposition的使用和注意事项
转载:http://www.cnblogs.com/jzaileen/articles/1281025.html 最近不少Web技术圈内的朋友在讨论协议方面的事情,有的说web开发者应该熟悉web相关 ...
- javascript innerHTML、outerHTML、innerText、outerText的区别
1.功能讲解: innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 innerText 设置或获取位于对象起始和结束标签内 ...
- Delphi ComboBox的属性和事件、及几个鼠标事件的触发
临时做了两个小的测试程序,为了彻底弄清楚combobox的OnClick.OnChange.OnDropDown.OnCloseUp.OnSelect事件的触发及其先后顺序. 另附常用鼠标事件的触发情 ...
- html5 高清屏幕图片处理
1. srcset 语法:在元素上添加srcset属性.srcset的值是一个用逗号分隔的列表.列表中的每个项包含一张图片的路径并且按倍数(例如,1x,2x,3x...)提供多张分辨率的图片 参考:h ...