Submission #443940

#TimeUsernameProblemLanguageResultExecution timeMemory
443940ComPhyParkParachute rings (IOI12_rings)C++14
0 / 100
4057 ms207232 KiB
#include<cstdio> #include<vector> #include<set> using namespace std; const int SZ = 1000010; int min(int a, int b) { return a < b ? a : b; } int n; const bool ifDebug = false; int cycleNum; vector<vector<int>>l; typedef struct Graph { int st[4], ts[3]; int p[SZ], sz[SZ], cs[SZ][4], c[SZ]; int x; bool isMain; void init() { x = n; isMain = true; st[0] = ts[0] = n; st[1] = st[2] = st[3] = ts[1] = ts[2] = 0; for (int i = 0; i < n; i++) { p[i] = i; cs[i][0] = sz[i] = 1; cs[i][1] = cs[i][2] = cs[i][3] = 0; } } void init(int X) { isMain = false; init(); x = X; for (int i = 0; i < n; i++) { for (int e : l[i]) { if (e < i)Link(e, i); } } } int f(int a) { vector<int>v; while (a != p[a]) { v.push_back(a); a = p[a]; } for (int e : v)p[e] = a; return a; } void u(int A, int B) { int a = f(A), b = f(B); if (a != b) { p[b] = a; ts[gT(a)]--; ts[gT(b)]--; for (int i = 0; i < 4; i++) { cs[a][i] += cs[b][i]; } sz[a] += sz[b]; } else { ts[gT(a)]--; } } void Con(int A, int B) { int a = f(A); cs[a][min(c[A], 3)]--; st[min(c[A], 3)]--; if(isMain)l[A].push_back(B); c[A]++; cs[a][min(c[A], 3)]++; st[min(c[A], 3)]++; } int gT(int a) { if (cs[a][3]) { return 2; } else if (cs[a][2] && (cs[a][1] + cs[a][0] == 0)) { return 1; } else { return 0; } } void Link(int A, int B) { if (A == x || B == x)return; u(A, B); Con(A, B); Con(B, A); int a = f(A); ts[gT(a)]++; } bool isChain() { return (ts[1] + ts[2] == 0); } void PR() { if (!ifDebug)return; printf("-------%d-------\n", x); for (int a = 0; a < n; a++) { if (a == p[a]) { printf("[%d(%d,%d)]", a, sz[a], gT(a)); for (int b = 0; b < 4; b++)printf(" %d", cs[a][b]); printf("\n"); } else { printf("%d->%d\n", a, f(a)); } } printf("-----------------\n"); } }Graph; Graph MG, GV[4]; int GS; //type: 0-chain/1-cycle/2-3 exists/3-4 exists void Init(int N) { l.resize(N); cycleNum = n = N; MG.init(); } void Link(int A, int B) { bool p = (MG.st[3] == 0); MG.Link(A, B); for (int i = 0; i < GS; i++) { GV[i].Link(A, B); } if (MG.gT(MG.f(A)) == 1)cycleNum = MG.f(A); if (MG.gT(MG.f(B)) == 1)cycleNum = MG.f(B); if (p && MG.st[3]) { if (ifDebug)printf("걸렸구나!!!!!!!!!\n"); int a = A; if (l[A].size() < 3)a = B; GV[GS++].init(a); //return; for (int e : l[a]) { GV[GS++].init(e); } } } int CountCritical() { if (MG.ts[2]) { if (ifDebug)printf(">=3 Exists"); int r = 0; for (int i = 0; i < GS; i++) { if (GV[i].isChain())r++; } return r; } else if (MG.ts[1]) { if (ifDebug)printf("cycle Exists"); if (MG.ts[1] > 1)return 0; return MG.sz[cycleNum]; } else { if (ifDebug)printf("Already Chain"); return n; } }
#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...