loj536「LibreOJ Round #6」花札(二分图博弈)

loj

题解时间

很明显是二分图博弈。

以某个点为起点,先手必胜的充要条件是起点一定在最大匹配中

判断方法是看起点到该点的边有流量且该点不在起点割集中。

#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
namespace RKK
{
const int D=40011,N=100011,M=300011,inf=0x3f3f3f3f;
struct sumireko{int to,ne;int w;}e[M<<1];int he[N],ecnt=1;
void addline(int f,int t,int w)
{
e[++ecnt].to=t,e[ecnt].w=w;e[ecnt].ne=he[f],he[f]=ecnt;
e[++ecnt].to=f,e[ecnt].w=0;e[ecnt].ne=he[t],he[t]=ecnt;
}
void dddline(int f,int t,int w)
{
e[++ecnt].to=t,e[ecnt].w=w;e[ecnt].ne=he[f],he[f]=ecnt;
e[++ecnt].to=f,e[ecnt].w=w;e[ecnt].ne=he[t],he[t]=ecnt;
} int sp,ep;
int dep[N],cur[N];
queue<int> q;
int bfs(int sp,int ep)
{
memset(dep,0x00,sizeof(dep));
memcpy(cur,he,sizeof(cur));
q.push(sp),dep[sp]=1;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=he[x],t=e[i].to;i;i=e[i].ne,t=e[i].to)if(e[i].w&&!dep[t])
q.push(t),dep[t]=dep[x]+1;
}
return dep[ep]!=0;
}
int dfs(int x,int ep,int lim)
{
if(!lim||x==ep) return lim;
int ret=0,tmp;
for(int &i=cur[x],t=e[i].to;i;i=e[i].ne,t=e[i].to)
if(dep[t]==dep[x]+1&&(tmp=dfs(t,ep,min(e[i].w,lim))))
{
ret+=tmp,lim-=tmp;
e[i].w-=tmp,e[i^1].w+=tmp;
if(!lim) break;
}
return ret;
}
int dinic(int sp,int ep){int ret=0;while(bfs(sp,ep)) ret+=dfs(sp,ep,inf);return ret;} int m1,m2,n1,n2;
int x1[D],y1[D],x2[D],y2[D];
int ans[D]; int main()
{
read(m1,m2);
read(n1);for(int i=1;i<=n1;i++) read(x1[i],y1[i]);
read(n2);for(int i=1;i<=n2;i++) read(x2[i],y2[i]);
sp=n1+n2+m1+m2+1,ep=sp+1;
for(int i=1;i<=n1;i++) addline(sp,i,1),addline(i,n1+n2+x1[i],1),addline(i,n1+n2+m1+y1[i],1);
for(int i=1;i<=n2;i++) addline(n1+i,ep,1),addline(n1+n2+x2[i],n1+i,1),addline(n1+n2+m1+y2[i],n1+i,1);
dinic(sp,ep);for(int i=he[sp],t=e[i].to;i;i=e[i].ne,t=e[i].to)
if(!e[i].w&&!dep[t]) ans[t]=1;
for(int i=1;i<=n1;i++) printf("%d\n",ans[i]);
return 0;
}
}
int main(){return RKK::main();}

loj536「LibreOJ Round #6」花札(二分图博弈)的更多相关文章

  1. loj536 「LibreOJ Round #6」花札

    一眼二分图博弈,于是我们可以拿到69分的好成绩. 二分图暴力加边的数目是O(n^2)的,于是我们考虑网络流优化建图,将alice的每个牌向其的颜色和编号节点连边,bob的每个牌由其颜色和编号节点向其连 ...

  2. 【LOJ#536】「LibreOJ Round #6」花札

    题目链接 题目描述 「UniversalNO」的规则如下:每张牌有一种颜色和一个点数.两个人轮流出牌,由 Alice 先手,最开始牌堆为空,出的人可以出任意牌(放到牌堆顶),之后出的牌必须和当时牌堆顶 ...

  3. loj #547. 「LibreOJ β Round #7」匹配字符串

    #547. 「LibreOJ β Round #7」匹配字符串   题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...

  4. [LOJ#531]「LibreOJ β Round #5」游戏

    [LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...

  5. [LOJ#530]「LibreOJ β Round #5」最小倍数

    [LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...

  6. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  7. [LOJ#515]「LibreOJ β Round #2」贪心只能过样例

    [LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...

  8. [LOJ#525]「LibreOJ β Round #4」多项式

    [LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...

  9. [LOJ#526]「LibreOJ β Round #4」子集

    [LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...

随机推荐

  1. Solution -「WC 2022」秃子酋长

    \(\mathscr{Description}\)   Link. (It's empty temporarily.)   给定排列 \(\{a_n\}\),\(q\) 次询问,每次给出 \([l,r ...

  2. suse 12 二进制部署 Kubernetets 1.19.7 - 第11章 - 部署coredns组件

    文章目录 1.11.0.部署coredns 1.11.1.测试coredns功能 suse 12 二进制部署 Kubernetes 集群系列合集: suse 12 二进制部署 Kubernetets ...

  3. CentOS7利用yum缓存搭建本地源

    CentOS7利用yum缓存搭建本地源 环境说明 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 ( ...

  4. 『无为则无心』Python基础 — 44、对文件和文件夹的操作

    目录 1.os模块介绍 2.查看os模块相关文档 3.os模块常用方法 (1)文件重命名 (2)删除文件 (3)创建文件夹 (4)删除文件夹 (5)获取当前目录 (6)改变默认目录 (7)获取目录列表 ...

  5. Django数据库与模块models(4)

    上一节做到把一个应用加入到项目中,现在再往里面加一个数据库就可以与数据库进行交互了. Django默认有一个轻量级的数据库叫SQLite,当我们要更换其他的数据库时,则需要绑定数据库,如何绑定?首先打 ...

  6. proto编译组件使用

    proto编译组件使用 前提:所有组件已经安装好,包括: protoc protoc-gen-go protoc-gen-grpc-gateway protoc-gen-swagger 怎么装再开一篇 ...

  7. 号称BI商业智能界的“四大天王”

    基于云部署的现代商业智能与数据分析平台(国内似乎只有应用上云,数据本地化的趋势)正在逐步占据主流市场.随着市场在易用性和增强分析(augmented analytics)的变革,数据与分析领导者正在逐 ...

  8. 不需要高价购买BI工具,掌握这个Excel插件就能碾压大数据

    ​曾几何时,EXCEL在数据界可谓是独树一帜,引领风骚,在职场中无人不知,无人不晓.但是随着大数据的出现,EXCEL便风光不再,江河日下,一度被其他大数据工具挤到了后面,逐渐被边缘化了.而我是一个EX ...

  9. C# 操作字符串注意事项

    下面是常见的一个例子 static void Main(string[] args) { string str = "test"+9; string str2 = "te ...

  10. C#?和??运算符以及合并条件表达式

    最近项目中,常常碰到这个?和??这两个操作符,之前说得不够详细,趁着周末补全来,希望能够给大家带来帮助. (一)?操作符 我们知道值类型是不肯能为空的,它总是包含值的本身,不会为NULL,这估计也是值 ...