제출 #350362

#제출 시각아이디문제언어결과실행 시간메모리
350362Kevin_Zhang_TW낙하산 고리들 (IOI12_rings)C++17
100 / 100
2507 ms232432 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define pb emplace_back #define AI(i) begin(i), end(i) template<class T> bool chmin(T &a, T b) { return b < a && (a = b, true); } template<class T> bool chmax(T &a, T b) { return a < b && (a = b, true); } #ifdef KEV #define DE(args...) kout("[ " + string(#args) + " ] = ", args) void kout() { cerr << endl; } template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); } template<class T> void debug(T L, T R) { while (L != R) cerr << *L << " \n"[next(L) == R], ++L; } #else #define DE(...) 0 #define debug(...) 0 #endif const int MAX_N = 1000005; int N, glob; struct dsu { vector<int> g, sz, deg; int n, badcnt, allbad, answer; dsu() {}; dsu (int n, int size) : n(n), answer(size), badcnt(0), allbad(0) { deg = g = vector<int>(n); sz = vector<int>(n, 1); iota(AI(g), 0); } int F(int i) { return i == g[i] ? i : g[i] = F(g[i]); } void M(int a, int b) { if (max(++deg[a], ++deg[b]) >= 3) allbad = true; if (allbad) return; a = F(a), b = F(b); if (sz[a] < sz[b]) swap(a, b); if (a != b) { return sz[a] += sz[b], g[b] = a, void(); } if (++badcnt == 2) allbad = true; // merging into a ring // which means you have to remove objects on the ring // all of them is ok, since max deg is 2 // I only care when max deg is <= 2 // and a ring cannot merge with other for max deg <= 2 answer = sz[a]; } bool noring() { return badcnt == 0 && allbad == false; } int getans() { return allbad ? 0 : answer; } }; dsu alld, forone; vector<int> edge[MAX_N]; bool iscan[MAX_N]; vector<int> big, can; vector<dsu> forcan; void canpush(int id) { if (iscan[id]) return; iscan[id] = true, can.pb(id); } void Init(int N_) { N = N_; glob = N; alld = dsu(N, N); } vector<pair<int,int>> alledge; int over = -1; void makebig() { static int lst = 0; if (lst == 0) forone = dsu(N, N-1); while (lst < alledge.size()) { auto [a, b] = alledge[lst++]; if (a != over && b != over) forone.M(a, b); } } void superbig(int id) { if (over == -1) { over = id; return; } else if (over != id) { glob = -1; return; } } void adjust(int a, int b) { if (glob == -1) return; DE(a, b); if (big.empty()) { assert(can.empty()); alld.M(a, b); glob = alld.getans(); return; } // deal with old ones int oldsize = can.size(); for (int i = 0;i < oldsize;++i) { int x = can[i]; if (a != x && b != x) forcan[i].M(a, b); } // put new element into candidate for (int x : big) { // assert(edge[x].size() <= 3); canpush(x); for (int u : edge[x]) canpush(u); } // examine new candidates for (int i = oldsize;i < can.size();++i) { forcan.pb(N, N-1); int x = can[i]; for (auto [a, b] : alledge) if (a != x && b != x) { forcan[i].M(a, b); } } // assert(forcan.size() == can.size()); glob = 0; // examine all candidates for (int i = 0;i < can.size();++i) glob += forcan[i].noring(); } void Link(int A, int B) { if (glob == -1) return; edge[A].pb(B), edge[B].pb(A); if (edge[A].size() == 3) big.pb(A); if (edge[B].size() == 3) big.pb(B); alledge.pb(A, B); if (edge[A].size() > 3) superbig(A); if (edge[B].size() > 3) superbig(B); if (over != -1) return makebig(), void(); if (big.size() > 4) { glob = -1; return; } adjust(A, B); } int CountCritical() { if (glob == -1) return 0; if (over != -1) return forone.noring(); return max(glob, 0); }

컴파일 시 표준 에러 (stderr) 메시지

rings.cpp: In constructor 'dsu::dsu(int, int)':
rings.cpp:25:25: warning: 'dsu::answer' will be initialized after [-Wreorder]
   25 |  int n, badcnt, allbad, answer;
      |                         ^~~~~~
rings.cpp:25:9: warning:   'int dsu::badcnt' [-Wreorder]
   25 |  int n, badcnt, allbad, answer;
      |         ^~~~~~
rings.cpp:28:2: warning:   when initialized here [-Wreorder]
   28 |  dsu (int n, int size) : n(n), answer(size), badcnt(0), allbad(0) {
      |  ^~~
rings.cpp: In function 'void makebig()':
rings.cpp:87:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |  while (lst < alledge.size()) {
      |         ~~~~^~~~~~~~~~~~~~~~
rings.cpp: In function 'void adjust(int, int)':
rings.cpp:14:17: warning: statement has no effect [-Wunused-value]
   14 | #define DE(...) 0
      |                 ^
rings.cpp:106:2: note: in expansion of macro 'DE'
  106 |  DE(a, b);
      |  ^~
rings.cpp:134:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  134 |   for (int i = oldsize;i < can.size();++i) {
      |                        ~~^~~~~~~~~~~~
rings.cpp:147:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  147 |   for (int i = 0;i < can.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...