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 ...
随机推荐
- 我的Android进阶之旅------>Android 众多的布局属性详解
Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了网上不少资料,希望对读者有用. 第一类:属性值为true或false android:layout_centerH ...
- document write & close
在载入页面后,浏览器输出流自动关闭.在此之后,任何一个对当前页面进行操作的document.write()方法将打开—个新的输出流,它将清除当前页面内容. 必须确保调用document.close() ...
- OC、C#与JAVA语法特点一些异同(差集&交集)
C#对JAVA: 1.扩展方法 2.部分类 3.动态对象 4.匿名返回类型 5.表达式树 6.Linq 7.没有函数指针,委托,事件的直接提供方式 8.JAVA接口不规定以I开头,这个很烂的思想! J ...
- (转)js原生自定义事件的触发dispatchEvent
1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: 1 2 3 d ...
- A除以B (20)
时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整 ...
- CS224n学习资源汇总
一.课程网站: http://web.stanford.edu/class/cs224n/archive/WWW_1617/index.html 二.视频(中文字幕) http://www.mooc. ...
- python默认参数不能定义为可变对象类型
python的默认参数只会在函数定义时被确定,而不是每次调用时重新确定,所以,一旦在函数中修改了默认参数,则在随后的调用中都会生效 由于这个特性,在定义函数时,如果默认参数使用可变的对象类型,如空列表 ...
- win10 chrome 调试
下载NPAPI版本的flash player: http://www.adobe.com/support/flashplayer/debug_downloads.html#fp13 禁 ...
- php 跨域 form提交 2种方法
出于安全因素考虑,直接跨域访问是不允许的,下面介绍二种跨域的方法. 一,通过php curl function curlPost($url,$params) { $postData = ''; for ...
- $MySQL常用操作命令备忘
1.登录数据库:mysql -uroot -p12345 (12345为密码)2.创建数据库:create database senguocc; (senguocc为数据库名)3.查看有哪些数据库: ...