結果
問題 | No.1397 Analog Graffiti |
ユーザー | kotatsugame |
提出日時 | 2021-02-15 05:26:32 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 9,712 ms / 10,000 ms |
コード長 | 2,300 bytes |
コンパイル時間 | 3,188 ms |
コンパイル使用メモリ | 74,816 KB |
実行使用メモリ | 179,072 KB |
最終ジャッジ日時 | 2024-06-25 07:44:35 |
合計ジャッジ時間 | 75,007 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
6,812 KB |
testcase_01 | AC | 6 ms
6,940 KB |
testcase_02 | AC | 9,555 ms
179,072 KB |
testcase_03 | AC | 3 ms
6,940 KB |
testcase_04 | AC | 5 ms
6,944 KB |
testcase_05 | AC | 9,712 ms
179,072 KB |
testcase_06 | AC | 3 ms
6,940 KB |
testcase_07 | AC | 3 ms
6,940 KB |
testcase_08 | AC | 4 ms
6,940 KB |
testcase_09 | AC | 17 ms
6,940 KB |
testcase_10 | AC | 31 ms
6,940 KB |
testcase_11 | AC | 9,469 ms
175,232 KB |
testcase_12 | AC | 1,472 ms
48,640 KB |
testcase_13 | AC | 9,179 ms
171,392 KB |
testcase_14 | AC | 9,201 ms
172,288 KB |
testcase_15 | AC | 33 ms
9,984 KB |
testcase_16 | AC | 1,384 ms
46,080 KB |
testcase_17 | AC | 8,661 ms
161,920 KB |
testcase_18 | AC | 8,737 ms
165,120 KB |
testcase_19 | AC | 189 ms
7,296 KB |
testcase_20 | AC | 47 ms
6,944 KB |
testcase_21 | AC | 95 ms
7,168 KB |
testcase_22 | AC | 3,304 ms
65,792 KB |
testcase_23 | AC | 162 ms
6,940 KB |
testcase_24 | AC | 25 ms
6,940 KB |
testcase_25 | AC | 526 ms
13,440 KB |
testcase_26 | AC | 25 ms
6,940 KB |
コンパイルメッセージ
main.cpp:27:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type] 27 | main() | ^~~~
ソースコード
#include<iostream> using namespace std; const long mod=998244353; const int C=6; int R,rC,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>>rC>>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<<rC;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; }