Submission #157519

#TimeUsernameProblemLanguageResultExecution timeMemory
157519combi1k1Construction of Highway (JOI18_construction)C++14
100 / 100
1247 ms17280 KiB
#include<bits/stdc++.h>

using namespace std;

#define X       first
#define Y       second
#define ll      long long
#define pb      push_back
#define lch     i << 1
#define rch     i << 1 | 1
#define all(x)  x.begin(),x.end()

const int   N   = 1e5 + 1;

typedef pair<int,int>   ii;

namespace   _IT {
    int t[N << 2];

    int add(int x,int y)    {
        return  x == y ? x : 0;
    }
    int upd(int i,int l,int r,int L,int R,int v)    {
        if (l >  R || L >  r)   return  0;
        if (L <= l && r <= R)   {
            t[i] = v;
            return  1;
        }
        int m = (l + r) / 2;
        upd(lch,l,m,L,R,v); ++m;
        upd(rch,m,r,L,R,v);
        t[i] = add(t[lch],t[rch]);
    }
    int get(int i,int l,int r,int L,int R)  {
        if (t[i] && l < r)
            t[lch] = t[i],
            t[rch] = t[i];
        if (l >  R || L >  r)   return  -1;
        if (L <= l && r <= R)   return  t[i];
        int m = (l + r) / 2;
        int tmp1 = get(lch,l,m,L,R);    ++m;
        int tmp2 = get(rch,m,r,L,R);

        if (tmp1 < 0)   tmp1 = tmp2;
        if (tmp2 < 0)   tmp2 = tmp1;

        return  add(tmp1,tmp2);
    }
    int lef(int i,int l,int r,int p,int v)  {
        if (t[i] && l < r)
            t[lch] = t[i],
            t[rch] = t[i];
        if (t[i])   return  t[i] == v ? l : N;
        int m = (l + r + 2) / 2;
        if (m > p)  return  lef(lch,l,m - 1,p,v);

        int x = lef(rch,m,r,p,v);
        if (x == m--)   {
            x = lef(lch,l,m,m,v);
            if (x == N)
                x = m + 1;
        }
        return  x;
    }
};
namespace   BIT {
    vector<int> val;
    vector<int> bit;

    void add(int x) {   val.pb(x);  }
    void ini()  {
        sort(all(val));
        val.resize(unique(all(val)) - val.begin());
        bit.assign(val.size() + 5,0);
    }
    void upd(int p,int v)   {
        p = upper_bound(all(val),p) - val.begin() + 1;
        int K = bit.size();
        for(; p < K ; p += p & -p)
            bit[p] += v;
    }
    int get(int p)  {
        int ans = 0;
        p = upper_bound(all(val),p) - val.begin();
        for(; p > 0 ; p -= p & -p)
            ans += bit[p];
        return  ans;
    }
};

vector<int> g[N];

int nCh[N], led[N];
int pos[N], par[N];
int arr[N], tot = 0;

int dfs(int u,int p)    {
    par[u] = p;
    nCh[u] = 1;
    for(int v : g[u])
        dfs(v,u),
        nCh[u] += nCh[v];

    return  1;
}
int hld(int u,int S)    {
    if (S)  led[u] = u;
    else    led[u] = led[par[u]];
    arr[++tot] = u;
    pos[u] = tot;

    int B = 0;

    for(int v : g[u])   if (nCh[v] > nCh[B])
        B = v;

    if (B)  hld(B,0);

    for(int v : g[u])   if (v != B)
        hld(v,1);

    return  1;
}

int c[N];
int a[N], b[N];

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

    int n;  cin >> n;

    for(int i = 1 ; i <= n ; ++i)   cin >> c[i];
    for(int i = 2 ; i <= n ; ++i)   {
        cin >> a[i] >> b[i];
        g[a[i]].pb(b[i]);
    }

    dfs(1,0);
    hld(1,1);

    for(int i = 1 ; i <= n ; ++i)
        _IT::upd(1,1,n,pos[i],pos[i],c[i]);

    for(int i = 2 ; i <= n ; ++i)   {
        vector<ii>  vec;

        BIT::val.clear();

        for(int x = a[i] ; x ;) {
            int r = pos[x];
            int C = _IT::get(1,1,n,r,r);
            int l = _IT::lef(1,1,n,r,C);
            if (l < pos[led[x]])
                l = pos[led[x]];
            x = par[arr[l]];
            _IT::upd(1,1,n,l,r,c[b[i]]);
            BIT::add(C);
            vec.pb({C,r - l + 1});
        }
        BIT::ini();
        ll  ans = 0;

        for(ii  p : vec)    {
            ans += 1ll * p.Y * BIT::get(p.X);
            BIT::upd(p.X,p.Y);
        }

        cout << ans << "\n";
    }
}

Compilation message (stderr)

construction.cpp: In function 'int _IT::upd(int, int, int, int, int, int)':
construction.cpp:33:5: warning: control reaches end of non-void function [-Wreturn-type]
     }
     ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...