제출 #1296389

#제출 시각아이디문제언어결과실행 시간메모리
1296389GrayElection Campaign (JOI15_election_campaign)C++20
100 / 100
213 ms48408 KiB
// #pragma GCC optimize("Ofast,unroll-loops") #include <algorithm> #include<bits/stdc++.h> #define ll long long #define ld long double #define mp make_pair #define ff first #define ss second #define ln "\n" using namespace std; const ll INF = 2e18; const ll MOD = 1e9+7; ll n, m; vector<vector<ll>> A; vector<array<ll, 3>> r; vector<vector<ll>> bin, check; vector<ll> level, tin, tout, dp; void generatetr(ll u, ll p, ll clev, ll &timer){ tin[u]=timer; timer++; bin[u][0]=p; level[u]=clev; for (ll i=1; i<20; i++) bin[u][i]=bin[bin[u][i-1]][i-1]; for (auto v:A[u]){ if(v==p) continue; generatetr(v, u, clev+1, timer); } tout[u]=timer-1; } ll lca(ll u, ll v){ if (level[u]<level[v]) swap(u, v); ll cl = level[u]-level[v]; for (ll i=0; i<20; i++) if ((1<<i)&cl) u=bin[u][i]; if (u==v) return u; for (ll i=19; i>=0; i--){ if (bin[u][i]!=bin[v][i]) { u=bin[u][i]; v=bin[v][i]; } } return bin[u][0]; } pair<ll, ll> plca(ll u, ll v){ if (level[u]<level[v]) swap(u, v); if (level[u]!=level[v]){ ll cl = level[u]-level[v]-1; for (ll i=0; i<20; i++) if ((1<<i)&cl) u=bin[u][i]; if (bin[u][0]==v) { return {u, v}; } u=bin[u][0]; } for (ll i=19; i>=0; i--){ if (bin[u][i]!=bin[v][i]) { u=bin[u][i]; v=bin[v][i]; } } return {u, v}; } struct Fenwick{ vector<ll> tr; ll n, off; Fenwick(ll N){ off=10; n=N+20; tr.resize(n+1); } void add(ll i, ll x){ i+=off; for (; i<=n; i+=(-i&i)) tr[i]+=x; } ll get(ll i){ i+=off; ll res=0; for (; i; i-=(-i&i)) res+=tr[i]; return res; } }; void dfs(ll u, ll p, Fenwick &tr){ ll sum=0; for (auto v:A[u]){ if (v==p) continue; dfs(v, u, tr); sum+=dp[v]; } ll best=sum; for (auto i:check[u]){ pair<ll, ll> cons = plca(r[i][0], r[i][1]); // cout << i << " - " << r[i][2] << " - " << r[i][0] << " w " << r[i][1] << " : " << cons.ff << " & " << cons.ss << " calc: " << tr.get(tin[r[i][0]])+tr.get(tin[r[i][1]])+sum-dp[cons.ff]-dp[cons.ss]+r[i][2] << ln; best=max(best, tr.get(tin[r[i][0]])+tr.get(tin[r[i][1]])+sum-dp[cons.ff]-dp[cons.ss]+r[i][2]); } dp[u]=best; // cout << u << ": " << best << ln; for (auto v:A[u]){ if (v==p) continue; tr.add(tin[v], sum-dp[v]); tr.add(tout[v]+1, -sum+dp[v]); } tr.add(tin[u], sum); tr.add(tin[u]+1, -sum); } void solve(){ cin >> n; A.resize(n+1); tin.resize(n+1); tout.resize(n+1); check.resize(n+1); dp.resize(n+1); level.resize(n+1); bin.resize(n+1, vector<ll>(20)); for (ll i=0; i<n-1; i++){ ll u, v; cin >> u >> v; A[u].push_back(v); A[v].push_back(u); } ll timer=0; generatetr(1, 1, 1, timer); cin >> m; r.resize(m); for (ll i=0; i<m; i++){ cin >> r[i][0] >> r[i][1] >> r[i][2]; ll lc = lca(r[i][0], r[i][1]); check[lc].push_back(i); } Fenwick tr(n); dfs(1, 1, tr); cout << dp[1] << ln; } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); ll t=1; // cin >> t; while (t--) { solve(); } }
#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...