【BZOJ】【1251】序列终结者
Splay
还是splay序列维护,这题我WA了的原因是:在Push_up的时候,当前子树的max我是直接取的L、R和v[x]的最大值,但是如果没有左/右儿子,默认是会访问0号结点的mx值,而这个值没有初始化成-INF,所以就会导致所有负max值全部变为0……
/**************************************************************
Problem: 1251
User: Tunix
Language: C++
Result: Accepted
Time:8692 ms
Memory:4888 kb
****************************************************************/ //BZOJ 1251
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=1e5+,INF=~0u>>;
typedef long long LL;
/******************tamplate*********************/
int a[N],n,m;
int c[N][],fa[N],v[N],size[N],add[N],mx[N],tot,root;
bool rev[N];
#define L c[x][0]
#define R c[x][1]
void Push_down(int x){
if (rev[x]){
rev[L]^=; rev[R]^=;
swap(L,R); rev[x]=;
}
if (add[x]){
if (L) mx[L]+=add[x]; v[L]+=add[x]; add[L]+=add[x];
if (R) mx[R]+=add[x]; v[R]+=add[x]; add[R]+=add[x];
add[x]=;
}
}
void Push_up(int x){
mx[x]=max(v[x],max(mx[L],mx[R]));
size[x]=size[L]+size[R]+;
}
void New_node(int &x,int f,int key){
x=++tot;
fa[x]=f; mx[x]=v[x]=key;
L=R=rev[x]=add[x]=;
size[x]=;
}
void Build(int &x,int f,int l,int r){
if (l>r) return;
int m=l+r>>;
New_node(x,f,a[m]);
Build(L,x,l,m-);
Build(R,x,m+,r);
Push_up(x);
}
void Rotate(int x){
int y=fa[x],z=fa[y],l=c[y][]==x,r=l^;
c[z][c[z][]==y]=x;
fa[x]=z; fa[y]=x; fa[c[x][r]]=y;
c[y][l]=c[x][r]; c[x][r]=y;
Push_up(y);
}
int st[N],top;
void Preview(int x){
top=; st[++top]=x;
for(;fa[x];x=fa[x])
st[++top]=fa[x];
D(i,top,) Push_down(st[i]);
}
void splay(int x,int s=){
int y;
for(Preview(x);fa[x]!=s;Rotate(x))
if (fa[y=fa[x]]!=s)
Rotate( c[y][]==x^c[fa[y]][]==y ? x : y);
Push_up(x);
if (!s) root=x;
}
int kth(int x,int k){
Push_down(x);
if (size[L]+==k) return x;
else if (size[L]>=k) return kth(L,k);
else return kth(R,k-size[L]-);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("1251.in","r",stdin);
freopen("1251.out","w",stdout);
#endif
n=getint(); m=getint();
a[]=a[n+]=-INF; mx[]=-INF;
Build(root,,,n+);
int cmd,x,y,z,pos;
F(i,,m){
cmd=getint(); x=getint(); y=getint();
splay(kth(root,x)); splay(kth(root,y+),root);
pos=c[c[root][]][];
if (cmd==){
z=getint();
add[pos]+=z; v[pos]+=z; mx[pos]+=z;
splay(pos);
}else if (cmd==){
rev[pos]^=;
splay(pos);
}else if (cmd==){
printf("%d\n",mx[pos]);
splay(pos);
}
}
return ;
}
1251: 序列终结者
Time Limit: 20 Sec Memory Limit: 162 MB
Submit: 2798 Solved: 1115
[Submit][Status][Discuss]
Description
网
上有许多题,就是给定一个序列,要你支持几种操作:A、B、C、D。一看另一道题,又是一个序列
要支持几种操作:D、C、B、A。尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样
我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思。这道题目 就叫序列终结者吧。 【问题描述】
给定一个长度为N的序列,每个序列的元素是一个整数(废话)。要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V。 2.
将[L,R]这个区间翻转,比如1 2 3 4变成4 3 2 1。 3. 求[L,R]这个区间中的最大值。 最开始所有元素都是0。
Input
第一行两个整数N,M。M为操作个数。 以下M行,每行最多四个整数,依次为K,L,R,V。K表示是第几种操作,如果不是第1种操作则K后面只有两个数。
Output
对于每个第3种操作,给出正确的回答。
Sample Input
1 1 3 2
1 2 4 -1
2 1 3
3 2 4
Sample Output
【数据范围】
N<=50000,M<=100000。
HINT
Source
【BZOJ】【1251】序列终结者的更多相关文章
- BZOJ 1251 序列终结者(Splay)
题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术 ...
- BZOJ 1251: 序列终结者 [splay]
1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3778 Solved: 1583[Submit][Status][Discu ...
- BZOJ 1251: 序列终结者
1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 3773 Solved: 1579 [Submit][Status][Dis ...
- bzoj 1251序列终结者 splay 区间翻转,最值,区间更新
序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4594 Solved: 1939[Submit][Status][Discuss] De ...
- bzoj 1251: 序列终结者 平衡树,fhqtreap
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...
- 【BZOJ】1251: 序列终结者(splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint.. ...
- 1251. 序列终结者【平衡树-splay】
Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...
- 【BZOJ】1251: 序列终结者
[题意]给定含有n个0的的数列. 1.区间加值 2.区间翻转 3.区间求最大值 [算法]平衡树(fhq-treap) 需要特别注意的是: 1.使0点对全局无影响并全程保持(例如求max,t[0].mx ...
- 【bzoj1251】序列终结者(伸展树)
[bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...
随机推荐
- linux添加桌面快捷方式
linux通过软件中心安装的程序快捷图标都放在/usr/share/applications/目录下.点选一个图标右键,选择复制到,目录选择桌面即可. 但是有一些软件自行安装后,在那个目录里没有 ...
- CentOS7多实例安装mysq5.6二进制版本
1丶下载mysql,解压,创建用户,创建软链接 test -d /tools || mkdir /tools ;cd /tools wget http://mirrors.sohu.com/mysql ...
- 8-8 Ddfense Line uva1471 优先级队列
题意:给你一串长度为n的序列 你的任务是删除一个连续的子序列 使得剩下的序列中有一个长度最大的连续递增子序列 例如 将 5 3 4 9 2 8 6 7 1 中的9 2 8 删除 得到5 3 ...
- Django扩展
一.文件上传 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name=" ...
- 高并发编程之synchronized
一.什么是线程? 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程 ...
- Opencv学习笔记5:Opencv处理彩虹图、铜色图、灰度反转图
一.概述: 人类能够观察到的光的波长范围是有限的,并且人类视觉有一个特点,只能分辨出二十几种灰度,也就是说即使采集到的灰度图像分辨率超级高,有上百个灰度级,但是很遗憾,人们只能看出二十几个,也就是说信 ...
- BZOJ 2302: [HAOI2011]Problem c [DP 组合计数]
2302: [HAOI2011]Problem c Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 648 Solved: 355[Submit][S ...
- 在线HTTP速度测试(响应时间测试)及浏览器兼容测试
一.前言 网站的响应时间,是判断一个网站是否是好网站的重要的因素之一.百度首页的响应时间在全国各个省份小于10ms.这个响应时间远远好于竞争对手.根据美丽说的技术负责人分析,美丽说访问速度提升10%, ...
- hdu 3061 最大权闭合子图
属于模板题吧... #include <cstdio> #include <cstring> #include <vector> #define min(a,b) ...
- Educational Codeforces Round 13 D. Iterated Linear Function 水题
D. Iterated Linear Function 题目连接: http://www.codeforces.com/contest/678/problem/D Description Consid ...