_bzoj1500 [NOI2005]维修数列【真·Splay】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1500
注意MAX-SUM的时候,不可以是空串。
#include <cstdio>
#include <algorithm> const int maxn = 500005; int n, m, top, a[maxn], posi, tot, cc;
char opr[15];
struct Node {
Node * ch[2];
Node * fa;
int key, sm, mxl, mxr, mxs, siz, c, mx;
char rev;
Node(void);
int getsm(void) {
return c == -666666? sm: c * siz;
}
int getmxl(void) {
if (c == -666666) {
return rev? mxr: mxl;
}
if (c > 0) {
return c * siz;
}
return 0;
}
int getmxr(void) {
if (c == -666666) {
return rev? mxl: mxr;
}
if (c > 0) {
return c * siz;
}
return 0;
}
int getmxs(void) {
if (c == -666666) {
return mxs;
}
if (c > 0) {
return c * siz;
}
return 0;
}
int getmx(void) {
return c == -666666? mx: c;
}
} *nil, *root, *tnode;
Node * stk[maxn]; Node::Node(void) {
ch[0] = ch[1] = fa = nil;
key = sm = mxl = mxr = mxs = siz = rev = 0;
mx = c = -666666;
}
inline void pushup(Node * x) {
x->siz = x->ch[0]->siz + x->ch[1]->siz + 1;
x->sm = x->ch[0]->getsm() + x->ch[1]->getsm() + x->key;
x->mxl = std::max(x->ch[0]->getmxl(), x->ch[0]->getsm() + x->key + x->ch[1]->getmxl());
x->mxr = std::max(x->ch[1]->getmxr(), x->ch[1]->getsm() + x->key + x->ch[0]->getmxr());
x->mxs = std::max(x->ch[0]->getmxs(), x->ch[1]->getmxs());
x->mxs = std::max(x->mxs, x->ch[0]->getmxr() + x->key + x->ch[1]->getmxl());
x->mx = std::max(x->ch[0]->getmx(), x->ch[1]->getmx());
x->mx = std::max(x->mx, x->key);
}
inline void pushdown(Node * x) {
if (x->c != -666666) {
x->ch[0]->c = x->ch[1]->c = x->c;
x->key = x->c;
x->sm = x->c * x->siz;
if (x->c > 0) {
x->mxl = x->mxr = x->mxs = x->sm;
}
else {
x->mxl = x->mxr = x->mxs = 0;
}
x->c = -666666;
}
if (x->rev) {
x->rev = 0;
x->ch[0]->rev ^= 1;
x->ch[1]->rev ^= 1;
std::swap(x->ch[0], x->ch[1]);
}
}
inline void rotate(Node* x) {
Node *y = x->fa;
if (y == y->fa->ch[0]) {
y->fa->ch[0] = x;
}
else {
y->fa->ch[1] = x;
}
x->fa = y->fa;
int dir = x == y->ch[1];
y->ch[dir] = x->ch[dir ^ 1];
x->ch[dir ^ 1]->fa = y;
x->ch[dir ^ 1] = y;
y->fa = x;
pushup(y);
pushup(x);
}
inline void splay(Node * x, Node * rt) {
Node * p;
char flag1, flag2;
top = 0;
for (Node * i = x; i != rt; i = i->fa) {
stk[top++] = i;
}
for (int i = top - 1; ~i; --i) {
pushdown(stk[i]);
}
while (x->fa != rt) {
p = x->fa;
if (p->fa == rt) {
rotate(x);
}
else {
flag1 = p == p->fa->ch[1];
flag2 = x == p->ch[1];
if (flag1 ^ flag2) {
rotate(x);
}
else {
rotate(p);
}
rotate(x);
}
}
if (rt == nil) {
root = x;
}
}
inline void modify(int pos1, int pos2) {
Node * x = root;
pushdown(x);
while (pos1 != x->ch[0]->siz + 1) {
if (pos1 <= x->ch[0]->siz) {
x = x->ch[0];
}
else {
pos1 -= x->ch[0]->siz + 1;
x = x->ch[1];
}
pushdown(x);
}
splay(x, nil);
x = root;
pushdown(x);
while (pos2 != x->ch[0]->siz + 1) {
if (pos2 <= x->ch[0]->siz) {
x = x->ch[0];
}
else {
pos2 -= x->ch[0]->siz + 1;
x = x->ch[1];
}
pushdown(x);
}
splay(x, root);
}
inline Node* ist(int left, int right) {
if (left > right) {
return nil;
}
Node * rt = new Node, *t;
int mid = (left + right) >> 1;
rt->key = a[mid];
t = ist(left, mid - 1);
t->fa = rt;
rt->ch[0] = t;
t = ist(mid + 1, right);
t->fa = rt;
rt->ch[1] = t;
pushup(rt);
return rt;
}
void clear(Node * x) {
if (x == nil) {
return;
}
clear(x->ch[0]);
clear(x->ch[1]);
delete x;
} int main(void) {
//freopen("in.txt", "r", stdin);
nil = new Node;
root = nil;
scanf("%d%d", &n, &m);
for (int i = 2; i <= n + 1; ++i) {
scanf("%d", a + i);
}
root = ist(1, n = n + 2);
while (m--) {
scanf("%s", opr);
if (opr[2] == 'S') { // INSERT
scanf("%d%d", &posi, &tot);
n += tot;
++posi;
modify(posi, posi + 1);
for (int i = 1; i <= tot; ++i) {
scanf("%d", a + i);
}
tnode = ist(1, tot);
tnode->fa = root->ch[1];
root->ch[1]->ch[0] = tnode;
pushup(root->ch[1]);
pushup(root);
}
else if (opr[2] == 'L') { // DELETE
scanf("%d%d", &posi, &tot);
n -= tot;
++posi;
modify(posi - 1, posi + tot);
clear(root->ch[1]->ch[0]);
root->ch[1]->ch[0] = nil;
pushup(root->ch[1]);
pushup(root);
}
else if (opr[2] == 'K') { // MAKE-SAME
scanf("%d%d%d", &posi, &tot, &cc);
++posi;
modify(posi - 1, posi + tot);
root->ch[1]->ch[0]->c = cc;
pushup(root->ch[1]);
pushup(root);
}
else if (opr[2] == 'V') { // REVERSE
scanf("%d%d", &posi, &tot);
++posi;
modify(posi - 1, posi + tot);
root->ch[1]->ch[0]->rev ^= 1;
pushup(root->ch[1]);
pushup(root);
}
else if (opr[2] == 'T') { // GET-SUM
scanf("%d%d", &posi, &tot);
++posi;
modify(posi - 1, posi + tot);
printf("%d\n", root->ch[1]->ch[0]->getsm());
}
else { // MAX-SUM
modify(1, n);
printf("%d\n", root->ch[1]->ch[0]->getmx() > 0? root->getmxs(): root->ch[1]->ch[0]->getmx());
}
}
return 0;
}
_bzoj1500 [NOI2005]维修数列【真·Splay】的更多相关文章
- 【BZOJ】1500: [NOI2005]维修数列(splay+变态题)
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 模板不打熟你确定考场上调试得出来? 首先有非常多的坑点...我遇到的第一个就是,如何pushu ...
- NOI2005维修数列(splay)
题目描述: Description 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 Input 输入的第1 行包含两个数N 和M( ...
- bzoj 1500: [NOI2005]维修数列 splay
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 6556 Solved: 1963[Submit][Status ...
- 【BZOJ1500】【NOI2005】维修数列(Splay)
[BZOJ1500][NOI2005]维修数列(Splay) 题面 不想再看见这种毒瘤题,自己去BZOJ看 题解 Splay良心模板题 真的很简单 我一言不发 #include<iostream ...
- [BZOJ1500][NOI2005]维修数列 解题报告 Splay
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- BZOJ 1500: [NOI2005]维修数列 (splay tree)
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 4229 Solved: 1283[Submit][Status ...
- 【BZOJ1500】[NOI2005]维修数列 Splay
[BZOJ1500][NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行 ...
- [NOI2005] 维修数列
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 8397 Solved: 2530 Description In ...
- [BZOJ1500][NOI2005]维修数列---解题报告
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
随机推荐
- system表空间用满解决
分类: Oracle 早上看到alert日志报说system表空间快满了(oracle版本是11gR2): 如果system表空间不是自动扩展,空间用满甚至会出现数据库无法登陆.使用任何用户登 ...
- 【Nginx】I/O多路转接之select、poll、epoll
当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解决方案有以下几种: 1.使用多进程或 ...
- 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-I ( ZOJ 3827 ) Information Entropy
Information Entropy Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Information ...
- 一个IM开源项目LiteTalk
http://blog.csdn.net/visualwind/article/details/6086631 http://blog.sina.com.cn/s/blog_54b5ea250101n ...
- Java小白手记2:一些名词解释
看到<Java 征途:行者的地图> ,这是一篇有关java学习路径文章.对我等Java小白有指引作用.里面提到了一些基本的名词术语,有些我知道,有些不知道,再补上一些自己曾觉得模糊的,记录 ...
- c中的变量
1 变量类型 1.1 static global or static .data/.bss 1.2 automic stack,its relevant to os kernel and compil ...
- DataTabless Add rows
参考官网案例:https://datatables.net/examples/api/add_row.html JS: $(document).ready(function() { var t ...
- h5ai目录列表优化
h5ai是HTTP Web服务器的现代文件索引器,专注于您的文件.目录以有吸引力的方式显示,浏览它们通过不同的视图,面包屑和树状概述增强.最初,h5ai是HTML5 Apache Index的缩写,但 ...
- js权威指南
有很多js的细节基础不太了解,希望能通过阅读这本书查漏补缺!长期更新!
- VA市场高烧已退,逐渐降温
本周市场国产VA报价在175元/公斤左右,较上周滑落.因前期停报的厂家均已报价,个别国产厂家报价较低,各厂家间报价价差较大,彰显不同态度.国内厂家供应依然偏紧,但较前期已缓解.中小饲料企业库存偏低,近 ...