社区讨论

关于 bfs 的做法

P11229[CSP-J 2024] 小木棍参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m2xhih2k
此快照首次捕获于
2024/10/31 23:52
去年
此快照最后确认于
2025/11/04 15:37
4 个月前
查看原帖
考虑用 fif_i 表示用 ii 根木棍组成的最优数字中最后一位是什么,由于 bfs 可以保证深度从小到大(即数字从小到大),遍历顺序按照数字大小遍历,遍历过的不会再遍历,应该可以保证正确性且预处理复杂度 O(n)O(n)
每次使用 lstilst_i 记录上一个是什么,用一个栈把各个数位依次连接起来就是最终的答案。
不知道这种解法是否正确,如有错误请指出并 Hack。
CPP
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int M=1e5+5;
bitset<M>vis;	queue<int>q;
int T,n,x,f[M],lst[M];
inline void solve(int x,int pre,int num){
	if(vis[x])return;
	vis[x]=1,f[x]=num,lst[x]=pre,q.push(x);
}
signed main(){
	q.push(0);
	while(q.size()){
		int x=q.front();	q.pop();
		if(x&&x+6<M)solve(x+6,x,0);
		if(x+2<M)	solve(x+2,x,1);
		if(x+5<M)	solve(x+5,x,2);
		if(x+4<M)	solve(x+4,x,4);
		if(x+6<M)	solve(x+6,x,6);
		if(x+3<M)	solve(x+3,x,7);
		if(x+7<M)	solve(x+7,x,8);
	} scanf("%lld",&T);
	while(T--){
		scanf("%lld",&x);
		if(!vis[x])puts("-1");
		else {
			stack<int>s;
			while(x)s.push(f[x]),x=lst[x];
			while(s.size())
				printf("%lld",s.top()),s.pop();
			puts("");
		}
	} return 0;
}
通过了民间数据,最慢点 28ms,记录详情

回复

2 条回复,欢迎继续交流。

正在加载回复...