[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> ...
随机推荐
- 【转载】[Oracle] Linux下手动创建数据库过程
今天发现一个Oracle测试库的字符集设置不正确,原本的字符集是UTF-8,正确的字符集应该是ZHS16GBK,因为UTF-8是ZHS16GBK的超集,无法修改,只能重建数据库,幸好该测试库上还没有数 ...
- FTP FtpWebRequest 异步上传文件
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- [App Store Connect帮助]二、 添加、编辑和删除用户(6)生成 API 密钥
如果已批准您访问 App Store Connect API,您可以生成 API 密钥,以便使用该密钥配置.认证和使用 App Store Connect 服务. 有关管理和保护您密钥的更多信息,请参 ...
- [Swift通天遁地]八、媒体与动画-(15)使用TextKit实现精美的图文混排效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [转]Linux下paste命令详解
转自:http://blog.csdn.net/andy572633/article/details/7214126 paste单词意思是粘贴.该命令主要用来将多个文件的内容合并,与cut命令完成的功 ...
- DataFrame编程模型初谈与Spark SQL
Spark SQL在Spark内核基础上提供了对结构化数据的处理,在Spark1.3版本中,Spark SQL不仅可以作为分布式的SQL查询引擎,还引入了新的DataFrame编程模型. 在Spark ...
- PHP 在线 编辑 解析
http://www.w3schools.com/php/default.asp http://www.w3schools.com/php/showphp.asp?filename=demo_s ...
- cms中某些标题链接的单独写法
href="{$CATEGORYS[45][url]}" 链接写法, {$CATEGORYS[45][catname]} 标题写法 在show页面中 src="{$thu ...
- 如何快速获取yun2win app key?
注册yun2win开发者账号 1.在注册页面输入您的邮箱,点击下方发送,yun2win将会发送一封验证邮件到您的邮箱: 2.如果没有收到邮件请查看垃圾箱或者点击重新发送: 3.打开邮箱查看验证邮件,点 ...
- mysql自动增长的有关问题,怎么恢复从1开始
mysql自动增长的问题,如何恢复从1开始在一个表中我设置到autoid为自动增长列例如有如下数据 1 张三 男 202 王五 男 223 李四 男 254 陈大 男 19 现在我把 autoid=3 ...