답안 #954120

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
954120 2024-03-27T10:18:00 Z LucaIlie Dynamic Diameter (CEOI19_diameter) C++17
49 / 100
4627 ms 133776 KB
#include <bits/stdc++.h>

#pragma GCC optimize("Ofast")

using namespace std;

struct edge {
    int u, v;
    long long w;

    int other( int x ) {
        return u ^ v ^ x;
    }
};

const int MAX_N = 1e5;
edge edges[MAX_N];
vector<int> adj[MAX_N + 1];

bool isCentroid[MAX_N + 1];
int sz[MAX_N + 1];

void calcSizes( int u, int p ) {
    sz[u] = 1;
    for ( int e: adj[u] ) {
        int v = edges[e].other( u );
        if ( v == p || isCentroid[v] )
            continue;
        calcSizes( v, u );
        sz[u] += sz[v];
    }


}

int totSz;
int findCentroid( int u, int p ) {
    int c = 0, maxSz = totSz - sz[u];
    for ( int e: adj[u] ) {
        int v = edges[e].other( u );
        if ( v == p || isCentroid[v] )
            continue;
        int d = findCentroid( v, u );
        if ( d != 0 )
            c = d;
        maxSz = max( maxSz, sz[v] );
    }
    if ( maxSz <= totSz / 2 )
        c = u;
    return c;
}

int leafs[MAX_N + 1];
vector<int> centroids[MAX_N], heads[MAX_N + 1];
vector<pair<int, int>> head[MAX_N + 1], leftPos[MAX_N + 1], rightPos[MAX_N + 1];
int crtPos;

void dfs( int u, int p, int c, int h ) {

    int children = 0;
    for ( int e: adj[u] ) {
        int v = edges[e].other( u );
        if ( v == p || isCentroid[v] )
            continue;

        centroids[e].push_back( c );
        head[c].push_back( { e, h } );
        leftPos[c].push_back( { e, crtPos } );
        dfs( v, u, c, h );
        rightPos[c].push_back( { e, crtPos - 1 } );
        children++;
    }

    if ( children == 0 )
        crtPos++;
}

void decomp( int r ) {
    calcSizes( r, 0 );
    totSz = sz[r];
    int c = findCentroid( r, 0 );

    crtPos = 0;
    for ( int e: adj[c] ) {
        int v = edges[e].other( c );
        if ( isCentroid[v] )
            continue;

        centroids[e].push_back( c );
        heads[c].push_back( e );
        head[c].push_back( { e, e } );
        leftPos[c].push_back( { e, crtPos } );
        dfs( v, c, c, e );
        rightPos[c].push_back( { e, crtPos - 1 } );
    }
    sort( head[c].begin(), head[c].end() );
    sort( leftPos[c].begin(), leftPos[c].end() );
    sort( rightPos[c].begin(), rightPos[c].end() );

    leafs[c] = crtPos;

    isCentroid[c] = true;
    for ( int e: adj[c] ) {
        int v = edges[e].other( c );
        if ( isCentroid[v] )
            continue;
        decomp( v );
    }
}

multiset<int> diameterByCentroid[MAX_N + 1], allDiameters;

int findElem( vector<pair<int, int>> &v, int x ) {
    int st = 0, dr = v.size();
    while ( dr - st > 1 ) {
        int mij = (st + dr) / 2;

        if ( v[mij].first > x )
            dr = mij;
        else
            st = mij;
    }
    return v[st].second;
}

struct SegTree {
    int ll, rr;
    vector<long long> segTree, lazy;

    void propag( int v, int l, int r ) {
        segTree[v] += lazy[v];
        if ( l != r ) {
            lazy[v * 2 + 1] += lazy[v];
            lazy[v * 2 + 2] += lazy[v];
        }
        lazy[v] = 0;
    }

    void init( int l, int r ) {
        ll = l;
        rr = r;
        segTree.resize( 4 * (r - l + 1) );
        lazy.resize( 4 * (r - l + 1) );
    }

    void update( int v, int l, int r, int lu, int ru, long long x ) {
        propag( v, l, r );

        if ( l > ru || r < lu )
            return;

        if ( lu <= l && r <= ru ) {
            lazy[v] = x;
            propag( v, l, r );
            return;
        }

        int mid = (l + r) / 2;
        update( v * 2 + 1, l, mid, lu, ru, x );
        update( v * 2 + 2, mid + 1, r, lu, ru, x );
        segTree[v] = max( segTree[v * 2 + 1], segTree[v * 2 + 2] );
    }

    void update( int l, int r, long long x ) {
        update( 0, ll, rr, l, r, x );
    }

    long long query( int v, int l, int r, int lq, int rq ) {
        if ( l > rq || r < lq )
            return 0;

        if ( lq <= l && r <= rq )
            return segTree[v];

        int mid = (l + r) / 2;
        return max( query( v * 2 + 1, l, mid, lq, rq ), query( v * 2 + 2, mid + 1, r, lq, rq ) );
    }

    long long query( int l, int r ) {
        return query( 0, ll, rr, l, r );
    }
};

SegTree depths[MAX_N + 1];

int main() {
    int n, q;
    long long m;

    cin >> n >> q >> m;
    for ( int e = 0; e < n - 1; e++ ) {
        cin >> edges[e].u >> edges[e].v >> edges[e].w;
        adj[edges[e].u].push_back( e );
        adj[edges[e].v].push_back( e );
    }

    decomp( 1 );

    for ( int c = 1; c <= n; c++ ) {
        depths[c].init( 0, leafs[c] - 1 );
        for ( auto p: head[c] ) {
            int e = p.first;
            depths[c].update( findElem( leftPos[c], e ), findElem( rightPos[c], e ), edges[e].w );
        }

        for ( int h: heads[c] ) {
            int maxDepth = depths[c].query( findElem( leftPos[c], h ), findElem( rightPos[c], h ) );
            diameterByCentroid[c].insert( maxDepth );
        }

        int d1 = (diameterByCentroid[c].size() <= 0 ? 0 : *diameterByCentroid[c].rbegin());
        int d2 = (diameterByCentroid[c].size() <= 1 ? 0 : *next( diameterByCentroid[c].rbegin() ) );
        allDiameters.insert( d1 + d2 );
    }

    int last = 0;
    while ( q-- ) {
        int e;
        long long w;

        cin >> e >> w;
        e = (e + last) % (n - 1);
        w = (w + last) % m;

        for ( int c: centroids[e] ) {
            int d1, d2, maxDepth;

            d1 = (diameterByCentroid[c].size() <= 0 ? 0 : *diameterByCentroid[c].rbegin());
            d2 = (diameterByCentroid[c].size() <= 1 ? 0 : *next( diameterByCentroid[c].rbegin() ) );
            allDiameters.erase( allDiameters.lower_bound( d1 + d2 ) );

            int h = findElem( head[c], e );
            maxDepth = depths[c].query( findElem( leftPos[c], h ), findElem( rightPos[c], h ) );
            diameterByCentroid[c].erase( diameterByCentroid[c].lower_bound( maxDepth ) );

            depths[c].update( findElem( leftPos[c], e ), findElem( rightPos[c], e ), w - edges[e].w );

            maxDepth = depths[c].query( findElem( leftPos[c], h ), findElem( rightPos[c], h ) );
            diameterByCentroid[c].insert( maxDepth );

            d1 = (diameterByCentroid[c].size() <= 0 ? 0 : *diameterByCentroid[c].rbegin());
            d2 = (diameterByCentroid[c].size() <= 1 ? 0 : *next( diameterByCentroid[c].rbegin() ) );
            allDiameters.insert( d1 + d2 );
        }

        edges[e].w = w;

        last = *allDiameters.rbegin();
        cout << last << "\n";
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 25436 KB Output is correct
2 Correct 6 ms 25580 KB Output is correct
3 Correct 7 ms 25436 KB Output is correct
4 Correct 6 ms 25436 KB Output is correct
5 Correct 6 ms 25436 KB Output is correct
6 Correct 6 ms 25436 KB Output is correct
7 Correct 6 ms 25400 KB Output is correct
8 Correct 6 ms 25436 KB Output is correct
9 Correct 8 ms 25436 KB Output is correct
10 Correct 7 ms 25436 KB Output is correct
11 Correct 6 ms 25436 KB Output is correct
12 Correct 8 ms 25436 KB Output is correct
13 Correct 8 ms 25436 KB Output is correct
14 Correct 7 ms 25412 KB Output is correct
15 Correct 6 ms 25436 KB Output is correct
16 Correct 8 ms 25436 KB Output is correct
17 Correct 7 ms 25436 KB Output is correct
18 Correct 7 ms 25436 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 25436 KB Output is correct
2 Correct 6 ms 25580 KB Output is correct
3 Correct 7 ms 25436 KB Output is correct
4 Correct 6 ms 25436 KB Output is correct
5 Correct 6 ms 25436 KB Output is correct
6 Correct 6 ms 25436 KB Output is correct
7 Correct 6 ms 25400 KB Output is correct
8 Correct 6 ms 25436 KB Output is correct
9 Correct 8 ms 25436 KB Output is correct
10 Correct 7 ms 25436 KB Output is correct
11 Correct 6 ms 25436 KB Output is correct
12 Correct 8 ms 25436 KB Output is correct
13 Correct 8 ms 25436 KB Output is correct
14 Correct 7 ms 25412 KB Output is correct
15 Correct 6 ms 25436 KB Output is correct
16 Correct 8 ms 25436 KB Output is correct
17 Correct 7 ms 25436 KB Output is correct
18 Correct 7 ms 25436 KB Output is correct
19 Correct 34 ms 26152 KB Output is correct
20 Correct 36 ms 25948 KB Output is correct
21 Correct 39 ms 26224 KB Output is correct
22 Correct 46 ms 26188 KB Output is correct
23 Correct 58 ms 28672 KB Output is correct
24 Correct 71 ms 29020 KB Output is correct
25 Correct 79 ms 29676 KB Output is correct
26 Correct 72 ms 29648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 25436 KB Output is correct
2 Correct 6 ms 25436 KB Output is correct
3 Correct 9 ms 25436 KB Output is correct
4 Correct 52 ms 25640 KB Output is correct
5 Correct 203 ms 25888 KB Output is correct
6 Correct 5 ms 25436 KB Output is correct
7 Correct 6 ms 25692 KB Output is correct
8 Correct 13 ms 25692 KB Output is correct
9 Correct 13 ms 25728 KB Output is correct
10 Correct 63 ms 25756 KB Output is correct
11 Correct 251 ms 26084 KB Output is correct
12 Correct 13 ms 26972 KB Output is correct
13 Correct 13 ms 26844 KB Output is correct
14 Correct 19 ms 26972 KB Output is correct
15 Correct 70 ms 27012 KB Output is correct
16 Correct 306 ms 27216 KB Output is correct
17 Correct 177 ms 52224 KB Output is correct
18 Correct 173 ms 52004 KB Output is correct
19 Correct 185 ms 52152 KB Output is correct
20 Correct 267 ms 52672 KB Output is correct
21 Correct 666 ms 52640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 26204 KB Output is correct
2 Correct 50 ms 26300 KB Output is correct
3 Correct 217 ms 26412 KB Output is correct
4 Correct 437 ms 26812 KB Output is correct
5 Correct 52 ms 34384 KB Output is correct
6 Correct 114 ms 34484 KB Output is correct
7 Correct 412 ms 35004 KB Output is correct
8 Correct 725 ms 35044 KB Output is correct
9 Correct 282 ms 76468 KB Output is correct
10 Correct 433 ms 76536 KB Output is correct
11 Correct 864 ms 76720 KB Output is correct
12 Correct 1570 ms 77328 KB Output is correct
13 Correct 611 ms 132824 KB Output is correct
14 Correct 742 ms 133028 KB Output is correct
15 Correct 1444 ms 133504 KB Output is correct
16 Correct 2256 ms 133576 KB Output is correct
17 Correct 4627 ms 133776 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4094 ms 111288 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 25436 KB Output is correct
2 Correct 6 ms 25580 KB Output is correct
3 Correct 7 ms 25436 KB Output is correct
4 Correct 6 ms 25436 KB Output is correct
5 Correct 6 ms 25436 KB Output is correct
6 Correct 6 ms 25436 KB Output is correct
7 Correct 6 ms 25400 KB Output is correct
8 Correct 6 ms 25436 KB Output is correct
9 Correct 8 ms 25436 KB Output is correct
10 Correct 7 ms 25436 KB Output is correct
11 Correct 6 ms 25436 KB Output is correct
12 Correct 8 ms 25436 KB Output is correct
13 Correct 8 ms 25436 KB Output is correct
14 Correct 7 ms 25412 KB Output is correct
15 Correct 6 ms 25436 KB Output is correct
16 Correct 8 ms 25436 KB Output is correct
17 Correct 7 ms 25436 KB Output is correct
18 Correct 7 ms 25436 KB Output is correct
19 Correct 34 ms 26152 KB Output is correct
20 Correct 36 ms 25948 KB Output is correct
21 Correct 39 ms 26224 KB Output is correct
22 Correct 46 ms 26188 KB Output is correct
23 Correct 58 ms 28672 KB Output is correct
24 Correct 71 ms 29020 KB Output is correct
25 Correct 79 ms 29676 KB Output is correct
26 Correct 72 ms 29648 KB Output is correct
27 Correct 5 ms 25436 KB Output is correct
28 Correct 6 ms 25436 KB Output is correct
29 Correct 9 ms 25436 KB Output is correct
30 Correct 52 ms 25640 KB Output is correct
31 Correct 203 ms 25888 KB Output is correct
32 Correct 5 ms 25436 KB Output is correct
33 Correct 6 ms 25692 KB Output is correct
34 Correct 13 ms 25692 KB Output is correct
35 Correct 13 ms 25728 KB Output is correct
36 Correct 63 ms 25756 KB Output is correct
37 Correct 251 ms 26084 KB Output is correct
38 Correct 13 ms 26972 KB Output is correct
39 Correct 13 ms 26844 KB Output is correct
40 Correct 19 ms 26972 KB Output is correct
41 Correct 70 ms 27012 KB Output is correct
42 Correct 306 ms 27216 KB Output is correct
43 Correct 177 ms 52224 KB Output is correct
44 Correct 173 ms 52004 KB Output is correct
45 Correct 185 ms 52152 KB Output is correct
46 Correct 267 ms 52672 KB Output is correct
47 Correct 666 ms 52640 KB Output is correct
48 Correct 14 ms 26204 KB Output is correct
49 Correct 50 ms 26300 KB Output is correct
50 Correct 217 ms 26412 KB Output is correct
51 Correct 437 ms 26812 KB Output is correct
52 Correct 52 ms 34384 KB Output is correct
53 Correct 114 ms 34484 KB Output is correct
54 Correct 412 ms 35004 KB Output is correct
55 Correct 725 ms 35044 KB Output is correct
56 Correct 282 ms 76468 KB Output is correct
57 Correct 433 ms 76536 KB Output is correct
58 Correct 864 ms 76720 KB Output is correct
59 Correct 1570 ms 77328 KB Output is correct
60 Correct 611 ms 132824 KB Output is correct
61 Correct 742 ms 133028 KB Output is correct
62 Correct 1444 ms 133504 KB Output is correct
63 Correct 2256 ms 133576 KB Output is correct
64 Correct 4627 ms 133776 KB Output is correct
65 Incorrect 4094 ms 111288 KB Output isn't correct
66 Halted 0 ms 0 KB -