IOI2018

倖福魔咒の 提交于 2020-02-04 12:13:58

【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;
}
View Code

代码不合我的码风是因为在loj上格式化了。

【IOI2018】排座位(线段树)

【IOI2018】狼人(可持久化线段树,Kruskal重构树,dfs序)

【IOI2018】机械娃娃(线段树,构造)

【IOI2018】高速公路收费(二分)

【IOI2018】会议(线段树,dp)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!