This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#define wiwihorz
#include "grader.h"
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma loop-opt(on)
#define rep(i, a, b) for(int i = a; i <= b; i ++)
#define rrep(i, a, b) for(int i = b; i >= a; i--)
#define all(x) x.begin(), x.end()
#define ceil(a, b) ((a + b - 1) / (b))
using namespace std;
#define lld long double
#define pii pair<int, int>
#define random mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count())
#ifdef wiwihorz
#define print(a...) cerr << "Line: " << __LINE__, kout("[" + string(#a) + "] = ", a)
void vprint(auto L, auto R) { while(L < R)cerr << *L << " \n"[next(L) == R], ++L; }
void kout() { cerr << endl; }
template<class T1, class ... T2> void kout(T1 a, T2 ... e) { cerr << a << " ", kout(e...);}
#else
#define print(...) 0
#define vprint(...) 0
#endif
int n, tot;
vector<int> a, vis, ch;
vector<vector<int>> mp;
random;
/*void init_(int _n) {
n = _n, tot = 0;
a.assign(n, 0);
rep(i, 1, n) a[i - 1] = i;
shuffle(a.begin(), a.begin() + n, rnd);
}
int query(vector<int> b) {
assert(b.size() == n);
int cnt = 0;
tot ++;
rep(i, 0, n - 1) cnt += a[i] == b[i];
return cnt;
}*/
void dfs(int x) {
ch.push_back(x);
vis[x] = 1;
for(auto i : mp[x])
if(!vis[i]) dfs(i);
}
void solve(int n) {
// init_(n);
if(n == 1) {
query({1});
return;
}
vector<int> v(n, 0), ans(n, 0), rot(n + 1, 0);
vector<vector<int>> p(n, vector<int>(n, 0));
vis.assign(n, 0);
mp.assign(n, vector<int>());
int num = (n % 2 == 0 ? n : n + 1);
rep(i, 1, n) v[i - 1] = i, rot[i - 1] = i;
while(query(v)) shuffle(all(v), rnd);
rep(i, 0, num - 2) {
int cur = 0 ;
rep(j, 0, num / 2 - 1) if(rot[j] && rot[num - j - 1])
swap(v[rot[j] - 1], v[rot[num - j - 1] - 1]);
cur = query(v);
rep(j, 0, num / 2 - 1) if(rot[j] && rot[num - j - 1])
swap(v[rot[j] - 1], v[rot[num - j - 1] - 1]);
rrep(j, 1, cur) {
int L = -1, R = num / 2 - 1;
while(R - L > 1) {
int mid = (L + R) / 2;
rep(k, 0, mid) if(rot[k] && rot[num - k - 1])
swap(v[rot[k] - 1], v[rot[num - k - 1] - 1]);
if(query(v) < j) L = mid;
else R = mid;
rep(k, 0, mid) if(rot[k] && rot[num - k - 1])
swap(v[rot[k] - 1], v[rot[num - k - 1] - 1]);
}
int x = rot[R] - 1, y = rot[num - R - 1] - 1;
p[x][y] = p[y][x] = 1;
}
vector<int> temp(num, 0);
temp[0] = 1, temp[1] = rot[num - 1];
rep(i, 2, num - 1) temp[i] = rot[i - 1];
rot = temp;
}
rep(i, 0, n - 1) rep(j, 0, n - 1) {
if(p[i][j]) mp[i].push_back(j);
}
int sum = 0, val;
rep(i, 0, n - 1) if(!vis[i]) {
ch.clear(), dfs(i);
int sz = ch.size();
sum += sz;
if(sz == 1) continue;
ans = v;
rep(j, 1, sz - 1) swap(
ans[ch[j - 1]], ans[ch[j]]
);
if(query(ans) == sum) {
v = ans;
continue;
}
ans = v;
rrep(j, 1, sz - 1) swap(
ans[ch[j - 1]], ans[ch[j]]
);
v = ans;
query(ans);
}
}
/*signed main() {
ios::sync_with_stdio(false), cin.tie(0);
int t; cin >> t;
while(t--) {
int n; cin >> n;
solve(n);
print(tot);
}
return 0;
}*/
Compilation message (stderr)
mouse.cpp:5: warning: ignoring '#pragma loop ' [-Wunknown-pragmas]
5 | #pragma loop-opt(on)
|
mouse.cpp:20:13: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
20 | void vprint(auto L, auto R) { while(L < R)cerr << *L << " \n"[next(L) == R], ++L; }
| ^~~~
mouse.cpp:20:21: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
20 | void vprint(auto L, auto R) { while(L < R)cerr << *L << " \n"[next(L) == R], ++L; }
| ^~~~
mouse.cpp: In function 'void solve(int)':
mouse.cpp:92:15: warning: unused variable 'val' [-Wunused-variable]
92 | int sum = 0, val;
| ^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |