Submission #204643

#TimeUsernameProblemLanguageResultExecution timeMemory
204643Atill83Construction of Highway (JOI18_construction)C++14
100 / 100
573 ms107112 KiB
#include <bits/stdc++.h> #define ff first #define ss second #define endl '\n' using namespace std; const long long INF = (long long) 1e18; const int mod = (int) 1e9+7; const int MAXN = (int) 1e5+5; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<ll,ll> pll; ll n; int val[MAXN]; vector<int> adj[MAXN]; int t[MAXN]; int head[MAXN]; int sz[MAXN]; int dep[MAXN]; int par[MAXN]; vector<pii> eg; deque<pii> hl[MAXN]; void upd(int v, int val){ v++; for(; v < MAXN; v += (v&-v)) t[v] += val; } ll que(int v){ v++; ll ans = 0; for(; v; v -= (v&-v)) ans += t[v]; return ans; } void dfs(int v){ sz[v] = 1; for(int i: adj[v]){ dep[i] = dep[v] + 1; dfs(i); par[i] = v; sz[v] += sz[i]; } } void dfs2(int v){ for(int i = 0; i < adj[v].size();i++){ if(sz[adj[v][i]] > sz[adj[v][0]]){ swap(adj[v][0], adj[v][i]); } } for(int i: adj[v]){ head[i] = (i == adj[v][0] ? head[v] : i); dfs2(i); } } void add_edge(int yer, int val){ while(yer != -1){ int cikis = head[yer]; int sz = dep[yer] - dep[cikis] + 1; while(hl[cikis].size() > 0){ pii &i = hl[cikis][0]; if(sz >= i.ff){ sz -= i.ff; hl[cikis].pop_front(); }else{ i.ff -= sz; break; } } hl[cikis].push_front({dep[yer] - dep[cikis] + 1, val}); yer = par[cikis]; } } ll cc(int yer){ vector<pii> inv; vector<int> sayi; while(yer != -1){ int cikis = head[yer]; int sz = dep[yer] - dep[cikis] + 1; vector<pii> sim; for(pii &i: hl[cikis]){ if(sz >= i.ff){ sim.push_back(i); sz -= i.ff; sayi.push_back(i.ss); }else{ sim.push_back({sz, i.ss}); sayi.push_back(i.ss); break; } } for(int i = sim.size() - 1; i >= 0; i--){ inv.push_back(sim[i]); } yer = par[cikis]; } sort(sayi.begin(), sayi.end());sayi.erase(unique(sayi.begin(), sayi.end()), sayi.end()); reverse(inv.begin(), inv.end()); ll ans = 0; ll tot = 0; for(pii &a: inv){ //cout<<a.ff<<" "<<a.ss<<endl; a.ss = lower_bound(sayi.begin(), sayi.end(), a.ss) - sayi.begin(); ans += (tot - que(a.ss))*a.ff; tot += a.ff; upd(a.ss, a.ff); } for(pii &a: inv){ upd(a.ss, -a.ff); } return ans; } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr); #ifdef Local freopen("C:/Users/Admin/Desktop/Yazilim/C/IO/int.txt","r",stdin); freopen("C:/Users/Admin/Desktop/Yazilim/C/IO/out.txt","w",stdout); #endif cin>>n; for(int i = 1; i <= n; i++){ cin>>val[i]; } for(int i = 0; i < n - 1; i++){ int a, b; cin>>a>>b; adj[a].push_back(b); eg.push_back({a, b}); } par[1] = -1; head[1] = 1; dfs(1); dfs2(1); for(pii i: eg){ //if(i.ss == 5) cout<<cc(i.ff)<<endl; add_edge(i.ss, val[i.ss]); } #ifdef Local cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds "; #endif }

Compilation message (stderr)

construction.cpp: In function 'void dfs2(int)':
construction.cpp:47:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < adj[v].size();i++){
                    ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...