设 为到达 的答案,不能到达则为 。
设 为考虑完前面的操作时,单独使用当前操作来到达 的最小步数,不能到达则为 。
每次读进一个操作就把 dp 一次,然后更新 。
具体的:
-
初始化
-
若 ,则 或 。
-
根据 更新 ,若 ,则对 更新。
时间复杂度
//Code by do_while_true
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
namespace do_while_true {
#define ld double
#define ll long long
#define re register
#define pb push_back
#define fir first
#define sec second
#define pp std::pair
#define mp std::make_pair
const ll mod = 1e9 + 7;
template <typename T>
inline T Max(T x, T y) { return x > y ? x : y; }
template <typename T>
inline T Min(T x, T y) { return x < y ? x : y; }
template <typename T>
inline T Abs(T x) { return x < 0 ? -x : x; }
template <typename T>
inline T& read(T& r) {
r = 0; bool w = 0; char ch = getchar();
while(ch < '0' || ch > '9') w = ch == '-' ? 1 : 0, ch = getchar();
while(ch >= '0' && ch <= '9') r = r * 10 + (ch ^ 48), ch = getchar();
return r = w ? -r : r;
}
template <typename T>
inline T qpow(T x, T y) {
re T sumq = 1; x %= mod;
while(y) {
if(y&1) sumq = sumq * x % mod;
x = x * x % mod;
y >>= 1;
}
return sumq;
}
char outch[110];
int outct;
template <typename T>
inline void print(T x) {
do {
outch[++outct] = x % 10 + '0';
x /= 10;
} while(x);
while(outct >= 1) putchar(outch[outct--]);
}
}
using namespace do_while_true;
const int N = 1e5 + 10;
const int INF = 0x3ffffff;
int n, m;
int f[N], g[N];
void work(int q) {
int t, y; ll x;
for(int i = 1; i <= m; ++i) g[i] = INF;
read(t); read(x); read(y);
if(t == 1) {
x = x / 100000 + (x % 100000 > 0);
g[x] = 1;
for(int i = 1; i <= m; ++i)
if(f[i] != INF) g[i] = 0;
for(int i = 1; i <= m; ++i)
if(g[i] != y && g[i] != INF && i+x <= m)
g[i+x] = Min(g[i+x], g[i]+1);
for(int i = 1; i <= m; ++i)
if(g[i] <= y && f[i] == INF)
f[i] = q;
}
else {
for(int i = 1; i <= m; ++i)
if(f[i] != INF) g[i] = 0;
for(int i = 1; i <= m; ++i) {
int p = (int)std::ceil(1.0 * i * x / 100000);
if(g[i] != y && g[i] != INF && p <= m)
g[p] = Min(g[p], g[i]+1);
}
for(int i = 1; i <= m; ++i)
if(g[i] <= y && f[i] == INF)
f[i] = q;
}
}
signed main() {
read(n); read(m);
for(int i = 1; i <= m; ++i) f[i] = INF;
for(int i = 1; i <= n; ++i)
work(i);
for(int i = 1; i <= m; ++i) printf("%d ", f[i] == INF ? -1 : f[i]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?