Codeforces 1250E The Coronation
解题思路
用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的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- IntelliJIDEA的安装、配置与使用
引言: IDEA,全称 IntelliJ IDEA,是 Java 语言的集成开发环境,IDEA 在业界被公认为是 最好的 java 开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE 支持 ...
- [vue] computed 和 method
计算属性 计算属性只有在它的相关依赖发生改变时才会重新取值 Method method每次渲染的时候都会被执行 举一个栗子 <template>...<div> <p& ...
- Nginx配置SSL证书,提高网络安全性
首先区别Http与Https HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高 ...
- 阿里出品的最新版 Java 开发手册,嵩山版,扫地僧
说起嵩山,我就想起乔峰,想起慕容复,以及他们两位老爹在少林寺大战的场景.当然了,最令我印象深刻的就是那位默默无闻,却一鸣惊人的扫地僧啊.这次,阿里出品的嵩山版 Java 开发手册的封面就有一个扫地僧, ...
- db2 创建function报错
create function fun_fw_sfyczy(pi_operunitid varchar(2)) returns varchar(2)LANGUAGE SQL BEGIN ATOMIC ...
- docker,容器,编排,和基于容器的系统设计模式
目录 从容器说起 背景 docker实现原理 编排之争 基于容器的分布式系统设计之道 单节点协作模式 Sidecar pattern(边车模式) Ambassador pattern(外交官模式) A ...
- iOS Abort问题系统性解决方案
一.背景 崩溃(Crash),即闪退,多指移动设备(如iOS.Android设备)在打开/使用应用程序的过程中,突然出现意外退出/中断的情况.如果App线上版本频繁发生崩溃,会极大地影响用户体验,甚至 ...
- 学长小清新题表之UOJ 180.实验室外的攻防战
学长小清新题表之UOJ 180.实验室外的攻防战 题目描述 时针指向午夜十二点,约定的日子--\(2\)月\(28\)日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks ...
- 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑
因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...
- MapReduce之MapJoin案例
@ 目录 使用场景 优点 具体办法:采用DistributedCache 案例 需求分析 代码实现 使用场景 Map Join 适用于一张表十分小.一张表很大的场景. 优点 思考:在Reduce 端处 ...