题意:

已知\(n\)个数字,进行以下操作:

  • \(1.\)区间\([L,R]\) 赋值为\(x\)
  • \(2.\)区间\([L,R]\) 赋值为\(max(a[i] + x, 0)\)
  • \(3.\)区间\([L,R]\) 询问\(0\)个数

已知初始值\(\geq 0\),\(x\geq0\)。

思路:

吉司机线段树。

操作\(1\)可以直接打覆盖标记。

操作\(2\)可以分为两步:区间加\(x\),然后取区间\(max(a[i],0)\)。

操作\(3\)只要维护最小值的个数,因为不管怎么操作最后的值都\(\geq0\),然后查询的时候判最小值是不是\(0\)。

注意覆盖的时候,要把次小值初始化为\(INF\)。

代码:

#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 5e5 + 5;
const int MAXM = 3e6;
const ll MOD = 998244353;
const ull seed = 131;
const ll INF = 1e16; #define lson (rt << 1)
#define rson (rt << 1 | 1)
int a[maxn];
ll Min[maxn << 2], sMin[maxn << 2], add[maxn << 2], cov[maxn << 2];
int Minlen[maxn << 2];
inline void pushup(int rt){
if(Min[lson] > Min[rson]){
Min[rt] = Min[rson];
Minlen[rt] = Minlen[rson];
sMin[rt] = min(sMin[rson], Min[lson]);
}
if(Min[lson] < Min[rson]){
Min[rt] = Min[lson];
Minlen[rt] = Minlen[lson];
sMin[rt] = min(sMin[lson], Min[rson]);
}
if(Min[lson] == Min[rson]){
Min[rt] = Min[lson];
Minlen[rt] = Minlen[lson] + Minlen[rson];
sMin[rt] = min(sMin[lson], sMin[rson]);
}
}
inline void pushdown(int rt, int l, int r){
int m = (l + r) >> 1;
if(cov[rt] != -1){
Min[lson] = Min[rson] = cov[rt];
sMin[lson] = sMin[rson] = INF; //careful!!!!
cov[lson] = cov[rson] = cov[rt];
add[lson] = add[rson] = 0;
Minlen[lson] = m - l + 1;
Minlen[rson] = r - m;
cov[rt] = -1;
}
if(add[rt]){
Min[lson] += add[rt], sMin[lson] += add[rt];
Min[rson] += add[rt], sMin[rson] += add[rt];
add[lson] += add[rt], add[rson] += add[rt];
add[rt] = 0;
}
if(Min[lson] < Min[rt]){
if(sMin[lson] == Min[lson]) sMin[lson] = Min[rt];
Min[lson] = Min[rt];
}
if(Min[rson] < Min[rt]){
if(sMin[rson] == Min[rson]) sMin[rson] = Min[rt];
Min[rson] = Min[rt];
}
}
void build(int l, int r, int rt){
cov[rt] = -1, add[rt] = 0;
if(l == r){
Min[rt] = a[l];
sMin[rt] = INF;
Minlen[rt] = 1;
return;
}
int m = (l + r) >> 1;
build(l, m, lson);
build(m + 1, r, rson);
pushup(rt);
}
void cover(int L, int R, int l, int r, ll v, int rt){
if(L <= l && R >= r){
cov[rt] = v;
add[rt] = 0;
Min[rt] = v;
sMin[rt] = INF; //careful!!!!
Minlen[rt] = r - l + 1;
return;
}
pushdown(rt, l, r);
int m = (l + r) >> 1;
if(L <= m)
cover(L, R, l, m, v, lson);
if(R > m)
cover(L, R, m + 1, r, v, rson);
pushup(rt);
}
void update(int L, int R, int l, int r, ll v, int rt){
if(L <= l && R >= r){
Min[rt] += v;
sMin[rt] += v;
add[rt] += v;
return;
}
pushdown(rt, l, r);
int m = (l + r) >> 1;
if(L <= m)
update(L, R, l, m, v, lson);
if(R > m)
update(L, R, m + 1, r, v, rson);
pushup(rt);
}
void Less(int L, int R, int l, int r, ll v, int rt){
if(Min[rt] >= v) return;
if(L <= l && R >= r && sMin[rt] > v){ //>保证Minlen不变
Min[rt] = v;
return;
}
pushdown(rt, l, r);
int m = (l + r) >> 1;
if(L <= m)
Less(L, R, l, m, v, lson);
if(R > m)
Less(L, R, m + 1, r, v, rson);
pushup(rt);
}
int querySum(int L, int R, int l, int r, int rt){
if(L <= l && R >= r){
return Min[rt] == 0? Minlen[rt] : 0;
}
pushdown(rt, l, r);
int m = (l + r) >> 1;
int ret = 0;
if(L <= m)
ret += querySum(L, R, l, m, lson);
if(R > m)
ret += querySum(L, R, m + 1, r, rson);
return ret;
}
inline bool read(int &num){
char in;
bool IsN=false;
in = getchar();
if(in == EOF) return false;
while(in != '-' && (in < '0' || in > '9')) in = getchar();
if(in == '-'){ IsN = true; num = 0;}
else num = in - '0';
while(in = getchar(),in >= '0' && in <= '9'){
num *= 10, num += in-'0';
}
if(IsN) num = -num;
return true;
}
int main(){
int n, m;
read(n), read(m);
for(int i = 1; i <= n; i++) read(a[i]);
build(1, n, 1);
while(m--){
int l, r, x, op;
read(op), read(l), read(r);
if(op < 3) read(x);
if(op == 1) cover(l, r, 1, n, x, 1);
else if(op == 2) update(l, r, 1, n, x, 1), Less(l, r, 1, n, 0, 1);
else printf("%d\n", querySum(l, r, 1, n, 1));
}
return 0;
}

bzoj4355 Play with sequence(吉司机线段树)题解的更多相关文章

  1. BZOJ4355: Play with sequence(吉司机线段树)

    题意 题目链接 Sol 传说中的吉司机线段树??感觉和BZOJ冒险那题差不多,就是强行剪枝... 这题最坑的地方在于对于操作1,$C >= 0$, 操作2中需要对0取max,$a[i] > ...

  2. HDU - 5306 Gorgeous Sequence (吉司机线段树)

    题目链接 吉司机线段树裸题... #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3 ...

  3. UVALive - 4108 SKYLINE (吉司机线段树)

    题目链接 题意:在一条直线上依次建造n座建筑物,每座建筑物建造完成后询问它在多长的部分是最高的. 比较好想的方法是用线段树分别维护每个区间的最小值mi和最大值mx,当建造一座高度为x的建筑物时,若mi ...

  4. bzoj5312 冒险(吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 按位与\(x\) \(2.\)区间\([L,R]\) 按位或\(x\) \(3.\)区间\([L,R]\) 询问最大值 ...

  5. bzoj4695 最假女选手(势能线段树/吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)给一个区间\([L,R]\) 加上一个数\(x\) \(2.\)把一个区间\([L,R]\) 里小于\(x\) 的数变成\(x\) \(3.\ ...

  6. HDU - 6315 吉司机线段树

    题意:给出a,b数组,区间上两种操作,给\(a[L,R]\)+1s,或者求\(\sum_{i=l}^{r}a_i/b_i\) 一看就知道是吉司机乱搞型线段树(低配版),暴力剪枝就好 维护区间a的最大值 ...

  7. HDU 5306 吉司机线段树

    思路: 后面nlogn的部分是伪证... 大家可以构造数据证明是这是nlog^2n的啊~ 吉老司机翻车了 //By SiriusRen #include <cstdio> #include ...

  8. hdu6521 吉司机线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=6521 待填 代码 #include<bits/stdc++.h> #define ls o<& ...

  9. Petrozavodsk Winter-2018. AtCoder Contest. Problem I. ADD, DIV, MAX 吉司机线段树

    题意:给你一个序列,需要支持以下操作:1:区间内的所有数加上某个值.2:区间内的所有数除以某个数(向下取整).3:询问某个区间内的最大值. 思路(从未见过的套路):维护区间最大值和区间最小值,执行2操 ...

随机推荐

  1. 高效率同步降压变换器,24V转3.3V降压芯片

    PW2312是一个高频,同步,整流,降压,开关模式转换器与内部功率MOSFET.它提供了一个非常紧凑的解决方案,以实现1.5A的峰值输出电流在广泛的输入电源范围内,具有良好的负载和线路调节. PW23 ...

  2. Nginx报504 gateway timeout错误的解决方法(小丑搞笑版。。。)

    一.今天登录我的网站,突然发现报了下面的一个错误: 我的第一反应是:超时了应该是Nginx代理没有设置超时时间,默认的超时时间估计太小了,然后就按照正常的方式用Xshell连接服务器,应该是网络或者是 ...

  3. 干货!上古神器 sed 教程详解,小白也能看的懂

    目录: 介绍工作原理正则表达式基本语法数字定址和正则定址基本子命令实战练习 介绍 熟悉 Linux 的同学一定知道大名鼎鼎的 Linux 三剑客,它们是 grep.awk.sed,我们今天要聊的主角就 ...

  4. Mybatis【15】-- Mybatis一对一多表关联查询

    注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-11-one2one,需要自取,需要配置maven ...

  5. vue2.0、vue3.0不同之处

    一.响应式赋值操作不同 Vue2.0 1.通过data返回对象做相应: 2.对复杂的对象或数组下的属性等深层次的改变需要通过$set的方式. Vue3.0 1.ref实现简单的实现响应,通过value ...

  6. ldf和mdf文件怎么还原到sqlserver数据库

    1.把mdf文件和ldf文件拷贝到数据库的默认路径C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA里:2.在sq ...

  7. 一篇文章带你初步了解—CSS特指度

    CSS特指度 说明 这篇博客在在两台电脑上分别完成的,故而有些截图是Firefox,有些是Chrome,有些改动了浏览器的用户样式表,有些没改,但不会影响阅读,特此说明,勿怪. CSS选择器 单个CS ...

  8. Go 语言编译过程

    走进Golang之编译器原理_大愚Talk-CSDN博客 https://blog.csdn.net/hel12he/article/details/103061921 go编译器 - 知乎 http ...

  9. Server:www121 Server:www120 Server:NWS_SP 内容被散列,并在响应中放入Etag When to Use Entity-Tags and Last-Modified Dates

    1 Request URL:http://www.biyao.com/minisite/bzzx 2 Request Method:GET 3 Status Code:200 OK 4 Remote ...

  10. 权限过大 ssh协议通过pem文件登陆

    root@oneweek:~# ssh -i uat.pem root@110.5.15.6@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...