CF比赛题目地址:http://codeforces.com/contest/862

A. Mahmoud and Ehab and the MEX

·英文题,述大意:
      输入n,x(n,x<=100),然后输入n个数作为一个集合。现在可以进行多次操作,每次操作为删除一个数或者添加一个数,求最少操作数使得集合Mex值等于x。

·分析:

     也许是考察Mex的吧~那就当复习了,我们的策略是,如果当前集合的  Mex比x小,那就一直添加数;如果Mex比x大,那么就删除那个和x相同的元素就可以了。最后Mex==x输出0即可。

·代码:

 #include"stdio.h"
#define go(i,a,b) for(int i=a;i<=b;i++)
int n,x,a,ans;bool exist[];
int main()
{
scanf("%d%d",&n,&x);
go(i,,n)scanf("%d",&a),exist[a]=;
go(i,,x-)ans+=exist[i]^;if(exist[x])ans++;printf("%d\n",ans);return ;
}//Paul_Guderian

B. Mahmoud and Ehab and the bipartiteness

·英文题,述大意:
      输入一个二分图,保证它是一个树(二分树……)。现在要使得原树变成完全二分图,求最多加入边数。完全二分图长这个样子:

                          

·分析:

     如上图,我们可以知道最后的总边数为:4*3(即两边点数相乘)。由于树的边数等于节点数减一,所以呢答案就是a*b-树边数(a,b分别为二分图两边的点数)。所以这道题清晰地告诉我们,它只需要一个二分图染色统计二分图两边的个数就可以了。

·呆呆的代码:

 #include<stdio.h>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
const int N=;
struct E{int v,next;}e[N*];int n,head[N],k=,c[N],w;
void ADD(int u,int v){e[k]=(E){v,head[u]};head[u]=k++;}
void Dye(int u,int fa){fo(i,head,u)if(v!=fa)w+=(c[v]=-c[u])==,Dye(v,u);}
int main()
{
scanf("%d",&n);go(i,,n){int u,v;scanf("%d%d",&u,&v);ADD(u,v);ADD(v,u);}
c[]=;Dye(,);printf("%I64d\n",1ll*w*(n-w)-n+);return ;
}//Paul_Guderian

C. Mahmoud and Ehab and the xor

·英文题,述大意:

      输入n,x(0<n<=105,0<=x<=105),表示现在需要我们构造一个含有n个不同元素的集合,并且满足:①元素为不大于106的非负整数②所有元素的异或结果等于x。如果可以构造,输出YES并且输出这个集合中的所有元素(按照任何顺序);如果不能,那么输出NO即可。

·分析:

      看见这道题可能会纠结于怎样判断输出no还是yes的情况。但是事实上,根据异或的美妙(后文就会体现),仅有一种情况会输出no—n=2,x=0。

所以其他的都是Yes,那么怎么找出集合的n个元素呢?

      我们知道异或的一个巧妙性质:0^任何数=0,偶数个相同的数抑或的结果为0。既然挨着挨着找每个元素很麻烦,那我们尝试使用这个性质,使得我们可以先胡乱取数异或出一个结果,然后再试图调整这个混乱的结果使它和x相等。

      为什么会这样想?因为题目中有关键信息:元素大小不超过106,但是x是不超过105,意思说有一段区间x不存在。那么结合上文的胡乱思想,我们可以这样:现在已经将一些数异或起来了,答案是y。我们分情况讨论:

     (1)x!=y:我们的目的是将y变回x,根据上文发现的异或性质,我们可以给y先抑或上一个y,再异或上一个x,就成为答案了!但是伤心的是,y万一已经用过了呢?这很难保证有没有用过。所以我们想到了可以找一个较大的数字,即在105~106的数字,因为它的二进制最高位是不会被改变的,由于选择的元素小于105所以在(105,106)之内选出的数是不会重复的,我们设这个很大的数字为a,那么我们将y依次异或上a和(a^x^y)这两个数,那不就既保证元素不重复,又保证异或结果为x了吗?OK。

     (2)x==y:继续用上文的a和(a^x^y)不行了,因为x==y,那么这两个元素也是相同的。我们将其改成:a,a*2和(a^(a*2))这三个数,那么也可以满足条件。

      最终的方法是:先将1~n-3的数异或起来的到y,然后:

        如果x!=y:剩下三个元素为{0,a,a^x^y}

       如果x==y:剩下三个元素为{a,a*2,a^(a*2)}

Over,呆码如下:

 #include"stdio.h"
#define R return 0
#define go(i,a,b) for(int i=a;i<=b;i++)
int n,x,a=(<<),b=(<<),y;
int main()
{
scanf("%d%d",&n,&x);//QAQ
if(n==&&!x){puts("NO");R;}puts("Yes");
if(n==){printf("%d\n",x);R;}
if(n==){printf("%d %d\n",,x);R;}
go(i,,n-)y^=i,printf("%d ",i);x!=y?
printf("%d %d %d\n",,a,a^x^y):
printf("%d %d %d\n",a,b,a^b);return ;
}//Paul_Guderian

D. Mahmoud and Ehab and the binary string

·[题外话:那天晚上和圆盘盘全卡在C题,然后我果断去了D题,AC掉了从而保住了Rating]

·英文题,述大意:
      这是一道交互题。输入n(n<=1000),表示这里有一个隐秘的长度为n的01串。现在你可以询问系统最多15次,询问内容为:输出一个长度为n的01串,然后系统会告诉你那个隐秘的串和你的这个串的汉明距离。最终你需要输出的答案,答案内容是输出任意一个0和1的下标(即输出两个下标,比如0100,你就输出1 2……)。

·分析:
      这样瞅瞅:n->1000,q->15有啥联系?至少我第一反应是:210=1024。因此我立下了用二分解决这道题的决心。初始情况下总要有一个串吧,所以可以初始化一个全为1的串。然后这样的结论可以高效解决问题:

·设右边半段长度为m,则有:
·如果X=Y+m,那么隐秘01串的右半段全是0;
·如果Y=X+m,那么隐秘01串的右半段全是1;
·若两种情况都不满足,那么:右半段必定同时含有01,我们就继续二分;

·因为答案在这里面都找得到,最终统计好了输出就是啦。

代码在这里:

 #include<stdio.h>
#include<algorithm>
#define _ fflush(stdout)
#define go(i,a,b) for(int i=a;i<=b;i++)
int n,T=,d,dis,_0,_1;char s[],t[];
void dfs(int l,int r)
{
if(l==r)
{
go(i,,n)t[i]=s[i];t[l]='';
putchar('?');putchar(' ');puts(t+);_;
scanf("%d",&d);if(dis<d)_1=l;else _0=l;
} if(_0&&_1){printf("! %d %d\n",_0,_1);_;exit();} int M=l+r>>;go(i,,n)t[i]=s[i];go(i,M+,r)t[i]='';
putchar('?');putchar(' ');puts(t+);_;scanf("%d",&d); if(d==dis-(r-M)){_0=r;dfs(l,M);return;}
if(d==dis+(r-M)){_1=r;dfs(l,M);return;}dfs(M+,r);
}
int main()
{
scanf("%d",&n);go(i,,n)s[i]='';
putchar('?');putchar(' ');puts(s+);_;
scanf("%d",&dis);dfs(,n);return ;
}//Paul_Guderian

 

 

我闻到初春的味道,那如同儿时梦境新鲜的芬芳;

也尝到思念的苦涩,这回望远方秋雨般无垠的萧索…——汪峰《无处安放》

【Codeforces Round #435 (Div. 2) A B C D】的更多相关文章

  1. 【Codeforces Round #435 (Div. 2) A】Mahmoud and Ehab and the MEX

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 让x没有出现,以及0..x-1都出现就可以了. [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/std ...

  2. 【Codeforces Round #435 (Div. 2) B】Mahmoud and Ehab and the bipartiteness

    [链接]h在这里写链接 [题意] 让你在一棵树上,加入尽可能多的边. 使得这棵树依然是一张二分图. [题解] 让每个节点的度数,都变成二分图的对方集合中的点的个数就好. [错的次数] 0 [反思] 在 ...

  3. 【Codeforces Round #435 (Div. 2) C】Mahmoud and Ehab and the xor

    [链接]h在这里写链接 [题意] 让你组成一个n个数的集合,使得这n个数的异或和为x; x<=1e5 每个数最大1e6; [题解] 1e5<=2^17<=2^18<=1e6的 ...

  4. 【2000*】【Codeforces Round #518 (Div. 1) [Thanks, Mail.Ru!] B】Multihedgehog

    [链接] 我是链接,点我呀:) [题意] [题解] 找到度数为1的点. 他们显然是叶子节点. 然后每个叶子节点. 往上进行bfs. 累计他们的父亲节点的儿子的个数. 如果都满足要求那么就继续往上走. ...

  5. Codeforces Round #435 (Div. 2)【A、B、C、D】

    //在我对着D题发呆的时候,柴神秒掉了D题并说:这个D感觉比C题简单呀!,,我:[哭.jpg](逃 Codeforces Round #435 (Div. 2) codeforces 862 A. M ...

  6. 【二分】Codeforces Round #435 (Div. 2) D. Mahmoud and Ehab and the binary string

    题意:交互题:存在一个至少有一个0和一个1的长度为n的二进制串,你可以进行最多15次询问,每次给出一个长度为n的二进制串,系统返回你此串和原串的海明距离(两串不同的位数).最后要你找到任意一个0的位置 ...

  7. 【构造】【分类讨论】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, ...

  8. 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes

    [题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...

  9. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

随机推荐

  1. Hibernate之缓存

    Hibernate为了解决频繁查询数据的效率问题,提供了三种级别的缓存 1.一级缓存 一级缓存 又叫 session缓存 .Session对象会缓存处于持久化状态的每个对象 ,如果下次想用数据表中同一 ...

  2. ViurtualBox配置虚拟机Linux的网络环境

    之前可以使用VMware配置成功,让虚拟机和本地通信,虚拟机可以访问外网,但是VMware体积太大了,最后终于把virtualBox也配置成功,也使得两者兼备 环境:本地windows7 64位专业版 ...

  3. python识别验证码——PIL,pytesser,pytesseract的安装

    1.使用Python识别验证码需要安装Python的图像处理模块(PIL.pytesser.pytesseract) (安装过程需要pip,在我的Python中已经安装pip了,pip的安装就不在赘述 ...

  4. sublime使用攻略

    一些常用的快捷键 Ctrl+Enter 在下一行插入新行.举个例子:即使光标不在行尾,也能快速向下插入一行. Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Ctrl+Shift ...

  5. JAVA 中的 反射

    CLASS类 1) 在面向对象的世界里,万事万物皆对象. 在java中有两样东西不是面向对象 1.普通的数据类型(java中有封装类来弥补它) 2. java中静态的东西 2) 类是对象吗? 类是对象 ...

  6. 阿里云API网关(8)开发指南-SDK下载

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  7. maven入门(1-4)使用eclipse构建maven项目

    1. 安装m2eclipse插件    要用Eclipse构建Maven项目,我们需要先安装meeclipse插件    点击eclipse菜单栏Help->Eclipse Marketplac ...

  8. SQL执行计划分析

    explain执行计划中的字段以及含义在下面的博客中有详细讲述: https://blog.csdn.net/da_guo_li/article/details/79008016 执行计划能告诉我们什 ...

  9. Tcl与Design Compiler (五)——综合库(时序库)和DC的设计对象

    本文如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 前面一直说到综合库/工艺库这些东西,现在就来讲讲讲 ...

  10. 南阳OJ-6-喷水装置(一)

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=6 题目大意: 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷 ...