Submission #201086

#TimeUsernameProblemLanguageResultExecution timeMemory
201086extraterrestrialMeetings (JOI19_meetings)C++14
29 / 100
3081 ms9224 KiB
#include "meetings.h" #pragma GCC optimize("Ofast") #pragma GCC optimize("no-stack-protector") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> typedef long long ll; typedef long double ld; using namespace std; #define F first #define S second #define pb push_back #define all(x) (x).begin(), (x).end() #define SZ(x) (int)(x).size() mt19937 rnd(228); const int N = 2010; short lca[N][N], used[N], timer, up[N][20], all; //bitset<N> dk[N], em, cur[18], kek; vector<short> nh[20], have[N]; inline short get(short a, short b) { if (a > b) { swap(a, b); } return lca[a][b]; } inline void update_lca(short a, short b, short c) { if (a > b) { swap(a, b); } lca[a][b] = c; //dk[a][b] = dk[b][a] = 0; } vector<pair<int, int>> edge; void Solve(int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { lca[i][j] = i; } else { lca[i][j] = -1; //dk[i][j] = dk[j][i] = 1; } } } short root = rnd() % n; for (int i = 0; i < n; i++) { have[root].pb(i); } queue<short> q; q.push(root); while (!q.empty()) { int root = q.front(); q.pop(); if (SZ(have[root]) == 1) { continue; } /*for (int i = 0; i < 18; i++) { cur[i] = em; }*/ //shuffle(all(have), rnd); //vector<vector<int>> nh(1); //vector<int> up(1); short id = (have[root][0] == root ? 1 : 0); short cc = 1; nh[0] = {have[root][id]}; up[root][0] = have[root][id]; //cur[0][have[0]] = 1; timer++; used[have[root][id]] = timer; for (int i = 1; i < SZ(have[root]); i++) { if (used[have[root][i]] == timer || have[root][i] == root) { continue; } //cerr << root << ' ' << have[root][i] << '\n'; used[have[root][i]] = timer; bool ok = false; /*vector<int> order; for (int j = 0; j < SZ(nh); j++) { order.pb(j); } shuffle(all(order), rnd);*/ assert(cc < 20); for (int j = 0; j < cc; j++) { if (ok) { break; } short v; if (get(up[root][j], have[root][i]) != -1) { v = get(up[root][j], have[root][i]); } else { v = Query(root, up[root][j], have[root][i]); all++; if (all > 1e5) { exit(0); } } if (v != root) { /*if (get(up[root][j], have[root][i]) != -1) { cerr << "CASE 1\n"; } else { cerr << "CASE 2\n"; }*/ //cerr << root << ' ' << have[root][i] << ' ' << up[root][j] << ' ' << v << '\n'; if (v == up[root][j]) { update_lca(v, up[root][j], up[root][j]); nh[j].pb(have[root][i]); //cur[j][have[i]] = 1; ok = true; break; } else { /*kek = dk[have[i]] & cur[j]; int cnt = kek.count(); for (int iter = 0; iter < cnt; iter++) { int pos = kek._Find_first(); kek[pos] = 0; update_lca(pos, have[i], v); } kek = dk[v] & cur[j]; cnt = kek.count(); for (int iter = 0; iter < cnt; iter++) { int pos = kek._Find_first(); kek[pos] = 0; update_lca(pos, v, v); }*/ update_lca(have[root][i], v, v); used[v] = timer; up[root][j] = v; nh[j].pb(have[root][i]); //cur[j][have[i]] = 1; if (v != have[root][i]) { nh[j].pb(v); //cur[j][v] = 1; } ok = true; break; } } } if (!ok) { nh[cc] = {have[root][i]}; up[root][cc] = have[root][i]; cc++; } } for (int i = 0; i < cc; i++) { edge.pb({root, up[root][i]}); } /*for (auto it : up[root]) { edge.pb({root, it}); }*/ for (int i = 0; i < cc; i++) { have[up[root][i]] = nh[i]; } for (int i = 0; i < cc; i++) { q.push(up[root][i]); } } for (auto &it : edge) { if (it.F > it.S) { swap(it.F, it.S); } //cerr << it.F << ' ' << it.S << '\n'; Bridge(it.F, it.S); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...