Submission #1236860

#TimeUsernameProblemLanguageResultExecution timeMemory
1236860y0usefPictionary (COCI18_pictionary)C++20
140 / 140
152 ms10248 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define endl '\n' #define ull unsigned long long #define int long long #define pb push_back #define pf push_front #define inpt freopen("input.txt", "r", stdin) #define outpt freopen("output.txt", "w", stdout) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define EPS 1e-6 #define PI acos(-1) typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> OrderedSet; int dx[8] = {0, 1, -1, 0, 1, 1, -1, -1}; int dy[8] = {1, 0, 0, -1, 1, -1, 1, -1}; const int N = 3e5 + 10, MOD = 998244353, INF = 3e15, LOG = 23, SQ = 320; // SQ = 317 for 1e5, 448 for 2e5 class DSU { private: vector<int> Set, sz; public: DSU(int n) : Set(n + 1), sz(n + 1, 1) { for(int i = 1; i <= n; i++) Set[i] = i; } int find(int x) { return Set[x] == x ? x : (Set[x] = find(Set[x])); } int get_size(int x) { return sz[find(x)]; } void unite(int u, int v) { u = find(u); v = find(v); if(u == v) return; if(sz[u] < sz[v]) swap(u, v); sz[u] += sz[v]; Set[v] = u; } bool connected(int x, int y) { return find(x) == find(y); } }; struct query { int u, v; }; signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m, q; cin >> n >> m >> q; vector<query> queries(q + 1); for(int i = 1; i <= q; i++) cin >> queries[i].u >> queries[i].v; int l[q + 1], r[q + 1]; for(int i = 1; i <= q; i++) l[i] = 1, r[i] = m; vector<int> ans(q + 1, INF); while(true) { bool ok = false; vector<int> qry[m + 1]; for(int i = 1; i <= q; i++) { if(l[i] > r[i]) continue; ok = true; qry[l[i] + (r[i] - l[i]) / 2].push_back(i); } if(!ok) break; DSU dsu(n); for(int i = 1; i <= m; i++) { for(int j = m - i + 1; j <= n; j += m - i + 1) dsu.unite(m - i + 1, j); for(auto x : qry[i]) { if(dsu.connected(queries[x].u, queries[x].v)) { ans[x] = min(ans[x], i); r[x] = i - 1; } else l[x] = i + 1; } } } for(int i = 1; i <= q; i++) cout << ans[i] << endl; }
#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...
#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...