萌新 CF 构造题求助
  • 板块学术版
  • 楼主FFTotoro
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/12/8 22:04
  • 上次更新2023/10/27 00:05:50
查看原帖
萌新 CF 构造题求助
556366
FFTotoro楼主2022/12/8 22:04

RT,昨天举行完的 NERC 比赛中的 A 是个 *1900 的构造,写了一个代码交上去但是 WA on Test #5.

这里将思路和代码发出来,请各位大佬看看有无什么问题。

题目链接:https://codeforces.com/problemset/problem/1773/A

思路:

注意:为了描述方便,这里的 mod\bmod 与普通的 mod\bmod 定义不同,在这里,nmodn=nn\bmod n=n

mim_iiiaia_i 中出现的位置,那么计算出所有的 (mii+n)modn(m_i-i+n)\bmod n,用一个 set 储存。接着找到一个 kk 未在 set 中出现,满足 1k<n1\le k<n(如果没有满足条件的 kk 就输出 Impossible),然后构造如下的数组:

qq 数组为 (k+1)modn,(k+2)modn,,(k+n)modn(k+1)\bmod n,(k+2)\bmod n,\ldots,(k+n)\bmod n

pp 数组则满足 pqi=mip_{q_i}=m_i

因为 k>0k>0 所以 qiiq_i\ne i

又因为不存在 (k+i)modn=mi(k+i)\bmod n=m_ikk 未在 set 中出现,而 set 存储的是每个可能的 miim_i-i),所以 qimiq_i\ne m_i,进而得知 piip_i\ne 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;
}
2022/12/8 22:04
加载中...