东东的高速之旅 (线段树维护区间最小值)(模拟赛)

线段树----logn时间维护查询区间和/最大值/最小值 线段树是算法竞赛中常用的用来维护 区间信息 的数据结构。线段树可以在 O(\log N) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。 阅读详情

东东的高速之旅(highway.pas/.c/.cpp)
题目描述
一天东东爸 带东东回老家,开车行驶在宽阔的高速公路上。东东思维本来就发散,让他无聊的坐几个小时他一定会无聊的。所以东东爸 就给他准备一道有关高速公路的问题,让他在无聊的旅途中平添些乐趣。
题目是这样的:行驶在高速上的车辆会对高速造成一定的损伤。假设一条高速公路被收费站分成了若干段,整条高速公路有一个耐久度W。如果一辆汽车从s到t,s到t之间的高速公路的耐久度就会减少d。一旦某段公路的耐久度小于或等于0,这段公路就会永久性地毁坏,任何汽车也就无法通过已经毁坏的地方。
有一种维护车从s到t,可以将途中高速公路的耐久度增加r,并且不会造成公路耐久度的降低。虽然有维护车的存在,但是已经毁坏的某段路仍然无法修复。
东东的任务就是统计一下一共有多少辆汽车可以成功通行。
东东拿到题目,异常兴奋,争取在下高速的时候得到答案。但是题目真的太难了,快下高速了,东东还是没有得到结果,急的满头大汗,就给你打了电话,你能帮东东得到正确的结果么?
输入格式
第一行是三个正整数N、M和W。表示高速公路被分成了N段,有M辆车依次通过,整段高速公路的初始的耐久度为W。
以下M行每行描述一辆车,格式如下:
1 s t d:一辆汽车准备通过区间[s,t]。如果区间[s,t]里面有任何一个地方损毁了,这辆汽车就会取消整个通行计划;否则这辆汽车就可以成功通过区间[s,t],并且使这个区间的耐久度减少d。即使通过之后会把某些地方毁坏了也是能够通过的。
2 s t r:一辆维修车通过区间[s,t],为这段公路的耐久度增加r。如果区间[s,t]里面有任何一个地方损毁了,这辆维修车也会取消整个通行计划。
其中对于所有的区间[s,t]:表示从第s段的开始,到达第t段的结尾。
输出格式
输出一个数,表示有多少汽车可以成功通行。
样例输入
3 4 2
2 1 3 3
1 1 2 3
1 2 3 2
1 1 3 1

样例输出
3
数据范围与约定
对于30%的数据 N,M <= 100
对于50%的数据 N,M <= 1000
对于100%的数据 N,M<= 100000
1≤W≤1000,1≤s≤t≤N,1≤d≤1000,1≤r≤1000

本题用lazy标记的线段树去维护数据,即可。需要注意的是维护车辆也是汽车,也要统计到答案中。

program mys;

type
ab=record
l,r,w,c:longint;
end;
var n,m,e,z,s,t,p,i,tot,ans,sum:longint;
f:array[0..1000000]of ab;

procedure built(x,y,i:longint);
var mid:longint;
begin
f[i].l:=x;
f[i].r:=y;
if x=y then
begin
f[i].w:=e;
exit;
end;
mid:=(x+y)div 2;
built(x,mid,i*2);
built(mid+1,y,i*2+1);
if f[i*2].w<=f[i*2+1].w then
f[i].w:=f[i*2].w
else
f[i].w:=f[i*2+1].w;
end;

function pd(x,y,k:longint):boolean;
var mid:longint;
begin
if (f[k].l=x)and(f[k].r=y) then
begin
if f[k].c<>0 then 
begin 
f[k*2].w:=f[k*2].w-f[k].c;
f[k*2].c:=f[k*2].c+f[k].c;
f[k*2+1].w:=f[k*2+1].w-f[k].c;
f[k*2+1].c:=f[k*2+1].c+f[k].c;
f[k].c:=0;
end;
if f[k].w<=0 then exit(false)
else
exit(true);
end;
if f[k].c<>0 then 
begin 
f[k*2].w:=f[k*2].w-f[k].c;
f[k*2].c:=f[k*2].c+f[k].c;
f[k*2+1].w:=f[k*2+1].w-f[k].c;
f[k*2+1].c:=f[k*2+1].c+f[k].c;
f[k].c:=0;
end;
mid:=(f[k].l+f[k].r)div 2;
if y<=mid then exit(pd(x,y,k*2))
else if x>mid then exit(pd(x,y,k*2+1))
else
begin
if pd(x,mid,k*2) and pd(mid+1,y,k*2+1) then
exit(true)
else
exit(false);
end;
if f[k*2].w<=f[k*2+1].w then
f[k].w:=f[k*2].w
else
f[k].w:=f[k*2+1].w;
end;

procedure change(x,y,k:longint);
var mid:longint;
begin
if (f[k].l=x)and(f[k].r=y) then
begin
if f[k].c<>0 then 
begin 
f[k*2].w:=f[k*2].w-f[k].c;
f[k*2].c:=f[k*2].c+f[k].c;
f[k*2+1].w:=f[k*2+1].w-f[k].c;
f[k*2+1].c:=f[k*2+1].c+f[k].c;
f[k].c:=0;
end;
f[k].w:=f[k].w-p;
f[k].c:=f[k].c+p;
exit;
end;
if f[k].c<>0 then
begin
f[k*2].w:=f[k*2].w-f[k].c;
f[k*2].c:=f[k*2].c+f[k].c;
f[k*2+1].w:=f[k*2+1].w-f[k].c;
f[k*2+1].c:=f[k*2+1].c+f[k].c;
f[k].c:=0;
end;
mid:=(f[k].l+f[k].r)div 2;
if y<=mid then change(x,y,k*2)
else if x>mid then change(x,y,k*2+1)
else
begin
change(x,mid,k*2);
change(mid+1,y,k*2+1);
end;
if f[k*2].w<=f[k*2+1].w then
f[k].w:=f[k*2].w
else
f[k].w:=f[k*2+1].w;
end;

begin
assign(input,'highway.in');reset(input);
assign(output,'highway.out');rewrite(output);
readln(n,m,e);
built(1,n,1);
ans:=0;
for i:=1 to m do
begin
readln(z,s,t,p);
if z=2 then p:=-p;
if pd(s,t,1) then
begin
inc(ans);
change(s,t,1);
end;
end;
writeln(ans);
close(input);
close(output);
end.
黑白博弈 | 线段树(维护区间最小值&&最大值) 黑白博弈 题目 分析 代码 题目 题目链接:黑白博弈 分析 首先我们通过读题:单点修改、查询很容易发现这道题可以用线段树解决,既然决定了用线段树解决,那么我们需要确定以下几个要素: 1:使用线段树维护什么? 2:如何通过线段树维护的数据获得我们需要的答案? Question1: 我们需要用利用线段树维护什么? 通过题目要求我们得知在进行查询操作时需要查询的数据是当前白块区间所有连续的白块数量,也就是说只要知道了该白块区间两端的黑块下标,我们就可以通过这两个黑块下标计算得出该区间的白块个数。 那么 阅读详情

相关推荐

深入解析Pytest 底层源码

Pytest 的底层架构是一个基于 pluggy钩子机制的微内核架构。其核心流程是一个固定的链条,链条上的每个环节都通过钩子向外暴露,允许插件介入。这种设计使得 Pytest 极其灵活和强大。启动: 解析配置,加载所有插件(包括核心插件)。收集: 遍历文件系统,发现测试用例,并生成Item对象。执行: 对每个Item,依次执行setup->call->teardown协议。报告: 在整个过程中,通过不同的钩子收集信息,最终生成报告。

monk all the way 617

线段树(区间和,最大值,最小值,区间动态更新查询)

//=========================================== //segment tree //final version //by kevin_samuel(fenice) //本模板为转载模板,后面的注释和主函数的验证为Alei添加 #include #include #include //线段树 using namespace s

No Pain No Gain 7378

极空间NAS小白也能搞定的Gitea部署:Docker+MySQL避坑全记录

本文为极空间NAS用户提供了一份详尽的Gitea私有代码仓库部署指南。针对极空间ARM架构和图形化Docker管理的特殊性,文章重点讲解了如何通过Docker和MySQL容器进行部署,并提供了三种获取兼容镜像的实战策略,特别是利用第三方镜像站转录的方法,帮助小白用户成功搭建并初始化Gitea服务,实现私有Git托管。

weixin_28318011的博客 365

线段树

从简单说起,线段树其实可以理解成一种特殊的二叉树。但是这种二叉树较为平衡,和静态二叉树一样,都是提前已经建立好的树形结构。针对性强,所以效率要高。这里又想到了一句题外话:动态和静态的差别。动态结构较为灵活,但是速度较慢;静态结构节省内存,速度较快。 接着回到线段树上来,线段树是建立在线段的基础上,每个结点都代表了一条线段[a , b]。长度为1的线段成为元线段。非元线段都有两个子结点,左结点

不可不戒 1428

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月14日-Clamshell 拆卸与安装

Clamshell 拆卸与安装。

weixin_46735260的博客 1684

AI计算,为什么要用GPU?

几年后,2012年,神经网络之父杰弗里·辛顿(Geoffrey Hinton)的两个学生——亚历克斯·克里切夫斯基(Alex Krizhevsky)、伊利亚·苏茨克沃(Ilya Sutskever),利用“深度学习+GPU”的方案,提出了深度神经网络AlexNet,将识别成功率从74%提升到85%,一举赢得Image Net挑战赛的冠军。根据形态,GPU可分为独立GPU(dGPU,discrete/dedicated GPU)和集成GPU(iGPU,integrated GPU),也就是常说的独显、集显。

经营范围: CTA、SRRC、CCC、移动、电信、联通入库 1675

Function--线段树维护区间最小值+思维

题目链接:https://cn.vjudge.net/problem/HDU-5875 题目大意 给定一个长度为n的序列,根据上面的公式,求出F(l, r)。 分析 仔细观察后发现,当l==r时,答案是a[l],当l < r时,答案是a[l] % a[l + 1] %...%a[r]。假设一个数x模一个比它大的数,相当于没有模,只有比x小的数才起到了取模的作用。那么我们用线段树维...

黄油^小饼干的博客 586

Nmap的介绍、安装 并进行网络扫描

Nmap概述 Nmap(Network Mapper(网络映射器))是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。 正如大多数被用于网络安全的工具,nmap 也是不少黑客及骇客(又称脚本小子)爱用的工具 。系统管理员可以利用nmap来探测工作环境中未经批准使用的服务器,但是黑客会利用nmap来搜集目标电脑的网络设定,从而计划攻击的方法。

Cheney ' blog 2万+

程序员需要了解线段树--区间求和,最大值,最小值

线段树是一种二叉搜索树,是用来维护区间信息的数据结构。可以在O(logN)的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。接下来我以实现区间求和为例子来讲解线段树(最大值和最小值与求和实现方式几乎无异),假设存在一个数组[1,4,6,3,9]。@Data//区间起始下标//区间结尾下标//当前区间和值。

程序员高级码农的博客 2247

张正友标定法-MATLAB实验

该方法最早由微软研究院的Zhengyou Zhang教授提出,1998年发表在IEEE TRANSACTIONS ON PATTERNANALYSIS AND MACHINE INTELLIGENCE,论文题目为:AFlexible New Technique for Camera Calibration。 (一)标定平面到图像平面的单应性 单应性(homography):在计算机视觉中被定义

qq_37845624的博客 8288

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

我是,今天我给大家分享一个关于RSA的题目,带大家领略的魅力。今天开始前,我们先学习一下。

m0_62102520的博客 849

HDU6315(线段树维护区间最小值和区间求和)

题意 给定一个初始数组b和一个初始值全部为0的数组a,每次操作可以在给定的区间(l,r)内让a[i](l=&lt;i&lt;=r)加一,或者查询区间区间(l,r)中a[i]/b[i](l=&lt;i&lt;=r)(向下取整取整)的和。 题解 a[i]/b[i]向下取整,那么a[i]每次加1,a[i]加b[i]次就对总和的贡献加1。那么我们维护一个b数组最小值,每次更新区间最小值tree[rt...

QiHang的博客 928

Tmux学习总结

Tmux 重要概念 使用 Tmux 的时候千万不要去背指令,所有的指令都可以在 .tmux.conf 配置文件中绑定自己顺手的快捷键,也可以配置开启鼠标。 这个是我的配置文件:https://github.com/zuorn/tmux.conf 在Tmux逻辑中,需要分清楚Server > Session > Window > Pane这个大小和层级顺序是极其重要的,直接关系到工作效率: Server:是整个tmux的后台服务。有时候更改配置不生效,就要使用tmux kill-

满目星辰 577

线段树(维护区间最大最小值) 模板

const int MAX_LEN = ; int seg_tree[MAX_LEN << 2]; int Lazy[MAX_LEN << 2]; int arr[MAX_LEN]; //从下往上更新 节点 void push_up (int root) { seg_tree[root] = max(seg_tree[root << 1], seg_tre...

Harington的博客 1259

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【线段树-维护区间最小值和区间和】2021 ICPC网络赛第一场 D: Edge of Taixuan

Problem D: Edge of Taixuan 评测传送门 (ps: 评测时需要先花费一个币买下题目集后方可进行提交并评测。) 题目大意: 给出 nnn个结点,mmm次操作,每次操作给出一个区间 [l,r][l,r][l,r],和一个权值www,建立 lll 到 rrr 的完全图,边权均是 www。 计算出 “所有边的权值之和” 减去 “包含 nnn 个结点的最小生成树的权值”为最终所求答案,若无法构成最小生成树,输出指定字符串即可。 解题思路: 对于“所有边的权值之和”很容易就能求出来,简单画

小明的博客 585

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

线段树基础(详细)

详细的讲解线段树的基础

q17312319193的博客 619

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Yet Another Bracket Sequence(线段树区间维护最小值)

*** 题目链接:https://ac.nowcoder.com/acm/contest/5795/L 思路: 把(变为+1,)变为-1; 假设在i点发生变化: (1)总和一定发生变化,所以判断sum(1……n) == 0 ? (2)对于区间和,只有起点在i前面终点在i后面的区间的值发生了变化,所以只考虑发生变化的值; 利用线段树,每次经过修改区间,判断被修改的区间发生的变化; 如果是+2,结果肯定是个正数,如果是-2,就要判断前面有没有(括号可以匹配,如果没有可以匹配的可能出现了负数.

积少成多,水滴石穿 444

【线段树】 求区间最小值以及区间最小值

//这是第一个模板#include #define MAX 65535 #define INFINITY 65535 #define min(a,b) a<b?a:b struct Node { int val; }segtree[MAX]; void buildtree(int root, int arr[],int istart,int iend ) { if(istart==iend)

huihui1094667985的博客 1856

线段树处理区间最小值(python实现)

给定一个正整数 k,请问对于每一个 1 到 n 之间的序号 i,a[i-k], a[i-k+1], …对于 50% 的评测用例,1 <= n <= 10000,1 <= a[i] <= 10000。对于所有评测用例,1 <= n <= 1000000,1 <= a[i] <= 1000000。对于 30% 的评测用例,1 <= n <= 1000,1 <= a[i] <= 1000。第二行包含 n 个整数,分别表示 a[1], a[2], …小蓝有一个序列 a[1], a[2], …

qq_65838372的博客 548

【线段树】单点修改&区间求和&区间求最大值&区间求最小值

*对于线段树,怎么说呢,就是直接套板子就得了,关键一点就是,细心点不要把板子都写错了,接下来我给出几道线段树题解 * 文章目录一:不加修改的区间求最值二:单点修改求区间求最值三:单点修改区间求和四:区间修改,区间求最值五:区间修改,区间就和 一:不加修改的区间求最值 题目1:UPC Contest1461 - 数据结构 G题 数列区间最大值 传送门 问题描述: 输入一串数字,给你M个询问,每次询...

小明的博客 3624

线段树应用(建树、区间查询之最小值)

【程序代码】 #include<bits/stdc++.h> using namespace std; const int maxn=100001; int n,m,L,R,a[maxn],segMin[maxn*4];//线段树数组要开大4倍 void build(int cur,int L,int R) {//cur表示区间[L,R]的标号 if(L==R) segMin...

hnjzsyjyj的专栏 472

高级数据结构之线段树,区间求和,最大值最小值

高级数据结构,线段树,区间操作

haruakagasukida的博客 875

高级数据结构:线段树入门(c++实现 + 详解)

线段树是一种高级数据结构,与树状数组一样,被用来处理区间查询,修改问题,并且线段树的最大优点是对动态数据的处理十分高效。关于树状数组,可以看我这篇博文的介绍: 高级数据结构:树状数组详解来看看线段树能处理的问题:线段树是具有以下形态的二叉树,其中树上的每个节点都是一个线段区间 。看图可以发现线段树的几个特征:这颗二叉树是采用分治法来划分区间,并且构建子树的,左右子树各一半。这颗二叉树的每个节点都是一个线段区间,非叶子节点的线段区间是一段不相等的区间,叶子节点的线段区间的只包含一个元素。这颗二叉树是一颗完全二

ylh的博客 7141

求m区间内的最小值(线段树)

一个含有n项的数列,求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。

陈进士学习的博客 1019

线段树--区间求和,最大值,最小值

线段是图文讲解,简单实现

Caroling0的博客 2439

【自用】线段树 区间最小值

参考http://www.cnblogs.com/TenosDoIt/p/3453089.html概述是一种平衡二叉树,在每个节点保存一条线段(一个数组区间),主要用于高效解决连续区间的动态查询,基本能保持每个操作的复杂度为O(logn)。例子问题描述:从数组arr[0…n-1]中查找某个区间内的最小值,其中数组大小固定,但是数组中的元素的值随时可以更新。 最简单的解法:遍历数组区间找到最小值

各种问题卡住我 2410
上一篇: 东东的软件项目 (二分+动规)(模拟赛)
下一篇: 东东的舞会 (小根堆)
CodeOnce
博客等级 码龄10年 3粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值