1199 字
6 分钟

P9850 [ICPC2021 Nanjing R] - Ancient Magic Circle in Teyvat 题解

2024-10-04
2024-10-04
浏览量 加载中...
Done

您已获得最佳的阅读体验!

题目地址:P9850

题目难度:NOI/NOI+/CTSC

题目来源:ICPC  南京  2021

给定一个 nn 个点的完全图,有 mm 条边是红色的,其余边是蓝色的,求出边均为蓝色的大小为 44 的完全子图个数与边均为红色的大小为 44 的完全子图个数的差。

对所有数据满足,4n105{4\le n\le 10^5}0mmin(n(n1)2,2×105){0\le m\le \min(\frac{n(n-1)}{2},2\times 10^5)}

nn 的量级是 105{10^5} 的,因此不能直接建完全图,考虑把蓝色图用红色图表示出来。假设存在 fif_i 个有 ii 条边的红色子图,那么对于一张存在 jj 条红色边的图,就能有 (ji)\binom{j}{i} 种选择方法;此时再令 gig_i 表示大小为 4{4} 且存在 ii 条红色边的完全子图个数,因此有下式:

fi=j=i(ji)gjf_i=\sum\limits_{j=i}\binom{j}{i}g_j

对上面的式子使用二项式反演得:

gi=j=i(ji)(1)jifjg_i=\sum\limits_{j=i}\binom{j}{i}(-1)^{j-i}f_j

那么求蓝色完全子图和红色完全子图的差就可以用 g0g6=i=05(1)ifi|g_0-g_6|=|\sum\limits_{i=0}^5(-1)^if_i| 得到,接下来对每个 fif_i 进行分类讨论:

  1. i=0i=0 时,即没有选定的红色边。此时随便选择四个点组成图,即 f0=(n4)f_0=\binom{n}{4}

  2. i=1i=1 时,需选定一条红色边。选边方案数是 (m1)\binom{m}{1},此时确定下两个端点,那么在剩下的 n2n-2 个点里选择两个点,即 f1=(m1)(n22)f_1=\binom{m}{1}\binom{n-2}{2}

  3. i=2i=2 时,分两类考虑:

    • 两条线有公共端点:首先枚举这个公共点,再枚举两条以该点为端点的线段,最后选剩下的那个点。此时方案数为 (n3)u=1n(du2)(n-3)\sum\limits_{u=1}^n\binom{d_u}{2},其中 dud_u 为原无向图中点 uu 的度数。
    • 两条线无公共端点:正难则反,将原图中任意选两条边的方案数减去两条线有公共端点的方案数即得两条线无公共端点的方案数。也就是 (m2)u=1n(du2)\binom{m}{2}-\sum\limits_{u=1}^n\binom{d_u}{2}
    • 两情况求和得:f2=(m2)+(n4)u=1n(du2)f_2=\binom{m}{2}+(n-4)\sum\limits_{u=1}^{n}\binom{d_u}{2}
  4. i=3i=3 时,继续分类讨论:

    • 三条边组成一个三元环,再枚举剩下的一个点,结果为 (n3)C3(n-3)C_3
    • 三条边共用一个顶点,枚举这个顶点,选择直连边中的三条即可涵盖四个点,即 u=1n(n3)\sum\limits_{u=1}^n\binom{n}{3}
    • 三条边形成链状结构。选择一条边,该边的两个端点分别支出去一条边,刚好覆盖满四个点。注意把成环情况舍去,同一个三元环会算三次,最终需减去 3C3{3}C_3。结果为:3C3+(u,v)E(du1)(dv1)-3C_3+\sum\limits_{(u,v)\in E}(d_u-1)(d_v-1)
    • 综上,f3=(n6)C3+(u,v)E(du1)(dv1)f_3=(n-6)C_3+\sum\limits_{(u,v)\in E}(d_u-1)(d_v-1)
  5. i=4i=4 时,分两类讨论:

    • 四条边组成一个四元环,四个点恰好均被覆盖,无需多余枚举,结果为 C4C_4
    • 三元环的某个顶点支出去一条边,枚举这个端点。结果为 u=1nsu(du2)\sum\limits_{u=1}^ns_u(d_u-2),其中 sus_u 为经过点 uu 的不同三元环个数。
    • 综上,f3=C4+u=1nsu(du2)f_3=C_4+\sum\limits_{u=1}^ns_u(d_u-2)
  6. i=5i=5 时,只有一种情况,那就是两个三元环共用一条边。此时只需枚举这个公共边即可,即 f5=iC3(ti2)f_5=\sum\limits_{i\in\mathbb C_3}\binom{t_i}{2},其中 C3\mathbb C_3 表示求解三元环时完成定向的边集,tit_i 表示覆盖到边 ii 的不同三元环个数。

最后套公式计算即可,注意加上绝对值,建图用前向星会超时。

#include <bits/stdc++.h>
#define N 100010
#define M 200010
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
vector<PII> E[N];
vector<int> G[N];
int u[N << 1], v[N << 1];
ll deg[N << 1];
ll cnt[N << 1];
ll containerP[N], containerE[M];
int tmp[N], id[N];
ll n, m;
ll countTripling() {
ll ret = 0;
for (int i = 1; i <= n; i++) {
for (auto j: E[i]) id[j.first] = j.second;
for (auto j: E[i]) {
int k = j.first;
for (auto l: E[k]) {
int w = l.first;
if (id[w]) {
containerP[i]++;
containerP[k]++;
containerP[w]++;
containerE[j.second]++;
containerE[l.second]++;
containerE[id[w]]++;
ret++;
}
}
}
for (auto j: E[i]) id[j.first] = 0;
}
return ret;
}
ll countQuadrant() {
for (int i = 1; i <= m; i++) {
if ((deg[u[i]] == deg[v[i]] && u[i] > v[i]) || deg[u[i]] > deg[v[i]]) swap(u[i], v[i]);
E[u[i]].emplace_back(v[i], i);
}
ll ret = 0;
int hh = 0;
for (int i = 1; i <= n; i++) {
for (int j: G[i]) {
for (auto k: E[j]) {
int w = k.first;
if (deg[i] < deg[w] || (deg[i] == deg[w] && i < w)) {
ret += cnt[w];
if (!cnt[w]) tmp[hh++] = w;
cnt[w]++;
}
}
}
for (int j = 0; j < hh; j++) cnt[tmp[j]] = 0;
hh = 0;
}
return ret;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> u[i] >> v[i];
deg[u[i]]++;
deg[v[i]]++;
G[u[i]].push_back(v[i]);
G[v[i]].push_back(u[i]);
}
ll quad = countQuadrant();
ll trip = countTripling();
ll f0, f1, f2 = 0, f3 = 0, f4 = 0, f5 = 0;
for (int i = 1; i <= n; i++) {
f2 += deg[i] * (deg[i] - 1) / 2 * (n - 4);
f3 += deg[i] * (deg[i] - 1) * (deg[i] - 2) / 6;
f4 += containerP[i] * (deg[i] - 2);
for (auto j: E[i]) {
int k = j.first;
f3 += (deg[i] - 1) * (deg[k] - 1);
}
}
for (int i = 1; i <= m; i++) {
f5 += containerE[i] * (containerE[i] - 1) / 2;
}
f0 = (__int128) n * (n - 1) * (n - 2) * (n - 3) / 24;
f1 = m * (n - 2) * (n - 3) / 2;
f2 += m * (m - 1) / 2;
f3 += trip * (n - 6);
f4 += quad;
cout << abs(f0 - f1 + f2 - f3 + f4 - f5);
return 0;
}

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
P9850 [ICPC2021 Nanjing R] - Ancient Magic Circle in Teyvat 题解
https://justpureh2o.cn/articles/9850/
作者
JustPureH2O
发布于
2024-10-04
许可协议
CC BY-NC-SA 4.0
最后更新于 2024-10-04,距今已过 499 天

部分内容可能已过时

评论区

Profile Image of the Author
JustPureH2O
穷方圆平直之情,尽规矩准绳之用
公告
JustPureH2O 的博客现已正式迁移至 Astro!原 Hexo 网站将移至 https://hexo.justpureh2o.cn/
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
100
分类
12
标签
54
总字数
368,990
运行时长
0
最后活动
0 天前

目录