暑假集训日记——8.17(codeforce)

C. Watching Fireworks is Fun
题意:
一条街道有 n n n个区域。 从左到右编号为 1 1 1 n n n。 相邻区域之间的距离为 1 1 1。在节日期间,有 m m m次烟花要燃放。 第 i i i次烟花燃放区域为 a i a_i ai,幸福属性为 b i b_i bi,时间为 t i t_i ti t i ⩽ t i + 1 t_i⩽t_i+1 titi+1
如果你在第 i i i次烟花发射时在 x ( 1 ⩽ x ⩽ n ) x(1⩽x⩽n) x1xn处,你将获得幸福值 b i − ∣ a i − x ∣ bi−|ai−x| biaix(请注意,幸福值可能是负值)。
你可以在单位时间间隔内移动最多 d d d个单位,但禁止走出主要街道。 此外,您可以在初始时刻(时间等于1时)处于任意区域,并希望最大化从观看烟花中获得的幸福总和。

题解:dp+单调队列+滚动数组优化
如果时间重叠,就直接状态转移,否则就单调队列优化一下。
状态转移方程:
d p [ i ] [ j ] = d p [ i − 1 ] [ k ] + b i − ∣ a i − j ∣ dp[i][j]=dp[i-1][k]+b_i-|a_i-j| dp[i][j]=dp[i1][k]+biaij ( ∣ j − k ∣ &lt; = ( t i − t i − 1 ) ∗ d ) (|j-k|&lt;=(t_i-t_{i-1})*d) (jk<=(titi1)d)

#include<bits/stdc++.h>
#define mp make_pair
#define se second
#define fi first
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef long double ld;

const int N=5e5+10;
const int MAXN=20010;
const int INF=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const double eps=0.0000001;
const ll mod=1e9+7;
ll n,m,x,y,z,k,cnt,t,len;
ll a[N],b[N],ti[N];
ll dp[2][150005];///滚动数组优化

struct node
{
   
    ll x,y;
}v[150005];


int 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值