abcG题还没有调出来RE求助,大家帮帮我吧
  • 板块学术版
  • 楼主ahumannickname
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/23 22:43
  • 上次更新2023/12/24 10:17:05
查看原帖
abcG题还没有调出来RE求助,大家帮帮我吧
676598
ahumannickname楼主2023/12/23 22:43

以下是我的代码:

#include<iostream>
#include<vector>
using namespace std;
char c[1005][1005];
//long long
long long mod=998244353;
long long m,n;
vector<long long>d[1000005];
vector<long long>e[1000005];
long long dfn[1000005];
long long low[1000005];
long long cnt2=0;
long long cu=0;
long long st[1000005];
long long top=0;
long long fpow(long long a,long long b)
{
	if(b==0)
	{
		return 1;
	}
	long long tmp=fpow(a,b/2);
	long long fans=(tmp*tmp)%mod;
	if(b%2==0)
	{
		return fans;
	}
	else
	{
		return (fans*a)%mod;
	}
}
long long srh(long long x)
{
	low[x]=++cnt2;
	dfn[x]=cnt2;
	st[++top]=x;
	for(long long i=0;i<e[x].size();i++)
	{
		if(dfn[e[x][i]]==0)
		{
			low[x]=min(low[x],srh(e[x][i]));
			if(low[e[x][i]]>=dfn[x]) 
			{
				vector<int>ans;
				ans.push_back(x);
				d[x].push_back(++cu);
				while(true) 
				{
					ans.push_back(st[top]);
					d[st[top]].push_back(cu);
					if(st[top--]==e[x][i])
					{
						break;
					}
				} 
			}
		}
		else 
		{
			low[x]=min(low[x],dfn[e[x][i]]); 
		}
	}
	return low[x];
}
int main()
{
    cin>>m>>n;
    long long ans=0;
    long long cnt=0;
    long long cur=0;
    for(long long i=1;i<=m;i++)
    {
    	for(long long j=1;j<=n;j++)
    	{
    		cin>>c[i][j];
    		dfn[i*n+j]=0;
    		if(c[i][j]=='#')
    		{
    			cnt++;
			}
		}
	}
	for(long long i=1;i<=m;i++)
    {
    	for(long long j=1;j<=n;j++)
    	{
			if(c[i][j]=='#')
    		{
    			long long w=0,x=0,y=0,z=0;
    			if(j>=2&&c[i][j-1]=='#')
	    		{
	    			e[i*n+j].push_back(i*n+j-1);
				}
				if(i>=2&&c[i-1][j]=='#')
				{
					e[i*n+j].push_back(i*n+j-n);
				}
				if(j<=n-1&&c[i][j+1]=='#')
	    		{
	    			e[i*n+j].push_back(i*n+j+1);
				}
				if(i<=m-1&&c[i+1][j]=='#')
				{
					e[i*n+j].push_back(i*n+j+n);
				}
			}
		}
	}
	for(long long i=1;i<=m;i++)
    {
    	for(long long j=1;j<=n;j++)
    	{
    		if(dfn[i*n+j]==0&&c[i][j]=='#')
    		{
    			ans++;
    			srh(i*n+j);
			}
		}
	}
	ans=(ans*cnt)%mod;
	for(long long i=1;i<=m;i++)
    {
    	for(long long j=1;j<=n;j++)
    	{
    		if(c[i][j]=='#')
    		{
    			vector<long long>w,x,y,z;
    			if(j>=2&&c[i][j-1]=='#')
	    		{
	    			w=d[i*n+j-1];
				}
				if(i>=2&&c[i-1][j]=='#')
				{
					x=d[i*n+j-n];
				}
				if(j<=n-1&&c[i][j+1]=='#')
	    		{
	    			y=d[i*n+j+1];
				}
				if(i<=m-1&&c[i+1][j]=='#')
				{
					z=d[i*n+j+n];
				}
				if(w.size()>0)
				{
					ans++;
				}
				if(x.size()>0)
				{
					bool flag=true;
					for(long long p=0;p<w.size();p++)
					{
						for(long long q=0;q<x.size();q++)
						{
							if(w[p]==x[q])
							{
								flag=false;
							}
						}
					}
					if(flag)
					{
						ans++;
					}
				}
				if(y.size()>0)
				{
					bool flag=true;
					for(long long p=0;p<w.size();p++)
					{
						for(long long q=0;q<y.size();q++)
						{
							if(w[p]==y[q])
							{
								flag=false;
							}
						}
					}
					for(long long p=0;p<x.size();p++)
					{
						for(long long q=0;q<y.size();q++)
						{
							if(x[p]==y[q])
							{
								flag=false;
							}
						}
					}
					if(flag)
					{
						ans++;
					}
				}
				if(z.size()>0)
				{
					bool flag=true;
					for(long long p=0;p<w.size();p++)
					{
						for(long long q=0;q<z.size();q++)
						{
							if(w[p]==z[q])
							{
								flag=false;
							}
						}
					}
					for(long long p=0;p<x.size();p++)
					{
						for(long long q=0;q<z.size();q++)
						{
							if(x[p]==z[q])
							{
								flag=false;
							}
						}
					}
					for(long long p=0;p<y.size();p++)
					{
						for(long long q=0;q<z.size();q++)
						{
							if(y[p]==z[q])
							{
								flag=false;
							}
						}
					}
					if(flag)
					{
						ans++;
					}
				}
				ans--;
			}
		}
	}
	ans=ans%mod;
	cout<<(ans*fpow(cnt,mod-2))%mod<<endl;
    return 0;
}

好心人悬赏关注,希望你能帮我发现错误,样例都过了!!!

2023/12/23 22:43
加载中...