답안 #365215

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
365215 2021-02-11T09:06:56 Z Berted 게임 (IOI13_game) C++17
100 / 100
6386 ms 48084 KB
#include "game.h"

#include <iostream>
#include <algorithm>
#include <vector>
#include <array>

#define ll long long
#define pii pair<int, int>
#define ppi pair<pii, ll>
#define fst first
#define snd second

using namespace std;

inline ll GCD(ll X, ll Y) 
{
    ll tmp;
    while (X != Y && Y != 0) 
    {
        tmp = X;
        X = Y;
        Y = tmp % Y;
    }
    return X;
}

namespace seg
{
    int r, c;

    vector<pii> Cx; vector<int> Rx;
    pii C[10000000]; int keep[10000001]; 
    ll val[10000000]; 

    int SSZ = 0;

    inline int newNode()
    {
        C[SSZ] = {-1, -1}; keep[SSZ] = -2; SSZ++;
        return SSZ - 1;
    }

    inline int newLine()
    {
        Cx.push_back({-1, -1}); Rx.push_back(-1);
        Rx.back() = newNode();
        return Cx.size() - 1;
    }

    inline void checkChildX(int u, bool b)
    {
        if (b && Cx[u].fst == -1)
        {
            int rr = newLine();
            Cx[u].fst = rr;
        }
        if (!b && Cx[u].snd == -1)
        {
            int rr = newLine();
            Cx[u].snd = rr;
        }
    }

    inline void checkChildY(int u, bool b)
    {
        if (b && C[u].fst == -1)
        {
            int idx = newNode();
            C[u].fst = idx;
        }
        if (!b && C[u].snd == -1)
        {
            int idx = newNode();
            C[u].snd = idx;
        }
    }

    inline int getRoot(int u)
    {
        if (u == -1) {return -1;}
        else {return Rx[u];}
    }

    inline int getChild(int u, bool b)
    {
        if (u == -1) {return -1;}
        else if (b) {return C[u].fst;}
        else {return C[u].snd;}
    }

    inline ll getVal(int u)
    {
        if (u == -1) {return 0;}
        return val[u];
    }

    void updateY(int u, int L, int R, int x, ll v)
    {
        if (L < R && (keep[u] != -2 && keep[u] != x))
        {
            int M = L + R >> 1;
            if (keep[u] != -1)
            {
                checkChildY(u, keep[u] <= M);
                if (keep[u] <= M)
                {
                    val[C[u].fst] = val[u];
                    keep[C[u].fst] = keep[u];
                }
                else
                {
                    val[C[u].snd] = val[u];
                    keep[C[u].snd] = keep[u];
                }
                keep[u] = -1;
            }
            
            checkChildY(u, x <= M);
            if (x <= M) updateY(C[u].fst, L, M, x, v);
            else updateY(C[u].snd, M + 1, R, x, v);
            val[u] = GCD(getVal(C[u].fst), getVal(C[u].snd));
        }
        else {keep[u] = x; val[u] = v;}
    }

    ll queryY(int u, int L, int R, int l, int r)
    {
        l = max(L, l); r = min(R, r);
        if (u == -1) {return 0;}
        if (l <= r)
        {
            if (L == l && R == r) {return val[u];}
            else if (keep[u] != -1)
            {
                if (l <= keep[u] && keep[u] <= r) return val[u];
                else return 0;
            }
            else
            {
                int M = L + R >> 1;
                return GCD(queryY(C[u].fst, L, M, l, r), queryY(C[u].snd, M + 1, R, l, r));
            }
        }
        return 0;
    }

    void updateX(int u, int L, int R, int x, int y, ll v)
    {
        if (L < R)
        {
            int M = L + R >> 1;
            checkChildX(u, x <= M);
            if (x <= M) updateX(Cx[u].fst, L, M, x, y, v);
            else updateX(Cx[u].snd, M + 1, R, x, y, v);
            v = GCD(queryY(getRoot(Cx[u].fst), 0, r - 1, y, y), queryY(getRoot(Cx[u].snd), 0, r - 1, y, y));
        }
        updateY(Rx[u], 0, r - 1, y, v);
    }

    

    ll queryX(int u, int L, int R, int lx, int rx, int ly, int ry)
    {
        lx = max(lx, L); rx = min(rx, R);
        if (u == -1) return 0;
        if (lx <= rx)
        {
            if (L == lx && R == rx) {return queryY(Rx[u], 0, r - 1, ly, ry);}
            else
            {
                int M = L + R >> 1;
                return GCD(queryX(Cx[u].fst, L, M, lx, rx, ly, ry), queryX(Cx[u].snd, M + 1, R, lx, rx, ly, ry));
            }
        }
        return 0;
    }
}

void init(int R, int C) 
{
    seg :: r = R; seg :: c = C;
    seg :: newLine();
}

void update(int P, int Q, ll K) 
{
    seg :: updateX(0, 0, seg :: c - 1, Q, P, K);
}

long long calculate(int P, int Q, int U, int V) 
{
    return seg :: queryX(0, 0, seg :: c - 1, Q, V, P, U);
}

Compilation message

game.cpp: In function 'void seg::updateY(int, int, int, int, long long int)':
game.cpp:102:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  102 |             int M = L + R >> 1;
      |                     ~~^~~
game.cpp: In function 'long long int seg::queryY(int, int, int, int, int)':
game.cpp:141:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  141 |                 int M = L + R >> 1;
      |                         ~~^~~
game.cpp: In function 'void seg::updateX(int, int, int, int, int, long long int)':
game.cpp:152:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  152 |             int M = L + R >> 1;
      |                     ~~^~~
game.cpp: In function 'long long int seg::queryX(int, int, int, int, int, int, int)':
game.cpp:172:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  172 |                 int M = L + R >> 1;
      |                         ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 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 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 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 1 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 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 563 ms 11940 KB Output is correct
5 Correct 603 ms 11756 KB Output is correct
6 Correct 586 ms 9188 KB Output is correct
7 Correct 774 ms 8948 KB Output is correct
8 Correct 462 ms 7912 KB Output is correct
9 Correct 688 ms 9060 KB Output is correct
10 Correct 690 ms 8676 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 1 ms 396 KB Output is correct
3 Correct 1 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 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 999 ms 11960 KB Output is correct
13 Correct 1684 ms 6988 KB Output is correct
14 Correct 334 ms 5612 KB Output is correct
15 Correct 1998 ms 8256 KB Output is correct
16 Correct 228 ms 9528 KB Output is correct
17 Correct 747 ms 8856 KB Output is correct
18 Correct 1159 ms 11032 KB Output is correct
19 Correct 1030 ms 11372 KB Output is correct
20 Correct 959 ms 10732 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 1 ms 364 KB Output is correct
3 Correct 1 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 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 559 ms 11748 KB Output is correct
13 Correct 620 ms 11620 KB Output is correct
14 Correct 579 ms 9188 KB Output is correct
15 Correct 813 ms 9040 KB Output is correct
16 Correct 433 ms 8040 KB Output is correct
17 Correct 661 ms 9060 KB Output is correct
18 Correct 633 ms 8808 KB Output is correct
19 Correct 1042 ms 12036 KB Output is correct
20 Correct 1667 ms 7208 KB Output is correct
21 Correct 332 ms 5740 KB Output is correct
22 Correct 2013 ms 8172 KB Output is correct
23 Correct 207 ms 9672 KB Output is correct
24 Correct 695 ms 8812 KB Output is correct
25 Correct 1121 ms 11016 KB Output is correct
26 Correct 1030 ms 11208 KB Output is correct
27 Correct 939 ms 10680 KB Output is correct
28 Correct 590 ms 27740 KB Output is correct
29 Correct 1416 ms 27100 KB Output is correct
30 Correct 4630 ms 23296 KB Output is correct
31 Correct 4294 ms 19804 KB Output is correct
32 Correct 787 ms 10476 KB Output is correct
33 Correct 949 ms 11824 KB Output is correct
34 Correct 269 ms 20956 KB Output is correct
35 Correct 970 ms 17816 KB Output is correct
36 Correct 1993 ms 25308 KB Output is correct
37 Correct 1490 ms 25352 KB Output is correct
38 Correct 1412 ms 24944 KB Output is correct
39 Correct 1248 ms 22112 KB Output is correct
40 Correct 1 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 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 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 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 564 ms 11804 KB Output is correct
13 Correct 586 ms 11752 KB Output is correct
14 Correct 575 ms 9320 KB Output is correct
15 Correct 646 ms 9060 KB Output is correct
16 Correct 475 ms 8040 KB Output is correct
17 Correct 631 ms 9144 KB Output is correct
18 Correct 648 ms 8676 KB Output is correct
19 Correct 958 ms 12012 KB Output is correct
20 Correct 1713 ms 7200 KB Output is correct
21 Correct 400 ms 5612 KB Output is correct
22 Correct 1977 ms 8300 KB Output is correct
23 Correct 229 ms 9580 KB Output is correct
24 Correct 730 ms 8884 KB Output is correct
25 Correct 1158 ms 11136 KB Output is correct
26 Correct 1062 ms 11176 KB Output is correct
27 Correct 929 ms 10584 KB Output is correct
28 Correct 598 ms 27848 KB Output is correct
29 Correct 1455 ms 27236 KB Output is correct
30 Correct 4655 ms 23216 KB Output is correct
31 Correct 4350 ms 19584 KB Output is correct
32 Correct 757 ms 10456 KB Output is correct
33 Correct 963 ms 12020 KB Output is correct
34 Correct 257 ms 20828 KB Output is correct
35 Correct 949 ms 18148 KB Output is correct
36 Correct 2068 ms 25076 KB Output is correct
37 Correct 1505 ms 25272 KB Output is correct
38 Correct 1498 ms 24812 KB Output is correct
39 Correct 839 ms 48084 KB Output is correct
40 Correct 2399 ms 42584 KB Output is correct
41 Correct 6386 ms 41764 KB Output is correct
42 Correct 5626 ms 33300 KB Output is correct
43 Correct 468 ms 37204 KB Output is correct
44 Correct 1109 ms 11004 KB Output is correct
45 Correct 1165 ms 22172 KB Output is correct
46 Correct 2441 ms 41260 KB Output is correct
47 Correct 2552 ms 41264 KB Output is correct
48 Correct 2542 ms 41236 KB Output is correct
49 Correct 1 ms 364 KB Output is correct