#C. gsy 的浇水计划(线段树+dp)

news/2023/11/30 23:47:54

题目


思路

考的知识点是线段树+dp

我们可以按照dp 4步法来一步步推导、

1.dp定义

dp[i]代表[1,i]区间被给出线段覆盖最小花费

2.状态转移方程

根据dp定义可得当枚举到第x条线,区间为[Lx,Rx],花费为Vx

dp[Rx]=min(dp[i](i = (Lx - 1) ~ Rx))+Vx

因为当想要覆盖[1,Rx]的区间就必须在覆盖[1,Lx - 1]/[1,Lx]……/[1,Rx]的基础上再加上第x条线段

覆盖[1,Lx - 1]/[1,Lx]……/[1,Rx]最小花费就是(dp[i](i = (Lx - 1) ~ Rx),再加上第x条线段的花费是Vx

画个图来理解:

这个时候会有个问题:在这里我们要求min(dp[i](i = (Lx - 1) ~ Rx),可是如果暴力枚举找min的话时间复杂度O(n*m)会超时,那该怎么办呢?我们可以用线段树(详见详解线段树)来实现查找区间最小值单点更新(dp在变)的效果。

3.初始化

一个是dp一开始要是无穷大,一个是minv(线段树的那个)也要初始化为无穷大,另外储存线段的数组也要以r从大到小排序(这样才能保证后续枚举线段时dp[i](i = (Lx - 1) ~ Rx是最优的)

4.遍历顺序

显然就是以下标顺序枚举所有线段。


代码

#include <bits/stdc++.h>
#define int long long
#define maxn 300000
using namespace std;
int n,m,dp[5000000],minv[5000000];
struct shui
{int l,r,v;
} a[5000000];
bool cmp(shui x,shui y)
{return x.r < y.r;
}
int find(int id,int l,int r,int x,int y)//查找[x,y]区间内的最小值
{if(x <= l && r <= y) return minv[id];int mid = (l + r) / 2,ans = INT_MAX;if(x <= mid) ans = min(ans,find(id * 2,l,mid,x,y));if(y > mid) ans = min(ans,find(id * 2 + 1,mid + 1,r,x,y));return ans;
}
void gexi(int id,int l,int r,int x,int v)//将编号为x的节点的值更改为v
{if(l == r){minv[id] = v;return ;}int mid = (l + r) / 2;if(x <= mid) gexi(id * 2,l,mid,x,v);else gexi(id * 2 + 1,mid + 1,r,x,v);minv[id] = min(minv[id * 2],minv[id * 2 + 1]);
}
signed main()
{scanf("%lld%lld",&n,&m);for(int i = 1; i <= n; i++) scanf("%lld%lld%lld",&a[i].l,&a[i].r,&a[i].v);memset(dp,0x3f,sizeof(dp));memset(minv,0x3f,sizeof(minv));//minv对应的是dpsort(a + 1,a + 1 + n,cmp);for(int i = 1; i <= n; i++){if(a[i].l == 1){if(dp[a[i].r] > a[i].v){dp[a[i].r] = a[i].v;gexi(1,1,maxn,a[i].r,a[i].v);}}else{int t = find(1,1,maxn,a[i].l - 1,a[i].r);if(dp[a[i].r] > (t + a[i].v)){dp[a[i].r] = t + a[i].v;gexi(1,1,maxn,a[i].r,dp[a[i].r]);}}}printf("%lld",dp[m]);return 0;
}

http://www.ppmy.cn/news/22645.html

相关文章

一文带你熟悉内核调试工具 --Ftrace

&#x1f446;&#x1f440;前言Ftrace是一个内部跟踪程序&#xff0c;旨在帮助软件开发人员和系统的设计者去发现内核内部发生了什么。它可以用于调试或分析延迟和发生在用户空间之外的性能问题。ftrace通常被认为是函数跟踪程序&#xff0c;但它实际上是由几个不同的跟踪实用…

SpringBoot第三讲

三、SpringBootMybatisPlusVue增删改查 3.1 查询 后台查询代码&#xff1a; RestController RequestMapping("/t-user") public class TUserController { ​Resourceprivate ITUserService itUserService; ​/*** 查询所有的数据*/GetMappingpublic Result getAll…

一文弄懂Docker基本使用

文章目录初识Docker什么是Docker应用部署的环境问题Docker解决依赖兼容问题Docker解决操作系统环境差异小结Docker和虚拟机的区别Docker架构镜像和容器DockerHubDocker架构小结安装DockerDocker的基本操作镜像操作镜像名称镜像命令案例-拉取、查看镜像案例-保存、导入镜像容器操…

【每日一题Day108】LC1798你能构造出连续值的最大数目 | 贪心

你能构造出连续值的最大数目【LC1798】 You are given an integer array coins of length n which represents the n coins that you own. The value of the ith coin is coins[i]. You can make some value x if you can choose some of your n coins such that their values …

testbench常用语句

与可综合Verilog代码所不同的是&#xff0c;testbench Verilog是在计算机主机上的仿真器中执行的。testbench Verilog的许多构造与C语言相似&#xff0c;我们可在代码中包括复杂的语言结构和顺序语句的算法。 1 always块和initial块 Verilog有两种进程语句&#xff1a;always…

Python爬虫教你爬取视频信息

大家好&#xff0c;我是拉斯&#xff0c;今天分享一个爬取某音视频的一个小案例&#xff0c;大家一起学习 目录前言基本环境配置爬取目标视频获取视频链接1.查看网页源代码2.抓包工具捕捉下载视频(以mp4格式进行保存)获取其他信息并打印(作者名&#xff0c;作品名&#xff0c;…

Go异步任务解决方案 Asynq

今天为大家介绍一个Go处理异步任务的解决方案&#xff1a;Asynq&#xff0c;是一个 Go 库&#xff0c;用于排队任务并与 worker 异步处理它们。它由Redis提供支持&#xff0c;旨在实现可扩展且易于上手。 一、概述 Asynq 是一个 Go 库&#xff0c;用于对任务进行排队并与工作人…

软件测试-python-UnitTest-笔记

UnitTestunittest是Python单元测试框架&#xff0c;类似于JUnit框架。unittest中有4个重要的概念&#xff1a;test fixture, test case, test suite, test runnerTestcase&#xff1a;一个TestCase的实例就是一个测试用例。什么是测试用例呢&#xff1f;就是一个完整的测试流程…

RPC框架整体架构

RPC就是把拦截到的方法参数&#xff0c;转成可以在网络中传输的二进制&#xff0c;并保证在服务提供方能正确地还原出语义&#xff0c;最终实现像调用本地一样地调用远程的目的。 1 RPC架构 RPC本质是远程调用&#xff0c;就要通过网络来传输数据。考虑到可靠性&#xff0c;一…

决策树算法分析天气、周末和促销活动对销量的影响

决策树算法分析天气、周末和促销活动对销量的影响 作者&#xff1a;AOAIYI 创作不易&#xff0c;觉得文章不错或能帮助到你&#xff0c;点赞收藏评论一下哦 文章目录决策树算法分析天气、周末和促销活动对销量的影响一、实验目的二、实验原理三、实验环境四、实验内容五、实验步…

QT+ OpenGL 变换

文章目录QT OpenGL变换向量的运算矩阵矩阵与向量相乘代码实现QT OpenGL 本篇完整工程见gitee:QTOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主。 变换 我们需要改变物体的位置 现有解决办法&#xff08;每一帧&#xff0c…

YB菜菜的机器学习自学之路(八)——基于keras的初级深度学习框架

YB菜菜的机器学习自学之路&#xff08;八&#xff09;——基于keras的初级深度学习框架前提说明1. 训练集和测试集2. mnist数据集简单介绍3.基于keras框架&#xff0c;利用全链接层搭建深度学习网络对MNIST训练3.1 数据导入与one-hot编码3.2 创建模型3.3创建神经元3.3.1 输入层…

产品原型不应该有过多的视觉设计元素

​写在前面&#xff1a; 日常中会接触较多的学习产品经理知识的小伙伴&#xff0c;学习是为从事这个岗位或者技能提升做准备。在与小伙伴接触的过程中发现&#xff0c;有小部分人的观点是产品原型不重要&#xff0c;甚至可以不学不做。 作为产品经理&#xff0c;产品原型制作是…

ubuntu16.04下安装离线jdk1.8

下载 jdk1.8安装包&#xff08;地址&#xff1a;Java Downloads | Oracle&#xff09;[ubuntu] 在/usr/local 目录下使用root账号执行以下命令(使用root账号&#xff0c;也可以使用普通账号<sudo>)&#xff1a;(1) 创建目录&#xff1a;mkdir java (将jdk离线包上传到该目…

理解矩阵二

接着理解矩阵。上一篇里说“矩阵是运动的描述”&#xff0c;到现在为止&#xff0c;好像大家都还没什么意见。但是我相信早晚会有数学系出身的网友来拍板转。因为运动这个概念&#xff0c;在数学和物理里是跟微积分联系在一起的。我们学习微积分的时候&#xff0c;总会有人照本…

嵌入式系统的概述、特点和发展阶段

嵌入式系统是由软件和硬件组成的能够独立运行的系统&#xff0c;硬件包括传感器、转换处理器、存储器、执行器和IO接口等&#xff0c;可以辅助、监控和控制机器设备运行&#xff0c;软件包括软件层、系统层和中间层&#xff0c;用于软件运行环境和操作系统。 下面详细的给大家介…

pc 和手机调用摄像头拍照 获取照片 好用

前端何如在代码中使用摄像头拍照功能 demo 部署服务器可以测试 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&quo…

工民建专业职称申报条件

工民建砖业&#xff0c;是工业与民用建筑砖业&#xff0c;是中等职业学校砖业目录的一门土建施工类砖业&#xff0c;主要在中砖以及开设中砖砖业的学校开设。工业与民用建筑主要为建筑施工企业、安装单位、设计单位、业主、监理等单位及各及管理部门培养从事施工及术、工程项目…

透彻解析VS联合Qt贪吃蛇游戏(界面用代码实现)

1、项目目的&#xff1a; 本项目主要通过编写贪吃蛇游戏来学习&#xff0c;熟悉Qt中封装的类&#xff0c;以及Qt Desginer的使用&#xff0c;所以本篇博客会用代码写界面完成贪吃蛇的设计&#xff0c;以此来熟悉Qt中封装的类&#xff0c;然后在另一篇博客利用Qt Desginer来设计…

freertos学习之路3-freertos的任务调度

写在最前 由于工作需要&#xff0c;需要开始学习freertos的相关知识&#xff0c;本专题主要记录freertos的相关内容 参考&#xff1a; https://www.bilibili.com/video/BV19g411p7UT 正点原子视频 1. 任务调度状态 1.1 四种调度状态 如上图&#xff0c;freertos总共有4种状态 …
最新文章