E题

题目链接

Codeforces Round 988 (Div. 3)

题目描述

题目的思路

根据题目的意思,我们可以推断出算法时间复杂度应该在O(N)

对于这道题而言,我们可以分析下思路

首先我们先从1~n的范围里面询问答案

如果出现0就跳过,因为无序操作

如果出现非0答案temp就记录下1~i的01序列的个数

如果我询问出来的答案都是0的话,说明我的序列肯定全是0,或者全是1,这样是无法确定的,所以我们可以输出“IMPOSSIBLE”

否则我们就可以构造满足非零答案temp的目标子串

我们可以先放i-temp-1个1,再放temp个0,再放1个1,这个1可以和前面的temp个0组成temp个01序列

然后再对i+1~n的范围进行询问答案,询问出来的答案标记为now,用temp来表示上一次询问的答案

这里以正序询问出来的答案为例

如果询问出来的答案大于上一次询问出来的答案,就说明需要增加,就向ans加“1",这个操作会和前面的0结合成01序列。

如果询问出来的答案不变,那么就说明不需要增加,向ans后面加“0”,这个1无论和前面的“0”或者“1”都不会组成01序列。

最后输出即可

AC代码

逆序查询(判断答案的逻辑和正序相反,因为构造出来的答案是反的)

点击查看代码
// Problem: E. Kachina's Favorite Binary String
// Contest: Codeforces - Codeforces Round 988 (Div. 3)
// URL: https://codeforces.com/contest/2037/problem/E#
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org) #include <bits/stdc++.h> #define debug1(a) cout << #a << '=' << a << endl;
#define debug2(a, b) cout << #a << " = " << a << " " << #b << " = " << b << endl;
#define debug3(a, b, c) cout << #a << " = " << a << " " << #b << " = " << b << " " << #c << " = " << c << endl;
#define debug4(a, b, c, d) cout << #a << " = " << a << " " << #b << " = " << b << " " << #c << " = " << c << " " << #d << " = " << d << endl;
#define debug5(a, b, c, d, e) cout << #a << " = " << a << " " << #b << " = " << b << " " << #c << " = " << c << " " << #d << " = " << d << " " << #e << " = " << e << endl;
#define vec(a) \
for (int i = 0; i < a.size(); i++) \
cout << a[i] << ' '; \
cout << endl;
#define darr(a, _i, _n) \
cout << #a << ':'; \
for (int ij = _i; ij <= _n; ij++) \
cout << a[ij] << ' '; \
cout << endl; #define endl "\n" #define fi first
#define se second
#define caseT \
int T; \
cin >> T; \
while (T--)
// #define int long long
// #define int __int128 using namespace std; typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL; const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 99999999; // const int N = ; void solve()
{
int n;
cin>>n;
int s1=0,s0=0;
int temp;
string s;
for(int i=n-1;i>=1;i--)
{
cout<<"? "<<i<<" "<<n<<endl;
cin>>temp;
if(!temp)continue;
else{
s1=temp;
s0=n-i-temp;
break;
}
}
if(!s1)
{
cout<<"! IMPOSSIBLE"<<endl;
return;
}
for(int i=1;i<=s0;i++)s+="0";
for(int i=1;i<=s1;i++)s+="1";
s+="0";
//这样构造就保证了第一个询问出来不为0的答案是temp
for(int i=n-s1-s0-1;i>=1;i--)
{
cout<<"? "<<i<<" "<<n<<endl;
int now;
cin>>now;
if(now>temp)s+="0";
else s+="1";
temp=now;
}
reverse(s.begin(),s.end());
cout<<"! "<<s<<endl;
} signed main()
{ // ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
//caseT
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
/* */

正序查询

点击查看代码

// Problem: E. Kachina's Favorite Binary String
// Contest: Codeforces - Codeforces Round 988 (Div. 3)
// URL: https://codeforces.com/contest/2037/problem/E#
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org) #include <bits/stdc++.h> #define debug1(a) cout << #a << '=' << a << endl;
#define debug2(a, b) cout << #a << " = " << a << " " << #b << " = " << b << endl;
#define debug3(a, b, c) cout << #a << " = " << a << " " << #b << " = " << b << " " << #c << " = " << c << endl;
#define debug4(a, b, c, d) cout << #a << " = " << a << " " << #b << " = " << b << " " << #c << " = " << c << " " << #d << " = " << d << endl;
#define debug5(a, b, c, d, e) cout << #a << " = " << a << " " << #b << " = " << b << " " << #c << " = " << c << " " << #d << " = " << d << " " << #e << " = " << e << endl;
#define vec(a) \
for (int i = 0; i < a.size(); i++) \
cout << a[i] << ' '; \
cout << endl;
#define darr(a, _i, _n) \
cout << #a << ':'; \
for (int ij = _i; ij <= _n; ij++) \
cout << a[ij] << ' '; \
cout << endl; #define endl "\n" #define fi first
#define se second
#define caseT \
int T; \
cin >> T; \
while (T--)
// #define int long long
// #define int __int128 using namespace std; typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL; const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 99999999; // const int N = ; void solve()
{
int n;
cin>>n;
int temp=0;//记录的是上一次的查询结果
int p=0;//标记的是否发生改变
vector<int>ans(n+1);
for(int i=2;i<=n;i++)
{
cout<<"? "<<1<<" "<<i<<endl;
int x;
cin>>x;
if(x&&!p)//如果查询出来的答案大于0且没有改变过
{
for(int j=1;j<i-x;j++)ans[j]=1;
for(int j=i-x;j<i;j++)ans[j]=0;
ans[i]=1;
p=1;
}else{
if(x==temp)ans[i]=0;
else ans[i]=1;
}
temp=x;
}
cout<<"! ";
if(!p)cout<<"IMPOSSIBLE"<<endl;
else{
for(int i=1;i<=n;i++)cout<<ans[i];
cout<<endl;
}
} signed main()
{ // ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
//caseT
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
/* */

Codeforces Round 988 (Div. 3) E题解析的更多相关文章

  1. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  2. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

  3. Codeforces Round #713 (Div. 3)AB题

    Codeforces Round #713 (Div. 3) Editorial 记录一下自己写的前二题本人比较菜 A. Spy Detected! You are given an array a ...

  4. Codeforces Round #833 (Div. 2)补题

    Codeforces Round #833 (Div. 2) D. ConstructOR 知识点:高位和对低位无影响 一开始以为和广州的M一样,是数位dp,后来发现只要找到一个就行 果然无论什么时候 ...

  5. Codeforces Round #552 (Div. 3) A题

    题目网址:http://codeforces.com/contest/1154/problem/ 题目意思:就是给你四个数,这四个数是a+b,a+c,b+c,a+b+c,次序未知要反求出a,b,c,d ...

  6. Codeforces Round #412 Div. 2 补题 D. Dynamic Problem Scoring

    D. Dynamic Problem Scoring time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  7. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  8. Codeforces Round #425 (Div. 2))——A题&&B题&&D题

    A. Sasha and Sticks 题目链接:http://codeforces.com/contest/832/problem/A 题目意思:n个棍,双方每次取k个,取得多次数的人获胜,Sash ...

  9. Codeforces Round #579 (Div. 3) 套题 题解

    A. Circle of Students      题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...

  10. Codeforces Round #786 (Div. 3) 补题记录

    小结: A,B,F 切,C 没写 1ll 对照样例才发现,E,G 对照样例过,D 对照样例+看了其他人代码(主要急于看后面的题,能调出来的但偷懒了. CF1674A Number Transforma ...

随机推荐

  1. 华为交换机S5700-52C-EI开启ssh服务

    参考资料 https://blog.csdn.net/qq_34815358/article/details/83865527 https://www.cnblogs.com/Cyanix/p/999 ...

  2. DDD是软件工程的第一性原理?

    本文书接上回<DDD建模后写代码的正确姿势>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术实现交流: 视 ...

  3. Ubuntu 设置远程桌面(RDP)

    安装桌面环境 如果你的 Ubuntu 还没有安装桌面环境,可以选择以下之一安装: GNOME GNOME 是 Ubuntu Desktop 原生桌面环境. # 安装基本的 GNOME 桌面环境 sud ...

  4. Mac 使用远程 Ubuntu 机器进行时间备份

    设置 SMB 服务 首先在 Ubuntu 中配置 SMB 服务.可以参考 Ubuntu 设置 SMB 服务. 创建 APFS 磁盘映像 我们在 Ubuntu 上创建出的 SMB 共享文件夹可以用来存放 ...

  5. 在虚拟机CentOS中安装docker

    公众号本文地址:在虚拟机CentOS中安装Docker 1.关闭防火墙 docker需要用到网络,所以需要关闭防火墙.进入管理员模式获得权限后进行关闭. su 关闭防火墙: systemctl dis ...

  6. Blockchain A-Z™: Learn How To Build Your First Blockchain

    单纯从技术角度了解blockthain. Module 1, Blockchain 特点: 分布式的,不可篡改的,p2p的 网络.存储在每个node上保存一份,这就是个基于网络的RAID 1 啊,感觉 ...

  7. DRBD - Distributed Replication Block Device

    Ref https://computingforgeeks.com/install-and-configure-drbd-on-centos-rhel https://www.veritas.com/ ...

  8. 小程序bindinput和bindblur赋值延迟问题解决

    小程序bindinput和bindblur赋值延迟问题解决 问题链接:https://developers.weixin.qq.com/community/develop/doc/000a0ebdc4 ...

  9. A4纸尺寸

    A4纸尺寸 A4纸尺寸:210×297: A3纸尺寸:297×420: A2纸尺寸:420×594: A1纸尺寸:594×841: A0纸尺寸:841×1189: 备注:长(mm)×宽(mm) 单位: ...

  10. TextIn文档树引擎,助力RAG知识库问答检索召回能力提升

    ​ TextIn团队的文档解析测评工具Markdown Tester在Github发布后,我们陆续与大家探讨了目前业内对PDF解析工作的评判标准与我们各项测评指标的设计原理,包括段落.表格.公式.阅读 ...