首页 > 其他分享 >CF1853D Doctor's Brown Hypothesis

CF1853D Doctor's Brown Hypothesis

时间:2023-06-22 11:12:59浏览次数:32  
标签:Brown cnt CF1853D dep int le Hypothesis MAXN dis

题意简述

给你一张 \(n\) 个点 \(m\) 条边的有向图,你需要找出有多少个点对 \((u, v), 1 \le u \le v \le n\),满足存在一条从 \(u\) 到 \(v\) 的长度为 \(k\) 的途径,和一条从 \(v\) 到 \(u\) 的长度为 \(k\) 的途径。

\(1 \le n \le 10^5\),\(0 \le m \le 2 \times 10^5\),\(n^3 \le k \le 10^{18}\)。

题解

本文做法边带权也能做,因此不妨假设边带权。

容易发现只有在同一个强连通分量内的点对 \((u, v)\) 才可能满足条件,因此可以对每个强连通分量分别考虑。我们不妨假设原图强连通。

\(k \ge n^3\) 的条件暗示 \(k\) 足够大。在强连通图中,这意味着我们可以经过所有节点,并使用图上的每一个环对途径进行增广。记所有环长为 \(len_1, len_2, \dots, len_m\),不难发现我们增广的长度可以表示为 \(len_1x_1 + len_2x_2 + \dots + len_m x_m, \,x_1, x_2, \dots, x_m \ge 0\)。记 \(d = \gcd_{i = 1}^m len_i\),根据裴蜀定理和类似同余最短路的构造,可以证明对于足够大的 \(s\) 满足 \(d \mid s\),我们一定能够增广出长度 \(s\)。

于是不难想到我们需要求解 \(d\)。我声称,对于正整数 \(p\),\(p \mid d\) 的一个充分必要条件是能够找到一组 \(\{dis_n\}\),使得原图的所有边 \((u, v, w)\) 有 \(dis_v - dis_u \equiv w \,(\bmod \, t)\)。

充分性:

对于原图所有的环,记组成它的所有边为 \((u_1, u_2, w_1), (u_2, u_3, w_2), \dots, (u_l, u_1, w_l)\),必有 \(\sum_{i = 1}^l w_i \equiv \sum_{i = 1}^{l - 1} (dis_{u_{i + 1}} - dis_{u_i}) + dis_{u_1} - dis_{u_l} \equiv 0 \, (\bmod \, p)\)。因此 \(p\) 是所有环长的因数,即 \(p \mid d\)。

必要性:

考虑构造证明。由于原图强连通,我们可以找到一棵以 \(rt\) 为根的外向生成树。令 \(dis_{rt} = 0\),对于外向树上的每一条边 \((u, v, w)\),令 \(dis_v = dis_u + w\)。

该构造对于所有树边是合法的。

该构造对于所有反祖边同样合法,证明类似充分性证明的逆过程。

考虑横叉边 \((u, v)\),在外向树上从 \(v\) 走到 \(u\) 会反着经过若干条边。我们可以证明对于一条边 \((u, v, w)\),必然有一条从 \(v\) 到 \(u\) 的在模 \(p\) 意义下同余 \(-w\) 的途径。因此还是可以类似充分性证明的逆过程进行证明。

由于原图强连通,任取一条从 \(v\) 到 \(u\) 的路径。加上边 \((u, v, w)\) 我们形成了一个环。从 \(v\) 开始绕这个环 \(p - 1\) 圈,然后再走到 \(u\),这样我们就构造出了一条从 \(v\) 到 \(u\) 的在模 \(p\) 意义下同余 \(-w\) 的途径。

前向边的证明类似横叉边,在此略去。

基于上述结论以及必要性的证明过程,任取一棵外向生成树构造出 \(\{dis_n\}\),这个构造在模 \(p\) 意义下成立是 \(p \mid d\) 的充分必要条件。因此对于所有边 \((u, v, w)\),\(d\) 即为所有 \(dis_v - dis_u - w\) 的 \(\gcd\)。

求出 \(d\) 后,不难发现,\(u, v\) 之前的所有途径长度一定在模 \(d\) 意义下和 \(dis_v - dis_u\) 同余。所以判断点对 \((u, v)\) 是否满足题目条件即判断 \(dis_v - dis_u\) 和 \(dis_u - dis_v\) 是否在都模 \(d\) 意义下同余 \(k\)。

容易发现要么 \(k \equiv 0 \, (\bmod\,d)\),要么 \(d\) 是偶数并且 \(k \equiv \frac{d}{2} \, (\bmod \, d)\) 才能找到合法点对。如果 \(k\) 满足上述两个条件之一,限制就只要求 \(dis_v - dis_u \, \equiv k \, (\bmod \, d)\)。原题没有边权,因此直接前缀和优化即可。

时间复杂度 \(O(n)\)。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
template <typename T>
void chkmax(T &x, const T &y) {
  if (x < y) x = y;
}
template <typename T>
void chkmin(T &x, const T &y) {
  if (y < x) x = y;
}
constexpr int MAXN = 1e5 + 10;
int n, m, dfn[MAXN], low[MAXN], dfc, stk[MAXN], tp, dep[MAXN];
int cnt[MAXN];
bool ins[MAXN], vis[MAXN];
ll k, ans;
vector<int> g[MAXN];
void tarjan(int u) {
  dfn[u] = low[u] = ++dfc;
  stk[++tp] = u;
  ins[u] = true;
  for (auto v : g[u]) {
    if (!dfn[v]) {
      dep[v] = dep[u] + 1;
      tarjan(v);
      chkmin(low[u], low[v]);
    } else if (ins[v]) {
      chkmin(low[u], dfn[v]);
    }
  }
  if (dfn[u] == low[u]) {
    vector<int> buc;
    while (true) {
      int t = stk[tp--];
      ins[t] = false;
      buc.emplace_back(t);
      if (t == u) break;
    }
    for (auto i : buc) vis[i] = true;
    int d = 0;
    for (auto i : buc) {
      for (auto j : g[i])
        if (vis[j]) d = __gcd(d, dep[j] - dep[i] - 1);
    }
    d = abs(d);
    if (d) {
      int mxdep = 0;
      for (auto i : buc) {
        ++cnt[dep[i]];
        chkmax(mxdep, dep[i]);
      }
      if (k % d == 0) {
        for (int i = dep[u]; i <= mxdep; ++i) {
          ans += (ll)(cnt[i] + 1) * cnt[i] / 2;
          if (i - d >= dep[u]) {
            ans += (ll)cnt[i] * cnt[i - d];
            cnt[i] += cnt[i - d];
          }
        }
      } else if (!(d & 1) && k % d == d / 2) {
        for (int i = dep[u]; i <= mxdep; ++i) {
          if (i - d / 2 >= dep[u]) ans += (ll)cnt[i] * cnt[i - d / 2];
          if (i - d >= dep[u]) cnt[i] += cnt[i - d];
        }
      }
      fill(cnt + dep[u], cnt + mxdep + 1, 0);
    }
    for (auto i : buc) vis[i] = false;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> m >> k;
  while (m--) {
    int u, v;
    cin >> u >> v;
    g[u].emplace_back(v);
  }
  for (int i = 1; i <= n; ++i)
    if (!dfn[i]) tarjan(i);
  cout << ans << "\n";
  return 0;
}

标签:Brown,cnt,CF1853D,dep,int,le,Hypothesis,MAXN,dis
From: https://www.cnblogs.com/JCY-std/p/17497579.html

相关文章

  • P3087 [USACO13NOV]Farmer John has no Large Brown Cow S
    正解像是康托展开之类的?但是蒟蒻不会,所以用了一堆STL。对于每一列的字符串,按照字典序给它们编号。这样每一行的形容词串就变成了一堆数字。设共有\(s\)列,第\(i\)列共有\(b_i\)个不同的形容词,那么实际上每一行就是一个“第\(i\)位是\(b_i\)进制”的数。设第\(j\)行......
  • 实现hypothesis在网页标注后同步到本地obsidian
    实现hypothesis在网页标注后同步到本地obsidian遇到的question2023.3.21日在更改了自己的模板之后,可以能按照Todo的方式展现所有的标记,但是发现在同一个网页上增加了新......
  • 直观数学-3blue1brown动画的制作
    相信很多人都知道3Blue1Brown,这是一个由斯坦福大学的数学系学生GrantSanderson 创建的YouTube 频道。该频道从独特的视觉角度解说高等数学,内容包括线性代数、微积分、神......
  • Multiple Hypothesis Tracking 多目标跟踪 解释
    MultipleHypothesisTracking核心思想:非贪心匹配,参考帧数目大于2可以参考GTR,也是参考帧>2的整体关联的思路GTR是采用外观特征,利用Attention机制去噪、增强特征,其......
  • BrownfieldsWeb 开发项目
    BrownfieldsWeb开发项目介绍吨WebDev项目集成了业界在开发操作中使用的四大概念。即HTTPAPI,关系数据库设计和SQL(使用sqlite3),对象持久性,主要关注于逻辑和理解实现。......
  • 题解 UVA10869 Brownie Points II
    题意平面上有若干点,\(\text{stan}\)通过一个点划了一条直线,\(\text{ollie}\)通过在这条直线上的点作了一条垂线,那么平面被分成\(4\)个象限,\(\text{stan}\)获得的分数......
  • The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks
    目录概动机算法一些实验结果MNIST+LeNetCIFAR-10+Conv+DropoutCIFAR-10+VGG|ResNet+lrdecay+augmentationFrankleJ.andCarbinM.Thelotteryticketh......