結果
問題 | No.1397 Analog Graffiti |
ユーザー |
|
提出日時 | 2021-02-15 05:21:29 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,282 bytes |
コンパイル時間 | 908 ms |
コンパイル使用メモリ | 73,540 KB |
実行使用メモリ | 179,328 KB |
最終ジャッジ日時 | 2024-11-20 11:26:17 |
合計ジャッジ時間 | 77,594 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 TLE * 1 |
other | AC * 22 TLE * 2 |
コンパイルメッセージ
main.cpp:26:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type] 26 | main() | ^~~~
ソースコード
#include<iostream>using namespace std;const long mod=998244353;int R,C,N;long dp[55][51][46656];int ufpr[20],ufsz[20];inline int find(int u){return ufpr[u]!=u?ufpr[u]=find(ufpr[u]):u;}inline void unite(int a,int b){a=find(a),b=find(b);if(a!=b){if(ufsz[a]<ufsz[b]){ufpr[a]=b;ufsz[b]+=ufsz[a];}else{ufpr[b]=a;ufsz[a]+=ufsz[b];}}}int v[2][6],pr[2][6],mp[18];main(){cin>>R>>C>>N;int LIM=1;for(int i=0;i<C;i++)LIM*=6;dp[0][0][0]=1;long ans=0;for(int i=0;i<=R;i++){for(int j=0;j<N;j+=2)for(int k=0;k<LIM;k++)if(dp[i][j][k]!=0){int t[6],kl=0;{int u=k;for(int l=0;l<C;l++){t[l]=u%6;kl|=(t[l]>=3)<<l;u/=6;}}for(int l=0;l<1<<C;l++){int nl=kl^l;int nj=j+__builtin_popcount(nl^nl<<1);if(nj>N)continue;for(int m=0;m<C;m++){v[0][m]=t[m];v[1][m]=l>>m&1?3:1;}for(int m=0;m<18;m++)ufpr[m]=m,ufsz[m]=1,mp[m]=0;if(v[1][0]==1)v[1][0]=0,unite(C,2*C);if(v[1][C-1]==1)v[1][C-1]=0,unite(2*C-1,2*C);for(int m=0;m<C;m++){if(!(nl>>m&1))unite(m,C+m);if(m+1<C&&(l>>m&1)==(l>>m+1&1))unite(C+m,C+m+1);unite(m,2*C+v[0][m]);}for(int id=0;id<2;id++)for(int m=0;m<C;m++)pr[id][m]=find(id*C+m);mp[find(2*C)]=-1;int sz=2,tsz=0;for(int id=0;id<2;id++)for(int m=0;m<C;m++){int t=pr[id][m];if(v[id][m]>=3){if(mp[t]==0)mp[t]=++sz;}else{if(v[id][m]>0&&mp[t]==0)mp[t]=++tsz;}}if(sz>=6||tsz>=3)continue;for(int id=0;id<2;id++)for(int m=0;m<C;m++){int t=pr[id][m];if(mp[t]==-1)v[id][m]=0;else v[id][m]=mp[t];}if(l>0){bool out=false;for(int m=0;m<C;m++)mp[pr[1][m]]=-3;mp[find(2*C)]=-3;for(int m=0;m<C;m++){if(mp[pr[0][m]]!=-3){out=true;break;}}if(out)continue;}int nxt=0;for(int m=C;m--;)nxt=nxt*6+v[1][m];if(k>0&&nxt==0){if(nj==N&&sz==3){ans+=dp[i][j][k];if(ans>=mod)ans-=mod;}}else if(i<R){dp[i+1][nj][nxt]+=dp[i][j][k];if(dp[i+1][nj][nxt]>=mod)dp[i+1][nj][nxt]-=mod;}}}}cout<<ans<<endl;}