【学习笔记】CF1835D Doctor‘s Brown Hypothesis

这篇具有很好参考价值的文章主要介绍了【学习笔记】CF1835D Doctor‘s Brown Hypothesis。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有点难😅

发现 x , y x,y x,y在一个强连通块内,这样一定有环🤔

发现可以找到强连通块内所有环长度的 gcd ⁡ \gcd gcd,这样从 x x x y y y的所有路径的长度都模这个数同余,又因为 K K K非常大,所以我们总可以遍历整个强连通块并走若干个环,因此只需要从 x x x y y y的任意一条路径的长度和 K K K gcd ⁡ \gcd gcd同余即可

首先要做过这道题 [ABC306G] Return to 1

发现直接 D F S DFS DFS即可,感觉没啥区别啊😅

复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)文章来源地址https://www.toymoban.com/news/detail-709535.html

#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ll long long
using namespace std;
const int N=1e5+5;
int n,m;
int dfn[N],low[N],num,vs[N],cnt;
int dis[N],ps[N],sz[N],g;
ll K,res;
vector<int>G[N];
stack<int>s;
int gcd(int x,int y){
    return y==0?x:gcd(y,x%y);
}
vector<int>vec;
void dfs(int u){
    vec.pb(dis[u]);
    for(auto v:G[u]){
        if(ps[v]!=cnt)continue;
        if(dis[v]==-1)dis[v]=dis[u]+1,dfs(v);
        else g=gcd(g,abs(dis[u]+1-dis[v]));
    }
}
ll calc(ll x){
    return x*(x+1)/2;
}
void tarjan(int u){
    dfn[u]=low[u]=++num,vs[u]=1,s.push(u);
    for(auto v:G[u]){
        if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
        else if(vs[v])low[u]=min(low[u],dfn[v]);
    }if(low[u]==dfn[u]){
        int tmp;cnt++;
        do{
            tmp=s.top(),s.pop();
            vs[tmp]=0,ps[tmp]=cnt,ps[tmp]=cnt;
        }while(tmp!=u);
        g=0,dis[u]=0,vec.clear(),dfs(u);
        if(g){
            for(auto e:vec)sz[e%g]++;
            if(K%g==0){
                for(int i=0;i<g;i++){
                    res+=calc(sz[i]);
                }
            }
            if(g%2==0&&K%g==g/2){
                for(int i=0;i<g;i++){
                    int j=(i+g/2)%g;
                    if(i<j)res+=(ll)sz[i]*sz[j];
                }
            }
            for(auto e:vec)sz[e%g]--;
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>K,memset(dis,-1,sizeof dis);
    for(int i=1;i<=m;i++){
        int x,y;cin>>x>>y;
        G[x].pb(y);
    }for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
    cout<<res;
}

到了这里,关于【学习笔记】CF1835D Doctor‘s Brown Hypothesis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【学习笔记】CF607E Cross Sum

    分为两个部分求解。 首先考虑找到距离 ≤ r le r ≤ r 的交点数量。发现这等价于圆上两段圆弧相交,因此将圆上的点离散化后排序,用一个主席树来求就做完了。 然后是距离求和。这看起来非常棘手。事实上,只要把所有交点都找出来就做完了。首先可以放心的将圆环从一

    2024年02月02日
    浏览(31)
  • 【学习笔记】CF627F Island Puzzle

    好啊,树上贪心题。 首先可以用类似于拓扑排序的过程将无用的节点全部删掉。 具体的,如果两个叶子节点对应的值恰好相同,那么同时将叶子节点删去;如果其中一个叶子节点对应的是 0 0 0 ,并且与父节点交换后相同,因为操作是可逆的,那么花费 1 1 1 的代价将 0 0 0 往

    2024年02月02日
    浏览(41)
  • 【*1900 图论+枚举思想】CF1328 E

    Problem - E - Codeforces 题意: 思路: 注意到题目的性质:满足条件的路径个数是极少的,因为每个点离路径的距离 =1 先考虑一条链,那么直接就选最深那个点作为端点即可 为什么,因为我们需要遍历所有点的父亲 推广到树,也是要遍历所有点的父亲 为什么要加枚举的tag,因为

    2024年02月14日
    浏览(41)
  • 【学习笔记】CF573E Bear and Bowling

    感觉贪心的做法比较自然🤔,推荐 这篇博客 非常经典 牛逼 的贪心思路: 考虑每次加入一个数,位置 i i i 的贡献为 V i = k i × a i + b i V_i=k_itimes a_i+b_i V i ​ = k i ​ × a i ​ + b i ​ ,其中 k i k_i k i ​ 表示 i i i 以前被选的位置的个数, b i b_i b i ​ 表示 i i i 以后被选的数的

    2024年02月07日
    浏览(34)
  • 【学习笔记】CF1783G Weighed Tree Radius

    如果 w v ( u ) w_v(u) w v ​ ( u ) 指代的就是直径,或者说我们再添一项 a v a_v a v ​ ,那么我们几乎就做完了。 于是自然而然想到换一个定义: d ( u , v ) = dist ( u , v ) + a u + a v d(u,v)=text{dist}(u,v)+a_u+a_v d ( u , v ) = dist ( u , v ) + a u ​ + a v ​ 。 发现这样转化过后,设直径的两个端点

    2024年02月16日
    浏览(35)
  • 【简单图论】CF898 div4 H

    Problem - H - Codeforces 题意: 思路: 手玩一下样例就能发现简单结论: v 离它所在的树枝的根的距离 m 离这个根的距离时是 YES 否则就是NO 实现就很简单,先去树上找环,然后找出这个根,分别给a 和 b BFS一遍,得出两个dis数组,比较一下即可 对于只有的环情况 和 m = v 的情况需

    2024年02月07日
    浏览(48)
  • 【学习笔记】CF576D Flights for Regular Customers

    不同于传统的最短路,当我们走到一个节点的时候,还要记录此时经过的边数才能完成转移。但是第二维太大了,太抽象了! 看到 m m m 这么小,很难不想到离散化。那么设 f i , j f_{i,j} f i , j ​ 表示当第 i i i 条边出现时,在节点 j j j 是否可行,注意这是 01 01 01 状态。转移非

    2024年02月12日
    浏览(30)
  • 【学习笔记】CF582D Number of Binominal Coefficients

    注意 P P P 事实上不会影响复杂度,因为关于组合数,我们有一个非常经典的结论: ( n + m m ) binom{n+m}{m} ( m n + m ​ ) 包含的 P P P 的幂的次数等于 n n n 和 m m m 在 P P P 进制下做加法的进位次数。这样,我们只需要关心进位的次数,而不必知道每一位具体是多少。 这个结论的证

    2024年02月12日
    浏览(29)
  • CF1120 D. Power Tree 巧妙的图论转化

    传送门 [前题提要]:无 题目描述: 考虑对一个点的子树的所有 叶子节点 进行增减任意值.不难联想到对一个点的子树的 所有节点 增减任意值的做法.所以考虑使用类似于树链剖分的方式将树上修改化为链上区间修改. 考虑记录一个点的所有叶子节点,并且按照 d f s dfs df s 序将其

    2024年02月10日
    浏览(40)
  • 【图论经典题目讲解】CF715B - Complete The Graph

    D e s c r i p t i o n mathrm{Description} Description 给定一张 n n n 个点, m m m 条边的无向图,点的编号为 0 ∼ n − 1 0sim n-1 0 ∼ n − 1 ,对于每条边权为 0 0 0 的边赋一个不超过 1 0 18 10^{18} 1 0 18 的 正整数 权值,使得 S S S 到 T T T 的最短路长度为 L L L 。 S o l u t i o n mathrm{Solution} Solut

    2024年02月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包