uoj164. 【清华集训2015】V 统计

坑爹题面:http://uoj.ac/problem/164

正常题面:

对于一个序列支持下列5个操作:

1.区间加x

2.区间减x并与0取max

3.区间覆盖

4.单点查询

5.单点历史最大值查询

题解:

每个区间维护一个标记函数f(x)=max(x+a,b)

那么两个标记 f 和 g 的合并就是f(g(x))=max(x+max(fa+ga,-inf),max(fb+ga,gb))(假设f在前g在后)

区间加减就是打上max(x,0),区间覆盖就是打上max(-inf,x)

只要记录历史最大标记即可维护历史最大值

code:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 typedef long long int64;
 8 char ch;
 9 bool ok;
10 void read(int &x){
11     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch==‘-‘) ok=1;
12     for (x=0;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar());
13     if (ok) x=-x;
14 }
15 const int maxn=500005;
16 const int64 inf=4557430888798830399LL;
17 int n,m,val[maxn],op,l,r,x;
18 typedef pair<int64,int64> PII;
19 #define a first
20 #define b second
21 PII operator+(const PII &x,const PII &y){return make_pair(max(x.a+y.a,-inf),max(x.b+y.a,y.b));}
22 PII max(const PII &x,const PII &y){return make_pair(max(x.a,y.a),max(x.b,y.b));}
23 struct Seg{
24     #define ls k<<1
25     #define rs (k<<1)+1
26     PII now[maxn<<2],ever[maxn<<2];
27     void build(int k,int l,int r){
28         if (l==r){now[k]=ever[k]=make_pair(val[l],0);return;}
29         int m=(l+r)>>1;
30         build(ls,l,m),build(rs,m+1,r);
31     }
32     void pushdown(int k){
33         ever[ls]=max(ever[ls],now[ls]+ever[k]);
34         ever[rs]=max(ever[rs],now[rs]+ever[k]);
35         now[ls]=now[ls]+now[k],now[rs]=now[rs]+now[k];
36         now[k]=ever[k]=make_pair(0,0);
37     }
38     void modify(int k,int l,int r,int x,int y,PII v){
39         if (l==x&&r==y){now[k]=now[k]+v,ever[k]=max(ever[k],now[k]);return;}
40         int m=(l+r)>>1; pushdown(k);
41         if (y<=m) modify(ls,l,m,x,y,v);
42         else if (x<=m) modify(ls,l,m,x,m,v),modify(rs,m+1,r,m+1,y,v);
43         else modify(rs,m+1,r,x,y,v);
44     }
45     void add(int x,int y,int v){modify(1,1,n,x,y,make_pair(v,0));}
46     void cov(int x,int y,int v){modify(1,1,n,x,y,make_pair(-inf,v));}
47     int64 query(int k,int l,int r,int x,int op){
48         if (l==r){
49             if (op) return max(ever[k].a,ever[k].b);
50             else return max(now[k].a,now[k].b);
51         }
52         int m=(l+r)>>1; pushdown(k);
53         if (x<=m) return query(ls,l,m,x,op); else return query(rs,m+1,r,x,op);
54     }
55     int64 query(int x,int op){return query(1,1,n,x,op);}
56 }T;
57 int main(){
58     read(n),read(m);
59     for (int i=1;i<=n;i++) read(val[i]);
60     T.build(1,1,n);
61     for (int i=1;i<=m;i++){
62         read(op);
63         if (op==1) read(l),read(r),read(x),T.add(l,r,x);
64         else if (op==2) read(l),read(r),read(x),T.add(l,r,-x);
65         else if (op==3) read(l),read(r),read(x),T.cov(l,r,x);
66         else if (op==4) read(x),printf("%lld\n",T.query(x,0));
67         else read(x),printf("%lld\n",T.query(x,1));
68     }
69     return 0;
70 }
时间: 2024-10-13 01:16:08

uoj164. 【清华集训2015】V 统计的相关文章

[uoj164][清华集训2015]V——线段树

题目大意: 传送门 思路: 对于这么多的操作,以及询问时的取历史最大值,用一般的线段树显然不太好做. 于是考虑把每个操作转化成\(h_i=\max(h_i+a,b)\)的形式,不难发现第一种和第二种就是\(h_i=\max(h_i+x,0)\),第三种即\(h_i=\max(h_i-inf,x)\). 于是我们在线段树上对于每一个节点维护这两个标记,考虑如何合并标记: \[\begin{aligned} x &=\max(\max(x+a,b)+a',b')\ & =\max(\max(x

清华集训2015 V

#164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数与现实世界有所不同. 这个电阻器内有编号为 1∼n1∼n 的 nn 个独立水箱,水箱呈圆柱形,底面积为 1 m21 m2,每个水箱在顶部和底部各有一个阀门,可以让水以 1 m3/s 的流量通过,每个水箱的上阀门接水龙头,可以无限供应水,下阀门不接东西,可以让水流出.水箱顶部和底部都有一个接口,水的电

UOJ #164 【清华集训2015】 V

题目链接:V 这道题由于是单点询问,所以异常好写. 注意到每种修改操作都可以用一个标记\((a,b)\)表示.标记\((a,b)\)的意义就是\(x=\max\{x+a,b\}\) 同时这种标记也是支持合并的.有\((a,b)+(c,d)=(a+c,\max\{b+c,d\})\) 用上这种标记的话,\(1\)操作就是\((x,0)\),\(2\)操作就是\((-x,0)\),\(3\)操作就是\((-inf,x)\). 要查询单点值的话只要把所有标记都下放了就好了. 这种标记也支持取\(\ma

UOJ #164 【清华集训2015】V (线段树)

题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,...,x_k\) 那么则有: 当前值就是该序列的最大后缀和,历史最大值就是该序列的最大子段和! 然后如果把最大子段和定义加法,那么就变成了区间加单点查询. 直接线段树维护即可,时间复杂度\(O(n\log n)\). (好吧,其实似乎把赋值看做减去正无穷再加\(x\)似乎是可以被卡爆long long的-

#163. 【清华集训2015】新式计算机

//题目太长,为了我的小心脏,我都没忍心读下去...... 这是一道提交答案题. 伟大的人类智慧之神 clevertick 奋战三星期,造出了一台新式计算机(其实他造计算机只用了三天,剩余的时间都在编译.调试……),起名 CTOX.现在,他可以抛弃自己旧的机器,来用 CTOX 完成自己的工作了…… CTOX 拥有足够大(可以认为是无穷大)的内存,并且它的内存地址是二维的,也就是说,一个内存地址可以使用一对整数 (x,y)(x,y) 来表示,和这个地址相邻的4个地址分别是 (x+1,y)(x+1,

[清华集训2015]灯泡(浙江大学ZOJ 3203 Light Bulb)

Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow and he has only one light bulb in his house. Every night, he is wandering in his incommodious house, t

[UOJ 160][清华集训2015]斗地主

文字 数字 较多,加载略慢 题目链接 Emm怎么没人做啊,网上都找不到题解我怎么抄 首先大力模拟,写一个对抗搜索,记录当前玩家的牌,对手的牌,当前玩家,对手上一次出的牌 然后加一个记忆化搜索,这样可以轻松跑出前两个Subtask(当然你可以加上O2优化跑得快一点) 然后我大力跑一下Subtask3,每个点都在\(1s~2s\)左右,然后跑了几十分钟也跑出来了 当然或许是因为i5-8250U然后开一大堆窗口的原因(复杂度爆炸(不过低压U确实慢 然后改成二分答案+判定,这样可以在搜索时加很多剪枝,比

bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct

[清华集训2016]温暖会指引我们前行 统计 描述 提交 自定义测试 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一位火焰之神 “我将赐予你们温暖和希望!” 只见他的身体中喷射出火焰之力 通过坚固的钢铁,传遍了千家万户 这时,只听见人们欢呼 “暖气来啦!” 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低. 小R的

uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

[清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N.    矩阵中每个数都是 [0,N] 中的自然数.    每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每行中 0 恰好出现 M−N 次.    每列中,[1,N] 中每个自然数至多出现一次. 现在我们要在每行中选取一个非零数,