Submission #536

#TimeUsernameProblemLanguageResultExecution timeMemory
536kriii지도 색칠하기 (GA3_map)C++98
120 / 120
1222 ms22212 KiB
#include <queue> #include <vector> using namespace std; vector<int> U; int S[2][1<<20],con[20],go[1<<20]; long long mul[1<<20]; long long pos(int v) { int c = -1; while (v){ v /= 2; c++; } return c; } long long NumberOfMaps (int N, int M, int *A, int *B) { long long ret = 0; int i,j,u,x; for (i=0;i<M;i++){ A[i]--; B[i]--; con[A[i]] |= 1 << B[i]; con[B[i]] |= 1 << A[i]; } for (i=1;i<(1<<N);i++){ if (i == (i & (-i))) go[i] = con[pos(i)]; else{ x = i & (-i); go[i] = go[x] | go[i-x]; } } mul[0] = 1; queue<int> Q; for (i=0;i<N;i++){ Q.push(1<<i); S[0][1<<i] = 1<<i; mul[1<<i] = 2; } while (!Q.empty()){ x = Q.front(); Q.pop(); int can = go[x] & (~x); while (can){ int now = (can & (-can)); u = x + (can & (-can)); can -= can & (-can); if ((S[0][x] & go[now]) && (S[1][x] & go[now])) continue; if (mul[u] == 0){ Q.push(u); mul[u] = 2; S[0][u] = S[0][x]; S[1][u] = S[1][x]; if ((S[1][x] & go[now])) S[0][u] |= now; else S[1][u] |= now; } } } for (i=0;i<(1<<N);i++) if (mul[i] == 0){ Q.push(i&(-i)); int chk = i&(-i); while (!Q.empty()){ x = Q.front(); Q.pop(); int can = go[x]; while (can){ int now = (can & (-can)); if ((i & now) && (chk & now) == 0){ Q.push(now); chk |= now; } can -= now; } } if (mul[chk] && mul[i-chk]){ mul[i] = mul[chk] * mul[i-chk]; } } for (i=0;i<(1<<N);i++){ j = (1<<N)-1 - i; ret += mul[i] * mul[j]; } return ret; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...