交互题
关于交互题的神秘写法
由于今年(\(2026\))的联合省选出现了神秘交互题乱入现象,所以蒟蒻不得不来学习交互题。
- 使用
cout发起询问之后要写cout.flush(),若使用printf()则需要写fflush(stdout)。特别的,如果使用std::endl换行也起刷新缓存的效果,直接用endl换行也可以,是一样的。 - 还有一种写法是单个程序,也就是说选手写的代码是评测机上交互程序的一个函数,格式见 洛谷 P15652 [省选联考 2026] 排列游戏 / perm。
比如这道题题面就给了让选手在头文件插入下面的代码:
#include <vector>
void init(int, int);
std::vector<int> perm(int);
int query(int, int);
也就是说不用写main函数,只需要将正常代码粘贴在query函数里面就行了:
#include<bits/stdc++.h>
using namespace std;
void init(int, int);
std::vector<int> perm(int);
int query(int,int);
void init(int c,int t){return;}
vector<int> perm(int n){
int i;
vector<int> vec(n,-1);
vector<int> pre(n,0),suf(n,0),vis(n,0);
vector<int> res;
suf[0]=n;
for(i=1;i<n;i++){
suf[i]=query(i,n-1);
if(suf[i]!=suf[i-1]) vec[i-1]=suf[i];
if(suf[i]==0) break;
}
vec[--i]=0;
int l=i,r=i;
pre[i]=query(0,i),pre[n-1]=n;
for(i++;i<n;i++){
if(i<n-1) pre[i]=query(0,i);
if(pre[i]!=pre[i-1]) vec[i]=pre[i-1];
}
for(i=0;i<n;++i)
if(vec[i]!=-1) vis[vec[i]]=1;
for(i=n-1;i>=0;--i)
if(!vis[i]) res.push_back(i);
while(1){
if(0<=l&&vec[l]!=-1){
l--;
continue;
}
if(r<n&&vec[r]!=-1){
r++;
continue;
}
if(0<l&&r<n-1){
if(suf[l]<pre[r]){
vec[l]=res.back(),res.pop_back(),l--;
continue;
}
else{
vec[r]=res.back(),res.pop_back(),r++;
continue;
}
}
else if(0<l){
vec[l]=res.back(),res.pop_back(),l--;
continue;
}
else if(r<n-1){
vec[r]=res.back(),res.pop_back(),r++;
continue;
}
break;
}
return vec;
}
嗯对就这样乱写,酷酷酷就敲完了。

浙公网安备 33010602011771号