一道模板题,一直没发现自己的快速读入读不了负数,我竟然能活到现在真是万幸。

 #include <iostream>
#include <cstdio>
#define inf -0x7fffffff
#define N 50010
using namespace std;
struct SplayNode
{
SplayNode();
SplayNode *fa,*ch[];
//SplayNode(int x);
int data,maxn,size,add;
bool rev;
void push();
bool chr() {return this==fa->ch[];}
void updata()
{
size=ch[]->size+ch[]->size+;
maxn=max(max(ch[]->maxn,ch[]->maxn),data);
}
void setc(SplayNode *x,int t) {this->ch[t]=x; x->fa=this;}
}*null;
SplayNode::SplayNode() {fa=ch[]=ch[]=null; rev=;data=add=size=; maxn=inf;}
void SplayNode::push()
{
if (rev)
{
if (ch[]!=null) ch[]->rev^=;
if (ch[]!=null) ch[]->rev^=;
swap(ch[],ch[]);
rev=;
}
if (add!=)
{
if (ch[]!=null)
{
ch[]->add+=add;
ch[]->maxn+=add;
ch[]->data+=add;
}
if (ch[]!=null)
{
ch[]->add+=add;
ch[]->maxn+=add;
ch[]->data+=add;
}
add=;
}
}
int n,m;
//inline int read() {int ans=0; char c; while ((c=getchar())=='\r' || c=='\n' || c==' '); ans=c-'0'; while (isdigit(c=getchar())) ans=ans*10+c-'0'; return ans;}
namespace Splay
{
SplayNode *Root;
SplayNode pool[N];
int poolnum=;
SplayNode *NewNode()
{
poolnum++;
pool[poolnum]=SplayNode();
return &pool[poolnum];
}
SplayNode *BuildTree(int l,int r)
{
if (l>r) return null;
SplayNode *re=NewNode();
int mid=(l+r)>>;
re->data=;
re->ch[]=BuildTree(l,mid-);
re->ch[]=BuildTree(mid+,r);
re->ch[]->fa=re;
re->ch[]->fa=re;
re->updata();
return re;
}
void rotate(SplayNode *x)
{
SplayNode *r=x->fa;
if (x==null || r==null) return;
int t=x->chr();
x->push(); r->push();
if (r->fa==null) x->fa=r->fa,Root=x;
else r->fa->setc(x,r->chr());
r->setc(x->ch[t^],t);
x->setc(r,!t);
r->updata();
x->updata();
}
void splay(SplayNode *x,SplayNode *y)
{
for (;x->fa!=y;rotate(x))
if (x->fa->fa!=y)
if (x->chr()==x->fa->chr()) rotate(x->fa);
else rotate(x);
}
SplayNode *Kth(int k)
{
SplayNode *r=Root;
while (r!=null)
{
r->push();
if (k<=r->ch[]->size) r=r->ch[];
else if (k==r->ch[]->size+) return r;
else
{
k-=r->ch[]->size+;
r=r->ch[];
}
}
return null;
}
void reverse(int l,int r)
{
SplayNode *p=Kth(l);
SplayNode *s=Kth(r+);
p->push();
splay(p,null);
s->push();
splay(s,p);
s->ch[]->rev^=;
}
void Add(int l,int r,int v)
{
SplayNode *p=Kth(l);
SplayNode *s=Kth(r+);
p->push();
splay(p,null);
s->push();
splay(s,p);
s->ch[]->add+=v;
s->ch[]->data+=v;
s->ch[]->maxn+=v;
}
void query(int l,int r)
{
SplayNode *p=Kth(l);
SplayNode *s=Kth(r+);
p->push();
splay(p,null);
s->push();
splay(s,p);
printf("%d\n",s->ch[]->maxn);
}
}
void init() {null=Splay::NewNode(); *null=SplayNode(); Splay::Root=Splay::BuildTree(,n+);}
int main()
{
scanf("%d%d",&n,&m);
init();
//for (int i=1;i<=n;i++) a[i]=read();
//Splay::BuildTree(1,n);
for (int i=;i<=m;i++)
{
int temp,x,y;
scanf("%d%d%d",&temp,&x,&y);
//temp=read(); x=read(); y=read();
if (temp==)
{
int v;
scanf("%d",&v);
Splay::Add(x,y,v);
}
if (temp==) Splay::reverse(x,y);
if (temp==) Splay::query(x,y);
}
return ;
}

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。

HINT

 

Source

 

【BZOJ1251】序列终结者 Splay的更多相关文章

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

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

  2. bzoj1251 序列终结者(splay)

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

  3. [BZOJ1251]序列终结者

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

  4. bzoj1251 序列终结者(Splay Tree+懒惰标记)

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

  5. BZOJ1251 序列终结者(Splay平衡树)(占位)

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

  6. [bzoj1251]序列终结者_splay

    序列终结者 bzoj-1251 题目大意:给定一个长度为n的正整数序列,支持区间加,区间反转,查询区间最大值.所有元素开始都是0. 注释:$1\le n\le 5\cdot 10^4$,操作个数不多于 ...

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

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

  8. CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)

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

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

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

随机推荐

  1. ecshop 多表删除

    $sql = 'DELETE O, G FROM ' . $GLOBALS['ecs']->table('delivery_order') . ' AS O, ' . $GLOBALS['ecs ...

  2. asp.net中套用母版页之后的findcontrol

    套用模板页之后,如果要在内容页中查找某个控件,需要先找到模板页中的ContentPlaceHolder,在通过ContentPlaceHolder查找代码,如下: LinkButton btn = t ...

  3. visio二次开发——图纸解析

    (转发请注明来源:http://www.cnblogs.com/EminemJK/) visio二次开发的案例或者教程,国内真的非常少,这个项目也是花了不少时间来研究visio的相关知识,困难之所以难 ...

  4. 开放数据库互联ODBC配置(odbcconf)

    开放数据库互连(ODBC)是微软引进的一种早期数据库接口技术,通过ODBC驱动程序可访问数据库数据:使用ODBC管理器可以完成对数据库的链接操作.笔者利用ODBC接口,将WINDOWS计数器信息写入到 ...

  5. CSS gradient渐变之webkit核心浏览器下的使用

    一.关于渐变 渐变是一种应用于平面的视觉效果,可以从一种颜色逐渐地转变成另外一种颜色,故可以创建类似于彩虹的效果渐变可以应用在任何可以使用图片的地方.例如,您可以指定一个这么一个渐变:顶部的颜色是红色 ...

  6. (转载)robots.txt写法大全和robots.txt语法的作用

    1如果允许所有搜索引擎访问网站的所有部分的话 我们可以建立一个空白的文本文档,命名为robots.txt放在网站的根目录下即可.robots.txt写法如下:User-agent: *Disallow ...

  7. 听说你们要开始学C了

    同学们好: 先自我介绍一下,我是你们的助教吴喆(厚颜无耻地要求大家叫我吉吉老师:-D),本科学的电子,所以陆陆续续接触了不少C/C++的工作,曾经被编码折磨得死去活来,如今却对其念念不舍,颇有点“斯德 ...

  8. 十二. 一步步破解JEB 2.0demo版二

    编写脚本批量还愿JEB 加密字符串 解密完后效果如下: 脚本源码: https://github.com/bingghost/JebPlugins 思路: 下面的该封装的基本都封装了,过程如下: 1. ...

  9. Burpsuite+sqlmap批量扫描sql漏洞

    1.burpsuite设置导出log n'd'k 输入文件名保存 2.sqlmap批量扫描     python sqlmap.py -l 文件名 --batch -smart     batch:自 ...

  10. java8

    1:Scanner的使用(了解) (1)在JDK5以后出现的用于键盘录入数据的类. (2)构造方法: A:讲解了System.in这个东西. 它其实是标准的输入流,对应于键盘录入 B:构造方法 Inp ...