[Codeforces 115E]Linear Kingdom Races
题目大意:
有n块地,初始是荒地。你可以把某些荒地开垦(需要花费相应的价值\(a_i\)(正整数)),然后这些荒地就可以种田。
现在有m年,每年要在l到r区间内种田,获得p(正整数)的价值(必须保证l~r都已经开荒,否则不能种田)。
问最大收益。
解题思路:
DP。
设F[i][j]表示前i块地,最后有连续的j块地已开荒的最大收益。
则\(F[i+1][0]=max\{F[i][j]\}\)。不开荒,则中间断了,所以连续的值只有0了。
F[i+1][j+1]=F[i][j]-a[i]+v。开荒,则花费价值,而且可能会有一些年份可以种田了,则加上这些收益(v是加上后能多出来的种田收益)。
于是我们要记录下以每个值作为右端点的种田个数。
答案即为\(max\{F[n][i]\}\)
发现这是个时空复杂度都是\(O(n^2)\)的东西。
首先第一维可以滚掉。
然后,考虑每个\(a[i]\)都要在整个区间减一遍,而每年种田的价值也会对一段区间有影响。
所以考虑线段树优化。
线段树每个节点记录这个节点下面的儿子的状态的最优值。
然后发现枚举i时,之前的状态都要向右偏移一格,非常麻烦。
倒着建状态就好辣~喵~o( =∩ω∩= )m
C++ Code:
#include<bits/stdc++.h>
using namespace std;
using LoveLive=long long;
const int N=2e5+5;
LoveLive d[N*4],tag[N*4],a[N];
int n,m,L,R;
LoveLive add;
vector<pair<int,LoveLive>>v[N];
inline LoveLive max(LoveLive&a,LoveLive&b){return a>b?a:b;}
inline void pd(int&o){
if(tag[o]){
int l=o<<1,r=l|1;
d[l]+=tag[o];
d[r]+=tag[o];
tag[l]+=tag[o];
tag[r]+=tag[o];
tag[o]=0;
}
}
void add_1(int l,int r,int o){
if(l==r)d[o]+=add;else{
pd(o);
int mid=l+r>>1;
if(L<=mid)add_1(l,mid,o<<1);else
add_1(mid+1,r,o<<1|1);
d[o]=max(d[o<<1],d[o<<1|1]);
}
}
void add_lot(int l,int r,int o){
if(L<=l&&r<=R)d[o]+=add,tag[o]+=add;else{
int mid=l+r>>1;
pd(o);
if(L<=mid)add_lot(l,mid,o<<1);
if(mid<R)add_lot(mid+1,r,o<<1|1);
d[o]=max(d[o<<1],d[o<<1|1]);
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[i];
for(int i=1,l,r;i<=m;++i){
cin>>l>>r>>add;
v[r].push_back(make_pair(l,add));
}
for(int i=1;i<=n;++i){
L=n-i,add=d[1];
add_1(0,n,1);
++L,R=n,add=-a[i];
add_lot(0,n,1);
for(auto it:v[i]){
L=n-it.first+1,R=n,add=it.second;
add_lot(0,n,1);
}
}
cout<<d[1]<<endl;
return 0;
}
[Codeforces 115E]Linear Kingdom Races的更多相关文章
- [CF115E]Linear Kingdom Races
[CF115E]Linear Kingdom Races 题目大意: 有\(n(n\le10^5)\)个物品,编号为\(1\sim n\).选取第\(i\)个物品需要\(c_i\)的代价.另外有\(m ...
- Linear Kingdom Races CodeForces - 115E (线段树优化dp)
大意: n条赛道, 初始全坏, 修复第$i$条花费$a_i$, m场比赛, 第$i$场比赛需要占用$[l_i,r_i]$的所有赛道, 收益为$w_i$, 求一个比赛方案使得收益最大. 设$dp[i]$ ...
- CodeForces - 115E:Linear Kingdom Races (DP+线段树+lazy)
pro: 从左到有有N个车道,都有一定程度损坏,所以有不同的修理费a[]: 有M场比赛,每场比赛的场地是[Li,Ri],即如果这个区间的车道都被修理好,则可以举办这个比赛,并且收益是Pi.问最多得到多 ...
- 【CF115E】Linear Kingdom Races 题解(线段树优化DP)
前言:前辈讲课时设的状态还是有些繁琐,感觉题解设的状态更简洁. -------------- 题目链接 题目大意:给定$n$条道路和$m$场比赛,每个道路修建需要$c_i$,每场比赛需要使用$[l_i ...
- codeforces 613D:Kingdom and its Cities
Description Meanwhile, the kingdom of K is getting ready for the marriage of the King's daughter. Ho ...
- CodeForces - 687D: Dividing Kingdom II (二分图&带权并查集)
Long time ago, there was a great kingdom and it was being ruled by The Great Arya and Pari The Great ...
- CodeForces - 613D:Kingdom and its Cities(虚树+DP)
Meanwhile, the kingdom of K is getting ready for the marriage of the King's daughter. However, in or ...
- codeforces 687D Dividing Kingdom II 带权并查集(dsu)
题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...
- C - Tram
Problem description Linear Kingdom has exactly one tram line. It has n stops, numbered from 1 to n i ...
随机推荐
- locate-updatedb命令检索不全
locate-updatedb命令检索不全 执行updatedb命令,用于立刻更新locate命令所必需的数据库文件,但有些文件可能会在检索过程中被过滤掉. 有时候明明存在的文件,用find命令都能搜 ...
- Spring 使用外部属性文件配置
1.Spring提供了一个PropertyPlaceholderConfigurer的BeanFactory后置处理器,这个处理器允许用户将Bean的配置的部分内容 移到属性文件中.可以在Bean配置 ...
- Python爬虫基础--爬取车模照片
import urllib from urllib import request, parse from lxml import etree class CarModel: def __init__( ...
- 【python正则】工作中常用的python正则代码
工作中常用的一些正则代码: 01.用户名正则 import re # 4到16位(字母,数字,下划线,减号)if re.match(r'^[a-zA-Z0-9_-]{4,16}$', "ab ...
- php循环练习题
1.通过for循环将数组中值求和.求平均值 <?php $num=[1,2,3,4,5,6,7,8,9]; $sum = 0; for ($i=0,$n=count($num); $i < ...
- String与StringBuffer与StringBuilder
package test; public class Test { public static void main(String[] args) { StringBuffer sb = new Str ...
- Myeclipse学习总结(5)——Myeclipse常用快捷键再学习
Ctrl+1 快速修复 Ctrl+D: 删除当前行 Ctrl+Q 定位到最后编辑的地方 Ctrl+L 定位在某行 Ctrl+O 快速显示 OutLine Ctrl+T 快速显示当前类的继承结构 ...
- C/C++ 文件路径解析
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50782054 首先,看一下C/C++中 ...
- ASP.NET学习笔记01
ASP.NET初级工程师的核心要求:能够实现一个基本的网站. ASP.NET初级工程师面试主要要求: 1.基础的数据结构和算法 2.C#编程语言基础 3.网站基础(HTML,CSS,Javascrip ...
- [Linux]第五部分-Linux系统管理员
启动流程如下:1.加载BIOS信息,读取第一个启动设备代号2.读取第一个启动设备的Mbr引导程序的启动信息3.加载操作系统核心信息4.核心执行init程序并获取运行信息5.init执行 /etc/rc ...