結果
| 問題 | No.2496 LCM between Permutations |
| コンテスト | |
| ユーザー |
Haa
|
| 提出日時 | 2023-10-06 22:36:54 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 3,092 bytes |
| コンパイル時間 | 2,113 ms |
| コンパイル使用メモリ | 191,260 KB |
| 実行使用メモリ | 25,580 KB |
| 平均クエリ数 | 853.86 |
| 最終ジャッジ日時 | 2024-07-26 16:41:40 |
| 合計ジャッジ時間 | 5,897 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 23 RE * 5 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll,ll> P;
typedef vector<ll> VI;
typedef vector<VI> VVI;
#define REP(i,n) for(int i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()
template<typename T> bool chmax(T& x, const T& y){return (x<y)?(x=y,true):false;};
template<typename T> bool chmin(T& x, const T& y){return (x>y)?(x=y,true):false;};
constexpr ll MOD=998244353;
constexpr ll INF=2e18;
int cnt=0;
int ask(int i, int j){
cnt++;
cout << "? " << i+1 << " " << j+1 << endl;
int x; cin >> x;
return x;
}
int main(){
int n; cin >> n;
VI pi(n), qi(n);
iota(ALL(pi),0);
iota(ALL(qi),0);
set<int> as, bs;
for(int i=1;i<=n;i++){
as.insert(i);
bs.insert(i);
}
VI a(n,-1), b(n,-1);
VI er;
int sp=-1, sq=-1;
while(1){
VI q;
int mq=n*n;
for(auto i:qi){
int x=ask(pi.back(),i);
q.push_back(x);
chmin(mq,x);
if(x==1){
sp=pi.back();
sq=i;
}
}
a[pi.back()]=mq;
as.erase(mq);
pi.pop_back();
map<int,int> mpx;
REP(i,(int)q.size()){
if(mpx.find(q[i])==mpx.end())
mpx[q[i]]=qi[i];
else
mpx[q[i]]=-1;
}
for(auto i:bs){
int l=i*mq/__gcd(i,mq);
if(mpx.find(l)!=mpx.end()){
if(mpx[l]==-1)
continue;
er.push_back(i);
b[mpx[l]]=i;
}
}
for(auto i:er) bs.erase(i);
er.clear();
VI nqi;
REP(i,(int)q.size()){
if(q[i]==mq){
nqi.push_back(qi[i]);
}
}
swap(qi,nqi);
if(mq==1)
break;
VI p;
int mp=n*n;
for(auto i:pi){
int x=ask(i,qi.back());
p.push_back(x);
chmin(mp,x);
if(x==1){
sp=i;
sq=qi.back();
}
}
b[qi.back()]=mp;
bs.erase(mp);
qi.pop_back();
map<int,int> mpy;
REP(i,(int)p.size()){
if(mpy.find(p[i])==mpy.end())
mpy[p[i]]=pi[i];
else
mpy[p[i]]=-1;
}
for(auto i:as){
int l=i*mp/__gcd(i,mp);
if(mpy.find(l)!=mpy.end()){
if(mpy[l]==-1)
continue;
er.push_back(i);
a[mpy[l]]=i;
}
}
for(auto i:er) as.erase(i);
er.clear();
VI npi;
REP(i,(int)p.size()){
if(p[i]==mp){
npi.push_back(pi[i]);
}
}
swap(pi,npi);
if(mp==1)
break;
}
REP(i,n){
if(a[i]==-1)
a[i]=ask(i,sq);
if(b[i]==-1)
b[i]=ask(sp,i);
}
assert(cnt<=n*3);
cout << "!";
REP(i,n) cout << " " << a[i];
REP(i,n) cout << " " << b[i];
cout << endl;
return 0;
}
Haa