求助,OI新手,80分
查看原帖
求助,OI新手,80分
544446
Demon_master楼主2021/11/26 21:29
#include<bits/stdc++.h>
using namespace std;
const long long maxn=6e5+34,MOD=1e9+7;
long long n,m;
struct E{
	long long f,t,n;
}edge[maxn];
long long l,head[maxn],mon[maxn];

long long tme,low[maxn],dfn[maxn],vis[maxn],mion[maxn],cnt[maxn];
stack<long long> p;
long long tot,belong[maxn];

void tarjan(long long s){
	low[s]=dfn[s]=++tme;
	vis[s]=1;
	p.push(s);
	for(long long i=head[s];i;i=edge[i].n){
		long long t=edge[i].t;
		if(vis[t]==-1) continue;
		if(vis[t]==1) low[s]=min(low[s],dfn[t]);
		if(vis[t]==0){
			tarjan(t);
			low[s]=min(low[s],low[t]);
		}
	}
	if(low[s]==dfn[s]){
		tot++;
		cnt[tot]=1;
		while(1){
			long long q=p.top();
			p.pop();
			belong[q]=tot;
			vis[q]=-1;
//			cnt[tot]++;
//			mion[tot]=min(mion[tot],mon[q]);
			if(mion[tot]>mon[q]){
				mion[tot]=mon[q];
				cnt[tot]=1;
			}
			else if(mion[tot]==mon[q]) cnt[tot]++;
			if(q==s) break;
		}
	}
} 

//void dp(long long )


void read(){
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++) scanf("%lld",&mon[i]),mion[i]=1e9;
	scanf("%lld",&m);
	for(long long i=1;i<=m;i++){
		long long f,t;
		scanf("%lld%lld",&f,&t);
		l++,edge[l]=(E){f,t,head[f]},head[f]=l;
	}
	for(long long i=1;i<=n;i++){
		if(vis[i]==0) tarjan(i);
	}
	long long ans_1=0,ans_2=1;
	for(long long i=1;i<=tot;i++){
		ans_1+=mion[i];
		ans_2*=cnt[tot];
		ans_2%=MOD;
	}
	cout<<ans_1<<" "<<ans_2;
}

int main (){
	read();
}

2021/11/26 21:29
加载中...