Submission #681092

#TimeUsernameProblemLanguageResultExecution timeMemory
681092nutellaGame (IOI13_game)C++17
10 / 100
13090 ms3484 KiB
#include <bits/stdc++.h> #include "game.h" using namespace std; using ll = long long; constexpr int MAXQ = 22001; #define left lft #define right rght #define gcd my_gcd ll my_gcd(ll a, ll b) { if (!a || !b) return a ^ b; ll c; while ((c = a % b)) { a = b; b = c; } return b; } int R, C; constexpr int M = MAXQ * 30 + 10; int counter = 1; ll d[M]; int left[M], right[M]; //vector<ll> d{{}}; //vector<int> left{{}}, right{{}}; int st_create() { // d.emplace_back(), left.emplace_back(), right.emplace_back(); d[counter] = left[counter] = right[counter] = 0; return counter++; } int pa[30]; void st_update(int v, int i, ll k, int l, int r) { int kek = 0; while (l + 1 < r) { int mid = (l + r) / 2; pa[kek++] = v; if (i < mid) { if (!left[v]) { left[v] = st_create(); } v = left[v]; r = mid; } else { if (!right[v]) { right[v] = st_create(); } v = right[v]; l = mid; } } d[v] = gcd(d[v], k); for (int x = kek - 1; x >= 0; --x) { v = pa[x]; d[v] = gcd(d[left[v]], d[right[v]]); } } ll st_query(int v, int lx, int rx, int l, int r) { if (lx >= r || rx <= l) { return 0; } else if (lx <= l && r <= rx) { return d[v]; } else { int mid = (l + r) / 2; ll ans = 0; if (left[v]) { ans = gcd(ans, st_query(left[v], lx, rx, l, mid)); } if (right[v]) { ans = gcd(ans, st_query(right[v], lx, rx, mid, r)); } return ans; } } void clear(int v) { if (!v) return; d[v] = 0; clear(left[v]); clear(right[v]); } constexpr int B = 574; map<pair<int, int>, ll> mp; vector<pair<int, int>> l, r; vector<int> root; void rebuild() { counter = 1; l.clear(), r.clear(), root.clear(); int last_sz = 0; for (auto [xx, k] : mp) { auto [x, y] = xx; if (last_sz == B) { last_sz = 0; } if (last_sz == 0) { l.push_back(xx); r.push_back(xx); root.push_back(st_create()); } else { r.back() = xx; } last_sz += 1; st_update(root.back(), y, k, 0, C); } } int last_rebuild = 0; void insert(pair<int, int> xx, ll k) { mp[xx] = k; ++last_rebuild; if (last_rebuild == B) { rebuild(); return; } int i = -1; if (xx >= r.back()) { i = int(r.size()) - 1; } else if (xx <= l.front()) { i = 0; } else { for (int j = int(l.size()) - 1; j >= 0; --j) { if (l[j] <= xx) { i = j; break; } } } assert(i != -1); l[i] = min(l[i], xx); r[i] = max(r[i], xx); clear(root[i]); auto it = mp.lower_bound(l[i]); while (it != mp.end() && it->first <= r[i]) { st_update(root[i], it->first.second, it->second, 0, C); it = next(it); } } void init(int R, int C) { ::R = R, ::C = C; l = {{R + 1, C + 1}}, r = {{0, 0}}; root = {st_create()}; } void update(int P, int Q, ll K) { insert({P, Q}, K); } ll calculate(int P, int Q, int U, int V) { int fi = -1, se = -1; ll cd = 0; pair<int, int> min_done = {U, V + 1}; pair<int, int> max_done = {P, Q - 1}; for (int i = 0; i < root.size(); ++i) { if (l[i].first >= P && r[i].first <= U) { cd = gcd(cd, st_query(root[i], Q, V + 1, 0, C)); min_done = min(min_done, l[i]); max_done = max(max_done, r[i]); } } auto it = mp.upper_bound(max_done); for (; it != mp.end() && it->first.first <= U; it = next(it)) { if (it->first.second >= Q && it->first.second <= V) { cd = gcd(cd, it->second); } } it = mp.lower_bound(min_done); for (; it != mp.begin() && prev(it)->first.first >= P; ) { it = prev(it); if (it->first.second >= Q && it->first.second <= V) { cd = gcd(cd, it->second); } } return cd; }

Compilation message (stderr)

game.cpp: In function 'll calculate(int, int, int, int)':
game.cpp:184:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  184 |     for (int i = 0; i < root.size(); ++i) {
      |                     ~~^~~~~~~~~~~~~
game.cpp:180:9: warning: unused variable 'fi' [-Wunused-variable]
  180 |     int fi = -1, se = -1;
      |         ^~
game.cpp:180:18: warning: unused variable 'se' [-Wunused-variable]
  180 |     int fi = -1, se = -1;
      |                  ^~
#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...