Submission #611841

#TimeUsernameProblemLanguageResultExecution timeMemory
611841alireza_kavianiDesignated Cities (JOI19_designated_cities)C++17
100 / 100
620 ms105456 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;

#define all(x)      (x).begin(),(x).end()
#define X           first
#define Y           second
#define sep         ' '
#define endl        '\n'
#define SZ(x)       ll(x.size())
#define lc          id << 1
#define rc          lc | 1

const ll MAXN = 1e6 + 10;
const ll LOG = 22;
const ll INF = 8e18;
const ll MOD = 1e9 + 7; //998244353; //1e9 + 9;

ll n , q , cost , root , timer , ans[MAXN] , H[MAXN] , st[MAXN] , fn[MAXN] , par[MAXN] , W[MAXN] , ind[MAXN] , mark[MAXN] , lz[MAXN << 2];
pll seg[MAXN << 2];
vector<pii> adj[MAXN] , g[MAXN];

void PreDFS(int v , int p = -1){
    ans[1] = min(ans[1] , H[v]);
    for(pii i : g[v]){
        int u = i.X , w = i.Y;
        if(u == p)  continue;
        H[u] = H[v] + w;
        PreDFS(u , v);
    }
}

void DistDFS(int v , int p = -1){
    ind[timer] = v;
    st[v] = timer++;
    for(pii i : adj[v]){
        int u = i.X , w = i.Y;
        if(u == p)  continue;
        cost += w;
        par[u] = v; W[u] = w;
        H[u] = H[v] + w;
        DistDFS(u , v);
    }
    fn[v] = timer;
}

void build(int id = 1 , int l = 0 , int r = n){
    if(r - l == 1){
        seg[id] = {H[ind[l]] , ind[l]};
        return;
    }
    int mid = l + r >> 1;
    build(lc , l , mid);
    build(rc , mid , r);
    seg[id] = max(seg[lc] , seg[rc]);
}

void shift(int id){
    seg[lc].X += lz[id]; lz[lc] += lz[id];
    seg[rc].X += lz[id]; lz[rc] += lz[id];
    lz[id] = 0;
}

void update(int ql , int qr , int x , int id = 1 , int l = 0 , int r = n){
    if(qr <= l || r <= ql)  return;
    if(ql <= l && r <= qr){
        seg[id].X += x;
        lz[id] += x;
        return;
    }
    shift(id);
    int mid = l + r >> 1;
    update(ql , qr , x , lc , l , mid);
    update(ql , qr , x , rc , mid , r);
    seg[id] = max(seg[lc] , seg[rc]);
}

int main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

    cin >> n;
    for(int i = 1 ; i < n ; i++){
        int v , u , w1 , w2;
        cin >> v >> u >> w1 >> w2;
        adj[v].push_back({u , w1});
        adj[u].push_back({v , w2});
        g[v].push_back({u , w2 - w1});
        g[u].push_back({v , w1 - w2});
    }

    PreDFS(1);
    DistDFS(1);
    ans[1] += cost;
    root = max_element(H , H + MAXN) - H;
    H[root] = cost = timer = 0;
    DistDFS(root);
    mark[root] = 1;

    build();
    for(int i = 2 ; i <= n ; i++){
        int v = seg[1].Y;
        while(!mark[v]){
            cost -= W[v];
            update(st[v] , fn[v] , -W[v]);
            mark[v] = 1;
            v = par[v];
        }
        ans[i] = cost;
    }
    
    cin >> q;
    while(q--){
        int x;
        cin >> x;
        cout << ans[x] << endl;
    }

    return 0;
}
/*

*/

Compilation message (stderr)

designated_cities.cpp: In function 'void build(int, int, int)':
designated_cities.cpp:55:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |     int mid = l + r >> 1;
      |               ~~^~~
designated_cities.cpp: In function 'void update(int, int, int, int, int, int)':
designated_cities.cpp:75:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   75 |     int mid = l + r >> 1;
      |               ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...