Submission #996550

#TimeUsernameProblemLanguageResultExecution timeMemory
996550shmaxGame (IOI14_game)C++14
100 / 100
982 ms158464 KiB
#include "game.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #pragma GCC optimize("O3") #pragma GCC target("avx,avx2,fma") //#pragma GCC optimization ("unroll-loops") #pragma GCC target("avx,avx2,sse,sse2,sse3,sse4,popcnt") using namespace std; using namespace __gnu_pbds; #define float long double #define elif else if #define endl "\n" #define mod 1000000007 #define pi acos(-1) #define eps 0.000000001 #define inf 1000'000'000'000'000'000LL #define FIXED(a) cout << fixed << setprecision(a) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define time_init auto start = std::chrono::high_resolution_clock::now() #define time_report \ auto end = std::chrono::high_resolution_clock::now(); \ std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << endl #define debug(x) \ { cerr << #x << " = " << x << endl; } #define len(x) (int) x.size() #define sqr(x) ((x) * (x)) #define cube(x) ((x) * (x) * (x)) #define bit(x, i) (((x) >> (i)) & 1) #define set_bit(x, i) ((x) | (1LL << (i))) #define clear_bit(x, i) ((x) & (~(1LL << (i)))) #define toggle_bit(x, i) ((x) ^ (1LL << (i))) #define low_bit(x) ((x) & (-(x))) #define count_bit(x) __builtin_popcountll(x) #define srt(x) sort(all(x)) #define rsrt(x) sort(rall(x)) #define mp make_pair #define maxel(x) (*max_element(all(x))) #define minel(x) (*min_element(all(x))) #define maxelpos(x) (max_element(all(x)) - x.begin()) #define minelpos(x) (min_element(all(x)) - x.begin()) #define sum(x) (accumulate(all(x), 0LL)) #define product(x) (accumulate(all(x), 1LL, multiplies<int>())) #define gcd __gcd #define lcm(a, b) ((a) / gcd(a, b) * (b)) #define rev(x) (reverse(all(x))) #define shift_left(x, k) (rotate(x.begin(), x.begin() + k, x.end())) #define shift_right(x, k) (rotate(x.rbegin(), x.rbegin() + k, x.rend())) #define is_sorted(x) (is_sorted_until(all(x)) == x.end()) #define is_even(x) (((x) &1) == 0) #define is_odd(x) (((x) &1) == 1) #define pow2(x) (1LL << (x)) struct custom_hash { static uint64_t splitmix64(uint64_t x) { // http://xorshift.di.unimi.it/splitmix64.c x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } size_t operator()(std::pair<int, int> x) const { static const uint64_t FIXED_RANDOM = std::chrono::steady_clock::now().time_since_epoch().count(); uint64_t hash1 = splitmix64(x.first + FIXED_RANDOM); uint64_t hash2 = splitmix64(x.second + FIXED_RANDOM); return hash1 ^ (hash2 << 1); // Combine the two hashes } }; template<typename T> using min_heap = priority_queue<T, vector<T>, greater<T>>; template<typename T> using max_heap = priority_queue<T, vector<T>, less<T>>; template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template<typename T> using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>; template<typename T> using matrix = vector<vector<T>>; template<typename T> using graph = vector<vector<T>>; template<typename U, typename V> using hashmap = gp_hash_table<U, V, custom_hash>; template<typename U> using hashset = gp_hash_table<U, null_type, custom_hash>; template<typename T> vector<T> vect(int n, T val) { return vector<T>(n, val); } template<typename T> vector<vector<T>> vect(int n, int m, T val) { return vector<vector<T>>(n, vector<T>(m, val)); } template<typename T> vector<vector<vector<T>>> vect(int n, int m, int k, T val) { return vector<vector<vector<T>>>(n, vector<vector<T>>(m, vector<T>(k, val))); } template<typename T> vector<vector<vector<vector<T>>>> vect(int n, int m, int k, int l, T val) { return vector<vector<vector<vector<T>>>>(n, vector<vector<vector<T>>>(m, vector<vector<T>>(k, vector<T>(l, val)))); } template<typename T> matrix<T> new_matrix(int n, int m, T val) { return matrix<T>(n, vector<T>(m, val)); } template<typename T> graph<T> new_graph(int n) { return graph<T>(n); } template<class T, class S> inline bool chmax(T &a, const S &b) { return (a < b ? a = b, 1 : 0); } template<class T, class S> inline bool chmin(T &a, const S &b) { return (a > b ? a = b, 1 : 0); } using i8 = int8_t; using i16 = int16_t; using i32 = int32_t; using i64 = int64_t; using i128 = __int128_t; using u8 = uint8_t; using u16 = uint16_t; using u32 = uint32_t; using u64 = uint64_t; using u128 = __uint128_t; template<typename T> using vec = vector<T>; using pII = pair<int, int>; template<typename T> using enumerated = pair<T, int>; vec<bitset<1501>> a; vec<set<int>> g_mst; hashset<pair<int, int>> edges; hashset<pair<int, int>> MST_edges; mt19937 rng(10235); void initialize(int n) { g_mst.resize(n); a.resize(n); vec<int> p(n); iota(all(p), 0); shuffle(all(p), rng); for (int i = 1; i < n; i++) { MST_edges.insert({p[i], p[i - 1]}); MST_edges.insert({p[i - 1], p[i]}); g_mst[p[i]].insert(p[i - 1]); g_mst[p[i - 1]].insert(p[i]); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) continue; if (MST_edges.find({i, j}) == MST_edges.end()) edges.insert({i, j}); a[i][j] = true; } } } int hasEdge(int u, int v) { if (edges.find({u, v}) != edges.end()) { edges.erase({u, v}); edges.erase({v, u}); a[v][u] = false; a[u][v] = false; return false; } a[u][v] = false; a[v][u] = false; g_mst[u].erase(v); g_mst[v].erase(u); bitset<1501> right; function<void(int, int)> dfs = [&](int v, int p) { right[v] = true; for (auto u: g_mst[v]) { if (u == p) continue; dfs(u, v); } }; int n = len(g_mst); dfs(0, -1); if (len(edges) < n * 10) { int a_ = -1; int b_ = -1; for (auto [x, y]: edges) { if (right[x] xor right[y]) { a_ = x; b_ = y; break; } } if (a_ == -1) { a[u][v] = true; a[v][u] = true; g_mst[u].insert(v); g_mst[v].insert(u); return true; } edges.erase({a_, b_}); edges.erase({b_, a_}); g_mst[a_].insert(b_); g_mst[b_].insert(a_); return false; } for (int i = 0; i < n; i++) { if (right[i]) continue; bitset<1501> t = a[i] & right; if (t.count() != 0) { for (int j = 0; j < n; j++) { if (t[j]) { edges.erase({i, j}); edges.erase({j, i}); g_mst[i].insert(j); g_mst[j].insert(i); return false; } } } } a[u][v] = true; a[v][u] = true; g_mst[u].insert(v); g_mst[v].insert(u); return true; }

Compilation message (stderr)

game.cpp: In function 'int hasEdge(int, int)':
game.cpp:209:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  209 |         for (auto [x, y]: edges) {
      |                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...