题目链接:点击查看

题目大意:给出 nnn 个 010101 序列表示二进制状态,问选择至少 ⌈n2⌉\lceil \frac{n}{2}\rceil⌈2n​⌉ 个状态进行位运算的与运算后得到的答案中,111 的位数最多的答案

题目分析:考虑最后需要求得的答案,一定是 ⌈n2⌉\lceil \frac{n}{2}\rceil⌈2n​⌉ 个状态中,其中一个状态的子集,于是我们就可以去枚举然后统计答案

考虑随机数,每随机抽一个状态,不在最后 ⌈n2⌉\lceil \frac{n}{2}\rceil⌈2n​⌉ 个数的概率为 12\frac{1}{2}21​,我们可以抽 505050 次甚至更多,抽不中的概率就是 (12)50(\frac{1}{2})^{50}(21​)50,这个概率以及近似无限接近百分百了

现在的问题就转换为了,给定一个状态,如何快速枚举其子集并统计其出现的个数

最朴素的做法就是,对于每个状态状压枚举其子集,然后维护一个 cntcntcnt 数组计数,这个复杂度是 O(n∗2p)O(n*2^p)O(n∗2p) 的

所以考虑用状压 dpdpdp 去维护前缀和的思想,假设现在有两个状态 i,ji,ji,j,满足 iii 是 jjj 的一个子集,即 i&j=ji\&j=ji&j=j,则根据前缀和的思想,可以有 cntj+=cnticnt_j+=cnt_icntj​+=cnti​

利用以上的优化,我们可以 O(np)O(np)O(np) 处理出初始的 cntcntcnt 数组,然后 O(p∗2p)O(p*2^p)O(p∗2p) 状压 dpdpdp 维护一下前缀和就好了

剩下的 O(p∗2p)O(p*2^p)O(p∗2p) 再枚举一下答案更新就可以了

代码:

// Problem: D. Love-Hate
// Contest: Codeforces - Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2)
// URL: https://codeforces.com/contest/1523/problem/D
// Memory Limit: 256 MB
// Time Limit: 3000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#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<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
mt19937_64 eng(time(NULL));
LL s[N];
int cnt[(1<<15)+100];
int a[N];
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m,p;read(n),read(m),read(p);for(int i=1;i<=n;i++) {string str;cin>>str;for(int j=0;j<m;j++) {if(str[j]=='1') {s[i]|=(1LL<<j);}}}iota(a+1,a+1+n,1);shuffle(a+1,a+1+n,eng);int ans=-1;string res;for(int t=1;t<=min(50,n);t++) {memset(cnt,0,sizeof(cnt));int p=a[t];vector<int>bits;for(int j=0;j<m;j++) {if((s[p]>>j)&1) {bits.push_back(j);}}int sz=bits.size();for(int i=1;i<=n;i++) {//n*pint state=0;for(int j=0;j<sz;j++) {if((s[i]>>bits[j])&1) {state|=(1<<j);}}cnt[state]++;}for(int j=0;j<sz;j++) {//p*2^pfor(int i=0;i<1<<sz;i++) {if(((i>>j)&1)==0) {cnt[i]+=cnt[i|(1<<j)];}}}for(int i=0;i<1<<sz;i++) {if(cnt[i]>=(n+1)/2&&__builtin_popcount(i)>ans) {ans=__builtin_popcount(i);res=string(m,'0');for(int j=0;j<sz;j++) {if((i>>j)&1) {res[bits[j]]='1';}}}}}cout<<res<<endl;return 0;
}

CodeForces - 1523D Love-Hate(随机数+状压dp)相关推荐

  1. Codeforces Gym 100676G Training Camp 状压dp

    http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...

  2. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  3. CodeForces - 1102F Elongated Matrix(哈密顿路径+状压dp)

    题目链接:点击查看 题目大意:给出一个 n∗mn * mn∗m 的数字矩阵,现在可以对 行 进行重新排列,现在对排列后的矩阵按列展开成线性:s1,s2,-,snm=maze1,1,maze2,1,.. ...

  4. Educational Codeforces Round 13 E. Another Sith Tournament 状压dp

    E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...

  5. CodeForces - 1550E Stringforces(二分+状压dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...

  6. Codeforces Beta Round #8 C. Looking for Order 状压dp

    题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...

  7. Codeforces ----- Kefa and Dishes [状压dp]

    题目传送门:580D 题目大意:给你n道菜以及每道菜一个权值,k个条件,即第y道菜在第x道后马上吃有z的附加值,求从中取m道菜的最大权值 看到这道题,我们会想到去枚举,但是很显然这是会超时的,再一看数 ...

  8. Gym - 101853E E. Maximum Sum (状压DP)

    原题地址:https://codeforces.com/gym/101853/problem/E 题意:给出一个n*n的矩阵,矩阵中每一个格子都有一个权值,选择一个格子就能拿到当前的权值,但是同时就不 ...

  9. 【状压DP】哈密顿回路问题

    [状压DP]哈密顿回路问题 lzq同学在我准备午睡的时候发了一道蓝桥杯的题目给我,是哈密顿回路的.第一次看的时候是想DFS+双向搜索优化减小搜索树规模,然后写烂了(如果有大佬用搜索优化写出来了麻烦教教 ...

最新文章

  1. 工信部部长苗圩于CITE发表致辞,指引三个方向推动国内电子信息产业持续发展...
  2. 软件测试 图覆盖,软件测试(四)——图覆盖
  3. 如何跨过自学SAP的三道坎
  4. ARM的位置无关程序设计
  5. 循环序列模型 —— 1.2 数学符号
  6. Django讲课笔记01:Django简介
  7. 20190703 日子
  8. AndroidProject
  9. Flash 3D引擎比较
  10. 提取中国范围数据的ncl代码
  11. 应届毕业生面试程序员自我介绍
  12. php数组的作业,PHP数组
  13. Linux服务器搭建24小时直播平台
  14. 如何用云服务器进行深度学习
  15. CPP----C++练习100题
  16. linux 内存耗尽重启,【server故障】linux下JVM内存耗尽故障
  17. kafka是什么?深刻理解kafka
  18. windows下如何安装及使用github
  19. 关于video++,jsrun,有道笔记等的感想
  20. 关于CH375芯片的简介以及其与51单片机的连接

热门文章

  1. Nginx配置成系统服务
  2. MySQL语法解析和预处理(Parser Preprocessor)
  3. Survivor区详解
  4. 通道Channel-使用NIO 读取数据
  5. Spring简介-Spring的优势
  6. 前端权限控制:实现思路分析-待修改
  7. plsql中的if判断
  8. 封装案例-创建士兵类-完成初始化方法
  9. JAVA标识符的命名规则和规范
  10. linux的tns 日志,Oracle 11g R2 常用配置与日志的文件位置