This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const int LIM=1e5+7, INF=1e9+7;
vector<int>V[LIM];
pair<int,int>kraw[LIM];
int ile[LIM], oc[LIM], sciezka[LIM], nr[LIM], T[LIM], akt;
ll tr[4*LIM], N;
set<pair<pair<int,int>,int>>S;
void DFS(int x) {
ile[x]=1;
for(auto i : V[x]) {
DFS(i);
ile[x]+=ile[i];
oc[i]=x;
}
if(!V[x].size()) return;
rep(i, V[x].size()) if(ile[V[x][i]]>ile[V[x][0]]) swap(V[x][i], V[x][0]);
}
void DFS2(int x) {
nr[x]=akt++;
if(!V[x].size()) return;
sciezka[V[x][0]]=sciezka[x];
for(auto i : V[x]) DFS2(i);
}
void upd(int v, ll x) {
v+=N;
while(v) {
tr[v]+=x;
v/=2;
}
}
ll cnt(int l, int r) {
if(l>r) return 0;
l+=N; r+=N;
ll ans=tr[l];
if(l!=r) ans+=tr[r];
while(l/2!=r/2) {
if(l%2==0) ans+=tr[l+1];
if(r%2==1) ans+=tr[r-1];
l/=2; r/=2;
}
return ans;
}
ll licz(vector<pair<ll,ll>>A) {
N=1;
while(N<A.size()) N*=2;
rep(i, 2*N) tr[i]=0;
vector<pair<ll,ll>>B;
rep(i, A.size()) B.pb({A[i].st, -i});
sort(all(B));
ll ans=0;
for(auto i : B) {
ans+=cnt(0, -i.nd)*A[-i.nd].nd;
upd(-i.nd, A[-i.nd].nd);
}
return ans;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int n;
cin >> n;
rep(i, n) cin >> T[i];
rep(i, n-1) {
cin >> kraw[i].st >> kraw[i].nd;
--kraw[i].st; --kraw[i].nd;
V[kraw[i].st].pb(kraw[i].nd);
}
DFS(0);
rep(i, n) sciezka[i]=i;
DFS2(0);
rep(i, n) S.insert({{nr[i], nr[i]}, INF});
rep(i, n-1) {
int x=kraw[i].nd;
vector<pair<pair<int,int>,int>>A;
while(true) {
auto it=S.lower_bound({{nr[x]+1, -LIM}, -LIM});
if(it==S.begin()) break;
--it;
auto a=*it;
if(a.st.st<nr[sciezka[x]]) {
x=oc[sciezka[x]];
continue;
}
S.erase(a);
if(a.st.nd>nr[x]) {
S.insert({{nr[x]+1, a.st.nd}, a.nd});
a.st.nd=nr[x];
}
A.pb(a);
}
x=kraw[i].nd;
while(true) {
S.insert({{nr[sciezka[x]], nr[x]}, T[kraw[i].nd]});
if(!sciezka[x]) break;
x=oc[sciezka[x]];
}
vector<pair<ll,ll>>B;
for(auto j : A) B.pb({j.nd, j.st.nd-j.st.st+1});
cout << licz(B) << '\n';
}
}
Compilation message (stderr)
construction.cpp: In function 'void DFS(int)':
construction.cpp:5:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
5 | #define rep(a, b) for(int a = 0; a < (b); ++a)
| ^
construction.cpp:24:3: note: in expansion of macro 'rep'
24 | rep(i, V[x].size()) if(ile[V[x][i]]>ile[V[x][0]]) swap(V[x][i], V[x][0]);
| ^~~
construction.cpp: In function 'll licz(std::vector<std::pair<long long int, long long int> >)':
construction.cpp:53:10: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
53 | while(N<A.size()) N*=2;
| ~^~~~~~~~~
construction.cpp:5:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
5 | #define rep(a, b) for(int a = 0; a < (b); ++a)
| ^
construction.cpp:56:3: note: in expansion of macro 'rep'
56 | rep(i, A.size()) B.pb({A[i].st, -i});
| ^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |