[bzoj1251]序列终结者_splay
序列终结者 bzoj-1251
题目大意:给定一个长度为n的正整数序列,支持区间加,区间反转,查询区间最大值。所有元素开始都是0.
注释:$1\le n\le 5\cdot 10^4$,操作个数不多于$10^6$。
想法:splay模板题,splay在rotate时注意fa的从属,以及哨兵节点的边界情况。
最后,附上丑陋的代码... ...
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 50050
#define ls ch[p][0]
#define rs ch[p][1]
int n,m;
int ch[N][2],f[N],siz[N],rt;
int turn[N],delat[N],val[N],mx[N];
int get(int x){ return ch[f[x]][1]==x; }
void pushup(int p)
{
if(p)siz[p]=siz[ls]+siz[rs]+1;
mx[p]=max(mx[ls],mx[rs]);
mx[p]=max(mx[p],val[p]);
}
void rotate(int x)
{
int y=f[x],z=f[y],k=get(x);
ch[y][k]=ch[x][k^1];f[ch[y][k]]=y;ch[x][k^1]=y;f[y]=x;f[x]=z;
if(z) ch[z][ch[z][1]==y]=x; pushup(y),pushup(x);
if(rt==y)rt=x;
}
void splay(int x,int y)
{
for(int fa;(fa=f[x])!=y;rotate(x))
if(f[fa]!=y)
rotate((get(x)==get(fa)) ? fa : x);
}
void pushdown(int p)
{
int t=delat[p];
if(t)
{
delat[p]=0;
if(ls)delat[ls]+=t, mx[ls]+=t, val[ls]+=t;
if(rs)delat[rs]+=t, mx[rs]+=t, val[rs]+=t;
}
if(turn[p])
{
turn[p]=0;
swap(ls,rs);
turn[ls]^=1;turn[rs]^=1;
}
//pushup(p);
}
void build(int fa,int l,int r)
{
if(l>r)return;
int mid=l+r>>1;
ch[fa][mid>fa]=mid;
siz[mid]=1;
val[mid]=0;
f[mid]=fa;
build(mid,l,mid-1);
build(mid,mid+1,r);
pushup(mid);
}
int find(int x)
{
int p=rt;
while(1)
{
pushdown(p);
if(x<=siz[ls])p=ls;
else
{
x-=siz[ls]+1;
if(!x)return p;
p=rs;
}
}
}
void reverse(int x,int p)
{
x=find(x);
p=find(p);
//pushup(x);pushup(p);
splay(x,0);
splay(p,rt);
//pushup(x);pushup(p);
turn[ls]^=1;
}
void update(int x,int p,int c)
{
x=find(x);
p=find(p);
splay(x,f[rt]);
splay(p,rt);
delat[ls]+=c;
val[ls]+=c;
mx[ls]+=c;
//pushup(p);
//pushup(x);
}
void querymax(int x,int p)
{
x=find(x);
p=find(p);
splay(x,f[rt]);
splay(p,rt);
printf("%d\n",mx[ls]);
}
int main()
{
scanf("%d%d",&n,&m);
int i,opt,x,y,z;
for(i=0;i<=n+2;i++)mx[i]=-100000000;
build(0,1,n+2);
rt=n+3>>1;
for(i=1;i<=m;i++)
{
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d%d",&x,&y,&z);
if(x>y)swap(x,y);
update(x,y+2,z);
}
else if(opt==2)
{
scanf("%d%d",&x,&y);
if(x>y)swap(x,y);
reverse(x,y+2);
}
else
{
scanf("%d%d",&x,&y);
if(x>y)swap(x,y);
querymax(x,y+2);
}
}
}
小结:这种题面上几乎就写着用平衡树的题,随便怎么样都行了吧qwq。
[bzoj1251]序列终结者_splay的更多相关文章
- [BZOJ1251]序列终结者
[BZOJ1251]序列终结者 试题描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题 ...
- bzoj1251 序列终结者(Splay Tree+懒惰标记)
Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...
- BZOJ1251序列终结者——非旋转treap
题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...
- [bzoj1251]序列终结者——splay
题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...
- BZOJ1251 序列终结者(Splay平衡树)(占位)
网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量…… ...
- BZOJ1251——序列终结者
给你一个数列,让你实现区间加上一个值,区间翻转,区间最大值 裸splay,懒标记一发即可 #include <cstdio> #include <cstdlib> #inclu ...
- bzoj1251 序列终结者(splay)
人生第一发splay,写得巨丑,最后忘记了push_down以后要将子节点maintain 9k代码不忍直视 #define NDEBUG #include<cstdio> #includ ...
- 题解【bzoj1251 序列终结者】
Description 维护三个操作:区间加,区间翻转,区间求最大值.\(n \leq 50000\) Solution fhqtreap大法好! 模板题(我是不会告诉你这篇题解是用来存个代码的 Co ...
- bzoj1251: 序列终结者 fhqtreap写法
fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...
随机推荐
- PCB 规则引擎之脚本语言JavaScript应用评测
世界上没有好做的软件,觉得好做,只是你的系统简单而已,而不是哪个行业简单,特别像我们PCB制造企业务逻辑的很复杂的,仅仅靠决策树中的每个节点布置决策逻辑是不能满足要求的,所以我们在制作PCB规则引擎必 ...
- linux修改yum源
在自己安装的CentOS6.5中使用yum安装软件,总是提示404错误信息,百度后发现原来要设置yum源. 在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度.国 ...
- 根据JSON创建对应的HIVE表
本文提供一种用SCALA把JSON串转换为HIVE表的方法,由于比较简单,只贴代码,不做解释.有问题可以留言探讨 package com.gabry.hiveimport org.json4s._im ...
- PHP入门开发
1.下载开发工具phpstorm 地址:http://www.jetbrains.com/phpstorm/download/download-thanks.html?platform=windows ...
- BZOJ 3779 LCT 线段树 DFS序 坑
hhhh抄了半天lty代码最后T了 对拍也没事.. 药丸 mine #pragma GCC optimize("O3") //By SiriusRen #include < ...
- 【LeetCode】-- 73. Set Matrix Zeroes
问题描述:将二维数组中值为0的元素,所在行或者列全set为0:https://leetcode.com/problems/set-matrix-zeroes/ 问题分析:题中要求用 constant ...
- Elasticsearch之CURL命令的version控制
普通关系型数据库使用的是(悲观并发控制(PCC)) 当我们在修改一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据 ES使用的是(乐观并发控制(OCC)) ES不会阻止某一数据 ...
- scala的枚举
package com.test.scala.test /** * 枚举 */ object Enum extends Enumeration { val Red,Yellow,Green=Value ...
- Algebrizer
Microsoft SQL Server 2012 Internals 把 SQL 语句的处理分为四个阶段,分别是 解析.绑定.优化.执行,如图所示: 解析(Parse)主要是语法分析,比较简 ...
- Laravel5.1学习笔记19 EloquentORM 入门
Eloquent:入门 简介 定义模型(model) Eloquent 模型规范 取出多个模型 取出单个模型 / 集合 取出集合 插入更新模型 基本插入 基本更新 大批量赋值 删除模型 软删除 查询 ...