题目链接:点击查看

题目大意:给出一个 n 和 m ,初始时集合中含有 0 ~ 2^m - 1 共 2^m 个数,随后从中删去 n 个数,现在需要此时集合中的中位数

题目分析:一开始被字典序迷惑了,仔细想了一下发现,其实二进制下的字典序,和普通的排序没有区别,且 m 最大才为 60 ,所以可以将字符串转换为整数从而进行二分,因为多了删除这个条件,我们需要设计一下 check 函数然后寻找一下单调性

设中位数为 k ,换句话说我们需要找到集合中第 k 大的那个数,可以二分 mid ,每次遍历一遍这 n 个数,计算有多少个数小于等于mid 记为 cnt ,那么此时 mid 所代表的数就是第 mid - cnt 小的了,观察一下单调性:

以第二个样例为例,观察一下单调性,最上面一行的红色数字代表当前的数在数列中是第几小,可以分类讨论一下如何二分:

  1. 当 mid < k 时:选择右半段
  2. 当 mid > k 时:选择左半段
  3. 当 mid = k 时:选择左半段

然后实现就好了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110;LL a[N];int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){string s;cin>>s;a[i]=0;for(int j=0;j<m;j++)a[i]=a[i]*2+(s[j]-'0');}LL mark=((1LL<<m)-n-1)/2;LL l=0,r=(1LL<<m)-1,ans;while(l<=r){LL mid=l+r>>1;int cnt=0;for(int i=1;i<=n;i++)if(mid>=a[i])cnt++;if(mid-cnt>=mark){ans=mid;r=mid-1;}elsel=mid+1;}for(int i=m-1;i>=0;i--)printf("%d",(ans>>i)&1);puts("");}return 0;
}

CodeForces - 1360H Binary Median(二分)相关推荐

  1. Codeforces Round #644 1360H. Binary Median(思维、构造)

    题目描述: time limit per test 2 seconds memory limit per test 256 megabytes Consider all binary strings ...

  2. CodeForces - 1486D Max Median(二分+最长连续子段和)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,现在从长度至少为 kkk 的连续子段中,找到最大的中位数 题目分析:做过平均数的模型:POJ - 2018 Best Cow Fences ...

  3. Codeforces Round #644 (Div. 3) H.Binary Median

    题目链接 Consider all binary strings of length m (1≤m≤60). A binary string is a string that consists of ...

  4. Codeforces Round #703 (Div. 2) D . Max Median 二分 +思维

    传送门 题意: 给定一个数组和k,求一段连续区间中位数最大值,连续区间长度>=k. 如果=k的话可以直接秒了,这里是>=k,我们可以通过二分让后利用>=k这个条件来检查答案. 二分中 ...

  5. Codeforces 685C Optimal Point (二分、不同类型距离的相互转换)

    题目链接 https://codeforces.com/contest/685/problem/C 题解 我怎么又还差最后一步的时候放弃了然后往别的方向上想了一小时才发现这个思路能做-- 首先二分答案 ...

  6. CodeForces - 1538G Gift Set(二分)

    题目链接:点击查看 题目大意:给出 a,b,x,ya,b,x,ya,b,x,y,分别表示有 aaa 个蓝色糖果和 bbb 和红色糖果,现在有两种打包方式: xxx 个蓝色糖果和 yyy 个红色糖果 y ...

  7. Success Rate CodeForces - 807C (数学+二分)

    You are an experienced Codeforces user. Today you found out that during your activity on Codeforces ...

  8. Codeforces - 706B - Interesting drink - 二分 - 简单dp

    https://codeforces.com/problemset/problem/706/B 因为没有看见 $x_i$ 的上限是 $10^5$ ,就用了二分去做,实际上这道题因为可乐的价格上限是 $ ...

  9. codeforces数学1700[CodeForces 1336B[分类讨论+二分]CodeForces - 1301C[组合计数的减法原理]]

    CodeForces 1336B Xenia and Colorful Gems 题目大意:给你nrn_rnr​个xix_ixi​,ngn_gng​个yiy_iyi​,nbn_bnb​个ziz_izi ...

最新文章

  1. 供配电负荷计算方法详解
  2. uri和url的区别
  3. 如何用chrome查看post get及返回的数据
  4. oracle primavera p6 下载,【项目管理软件套装】Oracle Primavera P6 Enterprise
  5. 图书管理系统【JavaWeb:部署开发环境、解决分类、图书、前台页面模块】
  6. usaco-2.1-frac1-pass
  7. redis插槽(slot)分配详解(集群动态新增或删除结点)
  8. ba网络c语言编程,如何用C语言程序构造随机网络和BA无尺度网络
  9. 什么叫预判_挖机事故发生之前,挖机司机做了什么?
  10. regexp函数 mysql_mysql 五中的REGEXP函数_mysql
  11. linux如何查看 GPU的信息
  12. 石家庄地铁(李秦,王学云)2
  13. verilog刷题笔记007
  14. Linux 文件系统
  15. (一)计算机网络的一些概念
  16. php基础 快速入门文档,快速入门 - Laravel 5.8 中文文档手册 - php中文网手册
  17. 信息素养—学术研究的必修课习题答案(week1-6)(第1-3章)
  18. CXXNET 安装教程
  19. flex 九宫格布局实现
  20. 二极管反向恢复时间和反向恢复电流

热门文章

  1. java代码怎么打印格子,格子位置 (Java代码)
  2. Nacos命名空间管理
  3. SpringSecurity用数据库信息做认证
  4. MIME Type描述消息内容类型的因特网标准
  5. 创建订单 - 填充新订单数据
  6. Bean标签基本配置
  7. ES6新特性之了解ES6以及其发展历史
  8. 分布式存储与服务器虚拟化,超融合架构与分布式存储+虚拟化软件的融合架构究竟区别有多大?...
  9. view 注册服务器,view服务器ip地址
  10. python异步框架twisted_twisted是python实现的基于事件驱动的异步网络通信构架。