제출 #566481

#제출 시각아이디문제언어결과실행 시간메모리
566481Mazaalai게임 (IOI13_game)C++17
63 / 100
1755 ms256000 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e9+5; int n, m; ll gcd2(ll X, ll Y) { ll tmp; while (X != Y && Y != 0) { tmp = X; X = Y; Y = tmp % Y; } return X; } struct Node { ll val; Node *l, *r; Node() { val = 0; l = r = NULL; } void addSide() { if (l == NULL) { l = new Node(); r = new Node(); } } }; struct SegTree { Node *tree; SegTree *l, *r; SegTree() { tree = new Node(); l = r = NULL; } void addSide() { if (l == NULL) { l = new SegTree(); r = new SegTree(); } } void update(int l, int r, int id, ll val, Node *head) { if (l == r) { head->val = val; return; } int mid = (l+r)>>1; // head->addSide(); if (id <= mid && !head->l) head->l = new Node(); else if (mid < id && !head->r) head->r = new Node(); if (id <= mid) update(l, mid, id, val, head->l); else update(mid+1, r, id, val, head->r); head->val = gcd((head->l ? head->l->val : 0ll), (head->r ? head->r->val : 0ll)); } ll query(int l, int r, int L, int R, Node *head) { if (l > R || L > r || !head) return 0; if (L <= l && r <= R) return head->val; int mid = (l+r)>>1; return gcd( query(l, mid, L, R, head->l), query(mid+1, r, L, R, head->r) ); } void update1D(int pos, ll val) { update(1, m, pos, val, tree); } ll query1D(int l, int r) { return query(1, m, l, r, tree); } ll query1D(int l) { return query(1, m, l, l, tree); } } *root; void update2D(int l, int r, int a, int b, ll val, SegTree *head) { if (l == r) { head->update1D(b, val); return; } int mid = (l+r)>>1; // head->addSide(); if (a <= mid && !head->l) head->l = new SegTree(); else if (mid < a && !head->r) head->r = new SegTree(); if (a <= mid) update2D(l, mid, a, b, val, head->l); else update2D(mid+1, r, a, b, val, head->r); head->update1D( b, gcd( (head->l ? head->l->query1D(b) : 0), (head->r ? head->r->query1D(b) : 0) ) ); } ll query2D(int l, int r, int l1, int r1, int l2, int r2, SegTree *head) { if (l1 > r || l > r1 || !head) return 0; if (l1 <= l && r <= r1) return head->query1D(l2, r2); int mid = (l+r)>>1; return gcd( query2D(l, mid, l1, r1, l2, r2, head->l), query2D(mid+1, r, l1, r1, l2, r2, head->r) ); } void init(int _n, int _m) { n = _n; m = _m; root = new SegTree(); } void update(int a, int b, ll val) { update2D(1, n, a+1, b+1, val, root); } ll calculate(int l1, int l2, int r1, int r2) { return query2D(1, n, l1+1, r1+1, l2+1, r2+1, root); }
#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...