Submission #921837

#TimeUsernameProblemLanguageResultExecution timeMemory
921837boris_mihovMeetings (JOI19_meetings)C++17
7 / 100
1768 ms1068 KiB
#include "meetings.h" #include <algorithm> #include <iostream> #include <numeric> #include <cassert> #include <random> #include <vector> typedef long long llong; const int MAXN = 2000 + 10; const int INF = 1e9; int n; int sz[MAXN]; bool bl[MAXN]; int perm[MAXN]; std::vector <int> g[MAXN]; std::vector <int> c[MAXN]; std::vector <int> real[MAXN]; std::mt19937 rng(69420); void removeEdge(int u, int v) { if (u == -1 || v == -1) { return; } for (int &x : g[u]) { if (x == v) { std::swap(x, g[u].back()); g[u].pop_back(); break; } } for (int &x : g[v]) { if (x == u) { std::swap(x, g[v].back()); g[v].pop_back(); break; } } } void addEdge(int u, int v) { // std::cout << "add edge: " << u << ' ' << v << '\n'; if (u == -1 || v == -1) { return; } g[u].push_back(v); g[v].push_back(u); } void calcSize(int node, int par) { sz[node] = 1; for (const int &u : g[node]) { if (u == par || bl[u]) { continue; } calcSize(u, node); sz[node] += sz[u]; } } int findCentroid(int node, int par, int compSz) { for (const int &u : g[node]) { if (!bl[u] && u != par && sz[u] > compSz / 2) { return findCentroid(u, node, compSz); } } return node; } int decompose(int node) { calcSize(node, -1); int cntr = findCentroid(node, -1, sz[node]); bl[cntr] = true; for (const int &u : g[cntr]) { if (bl[u]) { continue; } c[cntr].push_back(decompose(u)); real[cntr].push_back(u); } return cntr; } void search(int node, int added, bool addedEdge) { for (int i = 0 ; i < c[node].size() ; i++) { int res = Query(node, real[node][i], added); // std::cout << " query res: " << node << ' ' << real[node][i] << ' ' << added << " = " << res << '\n'; if (res == node) { continue; } if (res == added) { removeEdge(node, real[node][i]); if (!addedEdge) { addEdge(node, added); addedEdge = true; } addEdge(real[node][i], added); search(real[node][i], added, true); continue; } if (res == real[node][i]) { search(c[node][i], added, false); return; } } if (!addedEdge) { addEdge(node, added); } } void Solve(int N) { n = N; std::iota(perm, perm + n, 0); std::shuffle(perm, perm + n, rng); g[perm[0]].push_back(perm[1]); g[perm[1]].push_back(perm[0]); // std::cout << "first: " << perm[0] << '\n'; // std::cout << "second: " << perm[1] << '\n'; for (int i = 2 ; i < n ; ++i) { // std::cout << "here: " << perm[i] << '\n'; for (int j = 0 ; j < n ; ++j) { c[j].clear(); real[j].clear(); std::shuffle(g[j].begin(), g[j].end(), rng); } std::fill(bl, bl + n, false); int root = decompose(perm[0]); // for (int j = 0 ; j < n ; ++j) // { // std::shuffle(c[j].begin(), c[j].end(), rng); // } search(root, perm[i], false); // std::cout << "after adding\n"; // for (int i = 0 ; i < n ; ++i) // { // for (const int &u : g[i]) // { // if (i < u) // { // std::cout << i << ' ' << u << '\n'; // } // } // } } for (int i = 0 ; i < n ; ++i) { for (const int &u : g[i]) { if (i < u) { Bridge(i, u); } } } }

Compilation message (stderr)

meetings.cpp: In function 'void search(int, int, bool)':
meetings.cpp:112:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |     for (int i = 0 ; i < c[node].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...