結果
問題 | No.753 最強王者決定戦 |
ユーザー |
![]() |
提出日時 | 2018-11-20 21:18:02 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 34 ms / 1,000 ms |
コード長 | 2,103 bytes |
コンパイル時間 | 960 ms |
コンパイル使用メモリ | 84,912 KB |
実行使用メモリ | 15,360 KB |
最終ジャッジ日時 | 2024-12-24 15:49:28 |
合計ジャッジ時間 | 1,605 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 4 |
ソースコード
#include <iostream> #include<vector> #include<string.h> #include<bitset> #include<set> using namespace std; int data[17][17]; const int LIMIT=16; long long int dp[70000][16]; vector<long long int> seed[17]; vector<long long int> perm[70000]; int isV(int p1,int p2){ if(p1>p2){ std::swap(p1,p2); } if(data[p1][p2]==1)return p1; return p2; } int main(){ memset(dp,0,sizeof(dp)); for(int i=0;i<LIMIT;i++){ for(int j=0;j<LIMIT;j++){ scanf("%d",&data[i][j]); } } vector<long long int> vec[17]; for(int i=1;i<=65535;i++){ bitset<16> b1(i); int t=b1.count(); if(t==2||t==4||t==8){ if((t<8)||((t==8)&&((i&1)==1))){ seed[b1.count()].push_back(i); } for(int j=0;j<16;j++){ if((i&(1<<j))!=0){ perm[i].push_back(j); } } } } for(int i=0;i<LIMIT;i++){ for(int j=i+1;j<LIMIT;j++){ dp[(1<<i)|(1<<j)][isV(i,j)]=2; } } set<int> ss4[17]; vector<int> vs4[17]; for(int i=0;i<seed[2].size();i++){ for(int j=i+1;j<seed[2].size();j++){ int l=seed[2][i]; int r=seed[2][j]; if((l&r)==0){ for(int x=0;x<2;x++){ for(int y=0;y<2;y++){ int a=perm[l][x]; int b=perm[r][y]; int v=isV(a,b); int p1=l|r; dp[p1][v]+=(dp[l][a]*dp[r][b])*2; if(dp[p1][v]>0){ ss4[v].insert(p1); } } } } } } for(int i=0;i<16;i++){ for(set<int>::iterator it=ss4[i].begin();it!=ss4[i].end();it++){ vs4[i].push_back((*it)); } } for(int a=0;a<16;a++){ for(int i=0;i<vs4[a].size();i++){ int l=vs4[a][i]; for(int b=a+1;b<16;b++){ if((l&(1<<b))!=0)continue; for(int j=0;j<vs4[b].size();j++){ int r=vs4[b][j]; if((l&r)==0){ int v=isV(a,b); dp[l|r][v]+=(dp[l][a]*dp[r][b])*2; } } } } } for(int i=0;i<seed[8].size();i++){ int l=seed[8][i]; int r=(~l)&(0xffff); for(int x=0;x<8;x++){ int a=perm[l][x]; if(dp[l][a]==0)continue; for(int y=0;y<8;y++){ int a=perm[l][x]; int b=perm[r][y]; int v=isV(a,b); dp[l|r][v]+=(dp[l][a]*dp[r][b])*2; } } } for(int i=0;i<16;i++){ cout<<dp[0xffff][i]<<"\n"; } }