結果
問題 | No.1397 Analog Graffiti |
ユーザー | kotatsugame |
提出日時 | 2021-02-15 05:16:43 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,289 bytes |
コンパイル時間 | 811 ms |
コンパイル使用メモリ | 73,376 KB |
実行使用メモリ | 182,784 KB |
最終ジャッジ日時 | 2024-11-08 19:05:06 |
合計ジャッジ時間 | 12,547 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 3 ms
5,248 KB |
testcase_02 | TLE | - |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 3 ms
5,248 KB |
testcase_05 | TLE | - |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 3 ms
5,248 KB |
testcase_08 | AC | 5 ms
5,248 KB |
testcase_09 | AC | 3 ms
5,248 KB |
testcase_10 | AC | 3 ms
5,248 KB |
testcase_11 | TLE | - |
testcase_12 | AC | 1,341 ms
48,896 KB |
testcase_13 | TLE | - |
testcase_14 | TLE | - |
testcase_15 | AC | 47 ms
9,984 KB |
testcase_16 | AC | 1,251 ms
46,336 KB |
testcase_17 | AC | 9,525 ms
162,688 KB |
testcase_18 | AC | 9,680 ms
165,504 KB |
testcase_19 | AC | 12 ms
8,064 KB |
testcase_20 | AC | 6 ms
5,248 KB |
testcase_21 | AC | 38 ms
7,424 KB |
testcase_22 | AC | 3,657 ms
65,920 KB |
testcase_23 | AC | 170 ms
6,656 KB |
testcase_24 | AC | 3 ms
5,248 KB |
testcase_25 | AC | 572 ms
13,568 KB |
testcase_26 | AC | 4 ms
5,248 KB |
コンパイルメッセージ
main.cpp:25:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type] 25 | 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]; } } } 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|=(u%6>=3)<<l; u/=6; } } for(int l=0;l<1<<C;l++) { int v[2][6],nl=kl^l; 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; 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]); } int pr[2][6]; for(int id=0;id<2;id++)for(int m=0;m<C;m++)pr[id][m]=find(id*C+m); int mp[18]={}; 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 nj=j+__builtin_popcount(nl^nl<<1); if(nj>N)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; }