社区讨论

关于本题 WA on #2 的一些疑问

学术版参与者 2已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@mhj93o5s
此快照首次捕获于
2025/11/03 22:44
4 个月前
此快照最后确认于
2025/11/03 22:44
4 个月前
查看原帖
https://www.luogu.com.cn/problem/P10034
SPJ 给的是 Wrong Answer.wrong answer Wrong construction.
应该是构造出了问题,但是蒟蒻没想明白为什么会 WA。
请各路大佬指点。
代码如下
CPP
#include <bits/stdc++.h>
using namespace std;

const int maxn = 5e5+100;
int n,l,pre[maxn+100],out[maxn+100],cnt1 = 0,cnt0 = 0;
char s[maxn+100];
bool dp[maxn+100];

void output(int x){
	//cout << x << " ";
	vector<int> ans,vec2,vec0;
	for(int i = x;i >= 1;i = pre[i]){
		ans.push_back(i-pre[i]);
	}
	//for(int i = 0;i < ans.size();i++) cout << ans[i] << " ";
	//cout << '\n';
	int pos = 0,num0 = x-cnt1,cntnum = 0,cnum0 = 0;
	if(cnt0 == n){
		if(n == 1) cout << -1 << '\n';
		else{
			for(int i = 1;i <= n-1;i++) cout << i+1 << " ";
			cout << 1 << " \n";
		}
		return;
	}
	for(int i = 1;i <= n;i++){
		if(s[i] == '1'){
			vec2.push_back(i);
			cntnum++;
		}
		if(cntnum == ans[pos]){ 
			int k = vec2.size();
			for(int j = 0;j < k-1;j++){
				out[vec2[j]] = vec2[j+1];
			}
			out[vec2[k-1]] = vec2[0];
			vec2.clear();
			cntnum = 0;
			pos++;
		}
	}
	for(int i = 1;i <= n;i++){
		if(s[i] == '0'){
			if(cnum0 < num0){
				vec2.push_back(i);
				cntnum++,cnum0++;
				if(cntnum == ans[pos]){ 
					int k = vec2.size();
					for(int j = 0;j < k-1;j++){
						out[vec2[j]] = vec2[j+1];
					}
					out[vec2[k-1]] = vec2[0];
					vec2.clear();
					cntnum = 0;
					pos++;
				}
			}
			else{
				vec0.push_back(i);
			}
		}
	} 
	if(vec0.size() != 0){
		int k = vec0.size();
		for(int i = 0;i < k-1;i++){
			out[vec0[i]] = vec0[i+1];
		}
		out[vec0[k-1]] = vec0[0];
	}
	for(int i = 1;i <= n;i++) cout << out[i] << " ";
	cout << '\n';
	return;
}

inline void Main(){
	cin >> n >> l; 
	int tmp = l;
	for(int i = 1;i <= n;i++) cin >> s[i];
	if(l == 0){
		for(int i = 1;i < n;i++) cout << i+1 << " ";
		cout << 1 << '\n';
		return;
	}
	vector<int> vec; 
	for(int i = 2;i * i <= l && i <= n && tmp != 0;i++){
		if(tmp % i == 0) vec.push_back(i);
		else continue; 
		while(tmp % i == 0) tmp /= i;
	}
	if(tmp != 0 && tmp != 1 && tmp <= n) vec.push_back(tmp);
	//for(int i = 0;i < vec.size();i++) cout << vec[i] << " ";
	//cout << '\n';
	memset(dp,0,sizeof(dp));
	for(int i = 0;i <= n;i++) pre[i] = 0;
	dp[0] = 1,dp[1] = 0;
	for(int i = 0;i <= n;i++){
		for(int j = 0;j < vec.size();j++){
			if(i - vec[j] >= 0){
				dp[i] |= dp[i-vec[j]];
				if(dp[i-vec[j]] == 1) pre[i] = i-vec[j];
			}
		}
	}
	//for(int i = 1;i <= n;i++) cout << dp[i] << " ";
	//cout << '\n'; 
	cnt1 = cnt0 = 0;
	for(int i = 1;i <= n;i++) s[i] == '1' ? cnt1++ : cnt0++;
	for(int i = cnt1;i <= n;i++){
		if(dp[i] == 1 && i != n-1){
			memset(out,0,sizeof(out));
			output(i); 
			return;
		}
	}
	cout << -1 << '\n';
	return;
}

int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int T; cin >> T;
	while(T--) Main();
	return 0;
}

回复

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

正在加载回复...