\(\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. angr_ctf——从0学习angr(一):angr简介与核心概念

    我在学习angr时,先是阅读了开发者发布在IEEE上的论文IEEE Xplore Full-Text PDF:该文章讲述了自动化漏洞挖掘的背景和方法,并对angr的架构和核心模块进行了介绍,非常经典值 ...

  2. CSS中和颜色及渐变

    CSS可以设置的颜色 颜色名称 transparent(全透明黑色) pink yellowgreen 等指定的颜色名称 16进制 #ABCDEF 参数 含义 范围 AB 红色渠道值 00-FF CD ...

  3. python中的数学函数

  4. PHP 视频源文件加密方案

    先说下原理:因为视频是付费的,肯定需要作视频加密处理. 加密可实现的方式:修改视频字节流,只能替换字节流,例如头100-1024字节进行加密,源文件就无法打开了. 下面上代码吧,加解密是 openss ...

  5. PHP 实现大文件视频推流

    /** * 视频推流 * 返回视频流 */ function bofang(){ set_time_limit(0); ini_set('max_execution_time', 0);//秒为单位, ...

  6. STM32与PS2的无线通信和相关函数介绍

    PS2采用SPI通信协议 源码和参考文件获取:https://github.com/Sound-Sleep/PS2_Based_On_STM32 接收器接口 DI:手柄->主机,时钟的下降沿传送 ...

  7. python 之定时任务(schedule)

    import schedule import time def job(): print("定时通报...") # 定义一个叫job的函数,函数的功能是打印'定时通报...' sc ...

  8. P3Depth: Monocular Depth Estimation with a Piecewise Planarity Prior

    1. 论文简介 论文题目:P3Depth: Monocular Depth Estimation with a Piecewise Planarity Prior Paper地址:paper Code ...

  9. ArcGIS工具 - 导出空数据库

    有时,需要根据已有的成果数据创建一个空的数据库模板文件,用于新的编辑或对外发布.那么,如果又快又好的创建呢?为源GIS为您编写了一个导出空数据库工具,它可以实现"一键"快速导出任意 ...

  10. 交叉编译esp8089

    交叉编译esp8089 编译环境: 硬件:全志R528 ubuntu:Linux ubuntu 4.15.0-194-generic #205-Ubuntu SMP Fri Sep 16 19:49: ...