60分求助
查看原帖
60分求助
205782
R浩轩泽Anmicius楼主2020/8/4 10:22

在这道题上遇到了神奇的UKE......

BUG or FEATURE?

重新提交后WA了4个点

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
const int N=500005;
const int E=500005;
const int mod=1e9+7;
int n,m,num,head[N],val[N],dfn[N],low[N],sta[N],visn,stan,sta_min[N],min_num[N],ans1,ans2;
stack<int>s;
#define reint register int
struct Edge{
	int to;
	int next;
}edge[E];
inline void AddEdge(int x,int y)
{
	edge[++num].to=y;
	edge[num].next=head[x];
	head[x]=num;
}
void Tarjan(int u)
{
	dfn[u]=low[u]=++visn; 
	s.push(u);
	for(signed i=head[u];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if(!dfn[v])
		{
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(!sta[v]) 
		low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		sta[u]=++stan;
		sta_min[u]=val[u];
		while(s.top()!=u)
		{
			sta[s.top()]=stan;
			if(sta_min[stan]>val[s.top()])
			{
				sta_min[stan]=val[s.top()];
				min_num[stan]=0;
			}	
			if(sta_min[stan]==val[s.top()])++min_num[stan];
			s.pop();
		}
		s.pop();
	}
}
inline void starts()
{
	memset(head,0,sizeof(head));
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	memset(sta,0,sizeof(sta));
	for(reint i=1;i<=n;++i)min_num[i]=1;//memset 1 会炸 
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	for(reint i=1;i<=n;++i)cin>>val[i];
	cin>>m;
	starts();
	for(reint i=1;i<=m;++i)
	{
		int x,y;
		cin>>x>>y;
		AddEdge(x,y);
	}
	ans2=1;
	for(reint i=1;i<=n;++i)
	if(!dfn[i])Tarjan(i);
	for(reint i=1;i<=stan;++i)
	{
		ans1+=sta_min[i];
		ans1%=mod;
		ans2*=(min_num[i]%mod);
		ans2%=mod;
	}
	cout<<ans1<<' '<<ans2;
	return 0;
} 

第一次用memset(min_num,1,sizeof(min_num))的时候全WA掉了,后来改了

2020/8/4 10:22
加载中...