Codeforces Round #435 (Div. 2) c+d
C:给n和k要求,找出n个不同的数,使得亦或起来等于k
可以先预处理从1到1e5,找亦或起来等于(11111111111111111)(二进制)的所有对数,然后四个一起亦或就是0了,再和k亦或
可以看出要分四种情况讨论,对于n%4=p的情况,应该找到p-1个不同的数亦或起来等于0,可以小范围的p-1重循环搜索,对于n%4==2&&x==0的情况要注意特判,可以用6重循环,每层不超过10
代码过于复杂了,应该可以简化一下
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; bool vis[N];
int main()
{
// cout<<(0^1^2^4^8^15)<<endl;
ios::sync_with_stdio(false);
cin.tie();
int n,x;
cin>>n>>x;
if(n==&&x==)
{
cout<<"NO"<<endl;
return ;
}
cout<<"YES"<<endl;
vector<int>v1,v2;
for(int i=;i<(<<);i++)
{
int s=;
for(int j=;j<;j++)
{
if(i&(<<j));
else s+=(<<j);
}
// cout<<i<<" "<<s<<endl;
if(!vis[i]&&!vis[s])
{
vis[s]=vis[i]=;
v1.pb(i);
v2.pb(s);
}
}
if(n%==&&x==)
{
set<int>ans;
int a,b,c,d,e,f;
for(int i=;i<;i++)
{
for(int j=i+;j<;j++)
{
for(int k=j+;k<;k++)
{
for(int ii=k+;ii<;ii++)
{
for(int jj=ii+;jj<;jj++)
{
if((i^j^k^ii^jj)!=i&&(i^j^k^ii^jj)!=j
&&(i^j^k^ii^jj)!=k&&(i^j^k^ii^jj)!=ii
&&(i^j^k^ii^jj)!=jj&&(i^j^k^ii^jj)==)
{
ans.insert(i);
ans.insert(j);
ans.insert(k);
ans.insert(ii);
ans.insert(jj);
ans.insert();
a=i,b=j,c=k,d=ii,e=jj,f=;
break;
}
}
if(ans.size()!=)break;
}
if(ans.size()!=)break;
}
if(ans.size()!=)break;
}
if(ans.size()!=)break;
}
int k=;
for(int i=;i<v1.size();i++)
{
if(k>=(n-)/)break;
if(v1[i]==a||v2[i]==a||v1[i]==b||v2[i]==b||
v1[i]==c||v2[i]==c||v1[i]==d||v2[i]==d||
v1[i]==e||v2[i]==e||v1[i]==f||v2[i]==f)continue;
k++;
ans.insert(v1[i]);
ans.insert(v2[i]);
}
for(auto x:ans)
cout<<x<<" ";
cout<<endl;
return ;
}
set<int>ans;
if(n%==)
{
ans.insert(x);
int k=;
for(int i=;i<v1.size();i++)
{
if(k>=(n-)/)break;
if(v1[i]==x||v2[i]==x)continue;
ans.insert(v1[i]);
ans.insert(v2[i]);
k++;
}
}
else if(n%==)
{
int a,b;
for(int i=;i<;i++)
{
// cout<<(x^i)<<" "<<i<<endl;
if((x^i)!=i)
{
// cout<<(x^i)<<" "<<i<<endl;
ans.insert(x^i);
ans.insert(i);
a=x^i;b=i;
break;
}
}
int k=;
for(int i=;i<v1.size();i++)
{
if(k>=(n-)/)break;
if(v1[i]==a||v2[i]==a||v1[i]==b||v2[i]==b)continue;
ans.insert(v1[i]);
ans.insert(v2[i]);
k++;
}
}
else if(n%==)
{
int a,b,c;
for(int i=;i<;i++)
{
for(int j=i+;j<;j++)
{
if((x^i^j)!=i&&(x^i^j)!=j)
{
ans.insert(x^i^j);
ans.insert(i);
ans.insert(j);
a=x^i^j;b=i;c=j;
break;
}
}
if(ans.size()!=)break;
}
int k=;
for(int i=;i<v1.size();i++)
{
if(k>=(n-)/)break;
if(v1[i]==a||v2[i]==a||v1[i]==b||v2[i]==b||v1[i]==c||v2[i]==c)continue;
ans.insert(v1[i]);
ans.insert(v2[i]);
k++;
}
}
else
{
int a,b,c,d;
for(int i=;i<;i++)
{
for(int j=i+;j<;j++)
{
for(int k=j+;k<;k++)
{
if((x^i^j^k)!=i&&(x^i^j^k)!=j&&(x^i^j^k)!=k)
{
ans.insert(x^i^j^k);
ans.insert(i);
ans.insert(j);
ans.insert(k);
a=x^i^j^k;b=i;c=j;d=k;
break;
}
}
if(ans.size()!=)break;
}
if(ans.size()!=)break;
}
int k=;
for(int i=;i<v1.size();i++)
{
if(k>=(n-)/)break;
if(v1[i]==a||v2[i]==a||v1[i]==b||v2[i]==b||v1[i]==c||v2[i]==c||v1[i]==d||v2[i]==d)continue;
ans.insert(v1[i]);
ans.insert(v2[i]);
k++;
}
}
for(auto x : ans)
cout<<x<<" ";
cout<<endl;
return ;
}
/******************** ********************/
C
D:交互题(永远是二分),有一个长度为n的01字符串,先输入n,查询是?+长度为n的01字符串,给出的结果是汉明距离(两个字符串不同的个数),要求在15次内找到一个0一个1
既然能保证有0和1,那么可以找到01串或者10串,用二分对于[m,r)如果有01串,那么l=m,否则r=m
one是1的个数,那么如何判断是否有01串呢,构造一个l到r是1的,其他都是0的字符串,假如l到r中只有0,那么结果就是one+(r-l+1),如果只有1,那么结果就是one-(r-l+1),这样有01就是one-(r-l+1)<k<one+(r-l+1)
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; void debug(){cout<<-<<endl;} int n,one;
bool ok(int l,int r)
{
string s=string(n,'');
for(int i=l;i<=r;i++)
s[i]='';
cout<<"? "<<s<<endl;
cout.flush();
int a;
cin>>a;
return one-(r-l+)<a&&a<one+(r-l+);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cin>>n;
cout<<"? "<<string(n,'')<<endl;
cout.flush();
cin>>one;
int l=,r=n-;
while(l<r-)
{
int m=(l+r)/;
if(ok(m,r))l=m;
else r=m;
}
string s=string(n,'');
s[l]='';
cout<<"? "<<s<<endl;
cout.flush();
int a;
cin>>a;
if(a==one+)cout<<"! "<<l+<<" "<<l+<<endl;
else cout<<"! "<<l+<<" "<<l+<<endl;
cout.flush();
return ;
}
/********************
0011001100
********************/
D
Codeforces Round #435 (Div. 2) c+d的更多相关文章
- Codeforces Round #435 (Div. 2)【A、B、C、D】
//在我对着D题发呆的时候,柴神秒掉了D题并说:这个D感觉比C题简单呀!,,我:[哭.jpg](逃 Codeforces Round #435 (Div. 2) codeforces 862 A. M ...
- 【Codeforces Round #435 (Div. 2) A B C D】
CF比赛题目地址:http://codeforces.com/contest/862 A. Mahmoud and Ehab and the MEX ·英文题,述大意: 输入n,x(n,x& ...
- Codeforces Round #435 (Div. 2)
A. Mahmoud and Ehab and the MEX 题目链接:http://codeforces.com/contest/862/problem/A 题目意思:现在一个数列中有n个数,每个 ...
- D. Mahmoud and Ehab and the binary string Codeforces Round #435 (Div. 2)
http://codeforces.com/contest/862/problem/D 交互题 fflush(stdout) 调试: 先行给出结果,函数代替输入 #include <cstdio ...
- E. Mahmoud and Ehab and the function Codeforces Round #435 (Div. 2)
http://codeforces.com/contest/862/problem/E 二分答案 一个数与数组中的哪个数最接近: 先对数组中的数排序,然后lower_bound #include &l ...
- 【二分】Codeforces Round #435 (Div. 2) D. Mahmoud and Ehab and the binary string
题意:交互题:存在一个至少有一个0和一个1的长度为n的二进制串,你可以进行最多15次询问,每次给出一个长度为n的二进制串,系统返回你此串和原串的海明距离(两串不同的位数).最后要你找到任意一个0的位置 ...
- 【构造】【分类讨论】Codeforces Round #435 (Div. 2) C. Mahmoud and Ehab and the xor
题意:给你n,x,均不超过10^5,让你构造一个无重复元素的n个元素的非负整数集合(每个元素不超过10^6),使得它们的Xor和恰好为x. 如果x不为0: 随便在x里面找一个非零位,然后固定该位为0, ...
- Codeforces Round #435 (Div. 2) B (二分图) C(构造)
B. Mahmoud and Ehab and the bipartiteness time limit per test 2 seconds memory limit per test 256 me ...
- 【Codeforces Round #435 (Div. 2) A】Mahmoud and Ehab and the MEX
[链接]h在这里写链接 [题意] 在这里写题意 [题解] 让x没有出现,以及0..x-1都出现就可以了. [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/std ...
随机推荐
- matlab学习笔记之五种常见的图形绘制功能
分类: 离散数据图形绘制 函数图形绘制 网格图形绘制 曲面图形绘制 特殊图形绘制 本文重点介绍matlab五种图形绘制方法的后三种. 一.网格图形绘制 以绘制函数z=f(x,y)三维网格图为例,下面为 ...
- document write & close
在载入页面后,浏览器输出流自动关闭.在此之后,任何一个对当前页面进行操作的document.write()方法将打开—个新的输出流,它将清除当前页面内容. 必须确保调用document.close() ...
- Python正则表达式基础
1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...
- 解决github访问慢和clone慢解决方案
在http://tool.chinaz.com/dns/ 这个网站输入github.com 打开cmd ping各个服务器ip地址,看看哪个比较好 windows下C:\Windows\System3 ...
- KGX滚动分页源码
源码描述: 本工具采用Jquery框架,通过jquery调用ashx获取并输出数据,示例中采用测试数据,可以自行扩展为图片等等 当下流行的分页方式,鼠标滚动下拉条会自动展示下一页信息,类似瀑布流的效果 ...
- python中的标识符长度能有多长
在python中,标识符可以还是任意长度.此外,我们在命名标识符时还必须遵守以下规则 1 只能以下划线或者A-Z/a-z中字母开头 2 其余部分可以使用A-Z/a-z/0-9 3 区分大小写 4 关键 ...
- Loadrunder脚本篇——webservice接口测试(二)
1.选择协议--Web Service,如下图 2.导入服务 入口1:点击Manage Services ->弹出窗中选择“Import” ->弹出窗中选择“URL”,填写wsdl地址,导 ...
- SOA和微服务之间的区别
近几年,我们有很多文章对SOA和微服务之间的不同点和相似点进行了分析.有些人认为SOA有很多地方是值得微服务学习的,而有些人则认为区别对待微服务和SOA会更好.而Neal Ford认为,将单体迁移到面 ...
- 建议42:使用pandas处理大型CSV文件
# -*- coding:utf-8 -*- ''' CSV 常用API 1)reader(csvfile[, dialect='excel'][, fmtparam]),主要用于CSV 文件的读取, ...
- OpenSSL for Android
http://blog.csdn.net/xiongmc/article/details/25736041 OpenSSL1)开源项目Guardian Project试图让Android手机也拥有类似 ...