C - 酱神赏花

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others)
Submit Status

酱神去杭州赏花。

花展在一条街道上举行,这条街道上有一共有n个节点,自左而右从1到n编号,1号和n号是左右两个端点,两个相邻端点之间的距离为1.本次花展一共要展出m朵花,在第ti时刻,有一朵颜值为bi的花将在第ai个节点展出,如果酱神在ti时刻处于第x个节点,那么他能获得的开心值为bi−|x−ai|,注意这个值可能为负。

在t=1的时刻,酱神可以随意从1到n选出一个节点作为赏花的起点。在接下来的每个单位时间段中,酱神最多能移动d的距离。酱神每秒只能移动整数个距离,且任何时刻不能超出街道的范围。

他能获得的最大开心值为多少?

Input

第一行3个数n,m,d。

接下来m行,每行3个数ai,bi,ti。

1≤n≤105,1≤m≤100

1≤ai≤n

1≤bi≤109

1≤ti≤109

1≤d≤109

Output

输出一个数,酱神的最大开心值。

Sample input and output

Sample Input Sample Output
30 4 2
27 3 1
11 4 1
11 4 1
1 2 20
-3

解题思路:

我们令f( i , j ) -> 目前第 j 朵花开,酱神正在坐标点 i 的最小花费.

我们考虑转移

F ( i , j ) = min ( F( u , j - 1) – abs( i – u ) ) + B[j]

不妨令 i > u

F( i ,j ) = min ( F( u , j – 1 ) ) + B[j] + u – i;

当i < u时同理

这样

我们维护一个单调队列即可,正反跑两遍即可.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> typedef long long ll;
using namespace std;
const int maxn = 1e5 + ;
ll f[maxn][];
int cur = , q[maxn];
ll n,m,d; typedef struct flower
{
ll a,b,t;
friend bool operator < (const flower & x,const flower & y)
{
return x.t < y.t;
}
}; flower A[+]; void init_f()
{
for(int i = ; i <= n ; ++ i)
f[i][cur] = -;
} int main(int argc,char *argv[])
{
scanf("%d%d%d",&n,&m,&d);
for(int i = ; i <= m ; ++ i)
scanf("%d%d%d",&A[i].a,&A[i].b,&A[i].t);
sort(A+,A++m);
for(int i = ; i <= n ; ++ i)
f[i][cur] = A[].b - abs(i - A[].a);
for(int j = ; j <= m ; ++ j)
{
ll limit = (A[j].t - A[j-].t)*d;
cur ^= ;
int front = , rear = ;
init_f();
for(int i = ; i <= n ; ++ i)
{
while(rear > front && f[i][cur^] >= f[q[rear-]][cur^])
rear--;
q[rear++] = i;
while(rear > front && (i - q[front]) > limit)
front++;
f[i][cur] = max(f[i][cur],f[q[front]][cur^] + A[j].b - abs(i - A[j].a));
}
front = , rear = ;
for(int i = n ; i >= ; -- i)
{
while(rear > front && f[i][cur^] >= f[q[rear-]][cur^])
rear--;
q[rear++] = i;
while(rear > front && (q[front] - i) > limit)
front++;
f[i][cur] = max(f[i][cur],f[q[front]][cur^] + A[j].b - abs(i - A[j].a));
}
}
ll ans = -;
for(int i = ; i <= n ; ++ i)
ans = max(ans,f[i][cur]);
printf("%lld\n",ans);
return ;
}

UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>的更多相关文章

  1. UESTC_酱神的旅行 2015 UESTC Training for Dynamic Programming<Problem M>

    M - 酱神的旅行 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  2. UESTC_男神的约会 2015 UESTC Training for Dynamic Programming<Problem J>

    J - 男神的约会 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  3. UESTC_男神的礼物 2015 UESTC Training for Dynamic Programming<Problem A>

    A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  4. UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>

    H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>

    F - 邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  6. UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>

    G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  7. UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>

    O - 酱神寻宝 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  8. UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>

    I - 邱老师选妹子(二) Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

  9. UESTC_最少花费 2015 UESTC Training for Dynamic Programming<Problem D>

    D - 最少花费 Time Limit: 30000/10000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

随机推荐

  1. [Linux] killall 、kill 、pkill 命令详解

    killall 命令 Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀 ...

  2. QString转换为char*

    QString在Qt里相当于C++里的std::string,或者是C里的c style string.不过,QString跟编码相关,在低层想把一个QString发送出去相当麻烦,尤其对方用的不是Q ...

  3. Qt creator 搭配 valgrind 检测内存泄漏

    继上次重载operator new检测内存泄漏失败之后,妥协了.决定不管是否是准确指明哪一行代码出现内存泄漏,只要告诉我是否有泄漏就行了,这样就没有new替换的问题.在开发中,总是一个个小功能的开发. ...

  4. [Ext JS 4] 实战之Grid, Tree Gird编辑Cell

    前言 本篇这里以稍微复杂一点的Tree Grid 来介绍. 在写编辑grid 之, 先来看一下 grid 的 selType 的配置. 先给一个简单的Tree grid 的例子: Ext.onRead ...

  5. POJ 1469 ZOJ1140 二分匹配裸题

    很裸,左点阵n,右点阵m 问最大匹配是否为n #include <cstdio> #include <cstring> #include <vector> usin ...

  6. configure交叉编译

    今天在交叉编译时犯了一个错误,纠结了好久,曾经交叉编译器的前缀基本上都是用arm-linux-,这次换了一个新环境是arm-none-linux-gnueabi-,于是想当然的把configure中的 ...

  7. RMAN简单备份

    检查目标数据库是否处于归档模式: . 检查数据库模式: sqlplus /nolog conn /as sysdba archive log list (查看数据库是否处于归档模式中) 若为非归档,则 ...

  8. android——仿微拍贷滑动圆形菜单

    一次偶然机会接触到微拍贷的app,瞬间被其圆形可滑动菜单吸引了.一直琢磨着给弄出来. 现在弄出来了.先看看效果吧 如果你也喜欢这个菜单.去我的github找源码吧.太忙了.没时间贴代码和讲解了. ht ...

  9. Oracle - 找不到原因的无效字符

      当执行Oracle语句时,提示“无效字符”,而语句并无错误时,尝试把语句中的空格替换成半角状态的.   一般直接复制的语句会出现这种问题.

  10. SQL日期形式转换

    在SQL Server中,有时存储在数据库中的日期格式和我们需要显示在页面上的格式不相同,我们需要转化成需要的格式. 特在此总结了一下常用的日期格式. --当前时间 SELECT GETDATE(); ...