[CF436D]Pudding Monsters
题目大意:有一个长度为$2\times 10^5$的板,有$n(n\leqslant 10^5)$个格子$a_1,\dots,a_n$有布丁怪兽,一开始连续的怪兽算一个怪兽,有$m(m\leqslant 2000)$个特殊点$b_1,\dots,b_n$,你可以向左或向右移动怪兽,它会在碰到第一怪兽时停下,并成为一个怪兽。最左边和最右边的怪兽向两边移动会掉出板。问最多可以让布丁怪兽压到几个特殊点。
题解:先把连续的布丁怪兽看做长度个不同的怪兽,令$f_i$表示前$i$个怪兽最多可以覆盖多少个点,$g_i$表示前$i$个怪兽且第$i$个怪兽不动可以覆盖最多的点,$sum_{l,r}$表示$[l,r]$中特殊点个数
设当前转移坐标为$a_i$
1. 这个位置向左移,那么枚举$b_j$满足$b_j\leqslant a_i$,要覆盖区间$[b_j,a_i]$,就需要另外的$len=a_i-b_j$个怪兽,则
$$
g_i=\max\{g_i,f_{i-len-1}+sum_{b_j,a_i}\}
$$
2. 这个位置向右移,那么枚举$b_j$满足$b_j\geqslant a_i$,要覆盖区间$[a_i,b_j]$,需要另外$len=b_j-a_i$个怪兽,则
$$
f_{i+len}=\max\{f_{i+len},g_i+sum_{a_i+1,b_j}\}
$$
3. 这个位置不动,则
$$
f_i=\max\{f_i,g_i,f_{i-1}+sum_{a_i,a_i}\}\\
g_i=\max\{g_i,f_{i-1}+sum_{a_i,a_i}\}
$$
因为最开始怪兽有连续的,所以记录每个布丁怪兽的左端点和右端点,移动的时候将一整个怪兽移动即可
卡点:$f_i$没有用$g_i$更新,$g_i$使用了$g_{i-1}$来转移导致调了很久
C++ Code:
#include <cstdio>
#include <iostream>
#include <algorithm>
const int maxn = 1e5 + 10;
#define chkmax(a, b) (a = std::max(a, b)) int n, m;
int a[maxn], b[maxn], L[maxn], R[maxn];
int s[200010], f[maxn], g[maxn];
inline int sum(int a, int b) { return s[b] - s[a - 1]; }
inline int sum(int a) { return s[a] - s[a - 1]; } int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> m;
for (int i = 1; i <= n; ++i) std::cin >> a[i];
for (int i = 1; i <= m; ++i) std::cin >> b[i], ++s[b[i]];
for (int i = 1; i <= 200000; ++i) s[i] += s[i - 1];
std::sort(a + 1, a + n + 1), std::sort(b + 1, b + m + 1);
a[0] = -20040826, a[n + 1] = 20040826;
for (int i = 1; i <= n; ++i)
if (a[i] != a[i - 1] + 1) L[i] = i;
else L[i] = L[i - 1];
for (int i = n; i; --i)
if (a[i] != a[i + 1] - 1) R[i] = i;
else R[i] = R[i + 1]; for (int i = 1; i <= n; ++i) {
chkmax(f[i], f[i - 1] + sum(a[i]));
chkmax(g[i], f[i - 1] + sum(a[i]));
for (int j = 1, len; j <= m && b[j] <= a[i]; ++j)
if ((len = a[i] - b[j]) < i)
chkmax(g[i], f[L[i - len] - 1] + sum(b[j], a[i]));
chkmax(f[i], g[i]);
for (int j = m, len; j && b[j] >= a[i]; --j)
if ((len = b[j] - a[i]) <= n - i)
chkmax(f[R[i + len]], g[i] + sum(a[i] + 1, b[j]));
}
std::cout << f[n] << '\n';
return 0;
}
[CF436D]Pudding Monsters的更多相关文章
- 【CF526F】Pudding Monsters cdq分治
[CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...
- Codeforces 526F Pudding Monsters - CDQ分治 - 桶排序
In this problem you will meet the simplified model of game Pudding Monsters. An important process in ...
- [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\) 为一个排列. 转换成排列 ...
- 【CF526F】Pudding Monsters
题意: 给你一个排列pi,问你有对少个区间的值域段是连续的. n≤3e5 题解: bzoj3745
- Pudding Monsters CodeForces - 526F (分治, 双指针)
大意: n*n棋盘, n个点有怪兽, 求有多少边长为k的正方形内恰好有k只怪兽, 输出k=1,...,n时的答案和. 等价于给定n排列, 对于任意一个长为$k$的区间, 若最大值最小值的差恰好为k, ...
- Codeforces 526F Pudding Monsters
先把题目抽象一下: 有一个静态的数组,求有多少个区间[i,j]满足:j-i==max{ai,...,aj}-min{ai,...,aj} 也就是要求max-min+i-j==0的区间数 所以肿么做呢? ...
随机推荐
- python学习笔记一: 《python3 input()函数》
一.在学习之前需要先了解: 1.Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型,即把任何输入看作str. 2.input可以用作文本输入,如用户名,密码框 ...
- Kerberos(一) 安装
1.服务器基本信息 操作系统:centos7 数量:2 主机名映射关系 IP hostname server 192.168.4.50 manager1 Kerberos server(kdc) 19 ...
- shell中$(( ))、$( )、``与${ }的区别
转 :shell $(( )).$( ).``与${ }的区别 $( )与` `(反引号)命令替换 在bash中,$( )与` `(反引号)都是用来作命令替换的.命令替换与变量替换差不多,都是用来重组 ...
- ipv4的TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG)
1 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 2 3 其中,对于我们日常的分析有用的就是前面的五个字段. 4 5 它们的含义是 ...
- CMU Database Systems - MVCC
MVCC是一种用空间来换取更高的并发度的技术 对同一个对象不去update,而且记录下每一次的不同版本的值 存在不会消失,新值并不能抹杀原先的存在 所以update操作并不是对世界的真实反映,这是一种 ...
- 利用art.template模仿VUE
首先先看一下Typescript代码: import template = require('art-template/lib/template-web'); interface TemplateBi ...
- (十三)GBDT模型用于评分卡模型python实现
python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...
- MSYS2 常见操作
博客转自:http://www.cnblogs.com/vincenzo/archive/2010/05/13/1734230.html 和 https://blog.csdn.net/langres ...
- python之psutil模块
简述 psutil是一个跨平台库(http://code.google.com/p/psutil/) ,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系 ...
- SVN限制普通用户删除文件及提交时必须填写log日志
SVN用得也算挺广泛的,但是它也存在着一个大问题,就是权限控制得比较差,要么读,要么读写,而读写就意外着可以删除文件(目前我的理解是这样,如果有什么不对的地方,请多指教). 刚好前段时间发生了开发人员 ...