loj#6566. 月之都的密码
搜交互题搜到的...
竟然还有这么水的交互题,赶紧过了再说
交互库里有一个 $[1,n]$ 到 $[1,n]$ 的双射
你可以调用 $encode(k,a[])$ 询问左边的一个大小为 $k$ 的集合 $a[]$,可以询问出 $a[]$ 对应的集合 $b[]$ ,但不告诉你 $a[],b[]$ 之间的一一对应关系
求双射,最多询问 log 次
sol:
log 次,显然是把二进制每一位拆开
然后就做完了。。。
#include<bits/stdc++.h> #define LL long long #define rep(i,s,t) for(register int i = (s),i##end = (t); i <= i##end; ++i) #define dwn(i,s,t) for(register int i = (s),i##end = (t); i >= i##end; --i) using namespace std; inline int read() { int x=0,f=1;char ch; for(ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')f=-f; for(;isdigit(ch);ch=getchar())x=10*x+ch-'0'; return x*f; } int ans[200010]; int main() { int n = read(), T = read(); for(int Bit=1;Bit<n;Bit<<=1) { cout << "encode "; int pnt = 0; rep(j, 0, n-1) if(j & Bit) pnt++; cout << pnt << " "; int cur = 0; rep(j, 0, n-1) if(j & Bit) { cur++; //printf(cur == pnt ? "%d\n" : "%d ",j+1); if(cur == pnt) cout << j+1 << endl; else cout << j+1 << " "; } //fflush(stdout); while(pnt--) ans[read()] |= Bit; } cout << "submit "; rep(i, 1, n) { if(i == n) cout << ans[i] + 1 << endl; else cout << ans[i] + 1 << " "; } return 0; }