Submission #943297

#TimeUsernameProblemLanguageResultExecution timeMemory
94329712345678Transport (COCI19_transport)C++17
130 / 130
521 ms21444 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const ll nx=1e5+5; ll n, vl[nx], u, v, w, used[nx], sz[nx], ans=0, dp[nx], t, lft[nx]; vector<pair<ll, ll>> d[nx]; map<ll, ll> mp; struct fenwick { ll d[nx]; void add(ll i, ll x) { while (i<nx) d[i]+=x, i+=(i&-i); } ll query(ll i) { ll res=0; while (i>0) res+=d[i], i-=(i&-i); return res; } } f; ll dfssz(ll u, ll p) { sz[u]=1; for (auto [v, w]:d[u]) if (v!=p&&!used[v]) sz[u]+=dfssz(v, u); return sz[u]; } ll findcentroid(ll u, ll p, ll rtsz) { for (auto [v, w]:d[u]) if (v!=p&&!used[v]&&2*sz[v]>rtsz) return findcentroid(v, u, rtsz); return u; } void dfsquery(ll u, ll p, ll rt, ll sm, ll pre, bool mode) { if (sm>=0&&pre>=0) { if (mode) ans+=f.query(mp[sm+vl[rt]]); else mp[sm+vl[rt]]=0; } for (auto [v, w]:d[u]) if (v!=p&&!used[v]) dfsquery(v, u, rt, sm+vl[v]-w, min(0ll, pre+(vl[v]-w)), mode); } void dfsadd(ll u, ll p, bool mode, ll add) { //if (mode&&add==1) cout<<"here "<<u<<' '<<dp[u]<<'\n'; if (mode) f.add(mp[dp[u]], add); else mp[dp[u]]=0; for (auto [v, w]:d[u]) { if (v!=p&&!used[v]) { if (w>lft[u]) dp[v]=dp[u]+(w-lft[u]), lft[v]=0; else dp[v]=dp[u], lft[v]=lft[u]-w; lft[v]+=vl[v]; dfsadd(v, u, mode, add); } } } void decomposition(ll u) { u=findcentroid(u, u, dfssz(u, u)); used[u]=1; dp[u]=lft[u]=0; mp.clear(); mp[vl[u]]=0; t=0; //cout<<"root "<<u<<'\n'; for (auto [v, w]:d[u]) if (!used[v]) dp[v]=w, lft[v]=vl[v], dfsadd(v, u, 0, 0), dfsquery(v, u, u, -w+vl[v], 0, 0); for (auto &[x, y]:mp) y=++t; f.add(mp[vl[u]], 1); for (auto [v, w]:d[u]) if (!used[v]) dfsquery(v, u, u, -w+vl[v], 0, 1), dfsadd(v, u, 1, 1); f.add(mp[vl[u]], -1); for (auto [v, w]:d[u]) if (!used[v]) dfsadd(v, u, 1, -1); reverse(d[u].begin(), d[u].end()); for (auto [v, w]:d[u]) if (!used[v]) dfsquery(v, u, u, -w+vl[v], 0, 1), dfsadd(v, u, 1, 1); ans+=f.query(mp[vl[u]]); for (auto [v, w]:d[u]) if (!used[v]) dfsadd(v, u, 1, -1); for (auto [v, w]:d[u]) if (!used[v]) decomposition(v); } int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n; for (ll i=1; i<=n; i++) cin>>vl[i]; for (ll i=1; i<n; i++) cin>>u>>v>>w, d[u].push_back({v, w}), d[v].push_back({u, w}); decomposition(1); cout<<ans; } /* 6 1 2 3 3 2 1 1 2 4 2 3 4 3 4 1 4 5 4 5 6 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...