【CF115E】Linear Kingdom Races 题解(线段树优化DP)
前言:前辈讲课时设的状态还是有些繁琐,感觉题解设的状态更简洁。
--------------
题目大意:给定$n$条道路和$m$场比赛,每个道路修建需要$c_i$,每场比赛需要使用$[l_i,r_i]$内的道路,收益为$p_i$。问最大收益。$n,m\leq 200000$
先将所有的区间右端点从小到大排序。
设$f[i][j]$表示已经考虑前$i$条道路,最右边没有修的道路是$j$。现在考虑转移。
如果不修第$i$条道路,那么最右边的没有修的道路就变成$i$了。有这样的方程$f[i][i]=max(f[i][i],f[i-1][j]) (0\leq j\leq i-1)$
如果修第$i$条道路,那么以$i$为右端点的比赛都能获得收益。有$f[i][j]=f[i-1][j]+p(0\leq j\leq l_i-1)$。但是不要忘记修路的费用,即$f[i][j]=f[i-1][j]-cost[i](0\leq j\leq i-1)$。
这样的转移是$O(n^2)$的,还不够优秀。注意到只需要维护区间最大值和序列和,我们可以用线段树来维护,只用维护懒标记,区间加和区间最大值这三个操作即可。
至于以右端点进行关键字排序,可以开一个$vector$数组来存左端点和值。
时间复杂度$O(n\log n)$。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
struct Node
{
int first,second;
};
vector<Node> a[];
struct node
{
int lazy,a,max;
}tree[];
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void pushdown(int index)
{
tree[index*].lazy+=tree[index].lazy;
tree[index*+].lazy+=tree[index].lazy;
tree[index*].max+=tree[index].lazy;
tree[index*+].max+=tree[index].lazy;
tree[index].lazy=;
}
inline void update(int index,int l,int r,int ql,int qr,int x)
{
if (ql<=l&&r<=qr) {tree[index].lazy+=x;tree[index].max+=x;return;}
if (tree[index].lazy) pushdown(index);
int mid=(l+r)/;
if (ql<=mid) update(index*,l,mid,ql,qr,x);
if (qr>mid) update(index*+,mid+,r,ql,qr,x);
tree[index].max=max(tree[index*].max,tree[index*+].max);
}
inline int query(int index,int l,int r,int ql,int qr)
{
if (ql<=l&&r<=qr) return tree[index].max;
if (tree[index].lazy) pushdown(index);
int mid=(l+r)/,res=;
if (ql<=mid) res=max(res,query(index*,l,mid,ql,qr));
if (qr>mid) res=max(res,query(index*+,mid+,r,ql,qr));
return res;
}
signed main()
{
n=read(),m=read();
for (int i=;i<=n;i++) tree[i].a=read();
for (int i=;i<=m;i++)
{
int l=read(),r=read(),x=read();
a[r].push_back((Node){l,x});
}
for (int i=;i<=n;i++)
{
//f[i][i]=max(f[i][i],f[i-1][j])
update(,,n,i,i,query(,,n,,i-));
//f[i][j]=f[i-1][j]+p-cost;
for (int j=;j<a[i].size();j++) update(,,n,,a[i][j].first-,a[i][j].second);
update(,,n,,i-,-tree[i].a);
}
printf("%lld",tree[].max);
return ;
}
【CF115E】Linear Kingdom Races 题解(线段树优化DP)的更多相关文章
- 理想乡题解 (线段树优化dp)
		
题面 思路概述 首先,不难想到本题可以用动态规划来解,这里就省略是如何想到动态规划的了. 转移方程 f[i]=min(f[j]+1)(max(i-m,0)<=j<i 且j符合士兵限定) 注 ...
 - [CF115E]Linear Kingdom Races
		
[CF115E]Linear Kingdom Races 题目大意: 有\(n(n\le10^5)\)个物品,编号为\(1\sim n\).选取第\(i\)个物品需要\(c_i\)的代价.另外有\(m ...
 - Codeforces Round #426 (Div. 2)  D  线段树优化dp
		
D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
 - 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch  动态开点线段树优化dp
		
题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...
 - BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】
		
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...
 - [AGC011F] Train Service Planning [线段树优化dp+思维]
		
思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...
 - POJ 2376 Cleaning Shifts (线段树优化DP)
		
题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...
 - 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$
		
正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...
 - D - The Bakery CodeForces - 834D  线段树优化dp···
		
D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...
 - 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点
		
容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...
 
随机推荐
- day29 作业
			
1.引入属性访问控制+property 2.引入继承与派生的概念来减少代码冗余 注意:要满足什么"是"什么的关系,不满足"是"的关系不要去继承 import u ...
 - cmder安装(window下好用的终端)
			
cmder下载地址:cmder官网 安装步骤: 下载cmder(cmder官网)并解压缩 配置环境变量 先配置CMDER_HOME(cmder.exe所在目录) 配置path:%CMDER_HOME% ...
 - 解决alert在ios版微信中显示url的问题(重写alert)
			
为了解决alert在ios版微信中显示url的问题 window.alert = function(name){ var iframe = document.createElement("I ...
 - 数据分析05 /pandas的高级操作
			
数据分析05 /pandas的高级操作 目录 数据分析05 /pandas的高级操作 1. 替换操作 2. 映射操作 3. 运算工具 4. 映射索引 / 更改之前索引 5. 排序实现的随机抽样/打乱表 ...
 - 数据可视化实例(三): 散点图(pandas,matplotlib,numpy)
			
关联 (Correlation) 关联图表用于可视化2个或更多变量之间的关系. 也就是说,一个变量如何相对于另一个变化. 散点图(Scatter plot) 散点图是用于研究两个变量之间关系的经典的和 ...
 - hihoCoder 1040 矩阵判断 最详细的解题报告
			
题目来源:矩阵判断 解题思路: 1.判断矩阵的4个点是否相连,一共输入8个点,只要判断是否4个点是否都经过2遍: 2.判断矩阵中任意一条边与其他边之间要么平行,要么垂直.设A(x1,y1),B(x2, ...
 - Tomcat的基本使用及相关知识的概述(超详细版)
			
絮絮叨叨: 在深入了解Tomcat源码之前,本来是想亲自写一篇Tomcat的基本使用教程的,在网上兜兜转转发现了这篇博客:https://blog.csdn.net/weixin_40396459/a ...
 - bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
			
bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...
 - 怎样从gitHub上面拉项目
			
1.注册 https://gitee.com/oschina 2.拿到代码在gitHub上的地址 3.打开eclipse-->import https://git.oschina.net/cai ...
 - 关于 iframe 的小问题若干
			
我们知道,iframe在传统的MVC项目里是个很常用的东西. 但这玩意用起来有时会有点烦人. 比如说:我有个一个页面套了一个iframe,iframe里面的页面通过a标签来切换.怎么做? <li ...