Submission #446543

#TimeUsernameProblemLanguageResultExecution timeMemory
446543ComPhyParkParachute rings (IOI12_rings)C++14
0 / 100
2406 ms156100 KiB
#include<cstdio> #include<vector> 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<int>l[SZ]; typedef struct Graph { int st[4], ts[3]; int p[SZ], sz[SZ], ln[SZ], c[SZ]; bool i3[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++) { i3[i] = false; p[i] = i; sz[i] = 1; ln[i] = c[i] = 0; } } void init(int X) { if (ifDebug)printf("init(%d)\n", X); init(); isMain = false; x = X; PR(); for (int i = 0; i < n; i++) { for (int e : l[i]) { if (e < i)Link(e, i); } } } int f(int a) { return a == p[a] ? a : p[a] = f(p[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)]--; ln[a] += ln[b]; sz[a] += sz[b]; } else { ts[gT(a)]--; } } void Con(int A, int B) { int a = f(A); st[min(c[A], 3)]--; if (isMain)l[A].push_back(B); c[A]++; if (c[A] >= 3)i3[a] = true; st[min(c[A], 3)]++; } int gT(int a) { if (i3[a]) { return 2; } else if (sz[a] == ln[a]) { return 1; } else { return 0; } } void Link(int A, int B) { if (A == x || B == x)return; if (ifDebug)printf("%d:%d-%d\n", x, A, B); u(A, B); Con(A, B); Con(B, A); int a = f(A); ln[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++) { printf("(%d)", c[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; vector<Graph>GV; //type: 0-chain/1-cycle/2-3 exists/3-4 exists void Init(int 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 < GV.size(); 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.resize(l[a].size() + 1); GV[l[a].size()].init(a); for (int i = 0; i < l[a].size(); i++) { GV[i].init(l[a][i]); } } } int CountCritical() { if (MG.ts[2]) { if (ifDebug)printf(">=3 Exists"); int r = 0; for (int i = 0; i < GV.size(); 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; } }

Compilation message (stderr)

rings.cpp: In function 'void Link(int, int)':
rings.cpp:115:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Graph>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |  for (int i = 0; i < GV.size(); i++) {
      |                  ~~^~~~~~~~~~~
rings.cpp:126:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  126 |   for (int i = 0; i < l[a].size(); i++) {
      |                   ~~^~~~~~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:135:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Graph>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  135 |   for (int i = 0; i < GV.size(); i++) {
      |                   ~~^~~~~~~~~~~
#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...