写了好久,感觉自己好菜,唉……

首先发现这个$g$的取值具有单调性,可以想到二分答案,然后考虑用$dp$来检验,这样子可以写出朴素的转移方程:

  设$f_i$表示以$i$结尾的最大价值,那么有$f_i = max(f_j) + val_i$  $(0 < j < i)$  $((dis_i - (d + g) \leq dis_j \leq dis_i  - max(d - g, 1)))$。

然后注意到是选取一个滑动窗口的最大值,用一个单调队列优化一下就可以了。

时间复杂度$O(nlogn)$。

注意开$long\ long$。

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = 5e5 + ;
const ll inf = 1LL << ; int n, d, dis[N], q[N];
ll cur, val[N], f[N]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} template <typename T>
inline void chkMax(T &x, T y) {
if(y > x) x = y;
} template <typename T>
inline int max(T x, T y) {
return x > y ? x : y;
} inline bool chk(int mid) {
int st = max(, d - mid), ed = d + mid, l = , r = ;
memset(f, 0LL, sizeof(f));
for(int j = , i = ; i <= n; i++) {
for(; j < i && dis[j] <= dis[i] - st; j++) {
for(; l <= r && f[q[r]] < f[j]; --r);
q[++r] = j;
} for(; l <= r && dis[q[l]] < dis[i] - ed; ++l);
ll mx = f[q[l]];
if(l > r) mx = -inf;
f[i] = mx + val[i]; if(f[i] >= cur) return ;
}
return ;
} /*inline bool chk(int mid) {
int st = max(1, d - mid), ed = d + mid;
memset(f, 0, sizeof(f));
for(int i = 1; i <= n; i++) {
int res = -inf;
for(int j = 0; j < i; j++)
if(dis[j] >= dis[i] - ed && dis[j] <= dis[i] - st)
chkMax(res, f[j]);
f[i] = res + val[i];
if(f[i] >= cur) return 1;
}
return 0;
} */ int main() {
read(n), read(d), read(cur);
int mn = ; ll sum = ;
for(int i = ; i <= n; i++) {
read(dis[i]), read(val[i]);
chkMax(mn, dis[i]);
if(val[i] > ) sum += val[i];
} if(sum < cur) return puts("-1"), ; int ln = , rn = mn, mid, res = -;
for(; ln <= rn; ) {
mid = (ln + rn) / ;
if(chk(mid)) rn = mid - , res = mid;
else ln = mid + ;
} printf("%d\n", res);
return ;
}

最新文章

  1. Android中自定义控件TextSize属性问题
  2. solr异常解决
  3. java中DriverManager跟DataSource获取getConnection有什么不同?
  4. ACM题目————Anagram
  5. ios开发--tcp/ip
  6. MySQL和Oracle开发差异
  7. Fixjs实践——标签、按钮控件
  8. [leetcode-581-Shortest Unsorted Continuous Subarray]
  9. windows环境下,anoconnda安装tensorflow
  10. Centos环境下搭建Asp.NET Core环境和安装Jexus
  11. 伙伴系统之避免碎片--Linux内存管理(十六)
  12. 下拉框 -------&gt; 初始化数据
  13. mysql字符集校对
  14. DMA(直接存储器存取)
  15. 操作Linux系统环境变量的几种方法
  16. Python数据库工具类MySQLdb使用
  17. CPU profiling
  18. Week2-作业1-part2.阅读与思考
  19. C# lambda 和 Linq
  20. 回顾苹果操作系统Mac OS的发展历史

热门文章

  1. centos6.5 安装nginx
  2. Shell编程(二)——shell的基础知识及常用命令
  3. poj 3046 Ant Counting——多重集合的背包
  4. Studio 3T 如何使用 Query Builder 查询数据
  5. java代码逆序输出再连篇
  6. Java-Maven-Runoob:Maven Web 应用
  7. 在rac集群上开启OEM
  8. Chrome和IE的xss过滤器分析总结
  9. python学习笔记(三):文件操作和集合
  10. JSP页面生成验证码功能