[CF1498D] Bananas in a Microwave (DP)
题面&翻译
题解
虽然
m
m
m 很大,但是
n
n
n 很小,因此题目允许我们在
O
(
n
m
)
O(nm)
O(nm) 以内解决这道题。
定义一个 dp[i][j]=0/1 ?
如果是第
i
i
i 个操作时能不能停在
j
j
j 点的话,我们会发现,从第一个最小的
i
i
i 满足
d
p
[
i
]
[
j
]
=
1
dp[i][j]=1
dp[i][j]=1 开始,后面的
d
p
[
i
+
1...
n
]
[
j
]
dp[i+1...n][j]
dp[i+1...n][j] 一定都为 1 了,因为后面的操作都可以令
a
=
0
a=0
a=0 然后不动。因此我们完全没必要定义第一维。
那就定义一个 dp[i] 表示到
i
i
i 时的最小可能操作?
我们会发现,由于
y
i
y_i
yi 的限制,我们缺少次数的信息,无法转移,因此要同时记录该信息。
令 dp[i][j] 表示到
i
i
i 时的最小可能操作,满足此时操作已经执行了
j
j
j 次总行了吧?
事实上这很荒谬。首先,到
i
i
i 时的最小可能操作是确定的,跟你强制的这个执行次数 “j” 并没关系,而且更严谨地说,操作数是因,执行次数是果,总不能把果放进状态吧。其次,既然最小操作数确定,那么到达
i
i
i 时该操作的执行次数肯定越少越好。
因此我们定义 (pair<int,int>) dp[i] ,第一个值表示到
i
i
i 时的最小可能操作,第二个值表示到
i
i
i 时的最小执行次数。
此时两个 pair 取较小的,刚好是先比较第一位,再比较第二位。
方便起见,令
N
e
x
t
i
(
k
)
{\rm Next}_i(k)
Nexti(k) 表示从位置
k
k
k 开始,执行一次
i
i
i 类操作后走到的位置,那么有如下转移:
- {
d
p
[
i
]
.
f
i
r
s
t
,
d
p
[
i
]
.
s
e
c
o
n
d
+
1
}
→
d
p
[
N
e
x
t
d
p
[
i
]
.
f
i
r
s
t
(
i
)
]
\{dp[i].{\rm first},dp[i].{\rm second}+1\}\rightarrow dp[{\rm Next}_{dp[i].{\rm first}}(i)]
{dp[i].first,dp[i].second+1}→dp[Nextdp[i].first(i)]
- {
j
,
1
}
→
d
p
[
N
e
x
t
j
(
i
)
]
\{j,1\}\rightarrow dp[{\rm Next}_{j}(i)]
{j,1}→dp[Nextj(i)]
第一个转移的条件是执行次数没到
y
y
y 的限制,第二个转移的条件是
j
j
j 大于当前的
d
p
[
i
]
.
f
i
r
s
t
dp[i].{\rm first}
dp[i].first。
状态数
O
(
m
)
O(m)
O(m),转移复杂度
O
(
n
)
O(n)
O(n) ,总复杂度
O
(
n
m
)
O(nm)
O(nm).
CODE
#include<set>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 100005
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
#define int LL
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 ti[MAXN],yy[MAXN];
LL xx[MAXN];
int tm[MAXN],ai[MAXN];
void add(int i,int tim,int Ai) {
if(i < 1 || i > n) return ;
if(tim < tm[i]) tm[i]=tim,ai[i]=Ai;
else if(tim == tm[i]) ai[i] = min(ai[i],Ai);
// printf(" %d : %d,%d\n",i,tm[i],ai[i]);
return ;
}
int adnm(LL x,int i) {return (x+100000ll*i+99999ll)/100000;}
int munm(LL x,int i) {return (x*i+99999ll)/100000;}
signed main() {
m = read();n = read();
for(int i = 1;i <= m;i ++) {
ti[i] = read();
xx[i] = read();
yy[i] = read();
}
for(int i = 1;i <= n;i ++) tm[i] = 0x3f3f3f3f;
tm[0] = 0; ai[0] = 0;
for(int i = 0;i <= n;i ++) {
if(i > 0) printf("%lld ",tm[i] >= 0x3f3f3f3f ? -1:tm[i]);
if(tm[i] < 0x3f3f3f3f) {
int t = tm[i];
if(ti[t] == 1 && ai[i] < yy[t]) add(adnm(xx[t],i),t,ai[i]+1);
else if(ti[t] == 2 && ai[i] < yy[t]) add(munm(xx[t],i),t,ai[i]+1);
for(int j = t+1;j <= m;j ++) {
if(ti[j] == 1) add(adnm(xx[j],i),j,1);
else if(ti[j] == 2) add(munm(xx[j],i),j,1);
}
}
}ENDL;
return 0;
}
[CF1498D] Bananas in a Microwave (DP)的更多相关文章
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- 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坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
- 最长公共子序列长度(dp)
/// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...
随机推荐
- Java开发学习(三)----Bean基础配置及其作用范围
一.bean基础配置 对于bean的基础配置如下 <bean id="" class=""/> 其中,bean标签的功能.使用方式以及id和clas ...
- Java学习-第一阶段-第一节:Java概述
JAVA概述 Java版本 原网址(https://www.oracle.com/java/technologies/java-se-support-roadmap.html) Oracle 将仅将某 ...
- Mybatis架构原理(二)-二级缓存源码剖析
Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...
- BUUCTF-神秘龙卷风
神秘龙卷风 通过提示知道压缩包密码是四位纯数字,通过爆破得到 得到一串编码 看样子应该是brainfuck编码 flag{e4bbef8bdf9743f8bf5b727a9f6332a8}
- Django快速入门之项目配置
开始 环境 python:3.6.2 django:2.0.5 跑起来 用pycharm导入或新建一个Django项目,在目录中存在manage.py的文件,通过下列指令运行Django后台. pyt ...
- mysql备份数据库linux
备份数据库 问题描述: 我们用的是mysql,以今天遇到的情况为例,我们是在两台服务器上要搭相同的平台,部署完成后页面报错,发现是数据库的问题,我们打开数据库查看,确实数据库中少建一个wind数据 ...
- vscode的安装、切换为中文简体、集成sass
VScode设置中文 打开vscode ,按快捷键"Ctrl+Shift+P" 输入configure language,回车 选择安装其他语言 (默认是英文的) 选择简体中安装( ...
- Tapdata Cloud 版本上新!率先支持数据校验、类型映射等6大新功能
Tapdata Cloud cloud.tapdata.net Tapdata Cloud 是国内首家异构数据库实时同步云平台,目前支持 Oracle.MySQL.PG.SQL Server.Mong ...
- JDBCToolsV3 :DAO
编写文件和步骤 ①,bean模块:数据类Course,包含数据的class,封装数据类型; ②,DAO:1)定义对数据的操作接口,及规定标准(包含怎样的操作).例如:CourseDAO数据库操作的接口 ...
- NuGetTools:批量上传、删除和显示NuGet包
快照 前言 NuGet是.NET开发必不可少的包管理工具,在日常更新版本过程中,可能需要批量发布 NuGet 包,也不可避免需要发布一些测试的包,后期想将这些测试或者过期的包删除掉.nuget.org ...