提出 #48778652
ソースコード 拡げる
#include <bits/stdc++.h>
#define fst first
#define snd second
#define fore(i,a,b) for(int i=a,ThxDem=b;i<ThxDem;++i)
#define pb push_back
#define ALL(s) s.begin(),s.end()
#define FIN ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define SZ(s) int(s.size())
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
const int MAXN=1e6+10, MOD=998244353;
int add(int a, int b){a+=b;if(a>=MOD)a-=MOD;return a;}
int sub(int a, int b){a-=b;if(a<0)a+=MOD;return a;}
int mul(ll a, ll b){return a*b%MOD;}
int fpow(int a, ll b){
int r=1;
while(b){if(b&1)r=mul(r,a); b>>=1; a=mul(a,a);}
return r;
}
vector<int> g[MAXN];
struct edge {int u,v,comp;bool bridge;};
vector<edge> e;
void add_edge(int u, int v){
g[u].pb(e.size());g[v].pb(e.size());
e.pb((edge){u,v,-1,false});
}
int D[MAXN],B[MAXN],T;
int nbc; // number of biconnected components
int art[MAXN]; // articulation point iff !=0
stack<int> st; // only for biconnected
void dfs(int u,int pe){
B[u]=D[u]=T++;
for(int ne:g[u])if(ne!=pe){
int v=e[ne].u^e[ne].v^u;
if(D[v]<0){
st.push(ne);dfs(v,ne);
if(B[v]>D[u])e[ne].bridge = true; // bridge
if(B[v]>=D[u]){
art[u]++; // articulation
int last; // start biconnected
do {
last=st.top();st.pop();
e[last].comp=nbc;
} while(last!=ne);
nbc++; // end biconnected
}
B[u]=min(B[u],B[v]);
}
else if(D[v]<D[u])st.push(ne),B[u]=min(B[u],D[v]);
}
}
void doit(int n){
memset(D,-1,sizeof(D));memset(art,0,sizeof(art));
nbc=T=0;
fore(i,0,n)if(D[i]<0)dfs(i,-1),art[i]--;
}
vector<ii> mov={{1,0},{0,1},{-1,0},{0,-1}};
string s[MAXN];
int p[MAXN];
int find(int x){return p[x]=p[x]==x?x:find(p[x]);}
void join(int x, int y){p[find(x)]=find(y);}
int main(){FIN;
int n,m; cin>>n>>m;
fore(i,0,n) cin>>s[i];
fore(i,0,n*m) p[i]=i;
fore(i,0,n) fore(j,0,m) if(s[i][j]=='#'){
for(auto dir:mov){
int x=i+dir.fst, y=j+dir.snd;
if(x<0||y<0||x==n||y==m||s[x][y]!='#') continue;
ii me={i,j};
ii he={x,y};
if(me<he) add_edge(m*i+j,m*x+y);
join(m*i+j, m*x+y);
}
}
doit(n*m);
int all=0;
fore(i,0,n) fore(j,0,m) if(s[i][j]=='#'&&find(m*i+j)==m*i+j) all++;
int tot=0, sum=0;
fore(i,0,n) fore(j,0,m) if(s[i][j]=='.'){
set<int> ss;
for(auto dir:mov){
int x=i+dir.fst, y=j+dir.snd;
if(x<0||y<0||x==n||y==m||s[x][y]!='#') continue;
ss.insert(find(m*x+y));
}
tot++;
int now=all+1;
if(SZ(ss)){
now=all-(SZ(ss)-1);
}
sum=add(sum, now);
}
int ans=mul(sum, fpow(tot,MOD-2));
cout<<ans<<"\n";
}
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
450 / 450 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample00.txt, sample01.txt, sample02.txt |
| All |
sample00.txt, sample01.txt, sample02.txt, testcase00.txt, testcase01.txt, testcase02.txt, testcase03.txt, testcase04.txt, testcase05.txt, testcase06.txt, testcase07.txt, testcase08.txt, testcase09.txt, testcase10.txt, testcase11.txt, testcase12.txt, testcase13.txt, testcase14.txt, testcase15.txt, testcase16.txt, testcase17.txt, testcase18.txt, testcase19.txt, testcase20.txt, testcase21.txt, testcase22.txt, testcase23.txt, testcase24.txt, testcase25.txt, testcase26.txt, testcase27.txt, testcase28.txt, testcase29.txt, testcase30.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| sample00.txt |
AC |
19 ms |
42568 KiB |
| sample01.txt |
AC |
20 ms |
42592 KiB |
| sample02.txt |
AC |
20 ms |
42472 KiB |
| testcase00.txt |
AC |
66 ms |
50308 KiB |
| testcase01.txt |
AC |
73 ms |
51348 KiB |
| testcase02.txt |
AC |
379 ms |
247616 KiB |
| testcase03.txt |
AC |
391 ms |
254596 KiB |
| testcase04.txt |
AC |
103 ms |
128388 KiB |
| testcase05.txt |
AC |
119 ms |
144932 KiB |
| testcase06.txt |
AC |
36 ms |
51696 KiB |
| testcase07.txt |
AC |
38 ms |
52748 KiB |
| testcase08.txt |
AC |
43 ms |
58904 KiB |
| testcase09.txt |
AC |
45 ms |
59724 KiB |
| testcase10.txt |
AC |
55 ms |
70620 KiB |
| testcase11.txt |
AC |
58 ms |
72764 KiB |
| testcase12.txt |
AC |
67 ms |
74728 KiB |
| testcase13.txt |
AC |
69 ms |
76296 KiB |
| testcase14.txt |
AC |
80 ms |
76832 KiB |
| testcase15.txt |
AC |
82 ms |
78524 KiB |
| testcase16.txt |
AC |
90 ms |
77384 KiB |
| testcase17.txt |
AC |
99 ms |
81380 KiB |
| testcase18.txt |
AC |
108 ms |
80360 KiB |
| testcase19.txt |
AC |
113 ms |
84372 KiB |
| testcase20.txt |
AC |
142 ms |
88912 KiB |
| testcase21.txt |
AC |
144 ms |
90328 KiB |
| testcase22.txt |
AC |
164 ms |
92668 KiB |
| testcase23.txt |
AC |
184 ms |
96784 KiB |
| testcase24.txt |
AC |
201 ms |
102676 KiB |
| testcase25.txt |
AC |
220 ms |
109112 KiB |
| testcase26.txt |
AC |
269 ms |
147188 KiB |
| testcase27.txt |
AC |
273 ms |
149096 KiB |
| testcase28.txt |
AC |
291 ms |
170392 KiB |
| testcase29.txt |
AC |
322 ms |
183148 KiB |
| testcase30.txt |
AC |
35 ms |
51416 KiB |