답안 #954117

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

#define pragma "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;
}

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 );

    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() );

    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 );
    }
} depths;



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 );
    }

    crtPos = 0;
    decomp( 1 );

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

        for ( int h: heads[c] ) {
            int maxDepth = depths.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.query( findElem( leftPos[c], h ), findElem( rightPos[c], h ) );
            diameterByCentroid[c].erase( diameterByCentroid[c].lower_bound( maxDepth ) );

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

            maxDepth = depths.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 5 ms 21084 KB Output is correct
2 Correct 4 ms 21084 KB Output is correct
3 Correct 5 ms 21084 KB Output is correct
4 Correct 4 ms 21084 KB Output is correct
5 Correct 5 ms 21084 KB Output is correct
6 Correct 5 ms 21084 KB Output is correct
7 Correct 5 ms 21084 KB Output is correct
8 Correct 5 ms 21084 KB Output is correct
9 Correct 5 ms 21084 KB Output is correct
10 Correct 6 ms 21080 KB Output is correct
11 Correct 5 ms 21084 KB Output is correct
12 Correct 5 ms 21084 KB Output is correct
13 Correct 6 ms 21084 KB Output is correct
14 Correct 5 ms 20944 KB Output is correct
15 Correct 5 ms 21084 KB Output is correct
16 Correct 5 ms 21080 KB Output is correct
17 Correct 5 ms 21084 KB Output is correct
18 Correct 5 ms 21084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 21084 KB Output is correct
2 Correct 4 ms 21084 KB Output is correct
3 Correct 5 ms 21084 KB Output is correct
4 Correct 4 ms 21084 KB Output is correct
5 Correct 5 ms 21084 KB Output is correct
6 Correct 5 ms 21084 KB Output is correct
7 Correct 5 ms 21084 KB Output is correct
8 Correct 5 ms 21084 KB Output is correct
9 Correct 5 ms 21084 KB Output is correct
10 Correct 6 ms 21080 KB Output is correct
11 Correct 5 ms 21084 KB Output is correct
12 Correct 5 ms 21084 KB Output is correct
13 Correct 6 ms 21084 KB Output is correct
14 Correct 5 ms 20944 KB Output is correct
15 Correct 5 ms 21084 KB Output is correct
16 Correct 5 ms 21080 KB Output is correct
17 Correct 5 ms 21084 KB Output is correct
18 Correct 5 ms 21084 KB Output is correct
19 Correct 45 ms 21648 KB Output is correct
20 Correct 39 ms 21592 KB Output is correct
21 Correct 44 ms 21732 KB Output is correct
22 Correct 44 ms 21596 KB Output is correct
23 Correct 66 ms 24076 KB Output is correct
24 Correct 83 ms 24412 KB Output is correct
25 Correct 100 ms 25084 KB Output is correct
26 Correct 98 ms 24920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 21080 KB Output is correct
2 Correct 5 ms 21104 KB Output is correct
3 Correct 8 ms 21080 KB Output is correct
4 Correct 44 ms 21180 KB Output is correct
5 Correct 199 ms 21328 KB Output is correct
6 Correct 5 ms 21080 KB Output is correct
7 Correct 5 ms 21080 KB Output is correct
8 Correct 5 ms 21084 KB Output is correct
9 Correct 10 ms 21108 KB Output is correct
10 Correct 52 ms 21276 KB Output is correct
11 Correct 250 ms 21916 KB Output is correct
12 Correct 11 ms 22364 KB Output is correct
13 Correct 12 ms 22364 KB Output is correct
14 Correct 18 ms 22364 KB Output is correct
15 Correct 73 ms 22360 KB Output is correct
16 Correct 308 ms 22712 KB Output is correct
17 Correct 180 ms 46180 KB Output is correct
18 Correct 180 ms 46168 KB Output is correct
19 Correct 187 ms 46128 KB Output is correct
20 Correct 279 ms 46428 KB Output is correct
21 Correct 630 ms 47068 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 21596 KB Output is correct
2 Correct 63 ms 21800 KB Output is correct
3 Correct 274 ms 21808 KB Output is correct
4 Correct 548 ms 22216 KB Output is correct
5 Correct 70 ms 29504 KB Output is correct
6 Correct 158 ms 29520 KB Output is correct
7 Correct 544 ms 29760 KB Output is correct
8 Correct 1002 ms 30100 KB Output is correct
9 Correct 395 ms 70748 KB Output is correct
10 Correct 578 ms 70592 KB Output is correct
11 Correct 1205 ms 70928 KB Output is correct
12 Correct 2161 ms 71144 KB Output is correct
13 Correct 875 ms 125664 KB Output is correct
14 Correct 1103 ms 125620 KB Output is correct
15 Correct 1978 ms 126380 KB Output is correct
16 Correct 3088 ms 126404 KB Output is correct
17 Execution timed out 5060 ms 126620 KB Time limit exceeded
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4717 ms 104460 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 21084 KB Output is correct
2 Correct 4 ms 21084 KB Output is correct
3 Correct 5 ms 21084 KB Output is correct
4 Correct 4 ms 21084 KB Output is correct
5 Correct 5 ms 21084 KB Output is correct
6 Correct 5 ms 21084 KB Output is correct
7 Correct 5 ms 21084 KB Output is correct
8 Correct 5 ms 21084 KB Output is correct
9 Correct 5 ms 21084 KB Output is correct
10 Correct 6 ms 21080 KB Output is correct
11 Correct 5 ms 21084 KB Output is correct
12 Correct 5 ms 21084 KB Output is correct
13 Correct 6 ms 21084 KB Output is correct
14 Correct 5 ms 20944 KB Output is correct
15 Correct 5 ms 21084 KB Output is correct
16 Correct 5 ms 21080 KB Output is correct
17 Correct 5 ms 21084 KB Output is correct
18 Correct 5 ms 21084 KB Output is correct
19 Correct 45 ms 21648 KB Output is correct
20 Correct 39 ms 21592 KB Output is correct
21 Correct 44 ms 21732 KB Output is correct
22 Correct 44 ms 21596 KB Output is correct
23 Correct 66 ms 24076 KB Output is correct
24 Correct 83 ms 24412 KB Output is correct
25 Correct 100 ms 25084 KB Output is correct
26 Correct 98 ms 24920 KB Output is correct
27 Correct 5 ms 21080 KB Output is correct
28 Correct 5 ms 21104 KB Output is correct
29 Correct 8 ms 21080 KB Output is correct
30 Correct 44 ms 21180 KB Output is correct
31 Correct 199 ms 21328 KB Output is correct
32 Correct 5 ms 21080 KB Output is correct
33 Correct 5 ms 21080 KB Output is correct
34 Correct 5 ms 21084 KB Output is correct
35 Correct 10 ms 21108 KB Output is correct
36 Correct 52 ms 21276 KB Output is correct
37 Correct 250 ms 21916 KB Output is correct
38 Correct 11 ms 22364 KB Output is correct
39 Correct 12 ms 22364 KB Output is correct
40 Correct 18 ms 22364 KB Output is correct
41 Correct 73 ms 22360 KB Output is correct
42 Correct 308 ms 22712 KB Output is correct
43 Correct 180 ms 46180 KB Output is correct
44 Correct 180 ms 46168 KB Output is correct
45 Correct 187 ms 46128 KB Output is correct
46 Correct 279 ms 46428 KB Output is correct
47 Correct 630 ms 47068 KB Output is correct
48 Correct 14 ms 21596 KB Output is correct
49 Correct 63 ms 21800 KB Output is correct
50 Correct 274 ms 21808 KB Output is correct
51 Correct 548 ms 22216 KB Output is correct
52 Correct 70 ms 29504 KB Output is correct
53 Correct 158 ms 29520 KB Output is correct
54 Correct 544 ms 29760 KB Output is correct
55 Correct 1002 ms 30100 KB Output is correct
56 Correct 395 ms 70748 KB Output is correct
57 Correct 578 ms 70592 KB Output is correct
58 Correct 1205 ms 70928 KB Output is correct
59 Correct 2161 ms 71144 KB Output is correct
60 Correct 875 ms 125664 KB Output is correct
61 Correct 1103 ms 125620 KB Output is correct
62 Correct 1978 ms 126380 KB Output is correct
63 Correct 3088 ms 126404 KB Output is correct
64 Execution timed out 5060 ms 126620 KB Time limit exceeded
65 Halted 0 ms 0 KB -