CDOJ 1132 酱神赏花 dp+单调栈降低复杂度+滚动数组
酱神赏花
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others)
酱神去杭州赏花。
花展在一条街道上举行,这条街道上有一共有n个节点,自左而右从11到nn编号,11号和nn号是左右两个端点,两个相邻端点之间的距离为11.本次花展一共要展出mm朵花,在第titi时刻,有一朵颜值为bibi的花将在第aiai个节点展出,如果酱神在titi时刻处于第xx个节点,那么他能获得的开心值为bi−|x−ai|bi−|x−ai|,注意这个值可能为负。
在t=1t=1的时刻,酱神可以随意从11到nn选出一个节点作为赏花的起点。在接下来的每个单位时间段中,酱神最多能移动dd的距离。酱神每秒只能移动整数个距离,且任何时刻不能超出街道的范围。
他能获得的最大开心值为多少?
Input
第一行33个数n,m,dn,m,d。
接下来mm行,每行33个数ai,bi,tiai,bi,ti。
1≤n≤1051≤n≤105,1≤m≤1001≤m≤100
1≤ai≤n1≤ai≤n
1≤bi≤1091≤bi≤109
1≤ti≤1091≤ti≤109
1≤d≤1091≤d≤109
Output
输出一个数,酱神的最大开心值。
Sample input and output
Sample Input | Sample Output |
---|---|
30 4 2 |
-3 |
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf =0x7f7f7f7f;
const double pi=acos(-1);
const int N=100005; struct node{
int a,b;ll t;
}flower[N]; bool cmp(node a,node b)
{
return a.t<b.t;
} ll dp[N][3];
int n,m,d,x[N]; void init(int cur)
{
for(int i=1;i<=n;i++) dp[i][cur]=-1e15;
} int main()
{
while(~scanf("%d%d%d",&n,&m,&d))
{
for(int i=1;i<=m;i++)
scanf("%d%d%lld",&flower[i].a,&flower[i].b,&flower[i].t);
sort(flower+1,flower+m+1,cmp); int cur=0;
for(int i=1;i<=n;i++)
{
dp[i][cur]=flower[1].b-abs(flower[1].a-i);
} for(int k=2;k<=m;k++)
{
cur^=1;
init(cur);
ll limit=(flower[k].t-flower[k-1].t)*d;
int l=1,r=1;
for(int i=1;i<=n;i++)
{
while(l<r&&dp[i][cur^1]>=dp[x[r-1]][cur^1]) r--;
x[r]=i;r++;
while(l<r&&(i-x[l]>limit)) l++;
dp[i][cur]=max(dp[i][cur],dp[x[l]][cur^1]+flower[k].b-abs(flower[k].a-i));
} l=1;r=1;
for(int i=n;i>=1;i--)
{
while(l<r&&dp[i][cur^1]>=dp[x[r-1]][cur^1]) r--;
x[r]=i;r++;
while(l<r&&(x[l]-i>limit)) l++;
dp[i][cur]=max(dp[i][cur],dp[x[l]][cur^1]+flower[k].b-abs(flower[k].a-i));
}
} ll ans=-1e15;
for(int i=1;i<=n;i++) ans=max(ans,dp[i][cur]);
printf("%lld\n",ans);
}
return 0;
}
分析:经典的一道题,
1.首先预处理出第一次花开时,枚举在1-n各个点能获得的颜值。
2.dp[i][k]即为第k次花开时,人在i处获得的最大颜值,那么从小到大枚举每个i,并且维护一个从左到右的单调递减栈(第k-1多花开时),再判断当前枚举的i在单调栈中能达到的最左的点(限制条件就是人转移的距离),然后再从最左点转移一下到当前枚举的点i;
3.最后因为一个点可以从左边转移过来,也可以从右边转移过来,所以需要i从n到1再进行一次2步骤
这道题目能用单调栈降下来,关键是因为加入i跟i-1都能转移到j位置,那么如果dp[i][k-1]>=dp[i-1][k-1]的话,那么i-1这个点就不要判断了,直接丢掉
CDOJ 1132 酱神赏花 dp+单调栈降低复杂度+滚动数组的更多相关文章
- UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>
C - 酱神赏花 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Submi ...
- [luogu]P1169 [ZJOI2007]棋盘制作[DP][单调栈]
[luogu]P1169 [ZJOI]棋盘制作 ——!x^n+y^n=z^n 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋 ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- cdoj 1141 酱神寻宝 状压dp
酱神寻宝 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1141 Descri ...
- 【BZOJ】3039: 玉蟾宫(DP/单调栈)
http://www.lydsy.com/JudgeOnline/problem.php?id=3039 每次看到我的提交都有点淡淡的忧伤T_T.. 看到此题我想到用前缀和维护点ij向左和向上能拓展的 ...
- 【DP/单调栈】关于单调栈的一些题目(codevs 1159,codevs 2673)
CODEVS 2673:Special Judge 题目描述 Description 这个月的pku月赛某陈没有参加,因为当时学校在考试[某陈经常逃课,但某陈还没有强大到考试也可以逃掉的程度].何 ...
- 【BZOJ 4709】柠檬 斜率优化dp+单调栈
题意 给$n$个贝壳,可以将贝壳分成若干段,每段选取一个贝壳$s_i$,这一段$s_i$的数目为$num$,可以得到$num^2\times s_i$个柠檬,求最多能得到几个柠檬 可以发现只有在一段中 ...
- poj 2796 Feel Good dp || 单调栈
题目链接 题意 对于一个长度为\(n\)的非负整数数列\(a_1,a_2,-,a_n\),求\(max_{1≤l≤r≤n}f(l,r)\), 其中 \[f(l,r)=min(a_l,a_{l+1},- ...
- bzoj 1233: [Usaco2009Open]干草堆tower【dp+单调栈】
参考:https://www.cnblogs.com/N-C-Derek/archive/2012/07/11/usaco_09_open_tower.html 虽然长得很像斜率优化,但是应该不算-- ...
随机推荐
- win10的修改hosts文件
1.找到hosts文件 2.右键hosts文件 -> 属性 -> 安全 -> 编辑 3.依次选中用户组用户组,完全控制打钩,点击应用,点击确定,完成. 一般情况下这样就能修改了 ...
- MVC4学习要点记二
一.分页(PagedList.MVC)1.安装PagedList.MVCPM>install-package PagedList.mvc 2.控制器中使用PagedList 3.csht ...
- 关于VSS(Volume Shadow Copy Service)一
在开发windows VSS应用程序时 我们应该先下载相关SDK,微软描述如下 When developing your own VSS application, you should observe ...
- MySQL之常用查询
1) 查询字符集 show variables like 'character%'; 2)查看版本 select version(); 3) 共享表空间的数据文件存储路径 show variables ...
- 始终让footer在底部
1.footer保持在页面底部 需求: 我们希望footer能在窗口最底端,但是由于页面内容太少,无法将内容区域撑开,从而在 footer 下面会留下一大块空白 第一种方法:采用 flexbox布局模 ...
- 根据返回数据, 迭代数组, 构造HTML结构
首先需要引入jQuery哈! 1. 要求用下面的格式制作目录, 结构如下: <ul> <li>xxxx</li> <li>xxxx</li> ...
- go语言时间函数
以YY-mm-dd HH:MM:SS.9位 输出当前时间: func main() { fmt.Println(time.Now()) // 2019-11-15 16:26:12.4807588 + ...
- CentOS7磁盘空间不足,却找不到占用空间的大文件
1 df -ah 显示/根目录占用百分之九十 进入根目录对指定的文件夹查询容量 cd / du -sh * | sort -n 磁盘有50G,加起来有10G左右的文件找不到 2 自己影响中,已经清理 ...
- inputrc命令
问题:搭建ubuntu系统后,输入命令的第一个字符+上页按键,发现不能找到历史命令,找了好久才发现是因为/etc/inputrc没有对键盘映射的上页键和下页键进行设置. 解决方法: 修改文件/etc/ ...
- K8S搭建过程随笔_证书CFSSL
安装CFSSL mkdir -p /opt/k8s/cert && cd /opt/k8swget https://pkg.cfssl.org/R1.2/cfssl_linux-amd ...