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​≤hj​max​dp[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)的更多相关文章

  1. Codeforces Round #471 (Div. 2) F. Heaps(dp)

    题意 给定一棵以 \(1\) 号点为根的树.若满足以下条件,则认为节点 \(p\) 处有一个 \(k\) 叉高度为 \(m\) 的堆: 若 \(m = 1\) ,则 \(p\) 本身就是一个 \(k\ ...

  2. 牛客国庆集训派对Day6 && CCPC-WannaFly-Camp #1 F. kingdom(DP)

    题目链接:https://www.nowcoder.com/acm/contest/206/F 题意:一棵 n 个点的树,根为 1,重儿子到父亲的费用为 0,其余为 1,问所有点到 1 的最大总费用是 ...

  3. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  4. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  5. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  6. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  7. Tour(dp)

    Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...

  8. Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)

    Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...

  9. Leetcode之动态规划(DP)专题-392. 判断子序列(Is Subsequence)

    Leetcode之动态规划(DP)专题-392. 判断子序列(Is Subsequence) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母. ...

随机推荐

  1. 使用html2canvas,由html转换canvas时,出现图片丢失问题解决方案

    在img标签上加上crossorigin="anonymous":如果是图片地址是跨域网址,请将图片转换为base64格式: 源码如下: <!DOCTYPE html> ...

  2. Xshell缺失mfc110u.dll文件解决方案(有下载链接)

    解决方案 把下面两个文件都下载安装就可以了. 1.vcredist_x86.exe链接: https://pan.baidu.com/s/1njbNHdjqH6x34GQvj4BTBg提取码: pwq ...

  3. 十分钟快速实战Three.js

    前言 本文不会对Three.js几何体.材质.相机.模型.光源等概念详细讲解,会首先分成几个模块给大家快速演示一盒小案例.大家可以根据这几个模块快速了解Three.js的无限魅力.学习 我们会使用Th ...

  4. 论文解读(SR-GNN)《Shift-Robust GNNs: Overcoming the Limitations of Localized Graph Training Data》

    论文信息 论文标题:Shift-Robust GNNs: Overcoming the Limitations of Localized Graph Training Data论文作者:Qi Zhu, ...

  5. iNeuOS工业互联网操作系统,视图建模(WEB组态)增加2154个行业矢量图元、大屏背景及相关图元

     1.   概述 现在三维数字孪生(3D)比较流行,各行业各领域的项目也都在上数字孪生项目或是项目中包括数字孪生模块,能做的厂家也很多.从全厂区的应用视觉的冲击力还是比较震撼,但是数字孪生不太可能包括 ...

  6. 简述基于CPU的机器码运行过程

    引言:会写日志的人不一定是优秀的人,但优秀的人往往是会写日志的 这里涉及五个部分,胡歌,林拜,贾以枚,罗伊人,冯眷眷-林拜老婆 依次对应CPU里的控制器, CPU里的寄存器,存储器,输入电路,输出电路 ...

  7. sort基本用法

    sort 选项 -u --去除重复行 -r --降序排列,默认是升序 -o --由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > n ...

  8. NC19115 选择颜色

    NC19115 选择颜色 题目 题目描述 \(n\) 个人排成一个环形,每个人要从 \(c\) 种颜色中选择一个. 牛牛希望相邻的人选择的颜色是不同的 问有多少种方案. 输出方案数对 \(10007\ ...

  9. Codeforces Round #789 (Div. 2) A-C

    Codeforces Round #789 (Div. 2) A-C A 题目 https://codeforces.com/problemset/problem/1677/A 题解 思路 知识点:模 ...

  10. Spring框架系列(12) - Spring AOP实现原理详解之JDK代理实现

    上文我们学习了SpringAOP Cglib动态代理的实现,本文主要是SpringAOP JDK动态代理的案例和实现部分.@pdai Spring框架系列(12) - Spring AOP实现原理详解 ...