답안 #874423

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
874423 2023-11-17T00:31:51 Z sleepntsheep Growing Trees (BOI11_grow) C
100 / 100
167 ms 3496 KB
#include <stdio.h>
#include <stdlib.h>

#define INLINE inline __attribute__((always_inline))
#define assert_(x) if (!(x)) __builtin_trap()

#define N 100001

unsigned seed = 0xcb1898af;

INLINE unsigned rand_(void)
{
    return (seed = (seed * 3)) >> 1;
}

int A[N], B[N], S[N], L[N], R[N], D[N], AT;

INLINE int treap(int x)
{
    A[++AT] = x; B[AT] = rand_(); S[AT] = 1;
    return AT;
}

INLINE void pull(int v)
{
    S[v] = 1 + S[L[v]] + S[R[v]];
}

INLINE void push(int v)
{
    if (v && D[v])
    {
        A[v] += D[v];
        D[L[v]] += D[v];
        D[R[v]] += D[v];
        D[v] = 0;
    }
}

void spliti(int v, int *l, int *r, int ind)
{
    if (!v) { *l=*r=0; return; }
    push(v);

    if (S[L[v]] < ind)
    {
        spliti(R[v], R+v, r, ind - S[L[v]] - 1);
        *l = v;
    }
    else
    {
        spliti(L[v], l, L+v, ind);
        *r = v;
    }
    pull(v);
}

void merge(int *v, int l, int r)
{
    if (!l || !r) { *v = l^r; return; }

    push(l), push(r);

    if (B[l] < B[r])
    {
        merge(L+r, l, L[r]);
        *v = r;
    }
    else
    {
        merge(R+l, R[l], r);
        *v = l;
    }

    pull(*v);
}

int order(int v, int k)
{
    if (!v) return 0;

    push(v);
    if (A[v] < k) return 1 + S[L[v]] + order(R[v], k);
    return order(L[v], k);
}

int n, q, t;
char op;

INLINE int H(int v)
{
    int c = v;
    while (R[c]) c = R[c];
    return A[c];
}

INLINE void fertilize(int s, int h)
{
    int j = order(t, h);
    int y1 = 0, y2 = 0, y3 = 0, y4 = 0, y5 = 0, y6 = 0, y7 = 0, y8 = 0;
    spliti(t, &y1, &y2, j);
    spliti(y2, &y3, &y4, s);
    int x = H(y3);
    int aa = S[y3] - order(y3, x);
    int bb = order(y4, x+1);
    spliti(y3, &y5, &y6, S[y3] - aa);
    spliti(y4, &y7, &y8, bb);

    ++D[y5]; ++D[y6];
    push(y5);
    push(y6);

    merge(&y4, y6, y8);
    merge(&y3, y5, y7);
    merge(&y2, y3, y4);
    merge(&t, y1, y2);
}

INLINE void query(int x, int y)
{
    printf("%d\n", order(t, y+1) - order(t, x));
}

int a[N];
int cmpr(const void *a, const void *b)
{
    return *(const int*)a - *(const int*)b;
}

int main(void)
{
    scanf("%d%d", &n, &q);
    for (int i = 0; i < n; ++i) scanf("%d", a+i);
    qsort(a, n, sizeof *a, cmpr);
    for (int i = 0; i < n; ++i) merge(&t, t, treap(a[i]));

    for (int x, y, i = 0; i < q; ++i)
    {
        scanf(" %c%d%d", &op, &x, &y);
        if (op == 'F') fertilize(x, y);
        else query(x, y);
    }
    return 0;
}

Compilation message

grow.c: In function 'main':
grow.c:132:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  132 |     scanf("%d%d", &n, &q);
      |     ^~~~~~~~~~~~~~~~~~~~~
grow.c:133:33: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  133 |     for (int i = 0; i < n; ++i) scanf("%d", a+i);
      |                                 ^~~~~~~~~~~~~~~~
grow.c:139:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  139 |         scanf(" %c%d%d", &op, &x, &y);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 101 ms 3056 KB Output is correct
2 Correct 128 ms 2808 KB Output is correct
3 Correct 66 ms 2844 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 2 ms 348 KB Output is correct
3 Correct 2 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 38 ms 604 KB Output is correct
6 Correct 47 ms 1104 KB Output is correct
7 Correct 5 ms 604 KB Output is correct
8 Correct 25 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 848 KB Output is correct
2 Correct 46 ms 848 KB Output is correct
3 Correct 2 ms 600 KB Output is correct
4 Correct 27 ms 812 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 860 KB Output is correct
2 Correct 52 ms 820 KB Output is correct
3 Correct 9 ms 604 KB Output is correct
4 Correct 46 ms 964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 95 ms 2268 KB Output is correct
2 Correct 136 ms 2508 KB Output is correct
3 Correct 15 ms 860 KB Output is correct
4 Correct 72 ms 2364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 122 ms 2444 KB Output is correct
2 Correct 135 ms 2708 KB Output is correct
3 Correct 74 ms 2368 KB Output is correct
4 Correct 14 ms 860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 93 ms 2796 KB Output is correct
2 Correct 107 ms 3056 KB Output is correct
3 Correct 75 ms 2592 KB Output is correct
4 Correct 18 ms 860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 130 ms 2876 KB Output is correct
2 Correct 138 ms 2732 KB Output is correct
3 Correct 41 ms 3168 KB Output is correct
4 Correct 69 ms 2808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 125 ms 2800 KB Output is correct
2 Correct 145 ms 3100 KB Output is correct
3 Correct 167 ms 3140 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 96 ms 3496 KB Output is correct