【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
