题解 P7997 [WFOI - 01] 刷题 (problem)
首先假设 中最大的是 ,那么你达到的值一定不会达到 。因为当你达到 及以上时,你就必须要减去一个值,无法上升了。
考虑到如果你在第 天达到了 ,那么你在第 天也可以达到 。证明就是用两次 相互抵消。所以对于每个 ,你要算出第一个奇数和偶数 满足在第 天可以到达 。
你会发现这个和 [CSP-J2019] 加工零件 非常相似。只要把图建出来,跑一遍奇偶最短路就行了。由于边权都是 ,你可以使用 BFS 做到 的复杂度。
最后对于每个询问,在奇数和偶数里找一下 lower_bound 就好了。
// By: Little09
// Problem: T216142 [WFOI - 01] 刷题 (problem)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/T216142?contestId=58414
// Memory Limit: 512 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=2000000000000000000;
int n,T;
const int N=2e3+5;
int a[N],MAX;
ll ans[N*4];
vector<int>t[N*4];
inline ll read()
{
ll F=1,ANS=0;
char C=getchar();
while (C<'0'||C>'9')
{
if (C=='-') F=-1;
C=getchar();
}
while (C>='0'&&C<='9')
{
ANS=ANS*10+C-'0';
C=getchar();
}
return F*ANS;
}
void add(int x,int y)
{
t[x].push_back(y);
}
queue<int>q;
bool used[N*4];
void bfs()
{
for (int i=1;i<=4*MAX;i++) ans[i]=inf;
used[0]=1,ans[0]=0;
q.push(0);
while (!q.empty())
{
int u=q.front();
q.pop();
for (int i=0;i<t[u].size();i++)
{
int v=t[u][i];
if (used[v]) continue;
ans[v]=ans[u]+1;
q.push(v);
used[v]=1;
}
}
}
ll w[N*2],r[N*2];
int main()
{
n=read(),T=read(),MAX=10;
for (int i=1;i<=n;i++) a[i]=read(),MAX=max(MAX,a[i]);
for (int i=0;i<2*MAX;i++)
{
for (int j=1;j<=n;j++)
{
if (i<a[j]) add(i,i+a[j]+2*MAX),add(i+2*MAX,i+a[j]);
else add(i,i-a[j]+2*MAX),add(i+2*MAX,i-a[j]);
}
}
bfs();
for (int i=MAX*2-1;i>=0;i--)
{
w[i]=ans[i];
if (i!=MAX*2-1) w[i]=min(w[i+1],w[i]);
}
for (int i=MAX*4-1;i>=MAX*2;i--)
{
r[i-MAX*2]=ans[i];
if (i!=MAX*4-1) r[i-MAX*2]=min(r[i-MAX*2+1],r[i-MAX*2]);
}
while (T--)
{
ll x=read();
int u;
if (x%2==0) u=upper_bound(w,w+MAX*2,x)-w-1;
else u=upper_bound(r,r+MAX*2,x)-r-1;
printf("%d\n",u);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构