题面&翻译

题解

虽然

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 类操作后走到的位置,那么有如下转移:

  1. {

    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)]

  2. {

    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)的更多相关文章

  1. LightOJ 1033 Generating Palindromes(dp)

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

  2. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  3. UVA11125 - Arrange Some Marbles(dp)

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

  4. 【POJ 3071】 Football(DP)

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

  5. 初探动态规划(DP)

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

  6. Tour(dp)

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

  7. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

  8. Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

    Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...

  9. 最长公共子序列长度(dp)

    /// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...

随机推荐

  1. 利用Github Action实现Tornadofx/JavaFx打包

    原文地址: 利用Github Action实现Tornadofx/JavaFx打包 - Stars-One的杂货小窝 最近开了个新项目,主要是个工具软件,也算个人的自娱自乐吧,也算开源的一部分,想着都 ...

  2. 技术分享 | 想做App测试就一定要了解的App结构

    本文节选自霍格沃兹测试开发学社内部教材 app 的结构包含了 APK 结构和 app 页面结构两个部分 APK结构 APK 是 Android Package 的缩写,其实就是 Android 的安装 ...

  3. Moriis神级遍历!

    Moriis 遍历 Morris 遍历是二叉树遍历的一种方式,传统的递归和非递归遍历的时间复杂的都是O(N),空间复杂度都是O(h)(h为树的高度),而 Morris 遍历可以做到时间复杂的依然为 O ...

  4. 合宙Air32F103CBT6开发板上手报告

    2022年6月初合宙新上市了 Air32F103 系列 MCU, 市面上 STM32F103 的克隆军队又增加了新的一员. 这次不知道是哪家的贴牌, 分 Air32F103CBT6 和 Air32F1 ...

  5. JSP 入门学习

    概念:java Server Pages java服务器页面 一个特殊的,既可以定义html标签,也可以定义Java代码 用于简化书写 原理 在浏览器上访问 jsp文件时 服务器先解析请求,找到是否有 ...

  6. [BJDCTF2020]The mystery of ip|[CISCN2019 华东南赛区]Web11|SSTI注入

    记录一下BUUCTF中两个类似的SSTI注入关卡 [BJDCTF2020]The mystery of ip-1: 1.打开之后显示如下: 2.在hint.php中进行了相关提示,如下: 3.既然获取 ...

  7. Eclipse 想运行一个java文件,结果却运行了另外一个

    参考: Eclipse 想运行一个java文件,结果却运行了另外一个_小鹰信息技术服务部-CSDN博客_eclipse怎么运行另一个

  8. Elasticsearch面试题

    Elasticsearch面试题 1.Elasticsearch是如何实现master选举的? 1.对所有可以成为master的节点根据nodeId排序,每次选举每个节点都把自己所知道节点排一次序,然 ...

  9. Linux 安装Apche服务

    用yum 进行在线安装apche服务 yum install -y httpd 我这边是centos7 需要开启一下端口: 1 firewall-cmd --zone=public --add-por ...

  10. JDBCToolsV3 :DAO

    编写文件和步骤 ①,bean模块:数据类Course,包含数据的class,封装数据类型; ②,DAO:1)定义对数据的操作接口,及规定标准(包含怎样的操作).例如:CourseDAO数据库操作的接口 ...