ABC 203 F - Weed (DP)
ABC203F - Weed
题意转述

S
t
e
v
e
\rm Steve
Steve 和
A
l
e
x
\rm Alex
Alex 正在下界(
N
e
t
h
e
r
l
e
n
d
\rm Netherlend
Netherlend)玩音符盒(
N
o
t
e
b
l
o
c
k
\rm Note~block
Note block)。
S
t
e
v
e
\rm Steve
Steve 和
A
l
e
x
\rm Alex
Alex 按下了按钮,听着各色音符被发光的红石线激活,感到无比欢乐。但是他们发现有的音符盒发不出声音,原因是被垂泪藤占据了上方的空气方块。于是
S
t
e
v
e
\rm Steve
Steve 和
A
l
e
x
\rm Alex
Alex 打算清除这些垂泪藤。他们是这样清除的:
- (为了有效地清除垂泪藤,他们打算到垂泪藤上方,挖掉它们上面的方块,除根)
- S
t
e
v
e
\rm Steve
Steve 先记下了其中至多
K
K
K 条垂泪藤,上去挖掉了它们上面的方块,清除它们。
- A
l
e
x
\rm Alex
Alex 重复进行这样的操作,直到所有垂泪藤被清除完: 找到长度最大的一条未除掉的垂泪藤的长度
H
H
H ,告诉
S
t
e
v
e
\rm Steve
Steve 所有未除掉的长度大于
H
2
\frac{H}{2}
2H 的垂泪藤的位置,然后让他除掉它们。
S
t
e
v
e
\rm Steve
Steve 想让
A
l
e
x
\rm Alex
Alex 进行的操作次数最少,在这个前提下,自己一开始记忆的垂泪藤数(
≤
K
\leq K
≤K)尽可能少。但是一共有
N
(
≤
2
⋅
1
0
5
)
N(\leq2\cdot10^5)
N(≤2⋅105) 条长度
h
i
≤
1
0
9
h_i\leq10^9
hi≤109 的垂泪藤(有个强大的模组消除了高度限制),于是
S
t
e
v
e
\rm Steve
Steve 想先向你询问,满足他的要求的情况下,
A
l
e
x
\rm Alex
Alex 进行的操作数和自己一开始记忆的垂泪藤数分别是多少。
题解
由于每次操作过后,最长的垂泪藤长度都至少会减半,因此,总操作数一定不会超过
log
H
m
a
x
+
1
=
31
\log H_{max}+1=31
logHmax+1=31,那么我们就可以用一个简单的
D
y
n
a
m
i
c
P
r
o
g
r
a
m
m
i
n
g
\rm Dynamic~Programming
Dynamic Programming 来解决这道题:
先把所有的垂泪藤按长度从小到大排序,令
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 表示以第
j
j
j 条垂泪藤为最长开始,进行了
i
i
i 次操作后,清除的最大可能条数(
d
p
[
0
]
[
0
]
=
0
dp[0][0]=0
dp[0][0]=0)。有如下转移:
d
p
[
i
]
[
j
]
=
max
2
h
k
≤
h
j
d
p
[
i
−
1
]
[
k
]
+
∑
2
h
k
>
h
j
,
k
≤
j
1
dp[i][j]=\max_{2h_k\leq h_j} dp[i-1][k]+\sum_{2h_k>h_j,k\leq j}1
dp[i][j]=2hk≤hjmaxdp[i−1][k]+2hk>hj,k≤j∑1
这个可以通过预处理以及前缀和优化等方式达到
O
(
1
)
O(1)
O(1) 转移,也当然可以用滚动少掉一维。
如果找到了最小的
i
i
i ,使得
d
p
[
i
]
m
a
x
≥
N
−
K
dp[i]_{max}\geq N-K
dp[i]max≥N−K,那么就可以输出
i
i
i 和
N
−
d
p
[
i
]
m
a
x
N-dp[i]_{max}
N−dp[i]max 了。
开头可以加个
k
=
n
k=n
k=n 的特判。
CODE
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 200005
#define DB double
#define LL long long
#define ENDL putchar('\n')
#define lowbit(x) ((-x) & (x))
#define INF 0x3f3f3f3f
LL read() {
LL f=1,x=0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
int n,m,i,j,s,o,k;
int a[MAXN];
int dp[2][MAXN];
int main() {
n = read();k = read();
for(int i = 1;i <= n;i ++) {
a[i] = read();
}
if(k == n) {printf("0 %d\n",n);return 0;}
sort(a + 1,a + 1 + n);
int ans = 0;
for(int i = 1;i <= 32;i ++) {
int ad = 0,mx = 0;
for(int j = 1;j <= n;j ++) {
while(ad < n && a[ad+1] <= a[j]/2) mx = max(mx,dp[i&1^1][++ ad]);
dp[i&1][j] = mx + (j-ad);
ans = max(dp[i&1][j],ans);
}
if(ans >= n-k) {printf("%d %d\n",i,n-ans);return 0;}
}
return 0;
}
ABC 203 F - Weed (DP)的更多相关文章
- Codeforces Round #471 (Div. 2) F. Heaps(dp)
题意 给定一棵以 \(1\) 号点为根的树.若满足以下条件,则认为节点 \(p\) 处有一个 \(k\) 叉高度为 \(m\) 的堆: 若 \(m = 1\) ,则 \(p\) 本身就是一个 \(k\ ...
- 牛客国庆集训派对Day6 && CCPC-WannaFly-Camp #1 F. kingdom(DP)
题目链接:https://www.nowcoder.com/acm/contest/206/F 题意:一棵 n 个点的树,根为 1,重儿子到父亲的费用为 0,其余为 1,问所有点到 1 的最大总费用是 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)
Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...
- Leetcode之动态规划(DP)专题-392. 判断子序列(Is Subsequence)
Leetcode之动态规划(DP)专题-392. 判断子序列(Is Subsequence) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母. ...
随机推荐
- GDOI 2021 普及组溺水记
Day 1 T1 一看样例:答案不就是 \(\dfrac{\max_{i=1}^n a_i +1}{2}\) 吗? 于是自信打上,拍都不拍.然后就,,对了? 插曲:自己出了一个极端数据,发现 scan ...
- 互联网大厂目标管理OKR实践落地与反思
上一篇「 互联网公司目标管理OKR和绩效考核的误区 」介绍了使用 OKR 时要澄清的一些概念,但是实际使用中又如何呢?我们快手也是很大的互联网公司,大家都是年轻人,思维活跃,容易接受新事物,敢尝试,但 ...
- 编程式导航路由跳转到当前路由(参数不变), 多次执行会抛出NavigationDuplicated的警告错误?
注意:编程式导航(push|replace)才会有这种情况的异常,声明式导航是没有这种问题,因为声明式导航内部已经解决这种问题. 这种异常,对于程序没有任何影响的. 为什么会出现这种现象: 由于vue ...
- CVE-2021-3156漏洞复现
CVE-2021-3156linux sudo 权限提升 版本ubantu18.04 使用这个命令可以是普通用户直接提升至管理员权限. 手动测试终端输入 sudoedit -s / 不知道什么原因ub ...
- numpy学习笔记02
简介 numpy.array() 数组对象,可以表示普通的一维数组,或者二维矩阵,或者任意数据:并且它可以对数组中的数据进行非常高效的运算,如:数据统计.图像处理.线性代数等 numpy 之所以能运行 ...
- SAP 实例 13 Random Grouping with LOOP
REPORT demo_loop_group_by_random. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS: main, class_ ...
- webpack中文api
1. 简介 1.Plugins://插件 webpack has a rich plugin interface.Most of the features are internal plug ...
- Windows 2008R2 IIS环境配置(靶机)
一.Windows 2008 R2系统安装 VMware Workstation 15安装包 链接:https://pan.baidu.com/s/11sYcZTYPqIV-pyvzo7pWLQ 提取 ...
- rhel挂载本地光盘为yum源
挂载光盘 mount /dev/sr0 /mnt/cdrom mkdir /mnt/cdrom 临时挂载 mount /dev/sr0 /mnt/cdrom 永久挂载光盘 mount -a 执行挂载 ...
- SpringCloud微服务实战——搭建企业级开发框架(四十三):多租户可配置的电子邮件发送系统设计与实现
在日常生活中,邮件已经被聊天软件.短信等更便捷的信息传送方式代替.但在日常工作中,我们的重要的信息通知等非常有必要去归档追溯,那么邮件就是不可或缺的信息传送渠道.对于我们工作中经常用到的系统,里面 ...