Submission #789545

#TimeUsernameProblemLanguageResultExecution timeMemory
789545MODDIGame (IOI13_game)C++17
100 / 100
2867 ms118428 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair typedef long long ll; typedef pair<long long, long long> pll; typedef pair<int,int> pii; typedef vector<long long> vl; typedef vector<int> vi; long long gcd2(long long X, long long Y) { long long tmp; while (X != Y && Y != 0) { tmp = X; X = Y; Y = tmp % Y; } return X; } struct segtree{ struct Node { ll v; Node* l, * r; int flag; Node(ll a, Node* b, Node* c) : v(a), l(b), r(c) {flag = -1;} }; int size; Node* root, *null; void init(int n) { size = 1; while (size < n) size *= 2; null = new Node(0, nullptr, nullptr); null->l = null->r = null; root = null; } Node* update(Node* node, int lx, int rx, int i, ll v) { if (node == null) node = new Node(0, null, null); if (lx == rx - 1) { node->v = v; return node; } int mid = (lx + rx) / 2; if (node->flag == -1 || node->flag == i) { node->flag = i; node->v = v; return node; } else if (node->flag != -2) { if (node->flag < mid) { node->l = update(node->l, lx, mid, node->flag, node->v); } else { node->r =update(node->r, mid, rx,node->flag, node->v); } node->flag = -2; } if (i < mid) { node->l = update(node->l, lx, mid, i, v); } else { node->r = update(node->r, mid, rx, i, v); } node->v = gcd2(node->l->v, node->r->v); return node; } void update(int i, ll v) { root = update(root, 0, size, i, v); } ll query(Node* node, int lx, int rx, int l, int r) { if (l >= rx || lx >= r || node == null) { return 0ll; } if (node->flag >= 0) { int p = node->flag; if (p >= l && p < r) return node->v; else return 0LL; } if (l <= lx && rx <= r) { ll ret = node->v; return ret; } int mid = (lx + rx) / 2; ll left = query(node->l, lx, mid, l, r); ll right = query(node->r, mid, rx, l, r); return gcd2(left, right); } ll query(int l, int r) { return query(root, 0, size, l, r); } }; struct seg2D{ struct Node{ segtree col; Node*l , *r; Node(int sz, Node* a, Node* b) : l(a), r(b){ col.init(sz);} }; Node* root, *null; int row_size, col_size; void init(int n, int m){ row_size = 1; while(row_size<n) row_size*=2; col_size = m; null = new Node(col_size, nullptr, nullptr); null->l= null->r = null; root = null; } ll query(Node* node, int l1, int r1, int l2, int r2, int L, int R){ if(l1 >= R || L >= r1 || node == null) return 0ll; if(l1 <= L && R <= r1){ return node->col.query(l2, r2); } int mid = (L + R) / 2; ll left = query(node->l, l1, r1, l2, r2, L, mid); ll right = query(node->r, l1, r1, l2, r2, mid, R); return gcd2(left, right); } ll query(int l1, int r1, int l2, int r2){ return query(root, l1, r1, l2, r2, 0, row_size); } Node* update(Node* node, int l, int r, int L, int R, ll v){ if (node == null) node = new Node(col_size, null, null); if (L+1==R) { node->col.update(r, v); return node; } int mid = (L + R) / 2; if (l < mid) { node->l = update(node->l, l, r, L, mid, v); } else { node->r = update(node->r, l, r, mid, R, v); } ll new_v = gcd2(node->l->col.query(r, r + 1), node->r->col.query(r, r + 1)); node->col.update(r, new_v); return node; } void update(int l, int r, ll v){ root = update(root, l, r, 0, row_size, v); } }; seg2D mat; void init(int R, int C) { mat.init(R, C); } void update(int P, int Q, long long K) { mat.update(P, Q, K); } long long calculate(int P, int Q, int U, int V) { return mat.query(P, U+1, Q, V+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...