P4644 Cleaning Shifts S (线段树+动态规划)

题目传送门

题意简介

使用 \(n\) 个 \([L,R]\) 的区间完全覆盖 \([M,E]\) 的线段,求使用区间最小花费和

思路

考虑 \(dp_i\) 表示覆盖 \([M,i]\) 的最小花费,将区间按照右端点升序排列后,对于第 \(k\) 条区间, \(dp_{R[k]}\) = \(min\) \((\)\(dp_x\)\()\) \(+\) \(Cost_i\),其中 \(x\) \(\in\) \([L_i,R_i]\) ,使用线段树维护区间最小值,每次求得 \(R_i\) 上的 \(dp\) 值后进行修改

Code

#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=9e4+5;
const int M=1e4+5;
struct Data
{
int st,ed;
long long cost;
}cow[M];
int n,L,R;
long long dp[N];
struct SegmentTree
{
struct node
{
int l,r;
long long minn;
}Tree[N<<2];
long long lazy[N<<2];
void pushup(int k)
{
Tree[k].minn=min(Tree[k<<1].minn,Tree[k<<1|1].minn);
}
void pushdown(int k)
{
if(!lazy[k]) return;
lazy[k<<1]=lazy[k];
Tree[k<<1].minn=lazy[k];
lazy[k<<1|1]=lazy[k];
Tree[k<<1|1].minn=lazy[k];
lazy[k]=0;
}
void buildtree(int k,int L,int R)
{
Tree[k].l=L,Tree[k].r=R;
if(L==R)
{
Tree[k].minn=dp[L];
return;
}
int Mid=(L+R)>>1;
buildtree(k<<1,L,Mid);
buildtree(k<<1|1,Mid+1,R);
pushup(k);
}
void modify(int k,int L,int R,long long val)
{
if(L<=Tree[k].l&&Tree[k].r<=R)
{
Tree[k].minn=val;
lazy[k]=val;
return;
}
pushdown(k);
if(L<=Tree[k<<1].r)
modify(k<<1,L,R,val);
if(R>=Tree[k<<1|1].l)
modify(k<<1|1,L,R,val);
pushup(k);
}
long long query(int k,int L,int R)
{
if(L<=Tree[k].l&&Tree[k].r<=R)
return Tree[k].minn;
long long res=0x3f3f3f3f3f3f3f3f;
if(L<=Tree[k<<1].r)
res=min(res,query(k<<1,L,R));
if(R>=Tree[k<<1|1].l)
res=min(res,query(k<<1|1,L,R));
return res;
}
}Segment;
bool cmp(Data x,Data y)
{
return x.ed<y.ed;
}
int main()
{
IOS;
cin>>n>>L>>R;
for(int i=1;i<=n;i++)
cin>>cow[i].st>>cow[i].ed>>cow[i].cost;
sort(cow+1,cow+n+1,cmp);
for(int i=0;i<N;i++)
dp[i]=0x3f3f3f3f3f3f3f3f;
dp[L-1]=0;//注意不能直接将起点处赋值为0
Segment.buildtree(1,L-1,R);
for(int i=1;i<=n;i++)
{
dp[cow[i].ed]=min(dp[cow[i].ed],Segment.query(1,cow[i].st-1,cow[i].ed)+cow[i].cost);
Segment.modify(1,cow[i].ed,cow[i].ed,dp[cow[i].ed]);
}
cout<<(Segment.query(1,R,R)>=0x3f3f3f3f3f3f3f3f?-1:Segment.query(1,R,R))<<'\n';
return 0;
}

完结撒花~

P4644 Cleaning Shifts S (线段树+动态规划)的更多相关文章

  1. poj3171 Cleaning Shifts【线段树(单点修改区间查询)】【DP】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4422   Accepted: 1482 D ...

  2. poj2376 Cleaning Shifts【线段树】【DP】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32561   Accepted: 7972 ...

  3. BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树

    BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树 题意:  约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群 ...

  4. 【UVA】12299-RMQ with Shifts(线段树)

    改动的时候因为数据非常小,所以能够直接暴力改动,查询的时候利用线段树即可了. 14337858 option=com_onlinejudge&Itemid=8&page=show_pr ...

  5. POJ 2374 Fence Obstacle Course(线段树+动态规划)

    Fence Obstacle Course Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2524   Accepted:  ...

  6. Codeforces 675E Trains and Statistic - 线段树 - 动态规划

    题目传送门 快速的vjudge通道 快速的Codeforces通道 题目大意 有$n$个火车站,第$i$个火车站出售第$i + 1$到第$a_{i}$个火车站的车票,特殊地,第$n$个火车站不出售车票 ...

  7. Codeforces 750E New Year and Old Subsequence - 线段树 - 动态规划

    A string t is called nice if a string "2017" occurs in t as a subsequence but a string &qu ...

  8. 2018.09.12 poj2376Cleaning Shifts(线段树+简单dp)

    传送门 貌似贪心能过啊%%%. 本蒟蒻写的线段树优化dp. 式子很好推啊. f[i]表示覆盖1~i所需的最小代价. 那么显然对于一个区间[li,ri]" role="present ...

  9. ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...

  10. NYOJ-568/1012//UVA-12299RMQ with Shifts,线段树单点更新+区间查询

    RMQ with Shifts 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 ->  Link1  <- -> Link2  <- 以上两题题意是一样 ...

随机推荐

  1. PCA(Principal Components Analysis)主成分分析: 坐标基 + 基变换 + 一维列向量坐标的变换: 左乘变换矩阵 而 一维行向量的坐标系基元的变换 是 右乘变换矩阵

    https://zhuanlan.zhihu.com/p/661060377 总结: 坐标与坐标系(基向量组=变换矩阵)是成对出现.同一点在不同坐标系的坐标的变换,要有统一的"世界坐标系&q ...

  2. SciTech-BigDataAIML-LLM-PE(Positional Encoding)位置编码: Absolute(绝对)Position + Relative(相对)Position + Rotate(旋转)Position

    SciTech-BigDataAIML-LLM PE(Positional Encoding)位置编码: BOW(Bag of Words)词袋模型:丢弃Word位置信息, 只统计Word之间的 Co ...

  3. FreeSwitch Hangup-Cause电话挂断原因速查

    Freeswitch官网太慢了,经常还打不开,把电话挂断原因大全复制一份到这里,方便日常查看 ITU-T Q.850 Code SIP Equiv. Enumeration Cause Descrip ...

  4. linux把文件压缩成.tar.gz的命令&各个压缩解压命令大全--九五小庞

    针对LINUX中解压和压缩的命令,一直以来使用都模糊不清,今天在此进行整理 01-.tar格式 解包:[*******]$ tar xvf FileName.tar 打包:[*******]$ tar ...

  5. STL学习注意点

    STL六大组件:容器.算法.迭代器.仿函数.适配器(配接器).空间配置器 其中,容器:各种数据结构,如vector.list.deque.set.map等,用来存放数据:容器又分为序列式容器和关联式容 ...

  6. Windows10纯净版打不开组策略编辑器的问题

    有雨林木风系统用户反馈说,在安装的win10纯净版电脑系统里面,打开系统的组策略编辑器时,会出现无法打开或者找不到文件的问题.有什么办法解决呢?接下来, 雨林木风小编就来分享详细的处理办法.大家一起来 ...

  7. SpringBoot中使用TOTP实现MFA(多因素认证)

    一.MFA简介 定义:多因素认证(MFA)要求用户在登录时提供​​至少两种不同类别​​的身份验证因子,以提升账户安全性 核心目标:解决单一密码认证的脆弱性(如暴力破解.钓鱼攻击),将账户被盗风险降低​ ...

  8. JavaScript系列之事件冒泡机制简介

    JavaScript系列之事件冒泡机制 DOM事件流(event flow )存在三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段,事件冒泡顺序是由内到外进行事件传播,事件冒泡是由IE开发团队提出来 ...

  9. 【攻防世界】simple_transfer

    1. 首先下载附件,解压出来之后得到的是一个pcap文件,是一种网络数据包捕获文件,直接丢进wireshark. 2. 先从关键字flag作为突破口进行查询,得到如下搜索结果. 3. 然后右键该数据包 ...

  10. 基于jquery的countdown插件实现毫秒倒计时

    原版的jQuery组件只支持到秒级,现做了改动,已经支持到毫秒级,改完以后的js代码如下 /** * 倒计时插件 * @author Tungse * @param dayTag 显示天数的html ...