[COGS 347]地震
时间限制:4 s 内存限制:128 MB
问题描述
某国地形狭长,中部有一列山脉,由于多发地震,山脉在不断变化中。地震发生时,山脉有可能发生如下变化:局部海拔升高或降低,板块运动产生地裂而出现一段新的山脉,或板块挤压迫使一段山脉消失。
该国的科学考察队已经预测出了近期内将要发生的一次地震的全过程,他们得到的山脉变化的信息数据格式如下。
R a b c
a,b,c为三个整数,表示[a,b]这段山脉的海拔升高了c(或降低了-c)。
I a k t1 t2 ... tk
a,k,t1,t2,...,tk为整数,在第a个位置之后出现了一段新的山脉,长度为k,各处海拔依次为t1,t2,...,tk。
M a b
a,b为两个整数,表示[a,b]这段山脉消失,后面的山脉会移动过来。
查询请求格式为
Q a b
a,b为两个整数,查询[a,b]这段山脉的最高峰的海拔。
现在他们想知道这次地震中任意时刻任意一段山脉的最高峰的海拔,请你设计程序帮助他们。
输入格式
第一行,两个整数N,Q,表示地震前山脉的长度为N,地震中有Q个事件。
第二行,N个整数,表示初始时山脉各处的海拔。 接下来Q行,每行为一个山脉变化信息或查询请求,格式如上。
输出格式
对于每一个查询请求,输出一行,为该查询请求的结果。
样例输入
10 7
1 3 4 6 3 5 9 1 4 5
R 1 4 2
Q 3 7
I 1 2 2 3
M 6 9
Q 2 5
R 1 6 -4
Q 1 3
样例输出
9
6
-1
样例说明
初始时刻,山脉各处海拔为
1 3 4 6 3 5 9 1 4 5
经过 R 1 4 2,山脉各处海拔为
3 5 6 8 3 5 9 1 4 5
查询Q 3 7,结果为9
I 1 2 2 3,在1第个位置后插入了长度为2的山脉2 3,之后山脉各处海拔为
3 2 3 5 6 8 3 5 9 1 4 5
M 6 9后,山脉各处海拔为
3 2 3 5 6 1 4 5
查询Q 2 5,结果为6
经过 R 1 6 -4,山脉各处海拔为
-1 -2 -1 1 2 -3 4 5
查询Q 1 3,结果为-1
数据规模
- 对于40%的数据,Q<=10000。
- 对于70%的数据,1<=Q<=100000。
- 对于100%的数据,1<=Q<=300000。
在任何时刻,山脉的长度在[1,100000]之内,山脉各处海拔在[-2^31,2^31]之内。初始山脉长度连同插入的山脉的总长度不超过1000000。在所有请求中,插入山脉(I)、压入地下(M)、查询(Q)、升降(R)、的比例约为2:3:3:4。
题解
fhq_treap,调了蛮久,最后的总结就是如果左右儿子都为空,那么不要对它push_down,因为这样会使编号为0的点被赋值。
然后空节点的最大值要赋值为-inf。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<queue>
#define inf (2147483647)
#define ll(x) tre[x].child[0]
#define rr(x) tre[x].child[1]
#define son(x,t) tre[x].child[t]
using namespace std;
int n,m,cnt,d[],root;
int gi(){
int ans=,f=;char i=getchar();
while(i<''||i>''){if(i=='-')f=-;i=getchar();}
while(i>=''&&i<=''){ans=ans*+i-'';i=getchar();}
return ans*f;
}
struct Treap{
int child[],x,mmax,lazy,size;
}tre[];
queue<int>mem;
void add_lazy(int root,int c){
tre[root].mmax+=c;
tre[root].x+=c;
tre[root].lazy+=c;
}
void push_up(int root){
int l=ll(root),r=rr(root);
tre[root].mmax=max(tre[root].x,max(tre[l].mmax,tre[r].mmax));
tre[root].size=tre[l].size+tre[r].size+;
}
void push_down(int root){
if(!tre[root].lazy)return;
if(ll(root))add_lazy(ll(root),tre[root].lazy);
if(rr(root))add_lazy(rr(root),tre[root].lazy);
tre[root].lazy=;
}
int newnode(int x){
int pos;
if(!mem.empty())pos=mem.front(),mem.pop();
else pos=++cnt;
tre[pos].mmax=tre[pos].x=x;
tre[pos].lazy=;
tre[pos].child[]=tre[pos].child[]=;
tre[pos].size=;
return pos;
}
void build(int &root,int left,int right){
int mid=(left+right)>>;
root=newnode(d[mid]);
if(left<mid)build(ll(root),left,mid-);
if(mid<right)build(rr(root),mid+,right);
push_up(root);
}
void split(int now,int k,int &x,int &y){
if(!now)x=y=;
else{
push_down(now);
if(tre[ll(now)].size+<=k){
x=now;
split(rr(now),k-tre[ll(now)].size-,rr(now),y);
push_up(x);
}
else{
y=now;
split(ll(now),k,x,ll(now));
push_up(y);
}
}
}
int merge(int x,int y){
if(!x||!y)return x+y;
if(rand()&){
push_down(x);
rr(x)=merge(rr(x),y);
push_up(x);
return x;
}
else{
push_down(y);
ll(y)=merge(x,ll(y));
push_up(y);
return y;
}
}
void delet(int root){
if(root){
mem.push(root);
delet(ll(root));
delet(rr(root));
}
}
int find(int root,int k){
int y=tre[ll(root)].size;
if(y+==k)return root;
else if(y>=k)return find(ll(root),k);
else return find(rr(root),k-y-);
}
int main(){
freopen("equake.in","r",stdin);
freopen("equake.out","w",stdout);
srand(time());
int i,j,x,y,z,rt;
n=gi();m=gi();
for(i=;i<=n;i++)
d[i]=gi();
build(root,,n);
tre[].mmax=-inf;
tre[].x=-inf;
while(m--){
char s[];
int a,b,c;
scanf("%s",s);a=gi();b=gi();
if(s[]=='R'){
scanf("%d",&c);
split(root,b,x,z);
split(x,a-,x,y);
add_lazy(y,c);
root=merge(merge(x,y),z);
}
if(s[]=='I'){
split(root,a,x,y);
for(i=;i<=b;i++)
d[i]=gi();
build(rt,,b);
root=merge(merge(x,rt),y);
}
if(s[]=='M'){
split(root,b,x,z);
split(x,a-,x,y);
delet(y);
root=merge(x,z);
}
if(s[]=='Q'){
split(root,b,x,z);
split(x,a-,x,y);
printf("%d\n",tre[y].mmax);
root=merge(merge(x,y),z);
}
}
return ;
}
[COGS 347]地震的更多相关文章
- [cogs347]地震
COGS:地震(平衡树) COGS上一道题...文件名是equake 还是又打了一遍板子... 加个lazy标记就行了... 注意查询时先下传标记(lazy) // It is made by XZZ ...
- fhq_treap 总结
今天跟着zcg大神学了一发fhq_treap 发现在维护区间问题上fhq_treap不仅思维量小,而且代码量更小 是Splay的不错的替代品,不过至今还是有一些问题不能很好的解决 譬如查询某个数在序列 ...
- SACS +Petrel 2009地震
Bentley SACS V8i SS4 05.07.01.01 海洋平台分析Schlumberger Petrel 2009地震解释油藏模拟课程 Trimble Tekla Structural D ...
- HDU2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活[多重背包]
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- 【COGS 254】【POI 2001】交通网络图
http://www.cogs.top/cogs/problem/problem.php?pid=254 dist[i]表示能最早到达i点的时间.这样就可以用最短路模型来转移了. #include&l ...
- 【COGS】894. 追查坏牛奶
http://cojs.tk/cogs/problem/problem.php?pid=894 题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割.(n<=32, m<=1 ...
- 多重背包问题:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(HDU 2191)(二进制优化)
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 HDU 2191 一道裸的多重背包问题: #include<iostream> #include<algorithm> #i ...
- hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- 【COGS】147. [USACO Jan08] 架设电话线(二分+spfa)
http://cojs.tk/cogs/problem/problem.php?pid=147 学到新姿势了orz 这题求的是一条1-n的路径的最大路径最小. 当然是在k以外的. 我们可以转换一下. ...
随机推荐
- Python函数(十二)-迭代器
字符串,列表,元组,字典,集合,生成器这些能通过for循环来遍历的数据类型都是可迭代对象 可通过isinstance判断是不是可迭代对象 >>> from collections i ...
- RAC环境下ORACLE序列缓存导致序列混乱
目前项目中发现了这样一个问题,在数据库部署了RAC环境之后,偶尔会出现从Oracle Sequence所取出来的数是混乱的,比如第二次比第一次所取的数要小.这样当程序的逻辑依赖于ID的大小来排序时,就 ...
- C#自定义控件 绘制框
上几张测试的 效果 虽然全是用.net 的绘图库画的,但是手动双缓冲,不会闪烁,感觉还不错,源码开放了,喜欢的拿去扩展吧; 用于撤销的存放图像的数据结构我设置为10个,怕是内存崩了,我看mspaint ...
- HTML input 标签不可编辑的 readonly 属性
1 <form action="form_action.asp" method="get"> Name:<input type="t ...
- C/C++常用数学函数
math.h/cmath(C++)数学函数库 1 三角函数 double sin (double); double cos (double); double tan (double) ...
- centos7安装与配置ansible
此次测试总共有三台机,分别如下: ansible服务器:10.0.0.20 client01:10.0.0.21 client02:10.0.0.22 一.安装ansible 1. python版本需 ...
- error C2144: 语法错误:“int”的前面应有“;”
error C2144: 语法错误:"int"的前面应有";" C++- error C2144 syntax error : 'int' should be ...
- 23. Bypass ngx_lua_waf SQL注入防御(多姿势)
0x00 前言 ngx_lua_waf是一款基于ngx_lua的web应用防火墙,使用简单,高性能.轻量级.默认防御规则在wafconf目录中,摘录几条核心的SQL注入防御规则: select.+(f ...
- Git fatal:$'GIT_DIR' too big
这句表示的是创建的文件的名称太长了,将你需要放置的代码的文件名字改短一些即可!
- 用Python解析XMind
本文来自网易云社区 作者:孙圣翔 转自:http://shengxiang.me/article/35/python-parse-xmind.html XMind是画思维脑图很好的工具,正好组里有个需 ...