社区讨论
关于本题 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 条回复,欢迎继续交流。
正在加载回复...