#1#2#8#9 WA,求解...
查看原帖
#1#2#8#9 WA,求解...
109222
一啦啦啦一楼主2020/10/20 10:50
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N=5e5+10;
int n,m,num,p[N],p2[N],s[N];
int head[N*3],to[N*3],next[N*3],tot;
int dfn[N],low[N],stack[N],co[N],cnt,top;
bool vst[N];
vector<int> scc[N];

void add(int u,int v)
{
	next[++tot]=head[u];
	head[u]=tot;
	to[tot]=v;
}

void tarjan(int u)
{
	dfn[u]=low[u]=++num;
	stack[++top]=u;vst[u]=1;
	for(int i=head[u];i;i=next[i])
	{
		int v=to[i];
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vst[v]) low[u]=(low[u],dfn[v]);
	}
	if(low[u]==dfn[u])
	{
		++cnt;int v;
		do{
			v=stack[top--];vst[v]=0;
			co[v]=cnt;scc[cnt].push_back(v);
//			if(p2[cnt]==p[v]) s[cnt]++;
//			else if(p2[cnt]>p[v]) p2[cnt]=p[v],s[cnt]=1;
		}while(u!=v);
	}
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>p[i];
	memset(p2,0x3f3f3f3f,sizeof(p2));
	memset(s,1,sizeof(s));
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	for(int i=1;i<=n;i++)
	 if(!dfn[i]) tarjan(i);
	long long ans1=0,ans2=1;
	for(int i=1;i<=cnt;i++)
	{
		int sum=1,o=0x3f3f3f3f;
		for(int j=0;j<scc[i].size();j++)
		{
			if(p[scc[i][j]]==o) sum++;
			if(p[scc[i][j]]<o) o=p[scc[i][j]],sum=1;
		}
		ans1+=o;
		ans2=(ans2*sum)%1000000007;
	}
	cout<<ans1<<" "<<ans2<<endl;
	return 0;
}
2020/10/20 10:50
加载中...