제출 #1305762

#제출 시각아이디문제언어결과실행 시간메모리
1305762jojeonghoonConstruction of Highway (JOI18_construction)C++20
16 / 100
2095 ms4012 KiB
#include <iostream>
#include <vector>
#include <set>
#include<algorithm>
#include<queue>
#include<map>
#include<math.h>
#include<assert.h>
#include<random>
#define ll long long
#define int ll
#define i32 __int32_t
#define i64 __int64_t
#define i128 __int128_t
#define db double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define bk back()
#define bg begin()
#define ed end()
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("avx,avx2,fma")
using namespace std;

const int LM=100100;
int N;
int C[LM];
int p[LM];
vector<int>z;
int pw[LM];

void init(){fill(pw+1,pw+N+1,0);}
void update(int x){for(int i=x; i<=N; i+=i&-i) pw[i]++;}
int Sum(int x){
    int ret=0;
    for(int i=x; i; i-=i&-i) ret+=pw[i];
    return ret;
}

signed main(){
    cin>>N;
    for(int i=1; i<=N; i++) cin>>C[i];
    for(int i=1; i<=N; i++) z.push_back(C[i]);
    sort(z.bg, z.ed);
    
    for(int i=1; i<=N; i++) C[i] = lower_bound(z.bg, z.ed, C[i])-z.bg+1;
    
    for(int i=1; i<N; i++){
        int u,v;cin>>u>>v;
        p[v]=u;
        vector<int>a;
        for(int i=u; i;i=p[i]) a.push_back(C[i]);
        reverse(a.bg, a.ed);
        init();
        
        int ans=0;
        for(int i=0; i<a.size(); i++){
            ans += i-Sum(a[i]);
            update(a[i]);
        }
        cout<<ans<<"\n";
        
        for(int i=u; i; i=p[i]) C[i]=C[v];
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...