Submission #990105

#TimeUsernameProblemLanguageResultExecution timeMemory
990105huutuanGame (IOI14_game)C++14
42 / 100
734 ms3908 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; const int N=1500, S=100; struct DSU{ int n; vector<int> lab; void init(int _n){ n=_n; lab.assign(n, -1); } int find_set(int u){ return lab[u]<0?u:lab[u]=find_set(lab[u]); } void union_sets(int u, int v){ u=find_set(u); v=find_set(v); if (u!=v){ if (lab[u]>lab[v]) swap(u, v); lab[u]+=lab[v]; lab[v]=u; } } } dsu; int n; set<pair<int, int>> edge[N/S], tree[N/S]; int cnt[N/S][N/S]; void initialize(int n_) { n=n_; for (int i=0; i<n; ++i){ for (int j=i+1; j<n; ++j){ if (i/S==j/S){ edge[i/S].emplace(i, j); }else{ if (i/S+1==j/S){ ++cnt[i/S][j/S]; } } } } } int hasEdge(int u, int v) { if (u>v) swap(u, v); if (u/S!=v/S){ --cnt[u/S][v/S]; return !cnt[u/S][v/S]; } dsu.init(min(n, S)); int id=u/S; edge[id].erase({u, v}); for (auto &i:edge[id]) dsu.union_sets(i.first-S*id, i.second-S*id); if (dsu.lab[dsu.find_set(0)]+n){ edge[id].emplace(u, v); return 1; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...