CF1523D Love-Hate 题解
抽象化题意:
一共有 \(m\) 个元素,给定 \(n\) 个集合,每个集合的元素不超过 \(15\) 个,求出一个元素个数最多的集合 \(S\) 是至少 \(\lceil \dfrac{n}{2} \rceil\) 个集合的子集。
其中$ p $ $ (1 \le n \le 2 \cdot 10^5, 1 \le p \le m \le 60) $
我们先假设 \(limit= \lceil \dfrac{n}{2} \rceil\)
先考虑最基础的暴力,如果我们每次枚举答案集合 \(S\) ,然后再计算出是否有大于等于 \(limit\) 个集合是 \(S\) 的超集,更新答案
计算超集可以通过 \(SOSDP\) ,仍然TLE,先从题目本质入手,它是让我们求一个集合使得是至少 \(\lceil \dfrac{n}{2} \rceil\) 个集合的子集,那么这个答案显然是某 \(\lceil \dfrac{n}{2} \rceil\) 个集合的子集,那如果我们随机任取一个集合,正确答案是它子集的概率就是50%,那我们直接随 \(num\) 次,可以直接让答案错误的概率降到极低,错误的概率就是 \(\dfrac{1}{2^{num}}\) 。
也就是说随机50次的样子,每次对于随机到的集合,通过 \(O(p\times2^p)\) 来计算超集,具体细节就是需要搞个vector来存某位是1的位置就行了。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
template<class T>
inline T read(){
T r=0,f=0;
char c;
while(!isdigit(c=getchar()))f|=(c=='-');
while(isdigit(c))r=(r*10)+(c^48),c=getchar();
return f?-r:r;
}
int n,m,p,limit;
int a[200005];
bool flag[200005];
vector<int>g;
inline int idx(char c){
return c-'0';
}
int dp[1000005];
int ans;
mt19937 rd(time(0));
inline void work(){
int pos;
while(1){
pos=rd()%n+1;
if(!flag[pos]){flag[pos]=true;break;}
}
g.clear();
int num=a[pos];
for(int i=0;i<m;i++){
if((num>>i)&1)g.emplace_back(i);
}
memset(dp,0,sizeof(dp));
int S=g.size();
for(int i=1;i<=n;i++){
int tmp=0;
for(int j=0;j<S;j++){
if((a[i]>>g[j])&1)tmp|=(1<<j);
}
++dp[tmp];
}
for(int i=0;i<S;i++){
for(int j=0;j<(1ll<<S);j++){
if(!((j>>i)&1))dp[j]+=dp[j^(1<<i)];
}
}
int res=0;
for(int i=1;i<(1ll<<S);i++){
if(dp[i]>=limit){
if(__builtin_popcountll(res)<__builtin_popcountll(i))res=i;
}
}
int res2=0;
for(int i=0;i<S;i++){
if((res>>i)&1)res2|=(1ll<<g[i]);
}
if(__builtin_popcountll(res)>__builtin_popcountll(ans))ans=res2;
}
signed main(){
n=read<int>(),m=read<int>(),p=read<int>();
limit=(n+1)>>1;
for(int i=1;i<=n;i++){
char c;
for(int j=0;j<m;j++){
cin>>c;
if(idx(c))a[i]|=(1ll<<j);
}
}
for(int t=1;t<=min(n,50ll);t++)work();
for(int i=0;i<m;i++)
((ans>>i)&1)?putchar('1'):putchar('0');
puts("");
return 0;
}
CF1523D Love-Hate 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- you-get的使用
转载自: 利用Python下载:You-Get的安装及使用方法 - 宁佳兵 - 博客园 宁佳兵 所谓的光辉岁月,并不是后来闪耀的日子,而是无人问津时,对梦想的偏执. 博客园 首页 标签 GitHu ...
- Doris写入数据异常提示actual column number in csv file is less than schema column number
版本信息: Flink 1.17.1 Doris 1.2.3 Flink Doris Connector 1.4.0 写入方式 采用 String 数据流,依照社区网站的样例代码,在sink之前将数据 ...
- keycloak~AbstractJsonUserAttributeMapper的作用
AbstractJsonUserAttributeMapper 它是一个抽象类,用来更新条件更新用户属性(user_attribute)的信息,我们在实现自己的mapper时,需要关注3个方法,下面分 ...
- 2023-07-22:一共有n个项目,每个项目都有两个信息, projects[i] = {a, b}, 表示i号项目做完要a天,但是当你投入b个资源,它就会缩短1天的时间, 你一共有k个资源,你的目
2023-07-22:一共有n个项目,每个项目都有两个信息, projects[i] = {a, b}, 表示i号项目做完要a天,但是当你投入b个资源,它就会缩短1天的时间, 你一共有k个资源,你的目 ...
- 2023-07-23:给你 n 个任务和 m 个工人 每个任务需要一定的力量值才能完成 需要的力量值保存在下标从 0 开始的整数数组 tasks 中 第 i 个任务需要 tasks[i] 的力量才能完
2023-07-23:给你 n 个任务和 m 个工人 每个任务需要一定的力量值才能完成 需要的力量值保存在下标从 0 开始的整数数组 tasks 中 第 i 个任务需要 tasks[i] 的力量才能完 ...
- ch-manager.sh
[root@dev-clickhouse1 ~]# cat ch-manager.sh #!/bin/bash ch_arr=(ch1-shard1-main ch1-shard2-sub ch2-s ...
- 牛客小白月赛65 E题 题解
原题链接 题意描述 构造一个\(1\)到\(n\)的排列,使得其中正好有\(k\)个二元组\((i, j)\)满足,\(1\le i\lt j\le n\) && \(a_i - a_ ...
- 使用$test$plusargs提高RTL验收速度
0 前言 这段时间在整合一个小ip,因为要验证每个feature是否可行,需要用testbench + C语言的方式进行仿真验证,由于每种feature不仅要在C语言中修改寄存器配置,还要再testb ...
- python实现在函数中捕获某个异常,然后将异常的具体信息写入error.txt文件中;
在程序开发中,如果对某些代码的执行不能确定(程序语法完全正确) 可以增加try来捕获异常 try这个关键字来捕获异常try:尝试执行的代码except:出现错误的处理 def func(): try: ...
- Django模板(请用Django2.0版本完成)
1. 在learn目录下新建一个templates文件夹,里面新建一个home.html (1) 很简单的,就直接右键learn,新建文件夹,完成后,继续右键templates,创建文档,后缀名为ht ...