题解 P7997 [WFOI - 01] 刷题 (problem)

首先假设 a 中最大的是 A,那么你达到的值一定不会达到 2×A。因为当你达到 A 及以上时,你就必须要减去一个值,无法上升了。

考虑到如果你在第 i 天达到了 x,那么你在第 i+2 天也可以达到 x。证明就是用两次 A 相互抵消。所以对于每个 x,你要算出第一个奇数和偶数 i 满足在第 i 天可以到达 x

你会发现这个和 [CSP-J2019] 加工零件 非常相似。只要把图建出来,跑一遍奇偶最短路就行了。由于边权都是 1,你可以使用 BFS 做到 O(nA) 的复杂度。

最后对于每个询问,在奇数和偶数里找一下 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;
}
posted @   Little09  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示