C. Watching Fireworks is Fun
time limit per test

4 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

A festival will be held in a town's main street. There are n sections in the main street. The sections are numbered 1 through n from left to right. The distance between each adjacent sections is 1.

In the festival m fireworks will be launched. The i-th (1 ≤ i ≤ m) launching is on time ti at section ai. If you are at section x (1 ≤ x ≤ n) at the time of i-th launching, you'll gain happiness value bi - |ai - x| (note that the happiness value might be a negative value).

You can move up to d length units in a unit time interval, but it's prohibited to go out of the main street. Also you can be in an arbitrary section at initial time moment (time equals to 1), and want to maximize the sum of happiness that can be gained from watching fireworks. Find the maximum total happiness.

Note that two or more fireworks can be launched at the same time.

Input

The first line contains three integers n, m, d (1 ≤ n ≤ 150000; 1 ≤ m ≤ 300; 1 ≤ d ≤ n).

Each of the next m lines contains integers ai, bi, ti (1 ≤ ai ≤ n; 1 ≤ bi ≤ 109; 1 ≤ ti ≤ 109). The i-th line contains description of the i-th launching.

It is guaranteed that the condition ti ≤ ti + 1 (1 ≤ i < m) will be satisfied.

Output

Print a single integer — the maximum sum of happiness that you can gain from watching all the fireworks.

Please, do not write the %lld specifier to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams or the %I64d specifier.

Examples
Input
50 3 1
49 1 1
26 1 4
6 1 10
Output
-31
Input
10 2 1
1 1000 4
9 1000 4
Output
1992
思路:dp+单调队列;
dp[i][j]为到放第i个烟花的时候站在j的位置可以获得的最大happiness。转移方程:dp[ i ] [ j ] =max(dp[ i - 1] [ k ]) + b[ i ]  - | a[ i ] - j | ,其中  max(1,j-t*d)<=k<=min(n,j+t*d)
那么烟花燃放时间要先按照顺序排,我们可以看到k的区间是个恒定的长度,那么很容一就想到用单调队列去维护一个递减的队列,然后每次更新dp;
要开个滚动数组。复杂度O(n*m);
  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<deque>
7 #include<stack>
8 #include<math.h>
9 using namespace std;
10 typedef long long LL;
11 LL dp[2][150005];
12 typedef struct node
13 {
14 LL a,b,t;
15 } ss;
16 ss ans[400];
17 bool cmp(node p, node q)
18 {
19 return p.t<q.t;
20 }
21 int quq[150005*10];
22 int main(void)
23 {
24 int n,m,d;
25 int i,j;
26 while(scanf("%d %d %d",&n,&m,&d)!=EOF)
27 {
28 for(i = 1; i <= m; i++)
29 {
30 scanf("%lld %lld %lld",&ans[i].a,&ans[i].b,&ans[i].t);
31 }
32 sort(ans+1,ans+1+m,cmp);
33 for(i = 0; i <= 150000; i++)
34 {
35 dp[0][i] = 0;
36 }
37 ans[0].t = 0;
38 LL maxa = -1e16;
39 for(i = 1; i <= m; i++)
40 {
41 for(j = 0; j <=n; j++)dp[i%2][j] = -1e16;
42 int head = 150001;
43 int rail = 150000;
44 LL minn = 1;
45 LL maxx = min((d*(ans[i].t-ans[i-1].t)),(LL)n);
46 for(j = minn; j <= maxx; j++)
47 {
48 if(head>rail)
49 {
50 quq[++rail] = j;
51 }
52 else
53 {
54 while(true)
55 {
56 int id = quq[rail];
57 if(dp[(i+1)%2][id] <= dp[(i+1)%2][j])
58 {
59 rail--;
60 }
61 else break;
62 if(rail < head)
63 {
64 break;
65 }
66 }
67 quq[++rail] = j;
68 }
69 }
70 for(j = 1; j <= n; j++)
71 {
72 LL xx = max((LL)1,(j-d*(ans[i].t-ans[i-1].t)));
73 LL yy = min((LL)n,(maxx+j));
74 {
75 if(rail<head)
76 {
77 quq[++rail] = yy;
78 }
79 else
80 {
81 while(true)
82 {
83 int id = quq[rail];
84 if(dp[(i+1)%2][id] <= dp[(i+1)%2][yy])
85 {
86 rail--;
87 }
88 else break;
89 if(rail < head)
90 {
91 break;
92 }
93 }
94 quq[++rail] = yy;
95 }
96 while(quq[head] < xx)
97 {
98 head++;
99 if(head>rail)break;
100 }
101 dp[i%2][j] = max(dp[i%2][j],dp[(i+1)%2][quq[head]]+ans[i].b-abs(ans[i].a-j));
102 }
103 }
104 }
105 for(i = 1; i <= n; i++)
106 {
107 maxa = max(maxa,dp[m%2][i]);
108 }
109 printf("%lld\n",maxa);
110 }
111 return 0;}

C. Watching Fireworks is Fun(Codeforces 372C)的更多相关文章

  1. Codeforces Round #219 (Div. 2) E. Watching Fireworks is Fun

    http://codeforces.com/contest/373/problem/E E. Watching Fireworks is Fun time limit per test 4 secon ...

  2. Codeforces Round #219 (Div. 1) C. Watching Fireworks is Fun

    C. Watching Fireworks is Fun time limit per test 4 seconds memory limit per test 256 megabytes input ...

  3. CF372C Watching Fireworks is Fun(单调队列优化DP)

    A festival will be held in a town's main street. There are n sections in the main street. The sectio ...

  4. F - Watching Fireworks is Fun

    C. Watching Fireworks is Fun 题目大意: 一个城镇有n个区域,从左到右1-n,每个区域之间距离1个单位距离.节日中有m个烟火要放,给定放的地点a[ i ].时间t[ i ] ...

  5. 单调队列+线性dp题Watching Fireworks is Fun (CF372C)

    一.Watching Fireworks is Fun(紫题) 题目:一个城镇有n个区域,从左到右1编号为n,每个区域之间距离1个单位距离节日中有m个烟火要放,给定放的地点ai,时间ti当时你在x,那 ...

  6. 【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces

    题目大意 一条街道有$n$个区域. 从左到右编号为$1$到$n$. 相邻区域之间的距离为$1$. 在节日期间,有$m$次烟花要燃放. 第$i$次烟花燃放区域为$a_i$ ,幸福属性为$b_i$,时间为 ...

  7. 【单调队列优化】[CF372C] Watching Fireworks is Fun

    突然发现我可能单调队列都打不来了...我太菜了... 这道题显然有$$f[i][j]=min\{f[i-1][k]+\vert j-a[i] \vert\}$$ 则$ans=\sum_{i=1}^{m ...

  8. 题解-------CF372C Watching Fireworks is Fun

    传送门 一道有趣的DP 题目大意 城镇中有$n$个位置,有$m$个烟花要放.第$i$个烟花放出的时间记为$t_{i}$,放出的位置记为$a_{i}$.如果烟花放出的时候,你处在位置$x$,那么你将收获 ...

  9. DP刷题记录

    目录 dp刷题记录 codeforces 706C codeforces 940E BZOJ3997 POJ2279 GYM102082B GYM102082D codeforces132C L3-0 ...

随机推荐

  1. 网络爬虫-python-爬取天涯求职贴

    使用urllib请求页面,使用BeautifulSoup解析页面,使用xlwt3写入Excel import urllib.request from bs4 import BeautifulSoup ...

  2. 论文解读(SDNE)《Structural Deep Network Embedding》

    论文题目:<Structural Deep Network Embedding>发表时间:  KDD 2016 论文作者:  Aditya Grover;Aditya Grover; Ju ...

  3. JSP内置对象之out对象

    一.       JSP内置对象的概述     由于JSP使用java作为脚本语言,所以JSP将具有强大的对象处理能力,并且可以动态地创建Web页面内容.但Java语法在使用一个对象前,需要先实例化这 ...

  4. day14 linux三剑客之sed命令

    day14 linux三剑客之sed命令 sed命令 Sed 主要用来自动编辑一个或多个文件.简化对文件的反复操作.编写转换程序等. sed(流式编辑器) : sed主要用来修改文件. 1.sed命令 ...

  5. Scala(四)【集合基础入门】

    目录 一.Array 二. List 三.Set 四.Tuple 五.Map 一.Array package com.bigdata.scala.day01 /** * @description: 不 ...

  6. Maven打包及场景

    场景一 对当前项目打包并指定主类. <build> <plugins> <plugin> <artifactId>maven-compiler-plug ...

  7. Hive(六)【分区表、分桶表】

    目录 一.分区表 1.本质 2.创建分区表 3.加载数据到分区表 4.查看分区 5.增加分区 6.删除分区 7.二级分区 8.分区表和元数据对应得三种方式 9.动态分区 二.分桶表 1.创建分桶表 2 ...

  8. oracle first_value,last_valus

    first_value和last_value 是用来去分析函数窗口中对应列的第一个值和最后一个值的函数. 语法如下: first_value(col [ignore NULLS]) over([PAR ...

  9. weak和拷贝

    weak/拷贝 1. weak 只要没有strong指针指向对象,该对象就会被销毁 2. 拷贝 NSString和block用copy copy语法的作用 产生一个副本 修改了副本(源对象)并不会影响 ...

  10. my42_Mysql基于ROW格式的主从同步

    模拟主从update事务,从库跳过部分update事务后,再次开始同步的现象 主库 mysql> select * from dbamngdb.isNodeOK; +----+--------- ...