【splay模板】
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#define oo 1000000000
#define lc(x) son[x][0]
#define rc(x) son[x][1]
using namespace std;
int i,j,k,n,m,s,t,ans;
];
struct node
{
int set,rever;
} tag[];
][];
];
];
];
];
];
];
];
];
queue <int> q;
int root,cnt,pos;
void update(int x)
{
size[x] = size[lc(x)]+size[rc(x)]+;
tsum[x] = tsum[lc(x)]+tsum[rc(x)]+key[x];
lmax[x] = max(lmax[lc(x)],tsum[lc(x)]+key[x]+lmax[rc(x)]);
rmax[x] = max(rmax[rc(x)],tsum[rc(x)]+key[x]+rmax[lc(x)]);
tmax[x] = max(max(tmax[lc(x)],tmax[rc(x)]),lmax[rc(x)]+key[x]+rmax[lc(x)]);
}
void Round(int x)
{
swap(lc(x),rc(x));
swap(lmax[x],rmax[x]);
}
void build(int l,int r,int &x)
{
if (l>r)
{
x = ;
return;
}
if (l==r)
{
if (!q.empty())
{
x = q.front();
q.pop();
} else x = ++cnt;
tag[x].rever = ;
tag[x].;
key[x] = tsum[x] = tmax[x] = a[l];
lmax[x] = rmax[x] = max(,a[l]);
size[x] = ;
lc(x) = rc(x) = ;
return;
}
;
if (!q.empty())
{
x = q.front();
q.pop();
} else x = ++cnt;
key[x] = a[mid];
tag[x].rever = ;
tag[x].;
lc(x) = rc(x) = ;
build(l,mid-,lc(x));
build(mid+,r,rc(x));
) fa[lc(x)] = x;
) fa[rc(x)] = x;
update(x);
}
void pushdown(int x)
{
)
{
tag[x].rever = ;
tag[lc(x)].rever ^= ;
tag[rc(x)].rever ^= ;
Round(lc(x));
Round(rc(x));
}
)
{
)
{
tag[lc(x)].set = tag[x].set;
key[lc(x)] = tag[x].set;
tsum[lc(x)] = tag[x].set*size[lc(x)];
) tmax[lc(x)] = lmax[lc(x)] = rmax[lc(x)] = tsum[lc(x)];
else
{
tmax[lc(x)] = tag[x].set;
lmax[lc(x)] = rmax[lc(x)] = ;
}
}
)
{
tag[rc(x)].set = tag[x].set;
key[rc(x)] = tag[x].set;
tsum[rc(x)] = tag[x].set*size[rc(x)];
) tmax[rc(x)] = lmax[rc(x)] = rmax[rc(x)] = tsum[rc(x)];
else
{
tmax[rc(x)] = tag[x].set;
lmax[rc(x)] = rmax[rc(x)] = ;
}
}
tag[x].;
}
}
int find(int x,int k)
{
pushdown(x);
==k) return x;
else if (size[lc(x)]>=k) return find(lc(x),k);
);
}
void rotate(int x)
{
int y = fa[x],z = fa[y],w = lc(y)==x;
pushdown(y);
pushdown(x);
fa[son[x][w]] = y;son[y][w^] = son[x][w];
fa[x] = z;) son[z][rc(z)==y] = x;
son[x][w] = y;fa[y] = x;
update(y);
update(x);
}
void splay(int x,int s)
{
pushdown(x);
while (fa[x]!=s)
{
int y = fa[x],z = fa[y];
if (z!=s) rotate(lc(z)==y^lc(y)==x?x:y);
rotate(x);
}
update(x);
) root = x;
}
void insert(int pos)
{
int z;
build(,n,z);
int x = find(root,pos);
);
splay(x,);
splay(y,root);
lc(y) = z;
fa[z] = y;
update(y);
update(x);
}
void del(int x)
{
) return;
del(lc(x));
q.push(x);
del(rc(x));
}
void erase(int pos,int n)
{
);
int y = find(root,pos+n);
splay(x,);
splay(y,root);
del(lc(y));
lc(y) = ;
update(y);
update(x);
}
int main()
{
scanf("%d%d",&n,&m);
a[] = a[n+] = -oo;
tmax[] = -oo;
;i<=n+;i++) scanf("%d",&a[i]);
build(,n+,root);
while (m--)
{
];
scanf();
]=='I')
{
scanf("%d%d",&pos,&n);
;i<=n;i++)
scanf("%d",&a[i]);
insert(pos+);
} ]=='D')
{
scanf("%d%d",&pos,&n);
erase(pos+,n);
} ]==]=='K')
{
int c;
scanf("%d%d%d",&pos,&n,&c);
int x = find(root,pos);
);
splay(x,);
splay(y,root);
tag[lc(y)].set = c;
key[lc(y)] = c;
tsum[lc(y)] = c*size[lc(y)];
) tmax[lc(y)] = lmax[lc(y)] = rmax[lc(y)] = tsum[lc(y)];
else
{
tmax[lc(y)] = c;
lmax[lc(y)] = rmax[lc(y)] = ;
}
update(y);
update(x);
} ]=='R')
{
scanf("%d%d",&pos,&n);
int x = find(root,pos);
);
splay(x,);
splay(y,root);
tag[lc(y)].rever ^= ;
Round(lc(y));
update(y);
update(x);
} ]=='G')
{
scanf("%d%d",&pos,&n);
int x = find(root,pos);
);
splay(x,);
splay(y,root);
printf("%d\n",tsum[lc(y)]);
} else printf("%d\n",tmax[root]);
}
;
}
BZOJ1500 维修数列
【splay模板】的更多相关文章
- bzoj 1588 splay模板题
用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... #include<iostream> #include<cstdio> ...
- COJ 1002 WZJ的数据结构(二)(splay模板)
我的LCC,LCT,Splay格式终于统一起来了... 另外..这个形式的Splay是标准的Splay(怎么鉴别呢?看Splay函数是否只传了一个变量node就行),刘汝佳小白书的Splay写的真是不 ...
- Splay 模板
Splay 模板 struct SplayTree{ const static int maxn = 1e5 + 15; int ch[maxn][2] , key[maxn] , s[maxn] , ...
- [luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)
解题关键:splay模板题整理. 如何不加入极大极小值?(待思考) #include<cstdio> #include<cstring> #include<algorit ...
- BZOJ1588 [HNOI2002]营业额统计 splay模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 16189 Solved: 6482 [Submit][S ...
- 文艺平衡树(splay模板)
题干:splay模板,要求维护区间反转. splay是一种码量小于treap,但支持排名,前驱后继等treap可求的东西,也支持区间反转的平衡树. 但是有两个坏处: 1.splay常数远远大于trea ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- bzoj 1208 splay模板题2
自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring& ...
- 【BZOJ 3196】二逼平衡树 线段树套splay 模板题
我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...
- 【BZOJ 3188】【Coci 2011】Upit Splay模板题
转啊转终于转出来了,然而我的模板跟陈竞潇学长的模板一模一样,还是太弱啊,第一次用指针. #include<cstdio> #include<cstring> #include& ...
随机推荐
- Solr整合Ansj中文分词器
Ansj的使用和相关资料下载参考:http://iamyida.iteye.com/blog/2220833 参考 http://www.cnblogs.com/luxh/p/5016894.html ...
- 使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上
在第一讲使用delphi+intraweb进行微信开发1--微信平台接入中我们编写了一个简单的微信接口程序,这个程序我是用Stand Alone Server / Service 方式编译的程序,并且 ...
- android .apk安装时遇到NSTALL_FAILED_CONTAINER_ERROR错误
在一台酷派上装apk时遇到问题: android Installation error: INSTALL_FAILED_CONTAINER_ERROR 遇到问题后baidu google修改为andr ...
- Linux 任务计划
一.配置cron实现自动化 使用cron实现任务自动化可以通过修改/etc/crontab文件以及使用crontab命令实现,其结果是一样的. 1./etc/crontab文件实现自动化 cron守护 ...
- jquery 面板拖拽
在网上找了好多的例子 都不满足我所需要 在网上找了一篇关于easyui是一个拓展的demo 然后根据demo 把我所需要的东西进行再次拓展 满足我的需求 也不多说了 上代码 首先 你肯定是要导eas ...
- nodejs在同一台服务器上部署并同时运行两个或以上服务端时,一个服务用户登录后会挤掉另一个用户的问题
问题描述:一台服务器,部署了两个或以上不同的Web服务,服务A的用户在登陆后,服务B的用户也登陆,此时服务A的用户在点击页面时,会返回登陆页面. 问题根源:浏览器保存的session相同,即cooki ...
- Docker指令集
FROM 语法:FROM <image>[:<tag>] 解释:设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile ...
- window 10 用composer安装 基于 Laravel 5.3 的 Coaster CMS Curl错误77解决
安装教程来自 http://laravelacademy.org/post/6547.html 1.系统环境windows 10 nodejs3.9.2 composer1.2.4(国内镜像) Cmd ...
- C++ 编译报错
vs编译错误描绘如下: 1>f:\company\newphone\softphoneservice\softphoneservice\EventS.h(13): error C2143: 语法 ...
- tomcat7/8 启用调试模式,可进行远程调试
tomcat7,和 tomcat6 的jpda 不一样,tomcat7已经把jpda配置的属性在catalina.sh/catalina.bat里面已经写好了,我们不需要向tomcat6那样去设置参数 ...