P5676 [GZOI2017]小z玩游戏(tarjan+虚点优化建图)

news/2024/7/8 6:54:02

LINK

若存在 w [ v ] % e [ u ] = = 0 w[v]\%e[u]==0 w[v]%e[u]==0

说明玩完游戏 u u u马上可以玩游戏 v v v,我们连上一条 u u u v v v的边

那么游戏能玩两次以上相当于在这个有向图中处于一个环,可以玩无限多次

直接上 t a r j a n tarjan tarjan找环即可

但是这样连边是 O ( n 2 ) O(n^2) O(n2)的,需要优化

我们建立一排虚点,分别表示数字 [ 1 , 100000 ] [1,100000] [1,100000]

我们让游戏 i i i向数字 e [ i ] e[i] e[i]连边,数字 w [ i ] w[i] w[i] i i i连边

然后对于数字 v v v向所有是 v v v的倍数的数连边

这样如果存在 w [ v ] % e [ u ] = = 0 w[v]\%e[u]==0 w[v]%e[u]==0

路径上是 u u u到数字 e [ u ] e[u] e[u],再到数字 w [ v ] w[v] w[v],数字 w [ v ] w[v] w[v] v v v

在这个图上找环就好了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e7+10;
const int base = 100001;
struct edge{
	int to,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v){ d[++cnt] = ( edge ){v,head[u]},head[u] = cnt; }
int low[maxn],dfn[maxn],vis[maxn],stac[maxn],top,id,scc,sd[maxn],num[maxn];
int n,w[maxn],e[maxn];
void tarjan(int u)
{
	dfn[u] = low[u] = ++id; stac[++top] = u; vis[u] = 1;
	for(int i=head[u];i;i=d[i].nxt )
	{
		int v = d[i].to;
		if( !dfn[v] )
		{
			tarjan(v);
			low[u] = min( low[u],low[v] );
		}
		else if( vis[v] )	low[u] = min( low[u],low[v] );
	}
	if( dfn[u]!=low[u] )	return;
	int temp; ++scc;
	while( temp = stac[top--] )
	{
		num[scc]++; sd[temp] = scc; vis[temp] = 0;
		if( temp==u )	break;
	}
}
int main()
{
	int t; cin >> t;
	while( t-- )
	{
		cin >> n;
		for(int i=1;i<=n;i++)	cin >> w[i];
		for(int i=1;i<=n;i++)	cin >> e[i];
		
		for(int i=1;i<=100000;i++)
		for(int j=i+i;j<=100000;j+=i)
			add(i+n,j+n);	
			
		for(int i=1;i<=n;i++)
			add(i,n+e[i]), add( n+w[i],i );
		for(int i=1;i<=n;i++)	if( !dfn[i] )	tarjan(i);
		int ans = 0;
		for(int i=1;i<=n;i++)
			if( num[sd[i]]>=2 || w[i]%e[i]==0 )	ans++;

		cout << ans << endl;
		
		for(int i=1;i<=n+base;i++)	head[i] = num[i] = dfn[i] = low[i] = 0;
		scc = id = top = 0; cnt = 1;
	}
}

http://www.niftyadmin.cn/n/3620851.html

相关文章

『ACM C++』 Codeforces | 1003C - Intense Heat

今日兴趣新闻&#xff1a; NASA 研制最强推进器&#xff0c;加速度可达每秒 40 公里&#xff0c;飞火星全靠它 链接&#xff1a;https://mbd.baidu.com/newspage/data/landingsuper?context%7B"nid"%3A"news_11707429683828231737"%7D&n_type0&p_…

其实这是一种生活方式【转载】

转载自公众号&#xff1a;心里话 原题为&#xff1a;你为什么越过越穷这篇文章的确特别的心灵鸡汤&#xff0c;但是每个人都有自己中意的生活方式&#xff0c;谁也不能按照自己的生活标准来要求别人&#xff0c;相比而言&#xff0c;这一篇更像是在向人们展示另一种生活姿态&a…

HDU5294 Tricks Device(最大流+最短路)

题目链接 一个无向图&#xff0c;走最短路从起点走到终点&#xff0c;问最少需要删除多少边使得其不能从起点走到终点&#xff0c;问最多删除多少点使得其能走到终点。 思路&#xff1a; 最大流最短路 先求出所有在最短路上的边&#xff0c;对这些边重建图。将其权值改为1&…

P3119 [USACO15JAN]Grass Cownoisseur G(tarjan+dp)

LINK 先缩点,在DAGDAGDAG上跑最长路可以得到dis[v]dis[v]dis[v] 表示111号点的联通分量到vvv连通分量最多走多少草坪 当走到uuu点时使用反向机会走到点vvv,其中vvv一定是能到达点111所属的连通分量的 所以以111所在联通分量为起点,终点分别跑一次最长路 然后枚举那个中转点…

训练总结 18.7.18 暑假训练第三天

今日完成题量两道。 两道题&#xff0c;一道线段树&#xff0c;一道网络流。线段树那道题有点迷&#xff0c;RE了好几次&#xff0c;线段树一直都应用不大熟练。网络流今天刚补的知识点&#xff0c;勉强看懂&#xff0c;应用相当不熟练&#xff0c;今天的题目最大流最短路&…

CodeSmith 二、多模板按目录树批量自动生成代码

通过调用指定目录下的所有模板&#xff0c;逐一按照数据表生成独立的代码文件。支持多模板调用、支持所有数据表生成或批量指定多个生成、支持自动的文件目录结构、支持代码文件格式化命名等。 背景&#xff1a;最近一个新项目一高兴选了Mysql 8&#xff0…

康威定律-软件之道:软件开发争议问题剖析

每个架构师都应该研究下康威定律 http://36kr.com/p/5042735.html 软件之道:软件开发争议问题剖析((美)AndyOram) http://baike.baidu.com/view/11495670.htm

斯坦福机器学习视频笔记 Week4 Week5 神经网络 Neural Networks

神经网络是一种受大脑工作原理启发的模式。 它在许多应用中广泛使用&#xff1a;当您的手机解释并理解您的语音命令时&#xff0c;很可能是神经网络正在帮助理解您的语音; 当您兑现支票时&#xff0c;自动读取数字的机器也使用神经网络。 Non-linear Classification 当输入数据…