时间限制: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. [置顶] 什么是C语言结构体字节对齐,为什么要对齐?

    一.概念 对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的.   ...

  2. JBOSS AS 5.X/6.X 反序列化漏洞(CVE-2017-12149)复现

    本机IP:192.168.220.145 靶机IP:192.168.220.139,版本为JBOSS AS 6.1.0 Final 首先访问目标地址,http://192.168.220.139:80 ...

  3. Android开发者学习必备:10个优质的源码供大家学习

    最近看了一些开发的东西,汇总了一些源码.希望可以给大家有些帮助! 1.Android 源码解析—PagerSlidingTabStrippagerSlidingTabStrip 实现联动效果的原理是, ...

  4. XML解析,出现ClassCastException 原因

    import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.Docum ...

  5. Mach系统

    ——杂言:最近升级了把山狮升级到了10.9mavericks,比较抓我注意力的就是新的活动监视器.新的监视器里对统计分类很严,双击某一进程,即可跳出一个详情对话框.其中里面就有记录着Mach相关的信息 ...

  6. 菜鸟攻城狮1(JAVA程序设计)

    1.JAVA是一个完整的平台,有一个庞大的库,提供了可重复利用的代码功能块,安全性,跨操作系统的可以移植性,自动垃圾回收机制 2.JAVA设计者白皮书:简单性.面向对象.网络技能.健壮性.安全性.体系 ...

  7. 【mysql格式化日期】

    date_format(now(),'%Y-%c-%d'): 1. DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. DATE_FORMAT(date,format) format ...

  8. centos运行netcore error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.

    Error: Another program is already listening on a port that one of our HTTP servers is configured to ...

  9. Unity 分场景打包

    分场景打包步骤:导入unity中AB包后 1: 指定场景  2: 指定abname  3: 指定objinabname  4: 协同  5: 委托 void string unity 先引入命名空间  ...

  10. 程序员笔记|常见的Spring异常分析及处理

    一.前言 相信我们每个人在SpringMVC开发中,都遇到这样的问题:当我们的代码正常运行时,返回的数据是我们预期格式,比如json或xml形式,但是一旦出现了异常(比如:NPE或者数组越界等等),返 ...