解题思路

用2-SAT的思路将题目转化为:已知\(n\)个二元组\(<x,y>\),可以算出有多少属于不同二元组的元素\((a,b)\)存在冲突,要在每个二元组\(<x,y>\)中选择选择一个元素,且要尽可能的少选\(y\),问是否可以选取\(n\)个两两不相互矛盾的元素,若可以输出选取方案。

经过简单的推导可以得到,对于\(<x_i,y_i>\)和\(<x_j,y_j>\)

  • 若\(x_ix_j\)(不)冲突,则\(y_iy_j\)(不)冲突
  • 若\(x_iy_j\)(不)冲突,则\(y_ix_j\)(不)冲突

继续用2-SAT的思路,并结合上面的性质:

  • 若\(x_i\)仅和\(x_j\)冲突,则从\(x_i\)向\(y_j\)连一条边,从\(x_j\)向\(y_i\)连一条边;
  • 若\(x_i\)仅和\(y_j\)冲突,则从\(x_i\)向\(x_j\)连一条边,从\(y_i\)向\(y_j\)连一条边;
  • 若都不冲突则不连边;
  • 若都冲突则无解。

这样一来,我们得到了一个或多个联通块,根据之前推导的性质,对于第\(i\)个二元组,如果\(i\)的选取方法确定了,那么相同联通块里的选取方法也就都确定了,再加上不同联通块之间是互不影响的,我们只需要对每个联通块贪心的选取\(y\)少的方案,然后把所有联通块的答案加起来就是最终的答案了。

跑Tarjan缩点或者并查集缩点维护一下就没了。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=110;
int n,m,k;
ll a[55],b[55]; char s[55]; int fa[N],sz[N]; bool vis[N];
int find(int x){return fa[x]==x?x:(fa[x]=find(fa[x]));}
void merge(int x,int y){
x=find(x); y=find(y);
if(x!=y){sz[y]+=sz[x];fa[x]=y;}
} inline int getsame(ll x){
int cnt=0;
while(x){cnt++;x-=x&(-x);}
return m-cnt;
} void solve(){
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
bool c1=false,c2=false;
if(getsame(a[i]^a[j])>=k)c1=true;
if(getsame(a[i]^b[j])>=k)c2=true;
if(c1 && c2)continue;
if(!c1 && !c2){printf("-1\n");return;}
if(c2)merge(i,j+n),merge(i+n,j);
if(c1)merge(i,j),merge(i+n,j+n);
}
}
vector<int>ans;
for(int i=1;i<=n;i++){
int fi=find(i),fin=find(i+n);
if(fi==fin){printf("-1\n");return;}
if(vis[fi])continue;
if(vis[fin]){ans.push_back(i);continue;}
if(sz[fi]>sz[fin]){vis[fin]=true;ans.push_back(i);}
else vis[fi]=true;
}
printf("%d\n",(int)ans.size());
for(int i:ans)printf("%d ",i); puts("");
} int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=2*n;i++)fa[i]=i, sz[i]=(i>n?1:0), vis[i]=false;
for(int i=1;i<=n;i++){
scanf("%s",s); a[i]=0; b[i]=0;
for(int j=0;s[j];j++)a[i]*=2, a[i]+=s[j]-'0';
reverse(s,s+m);
for(int j=0;s[j];j++)b[i]*=2, b[i]+=s[j]-'0';
}
solve();
}
return 0;
}

Codeforces 1250E The Coronation的更多相关文章

  1. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  2. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  3. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  4. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  5. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  6. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  7. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  8. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

  9. CodeForces - 148D Bag of mice

    http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...

随机推荐

  1. 8道python练习题,能做出来的没几个

    变量的定义 程序就是用来处理数据的,而变量就是用来存储数据的 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道 ...

  2. webMvcConfigurer的详情

                  摘要 Spring的WebMvcConfigurer接口提供了很多方法让我们来定制SpringMVC的配置.而且Spring还提供了WebMvcConfigurerAdap ...

  3. SPP、ASPP、RFB、CBAM

    SPP:ASPP:将pooling 改为了 空洞卷积RFB:不同大小的卷积核和空洞卷积进行组合,认为大的卷积应该有更大的感受野. CBAM:空间和通道的注意力机制 SPP: Spatial Pyram ...

  4. System.out.println()相关源码

    System.out.println是一个Java语句,一般情况下是将传递的参数,打印到控制台. System:是 java.lang包中的一个final类.根据javadoc,“java.lang. ...

  5. 2020-04-22:谈谈JDK1.8下的HashMap在并发情况下链表成环的过程。(挖)

    福哥答案2020-04-22: jdk1.8下的hashmap采用的是尾插法,不会有链表成环的问题.jdk1.7下采用的头插***有链表成环的问题. hashmap成环原因的代码出现在transfer ...

  6. C#LeetCode刷题之#434-字符串中的单词数​​​​​​​(Number of Segments in a String)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3941 访问. 统计字符串中的单词个数,这里的单词指的是连续的不是 ...

  7. Vue Vuex中的严格模式/实例解析/dispatch/commit /state/getters

    严格模式 import getters from './getters' import mutations from './mutations' import actions from './acti ...

  8. [C#.NET 拾遗补漏]07:迭代器和列举器

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 07 篇文章. 在 C# 中,大多数方法都是通过 return 语句立即把程序的控制权交回给调用者,同时也会把方法内的本地资源释放掉.而包含 yie ...

  9. doT模板双重循环模板渲染方法

    doT模板作为一个前端渲染模板,有着非常显著的有点.1.轻量.2.快捷.3.无依赖. 本文介绍一种几乎所有模板都会遇到的问题,双重循环渲染.我们知道在dot模板中循环渲染用的是{{~ it:value ...

  10. 漏洞重温之文件上传(FUZZ)

    文件上传FUZZ思路通关upload-labs Pass-16 黑盒阶段 进入第十六关,首先我们能看到,该页面的上传点为图片上传. 首先,先把对方想的简单一点,这里虽然是上传图片,但是可能只是前端js ...