Submission #544693

#TimeUsernameProblemLanguageResultExecution timeMemory
544693leakedWorst Reporter 4 (JOI21_worst_reporter4)C++14
100 / 100
717 ms241320 KiB
#include <bits/stdc++.h> #define f first #define s second #define m_p make_pair #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define vec vector #define pb push_back #define sz(x) (int)(x).size() #define pw(x) (1LL<<(x)) #define fast_resp ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef long double ld; typedef pair<int,ll> pil; template<class T> bool umin(T &a,const T &b){return (a>b?a=b,1:0);} template<class T> bool umax(T &a,const T &b){return (a<b?a=b,1:0);} const int N=2e5+1; const ll inf=1e18; vec<int> g[N]; int c[N],a[N],h[N]; int tt=1; struct segtree{ ll t[40*N],p[40*N]; int l[40*N],r[40*N]; ll d1,d2; segtree(){ t[0]=0; fill(t,t+40*N,0); fill(l,l+40*N,0); fill(r,r+40*N,0); fill(p,p+40*N,0); } void push(int v,int tl,int tr){ if(!p[v]) return; if(!l[v]) l[v]=tt++; if(!r[v]) r[v]=tt++; assert(tt<40*N); for(auto &u : {l[v],r[v]}) p[u]+=p[v],t[u]+=p[v]; p[v]=0; return; } void upd(int i,ll x,int &v,int tl=0,int tr=N-1){ if(!v) v=tt++; assert(tt<40*N); if(tl==tr){ t[v]=x; return; } int tm=(tl+tr)>>1;push(v,tl,tr); if(tm>=i) upd(i,x,l[v],tl,tm); else upd(i,x,r[v],tm+1,tr); t[v]=min(t[l[v]],t[r[v]]); } ll get(int l1,int r1,int v,int tl=0,int tr=N-1){ if(!v || tl>r1 || tr<l1) return 0; if(tl>=l1&&tr<=r1) return t[v]; int tm=(tl+tr)>>1;push(v,tl,tr); return min(get(l1,r1,l[v],tl,tm),get(l1,r1,r[v],tm+1,tr)); } int mg(int v,int u,int tl,int tr){ if(!v && !u) return 0; if(tl==tr){ umin(d1,t[v]);umin(d2,t[u]); if(!v){ t[u]=d1+d2; return u; } t[v]=d1+d2; return v; } if(!v){ umin(d2,t[u]); p[u]+=d1; t[u]+=d1; return u; } if(!u){ umin(d1,t[v]); p[v]+=d2; t[v]+=d2; return v; } int tm=(tl+tr)>>1; if(l[u] || r[u]) push(u,tl,tr); if(l[v] || r[v]) push(v,tl,tr); p[v]=p[u]=0; r[v]=mg(r[v],r[u],tm+1,tr); l[v]=mg(l[v],l[u],tl,tm); t[v]=d1+d2; return v; } int Merge(int v,int u){ d1=d2=0; return mg(v,u,0,N-1); } }sega; ll toadd=0; //map<int,ll> mp; int root[N]; int rt[N],used[N],u[N]; vec<pil> cost[N]; vec<int> ord; void dfs1(int v){ if(u[v]) return; u[v]=1; for(auto &z : g[v]) dfs1(z); ord.pb(v); } void dfs(int v){ u[v]=0; // cout<<"DFS "<<v<<endl; for(auto &z : g[v]){ dfs(z); root[v]=sega.Merge(root[v],root[z]); } for(auto &z : cost[v]) sega.upd(z.f,sega.get(z.f,N-1,root[v])-z.s,root[v]); } signed main(){ fast_resp; int n; cin>>n; vec<int>kek; ll sm=0; for(int i=0;i<n;i++){ cin>>a[i]>>h[i]>>c[i];--a[i]; kek.pb(h[i]);sm+=c[i]; } sort(all(kek));kek.erase(unique(all(kek)),kek.end()); for(int i=0;i<n;i++) h[i]=lower_bound(all(kek),h[i])-kek.begin(); for(int i=0;i<n;i++){ if(used[i]) continue; int v=i; while(!used[v]){ // cout<<"CHECK "<<v<<endl; used[v]=1; v=a[v]; } vec<pil> who; map<int,ll> mp; ll s=0; int st=v; while(used[v]==1){ mp[h[v]]+=c[v]; s+=c[v]; rt[v]=st; used[v]=2; // cerr<<"CYC "<<v<<' '; v=a[v]; } // cout<<endl; for(auto &z : mp) cost[st].pb(z); v=i; while(used[v]==1){ rt[v]=v; cost[v].pb({h[v],c[v]}); used[v]=2; v=a[v]; } } for(int i=0;i<n;i++){ if(rt[i]!=rt[a[i]]) g[rt[a[i]]].pb(rt[i]); } for(int i=0;i<n;i++){ if(rt[i]==i) dfs1(i); } // return 0; reverse(all(ord)); for(auto &i : ord){ if(!u[i]) continue; // cout<<"WT "<<i<<endl; dfs(i); sm+=sega.get(0,N-1,root[i]); } cout<<sm; return 0; } /* 3 1 3 6 1 2 5 1 5 6 6 1 6 5 1 3 6 1 8 4 3 4 9 2 2 5 2 5 6 2 1 89 964898447 2 40 952129455 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...