Submission #956700

#TimeUsernameProblemLanguageResultExecution timeMemory
956700andrei_boacaConstellation 3 (JOI20_constellation3)C++17
100 / 100
585 ms96632 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; ll n,A[300005],m,total; ll up[300005],down[300005]; vector<ll> who[300005]; vector<ll> add[300005]; ll in[300005],out[300005],timp,dp[300005]; struct star { ll x,y,c; } v[300005]; struct event { ll tip,poz; /// 0 -> zid, 1 -> stea }; vector<event> ev[300005]; set<pair<pll,ll>> setik; ll par[300005]; vector<ll> muchii[300005]; bool comp(event a, event b) { return a.tip<b.tip; } int nrnodes; void build(int nod) { timp++; in[nod]=timp; for(int i:muchii[nod]) if(i!=par[nod]) { par[i]=nod; build(i); } out[nod]=timp; } ll aib[300005]; ll lsb(ll x) { return x&(-x); } void update(ll poz,ll val) { for(int i=poz;i<=nrnodes;i+=lsb(i)) aib[i]+=val; } ll suma(ll poz) { ll rez=0; for(int i=poz;i>=1;i-=lsb(i)) rez+=aib[i]; return rez; } void intervupd(ll l,ll r,ll val) { update(l,val); update(r+1,-val); } void dfs(int nod) { ll sum=0; for(ll i:muchii[nod]) { dfs(i); sum+=dp[i]; } intervupd(in[nod],in[nod],sum); for(ll i:muchii[nod]) { sum-=dp[i]; intervupd(in[i],out[i],sum); sum+=dp[i]; } dp[nod]=sum; for(ll ind:add[nod]) { ll val=suma(in[down[ind]])+v[ind].c; dp[nod]=max(dp[nod],val); } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++) { cin>>A[i]; ev[A[i]].push_back({0,i}); } cin>>m; for(int i=1;i<=m;i++) { cin>>v[i].x>>v[i].y>>v[i].c; total+=v[i].c; ev[v[i].y].push_back({1,i}); who[v[i].x].push_back(i); } setik.insert({{1,n},1}); nrnodes=1; for(int lin=n;lin>=1;lin--) { sort(ev[lin].begin(),ev[lin].end(),comp); for(event p:ev[lin]) { int tip=p.tip; if(tip==0) { int poz=p.poz; auto it=prev(setik.lower_bound({{poz+1,0},0})); int l=(*it).first.first; int r=(*it).first.second; int nod=(*it).second; for(int i:who[poz]) down[i]=nod; setik.erase(it); int l1=l,r1=poz-1; int l2=poz+1,r2=r; if(l1<=r1) { nrnodes++; setik.insert({{l1,r1},nrnodes}); muchii[nod].push_back(nrnodes); par[nrnodes]=nod; } if(l2<=r2) { nrnodes++; setik.insert({{l2,r2},nrnodes}); muchii[nod].push_back(nrnodes); par[nrnodes]=nod; } } else { int ind=p.poz; auto it=prev(setik.lower_bound({{v[ind].x+1,0},0})); int nod=(*it).second; up[ind]=nod; add[nod].push_back(ind); } } } build(1); dfs(1); cout<<total-dp[1]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...