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即可。

·代码:

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

B. Mahmoud and Ehab and the bipartiteness

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

                          

·分析:

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

·呆呆的代码:

  1. #include<stdio.h>
  2. #define go(i,a,b) for(int i=a;i<=b;i++)
  3. #define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
  4. const int N=;
  5. struct E{int v,next;}e[N*];int n,head[N],k=,c[N],w;
  6. void ADD(int u,int v){e[k]=(E){v,head[u]};head[u]=k++;}
  7. void Dye(int u,int fa){fo(i,head,u)if(v!=fa)w+=(c[v]=-c[u])==,Dye(v,u);}
  8. int main()
  9. {
  10. scanf("%d",&n);go(i,,n){int u,v;scanf("%d%d",&u,&v);ADD(u,v);ADD(v,u);}
  11. c[]=;Dye(,);printf("%I64d\n",1ll*w*(n-w)-n+);return ;
  12. }//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,呆码如下:

  1. #include"stdio.h"
  2. #define R return 0
  3. #define go(i,a,b) for(int i=a;i<=b;i++)
  4. int n,x,a=(<<),b=(<<),y;
  5. int main()
  6. {
  7. scanf("%d%d",&n,&x);//QAQ
  8. if(n==&&!x){puts("NO");R;}puts("Yes");
  9. if(n==){printf("%d\n",x);R;}
  10. if(n==){printf("%d %d\n",,x);R;}
  11. go(i,,n-)y^=i,printf("%d ",i);x!=y?
  12. printf("%d %d %d\n",,a,a^x^y):
  13. printf("%d %d %d\n",a,b,a^b);return ;
  14. }//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,我们就继续二分;

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

代码在这里:

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #define _ fflush(stdout)
  4. #define go(i,a,b) for(int i=a;i<=b;i++)
  5. int n,T=,d,dis,_0,_1;char s[],t[];
  6. void dfs(int l,int r)
  7. {
  8. if(l==r)
  9. {
  10. go(i,,n)t[i]=s[i];t[l]='';
  11. putchar('?');putchar(' ');puts(t+);_;
  12. scanf("%d",&d);if(dis<d)_1=l;else _0=l;
  13. }
  14.  
  15. if(_0&&_1){printf("! %d %d\n",_0,_1);_;exit();}
  16.  
  17. int M=l+r>>;go(i,,n)t[i]=s[i];go(i,M+,r)t[i]='';
  18. putchar('?');putchar(' ');puts(t+);_;scanf("%d",&d);
  19.  
  20. if(d==dis-(r-M)){_0=r;dfs(l,M);return;}
  21. if(d==dis+(r-M)){_1=r;dfs(l,M);return;}dfs(M+,r);
  22. }
  23. int main()
  24. {
  25. scanf("%d",&n);go(i,,n)s[i]='';
  26. putchar('?');putchar(' ');puts(s+);_;
  27. scanf("%d",&dis);dfs(,n);return ;
  28. }//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. 申请JetBrains学生免费注册码

    1.申请.edu.*后缀的邮箱 从某个知乎用户上面得到了两个可以申请的后缀edu的邮箱 上海交通大学校友统一身份认证:https://register.alumni.sjtu.edu.cn/alumn ...

  2. vue jquery js 获取当前时间本周的第一天 和 本月的第一天

    交互的时候传输数据 后台要求这样的数据 直接上代码 这是我找度姨要的  附上链接  https://www.cnblogs.com/wasabii/p/7756560.html 它里面有本季度第一天  ...

  3. JavaSE阶段初期的一些问题

    ​​​对于如下问题1:编译阶段Demo1会报错,Demo2不会报错. class Demo1{ int i; i = 0; } class Demo2{ int i = 0; } 事实上,在java中 ...

  4. 裸辞两个月,海投一个月,从Android转战Web前端的求职之路

    前言 看到这个标题的童鞋,可能会产生两种想法: 想法一:这篇文章是标题党 想法二:Android开发越来越不景气了吗?前端越来越火了吗? 我一向不喜欢标题党,标题中的内容是我的亲身经历.我是2016年 ...

  5. linux——网络基础

    装完linux系统要对网络(ip地址,子网掩码,网关,DNS)进行配置,才能连接网络 一,开启网卡eth0 CentOS显示没有网卡(eth0) 2.设置静态IP vim /etc/sysconfig ...

  6. redis入门(06)各种类型的操作命令

    Redis 字符串命令下表列出了常用的 redis 字符串命令:序号 命令及描述1 SET key value 设置指定 key 的值2 GET key 获取指定 key 的值.3 GETRANGE ...

  7. maven编译时出现读取XXX时出错invalid LOC header (bad signature)

    问题原因 该包没有下载正确. 解决办法 找到该包的目录,删除该包重新下载即可. 重新下载后用maven test一下,红叉消失.

  8. python/ORM操作详解

    一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...

  9. 前端学习之jquery

    前端学习之jquery 1.   什么是jQuery对象? jQuery对象就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuery独有的.如果一个对象是jQuery对象,那么它 ...

  10. vue中的vue-cli

    在前面的学习过程中我相信你们已经对vue有了一定的了解,现在我们来看一下vue中的vue-cli. 学习这个我们首先需要的是node环境的,如果你的网络环境慢的话建议安装淘宝镜像,在cmd中输入 np ...