Luogu 3957 [NOIP2017]普及组 跳房子
写了好久,感觉自己好菜,唉……
首先发现这个$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 ;
}
Luogu 3957 [NOIP2017]普及组 跳房子的更多相关文章
- [NOIP2017普及组]跳房子(二分,单调队列优化dp)
[NOIP2017普及组]跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 nn 个格子, ...
- 「LOJ 6373」NOIP2017 普及组题目大融合
NOIP2017 普及组题目大融合 每个读者需要有某个后缀的书,可以暴力map,复杂度\(o(9*nlog(n))\),也可以反串建trie树,复杂度\(o(9*n)\). 故可以求出需要的最少的RM ...
- P3956 [NOIP2017 普及组] 棋盘
P3956 [NOIP2017 普及组] 棋盘 题目 题目描述 有一个 m×m 的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你 ...
- noip2017普及组
过了这么久才来写博客,也是我这么一段时间都很低迷吧.... 老实来说,今年应该是要打提高组的...可还是打了普及组... 其实最猥琐的还是我连普及都写挂了,作为一个学了两年的人,图论,进阶dp都写过的 ...
- NOIP2017普及组比赛总结
期中考总结&NOIP2017总结 2017年11月11日,我第二次参加NOIP普及组复赛.上一年,我的得分是250分,只拿到了二等奖.我便把目标定为拿到一等奖,考到300分以上. 早上8点多, ...
- NOIP2017普及组解题报告
刚参加完NOIP2017普及,只考了210,于是心生不爽,写下了这篇解题报告...(逃 第一次写博,望dalao们多多指导啊(膜 第一题score,学完helloworld的人也应该都会吧,之前好多人 ...
- NOIP2017普及组初赛试题及答案
普及组C++语言试题 一.单项选择题(共 20 题,每题 1.5 分,共计 30 分:每题有且仅有一个正确选项) 1.在 8 位二进制补码中,10101011 表示的数是十进制下的( ). A. 43 ...
- NOIP2017普及组T2题解
还是神奇的链接 上面依然是题目. 这道题依然很简单,比起2015年的普及组t2好像还是更水一些. 不过这道题能讲的比第一题多. 我们一起来看一下吧! 这一题,我们首先将书的编号全部读入,存在一个数组里 ...
- NOIP2017普及组初赛总结
去年,我普及组复赛翻车,居然没进一等奖,于是,今年,我只能再做一次普及组. 这次初赛我93.5分,居然是中山市第一--(中山市太弱了?) 其实我觉得我没考好. 比赛时第二题(计算机存储数据的基本单位是 ...
随机推荐
- Oracle Sql Developer 连接oracle
PL/Sql 初次使用需要配置文件内容,对于我这种Oracle新手来说各种配置有点凌乱,所以果断选择Sql Developer. 选择它是因为初次使用的时候它不用想PL/Sql那样配置文件,而只需要添 ...
- keycloak && docker安装 &&spring boot 集成使用
1. 基础依赖 a. docker mysql b. dokcer keycloak-mysql 2. 安装 mysql (注意实际使用最好使用本地数据卷) docker run --na ...
- 基于jwt和角色的访问控制方案-从0开始
上一版本的构想:http://www.cnblogs.com/vhyc/p/7953779.html 缺陷:dubbo的filter里面不能注入mapper的bean,而且每次查询都访问数据库速度影响 ...
- android资源目录---assets与res/raw区别
android资源目录---assets与res/raw的不同 Android 2011-05-24 14:40:21 阅读20 评论0 字号:大中小 订阅 assets:用于存放需要打包到应用程 ...
- Linux 多路复用 select / poll
多路复用都是在阻塞模式下有效! linux中的系统调用函数默认都是阻塞模式,例如应用层读不到驱动层的数据时,就会阻塞等待,直到有数据可读为止. 问题:在一个进程中,同时打开了两个或者两个以上的文件,读 ...
- Delphi2010中DataSnap高级技术(转)
一. 为DataSnap系统服务程序添加描述 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7该下岗了. DataSnap有三种服务模式,其 ...
- heartbeat测试
节点名: node-master 192.168.1.77 node-slave 192.168.1.88 VIP 192.168.1.234 带下划线的不允许作为节点名 修改节点名字 gvim /e ...
- erlang使用心跳模式启动shell
资料http://blog.yufeng.info/archives/2832 借鉴自从http://blog.csdn.net/mycwq/article/details/18306753 测试例子 ...
- 分布式缓存系统 Memcached 哈希表操作
memcached 中有两张hash 表,一个是“主hash 表”(primary_hashtable),另外一个是“原hash 表”(old_hashtable).一般情况下都在主表中接受操作,在插 ...
- Error EBUSY: osd.0 is still up; must be down before removal的解决办法
标签(空格分隔):ceph,ceph运维,osd故障 集群环境: [root@node3 ~]# cat /etc/redhat-release CentOS Linux release 7.3.16 ...