4655 序列终结者

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 
 
 
题目描述 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 Description

第一行两个整数N,M。M为操作个数。 以下M行,每行最多四个整数,依次为K,L,R,V。K表示是第几种操作,如果不是第1种操作则K后面只有两个数。

输出描述 Output Description

对于每个第3种操作,给出正确的回答。

样例输入 Sample Input

4 4
1 1 3 2
1 2 4 -1
2 1 3
3 2 4

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

N<=50000,M<=100000。

题意中文。

直接以前的题目改一下就可以。

翻转不需要pushup,因为建树的时候已经算过了,再算一次就不对了。更新也不需要pushup,因为加值不影响size。

没脑子的我简直想暴打自己一顿,调了快1个小时bug,怎么也过不了,最后发现是查询3操作,query(l,r),写成query(1,n),简直要死。

mdzz,浪费了一个小时。

代码:

 //splay
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
const int inf=0x3f3f3f3f; int root;
int tree[maxn][],fa[maxn],id[maxn];
int sz[maxn],val[maxn],Max[maxn];
int add[maxn],rev[maxn]; void pushup(int x)
{
int l=tree[x][],r=tree[x][];
Max[x]=max(max(Max[l],Max[r]),val[x]);
sz[x]=sz[l]+sz[r]+;
} void pushdown(int x)
{
int l=tree[x][],r=tree[x][];
if(add[x]){
if(l) val[l]+=add[x],Max[l]+=add[x],add[l]+=add[x];
if(r) val[r]+=add[x],Max[r]+=add[x],add[r]+=add[x];
add[x]=;
}
if(rev[x]){
rev[x]=;rev[l]^=;rev[r]^=;
swap(tree[x][],tree[x][]);
}
} void rotate(int x,int &k)
{
int y=fa[x],z=fa[y],l=(tree[y][]==x),r=l^;
if(y==k) k=x;
else tree[z][tree[z][]==y]=x;
fa[tree[x][r]]=y;fa[y]=x;fa[x]=z;
tree[y][l]=tree[x][r];tree[x][r]=y;
pushup(y);pushup(x);
} void splay(int x,int &k)
{
while(x!=k){
int y=fa[x],z=fa[y];
if(y!=k){
if((tree[z][]==y)^(tree[y][]==x)) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
} int find(int x,int rk)
{
if(add[x]||rev[x]) pushdown(x);
int l=tree[x][],r=tree[x][];
if(sz[l]+==rk) return x;
else if(sz[l]>=rk) return find(l,rk);
else return find(r,rk-sz[l]-);
} int split(int l,int r)
{
int x=find(root,l),y=find(root,r+);
splay(x,root);splay(y,tree[x][]);
return tree[y][];
} void rever(int l,int r)
{
int x=split(l,r),y=fa[x];
rev[x]^=;
// swap(tree[x][0],tree[x][1]);
// pushup(y);pushup(fa[y]);
} void update(int l,int r,int v)
{
int x=split(l,r),y=fa[x];
val[x]+=v;Max[x]+=v;add[x]+=v;
// pushup(y);pushup(fa[y]);
} int find_max(int l,int r)
{
int x=split(l,r);
return Max[x];
} void build(int l,int r,int f)
{
if(l>r) return ;
if(l==r){
fa[l]=f;
sz[l]=;
val[l]=;
tree[f][l>=f]=l;
return ;
} int m=(l+r)>>;
build(l,m-,m);
build(m+,r,m);
fa[m]=f;
pushup(m);
tree[f][m>=f]=m;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
// for(int i=1;i<=n+2;i++){
// id[i]=i;
// }
Max[]=-inf;
build(,n+,);
root=(n+)>>;
for(int i=;i<=m;i++){
int op;
scanf("%d",&op);
if(op==){
int l,r,v;
scanf("%d%d%d",&l,&r,&v);
update(l,r,v);
}
else if(op==){
int l,r;
scanf("%d%d",&l,&r);
rever(l,r);
}
else if(op==){
int l,r;
scanf("%d%d",&l,&r);
int maxx=find_max(l,r);
printf("%d\n",maxx);
}
}
return ;
}

滚了。

CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)的更多相关文章

  1. bzoj 1251序列终结者 splay 区间翻转,最值,区间更新

    序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4594  Solved: 1939[Submit][Status][Discuss] De ...

  2. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  3. 【BZOJ1251】序列终结者 Splay

    一道模板题,一直没发现自己的快速读入读不了负数,我竟然能活到现在真是万幸. #include <iostream> #include <cstdio> #define inf ...

  4. [bzoj1251]序列终结者——splay

    题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

  5. HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  6. SPOJ CNTPRIME 13015 Counting Primes (水题,区间更新,求区间的素数个数)

    题目连接:http://www.spoj.com/problems/CNTPRIME/ #include <iostream> #include <stdio.h> #incl ...

  7. 序列终结者 Splay

    1.注意在 split 和 merge时要特判一下边界, 否则就会出现边界错误的情况. 2.随时都要维护父指针. 3.在更新 maxv 和翻转标记时要判一下左右儿子是否都存在. #include< ...

  8. bzoj1251 序列终结者(splay)

    人生第一发splay,写得巨丑,最后忘记了push_down以后要将子节点maintain 9k代码不忍直视 #define NDEBUG #include<cstdio> #includ ...

  9. splay树 序列终结者

    /* 4655 序列终结者  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 网上有许多题,就是给定一个序 ...

随机推荐

  1. SXOI2018 游记

    noilinux@Capella:~$ cd /Memories/ noilinux@Capella:/Memories$ rm *SXOI* rm:是否删除有写保护的普通文件 "SXOI2 ...

  2. 51nod1450 闯关游戏

    题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 一个游戏App由N个小游戏(关卡)构成,将其标记为0,1,2,..N-1.这些小游戏没有相互制约的性质 ...

  3. 20165230 2017-2018-2 《Java程序设计》第9周学习总结

    20165230 2017-2018-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十二章 java网络编程 学习了用于网络编程的类,了解URL.Socket.InetAdd ...

  4. 20165230 2017-2018-2 《Java程序设计》第6周学习总结

    20165230 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 第八章 常用使用类 String类常用方法 public int length() publ ...

  5. Vagrant 无法校验手动下载的 Homestead Box 版本

    起因 4年前电脑,配置不太好了,现有的 Homestead 运行起来太吃内存.在修改了 Homestead.yaml 文件里 memory 选项的内存配置为 1024 后,应用最新配置重启失败. 索性 ...

  6. 关于oracle数据库死锁的检查方法

    一.数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错. 二.死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做 ...

  7. C# 调用WSDL接口及方法

    1.首先需要清楚WSDL的引用地址 如:http://XX.XX.4.146:8089/axis/services/getfileno?wsdl 上述地址的构造为 类名getfileno. 2.在.N ...

  8. 15 Defer, Panic, and Recover

    Defer, Panic, and Recover 4 August 2010 Go has the usual mechanisms for control flow: if, for, switc ...

  9. python基础-类的其他方法

    一.isinstance(obj,cls)检查是否obj是类的cls对象 # -*- coding:utf-8 -*- __author__ = 'shisanjun' class Foo(objec ...

  10. python中set

    集合update方法:是把要传入的元素拆分,做为个体传入到集合中,例如: >>> a = set('boy') >>> a.update('python') > ...