[Vijos] 河蟹王国

描述

河蟹王国有一位河蟹国王,他的名字叫羊驼。河蟹王国富饶安定,人们和谐相处。有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人。于是,羊驼国王将他的子民排成了一列(==!!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

5
1
2
3
4
5
3
2 1 4
1 1 3 3
2 3 5

样例输出1

4
6

限制

每个测试点1s。

提示

保证所有的数以及结果都在longint范围内。

来源

经典问题改编。

思路

。。。带标记下放的区间最大值,然后sb的我交了,,,4边QUQ

代码实现

 1 #include<cstdio>
 2 #define LL long long
 3 const int maxn=1e5+10;
 4 inline LL min_(LL x,LL y){return x<y?x:y;}
 5 inline LL max_(LL x,LL y){return x>y?x:y;}
 6 int n,m;
 7 LL t[maxn<<2],f[maxn<<2];
 8 void build(int k,int l,int r){
 9     if(l==r){
10         scanf("%lld",&t[k]);
11         return;
12     }
13     int mid=l+r>>1,ls=k<<1,rs=ls|1;
14     build(ls,l,mid);
15     build(rs,mid+1,r);
16     t[k]=max_(t[ls],t[rs]);
17 }
18 void f_down(int k,int ls,int rs){
19     t[ls]+=f[k],f[ls]+=f[k];
20     t[rs]+=f[k],f[rs]+=f[k];
21     f[k]=0;
22 }
23 void add(int k,int l,int r,int al,int ar,LL p){
24     if(al <= l && r <= ar){
25         t[k]+=p,f[k]+=p;
26         return;
27     }
28     int mid=l+r>>1,ls=k<<1,rs=ls|1;
29     if(f[k]) f_down(k,ls,rs);
30     if(al<=mid) add(ls,l,mid,al,min_(ar,mid),p);
31     if(ar>mid) add(rs,mid+1,r,max_(al,mid+1),ar,p);
32     t[k]=max_(t[ls],t[rs]);
33 }
34 #define INF 8e18
35 LL big(int k,int l,int r,int al,int ar){
36     if(l==al&&r==ar) return t[k];
37     int mid=l+r>>1,ls=k<<1,rs=ls|1;
38     if(f[k]) f_down(k,ls,rs);
39     LL ret=-INF;
40     if(al<=mid) ret=max_(ret,big(ls,l,mid,al,min_(ar,mid)));
41     if(ar>mid) ret=max_(ret,big(rs,mid+1,r,max_(al,mid+1),ar));
42     return ret;
43 }
44 int main(){
45     scanf("%d",&n);
46     build(1,1,n);
47     scanf("%d",&m);
48     LL c;
49     int k,l,r;
50     for(int i=1;i<=m;i++){
51         scanf("%d",&k);
52         if(k==1){
53             scanf("%d%d%lld",&l,&r,&c);
54             add(1,1,n,l,r,c);
55         }
56         if(k==2){
57             scanf("%d%d",&l,&r);
58             printf("%lld\n",big(1,1,n,l,r));
59         }
60     }
61     return 0;
62 }
时间: 2024-11-05 16:09:33

[Vijos] 河蟹王国的相关文章

vijos 1659 河蟹王国 线段树区间加、区间查询最大值

河蟹王国 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他的名字叫羊驼.河蟹王国富饶安定,人们和谐相处.有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人.于是,羊驼国王将 他的子民排成了一列(==!!b汗~好长呀).每个人都有一个初始的和谐值.羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选 出的人.而且,在某一时间,区间[L

【vijos1659】河蟹王国 线段树&lt;区间修改+区间最大值&gt;

描述 河蟹王国有一位河蟹国王,他的名字叫羊驼.河蟹王国富饶安定,人们和谐相处.有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人.于是,羊驼国王将他的子民排成了一列(==!!b汗~好长呀).每个人都有一个初始的和谐值.羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选出的人.而且,在某一时间,区间[L’,R’]里的人会变得熟悉,因此他们每个人的和谐值都会上升一个相同的值C.羊驼国王想知道,对于每一次选择,他选出的最大和谐值是多少. 输入格式 第一行是一个数N(1<=N<

【vijos】P1659 河蟹王国

[算法]线段树 [题解]区间加上同一个数+区间查询最大值.注意和谐值可以是负数,初始化ans为负无穷大. #include<cstdio> #include<algorithm> using namespace std; const int maxn=100010,ainf=-0x3f3f3f3f; struct treess{int l,r,ms,delta;}t[maxn*3]; int a[maxn],n,m; void build(int k,int l,int r) {

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

远古守卫/cocos2d-x 源代码/塔防游戏/高仿王国保卫战

下载地址:spm=686.1000925.0.0.j3MZhz&id=550780702354" style="color:rgb(224,102,102)">下载地址 本源代码高度模仿IOS游戏王国保卫战,由国外IOS商业开发教程站点raywenderlich内部project师制作,有很完整的关卡设计,战斗流程,长达12个关卡,各种敌兵,怪物,箭塔,炮塔一应俱全,还有魔法系统,成就系统以及后台数据库.差点儿达到了能够上线的商业游戏级别. 代码严格规范,提供了

Vijos P1785 同学排序【模拟】

同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号.要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出来,重复n次,问这时有多少同学出来站着? 样例1 样例输入1 1989 5 样例输出1 1926 限制 1s 提示 [数据范围] 1≤n≤10 100≤m≤100000 题目链接:https://vijos.org/p/1785 分析:站出序号为偶数的人,如果总人数为奇数,剩余人数向上取整再折半就好了! 下面给出AC代码: 1 #incl

Vijos 1057 盖房子

二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), (i - 1, j)三点中最小的边长构成.. 一遍递推, 一边取最大即可 */ #include <cstdio> #define Max 1009 inline int min (int a, int b) { return a < b ? a : b; } inline int max

Vijos 1193 扫雷 【动态规划】

扫雷 描述 相信大家都玩过扫雷的游戏.那是在一个n*n的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"任过流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和他8连通的格子里面雷的数目.现在棋盘是n*2的,第一列里某些格子是雷,而第二列没有雷,如:o 1* 2* 3* 2o 2* 2* 2 ('*'代表有雷,'o'代表无雷)由于第一类的雷有可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息求第一列雷有多少中摆放方案.