結果

問題 No.1397 Analog Graffiti
ユーザー kotatsugamekotatsugame
提出日時 2021-02-15 05:26:32
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 8,281 ms / 10,000 ms
コード長 2,300 bytes
コンパイル時間 879 ms
コンパイル使用メモリ 73,672 KB
実行使用メモリ 179,156 KB
最終ジャッジ日時 2023-09-07 13:38:18
合計ジャッジ時間 65,600 ms
ジャッジサーバーID
(参考情報)
judge12 / judge11
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
4,384 KB
testcase_01 AC 5 ms
4,384 KB
testcase_02 AC 8,198 ms
179,156 KB
testcase_03 AC 3 ms
4,384 KB
testcase_04 AC 5 ms
4,380 KB
testcase_05 AC 8,258 ms
179,156 KB
testcase_06 AC 3 ms
4,380 KB
testcase_07 AC 2 ms
4,384 KB
testcase_08 AC 4 ms
4,380 KB
testcase_09 AC 17 ms
4,384 KB
testcase_10 AC 31 ms
4,380 KB
testcase_11 AC 8,260 ms
175,404 KB
testcase_12 AC 1,419 ms
48,716 KB
testcase_13 AC 8,125 ms
171,412 KB
testcase_14 AC 8,281 ms
172,324 KB
testcase_15 AC 32 ms
9,924 KB
testcase_16 AC 1,268 ms
46,136 KB
testcase_17 AC 7,555 ms
161,964 KB
testcase_18 AC 7,712 ms
165,028 KB
testcase_19 AC 170 ms
7,424 KB
testcase_20 AC 42 ms
4,656 KB
testcase_21 AC 87 ms
7,432 KB
testcase_22 AC 2,907 ms
65,824 KB
testcase_23 AC 146 ms
6,888 KB
testcase_24 AC 22 ms
4,380 KB
testcase_25 AC 466 ms
13,440 KB
testcase_26 AC 23 ms
4,384 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp:27:1: 警告: ISO C++ では型の無い ‘main’ の宣言を禁止しています [-Wreturn-type]
   27 | main()
      | ^~~~

ソースコード

diff #

#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;
}
0