Submission #867204

#TimeUsernameProblemLanguageResultExecution timeMemory
867204azberjibiouConstruction of Highway (JOI18_construction)C++17
100 / 100
239 ms84564 KiB
#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
#define pb push_back
#define lb lower_bound
#define gibon ios::sync_with_stdio(false); cin.tie(0);
#define fi first
#define se second
#define pii pair<int, int>
#define pll pair<ll, ll>
typedef long long ll;
using namespace std;
const int mxN=100030;
const int mxM=500004;
const int MOD=998244353;
const ll INF=8e18;
typedef struct fenwick{
    int fen[mxN], n;
    void set_n(int m){n=m;}
    void init(){for(int i=0;i<=n+1;i++) fen[i]=0;}
    void upd(int idx, int val){
        while(idx<=n)   fen[idx]+=val, idx+=(idx&(-idx));
    }
    int solv(int idx){
        int res=0;
        while(idx)  res+=fen[idx], idx-=(idx&(-idx));
        return res;
    }
}fenwick;
int N;
int C[mxN];
vector <pii> E;
vector <int> v[mxN];
int dep[mxN], sub[mxN], g[mxN], par[mxN];
stack <pii> stk[mxN];
fenwick T1;
void input(){
    cin >> N;
    for(int i=1;i<=N;i++)   cin >> C[i];
    E.resize(N-1);
    for(auto &[x, y] : E)
    {
        cin >> x >> y;
        v[x].push_back(y);
        par[y]=x;
    }
}
void dfs1(int now){
    sub[now]=1;
    for(int nxt : v[now])
    {
        dep[nxt]=dep[now]+1;
        dfs1(nxt);
        sub[now]+=sub[nxt];
    }
}
void dfs2(int now){
    if(v[now].empty())  return;
    sort(all(v[now]), [](int a, int b){return sub[a]>sub[b];});
    for(int nxt : v[now])   g[nxt]=nxt;
    g[v[now][0]]=g[now];
    for(int nxt : v[now])   dfs2(nxt);
}
void heavy(int now, vector <pii> &ct, int col)
{
    vector <pii> nv;
    int idx=g[now], nl=dep[now]-dep[idx]+1;
    while(!stk[idx].empty())
    {
        auto [nc, len]=stk[idx].top();
        stk[idx].pop();
        if(nl>len)  nv.emplace_back(nc, len), nl-=len;
        else
        {
            nv.emplace_back(nc, nl);
            if(len!=nl) stk[idx].emplace(nc, len-nl);
            break;
        }
    }
    stk[idx].emplace(col, dep[now]-dep[idx]+1);
    reverse(all(nv));
    for(pii ele : nv)   ct.push_back(ele);
}
ll inv_count(vector <pii> &ct)
{
    ll res=0;
    vector <int> cr;
    cr.resize(ct.size());
    for(int i=0;i<ct.size();i++)    cr[i]=ct[i].fi;
    sort(all(cr));
    cr.erase(unique(all(cr)), cr.end());
    for(auto &[x, y] : ct)    x=lower_bound(all(cr), x)-cr.begin()+1;
    T1.set_n(cr.size()+1);
    T1.init();
    for(auto [col, cnt] : ct)
    {
        res+=(ll)T1.solv(col-1)*cnt;
        T1.upd(col, cnt);
    }
    return res;
}
ll qry(int now){
    vector <pii> ct;
    int np=now;
    if(g[now]==now) stk[now].emplace(C[now], 1), np=par[now];
    while(np){
        heavy(np, ct, C[now]);
        np=par[g[np]];
    }
    return inv_count(ct);
}
int main()
{
    gibon
    input();
    dfs1(1);
    g[1]=1;
    dfs2(1);
    stk[1].emplace(C[1], 1);
    for(auto [x, y] : E)    cout << qry(y) << '\n';
}

Compilation message (stderr)

construction.cpp: In function 'll inv_count(std::vector<std::pair<int, int> >&)':
construction.cpp:88:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |     for(int i=0;i<ct.size();i++)    cr[i]=ct[i].fi;
      |                 ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...