Submission #868106

# Submission time Handle Problem Language Result Execution time Memory
868106 2023-10-30T12:39:30 Z sleepntsheep Segments (IZhO18_segments) C++17
31 / 100
869 ms 10188 KB
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2,tune=native")

#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define N 200005
#define V0 6666
int V;

int n, t, na, nc, S, id = 1;
struct line { int l, r, w; } a[N], c[N], o[N];
int e[N], f[N], we[N], wf[N], sz[V0];

inline int max(int a, int b)  { return b>a?b:a; }
inline int min(int a, int b)  { return b<a?b:a; }

int compare_length(const void *a0, const void *b0)
{
    const struct line *a = (const struct line*)a0, *b = (const struct line*)b0;
    if (a->r - a->l != b->r - b->l) return ((a->r - a->l) - (b->r - b->l));
    if (a->l != b->l) return a->l - b->l;
    return a->w - b->w;
}

int compare_left_increasing_index(const void *a0, const void *b0)
{
    const int aa = *(const int*)a0, bb = *(const int*)b0;
    if (a[aa].l != a[bb].l) return a[aa].l - a[bb].l;
    if (a[aa].r != a[bb].r) return a[aa].r - a[bb].r;
    return a[aa].w - a[bb].w;
}

int compare_right_increasing_index(const void *a0, const void *b0)
{
    const int aa = *(const int*)a0, bb = *(const int*)b0;
    if (a[aa].r != a[bb].r) return a[aa].r - a[bb].r;
    if (a[aa].l != a[bb].l) return a[aa].l - a[bb].l;
    return a[aa].w - a[bb].w;
}

inline void rebuild()
{
    for (; nc;) a[na++] = c[--nc];
    qsort(a, na, sizeof *a, compare_length);
    memset(sz, 0, sizeof *sz * (na / V + 1));
    for (int i = 0; i < na; ++i) e[i] = f[i] = i, ++sz[i/V];
    for (int i = 0; i * V <= na; ++i)
    {
        qsort(e+i*V, sz[i], sizeof *e, compare_left_increasing_index);
        qsort(f+i*V, sz[i], sizeof *f, compare_right_increasing_index);

        we[i*V+sz[i]-1] = a[e[i*V+sz[i]-1]].w;
        for (int j = i*V+sz[i]-1; --j >= i*V;) we[j] = we[j+1] + a[e[j]].w;
        wf[i*V] = a[f[i*V]].w;
        for (int j = i*V+1; j < i*V+sz[i]; ++j) wf[j] = wf[j-1] + a[f[j]].w;
    }
}

int main(void)
{
    scanf("%d%d", &n, &t);
    V = sqrt(n * log2(n));

    for (int z = 0, lastans = 0, op, x, y, k, l, r; n--;)
    {
        scanf("%d%d", &op, &x);
        if (op == 1)
        {
            scanf("%d", &y);
            l = x ^ (t * lastans), r = y ^ (t * lastans);
            if (l>r) { int t=l;l=r;r=t;}
            o[id++] = c[nc++] = (struct line){l, r, 1};
            if (nc == V) rebuild();
            ++S;
        }
        else if (op == 2)
        {
            c[nc++] = (struct line){o[x].l, o[x].r, -1};
            if (nc == V) rebuild();
            --S;
        }
        else
        {
            scanf("%d%d", &y, &k); z=0;
            l = x ^ (t * lastans), r = y ^ (t * lastans);
            if (l>r) { int t=l;l=r;r=t;}
            /* count in static */
            {
                int Z = -1;
                for (int L = 0, R = na-1; L <= R; )
                {
                    int M = (L+R)/2;
                    if (a[M].r - a[M].l + 1 >= k) R = M - 1, Z = M;
                    else L = M + 1;
                }
                if (Z != -1)
                {
                    z -= Z;
                    int zb = Z/V, sb = zb+1;
                    for (struct line *j = a + Z; j < a + sb * V; ++j) if (j->r < l + k - 1 || j->l > r - k + 1) z -= j->w;
                    for (int j = sb; j * V <= na; ++j)
                    {
                        /* r - j->l + 1 < k === j->l > r - k + 1 */
                        int cnt = 0;
                        for (int L = 0, R = sz[j]-1; L <= R;)
                        {
                            int M = (L+R)/2;
                            if (a[e[j*V+M]].l > r - k + 1) R = M - 1, cnt = we[j*V+M];
                            else L = M + 1;
                        }
                        z -= cnt;
                        cnt = 0;
                        /* j->r - l + 1 < k === j->l < k + l - 1 */
                        for (int L = 0, R = sz[j]-1; L <= R;)
                        {
                            int M = (L+R)/2;
                            if (a[f[j*V+M]].r < k + l - 1) L = M + 1, cnt = wf[j*V+M];
                            else R = M - 1;
                        }
                        z -= cnt;
                    }
                }
            }

            /* count in buffer */
            for (struct line *j = c; j < c + nc; ++j)
            {
                if (min(j->r, r) - max(j->l, l) + 1 < k) z -= j->w;
                //if (j->r < l + k - 1 || j->l > r - k + 1) z -= j->w;
            }
            lastans = (z += S);
            printf("%d\n", z);
        }
    }
    return 0;
}

Compilation message

segments.cpp: In function 'int main()':
segments.cpp:64:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |     scanf("%d%d", &n, &t);
      |     ~~~~~^~~~~~~~~~~~~~~~
segments.cpp:69:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |         scanf("%d%d", &op, &x);
      |         ~~~~~^~~~~~~~~~~~~~~~~
segments.cpp:72:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   72 |             scanf("%d", &y);
      |             ~~~~~^~~~~~~~~~
segments.cpp:87:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |             scanf("%d%d", &y, &k); z=0;
      |             ~~~~~^~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Incorrect 6 ms 6488 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 507 ms 9324 KB Output is correct
2 Correct 506 ms 9320 KB Output is correct
3 Correct 507 ms 9556 KB Output is correct
4 Correct 534 ms 9436 KB Output is correct
5 Correct 830 ms 9920 KB Output is correct
6 Correct 853 ms 10068 KB Output is correct
7 Correct 512 ms 9544 KB Output is correct
8 Correct 514 ms 9588 KB Output is correct
9 Correct 497 ms 9356 KB Output is correct
10 Correct 234 ms 9492 KB Output is correct
11 Correct 291 ms 9112 KB Output is correct
12 Correct 652 ms 9824 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 476 ms 9676 KB Output is correct
2 Correct 492 ms 9672 KB Output is correct
3 Correct 488 ms 10072 KB Output is correct
4 Correct 479 ms 9664 KB Output is correct
5 Correct 733 ms 9644 KB Output is correct
6 Correct 668 ms 9460 KB Output is correct
7 Correct 703 ms 9784 KB Output is correct
8 Correct 845 ms 9984 KB Output is correct
9 Correct 869 ms 10132 KB Output is correct
10 Correct 801 ms 10028 KB Output is correct
11 Correct 514 ms 9688 KB Output is correct
12 Correct 812 ms 9944 KB Output is correct
13 Correct 742 ms 9984 KB Output is correct
14 Correct 611 ms 9768 KB Output is correct
15 Correct 595 ms 9800 KB Output is correct
16 Correct 546 ms 9820 KB Output is correct
17 Correct 588 ms 9544 KB Output is correct
18 Correct 593 ms 9372 KB Output is correct
19 Correct 589 ms 9576 KB Output is correct
20 Correct 588 ms 9368 KB Output is correct
21 Correct 531 ms 9740 KB Output is correct
22 Correct 696 ms 10168 KB Output is correct
23 Correct 764 ms 9988 KB Output is correct
24 Correct 702 ms 9856 KB Output is correct
25 Correct 478 ms 9708 KB Output is correct
26 Correct 480 ms 9896 KB Output is correct
27 Correct 478 ms 9680 KB Output is correct
28 Correct 483 ms 9660 KB Output is correct
29 Correct 768 ms 10188 KB Output is correct
30 Correct 765 ms 9804 KB Output is correct
31 Correct 865 ms 9924 KB Output is correct
32 Correct 799 ms 9992 KB Output is correct
33 Correct 752 ms 9800 KB Output is correct
34 Correct 585 ms 9748 KB Output is correct
35 Correct 696 ms 9788 KB Output is correct
36 Correct 779 ms 9916 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 449 ms 9792 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Incorrect 6 ms 6488 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Incorrect 6 ms 6488 KB Output isn't correct
4 Halted 0 ms 0 KB -