답안 #332942

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
332942 2020-12-04T03:31:30 Z gmyu 게임 (IOI13_game) C++14
100 / 100
7891 ms 57032 KB
/*
ID: USACO_template
LANG: C++
PROG: USACO
*/
#include <iostream>  //cin , cout
#include <fstream>   //fin, fout
#include <stdio.h>   // scanf , pringf
#include <cstdio>
#include <algorithm> // sort , stuff
#include <stack>     // stacks
#include <queue>     // queues
#include <map>
#include <string>

#include "game.h"

using namespace std;

typedef pair<int, int>          pii;
typedef vector<int>             vi;     /// adjlist without weight
typedef vector<pii>             vii;    /// adjlist with weight
typedef vector<pair<int,pii>>   vpip;   /// edge with weight
typedef long long               ll;

#define mp  make_pair
#define fst first
#define snd second
#define pb  push_back
#define trav(u, adj_v) for (auto& u: adj_v)

const int MOD = 1e9+7;  // 998244353;
const int MX  = 2e5+5;   //
const ll  INF = 1e18;    //

#define MAXV 100007
#define MAXE 100007

/// code from USACO examples
void setIO(string name) {
    ios_base::sync_with_stdio(0); cin.tie(0);
    freopen((name+".in").c_str(),"r",stdin);
    freopen((name+".out").c_str(),"w",stdout);
}
bool debug = false, submit = true;


long long gcd2(long long X, long long Y) {
    if(X == 0) return Y;
    if(Y == 0) return X;
    long long tmp;
    while (X != Y && Y != 0) {
        tmp = X; X = Y;
        Y = tmp % Y;
    }
    return X;
}

/*
Naively, inserting N elements into a sparse segment tree requires O(N log C) memory, giving a bound of O(N log^2C) on 2D segment tree memory.
This is usually too much for N=C=10^5 and 256 MB
Possible ways to get around this:
- Use arrays of fixed size rather than pointers.
- Reduce the memory usage of sparse segment tree to $O(N)$ while maintaining the same O(N\log C) insertion time
(see the solution for IOI Game below for details).
- Use BBSTs instead of sparse segment trees: https://cp-algorithms.com/data_structures/treap.html
*/

/// 2D segment tree with Treap on Y to reduce memory

struct NODEY {
    int key, priority;
    long long val, ans;
    NODEY *l, *r;

    NODEY(int _key, long long _val) : key(_key), priority(rand() + (rand() << 15)), val(_val), ans(_val), l(NULL), r(NULL) {}
};
typedef NODEY* pNODEY;
int NYseg[2];

long long ans(pNODEY t) { return t ? t->ans : 0; }
void pullY(pNODEY t) {
    if (t) t->ans = gcd2(gcd2(ans(t->l), ans(t->r)), t->val);
}
void splitY(pNODEY t, int key, pNODEY &l, pNODEY &r) {
    if (!t)
        l = r = NULL;
    else if (key < t->key)
        splitY(t->l, key, l, t->l), r = t;
    else
        splitY(t->r, key, t->r, r), l = t;
    pullY(t);
}
void mergeY(pNODEY &t, pNODEY l, pNODEY r) {
    if (!l || !r)
        t = l ? l : r;
    else if (l->priority > r->priority)
        mergeY(l->r, l->r, r), t = l;
    else
        mergeY(r->l, l, r->l), t = r;
    pullY(t);
}
long long queY(int l, int r, pNODEY t) {    // [l, r]
    pNODEY pl, pm, pr;
    splitY(t, l-1, pl, pm); splitY(pm, r, t, pr);
    long long ret = ans(t);
    mergeY(pm, pl, t); mergeY(t, pm, pr);
    return ret;
}
void updY(int p, long long val, pNODEY &t) {
    pNODEY pl, pm, pr;
    splitY(t, p-1, pl, pm); splitY(pm, p, t, pr);
    if (t) t->val = t->ans = val;
    else t = new NODEY(p, val);
    mergeY(pm, pl, t); mergeY(t, pm, pr);
}

struct NODEX {
    NODEX *lp, *rp;     // left ptr, right ptr
    pNODEY pny;
    NODEX() : lp(NULL), rp(NULL), pny(NULL) {}
};
NODEX nx;
int NXseg[2];

void pullX(int vty, NODEX *pnx) {
    ll g1 = (!pnx->lp) ? 0LL : queY(vty, vty, pnx->lp->pny);
    ll g2 = (!pnx->rp) ? 0LL : queY(vty, vty, pnx->rp->pny);
    ll g0 = gcd2(g1, g2);
    updY(vty, g0, pnx->pny);
}
void updX(int vtx, int vty, ll val, NODEX *pnx, int l = NXseg[0], int r = NXseg[1]){
    if(l == r) { updY(vty, val, pnx->pny); return; } // leaf

    int mid = (l + r) / 2;
    if (vtx <= mid) {
        if(!pnx->lp) pnx->lp = new NODEX();
        updX(vtx, vty, val, pnx->lp, l, mid);
    } else {
        if(!pnx->rp) pnx->rp = new NODEX();
        updX(vtx, vty, val, pnx->rp, mid+1, r);
    }

    pullX(vty, pnx);
}
ll queX(int qxle, int qxri, int qyle, int qyri, NODEX *pnx, int l = NXseg[0], int r = NXseg[1]) {    // [l, r]
    if(r < qxle || l > qxri) return 0LL;
    if(qxle <= l && r <= qxri) return queY(qyle, qyri, pnx->pny);

    int mid = (l + r) / 2;
    ll g1 = (!pnx->lp) ? 0LL : queX(qxle, qxri, qyle, qyri, pnx->lp, l, mid);
    ll g2 = (!pnx->rp) ? 0LL : queX(qxle, qxri, qyle, qyri, pnx->rp, mid+1, r);
    return gcd2(g1, g2);
}

void init(int R, int C) {
    NXseg[0] = 0; NXseg[1] = C - 1;
    NYseg[0] = 0; NYseg[1] = R - 1;
}

void update(int P, int Q, long long K) {
    updX(Q, P, K, &nx);
}

long long calculate(int y10, int x10, int y20, int x20) {
    int x1 = min(x10, x20), x2 = max(x10, x20);
    int y1 = min(y10, y20), y2 = max(y10, y20);
    return queX(x1, x2, y1, y2, &nx);
}

Compilation message

game.cpp: In function 'void setIO(std::string)':
game.cpp:42:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   42 |     freopen((name+".in").c_str(),"r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
game.cpp:43:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   43 |     freopen((name+".out").c_str(),"w",stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 2 ms 364 KB Output is correct
3 Correct 2 ms 364 KB Output is correct
4 Correct 0 ms 364 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 2 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 1 ms 364 KB Output is correct
10 Correct 1 ms 364 KB Output is correct
11 Correct 1 ms 364 KB Output is correct
12 Correct 0 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 864 ms 9464 KB Output is correct
5 Correct 1075 ms 9836 KB Output is correct
6 Correct 1601 ms 6636 KB Output is correct
7 Correct 1892 ms 6508 KB Output is correct
8 Correct 949 ms 4972 KB Output is correct
9 Correct 1790 ms 6508 KB Output is correct
10 Correct 1586 ms 6124 KB Output is correct
11 Correct 1 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 2 ms 364 KB Output is correct
3 Correct 2 ms 364 KB Output is correct
4 Correct 1 ms 364 KB Output is correct
5 Correct 1 ms 364 KB Output is correct
6 Correct 2 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 1 ms 364 KB Output is correct
10 Correct 1 ms 364 KB Output is correct
11 Correct 1 ms 364 KB Output is correct
12 Correct 1793 ms 8172 KB Output is correct
13 Correct 3720 ms 3596 KB Output is correct
14 Correct 550 ms 876 KB Output is correct
15 Correct 4046 ms 4004 KB Output is correct
16 Correct 542 ms 5740 KB Output is correct
17 Correct 2275 ms 4216 KB Output is correct
18 Correct 4054 ms 6308 KB Output is correct
19 Correct 3420 ms 6548 KB Output is correct
20 Correct 3194 ms 5724 KB Output is correct
21 Correct 1 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 2 ms 364 KB Output is correct
3 Correct 2 ms 364 KB Output is correct
4 Correct 0 ms 364 KB Output is correct
5 Correct 1 ms 364 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 1 ms 364 KB Output is correct
10 Correct 1 ms 364 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 868 ms 9376 KB Output is correct
13 Correct 1077 ms 9836 KB Output is correct
14 Correct 1657 ms 6596 KB Output is correct
15 Correct 1881 ms 6252 KB Output is correct
16 Correct 963 ms 4848 KB Output is correct
17 Correct 1744 ms 6500 KB Output is correct
18 Correct 1585 ms 6328 KB Output is correct
19 Correct 1802 ms 8300 KB Output is correct
20 Correct 3717 ms 3308 KB Output is correct
21 Correct 547 ms 1132 KB Output is correct
22 Correct 4016 ms 3944 KB Output is correct
23 Correct 530 ms 5740 KB Output is correct
24 Correct 2234 ms 4204 KB Output is correct
25 Correct 4111 ms 6124 KB Output is correct
26 Correct 3479 ms 6384 KB Output is correct
27 Correct 3220 ms 5740 KB Output is correct
28 Correct 1471 ms 21100 KB Output is correct
29 Correct 2660 ms 34284 KB Output is correct
30 Correct 5300 ms 23936 KB Output is correct
31 Correct 4843 ms 20320 KB Output is correct
32 Correct 741 ms 10252 KB Output is correct
33 Correct 1106 ms 10476 KB Output is correct
34 Correct 718 ms 27884 KB Output is correct
35 Correct 2700 ms 21708 KB Output is correct
36 Correct 5415 ms 32008 KB Output is correct
37 Correct 4180 ms 32236 KB Output is correct
38 Correct 4231 ms 31592 KB Output is correct
39 Correct 3450 ms 27300 KB Output is correct
40 Correct 1 ms 492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 364 KB Output is correct
2 Correct 2 ms 364 KB Output is correct
3 Correct 2 ms 364 KB Output is correct
4 Correct 1 ms 364 KB Output is correct
5 Correct 1 ms 364 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 0 ms 364 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 1 ms 364 KB Output is correct
10 Correct 1 ms 364 KB Output is correct
11 Correct 1 ms 364 KB Output is correct
12 Correct 880 ms 9324 KB Output is correct
13 Correct 1082 ms 9708 KB Output is correct
14 Correct 1621 ms 6764 KB Output is correct
15 Correct 1948 ms 6380 KB Output is correct
16 Correct 969 ms 5100 KB Output is correct
17 Correct 1730 ms 6380 KB Output is correct
18 Correct 1537 ms 5996 KB Output is correct
19 Correct 1781 ms 8228 KB Output is correct
20 Correct 3677 ms 3300 KB Output is correct
21 Correct 554 ms 876 KB Output is correct
22 Correct 3988 ms 3692 KB Output is correct
23 Correct 525 ms 5740 KB Output is correct
24 Correct 2203 ms 4076 KB Output is correct
25 Correct 4261 ms 6272 KB Output is correct
26 Correct 3503 ms 6172 KB Output is correct
27 Correct 3178 ms 5484 KB Output is correct
28 Correct 1444 ms 21020 KB Output is correct
29 Correct 2631 ms 34412 KB Output is correct
30 Correct 5155 ms 24172 KB Output is correct
31 Correct 4607 ms 20176 KB Output is correct
32 Correct 701 ms 10192 KB Output is correct
33 Correct 1100 ms 10604 KB Output is correct
34 Correct 719 ms 28112 KB Output is correct
35 Correct 2618 ms 21556 KB Output is correct
36 Correct 5246 ms 32156 KB Output is correct
37 Correct 4175 ms 32492 KB Output is correct
38 Correct 4235 ms 31908 KB Output is correct
39 Correct 2029 ms 55040 KB Output is correct
40 Correct 4555 ms 57032 KB Output is correct
41 Correct 7891 ms 43160 KB Output is correct
42 Correct 6895 ms 34332 KB Output is correct
43 Correct 1583 ms 51820 KB Output is correct
44 Correct 1110 ms 10860 KB Output is correct
45 Correct 3456 ms 27432 KB Output is correct
46 Correct 7047 ms 56044 KB Output is correct
47 Correct 7126 ms 56036 KB Output is correct
48 Correct 6901 ms 55524 KB Output is correct
49 Correct 1 ms 364 KB Output is correct