Vijos P1659 河蟹王国
来源:互联网 发布:linux进程消失查日志 编辑:程序博客网 时间:2024/04/28 15:25
Vijos P1659 河蟹王国
题目
描述
河蟹王国有一位河蟹国王,他的名字叫羊驼。河蟹王国富饶安定,人们和谐相处。有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人。于是,羊驼国王将他的子民排成了一列(==!!b汗~好长呀)。每个人都有一个初始的和谐值。羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选出的人。而且,在某一时间,区间[L’,R’]里的人会变得熟悉,因此他们每个人的和谐值都会上升一个相同的值C。羊驼国王想知道,对于每一次选择,他选出的最大和谐值是多少。
格式
输入格式
第一行是一个数N(1<=N<=100000),表示人数。
接下来的N行,每行一个数,表示排成的序列第i个人和谐值的初始值。
接下来是一个数M(1<=M<=100000),表示羊驼国王或他的子民有所活动(羊驼国王选择一个区间算一次,某区间里的人增长和谐值算一次)的总次数。
接下来的M行,每行第一个是一个数K,K是1或2,若K=1,接下来有三个数L,R,C,表示区间[L,R]的所有人增加C的和谐值;若K=2,接下来有两个数L,R,表示国王选择了区间[L,R]。
输出格式
每次对于国王选择区间,输出选择区间里的最大和谐值。
样例1
样例输入1
51234532 1 41 1 3 32 3 5
样例输出1
46
限制
每个测试点1s。
提示
保证所有的数以及结果都在longint范围内。
来源
经典问题改编。
题解
线段树,区间修改最大值+区间查询
代码
#include<cstdio>using namespace std;int n,m,x,y,z;struct data{ int l,r,x,tag;} tr[300005];int readln(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();} while ('0'<=ch&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*f;}int max(int x,int y){return x>y?x:y;}void build(int l,int r,int rt){ tr[rt].l=l;tr[rt].r=r; if (l==r) {tr[rt].x=readln();return;} int mid=(l+r)>>1; build(l,mid,rt<<1);build(mid+1,r,rt<<1|1); tr[rt].x=max(tr[rt<<1].x,tr[rt<<1|1].x);}void pushdown(int rt){ tr[rt<<1].tag+=tr[rt].tag; tr[rt<<1|1].tag+=tr[rt].tag; tr[rt<<1].x+=tr[rt].tag; tr[rt<<1|1].x+=tr[rt].tag; tr[rt].tag=0;}void updata(int l,int r,int add,int rt){ int ll=tr[rt].l,rr=tr[rt].r; if (ll==l&&rr==r) {tr[rt].tag+=add;tr[rt].x+=add;return;} if (tr[rt].tag) pushdown(rt); int mid=(ll+rr)>>1; if (r<=mid) updata(l,r,add,rt<<1); else if (mid<l) updata(l,r,add,rt<<1|1); else {updata(l,mid,add,rt<<1);updata(mid+1,r,add,rt<<1|1);} tr[rt].x=max(tr[rt<<1].x,tr[rt<<1|1].x);}int query(int l,int r,int rt){ int ll=tr[rt].l,rr=tr[rt].r; if (ll==l&&rr==r) return tr[rt].x; if (tr[rt].tag) pushdown(rt); int mid=(ll+rr)>>1; if (r<=mid) return query(l,r,rt<<1); else if (mid<l) return query(l,r,rt<<1|1); else return max(query(l,mid,rt<<1),query(mid+1,r,rt<<1|1));}int main(){ n=readln(); build(1,n,1); m=readln(); for (int i=1;i<=m;i++) { x=readln(); if (x==1){ x=readln();y=readln();z=readln(); updata(x,y,z,1); } else { x=readln();y=readln(); printf("%d\n",query(x,y,1)); } }}
阅读全文
0 0
- Vijos P1659河蟹王国
- Vijos P1659 河蟹王国
- P1659 河蟹王国 线段树
- 【vijos 1659】 河蟹王国
- [vijos 1659]: 河蟹王国
- 【vijos1659】 河蟹王国
- vijos 1659 河蟹王国 线段树区间加、区间查询最大值
- 河蟹啊河蟹
- 洛谷P1659 养猪
- 洛谷 P1659 养猪
- 1903 GG【河蟹】F【河蟹】W
- 此贴被河蟹
- xampp 河蟹篇章
- 斯巴达的河蟹横行
- 河蟹过滤不文明词
- 《#诗盗#~山坡羊河蟹》
- 狮子王国
- 零食王国
- 专题 线段树B(最大值更新)
- Python2.0 模块大全
- AC的第一道省赛题目代码
- 跑步爱天天(欧拉序入门)
- Android面试题总结(三)
- Vijos P1659 河蟹王国
- Windows下安装Elasticsearch 5.0.0遇到的问题
- Win10---Redis 安装及常用命令
- 开发流量球SDK之自定义view(流量球)下篇 — 裁剪圆形(以及其他形状)背景图片并设置文字
- fl stuido 12.5汉化补丁-汉化包
- Leetcode题解-23. Merge k Sorted Lists
- 9.1最大最小值
- 洛谷 1083 [NOIP2012] 借教室 二分
- JDK8中Thread源码解析