首页 > 其他分享 >ARC144E GCD of Path Weights

ARC144E GCD of Path Weights

时间:2023-11-21 09:48:48浏览次数:23  
标签:return GCD int auto self rev dfs ARC144E Weights

Description

给定 \(n\) 个点,\(m\) 条边的有向图,图中的任意一条有向边满足 边起点的编号小于边终点的编号。每个点有点权,但其中有些点的点权未知。

你需要找到一种给未知点权值的方案,使得 所有 \(1\to n\) 的路径点权和的最大公因数最大,或者告知答案可以无限大。输出这个最大值。

\(n,m\le 3\times 10^5\),保证存在一条从 \(1\) 到 \(n\) 的通路

Solution

Code

const int N=1e6+10;
int n,m,dis[N];
vector<int> dir[N],rev[N];
vector<pair<int,int> >G[N];
bool vdir[N],vrev[N],vis[N];
signed main(){
	n=read(); m=read();
	for(int i=1;i<=m;++i){
		int u=read(),v=read();
		dir[u].emplace_back(v);
		rev[v].emplace_back(u);
		G[u+n].emplace_back(v,0);
		G[v].emplace_back(u+n,0);
	}
	for(int i=1;i<=n;++i){
		int v=read();
		if(v==-1) continue;
		G[i].emplace_back(i+n,v);
		G[i+n].emplace_back(i,-v);
	}
	G[1].emplace_back(2*n,0);
	auto dir_dfs=[&](auto &&self,int x)->void{
		if(vdir[x]) return ;
		vdir[x]=1;
		for(auto t:dir[x]) self(self,t);
		return ;
	};
	auto rev_dfs=[&](auto &&self,int x)->void{
		if(vrev[x]) return ;
		vrev[x]=1;
		for(auto t:rev[x]) self(self,t);
		return ;
	};
	dir_dfs(dir_dfs,1);
	rev_dfs(rev_dfs,n);

	int ans=0;
	auto dfs=[&](auto &&self,int x)->void{
		if(vis[x]) return ;
		vis[x]=1;
		for(auto [t,w]:G[x]){
			int vv=t<=n?t:t-n;
			if(!(vdir[vv]&&vrev[vv])) continue;
			if(!vis[t]){
				dis[t]=dis[x]+w;
				self(self,t);	
			}else{
				ans=gcd(ans,abs(dis[t]-dis[x]-w));
			}
		}
		return ;
	};
	for(int i=1;i<=n;++i){
		if(!(vdir[i]&&vrev[i])) continue;
		if(!vis[i]) dfs(dfs,i);
		if(!vis[i+n]) dfs(dfs,i+n);
	}
	if(!ans) puts("-1");
	else print(ans);
	return 0;
}

标签:return,GCD,int,auto,self,rev,dfs,ARC144E,Weights
From: https://www.cnblogs.com/yspm/p/ARC144ESolution.html

相关文章

  • 牛客小白月赛81 F 小辰刚学gcd
    LInk首先我们可以注意到,两个数的gcd要不是它们当中较小的那一个要不是它本身。所以对于一个特定的\(r\),\(gcd_{i=p}^r,1<=p<=r\)来说,答案不会超过32种。并且因为gcd的性质,答案一定是成块且递减的。所以我们可以直接记录下对于每一个\(r\),答案都有哪些,从哪里开始出现。并......
  • CGCDSSQ
    妙蛙种子。CGCDSSQ首先,如果一个数\(x\)的因数\(y\)要么是自己,要么\(y\le\frac{x}{2}\)。假设\(y\neqx\),\(y>\frac{x}{2}\)。\[\frac{x}{y}<2,y|x,\frac{x}{y}=1,x=y\]矛盾。懒得写了,看题解就想起来了……......
  • ARC126C - Maximize GCD(取模转化减法)
    答案大于max{ai}可以直接计算主要考虑小于的情况直接计算gcd很困难,不妨枚举x|gcd那么对于ai来说假设x(k-1)<ai<=xk,那么ai就需要xk-ai次操作,那么我们对于一个x,只需枚举k计算区间数的个数即可算出需要的操作数。复杂度O(nlnn)这种套路就是取模转化成减法后,进行区间维护。#......
  • 洛谷 P2568 GCD
    题意:给定\(n\)求\(\displaystyle{\sum_{i=1}^n{\sum_{j=1}^n{\left[(i,j)\inprime\right]}}}\)其中\(prime\)为素数集合。\(n<10^7\)解:原式等于\[\displaystyle{\sum_{p\inprime}\sum_{i=1}^n{\sum_{j=1}^n{\left[(i,j)=p\right]}}}\]这等于\[\displa......
  • model.save() model. save_weights ()
     model.save_weights('./saved_models/8.h5') ===========================================================================model.save()保存了模型的图结构和模型的参数,保存模型的后缀是.hdf5。model.save_weights()只保存了模型的参数,并没有保存模型的图结构,保存模......
  • Madoka and The Best University (cf E)( 枚举一个其中一个元素,欧拉函数,gcd)
    #include<iostream>#include<cstring>usingnamespacestd;constintMaxn=1e7;intphi[Maxn];//记录数的约数个数(欧拉函数)boolvis[Maxn];//记录数字是否访问intprime[Maxn];//保存素数intmain(){memset(vis,false,sizeof(vis));memset(phi,0,sizeof(......
  • [ARC124C] LCM of GCDs 题解
    题面给定\(N\)个正整数对\((a_i,b_i)\)和两个初始为空的集合\(S,T\),你可以选择将每个数对的两个元素划分到两个不同的集合中。求\[\max\operatorname{lcm}(\gcd\limits_{x\inS}x,\gcd\limits_{y\inT}y)\](\(1\leN\le50,1\lea_i,b_i\le10^9\))。题解首先,......
  • GYM104090A Modulo Ruins the Legend - exgcd -
    题目链接:https://codeforces.com/gym/104090/problem/A题解:转化一下发现只需要求满足下式的解:\[ns+\dfrac{n\times(n+1)}{2}d\equivC(\bmodm)\]设\(a=n,b=\dfrac{n(n+1)}{2},p=gcd(a,b)\)即找到一组\((s',d',t')\)使得\(as'+bd'+mt'=C\)考虑\(a......
  • 基于值域的快速GCD
    这其实是一道洛谷模板题,题目是5435对预处理的讲解可以看看这个博客(代码看自己的,见下)voidgetprime(){ for(inti=0;i<=2;i++)fac[1][i]=1; for(inti=2;i<=N-10;i++) { if(!v[i]) { v[i]=i; prime[++tot]=i; fac[i][0]=fac[i][1]=1; fac[i][2]=i; } fo......
  • UOJ33 树上 GCD
    UOJ传送门设\(f_{u,i}\)为\(u\)子树内深度为\(i\)的点的个数,在\(\operatorname{LCA}\)处计算答案。但是时间复杂度无法接受。考虑长剖,计算答案只用枚举到轻链长,先对轻儿子做一遍\(\text{Dirichlet}\)后缀和,重儿子的信息直接继承上来。但是我们没法查询深度\(\bmod......