\(\text{Problem}\)

1.询问区间最小值是否大于 \(0\)

2.区间加(可正可负)

3.区间取 \(\max\)

如果某个数经过操作后小于等于 \(0\),以后的操作就不会再影响这个数

\(\text{Analysis}\)

显然要用线段树维护这个区间

区间加和 \(\max\) 打个双标记就好了,给加法优先

然后考虑区间加的过程中一个数如果加上这个数小于等于了 \(0\),那么我们把这个点设成无限大,标记一下

一个区间的标记定为区间内有没有被标记了的点

设成无限大后继续操作不会影响后面的情况,这样就好极了

\(\text{Code}\)

#include<cstdio>
#include<iostream>
#define ls (k << 1)
#define rs (ls | 1)
using namespace std; const int N = 1e5 + 5 , INF = 0x3f3f3f3f;
int n , m , L; struct segment{
int mn , tag_add , tag_max, fl;
}seg[N << 2]; inline void read(int &x)
{
x = 0; char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();
} inline void pushup(int k)
{
seg[k].mn = min(seg[ls].mn , seg[rs].mn);
seg[k].fl = seg[ls].fl && seg[rs].fl;
} inline void push_add(int k , int v)
{
seg[k].tag_add += v, seg[k].mn += v;
if (seg[k].tag_max > -INF) seg[k].tag_max += v;
}
inline void push_max(int k , int v)
{
if (v <= seg[k].mn) return;
seg[k].mn = v, seg[k].tag_max = v;
} inline void pushdown(int k)
{
if (seg[k].tag_add != 0)
{
push_add(ls , seg[k].tag_add);
push_add(rs , seg[k].tag_add);
seg[k].tag_add = 0;
}
if (seg[k].tag_max != -INF)
{
push_max(ls , seg[k].tag_max);
push_max(rs , seg[k].tag_max);
seg[k].tag_max = -INF;
}
} inline void build(int l , int r , int k)
{
seg[k].tag_max = -INF;
if (l == r)
{
seg[k].mn = L, seg[k].fl = 1;
return;
}
int mid = (l + r) >> 1;
build(l , mid , ls) , build(mid + 1 , r , rs);
pushup(k);
} inline void update_add(int l , int r , int k , int x , int y , int c)
{
if (x <= l && r <= y)
{
if (seg[k].mn + c > 0) return push_add(k , c);
else if (l == r)
{
seg[k].mn = INF, seg[k].fl = 0;
return;
}
}
pushdown(k);
int mid = (l + r) >> 1;
if (x <= mid) update_add(l , mid , ls , x , y , c);
if (y > mid) update_add(mid + 1 , r , rs , x , y , c);
pushup(k);
}
inline void update_max(int l , int r , int k , int x , int y , int c)
{
if (seg[k].mn >= c) return;
if (x <= l && r <= y)
{
push_max(k, c);
return;
}
pushdown(k);
int mid = (l + r) >> 1;
if (x <= mid) update_max(l , mid , ls , x , y , c);
if (y > mid) update_max(mid + 1 , r , rs , x , y , c);
pushup(k);
} inline int query(int l , int r , int k , int x, int y)
{
if (x <= l && r <= y) return seg[k].fl;
pushdown(k);
int mid = (l + r) >> 1, res = 1;
if (x <= mid) res = query(l , mid , ls , x, y);
if (y > mid) res = res && query(mid + 1 , r , rs , x, y);
return res;
} int main()
{
freopen("road.in", "r", stdin);
freopen("road.out", "w", stdout);
read(n), read(m), read(L);
build(1 , n , 1);
int l , r , c, op, ans = 0;
for(int i = 1; i <= m; i++)
{
read(op), read(l), read(r), read(c);
if (op == 1 && (query(1, n, 1, l, r))) ++ans, update_add(1, n, 1, l, r, -c);
else if (op == 2) update_add(1, n, 1, l, r, c);
else if (op == 3) update_max(1, n, 1, l, r, c);
}
printf("%d\n", ans);
}

JZOJ 3448.公路维护的更多相关文章

  1. bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树

    [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 93  Solved: 53[Submit][Status][ ...

  2. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  3. 1196: [HNOI2006]公路修建问题 - BZOJ

    Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织 ...

  4. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  5. [HNOI2006]公路修建问题 BZOJ1196 Kruskal

    题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 输入输出样例 输入样例#1: 复制 4 2 5 1 2 6 5 1 3 3 1 2 3 9 4 2 4 6 1 输出 ...

  6. 洛谷 P1111 修复公路(最小生成树)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1111 这道题的关键是读懂题: 首先根据题中的一些扎眼的字眼我们可以判断这是一道用最小生成树来做的题 ...

  7. 【bzoj3510】首都 LCT维护子树信息(+启发式合并)

    题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...

  8. JZOJ 5922. sequence

    5922. [NOIP2018模拟10.23]sequence (File IO): input:sequence.in output:sequence.out Time Limits: 1000 m ...

  9. JZOJ| 5910. DuLiu

    Description          LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃圾题目者也,教人半懂不懂的.因为他姓李,别人便从QQ群上的“毒瘤李F ...

  10. 公路建设 (highway.c/cpp/pas)

    2.公路建设 (highway.c/cpp/pas) 在滨海市一共有 n 个城市,编号依次为 1 到 n,它们之间计划修建 m 条双向道路,其中 修建第 i 条道路的费用为 ci. 海霸王作为滨海市公 ...

随机推荐

  1. c3 linearization详解

    MRO MRO 全称方法解析顺序(Method Resolution Order),在多重继承和多继承存在的时候,寻找属性及方法的顺序. 深度优先(DFS)与广度优先(BFS) python2 所用的 ...

  2. docker给已存在的容器添加或修改端口映射

    简述: 这几天研究了一下docker, 发现建立完一个容器后不能增加端口映射了,因为 docker run -p 有 -p 参数,但是 docker start 没有 -p 参数,让我很苦恼,无奈谷歌 ...

  3. 【大数据面试】sqoop:空值、数据一致性、列式存储导出、数据量、数据倾斜

    一.有没有遇到过问题,怎么进行解决的 1.空值问题 本质:hive底层存储空数据使用\n<==>MySQL存储空数据使用null 解决:双向导入均分别使用两个参数☆,之前讲过 2.数据一致 ...

  4. 单一接口优化过程全记录(主要涉及Redis)

    接口优化过程记录 问题背景 某个接口耗时长(247ms),但里面逻辑不算复杂,只进行了简单的对象引用以及操作了多次Redis 步骤1:链路追踪,确定业务耗时点 接口里通过链路追踪以及日志查询发现主要是 ...

  5. 更强大的远程开发,Remote Tunnels 正式发布预览版!

    Visual Studio Code 的核心是一个代码编辑器,它通过我们的远程开发经验与其他环境集成,变得更加强大和灵活: 你可能没有想到,但 VS Code 有一个内置的命令行界面(CLI),可以让 ...

  6. linux基础第二部分

    一.Linux命令执行过程 先判断是否是别名,如果是直接执行,不是看是否是内部命令 如果是内部命令,直接执行,不是看hash表 hash表中有源文件直接执行,找不到报错 若hash表中不存在去外部规定 ...

  7. 使用NPOI core插入图片

    闲的无聊,封装一个NPOI core插入图片,下面贴上代码,有注释,我就不讲解了 public class ExcelHelper { /// <summary> /// excel插入图 ...

  8. 零基础入门 Java 后端开发,有哪些值得看的视频?

    目前网络上充满了大量的 Java 视频教程,然而内容却鱼龙混杂,为了防止小伙伴们踩坑,一枫结合自己的学习经验,向大家推荐一些不错的学习资源. 作为一名非科班转码选手,可以说,我是在哔哩哔哩上的研究生! ...

  9. STL string常用API

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> using namespace std; ...

  10. 【运维笔录】局域网实现项目的CI/CD,Docker+Gitea+Drone搭建轻量级自动化部署平台

    一.安装Docker 1.1 安装excpet $ apt-get -f install expect 1.2 编写执行Docker安装脚本 编写docker_dep.exp脚本 #!/usr/bin ...