BZOJ 1500 splay终结版...
GSS系列有一丝丝像…
只不过那个是线段树 这个是splay
翻转 插入 删除啥的就是普通的splay
合在一起了而已
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Tree{
int v,rev,sum,lmax,rmax,maxx,ch[2],fa,size,same;
void init(){v=rev=sum=lmax=rmax=maxx=ch[0]=ch[1]=fa=0;size=1;same=-1001;}
}tr[505000];
int rubbish[500050],top,n,m,root;
char op[105];
void push_up(int x){
tr[0].init();tr[0].size=0,tr[0].maxx=-0x3f3f3f3f;
int lson=tr[x].ch[0],rson=tr[x].ch[1];
tr[x].size=tr[lson].size+tr[rson].size+1;
tr[x].sum=tr[lson].sum+tr[rson].sum+tr[x].v;
tr[x].lmax=max(max(tr[lson].lmax,tr[lson].sum+tr[rson].lmax+tr[x].v),0);
tr[x].rmax=max(max(tr[rson].rmax,tr[rson].sum+tr[lson].rmax+tr[x].v),0);
tr[x].maxx=max(tr[lson].maxx,max(tr[rson].maxx,tr[lson].rmax+tr[rson].lmax+tr[x].v));
}
void push_down(int x){
int lson=tr[x].ch[0],rson=tr[x].ch[1];
if(tr[x].same!=-1001){
tr[lson].same=tr[rson].same=tr[x].same;
tr[lson].v=tr[rson].v=tr[x].same;
tr[lson].sum=tr[lson].size*tr[x].same;
tr[rson].sum=tr[rson].size*tr[x].same;
if(tr[x].same>0){
tr[lson].maxx=tr[lson].lmax=tr[lson].rmax=tr[lson].sum;
tr[rson].maxx=tr[rson].lmax=tr[rson].rmax=tr[rson].sum;
}
else{
tr[lson].lmax=tr[lson].rmax=tr[rson].lmax=tr[rson].rmax=0;
tr[lson].maxx=tr[rson].maxx=tr[x].same;
}
tr[x].same=-1001;
}
if(tr[x].rev){
tr[lson].rev^=1,tr[rson].rev^=1;
swap(tr[x].ch[0],tr[x].ch[1]);
swap(tr[lson].lmax,tr[lson].rmax);
swap(tr[rson].lmax,tr[rson].rmax);
tr[x].rev=0;
}
}
void rotate(int p){
int q=tr[p].fa,y=tr[q].fa,f=(tr[q].ch[1]==p);
tr[q].ch[f]=tr[p].ch[!f];tr[tr[q].ch[f]].fa=q;
tr[p].ch[!f]=q;tr[q].fa=p;tr[p].fa=y;
if(y)tr[y].ch[tr[y].ch[1]==q]=p;
push_up(q);
}
void splay(int x,int tp){
for(int y;y=tr[x].fa;rotate(x)){
if(y==tp)break;
if(tr[y].fa!=tp){
if((tr[y].ch[0]==x)^(tr[tr[y].fa].ch[0]==y))rotate(x);
else rotate(y);
}
}push_up(x);
if(!tp)root=x;
}
int newnode(){
int temp=rubbish[top--];tr[temp].init();
return temp;
}
int build(int l,int r,int fa){
if(l>r)return 0;
if(l==r){
int temp=newnode();
scanf("%d",&tr[temp].v);
tr[temp].maxx=tr[temp].sum=tr[temp].v;
tr[temp].lmax=tr[temp].rmax=max(0,tr[temp].v);
tr[temp].fa=fa;
return temp;
}
int mid=(l+r)>>1;
int temp=newnode();
tr[temp].ch[0]=build(l,mid-1,temp);
scanf("%d",&tr[temp].v);
tr[temp].maxx=tr[temp].sum=tr[temp].v;
tr[temp].lmax=tr[temp].rmax=max(0,tr[temp].v);
tr[temp].fa=fa;
tr[temp].ch[1]=build(mid+1,r,temp);
push_up(temp);
return temp;
}
void check(int x){
push_down(x);
printf("x=%d lson=%d rson=%d sum=%d size=%d maxx=%d v=%d lmax=%d rmax=%d\n",x,tr[x].ch[0],tr[x].ch[1],tr[x].sum,tr[x].size,tr[x].maxx,tr[x].v,tr[x].lmax,tr[x].rmax);
if(tr[x].ch[0])check(tr[x].ch[0]);
if(tr[x].ch[1])check(tr[x].ch[1]);
}
int find(int x,int y){
push_down(x);
if(tr[tr[x].ch[0]].size+1==y)return x;
if(tr[tr[x].ch[0]].size>=y)return find(tr[x].ch[0],y);
else return find(tr[x].ch[1],y-tr[tr[x].ch[0]].size-1);
}
void dfs_del(int x){
if(x)rubbish[++top]=x;
if(tr[x].ch[0])dfs_del(tr[x].ch[0]);
if(tr[x].ch[1])dfs_del(tr[x].ch[1]);
}
int main(){
top=500000;
for(int i=1;i<=500000;i++)rubbish[i]=i;
scanf("%d%d",&n,&m);
root=build(1,n,0);
int tempa=find(root,1),tempb=newnode();
splay(tempa,0);
tr[tempa].ch[0]=tempb;tr[tempb].fa=tempa;
push_up(tempa);
tempa=find(root,n+1),tempb=newnode();
splay(tempa,0);
tr[tempa].ch[1]=tempb,tr[tempb].fa=tempa;
push_up(tempa);
while(m--){
scanf("%s",op);
int xx,yy,zz;
if(op[0]=='I'){
scanf("%d%d",&xx,&yy);
tempa=find(root,xx+1);
splay(tempa,0);
tempb=find(root,xx+2);
splay(tempb,tempa);
int newroot=build(1,yy,tempb);
tr[tempb].ch[0]=newroot;
push_up(tempb);push_up(root);
}
else if(op[0]=='D'){
scanf("%d%d",&xx,&yy);
tempa=find(root,xx);
splay(tempa,0);
tempb=find(root,xx+1+yy);
splay(tempb,tempa);
dfs_del(tr[tempb].ch[0]);
tr[tempb].ch[0]=0;push_up(tempb);push_up(tempa);
}
else if(op[2]=='K'){
scanf("%d%d%d",&xx,&yy,&zz);
tempa=find(root,xx);
splay(tempa,0);
tempb=find(root,xx+1+yy);
splay(tempb,tempa);
tr[tr[tempb].ch[0]].same=tr[tr[tempb].ch[0]].v=zz;
push_down(tr[tempb].ch[0]),push_up(tr[tempb].ch[0]);
push_up(tempb),push_up(tempa);
}
else if(op[0]=='R'){
scanf("%d%d",&xx,&yy);
tempa=find(root,xx);
splay(tempa,0);
tempb=find(root,xx+1+yy);
splay(tempb,tempa);
tr[tr[tempb].ch[0]].rev^=1;
swap(tr[tr[tempb].ch[0]].lmax,tr[tr[tempb].ch[0]].rmax);
push_up(tempb);
}
else if(op[0]=='G'){
scanf("%d%d",&xx,&yy);
tempa=find(root,xx);
splay(tempa,0);
tempb=find(root,xx+1+yy);
splay(tempb,tempa);
printf("%d\n",tr[tr[tempb].ch[0]].sum);
}
else{
tempa=find(root,1);
splay(tempa,0);
tempb=find(root,tr[root].size);
splay(tempb,tempa);
printf("%d\n",tr[tr[tempb].ch[0]].maxx);
}
}
}
BZOJ 1500 splay终结版...的更多相关文章
- BZOJ 1500 Splay 全操作
好久没写splay了,写一发(写了一节课,调了一节课) #include <iostream> #include <cstring> #include <cstdio&g ...
- [BZOJ 1500] [NOI2005] 维修数列
题目链接:BZOJ - 1500 题目分析 我要先说一下,这道题我写了一晚上,然后Debug了一整个白天..........再一次被自己的蒟蒻程度震惊= = 这道题是传说中的Splay维护数列的Bos ...
- [BZOJ 1500] 维护序列
Link: BZOJ 1500 传送门 Solution: 可能平衡树维护序列的所有操作都在这了吧…… 对序列的维护$fhq treap$和$Splay$都能做 有几个注意点: 1.维护序列时始终记得 ...
- IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结
添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...
- Qt Windows下链接子系统与入口函数(终结版)(可同时存在main和WinMain函数)
Qt Windows下链接子系统与入口函数(终结版) 转载自:http://blog.csdn.net/dbzhang800/article/details/6358996 能力所限,本讨论仅局限于M ...
- coursera_poj_魔兽世界终结版
五个下午的时间!!!!终于过了!!有史以来做的最复杂的一个题这是我迄今为止做的最复杂也最具有挑战的一个oj作业.虽然之前做过比这个规模一些作业项目,但是往往有简单的模块框架,模块之前的关系也只是有些简 ...
- 蜻蜓特派员 Windows XP SP3 纯净终结版
蜻蜓特派员Windows XP SP3 纯净安装版 终结版,系统纯净无广告.无插件,网卡等驱动和运行库齐全,安全更新补丁全网最新!微软停止了 Windows XP 的支持之后还是偶尔为 WinXP 提 ...
- [转]springcloud(九):配置中心和消息总线(配置中心终结版)
https://www.cnblogs.com/ityouknow/p/6931958.html springcloud(九):配置中心和消息总线(配置中心终结版) 我们在springcloud(七) ...
- SQL Server数据全同步及价值分析[终结版]
SQL Server数据全同步[终结版] 版权全部.转载请注明出处.谢谢! 经过两天的同步编写和測试.出了第一个Release版本号: 1. 本函数仅支持单向同步.即从一个主数据库想多个从数据库同步 ...
随机推荐
- 重温前端基础之-css浮动与清除浮动
文档流的概念指什么?有哪种方式可以让元素脱离文档流? 文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行,并在每行中按从左到右的顺序排放元素.脱离文 ...
- javascirpt之 this、apply、call、bind
this.apply.call.bind 这又是一个面试经典问题~/(ㄒoㄒ)/~~也是 ES5中众多坑中的一个,在 ES6 中可能会极大避免 this 产生的错误,但是为了一些老代码的维护,最好还是 ...
- VueJS 开发常见问题集锦
由于公司的前端开始转向 VueJS,最近开始使用这个框架进行开发,遇到一些问题记录下来,以备后用. 主要写一些 官方手册 上没有写,但是实际开发中会遇到的问题,需要一定知识基础. 涉及技术栈 CLI: ...
- 【Oracle】ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
今天数据库在查询数据的时候显示了这个错误: ORA-01157: cannot identify/lock data file 201 - see DBWR trace file ORA-01110: ...
- 多态&接口
多态 多态定义:允许一个父类变量引用子类的对象:允许一个接口类型引用实现类对象. 多态的调用:使用父类的变量指向子类的对象:所调用的属性和方法只限定父类中定义的属性和方法,不能调用子类中特有的属性和方 ...
- UBuntu安裝使用PIP
Windows下安裝python包還是比較方便的,直接在FLD網站下載對應的EXE文件就可以安裝,在linux系統下,使用pip,easy egg 管理工具可以減輕安裝負擔. 原文鏈接:http:// ...
- php生成唯一识别码uuid
/*生成唯一标志*标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx(8-4-4-4-12)*/ function uuid() { $chars = md ...
- auto_ftp_sh
#!/usr/bin/env python # -*- coding:utf-8 -*- import paramiko import time mydate = time.strftime( ...
- mysql 各项操作流程
启动mysql:进入命令行输入:net start mysql 如果失败则显示:服务名无效,需跳转到指定Bin目录下进行启动mysql, 成功则进行下一步:登陆 :mysql -uroot -proo ...
- shell中的交互模式:expect
在shell开发中,我们连接FTP或者passwd或sudo等操作时,需要手动输入密码.对于自动化而言,这显然是不合适的.而expect的强交互模式解决了这个问题.工作中偶有涉及到这个,个人也是简单的 ...