【IOI2018】组合动作(构造)
一种思路是:注意到后面的字符都和第一个字符不同,于是对每一位进行2次询问(不用3次,因为剩下的字符可直接确定)确定字符串,不太理想。
但是给询问的字符串长度<=4*n,这启示我们进行并行询问。实际上,假设现在答案字符串为S,先找到首位字符,询问$SAASABSACSB$(A,B,C是除了首位字符的字符)就能知道下一位的结果。(可以看代码)最后一个暴力即可。
但是首位字符需要3次询问,可以二分一下字符集,就可以降到2次询问。

#include <bits/stdc++.h> #include "combo.h" using namespace std; #define p press string guess_sequence(int n) { string r[3], a; if (p("AB")) { if (p("A")) { r[0] = "B"; r[1] = "X"; r[2] = "Y"; a = "A"; } else { r[0] = "A"; r[1] = "X"; r[2] = "Y"; a = "B"; } } else { if (p("X")) { r[0] = "A"; r[1] = "B"; r[2] = "Y"; a = "X"; } else { r[0] = "A"; r[1] = "B"; r[2] = "X"; a = "Y"; } } if(n==1)return a; for (int i = 2; i < n ; i++) { int v = p(a + r[0] + a + r[1] + r[0] + a + r[1] + r[2] + a + r[1] + r[1]); if (v == i+1) a += r[1]; else if (v == i) a += r[0]; else a += r[2]; } if (p(a + r[0])==n) a += r[0]; else if (p(a + r[1])==n) a += r[1]; else a += r[2]; return a; }
代码不合我的码风是因为在loj上格式化了。
【IOI2018】排座位(线段树)
【IOI2018】狼人(可持久化线段树,Kruskal重构树,dfs序)
【IOI2018】机械娃娃(线段树,构造)
【IOI2018】高速公路收费(二分)
【IOI2018】会议(线段树,dp)
来源:https://www.cnblogs.com/cszmc2004/p/12258837.html