splay树 序列终结者
/*
网上有许多题,就是给定一个序列,要你支持几种操作: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。
第一行两个整数N,M。M为操作个数。 以下M行,每行最多四个整数,依次为K,L,R,V。K表示是第几种操作,如果不是第1种操作则K后面只有两个数。
对于每个第3种操作,给出正确的回答。*/
//splay树 第一次知道spaly树还可以这么玩,好开心。。。
//不过因为一个小错误调了半天。
#include<cstdio>
#include<iostream>
using namespace std;
int n,v[50005],shu[50005][2],fa[50005],m,size,sz[50005],mx[50005],root;
int he[50005],bi[50005];
void geng(int a1)
{
sz[a1]=sz[shu[a1][0]]+sz[shu[a1][1]]+1;
mx[a1]=max(mx[shu[a1][0]],mx[shu[a1][1]]);
mx[a1]=max(mx[a1],v[a1]);
return;
}
void roate(int a1,int &k)
{
int y=fa[a1],z=fa[y],l,r;
if(shu[y][0]==a1)
l=0;
else
l=1;
r=l^1;
if(y==k)
k=a1;
else
if(shu[z][0]==y)
shu[z][0]=a1;
else
shu[z][1]=a1;
fa[a1]=z;
shu[y][l]=shu[a1][r];
fa[shu[a1][r]]=y;
shu[a1][r]=y;
fa[y]=a1;
geng(a1);
geng(y);
return;
}
void splay(int &k,int a1)
{
for(;a1!=k;)
{
int y=fa[a1],z=fa[y];
if(y!=k)
if(shu[z][0]==y^shu[y][0]==a1)
roate(a1,k);
else
roate(y,k);
roate(a1,k);
}
}
void geng1(int a1)
{
int l=shu[a1][0],r=shu[a1][1];
if(he[a1])
{
if(l){mx[l]+=he[a1];v[l]+=he[a1];he[l]+=he[a1];}
if(r){mx[r]+=he[a1];v[r]+=he[a1];he[r]+=he[a1];}
he[a1]=0;
}
if(bi[a1])
{
bi[l]^=1;
bi[r]^=1;
bi[a1]=0;
swap(shu[a1][0],shu[a1][1]);
}
}
void jian(int a1,int a2,int a3)
{
if(a1>a2)
return;
if(a1==a2)
{
fa[a1]=a3;
if(a1<a3)
shu[a3][0]=a1;
else
shu[a3][1]=a1;
sz[a1]=1;
return;
}
int mid=(a1+a2)>>1;
fa[mid]=a3;
if(mid<a3)
shu[a3][0]=mid;
else
shu[a3][1]=mid;
jian(a1,mid-1,mid);
jian(mid+1,a2,mid);
geng(mid);
}
int find(int a1,int a2)
{
if(he[a1]||bi[a1])geng1(a1);
if(sz[shu[a1][0]]==a2-1)
return a1;
if(sz[shu[a1][0]]>=a2)
return(find(shu[a1][0],a2));
return(find(shu[a1][1],a2-sz[shu[a1][0]]-1));
}
void jia(int a1,int a2,int a3)
{
int x=find(root,a1);
int y=find(root,a2+2);
splay(root,x);
splay(shu[x][1],y);
int z=shu[y][0];
v[z]+=a3;
mx[z]+=a3;
he[z]+=a3;
return;
}
void fan(int a1,int a2)
{
int x=find(root,a1),y=find(root,a2+2);
splay(root,x);
splay(shu[x][1],y);
int z=shu[y][0];
bi[z]^=1;
return;
}
int zhao(int a1,int a2)
{
int x=find(root,a1),y=find(root,a2+2);
splay(root,x);
splay(shu[x][1],y);
int z=shu[y][0];
return mx[z];
}
int main()
{
mx[0]=-999999999;
scanf("%d%d",&n,&m);
jian(1,n+2,0);
root=(n+3)>>1;
for(int i=0;i<m;i++)
{
int a1,a2,a3,a4;
scanf("%d%d%d",&a1,&a2,&a3);
if(a1==1)
{
scanf("%d",&a4);
jia(a2,a3,a4);
}
if(a1==2)
fan(a2,a3);
if(a1==3)
printf("%d\n",zhao(a2,a3));
}
}
splay树 序列终结者的更多相关文章
- Splay模板(序列终结者)
我只是一个存模板的,详细的请看这里http://blog.csdn.net/whai362/article/details/47298133 题目链接:http://www.codevs.cn/pro ...
- BZOJ 1251 序列终结者(Splay)
题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术 ...
- 【bzoj1251】序列终结者(伸展树)
[bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...
- BZOJ 1251: 序列终结者 [splay]
1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3778 Solved: 1583[Submit][Status][Discu ...
- 【BZOJ1251】序列终结者 Splay
一道模板题,一直没发现自己的快速读入读不了负数,我竟然能活到现在真是万幸. #include <iostream> #include <cstdio> #define inf ...
- 【BZOJ】1251: 序列终结者(splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint.. ...
- bzoj1251 序列终结者(Splay Tree+懒惰标记)
Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...
- 「BZOJ1251」序列终结者 (splay 区间操作)
题面: 1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 5367 Solved: 2323[Submit][Status][D ...
- 1251. 序列终结者【平衡树-splay】
Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...
随机推荐
- 简单理解JavaScript原型链
简单理解原型链 什么是原型 ? 我是这样理解的:每一个JavaScript对象在创建的时候就会与之关联另外一个特殊的对象,这个对象就是我们常说的原型对象,每一个对象都会从原型"继承" ...
- MySQL绿色版mysql-5.7.17-winx64简洁安装教程
1.解压MySQL绿色版,复制my-default.ini,修改名称为my.ini 2. 以下为my.ini文件 # For advice on how to change settings plea ...
- WPF不同方式快捷键判断
private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { //单个按键e.Key方式判断 if (e.Key == Key ...
- Git撤回已经推送(push)至远程仓库提交(commit)的版本
背景 所以,经常会遇到已经提交远程仓库,但是又不是我想要的版本,要撤下来. 回退版本一般使用git reset,又分为: # 不删除工作空间改动代码,撤销commit,不撤销git add . git ...
- 计算机等级考试【二级C语言程序设计】知识点整理
*免责声明:本文章中所收集或者引用到的内容的所有版权均为引用内容的原作者所有,本站仅作收集并整理,不承担任何法律责任! *题库收集来源于:[未来教育考试软件2017年版 - 计算机二级 - C语言程序 ...
- zabbix推送内存监控单应用shell
利用top方式获取指定第三方的内存使用率 #!/bin/bash process=$1 if [ ! -z $process ];then cd /zabbix/zabbix-agent/script ...
- Linux下安装php 扩展fileinfo
在项目初始部署环境的时候,可能考虑的并不全面,就会少装一些扩展,这里讲解如何添加fileinfo扩展 1.找到php安装的压缩包 2.将压缩包cp到 /data目录下,并解压 cp php-7.0.3 ...
- MySQL常见interview
mysql支持的存储引擎,以及各自区别 常用的有myisam,innodb,bdb myisam是mysql默认存储引擎:不支持事务和外键,访问速度快,对事物完整性没有要求或者以select.inse ...
- 【DRF框架】restfull规范
零:核心思想: 1.面对资源编程 2.根据HTTP请求方式的不同对资源进行不同的操作 一.协议 API与用户的通信协议,总是使用HTTPs协议. 二.域名 应该尽量将API部署在专用域名之下. htt ...
- Bash基础——内置命令
前言 Shell有很多内置在其源代码中的命令.由于命令是内置的,所以Shell不必到磁盘上搜索它们.内置命令执行速度更快,不同的Shell内置命令有所不同. 如何查找内置命令 之前查了好久怎么收索内置 ...