CF2023C C+K+S 题解
题面
给您两个强联通的 \(^{\dagger}\) 有向图,每个图都有精确的 \(n\) 个顶点,但可能有不同数量的边。仔细观察后,您发现了一个重要特征——这些图中任何一个环的长度都能被 \(k\) 除尽。
每个 \(2n\) 顶点都属于两种类型中的一种:传入或传出。每个顶点的类型都是已知的。
您需要确定是否有可能在两张图之间建立恰好 \(n\) 条有向边,从而满足以下四个条件:
- 任何添加的边的两端都位于不同的图中。
- 从每个传出顶点,正好有一条新增边传出。
- 从每个传入顶点,正好有一条新增边进入。
- 在生成的图中,任何环的长度都能被 \(k\) 整除。
\(^{\dagger}\) 强联通图是指从每个顶点到其他顶点都有一条路径的图。
题解
由于所有环的长度被 \(k\) 整除,我们可以对上面进行环染色,染色后两个图的每一个点一定是唯一对应一种颜色,同时也可以是这个颜色的轮换。
因为图是强连通的,所以两个图任意找一点跑 \(\mathtt{bfs}\) 即可染色,考虑如何连接两个图,如果两个度出入度不等,一定不存在,否则,如果一个图全部都是出点或入点,那么这个图一定存在,因为加边不会构成环。
接下来考虑剩余的情况如何求解,考虑把第一张图所有颜色为 \(k\) 的出点个数记录下来给 \(s[k+1]\),入点个数记录给 \(s[k-1]\),第二张图必定满足记录的数据可以通过轮换与 \(s\) 相同,考虑 \(\mathtt{KMP}\) 匹配即可,为了防止 \(\mathtt{KMP}\) 匹配产生混淆,给入点加 \(n\),出点加 \(1\) 可以保证结果一定不同。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + 10;
int n, m, k, a[N], b[N];
void solve()
{
int n, m, k;
cin >> n >> k;
vector<int> a(n), b(n);
vector<vector<int>> ea(n), eb(n);
for (int i = 0; i < n; i ++ ) cin >> a[i];
cin >> m;
for (int i = 1; i <= m; i ++ )
{
int x, y;
cin >> x >> y;
x -- , y -- ;
ea[x].push_back(y);
}
for (int i = 0; i < n; i ++ ) cin >> b[i];
cin >> m;
for (int i = 0; i < m; i ++ )
{
int x, y;
cin >> x >> y;
x -- , y -- ;
eb[x].push_back(y);
}
int cnt0 = count(a.begin(), a.end(), 0);
int cnt1 = count(b.begin(), b.end(), 1);
if (cnt0 != cnt1) return cout << "NO\n", void();
if (cnt0 == n || !cnt0) return cout << "YES\n", void();
vector<int> c1(n, -1), c2(n, -1);
queue<int> q;
q.push(0), c1[0] = 0;
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = 0; i < ea[u].size(); i ++ )
{
int j = ea[u][i];
if (c1[j] == -1)
{
c1[j] = (c1[u] + 1) % k;
q.push(j);
}
}
}
q.push(0), c2[0] = 0;
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = 0; i < eb[u].size(); i ++ )
{
int j = eb[u][i];
if (c2[j] == -1)
{
c2[j] = (c2[u] + 1) % k;
q.push(j);
}
}
}
vector<ll> s(k + 1), t(k + 1);
for (int i = 0; i < n; i ++ )
{
if (a[i]) s[(c1[i] + 1) % k + 1] += n;
else s[(c1[i] - 1 + k) % k + 1] += 1;
if (b[i]) t[c2[i] + 1] += 1;
else t[c2[i] + 1] += n;
}
for (int i = 1; i <= k; i ++ ) t.push_back(t[i]);
vector<int> ne(k * 2 + 1);
for (int i = 2, j = 0; i < s.size(); i ++ )
{
while (j && s[i] != s[j + 1]) j = ne[j];
if (s[i] == s[j + 1]) j ++ ;
ne[i] = j;
}
for (int i = 1, j = 0; i < t.size(); i ++ )
{
while (j && t[i] != s[j + 1]) j = ne[j];
if (t[i] == s[j + 1]) j ++ ;
if (j == k) return cout << "YES\n", void();
}
cout << "NO\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;
cin >> T;
while (T -- ) solve();
return 0;
}
CF2023C C+K+S 题解的更多相关文章
- OJ2237第k小数题解
题目描述: 有n个数,请你找出第k小的数. 输入描述: 第一行有2个正整数n,k(n,k<=10^7)第二行有n个非负数ai(ai<=10^5) 输出描述: 输出第k小的数. 输入样例: ...
- 9.1练习题5 差k素数对 题解
题目出处:洛谷 P1348 ,题面略有改编. 题目描述 给你两个数 n 和 k ,请求出所有小于等于 n 的相差为 k 的素数对. 输入格式 两个正整数n,k.1<=k<=n<=10 ...
- 排序入门练习题3 谁考了第k名 题解
题目出处:<信息学奥赛一本通>第二章 上机练习1 题目描述 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名的学生的学号和成绩. 输入格式 输入的第一行包含两 ...
- 洛谷 P2105 K皇后 题解
START: 2021-08-06 16:34:44 题目链接: https://www.luogu.com.cn/problem/P2105 题目详情: 小 Z 最近捡到了一个棋盘,他想在棋盘上摆放 ...
- ABC267G Increasing K Times 题解
做这道题,很有感悟,发篇文. 先给数列从小到大排个序. 接下来设 \(f_{i,j}\) 表示前 \(i\) 个数的排列形成 \(j\) 个上坡的方案数. 接下来考虑转移,分为插入第 \(i\) 个数 ...
- 2018ICPC网络赛(焦作站)K题题解
一.题目链接 https://nanti.jisuanke.com/t/31720 二.题意 给$N$种船只,第$i$种船的载重量是$V_i$,数量是$2^{C_i}-1$.接下来有$Q$次询问,每次 ...
- 2018HPU暑期集训第四次积分训练赛 K - 方框 题解(图形打印)
思路分析:题目已经明确透露了这道题的解法:就是画框.当 输入的边长 的话,就表示可以在内层继续嵌套一个方框.废话就不多说了,直接上代码吧! 代码如下: #include <iostream&g ...
- POJ2104 区间第k小
题意就是区间第k大…… 题解: 前段时间用主席树搞掉了…… 如今看到划分树,是在想来写一遍,结果18号对着学长的代码调了一上午连样例都没过,好桑心…… 今天在做NOI2010超级钢琴,忽然发现用划分树 ...
- Codeforces Round #460 (Div. 2) ABCDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8397685.html 2018-02-01 $A$ 题意概括 你要买$m$斤水果,现在有$n$个超市让你选择. ...
- HDU 5977 Garden of Eden(点分治求点对路径颜色数为K)
Problem Description When God made the first man, he put him on a beautiful garden, the Garden of Ede ...
随机推荐
- SLF4J+Logback日志搭建
一.jar包依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api< ...
- SSH Agent 的作用
SSH Agent 是一种用于管理 SSH 私钥的程序,它可以帮助用户在使用 SSH 进行认证时,无需每次都手动输入密码.SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络中安 ...
- FFmpeg开发笔记(四十九)助您在毕业设计中脱颖而出的几个流行APP
对各高校即将毕业的学子来说,毕业设计算是在大学里的最后一个大作业.特别是软件.计算机.电子等相关专业,毕业设计非常讲究实操,往往要求实现一个实用的.可用的.易用的软件系统或手机APP. 不管是软件还 ...
- OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown
使用如下两个命令均无法进入容器 docker exec -it xxx /bin/bash docker exec -it xxx bash 以为是docker的问题,所以重启 systemctl r ...
- 【SpringBoot Demo】MySQL + JPA + Hibernate + Springboot + Maven Demo
主要包含:springboot+jpa+hibernate+mysql+lombok (两年前写过一个,现在重新记录一个) 1. 目录结构: 2. pom 文件 1 <?xml version= ...
- HTML – Native Dialog Modal
前言 之前介绍 Native Form 的时候有提及过 method="dialog", 但由于它太新了, 所以没去研究. 这篇就介绍一下. Dialog 也好 Modal 也好, ...
- 非常非常好用的一款账户密码保存工具-KeePass
非常非常好用的一款账户密码保存工具 下载地址: https://sourceforge.net/projects/keepass/files/KeePass%202.x/2.55/KeePass- ...
- VMware Vsphere 8.0 ESXI 主机部署
一. VMware vSphere 8.0新特性 VMware vSphere 8.0是一个全新的版本,引入了许多新功能,其中最主要的新功能包括 1.集中式云控制台 使 IT 管理员能够借助 vSph ...
- USB ncm虚拟网卡
NCM介绍 1 功能 USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Dev ...
- 2024年9月中国数据库流行度排行榜:TiDB重回前三,GoldenDB问鼎前五
9月墨天轮数据社区的中国数据库流行度排行榜如约而至.除了冠亚两位,排名第三至第五的数据库产品均经历了位次的变动.榜单之上,稳健的老牌强者.崛起的新兴产品.以及那些在背后默默积蓄力量.准备厚积薄发的竞争 ...