交互题

关于交互题的神秘写法

由于今年(\(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;
	}

嗯对就这样乱写,酷酷酷就敲完了。

posted @ 2026-03-14 16:43  404-NoT_FinD  阅读(38)  评论(0)    收藏  举报