时间限制: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. AD9 如何画4层pcb板

    新建的PCB文件默认的是2层板,教你怎么设置4层甚至更多层板. 在工具栏点击Design-->Layer Stack Manager.进入之后显示的是两层板,添加为4层板,一般是先点top la ...

  2. openssh for windows

  3. 不支持PowerShell 2.0版本(don't support PowerShell version 2.0. )

    在“程序包管理器控制台”使用命令“update-database”会提示:The Entity Framework Core Package Manager Console Tools don't s ...

  4. LAMP 1.5 测试PHP解析 问题解决

    安装完php从新加载了一个模块 php5_module 重新启动模块 /usr/local/apache2/bin/apachectl restart ifconfig 查看本机ip,在浏览器里面输入 ...

  5. C语言学习笔记--接续符和转义符

    1.C语言中的接续符 (1)编译器将反斜杠剔除,跟在反斜杠后面的字符自动接续到前一行 (2)在接续单词时,反斜杠之后不能有空格,反斜杠下一行之前也不能有空格 (3)接续符适合在宏定义代码块时使用 #i ...

  6. javaScript之Array方法

    Array类型和其他语言一样,是数据的有序列表,但不同的是数组的每一项们可以保存任何类型的数据. 1.检测方法(确定某个对象是不是数组) (1)value instanceof Array (2)Ar ...

  7. Java视频播放器的制作

    ----------------siwuxie095                             使用 Java Swing 框架制作一个简单的视频播放器:         首先到 Vid ...

  8. 3、Linux下配置Java环境

    转载:http://blog.sina.com.cn/s/blog_c5a35e780102wtxl.html 生物信息很多软件都是用java写的,所以需要在linux上配置java运行环境.平台上的 ...

  9. Python学习——输入和输出

    (转自:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316434841 ...

  10. cookie 、Session 和自定义分页

    cookie cookie的由来 大家都知道Http协议是无状态的. 无状态的意思 是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系, 他不会受前面的请求响应情况直接影响, ...