首页 > 其他分享 >Codeforces 1705F Mark and the Online Exam

Codeforces 1705F Mark and the Online Exam

时间:2024-02-28 16:56:30浏览次数:22  
标签:1705F tmp frac Exam int Online ++ ans id

先问全 \(\texttt{T}\),记得到的数为 \(a\)。
接下来问 \(len\) 个位置为 \(\texttt{T}\) ,得到的数为 \(b\)。
因为剩下 \(n - len\) 个位置肯定都会被刚好算上一次,对于这 \(len\) 个数里的 \(\texttt{T}\) 的个数 \(x\) 就有式子 \((n - len) + 2x = a + b\),可以解得 \(x = \frac{a + b - (n - len)}{2}\)。

考虑对于还未确定的下标里选 \(4\) 个然后去询问,记为 \(x\)。
如果 \(x = 0\) 或 \(x = 4\) 就可以直接确定了这 \(4\) 个位了。
否则考虑问其中的 \(2\) 个下标为 \(\texttt{T}\),记为 \(y\)。
如果 \(y = 0\) 或 \(y = 2\),可以直接确定这 \(2\) 个位。
否则可以知道这 \(2\) 位上的值不同,又因为只有 \(\texttt{T}\) 和 \(\texttt{F}\),考虑只留下一个下标,另一个下标待得知了这个下标的值取反即可。
直到最后 \(< 4\) 个下标,直接暴力即可。

然后这样子肯定是能卡的,于是考虑随机选择下标。
考虑通过 \(1\) 次操作就能问出 \(4\) 个下标的概率 \(\frac{1}{8}\)。
\(2\) 次操作问出 \(4\) 个下标的概率 \(\frac{1}{8}\)。
\(2\) 次操作问出 \(3\) 个下标的概率 \(\frac{1}{2}\)。
\(2\) 此操作问出 \(2\) 个下标的概率 \(\frac{1}{4}\)。
记 \(f_n\) 为问出 \(n\) 个下标的期望,有 \(f_i = i(i\le 3), f_i = \frac{1}{8}(1 + f_{i - 4}) + \frac{1}{8}(2 + f_{i - 4}) + \frac{1}{2}(2 + f_{i - 3}) + \frac{1}{4}(2 + f_{i - 2})\)。
可以得到 \(f_{1000} = 625.71875\),在加上一开始的 \(1\) 次,期望询问次数 \(626.71875\) 次。

#include<bits/stdc++.h>
std::mt19937 Rand(time(0));
const int maxn = 1e3 + 10;
std::vector<int> son[maxn];
char s[maxn];
char ans[maxn];
bool vis[maxn];
int main() {
    int n; scanf("%d", &n);
    std::vector<int> P;
    auto ins = [&](int x) {P.push_back(x);};
    auto val = [&]() {
        int w = Rand() % P.size(), x = P[w];
        for (int i = w; i + 1 < P.size(); i++) P[i] = P[i + 1];
        P.pop_back();
        return x;
    };
    auto qry = [&]() {
        printf("%s\n", s), fflush(stdout);
        int x; scanf("%d", &x);
        if (x == n) exit(0);
        return x;
    };
    for (int i = 0; i < n; i++) s[i] = 'T';
    int all = qry();
    auto calc = [&](int x, int len) {return ((all + x) - (n - len)) / 2;};
    auto add = [&](int u, int v) {son[u].push_back(v), vis[v] = 1;};
    for (int i = 0; i < n; i++) ins(i);
    while (P.size() >= 4) {
        std::vector<int> id(4);
        for (int &x : id) x = val();
        for (int i = 0; i < n; i++) s[i] = 'F';
        for (int x : id) s[x] = 'T';
        int tot = calc(qry(), 4);
        if (tot == 4) {
            for (int x : id) ans[x] = 'T';
            continue; 
        }
        if (tot == 0) {
            for (int x : id) ans[x] = 'F';
            continue;
        }
        for (int i = 0; i < n; i++) s[i] = 'F';
        s[id[0]] = s[id[1]] = 'T';
        int tmp = calc(qry(), 2);
        if (tmp == 2) ans[id[0]] = ans[id[1]] = 'T';
        else if (tmp == 0) ans[id[0]] = ans[id[1]] = 'F';
        else add(id[0], id[1]), ins(id[0]);
        tmp = tot - tmp;
        if (tmp == 2) ans[id[2]] = ans[id[3]] = 'T';
        else if (tmp == 0) ans[id[2]] = ans[id[3]] = 'F';
        else add(id[2], id[3]), ins(id[2]);
    }
    for (int x : P) {
        for (int i = 0; i < n; i++) s[i] = 'F';
        s[x] = 'T';
        int tot = calc(qry(), 1);
        ans[x] = tot ? 'T' : 'F';
    }
    std::queue<int> Q;
    for (int i = 0; i < n; i++) if (! vis[i]) Q.push(i);
    while (! Q.empty()) {
        int u = Q.front(); Q.pop();
        for (int v : son[u]) {
            ans[v] = ans[u] ^ 'T' ^ 'F';
            Q.push(v);
        }
    }
    for (int i = 0; i < n; i++) s[i] = ans[i];
    qry();
    return 0;
}

标签:1705F,tmp,frac,Exam,int,Online,++,ans,id
From: https://www.cnblogs.com/rizynvu/p/18041016

相关文章

  • = Request processing failed; nested exception is com.example.exceptio
    =Requestprocessingfailed;nestedexceptioniscom.example.exceptio关于映射文件的问题下次再介绍,这次主要总结hibernate常用主键生成策略。(1)incrementa)对主键值采取自动顺序增长的方式生成新的主键,值默认从1开始。b)原理:在当前应用实例中维持一个变量,以保存当前最......
  • SharePoint Online 列表启用条形码
    前言我们经常会在项目中使用条形码,尤其是和移动设备相关的系统上,而SharePointOnline列表默认就支持这样的功能。正文1.我们进入列表设置,找到“Informationmanagementpolicysettings”,如下图:2.点击Item,如下图:3.勾选启用条形码,点击保存,如下图:......
  • SharePoint Online 启用文档库多行文本的富文本属性
    前言相信大家都知道我们可以在列表中快速创建支持富文本的多行文本字段,但是,文档库中不行。正文1.这是列表中的多行文本字段,可以点击编辑图标,如下图:2.然后,会弹出一个富文本编辑框,支持富文本,如下图:3.但是,在文档库中新建多行文本的时候,少了一些属性,如......
  • SharePoint Online Framework Extension 简介
    前言可以使用SharePoint框架(SPFx)扩展来扩展SharePoint用户体验。使用SPFx扩展,可以自定义SharePoint体验的更多方面,包括通知区域、工具栏、列表数据视图和表单。SPFx扩展在生产使用的所有Microsoft365订阅中可用。SPFx扩展使你能够在新式页面和文档......
  • 学成在线(online-course) | 【Q&A】
    模块之间的依赖❓为什么content-api模块中要填写数据库相关配置,他是api工程,应该不会与数据库连接......
  • Office Online Server Windows Server 2016 部署
    一、准备“武器”本文是通过虚拟机搭建OOS测试环境的,4567是3的前提,武器提取le731、VMWareWorkstation17Player2、WindowsServer2016镜像(需要OfficeOnlineServer2017年4月或更高版本)3、OfficeOnlineServer2016(简称OOS)4、NETFramework4.5.2(NDP452-KB2901......
  • SharePoint Online Viva Connections 添加到Teams
    前言我们新建了VivaConnections,然后如何让大家知道呢?Teams入口是一个非常好的方法。正文1.我们选择安装VivaConnections到Teams,如下图:2.这样会弹出安装的步骤,如下图:3.进入Teams管理中心,找到Teamsapps-Setuppolicies,如下图:4.添加一个新......
  • SharePoint Online 添加Viva Connections Dashboard报错
    前言上一篇博客为大家介绍了如何新建VivaConnectionsexperience,不过,在添加Dashboard的时候碰到了问题,这是因为默认不会新建Dashboard,我们需要手动创建。正文1.错误描述和错误截图,如下图:Can'tgetthisDashboardURL.Itmaynotbesetupyet,oritmay......
  • 如何新建SharePoint Online Viva Connections experiences
    前言Viva也是近些年来出现的一个新词汇,我们可以在Microsoft365中启用,我们今天简单介绍下。正文1.访问Microsoft365首页,找到Admin点击并进入,如下图:2.在左侧导航里找到设置,设置里有Viva,点击进入,如下图:3.找到VivaConnections,点击进入,如下图:4......
  • SharePoint Online 配置列表验证
    前言以前,我们做SharePoint列表的时候,经常会发现有开始时间、结束时间这样的,但是限制开始时间小于结束时间就很不方便。正文1.这里,我们就需要用到列表验证了,如下图:2.去到列表设置,找到验证设置,如下图:3.在这里可以进行条件设置,如下图:4.演示测试......