이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "grader.h"
#include <bits/stdc++.h>
using namespace std;
#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for (int i=(a);i>=(b);--i)
int ask(vector<int>& q) { return query(q); }
const int mxN = 257;
int N;
int am[mxN][mxN];
vector<int> al[mxN];
bool vis[mxN];
vector<int> p, q, ans;
vector<int> getcyc(int u, int i) {
vector<int> cyc = { u, al[u][0] };
u = al[u][0];
while (1) {
for (int v : al[u]) if (v != cyc[SZ(cyc)-2]) {
u = v;
break;
}
if (u == cyc[0]) break;
else cyc.push_back(u);
}
return cyc;
}
void solve(int n) {
N = n;
p.assign(N,0); ans.assign(N,-1);
iota(ALL(p),1);
int r = ask(p);
if (r == N) return;
FOR(i,0,N-1) if (ans[i] == -1) {
bool ok = 1;
FOR(j,0,N-1) if (i != j) {
int v;
if (j < i) v = am[j][i];
else {
swap(p[i],p[j]);
v = am[i][j] = ask(p);
swap(p[i],p[j]);
}
if (v-r >= 0) ok = 0;
}
if (ok) {
ans[i] = p[i];
FOR(j,0,N-1) if (i != j) {
int v = (j < i ? am[j][i] : am[i][j]);
if (v-r == -2) ans[j] = p[j];
}
} else {
FOR(j,0,N-1) if (i != j) {
int v = (j < i ? am[j][i] : am[i][j]);
if (v-r == -1) ans[j] = p[j];
else if (v-r == 1) {
al[i].push_back(j);
al[j].push_back(i);
}
else if (v-r == 2) ans[i] = p[j], ans[j] = p[i];
}
}
}
//FOR(i,0,N-1){ FOR(j,0,N-1){ cout << am[i][j] << ' '; } cout << endl; }
FOR(i,0,N-1) if (ans[i] != -1) p[i] = ans[i];
memset(vis,0,sizeof vis);
q.assign(N,0);
FOR(i,0,N-1) q[i] = p[i];
FOR(i,0,N-1) if (!vis[i] && SZ(al[i])) {
auto x = getcyc(i,i);
FOR(i,0,SZ(x)-1) {
q[x[i]] = p[x[(i+1)%SZ(x)]];
vis[x[i]] = 1;
}
}
//FOR(i,0,N-1) cout << q[i] << ' ';
//cout << endl;
int s = ask(q);
if (s == N) return;
memset(vis,0,sizeof vis);
FOR(i,0,N-1) if (!vis[i] && SZ(al[i])) {
int u = i;
auto x = getcyc(i,i);
reverse(ALL(x));
FOR(i,0,SZ(x)-1) {
q[x[i]] = p[x[(i+1)%SZ(x)]];
vis[x[i]] = 1;
}
int t = ask(q);
if (t == N) return;
if (t < s) {
reverse(ALL(x));
FOR(i,0,SZ(x)-1) {
q[x[i]] = p[x[(i+1)%SZ(x)]];
}
}
}
//FOR(i,0,N-1) cout << ans[i] << ' ';
//cout << endl;
}
컴파일 시 표준 에러 (stderr) 메시지
mouse.cpp: In function 'void solve(int)':
mouse.cpp:98:13: warning: unused variable 'u' [-Wunused-variable]
int u = i;
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |