RT,昨天举行完的 NERC 比赛中的 A 是个 *1900 的构造,写了一个代码交上去但是 WA on Test #5.
这里将思路和代码发出来,请各位大佬看看有无什么问题。
题目链接:https://codeforces.com/problemset/problem/1773/A
思路:
注意:为了描述方便,这里的 mod 与普通的 mod 定义不同,在这里,nmodn=n。
记 mi 为 i 在 ai 中出现的位置,那么计算出所有的 (mi−i+n)modn,用一个 set 储存。接着找到一个 k 未在 set 中出现,满足 1≤k<n(如果没有满足条件的 k 就输出 Impossible
),然后构造如下的数组:
q 数组为 (k+1)modn,(k+2)modn,…,(k+n)modn;
p 数组则满足 pqi=mi;
因为 k>0 所以 qi=i;
又因为不存在 (k+i)modn=mi(k 未在 set
中出现,而 set
存储的是每个可能的 mi−i),所以 qi=mi,进而得知 pi=i。
看起来思路好像没有问题,能否有大佬帮忙 hack 一下?感激不尽。
顺带附上出错的代码:
#include<bits/stdc++.h>
using namespace std;
int a[100001],m[100001],p[100001],q[100001];
int main(){
ios::sync_with_stdio(false);
int t; cin>>t;
while(t--){
int n; cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],m[a[i]]=i;
int c=0; set<int> s;
for(int i=1;i<=n;i++)s.emplace((m[i]-i+n)%n);
for(int i=1;i<n;i++)if(s.find(i)==s.end()){c=i; break;}
if(!c){cout<<"Impossible\n"; continue;}
cout<<"Possible\n";
for(int i=1;i<=n;i++)q[i]=(i+c)%n?(i+c)%n:n;
for(int i=1;i<=n;i++)p[q[i]]=m[i];
for(int i=1;i<=n;i++)cout<<p[i]<<' ';
cout<<endl;
for(int i=1;i<=n;i++)cout<<q[i]<<' ';
cout<<endl;
}
return 0;
}