답안 #69240

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
69240 2018-08-20T10:12:58 Z junhopark 게임 (IOI13_game) C++14
63 / 100
11230 ms 257024 KB
#include <bits/stdc++.h>
#include "game.h"
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
int n, m, p, u;
struct node {int l, r; };
struct node2
{
    LL val;
    int l, r;
};
vector<node> seg;
vector<vector<node2> > tree;
LL gcd2(LL x, LL y)
{
    LL z;
    while (y) {
        z=x;
        x=y;
        y=z%y;
    }
    return x;
}
void make_tree()
{
    tree.push_back(vector<node2>(0));
    tree[tree.size()-1].push_back((node2){0, -1, -1});
}
void init(int R, int C)
{
    n = R, m = C;
    seg.push_back((node){-1, -1});
    make_tree();
}
void updatetree(int si, int ei, int pl, int ind, LL value, int pp)
{
    if (si>pl||ei<pl||ind<0||pp<0) return;
    if (si==ei) {
        tree[pp][ind].val=value;
        return;
    }
    int mi = (si+ei)>>1;
    if (pl>mi) {
        if (tree[pp][ind].r<0) {
            tree[pp][ind].r=tree[pp].size();
            tree[pp].push_back((node2){0, -1, -1});
        }
        updatetree(mi+1, ei, pl, tree[pp][ind].r, value, pp);
        if (tree[pp][ind].l<0) tree[pp][ind].val=tree[pp][tree[pp][ind].r].val;
        else tree[pp][ind].val=__gcd(tree[pp][tree[pp][ind].r].val, tree[pp][tree[pp][ind].l].val);
    }
    else {
        if (tree[pp][ind].l<0) {
            tree[pp][ind].l=tree[pp].size();
            tree[pp].push_back((node2){0, -1, -1});
        }
        updatetree(si, mi, pl, tree[pp][ind].l, value, pp);
        if (tree[pp][ind].r<0) tree[pp][ind].val=tree[pp][tree[pp][ind].l].val;
        else tree[pp][ind].val=gcd2(tree[pp][tree[pp][ind].r].val, tree[pp][tree[pp][ind].l].val);
    }
}
void mergeseg(int si, int ei, int pl, int ind, int pp, int lp, int rp, int ldx, int rdx)
{
    if (si>pl||ei<pl||ind<0||pp<0) return;
    if (si==ei) {
        if ((ldx<0&&rdx<0)||(lp<0&&rp<0)) tree[pp][ind].val=0;
        else if (ldx<0||lp<0) tree[pp][ind].val=tree[rp][rdx].val;
        else if (rdx<0||rp<0) tree[pp][ind].val=tree[lp][ldx].val;
        else tree[pp][ind].val=gcd2(tree[lp][ldx].val, tree[rp][rdx].val);
        return;
    }
    if (ldx<0&&rdx<0) return;
    if (lp<0&&rp<0) return;
    int mi = (si+ei)>>1;
    if (pl>mi) {
        if (tree[pp][ind].r<0) {
            tree[pp][ind].r=tree[pp].size();
            tree[pp].push_back((node2){0, -1, -1});
        }
        if (ldx<0||lp<0) mergeseg(mi+1, ei, pl, tree[pp][ind].r, pp, lp, rp, -1, tree[rp][rdx].r);
        else if (rdx<0||rp<0) mergeseg(mi+1, ei, pl, tree[pp][ind].r, pp, lp, rp, tree[lp][ldx].r, -1);
        else mergeseg(mi+1, ei, pl, tree[pp][ind].r, pp, lp, rp, tree[lp][ldx].r, tree[rp][rdx].r);
    }
    else {
        if (tree[pp][ind].l<0) {
            tree[pp][ind].l=tree[pp].size();
            tree[pp].push_back((node2){0, -1, -1});
        }
        if (ldx<0||lp<0) mergeseg(si, mi, pl, tree[pp][ind].l, pp, lp, rp, -1, tree[rp][rdx].l);
        else if (rdx<0||rp<0) mergeseg(si, mi, pl, tree[pp][ind].l, pp, lp, rp, tree[lp][ldx].l, -1);
        else mergeseg(si, mi, pl, tree[pp][ind].l, pp, lp, rp, tree[lp][ldx].l, tree[rp][rdx].l);
    }
    if (ldx<0||lp<0) tree[pp][ind].val=tree[rp][rdx].val;
    else if (rdx<0||rp<0) tree[pp][ind].val=tree[lp][ldx].val;
    else tree[pp][ind].val=gcd2(tree[lp][ldx].val, tree[rp][rdx].val);
}
void updateseg(int si, int ei, int pl, int ind, LL value)
{
    if (si>pl||ei<pl||ind<0) return;
    if (si==ei) {
        updatetree(0, n-1, p, 0, value, ind);
        return;
    }
    int mi = (si+ei)>>1;
    if (pl>mi) {
        if (seg[ind].r<0) {
            seg[ind].r=seg.size();
            seg.push_back((node){-1, -1});
            make_tree();
        }
        updateseg(mi+1, ei, pl, seg[ind].r, value);
        mergeseg(0, n-1, p, 0, ind, seg[ind].l, seg[ind].r, 0, 0);
    }
    else {
        if (seg[ind].l<0) {
            seg[ind].l=seg.size();
            seg.push_back((node){-1, -1});
            make_tree();
        }
        updateseg(si, mi, pl, seg[ind].l, value);
        mergeseg(0, n-1, p, 0, ind, seg[ind].l, seg[ind].r, 0, 0);
    }
}
void update(int P, int Q, LL K)
{
    p = P;
    updateseg(0, m-1, Q, 0, K);
}
LL get_gcd2(int si, int ei, int s, int e, int ind, int pl)
{
    if (si>e||ei<s||ind<0||pl<0) return 0;
    if (si>=s&&ei<=e) return tree[pl][ind].val;
    int mi = (si+ei)>>1;
    return gcd2(get_gcd2(si, mi, s, e, tree[pl][ind].l, pl), get_gcd2(mi+1, ei, s, e, tree[pl][ind].r, pl));
}
LL get_gcd(int si, int ei, int s, int e, int ind)
{
    if (si>e||ei<s||ind<0) return 0;
    if (si>=s&&ei<=e) return get_gcd2(0, n-1, p, u, 0, ind);
    int mi = (si+ei)>>1;
    return gcd2(get_gcd(si, mi, s, e, seg[ind].l), get_gcd(mi+1, ei, s, e, seg[ind].r));
}
LL calculate(int P, int Q, int U, int V)
{
    p = P, u = U;
    return get_gcd(0, m-1, Q, V, 0);
}
/*int main()
{
    freopen("input.txt", "r", stdin);
    int R, C, N, i, P, Q, K, U, V, tp;
    scanf("%d %d %d", &R, &C, &N);
    init(R, C);
    for (i=1; i<=N; i++) {
        scanf("%d", &tp);
        if (tp==1) {
            scanf("%d %d %d", &P, &Q, &K);
            update(P, Q, K);
        }
        else {
            scanf("%d %d %d %d", &P, &Q, &U, &V);
            printf("%lld\n", calculate(P, Q, U, V));
        }
    }
}*/

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;
      ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 376 KB Output is correct
2 Correct 3 ms 492 KB Output is correct
3 Correct 2 ms 544 KB Output is correct
4 Correct 2 ms 544 KB Output is correct
5 Correct 2 ms 544 KB Output is correct
6 Correct 3 ms 544 KB Output is correct
7 Correct 3 ms 568 KB Output is correct
8 Correct 3 ms 580 KB Output is correct
9 Correct 4 ms 592 KB Output is correct
10 Correct 3 ms 596 KB Output is correct
11 Correct 2 ms 616 KB Output is correct
12 Correct 2 ms 616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 616 KB Output is correct
2 Correct 2 ms 616 KB Output is correct
3 Correct 2 ms 616 KB Output is correct
4 Correct 977 ms 16788 KB Output is correct
5 Correct 1136 ms 20992 KB Output is correct
6 Correct 1022 ms 22536 KB Output is correct
7 Correct 1246 ms 27152 KB Output is correct
8 Correct 686 ms 28568 KB Output is correct
9 Correct 1131 ms 36004 KB Output is correct
10 Correct 1376 ms 40540 KB Output is correct
11 Correct 2 ms 40540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 40540 KB Output is correct
2 Correct 4 ms 40540 KB Output is correct
3 Correct 3 ms 40540 KB Output is correct
4 Correct 2 ms 40540 KB Output is correct
5 Correct 3 ms 40540 KB Output is correct
6 Correct 3 ms 40540 KB Output is correct
7 Correct 2 ms 40540 KB Output is correct
8 Correct 3 ms 40540 KB Output is correct
9 Correct 3 ms 40540 KB Output is correct
10 Correct 2 ms 40540 KB Output is correct
11 Correct 2 ms 40540 KB Output is correct
12 Correct 1782 ms 48468 KB Output is correct
13 Correct 3161 ms 48468 KB Output is correct
14 Correct 421 ms 48468 KB Output is correct
15 Correct 3702 ms 48468 KB Output is correct
16 Correct 276 ms 49012 KB Output is correct
17 Correct 1351 ms 49012 KB Output is correct
18 Correct 2215 ms 49452 KB Output is correct
19 Correct 2029 ms 49632 KB Output is correct
20 Correct 1770 ms 49632 KB Output is correct
21 Correct 2 ms 49632 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 49632 KB Output is correct
2 Correct 4 ms 49632 KB Output is correct
3 Correct 3 ms 49632 KB Output is correct
4 Correct 4 ms 49632 KB Output is correct
5 Correct 2 ms 49632 KB Output is correct
6 Correct 6 ms 49632 KB Output is correct
7 Correct 2 ms 49632 KB Output is correct
8 Correct 3 ms 49632 KB Output is correct
9 Correct 3 ms 49632 KB Output is correct
10 Correct 3 ms 49632 KB Output is correct
11 Correct 3 ms 49632 KB Output is correct
12 Correct 1403 ms 50048 KB Output is correct
13 Correct 1237 ms 50384 KB Output is correct
14 Correct 1456 ms 50384 KB Output is correct
15 Correct 1819 ms 50384 KB Output is correct
16 Correct 1065 ms 50384 KB Output is correct
17 Correct 1806 ms 50384 KB Output is correct
18 Correct 1733 ms 50384 KB Output is correct
19 Correct 2198 ms 50788 KB Output is correct
20 Correct 3926 ms 50788 KB Output is correct
21 Correct 545 ms 50788 KB Output is correct
22 Correct 4488 ms 50788 KB Output is correct
23 Correct 410 ms 51524 KB Output is correct
24 Correct 2012 ms 51524 KB Output is correct
25 Correct 3449 ms 51956 KB Output is correct
26 Correct 2931 ms 52112 KB Output is correct
27 Correct 2606 ms 52112 KB Output is correct
28 Correct 1743 ms 195452 KB Output is correct
29 Correct 4253 ms 221748 KB Output is correct
30 Correct 11175 ms 221748 KB Output is correct
31 Correct 11230 ms 221748 KB Output is correct
32 Correct 1163 ms 221748 KB Output is correct
33 Correct 1534 ms 221748 KB Output is correct
34 Runtime error 1112 ms 257024 KB Memory limit exceeded: We have a known bug that the memory usage is measured incorrectly (possibly because of Meltdown/Spectre patch), so your solution may be correct. Please submit again. Sorry for the inconvenience.
35 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3 ms 257024 KB Memory limit exceeded: We have a known bug that the memory usage is measured incorrectly (possibly because of Meltdown/Spectre patch), so your solution may be correct. Please submit again. Sorry for the inconvenience.
2 Halted 0 ms 0 KB -