时间限制: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]地震的更多相关文章

  1. [cogs347]地震

    COGS:地震(平衡树) COGS上一道题...文件名是equake 还是又打了一遍板子... 加个lazy标记就行了... 注意查询时先下传标记(lazy) // It is made by XZZ ...

  2. fhq_treap 总结

    今天跟着zcg大神学了一发fhq_treap 发现在维护区间问题上fhq_treap不仅思维量小,而且代码量更小 是Splay的不错的替代品,不过至今还是有一些问题不能很好的解决 譬如查询某个数在序列 ...

  3. SACS +Petrel 2009地震

    Bentley SACS V8i SS4 05.07.01.01 海洋平台分析Schlumberger Petrel 2009地震解释油藏模拟课程 Trimble Tekla Structural D ...

  4. HDU2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活[多重背包]

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  5. 【COGS 254】【POI 2001】交通网络图

    http://www.cogs.top/cogs/problem/problem.php?pid=254 dist[i]表示能最早到达i点的时间.这样就可以用最短路模型来转移了. #include&l ...

  6. 【COGS】894. 追查坏牛奶

    http://cojs.tk/cogs/problem/problem.php?pid=894 题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割.(n<=32, m<=1 ...

  7. 多重背包问题:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(HDU 2191)(二进制优化)

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 HDU 2191 一道裸的多重背包问题: #include<iostream> #include<algorithm> #i ...

  8. hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  9. 【COGS】147. [USACO Jan08] 架设电话线(二分+spfa)

    http://cojs.tk/cogs/problem/problem.php?pid=147 学到新姿势了orz 这题求的是一条1-n的路径的最大路径最小. 当然是在k以外的. 我们可以转换一下. ...

随机推荐

  1. Python模块-requests(一)

    requests不是python自带的,使用前需要安装 发送请求 HTTP请求类型有GET,POST,PUT,DELETE,HEAD和OPTIONS 使用requests发送请求的方法如下: > ...

  2. 创建Ajax

    Ajax的全称是Asynchronous javascript and XML = 异步传输 + JS + XML     不需要刷新页面就可以获取新的数据 创建步骤:    (1)创建XML对象也就 ...

  3. 利用Ssocks访问国外网站(yutube/google等)

    ***开源项目:https://github.com/***/ 本例使用的是针对windows系统的c-sharp版本:https://github.com/***/***-windows 运行*** ...

  4. 使用SecureCRT工具部署项目

    总结下我的Java开发过程的一些知识点: 我要上线某个项目,此时我需要给测试人员发送安全扫描文件,等待测试人员完成项目的扫描之后才可以完成上线: 1 将项目打成war包.比如implgtyy.war文 ...

  5. Linux中发布项目的一些命令笔记

    记一下,Linux中发布项目的一些难记的命令: .安装jdk a.检测是否安装了jdk 运行java -version b.若有需要将其卸载 c.查看安装那些jdk rpm -qa | grep ja ...

  6. 使用showInputDialog显示输入框

    ------------------siwuxie095                             工程名:TestJOptionPane 包名:com.siwuxie095.showd ...

  7. php学习笔记-php中把浮点数转化为整数

    在php中有时候会遇到比如 14.6%3这种操作,php是会先把14.6转化为整数再做其它的操作,那么这个转化为整数的操作是floor(14.6)还是ceil(14.6)还是round(14.6)呢? ...

  8. windows10 启用Linux子系统

    转载 https://jingyan.baidu.com/article/e2284b2b99a327e2e6118d38.html 打开Windows下 设置--更新和安全--针对开发人员--选中“ ...

  9. 《精通Spring4.X企业应用开发实战》读后感第七章(AOP基础知识、jdk动态代理,CGLib动态代理)

  10. 动态规划---等和的分隔子集(计蒜课)、从一个小白的角度剖析DP问题

    自己还是太菜了,算法还是很难...这么简单的题目竟然花费了我很多时间...在这里我用一个小白的角度剖析一下这道题目. 晓萌希望将1到N的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等 ...