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

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

Sample Output

2
【数据范围】
N<=50000,M<=100000。
/*
学习了一下splay关于区间的操作
对于一个区间操作,我们要将树上的权值设为原序列的编号,当询问x-y时,把x-1转到树根,y+1转到x-1的右孩子,
这样一来,x-y就是x-1的左子树。
需要注意的是,可能会有1-n的询问,所以需要加两个“哨兵”。
*/
#include<cstdio>
#include<iostream>
#define N 50010
#define inf 1000000000
using namespace std;
int tr[N][],size[N],w[N],fa[N],n,m,rt;
int tag[N],rev[N],mx[N],id[N];
void up_data(int x){
int l=tr[x][],r=tr[x][];
size[x]=size[l]+size[r]+;
mx[x]=max(max(mx[l],mx[r]),w[x]);
} void push_down(int x){
int l=tr[x][],r=tr[x][];
if(tag[x]){
if(l) tag[l]+=tag[x],mx[l]+=tag[x],w[l]+=tag[x];
if(r) tag[r]+=tag[x],mx[r]+=tag[x],w[r]+=tag[x];
tag[x]=;
}
if(rev[x]){
rev[l]^=;rev[r]^=;
rev[x]=;
swap(tr[x][],tr[x][]);
}
} void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if(tr[y][]==x) l=;else l=;r=l^;
if(y==k) k=x;
else {
if(tr[z][]==y) tr[z][]=x;
else tr[z][]=x;
}
fa[x]=z;fa[y]=x;fa[tr[x][r]]=y;
tr[y][l]=tr[x][r];tr[x][r]=y;
up_data(y);up_data(x);
} void splay(int x,int &k){
while(x!=k){
int y=fa[x],z=fa[y];
if(y!=k){
if(tr[y][]==x^tr[z][]==y) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
} int find(int &k,int rk){
push_down(k);
int l=tr[k][],r=tr[k][];
if(size[l]+==rk) return k;
if(size[l]>=rk) return find(l,rk);
return find(r,rk-size[l]-);
} void build(int l,int r,int f){
if(l>r)return;
int mid=(l+r)>>,now=id[mid],last=id[f];
if(l==r){
size[l]=;fa[l]=last;
tag[l]=rev[l]=;
if(l<f) tr[last][]=now;
else tr[last][]=now;
return;
}
build(l,mid-,mid);build(mid+,r,mid);
fa[now]=last;up_data(now);
if(now<last) tr[last][]=now;
else tr[last][]=now;
} void add(int l,int r,int v){
int x=find(rt,l),y=find(rt,r+);
splay(x,rt);splay(y,tr[x][]);
int z=tr[y][];
tag[z]+=v;mx[z]+=v;w[z]+=v;
} void rever(int l,int r){
int x=find(rt,l),y=find(rt,r+);
splay(x,rt);splay(y,tr[x][]);
int z=tr[y][];
rev[z]^=;
} int solvemx(int l,int r){
int x=find(rt,l),y=find(rt,r+);
splay(x,rt);splay(y,tr[x][]);
int z=tr[y][];
return mx[z];
} int main(){
scanf("%d%d",&n,&m);
mx[]=-inf;
for(int i=;i<=n+;i++) id[i]=i;
build(,n+,);rt=(n+)>>;
while(m--){
int opt,x,y,v;
scanf("%d%d%d",&opt,&x,&y);
if(opt==){scanf("%d",&v);add(x,y,v);}
if(opt==) rever(x,y);
if(opt==) printf("%d\n",solvemx(x,y));
}
return ;
}

序列终结者(bzoj 1521)的更多相关文章

  1. 序列终结者 BZOJ 1251 Splay

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

  2. BZOJ 1251 序列终结者(Splay)

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

  3. 【BZOJ】【1251】序列终结者

    Splay 还是splay序列维护,这题我WA了的原因是:在Push_up的时候,当前子树的max我是直接取的L.R和v[x]的最大值,但是如果没有左/右儿子,默认是会访问0号结点的mx值,而这个值没 ...

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

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

  5. BZOJ 1251: 序列终结者

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 3773  Solved: 1579 [Submit][Status][Dis ...

  6. 【BZOJ】1251: 序列终结者(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint.. ...

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

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

  8. 【bzoj1251】序列终结者(伸展树)

    [bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...

  9. [BZOJ1251]序列终结者

    [BZOJ1251]序列终结者 试题描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题 ...

随机推荐

  1. jmeter(十二)处理Cookie与Session

    JMeter的工作原理是: JMeter可以作为Web服务器与浏览器之间的代理网关,以便捕获浏览器的请求和Web服务器的响应,这样就很容易地生成性能测试脚本, 有了性能测试脚本,JMeter就可以通过 ...

  2. 事件模型的介绍与Button的ActionListener

    事件监听: 这是个很重要的概念,也是个很重要的模型,vb,vc都是这样用,甚至后面学的web框架也在用.    现在我们可以做很多按钮了吧,但是我们的按钮按它是没反应的,现在我们来看看怎么样才能让它有 ...

  3. [转]mysql事务处理用法与实例详解

    转自:http://www.cnblogs.com/ymy124/p/3718439.html MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于 ...

  4. CentOS系统里如何正确取消或者延长屏幕保护自动锁屏功能(图文详解)

    不多说,直接上干货! 对于我这里想说的是,分别从CentOS6.X  和  CentOS7.X来谈及. 1. 问题:默认启动屏幕保护 问题描述: CentOS系统在用户闲置一段时间(默认为5分钟)后, ...

  5. Hibernate配置(通过注解配置)

    本文主要讲通过注解配置来替换Hibernate的映射文件 1.多对一配置 package com.jazz7.entity; import java.util.Date; import javax.p ...

  6. AJPFX关于构造器的总结

    构造器        构造器定义        构造器作用        构造器特点        构造器修饰符        默认构造器        构造器重载        构造器和一般函数的区 ...

  7. 从java toBinaryString() 看计算机数值存储方式(原码、反码、补码)

    一.toBinaryString 方法及其含义 1.1 方法说明 该方法位于java.lang.Integer类中 方法签名:public static String toBinaryString(i ...

  8. hihocoder编程练习赛52-2 亮灯方案

    思路: 状态压缩dp.实现: #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ] = {, , ...

  9. ScrollView嵌套GridView,GridView显示不全

    最近开发有个需求是以A-Z的方式区分全国城市(搜索功能),并实现字母索引的功能(有点类似微信,不过比较坑的是用的是GridView, 并且GridView上面还有几个LinearLayout). 详细 ...

  10. Apache Tomcat 之路(三 部署多个应用)

    想要在一台服务器上部署多个web应用的时候有两种部署方式:1.拷贝多个tomcat 服务器,每个服务器启动不同的web应用;2.一个tomcat容器部署多个web应用 两种方式的优缺点:多个tomca ...