【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.尤其是我 ...
 
随机推荐
- LoadRunner 参数化之 连接数据库进行参数化
			
LoadRunner 参数化之 连接数据库进行参数化 Loadrunner(简称“LR”)对性能测试的脚本进行参数化时,由于数据量偏大,大家往往都会把数据录入到数据库表里,然后关联到LR,本文将详细介 ...
 - 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理  or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
			
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
 - 洛谷 P2894 [USACO08FEB]酒店Hotel-线段树区间合并(判断找位置,不需要维护端点)+分治
			
P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultur ...
 - Chrome谷歌浏览器拓展组件的2种快速安装方法(.crx)
			
谷歌浏览器拓展有至少2种安装方法,现在简单的介绍下. 第一种.当然是进入谷歌官方的应用商店直接安装 这种方法简单快捷,而且官方支持度够高,唯一的缺点是大陆用户需要“FQ”. 谷歌拓展组件应用商店地址: ...
 - Python 递归删除非空目录(包括子目录以及文件)
			
Python的OS模块自带rmdir和removedirs函数用于删除目录,但是两者都不能删除非空目录,以下代码定义了一个函数 remove_dir 用于删除非空目录. #作者官网 http://ww ...
 - OptParse选项工具模块
			
OptParse是一个从Python2.3版本起引入的一个编写命令行工具模块,示例如下 ######example.py###### import optparse if __name__ == &q ...
 - NetCore+Dapper WebApi架构搭建(三):添加实体和仓储
			
上一节讲了类库添加一些底层的基本封装,下面来添加实体和仓储 1.Entities文件夹添加一个实体类Users,继承BaseModel,即拥有BaseModel的主键 using System; na ...
 - [ 转载 ]学习笔记-深入剖析Java中的装箱和拆箱
			
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...
 - 排序算法之快速排序Java实现
			
排序算法之快速排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...
 - hihocoder 1866 XOR
			
题面在这里 拆位分析一下就OK啦 /* y + (y xor x) */ #include<bits/stdc++.h> #define ll long long using namesp ...