题解:P15652 [省选联考 2026] 排列游戏 / perm
注意到题目中的主角是小 H。所以让我们考虑 Ri 大手子。
本文下标
排列,
设
同时有两个东西取
全部询问出来要
场上代码不到 1K,非常简短。
一份能通过 qoj 的代码:
#include<bits/stdc++.h>
#include"perm.h"
using namespace std;
const int N=3e4+5;
int p[N],pre[N],suf[N];
void init(int c,int t){}
vector<int> perm(int n){
for(int i=1;i<=n;i++) p[i]=pre[i]=suf[i]=0;
pre[0]=suf[n+1]=n+1;
int x=n+1;
for(int i=1;i<n;i++){
pre[i]=query(i,n-1);
if(!pre[i]){
x=i;
break;
}
}
for(int i=n;i>x;i--){
suf[i]=query(0,i-2);
}
set<int> st;
for(int i=0;i<n;i++) st.insert(i);
for(int i=1;i<=n;i++){
if(pre[i]!=pre[i-1]){p[i]=pre[i];st.erase(pre[i]);}
if(suf[i]!=suf[i+1]){p[i]=suf[i];st.erase(suf[i]);}
}
for(int i=1;i<=n;i++){
if(p[i]||i==x) continue;
int mx=max(pre[i],suf[i]);
mx=*st.lower_bound(mx);
p[i]=mx;st.erase(mx);
}
vector<int> res;
for(int i=1;i<=n;i++) res.push_back(p[i]);
return res;
}