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 Set -「LOCAL」冲刺省选 Round XXIV

    \(\mathscr{Summary}\)   名副其实的 trash round,希望以后没有了.   A 题算好,确实一个比较关键的简化状态的点没想到,所以只拿了暴力(不考虑 \(\mathcal ...

  2. 树莓派使用docker安装青龙面板和改面板端口号

    配置环境 系统:Raspbian 11(64位) 设备:树莓派4B 系统默认没有防火墙,所以就不用在防火墙中开放端口. 一.安装docker(已安装省略) 1.安装 curl -fsSL https: ...

  3. nginx拒绝国外IP访问

    nginx拒绝国外IP访问方法很多,比如iptables,geoip模块,域名解析等等.这些方法不会相互冲突,可以结合起来一起使用. 今天来教大家利用两个小方法解决  域名解析禁止掉海外IP访问网站. ...

  4. 渗透利器burp suite新版本v2020.9.1及v2020.8汉化版下载

    Burp suite是一款抓包渗透必备软件.burp Suite是响当当的web应用程序渗透测试集成平台.从应用程序攻击表面的最初映射和分析,到寻找和利用安全漏洞等过程,所有工具为支持整体测试程序而无 ...

  5. 【C++ 调试】增量链接 Incremental Linking

    概述: Incremental Linking翻译成中文就是"增量链接",是一个链接的参数选项,作用就是为了提高链接速度的.什么意思呢?不选用增量链接时,每次修改或新增代码后进行链 ...

  6. .NET组件 vs. COM组件

    本文转载:https://www.cnblogs.com/larissa-0464/p/11095203.html 写在前面:我没有开发过COM组件的经验,只是在做文献综述的时候需要了解这方面的知识, ...

  7. C# pdb类型文件的作用之一:记录具体异常的关键信息,如文件路径和行号

    pdb 是 Program Debug Database 的简称: 背景 我负责的一个Services(服务)出问题了,原因是一个 dll 内部逻辑出问题了: 在本地修改源码后,重新生成dll(Deb ...

  8. AcWing 289. 环路运输

    传送门 思路: 一个环路上的问题,考虑拆环为链然后复制一倍接在后面.那么对于Ai与Aj,不妨设j<i,如果i-j>N/2则两者距离在新的链上就是i-j,而如果i-j<=N/2那么两者 ...

  9. spark conf的3种配置优先级

    在SparkConf上设置的属性具有最高的优先级,其次是传递给spark-submit或者spark-shell的属性值,最后是spark-defaults.conf文件中的属性值

  10. c# 读取对象的[公有属性]的名称,类型,值

    /// <summary> /// 获取某个对象的[公有属性]的名称,类型,值 /// </summary> /// <typeparam name="T&qu ...