Submission #1285160

#TimeUsernameProblemLanguageResultExecution timeMemory
1285160Bui_Quoc_CuongConstruction of Highway (JOI18_construction)C++20
0 / 100
4 ms3392 KiB
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
const int maxn = 2e5 + 5;

int n;
int a[maxn];
vector <int> g[maxn];
int v[maxn];

int sz[maxn], heavy[maxn];
int head[maxn], cur[maxn], pos[maxn], timecrt, timedfs, par[maxn];

void dfs(int u)
{
    sz[u] = 1;
    for (int &v : g[u])
    {
        par[v] = u;
        dfs(v);
        sz[u]+= sz[v];
        if(sz[v] > sz[heavy[u]]) heavy[u] = v;
    }
}

void hld(int u)
{
    if (!head[timecrt]) head[timecrt] = u;
    pos[u] = ++ timedfs;

    if (heavy[u])
        hld(heavy[u]);

    for (int &v : g[u]) if (v != heavy[u])
    {
        timecrt++;
        hld(v);
    }
}

int bit[maxn];

void upd (int u, int val)
{
    for (int i = u; i <= n; i+= i&-i) bit[i]+= val;
}

int get (int u)
{
    int res = 0;
    for (int i = u; i; i-= i&-i) res+= bit[i];
    return res;
}

int st[4 * maxn];

void pushdown (int id)
{
    if (st[id] == - 1) return;
    st[id << 1] = st[id << 1 | 1] = st[id];
}

void pushup (int id)
{
    if (st[id << 1] != st[id << 1 | 1]) st[id] = - 1;
    else st[id] = st[id << 1];
}

void update (int id, int l, int r, int u, int v, int val)
{
    if (l > v || r < u) return;
    if (l >= u && r <= v)
    {
        st[id] = val;
        return;
    }
    int mid = l + r >> 1;
    pushdown(id);

    update (id * 2, l, mid, u, v, val);
    update (id * 2 + 1, mid + 1, r, u, v, val);

    pushup(id);
}

stack <pair <int, int>> mem;

long long get (int id, int l, int r, int u, int v)
{
    if (l > v || r < u || l > r) return 0;
    if (l >= u && r <= v && st[id] != - 1)
    {
        long long res = 1LL * (r - l + 1) * get(st[id] - 1);
        upd(st[id], r - l + 1);
        mem.push({st[id], r - l + 1});
        return res;
    }
    if (l == r) return 0;
    int mid = l + r >> 1;
    pushdown(id);
    return  + get(id * 2 + 1, mid + 1, r, u, v) + get(id * 2, l, mid, u, v);
}

long long add (int u) {
    update (1, 1, n, pos[u], pos[u], a[u]);
    int val = a[u];
    u = par[u];
    long long res = 0;

    while (u > 0)
    {
        res+= get (1, 1, n, pos[head[cur[u]]], pos[u]);
        update (1, 1, n, pos[head[cur[u]]], pos[u], val);
        u = par[head[cur[u]]];
    }

    while (!mem.empty())
    {
        upd (mem.top().first, - mem.top().second);
        mem.pop();
    }

    return res;
}

int main ()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    #define kieuoanh "kieuoanh"
    if (fopen(kieuoanh".inp", "r"))
    {
        freopen(kieuoanh".inp", "r", stdin);
        freopen(kieuoanh".out", "w", stdout);
    }

    cin >> n;
    vector <int> values;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        values.pb(a[i]);
    }
    sort(values.begin(), values.end());
    values.resize(unique(values.begin(), values.end()) - values.begin());
    for (int i = 1; i <= n; i++) a[i] = upper_bound(values.begin(), values.end(), a[i]) - values.begin();

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

    memset(st, - 1, sizeof st);

    dfs(1);
    hld(1);

    add(1);

    for (int i = 1; i < n; i++)
        cout << add(v[i]) << '\n';

    return 0;
}

Compilation message (stderr)

construction.cpp: In function 'int main()':
construction.cpp:136:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  136 |         freopen(kieuoanh".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
construction.cpp:137:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  137 |         freopen(kieuoanh".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...