在本地对拍了 1000 组数据没有发现错误
#include<bits/stdc++.h>
#include"guess.h"
#define f(i,x,y) for(int i=x, i##end=y; i<=i##end; ++i)
#define d(i,x,y) for(int i=y, i##end=x; i>=i##end; --i)
#define uf(i,x,y) for(int i=x, i##end=y; i<i##end; ++i)
#define ll long long
#define pir pair<int, int>
#define fir first
#define sec second
#define mp make_pair
#define pb push_back
char ch;
int rd() {
int f=1, x=0; ch=getchar();
while(!isdigit(ch)) { f=((ch=='-')?-1:f); ch=getchar(); }
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar(); }
return x*f;
}
void rd(int& x) { x=rd(); }
using namespace std;
// bool query1(int i, int j);
// int query2(int i, int j, int k);
int sta[]={0b0111, 0b1011, 0b1101, 0b1110};
// bool query1(int x, int y) {
// cout << "query1: " << x << ' ' << y << endl;
// int t=rd();
// return t;
// }
// int query2(int x, int y, int z) {
// cout << "query2: " << x << ' ' << y << ' ' << z << endl;
// int t=rd();
// return t;
// }
int squery1(int x, int y) {
return query1(x-1, y-1);
}
int squery2(int x, int y, int z) {
return query2(x-1, y-1, z-1);
}
vector<int> a;
vector<int> solve(int n, int m) {
// cerr << "qwq" << endl;
a.resize(n+1);
// cerr << "qwq" << endl;
int q[]={squery2(1, 2, 3), squery2(1, 2, 4), squery2(1, 3, 4), squery2(2, 3, 4)};
int y=q[0], z=q[0] == q[1] ? q[2] : q[1]; if(y>z) swap(y, z);
int Lq[2], Rq[2], lc=-1, rc=-1; f(i,0,3) if(q[i] == y) Lq[++lc]=i; else Rq[++rc]=i;
int SL = sta[Lq[0]] & sta[Lq[1]], L[2], R[2]; lc=rc=-1;
f(i,0,3) if((SL >> i) & 1) L[++lc]=i+1; else R[++rc]=i+1;
// cerr << "L & R :" << endl;
// cerr << L[0] << ' ' << L[1] << endl << R[0] << ' ' << R[1] << endl;
// cerr << "qwq" << endl;
f(i,5,n) {
// add i
int q0 = squery2(L[0], R[0], i);
if(y<q0 && q0<z) {
a[i] = q0;
} else if(q0 < y){
int q1 = squery2(L[0], L[1], i);
if(q1 == y) a[i] = q0;
else a[L[1]]=y, y = q1, L[1] = i;
} else if(q0 == y) {
int q1 = squery2(L[0], L[1], i);
a[L[0]] = y; y=q1; L[0]=i;
} else if(q0 > z) {
int q1 = squery2(R[0], R[1], i);
if(q1 == z) a[i] = q0;
else a[R[1]] = z, z = q1, R[1] = i;
} else if(q0 == z) {
int q1 = squery2(R[0], R[1], i);
a[R[0]] = z, z = q1, R[0] = i;
}
}
int t=squery1(L[0], L[1]), p=squery1(R[0], R[1]);
a[t * L[0] + (1-t) * L[1]] = 1, a[(1-t) * L[0] + t * L[1]] = 2;
a[p * R[0] + (1-p) * R[1]] = n-1, a[(1-p) * R[0] + p * R[1]] = n;
f(i,1,n) a[i-1]=a[i];
// f(i,1,n) cout << a[i] << " \n"[i==n];
return a;
}
// int main() {
// solve(7, 0);
// return 0;
// }