結果
問題 |
No.1963 Subset Mex
|
ユーザー |
![]() |
提出日時 | 2025-04-10 16:16:38 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 46 ms / 4,000 ms |
コード長 | 1,867 bytes |
コンパイル時間 | 2,345 ms |
コンパイル使用メモリ | 163,672 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-04-10 16:16:43 |
合計ジャッジ時間 | 4,446 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 26 |
ソースコード
#include<bits/stdc++.h> typedef long long ll; using namespace std; ll f[2][305][305],ans=1;//???j?,??k????? const ll mod=998244353; int n,cnt[305]; bool ck(int cur,int x,int y){ for(int i=cur-1;i;i--){ int nx=max(x,x*2-cnt[i]),ny=max(y,cnt[i]-x+y); x=nx,y=ny; } return x<=y; } int lim[305]; bool ck(int x,int y){return y>=lim[x];} int main(){ cin>>n; // n=300; for(int i=1;i<=n;i++){ int x;cin>>x; // x=i; cnt[max(x,1)]++; if(x==0||x==1)ans=0; } f[1][0][0]=1; for(int i=300;i;i--){ int now=(i&1),lst=now^1; int pos=0; for(int j=0;j<=300;j++){ while(pos<=300&&!ck(i,j,pos))pos++; lim[j]=pos; } if(i==1){ for(int j=0;j<=300;j++){ for(int k=0;k<=300;k++){ if(!f[lst][j][k])continue; f[lst][j][k]%=mod; if(!f[lst][j][k])continue; for(int x=0;x<=300;x++){ int jj=max(j,j*2+x-cnt[i]),kk=max(k,cnt[i]-j-x+k); if(jj>n)break; if(jj==0){ int nj=max(j,j*2+x+1-cnt[i]),nk=max(k,cnt[i]-j-x+k-1); if((nj==0||!ck(nj,nk))&&ck(jj+1,kk)){ ans=(ans+f[lst][j][k]*(x+2)); } } f[now][jj][kk]=(f[now][jj][kk]+f[lst][j][k]*(x+1)); if(jj>0&&x>0&&ck(jj,kk)){ ans=(ans+f[lst][j][k]*(x+1)); } } f[lst][j][k]=0; } } } else{ for(int j=0;j<=300;j++){ for(int k=0;k<=300;k++){ if(!f[lst][j][k])continue; f[lst][j][k]%=mod; if(!f[lst][j][k])continue; for(int x=0;x<=300;x++){ int jj=max(j,j*2+x-cnt[i]),kk=max(k,cnt[i]-j-x+k); if(!ck(jj,kk))break; if(jj==0){ int nj=max(j,j*2+x+1-cnt[i]),nk=max(k,cnt[i]-j-x+k-1); if((nj==0||!ck(nj,nk))&&ck(jj+1,kk)){ ans=(ans+f[lst][j][k]); } } f[now][jj][kk]=(f[now][jj][kk]+f[lst][j][k]); if(jj>0&&x>0)ans=(ans+f[lst][j][k]); } f[lst][j][k]=0; } } } ans%=mod; } cout<<ans; return 0; }