Codeforces 436D Pudding Monsters
题意简述
开始有无限长的一段格子,有n个格子种有布丁怪兽,一开始连续的布丁怪兽算一个布丁怪兽。
每回合你可以将一个布丁怪兽向左或右移动,他会在碰到第一个布丁怪兽时停下,并与其合并。
有m个特殊格子,询问最终你最多可以让几个特殊的格子上被布丁覆盖。
题解思路
dp
f[i]表示前i个布丁最多可覆盖的特殊格子数
g[i]表示前i个布丁,第i个不动的情况下最多可覆盖的特殊格子数
可得转移方程:
g[i] = max(g[i], f[l[i - len] - 1] + sum(b[j], a[i]));
f[r[i + len]] = max(f[r[i + len]], g[i] + sum(a[i] + 1, b[j]));
其中
l[i],r[i]表示第i个布丁所属的怪兽的最左边格子编号和最右边格子编号
len 是枚举特殊格子位置与i的距离
sum(a, b) 表示a,b之间的特殊格子数
代码
#include <cstdio>
#include <algorithm>
const int Maxn = 100010;
int n, m, ll, len;
int a[Maxn], b[Maxn], s[Maxn << 1], l[Maxn], r[Maxn];
int f[Maxn], g[Maxn];
inline void mmax(int& x, const int& y) { if (y > x) x = y; }
inline int sum(const int& x, const int& y) {return s[y] - s[x - 1]; }
int main()
{
scanf("%d%d", &n, &m);
for (register int i = 1; i <= n; ++i) scanf("%d", &a[i]);
for (register int i = 1; i <= m; ++i)
{
scanf("%d", &b[i]);
++s[b[i]];
}
std::sort(a + 1, a + n + 1);
std::sort(b + 1, b + m + 1);
a[0] = -300000; a[n + 1] = 300000;
for (register int i = 1; i <= n; ++i)
if (a[i] == a[i - 1] + 1) l[i] = l[i - 1];
else l[i] = i;
for (register int i = n; i; --i)
if (a[i] == a[i + 1] - 1) r[i] = r[i + 1];
else r[i] = i;
for (register int i = 1; i <= 200000; ++i) s[i] += s[i - 1];
for (register int i = 1; i <= n; ++i)
{
mmax(f[i], f[i - 1] + sum(a[i], a[i]));
mmax(g[i], f[i - 1] + sum(a[i], a[i]));
for (register int j = 1; j <= m && (len = a[i] - b[j]) > 0; ++j)
if (len < i)
mmax(g[i], f[l[i - len] - 1] + sum(b[j], a[i]));
mmax(f[i], g[i]);
for (register int j = m; j && (len = b[j] - a[i]) >= 0; --j)
if (len <= n - i)
mmax(f[r[i + len]], g[i] + sum(a[i] + 1, b[j]));
}
printf("%d\n", f[n]);
}
Codeforces 436D Pudding Monsters的更多相关文章
- Codeforces 436D - Pudding Monsters(dp)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 这题数据范围有点迷惑啊--乍一看 \(\mathcal O(nm)\) 过不去,还以为是正解是 \(\mathcal O(n+m ...
- Codeforces 526F Pudding Monsters - CDQ分治 - 桶排序
In this problem you will meet the simplified model of game Pudding Monsters. An important process in ...
- Codeforces 526F Pudding Monsters
先把题目抽象一下: 有一个静态的数组,求有多少个区间[i,j]满足:j-i==max{ai,...,aj}-min{ai,...,aj} 也就是要求max-min+i-j==0的区间数 所以肿么做呢? ...
- 奇袭 CodeForces 526F Pudding Monsters 题解
考场上没有认真审题,没有看到该题目的特殊之处: 保证每一行和每一列都恰有一只军队,即每一个Xi和每一个Yi都是不一样 的. 于是无论如何也想不到复杂度小于$O(n^3)$的算法, 只好打一个二维前缀和 ...
- 【CF526F】Pudding Monsters cdq分治
[CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...
- [Codeforces526F]Pudding Monsters 分治
F. Pudding Monsters time limit per test 2 seconds memory limit per test 256 megabytes In this proble ...
- CodeForces526F:Pudding Monsters (分治)
In this problem you will meet the simplified model of game Pudding Monsters. An important process in ...
- CF526F Pudding Monsters
CF526F Pudding Monsters 题目大意:给出一个\(n* n\)的棋盘,其中有\(n\)个格子包含棋子. 每行每列恰有一个棋子. 求\(k*k\)的恰好包含\(k\)枚棋子的子矩形个 ...
- 「CF526F」 Pudding Monsters
CF526F Pudding Monsters 传送门 模型转换:对于一个 \(n\times n\) 的棋盘,若每行每列仅有一个棋子,令 \(a_x=y\),则 \(a\) 为一个排列. 转换成排列 ...
随机推荐
- 在vue项目中遇到关于对象的深浅拷贝问题
一.问题 项目里新添加了一个多选的功能,其显示的数据都是从后端返回过来的,我们需要在返回来的数据外再额外添加一个是否选中的标记,我的选择是在返回正确的数据时将标记添加进去,然后push到数组中.然后就 ...
- win10win7office系列激活工具 KMSAuto Net 2016 v1.5.4 绿色便携版
下载地址:点我 KMSpico又称KMS激活工具,KMSpico是目前成功且经常更新的Windows激活工具,可以激活任何版本的window系统和任何版本的Office软件,即使是win8和offic ...
- MYSQL Got error 28 from storage engine
网络查找该异常信息,发现 Got error 28 from storage engine 查了一下,数据库文件所在的盘应该没事,应该是数据库用的临时目录空间不够 引用 磁盘临时空间不够导致. 解决办 ...
- Spring MVC源码(二) ----- DispatcherServlet 请求处理流程 面试必问
前端控制器 前端控制器,即所谓的Front Controller,体现的是设计模式中的前端控制器模式.前端控制器处理所有从用户过来的请求.所有用户的请求都要通过前端控制器.SpringMVC框架和其他 ...
- React躬行记(8)——样式
由于React推崇组件模式,因此会要求HTML.CSS和JavaScript混合在一起,虽然这与过去的关注点分离正好相反,但是更有利于组件之间的隔离.React已将HTML用JSX封装,而对CSS只进 ...
- android_layout_relativelayout(二)
官网上的一个xml文件: <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmln ...
- Spring Boot 2.x (十八):邮件服务一文打尽
前景介绍 在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作. 大致思路 我们要做的其实就是把Java程序作为一个客户端,然后 ...
- ServiceFabric极简文档-3. 发布脚本
web: Trap { Write-Host $_.Exception.Message; Continue }; Connect-ServiceFabricCluster Remove-Service ...
- Spark-windows安装
Spark 目的:达到能在pycharm中测试 1.安装必要的文件: JDK AnaConda spark hadoop jdk测试:java -version Anaconda测试: 打开Anaco ...
- linux初学者-普通磁盘分区篇
linux初学者-普通磁盘分区篇 磁盘是计算机的重要组成部分,是记录数据的场所.在使用磁盘时,经常需要对其进行分区来实现不同的用途.下文将介绍在linux系统中普通磁盘分区的方法. "fdi ...