답안 #163257

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
163257 2019-11-12T02:31:51 Z galen_colin 게임 (IOI13_game) C++14
80 / 100
6299 ms 256000 KB
#include <bits/stdc++.h>
#include <chrono> 
 
using namespace std;
using namespace std::chrono; 
 
// #pragma GCC target ("avx2")
// #pragma GCC optimization ("O3")
// #pragma GCC optimization ("unroll-loops")
 
#define f0r(a, b) for (long long a = 0; a < b; a++)
#define f1r(a, b, c) for (long long a = b; a < c; a++)
#define f0rd(a, b) for (long long a = b; a >= 0; a--)
#define f1rd(a, b, c) for (long long a = b; a >= c; a--)
#define ms(arr, v) memset(arr, v, sizeof(arr))
#define pb push_back
#define io {ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);}
#define mp make_pair
#define f first
#define s second
#define presum(p, a, n) {p[0] = a[0]; for (int i = 1; i < n; i++) p[i] = a[i] + p[i-1];}
#define all(v) v.begin(), v.end()
#define readgraph(list, edges) for (int i = 0; i < edges; i++) {int a, b; cin >> a >> b; a--; b--; list[a].pb(b); list[b].pb(a);}
#define ai(a, n) for (int ele = 0; ele < n; ele++) cin >> a[ele];
#define ain(a, lb, rb) for (int ele = lb; ele <= rb; ele++) cin >> a[ele];
#define ao(a, n) {for (int ele = 0; ele < n; ele++) { if (ele) cout << " "; cout << a[ele]; } cout << '\n';}
#define aout(a, lb, rb) {for (int ele = lb; ele <= rb; ele++) { if (ele > lb) cout << " "; cout << a[ele]; } cout << '\n';}
typedef long long ll;
typedef double ld;
typedef long double lld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;
 
template<typename A, typename B> ostream& operator<<(ostream &cout, pair<A, B> const &p) { return cout << "(" << p.f << ", " << p.s << ")"; }
template<typename A> ostream& operator<<(ostream &cout, vector<A> const &v) {
  cout << "["; for(int i = 0; i < v.size(); i++) {if (i) cout << ", "; cout << v[i];} return cout << "]";
}
// template<typename A, typename B> ll max(A x, B y) {
//   return x > y ? x : y;
// }
// template<typename A, typename B> ll min(A x, B y) {
//   return x < y ? x : y;
// }
 
mt19937 rng(steady_clock::now().time_since_epoch().count());
/* usage - just do rng() */
 
void usaco(string filename) {
  #pragma message("be careful, freopen may be wrong")
	freopen((filename + ".in").c_str(), "r", stdin);
	freopen((filename + ".out").c_str(), "w", stdout);
}
 
const ll mod = 998244353;
 
ll madd(ll a, ll b) {
  return (a + b) % mod;
}
ll msub(ll a, ll b) {
  return (((a - b) % mod) + mod) % mod;
}
ll mmul(ll a, ll b) {
  return ((a % mod) * (b % mod)) % mod;
}
ll mpow(ll base, ll exp) {
  ll res = 1;
  while (exp) {
    if (exp % 2 == 1){
        res = (res * base) % mod;
    }
    exp >>= 1;
    base = (base * base) % mod;
  }
  return res;
}
ll minv(ll base) {
  return mpow(base, mod - 2);
}
ll mdiv(ll a, ll b) {
  return mmul(a, minv(b));
}
ll gcd(ll x, ll y) {
  if (x == 0) return y;
  if (y == 0) return x;
  return gcd(y, x % y);
}
 
// bool prime[1000006]; 
// void sieve(int n) { 
//   f0r(i, n + 1) prime[i] = 1;
//   for (int p = 2; p * p <= n; p++) { 
//     if (prime[p] == true) { 
//       for (int i = p * p; i <= n; i += p) 
//         prime[i] = false; 
//     } 
//   } 
//   prime[1] = prime[0] = 0;
// } 
 
ll n, m, k, q, Q, T, l, r, x, y, z;
// ll a[500005];
// ll b[500005];
string s, t;
ll ans = 0;

using implicit_segtree = struct implicit_segtree;

vector<implicit_segtree> vec(1e7);
int pt = 0;
struct implicit_segtree {
  bitset<60> v;
  int child[2];

  implicit_segtree() {
    v = 0;
    child[0] = -1;
    child[1] = -1;
  }

  int ch(int x) {
    if (child[x] == -1) {
      child[x] = pt++;
    }
    return child[x];
  }

  void add(int loc, ll val) {
    add(loc, val, 0, m - 1);
  }

  ll add(int loc, ll val, int l, int r) {
    if (l > loc || r < loc) return v.to_ulong();
    if (l == r) return (v = val).to_ulong();
    ll m = (l + r) / 2;
    ll a = 0, b = 0;
    if (loc <= m) {
      a = vec[ch(0)].add(loc, val, l, m);
      if (child[1] != -1) b = vec[ch(1)].v.to_ulong();
    } else {
      if (child[0] != -1) a = vec[ch(0)].v.to_ulong();
      b = vec[ch(1)].add(loc, val, m + 1, r);
    }
    
    // cout << "add inner " << l << " " << r << " " << a << " " << b << " " << gcd(a, b) << endl;
    return (v = gcd(a, b)).to_ulong();
  }

  ll query(int ql, int qr) {
    return query(ql, qr, 0, m - 1);
  }

  ll query(int ql, int qr, int tl, int tr) {
    if (qr < tl || ql > tr || tl > tr) return 0;
    // cout << "inner " << ql << " " << qr << " " << tl << " " << tr << " " << v.to_ulong() << endl;
    if (ql <= tl && tr <= qr) return v.to_ulong();
    ll a = 0, b = 0;
    ll m = (tl + tr) / 2;
    if (child[0] != -1) a = vec[ch(0)].query(ql, qr, tl, m);
    if (child[1] != -1) b = vec[ch(1)].query(ql, qr, m + 1, tr);
    // cout << tl << " " << tr << " " << a << " " << b << endl;
    return gcd(a, b);
  }
};

using implicit_segtree_lv2 = struct implicit_segtree_lv2;
struct implicit_segtree_lv2 {
  implicit_segtree* v;
  implicit_segtree_lv2* child[2];

  implicit_segtree_lv2() {
    v = new implicit_segtree();
    child[0] = nullptr;
    child[1] = nullptr;
  }

  implicit_segtree_lv2* ch(int x) {
    if (!child[x]) child[x] = new implicit_segtree_lv2();
    return child[x];
  }

  void add(int loc, int loc2, ll val) {
    add(loc, loc2, val, 0, n - 1);
  }

  ll add(int loc, int loc2, ll val, int l, int r) {
    // cout << "add outer " << l << " " << r << " " << loc2 << " " << val << endl;
    if (l > loc || r < loc) return v->query(loc2, loc2);
    if (l == r) {
      v->add(loc2, val);
      return val;
    }
    ll m = (l + r) / 2;
    ll a = 0, b = 0;
    if (loc <= m) {
      a = ch(0)->add(loc, loc2, val, l, m);
      if (child[1]) b = ch(1)->v->query(loc2, loc2);
    } else {
      if (child[0]) a = ch(0)->v->query(loc2, loc2);
      b = ch(1)->add(loc, loc2, val, m + 1, r);
    }
    
    ll x = gcd(a, b);
    v->add(loc2, x);
    return x;
  }

  ll query(int ql1, int qr1, int ql2, int qr2) {
    return query(ql1, qr1, ql2, qr2, 0, n - 1);
  }

  ll query(int ql1, int qr1, int ql2, int qr2, int tl, int tr) {
    // cout << "outer " << ql1 << " " << qr1 << " " << tl << " " << tr << endl;
    if (qr1 < tl || ql1 > tr || tl > tr) return 0;
    if (ql1 <= tl && tr <= qr1) return v->query(ql2, qr2);
    ll a = 0, b = 0, m = (tl + tr) / 2;
    if (child[0]) a = ch(0)->query(ql1, qr1, ql2, qr2, tl, m);
    if (child[1]) b = ch(1)->query(ql1, qr1, ql2, qr2, m + 1, tr);
    return gcd(a, b);
  }
};

#include "game.h"

implicit_segtree_lv2 st;

void init(int r, int c) {
  n = r;
  m = c;
}

void update(int r, int c, ll v) {
  st.add(r, c, v);
}

ll calculate(int r1, int c1, int r2, int c2) {
  return st.query(r1, r2, c1, c2);
}

// int main() {
//   io;
//   // freopen("case", "r", stdin);
//   // freopen("test.txt", "r", stdin);
//   // freopen("case", "w", stdout);
//   // freopen("file.in", "r", stdin);
 
//   usaco("file");

//   cin >> n >> m >> Q;
//   init(n, m);
//   f0r(i, Q) {
//     cin >> q;
//     // cout << "QUERY   __ " << i << " __" << endl;
//     if (q == 1) {
//       ll a, b, c; cin >> a >> b >> c;
//       update(a, b, c);
//     } else {
//       ll a, b, c, d; cin >> a >> b >> c >> d;
//       cout << "Q " << a << " " << b << " " << c << " " << d << endl;
//       cout << calculate(a, b, c, d) << endl;
//     }
//   }
// }

Compilation message

grader.c: In function 'int main()':
grader.c:18:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
  int res;
      ^~~
game.cpp: In function 'void usaco(std::__cxx11::string)':
game.cpp:54:53: note: #pragma message: be careful, freopen may be wrong
   #pragma message("be careful, freopen may be wrong")
                                                     ^
game.cpp:55:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  freopen((filename + ".in").c_str(), "r", stdin);
  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
game.cpp:56:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  freopen((filename + ".out").c_str(), "w", stdout);
  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 211 ms 156908 KB Output is correct
2 Correct 135 ms 156920 KB Output is correct
3 Correct 137 ms 156872 KB Output is correct
4 Correct 134 ms 156920 KB Output is correct
5 Correct 140 ms 156920 KB Output is correct
6 Correct 134 ms 156920 KB Output is correct
7 Correct 163 ms 156988 KB Output is correct
8 Correct 136 ms 156932 KB Output is correct
9 Correct 139 ms 156948 KB Output is correct
10 Correct 134 ms 156920 KB Output is correct
11 Correct 151 ms 157048 KB Output is correct
12 Correct 141 ms 156876 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 149 ms 156820 KB Output is correct
2 Correct 141 ms 156980 KB Output is correct
3 Correct 148 ms 156812 KB Output is correct
4 Correct 964 ms 163972 KB Output is correct
5 Correct 871 ms 163812 KB Output is correct
6 Correct 832 ms 160860 KB Output is correct
7 Correct 883 ms 160456 KB Output is correct
8 Correct 630 ms 161240 KB Output is correct
9 Correct 874 ms 160280 KB Output is correct
10 Correct 855 ms 160156 KB Output is correct
11 Correct 134 ms 156920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 134 ms 156920 KB Output is correct
2 Correct 136 ms 156896 KB Output is correct
3 Correct 138 ms 157048 KB Output is correct
4 Correct 136 ms 156888 KB Output is correct
5 Correct 133 ms 156876 KB Output is correct
6 Correct 134 ms 156916 KB Output is correct
7 Correct 146 ms 156920 KB Output is correct
8 Correct 135 ms 156884 KB Output is correct
9 Correct 134 ms 156828 KB Output is correct
10 Correct 134 ms 156924 KB Output is correct
11 Correct 135 ms 156920 KB Output is correct
12 Correct 1717 ms 163820 KB Output is correct
13 Correct 2980 ms 160236 KB Output is correct
14 Correct 531 ms 160336 KB Output is correct
15 Correct 3193 ms 160512 KB Output is correct
16 Correct 391 ms 160324 KB Output is correct
17 Correct 1305 ms 161068 KB Output is correct
18 Correct 2108 ms 161244 KB Output is correct
19 Correct 1798 ms 162548 KB Output is correct
20 Correct 1722 ms 161744 KB Output is correct
21 Correct 133 ms 156920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 132 ms 156920 KB Output is correct
2 Correct 133 ms 156832 KB Output is correct
3 Correct 136 ms 156828 KB Output is correct
4 Correct 134 ms 156920 KB Output is correct
5 Correct 147 ms 156920 KB Output is correct
6 Correct 146 ms 156892 KB Output is correct
7 Correct 167 ms 156876 KB Output is correct
8 Correct 134 ms 156828 KB Output is correct
9 Correct 140 ms 156884 KB Output is correct
10 Correct 135 ms 156920 KB Output is correct
11 Correct 134 ms 156792 KB Output is correct
12 Correct 960 ms 163916 KB Output is correct
13 Correct 766 ms 163848 KB Output is correct
14 Correct 819 ms 161016 KB Output is correct
15 Correct 900 ms 160412 KB Output is correct
16 Correct 639 ms 161416 KB Output is correct
17 Correct 867 ms 161460 KB Output is correct
18 Correct 786 ms 160248 KB Output is correct
19 Correct 1577 ms 164492 KB Output is correct
20 Correct 2776 ms 160560 KB Output is correct
21 Correct 479 ms 160928 KB Output is correct
22 Correct 3145 ms 160704 KB Output is correct
23 Correct 388 ms 159992 KB Output is correct
24 Correct 1332 ms 162436 KB Output is correct
25 Correct 2059 ms 161392 KB Output is correct
26 Correct 1809 ms 162356 KB Output is correct
27 Correct 1709 ms 162272 KB Output is correct
28 Correct 880 ms 175172 KB Output is correct
29 Correct 2340 ms 173656 KB Output is correct
30 Correct 6299 ms 165636 KB Output is correct
31 Correct 5803 ms 164428 KB Output is correct
32 Correct 677 ms 159504 KB Output is correct
33 Correct 973 ms 159480 KB Output is correct
34 Correct 564 ms 170840 KB Output is correct
35 Correct 1750 ms 165972 KB Output is correct
36 Correct 3061 ms 170868 KB Output is correct
37 Correct 2539 ms 170800 KB Output is correct
38 Correct 2591 ms 170252 KB Output is correct
39 Correct 2225 ms 168512 KB Output is correct
40 Correct 132 ms 156852 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 136 ms 156980 KB Output is correct
2 Correct 134 ms 156876 KB Output is correct
3 Correct 133 ms 156888 KB Output is correct
4 Correct 138 ms 156892 KB Output is correct
5 Correct 134 ms 156920 KB Output is correct
6 Correct 136 ms 156928 KB Output is correct
7 Correct 137 ms 156924 KB Output is correct
8 Correct 133 ms 156848 KB Output is correct
9 Correct 133 ms 156924 KB Output is correct
10 Correct 132 ms 156920 KB Output is correct
11 Correct 135 ms 156892 KB Output is correct
12 Correct 951 ms 163048 KB Output is correct
13 Correct 750 ms 163448 KB Output is correct
14 Correct 819 ms 159728 KB Output is correct
15 Correct 883 ms 159360 KB Output is correct
16 Correct 640 ms 160452 KB Output is correct
17 Correct 853 ms 159352 KB Output is correct
18 Correct 802 ms 158988 KB Output is correct
19 Correct 1572 ms 162512 KB Output is correct
20 Correct 2893 ms 159232 KB Output is correct
21 Correct 481 ms 159092 KB Output is correct
22 Correct 3190 ms 159032 KB Output is correct
23 Correct 384 ms 159580 KB Output is correct
24 Correct 1323 ms 160248 KB Output is correct
25 Correct 2074 ms 160460 KB Output is correct
26 Correct 1822 ms 160188 KB Output is correct
27 Correct 1767 ms 160320 KB Output is correct
28 Correct 914 ms 173484 KB Output is correct
29 Correct 2317 ms 172920 KB Output is correct
30 Correct 6132 ms 164624 KB Output is correct
31 Correct 5725 ms 163560 KB Output is correct
32 Correct 684 ms 158456 KB Output is correct
33 Correct 935 ms 158584 KB Output is correct
34 Correct 569 ms 169592 KB Output is correct
35 Correct 1808 ms 164952 KB Output is correct
36 Correct 3262 ms 170024 KB Output is correct
37 Correct 2678 ms 170192 KB Output is correct
38 Correct 2635 ms 169396 KB Output is correct
39 Runtime error 902 ms 256000 KB Execution killed with signal 11 (could be triggered by violating memory limits)
40 Halted 0 ms 0 KB -