Submission #999913

#TimeUsernameProblemLanguageResultExecution timeMemory
999913vjudge1Construction of Highway (JOI18_construction)C++17
0 / 100
0 ms348 KiB
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"

using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll N = 4005;
struct SegTree
{
    ll n;
    vector<ll> st;
    SegTree(ll sz = 0, bool input = false)
    {
        n = sz;
        st.resize((n + 1) << 1, 0);
    }
    void set(ll i, ll val)
    {
        st[i + n - 1] = val;
    }
    void build()
    {
        for (ll i = n - 1; i >= 1; i--)
            st[i] = st[i << 1] + st[i << 1 | 1];
    }
    void modify(ll p, ll val)
    {
        for (st[p += n - 1] = val; p > 1; p >>= 1)
            st[p >> 1] = st[p] + st[p ^ 1];
    }
    ll query(ll l, ll r)
    {
        ll ans = 0;
        for (l += n - 1, r += n; l < r; l >>= 1, r >>= 1)
        {
            if (l & 1)
                ans += st[l++];
            if (r & 1)
                ans += st[--r];
        }
        return ans;
    }
};
SegTree st;
ll c[N], p[N];
void solve()
{
    ll n;
    cin >> n;
    for (ll i = 1; i <= n; i++) cin >> c[i];
    {
        map<ll, ll> mp;
        for (ll i = 1; i <= n; i++) mp[c[i]] = 1;
        ll cur = 1;
        for (auto i : mp)
            mp[i.first] = cur++;
        for (ll i = 1; i <= n; i++) c[i] = mp[c[i]];
    }
    for (ll i = 1; i < n; i++)
    {
        ll a, b;
        cin >> a >> b;
        st = SegTree(n);
        p[b] = a;
        vector<ll> vec;
        ll v = a;
        while (v) vec.push_back(c[v]), v = p[v];
        ll ans = 0;
        for (ll i : vec)
            ans += st.query(1, i - 1), st.modify(i, 1);
        v = b;
        while (v) c[v] = c[b], v = p[v];
        cout << ans << endl;
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    ll t = 1;
    // precomp();
    //cin >> t;
    for (ll cs = 1; cs <= t; cs++)
        solve();
    // cerr << "\nTime elapsed: " << clock() * 1000.0 / CLOCKS_PER_SEC << " ms\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...