题意

题目链接

Sol

传说中的吉司机线段树??感觉和BZOJ冒险那题差不多,就是强行剪枝。。。

这题最坑的地方在于对于操作1,$C >= 0$, 操作2中需要对0取max,$a[i] >= 0$,这不就是统计最小值出现的次数么??

按照套路

维护好区间赋值标记 / 区间加法标记 / 区间max标记 / 区间最小值 / 区间最小值出现的次数 / 区间次小值

对于第二个操作就拆成区间加 和 区间max

区间max是一个很神奇的操作

设当前加入的数为val

若val>=mn,那该操作对该区间无影响

若se < val < mn,该操作只会对次小值产生影响,因为对其他的标记均不会产生影响,因此打一个额外的标记即可

否则暴力递归

时间复杂度:$O(n log^2n)$??

另外这东西可以做区间加 / 查询历史版本,前者维护一下标记就行,,后者嘛,,,等长大了再研究吧qwq

#include<cstdio>
#include<algorithm>
#define LL long long
//#define int long long
using namespace std;
const int MAXN = 3 * 1e5 + 10;
const LL INF = 1e10 +10;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
#define ls k << 1
#define rs k << 1 | 1
int N, Q;
int a[MAXN];
struct Node {int l, r, siz, cnt;LL Mx, add, mn, se, cov;
}T[MAXN << 2];
void update(int k) {//T[k].mn = min(T[ls].mn, T[rs].mn);if(T[ls].mn < T[rs].mn)      T[k].cnt = T[ls].cnt, T[k].mn = T[ls].mn, T[k].se = min(T[rs].mn, T[ls].se);else if(T[ls].mn > T[rs].mn) T[k].cnt = T[rs].cnt, T[k].mn = T[rs].mn, T[k].se = min(T[ls].mn, T[rs].se);else              T[k].cnt = T[ls].cnt + T[rs].cnt, T[k].mn = T[ls].mn, T[k].se = min(T[ls].se, T[rs].se);
}
void MemP(int k, LL val) {T[k].cov = val;T[k].cnt = T[k].siz;T[k].se = INF;T[k].Mx = -INF;T[k].add = 0;T[k].mn = val;
}
void AddP(int k, LL val) {if(T[k].se != INF)  T[k].se += val;if(T[k].Mx != -INF) T[k].Mx += val;T[k].mn += val;T[k].add += val;
}
void MaxP(int k, LL val) {T[k].mn = max(T[k].mn, val);//
    T[k].Mx = max(T[k].Mx, val);
}
void pushdown(int k) {if(T[k].cov != INF) MemP(ls, T[k].cov), MemP(rs, T[k].cov), T[k].cov = INF;if(T[k].add) AddP(ls, T[k].add), AddP(rs, T[k].add), T[k].add = 0;if(T[k].Mx != -INF) MaxP(ls, T[k].Mx), MaxP(rs, T[k].Mx), T[k].Mx = -INF;
}
void Build(int k, int ll, int rr) {T[k] = (Node) {ll, rr, rr - ll + 1, 0, -INF, 0, 0, INF, INF};if(ll == rr) {T[k].mn = a[ll]; T[k].cnt = 1;return ;}int mid = T[k].l + T[k].r >> 1;Build(ls, ll, mid); Build(rs, mid + 1, rr);update(k);
}
void IntMem(int k, int ll, int rr, LL val) {if(ll <= T[k].l && T[k].r <= rr) {MemP(k, val); return ;}pushdown(k);int mid = T[k].l + T[k].r >> 1;if(ll <= mid) IntMem(ls, ll, rr, val); if(rr >  mid) IntMem(rs, ll, rr, val);update(k);
}
void IntAdd(int k, int ll, int rr, LL val) {if(ll <= T[k].l && T[k].r <= rr) {AddP(k, val); return ;}pushdown(k);int mid = T[k].l + T[k].r >> 1;if(ll <= mid) IntAdd(ls, ll, rr, val);if(rr >  mid) IntAdd(rs, ll, rr, val);update(k);
}
void IntMax(int k, int ll, int rr, LL val) {if(val <= T[k].mn) return ;if(ll <= T[k].l && T[k].r <= rr && T[k].se > val) {//tag
        MaxP(k, val); return ;}int mid = T[k].l + T[k].r >> 1;pushdown(k);if(ll <= mid) IntMax(ls, ll, rr, val); if(rr >  mid) IntMax(rs, ll, rr, val);update(k);
}
LL Query(int k, int ll, int rr) {// int ans = 0;if(ll <= T[k].l && T[k].r <= rr) return (T[k].mn == 0 ? T[k].cnt : 0);pushdown(k);int mid = T[k].l + T[k].r >> 1;if(ll > mid) return Query(rs, ll, rr);else if(rr <= mid) return Query(ls, ll, rr);else return Query(ls, ll, rr) + Query(rs, ll, rr);
}
main() {// freopen("4355.in", "r", stdin);// freopen("4355.out", "w", stdout);N = read(); Q = read();for(int i = 1; i <= N; i++) a[i] = read();Build(1, 1, N);while(Q--) {int opt = read(), l = read(), r = read(), val;if(opt == 3) printf("%d\n", Query(1, l, r));else {val = read();if(opt == 1) IntMem(1, l, r, val);else {IntAdd(1, l, r, val);IntMax(1, l, r, 0);}}}return 0;
}

转载于:https://www.cnblogs.com/zwfymqz/p/9671730.html

BZOJ4355: Play with sequence(吉司机线段树)相关推荐

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

    题目链接:点击查看 题目大意:给出 1 ~ n 的区间以及 m 次操作,每次操作分为三种形式: 0 l r val:对于区间 [ l , r ] ,a[ i ] = min ( a[ i ] , va ...

  2. 势能线段树/吉司机线段树-我没有脑子

    势能线段树/吉司机线段树 BZOJ3211 花神游历各国 BZOJ5312 冒险 BZOJ4355 Play with sequence BZOJ4695 最假女选手 \(A_i = max(A_i, ...

  3. 2020ICPC(南京) - Just Another Game of Stones(吉司机线段树+博弈)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列 aaa,现在需要执行 mmm 次操作,每次操作分为两种类型: 1lrx1 \ l \ r \ x1 l r x:对于所有 i∈[l,r]i ...

  4. P6242-[模板]线段树3【吉司机线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P6242 题目大意 给出一个长度为nnn的序列aaa,mmm次要求支持操作 区间加上一个值kkk 区间所有aia_i ...

  5. P7560-[JOISC 2021 Day1]フードコート【吉司机线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P7560 题目大意 有 n n n个队列,要求支持操作: 往 [ L , R ] [L,R] [L,R]的队列中插入 ...

  6. 势能线段树(吉司机线段树)专题

    势能线段树(吉司机线段树)专题 势能线段树在近期训练时遇到了好几次,但是由于本人太懒一直没补完,结果ICPC网络赛还真就出了一道势能线段树Orz--结果当然是没做出来--痛定思痛,这回把之前欠的一块儿 ...

  7. 2022.08.21 吉司机线段树略讲

    Interpretation \color{green}{\texttt{Interpretation}} Interpretation 吉司机线段树(A.K.A. 势能线段树),个人觉得,就是对普通 ...

  8. 【模板】吉老师线段树

    ACM模板 目录 区间取最值 区间取最值 Gorgeous Sequence 区间最值操作往往采用以下办法 线段树维护: 区间最大值mx\text{mx}mx 区间严格次大值smx\text {smx ...

  9. HDU 3397 Sequence operation(线段树)

    HDU 3397 Sequence operation 题目链接 题意:给定一个01序列,有5种操作 0 a b [a.b]区间置为0 1 a b [a,b]区间置为1 2 a b [a,b]区间0变 ...

  10. HDU 3397 Sequence operation(线段树区间合并)

    题意: 0 a b将区间[a,b]所有数全部变成0 1 a b将区间[a,b]所有数全部变成1 2 a b将区间[a,b]中所有数0 1互换,0变1,1变0 3 a b输出区间[a,b]中1的个数 4 ...

最新文章

  1. MindSpore 高阶优化器
  2. 外贸网站建设需要考虑的五大层面
  3. 好好学python · 字符串(find(),index(),split(),join(),strip(),replace())
  4. angular安装记录
  5. 22岁何同学引爆B站!硬核毕设树莓派星轨拍摄仪,上演理工男的终极浪漫
  6. Ubuntu16.04安装Hadoop+Spark+pyspark大数据python开发环境
  7. 汽车租赁php参考文献,国内外汽车租赁文献综述
  8. java short s=s 1_Java 面试题 short s = 1; s = s + 1; 与 s += 1; 背后的秘密
  9. vsan 一台主机磁盘组全报错_分享VSAN磁盘无法识别的故障解决方法
  10. 整合使用jeecg-boot微服务问题
  11. 魔力服务器修改器,魔力宝贝修改器
  12. 全宇宙最深入的CSS3 姬成 渡一学习记录
  13. 发送邮件被对方服务器退回_如何更好地给老外发邮件,可以了解下
  14. [设备驱动] 最简单的内核设备驱动--字符驱动
  15. 今日头条 巨量引擎 marketing api
  16. 竞赛 | 中国健康信息处理大会(CHIP2022)发布评测任务
  17. Eclipse IDE for Java EE Developers 去哪里了?
  18. dockers容器基础及基础命令(一)
  19. Email和电子邮箱一样吗?
  20. 【ASH】如何导出视图DBA_HIST_ACTIVE_SESS_HISTORY的查询结果数据

热门文章

  1. torch.rand() 和 torch.randn() 有什么区别?
  2. Linux怎么登录redis数据库,Linux 系统上 Redis 数据库的 安装 部署 使用
  3. mac上latex生成不了pdf_Mac 10.8 下安装Sphinx并支持生成中文PDF
  4. IDEA java 显示build目录
  5. kubunetes packages.cloud.google.com gpg:no valid OpenPGP data found
  6. 无法远程连接 mysql(Ubuntu)
  7. hutool-all 导入Excel 文件 学习笔记
  8. android灰度发布平台,移动APP灰度发布策略
  9. asp 基础操作之增删改查
  10. 页面中超长字段只显示部分