JZOJ 3448.公路维护
\(\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.公路维护的更多相关文章
- bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树
[Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 93 Solved: 53[Submit][Status][ ...
- (jzoj snow的追寻)线段树维护树的直径
jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...
- 1196: [HNOI2006]公路修建问题 - BZOJ
Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织 ...
- [jzoj]4216.【NOIP2015模拟9.12】平方和
Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...
- [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 输出 ...
- 洛谷 P1111 修复公路(最小生成树)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1111 这道题的关键是读懂题: 首先根据题中的一些扎眼的字眼我们可以判断这是一道用最小生成树来做的题 ...
- 【bzoj3510】首都 LCT维护子树信息(+启发式合并)
题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...
- JZOJ 5922. sequence
5922. [NOIP2018模拟10.23]sequence (File IO): input:sequence.in output:sequence.out Time Limits: 1000 m ...
- JZOJ| 5910. DuLiu
Description LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃圾题目者也,教人半懂不懂的.因为他姓李,别人便从QQ群上的“毒瘤李F ...
- 公路建设 (highway.c/cpp/pas)
2.公路建设 (highway.c/cpp/pas) 在滨海市一共有 n 个城市,编号依次为 1 到 n,它们之间计划修建 m 条双向道路,其中 修建第 i 条道路的费用为 ci. 海霸王作为滨海市公 ...
随机推荐
- 1. PyQt5开发环境的搭建
专栏地址 ʅ(‾◡◝)ʃ 因为我个人使用的是 Linux 还有之前用过Windows 没用过 Mac 所以这里我简单结束 Linux 和 Windows 开发环境的搭建 Windows 开发PyQt5 ...
- JSON提取器中串联一个接口的多个值传给下个接口(compute concatenation var的实际使用场景)
实际场景:某功能在前端支持选择多条数据后点击提交,表现在接口是,一次传了多个Id. 问题:需要将上个接口的多个Id串联,传给提交接口. 处理方式:通过JSON提取器勾选:compute concate ...
- BFS算法套路框架
一.概念 1.定义 Broad First Search 2.与DFS区别 BFS找到的路径最短 3.本质 找出图中从起点到终点的最近距离 二.二叉树的最小高度111 1.代码 /** * Defin ...
- Kubernetes单机创建MySQL+Tomcat演示程序:《Kubernetes权威指南》第一章demo报错踩坑
引言 最近做边缘计算项目,因为没有基础,所以首先学习Kubernetes.感觉系统的中文入门资料比较少,只找到<Kubernetes权威指南>(龚正.吴治辉等著,下称<指南>) ...
- element-ui中table组件的表格嵌套Select,table中使用select
在table组件中,有一个<template slot-scope="scope"></template>,这个模板有一个slot-scope属性,这个属性 ...
- 8、IDEA提交代码出现: Fetch failed fatal: Could not read from remote repository
转载自 第一步.确认Git公钥/密钥是否生成: 1. 首先查看本地是否生成git密钥,一般在C盘home目录下:[C:你自己的home目录\.ssh] 第二步:添加Git密钥: 右键->Git ...
- 工业数据分析为什么要用FusionInsight MRS IoTDB?
摘要:MRS IoTDB,它是华为FusionInsight MRS大数据套件中的时序数据库产品,在深度参与Apache IoTDB社区开源版的基础上推出的高性能企业级时序数据库产品. 本文分享自华为 ...
- cmd窗口中java命令报错。错误:找不到或无法加载主类 java的jdk安装过程中踩过的坑
错误: 找不到或无法加载主类 HelloWorld 遇到这个问题时,我尝试过网上其他人的做法.有试过添加classpath,也有试过删除classpath.但是依然报错,这里javac可以编译通过,说 ...
- [OpenCV实战]44 使用OpenCV进行图像超分放大
图像超分辨率(Image Super Resolution)是指从低分辨率图像或图像序列得到高分辨率图像.图像超分辨率是计算机视觉领域中一个非常重要的研究问题,广泛应用于医学图像分析.生物识别.视频监 ...
- .Net 7 被Microsoft的开源免费PowerToys工具独立附带
楔子 什么是PowerToys? Microsoft PowerToys 是一组实用工具,可帮助高级用户调整和简化其 Windows 体验,从而提高工作效率. 简而言之,就是给最新的windows11 ...