Submission #947016

#TimeUsernameProblemLanguageResultExecution timeMemory
947016amirhoseinfar1385Worst Reporter 4 (JOI21_worst_reporter4)C++17
100 / 100
558 ms137808 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn=200000+10;
long long mainres,n,p[maxn],c[maxn],todor[maxn],vas[maxn];
set<long long>adj[maxn];
set<pair<long long,long long>>dp[maxn];
map<long long,long long>mp;
map<long long,long long>h[maxn];

void vorod(){
	cin>>n;
	for(long long i=1;i<=n;i++){
		int d;
		cin>>p[i]>>d>>c[i];
		h[i][d]+=c[i];
		mainres+=c[i];
		if(i!=p[i]){
			adj[p[i]].insert(i);
		}
	}
}

void merge(long long u,long long v){
	long long fu=u;
	if((long long)dp[u].size()<(long long)dp[v].size()){
		swap(u,v);
	}
	for(auto x:dp[v]){
		auto y=*dp[u].lower_bound(make_pair(x.first,-1));
		if(y.first==x.first){
			dp[u].erase(y);
			y.second+=x.second;
			dp[u].insert(y);
		}else{
			dp[u].insert(x);
		}
	}
	if(fu!=u){
		swap(dp[u],dp[fu]);
	}
}

void ins(long long u,long long w,long long ww){
	long long moonde=ww;
	while(moonde>0&&(long long)dp[u].size()>0&&(*dp[u].begin()).first<w){
		auto xx=dp[u].lower_bound(make_pair(w,-1));
		xx--;
		auto x=*xx;
		if(x.second>=moonde){
			dp[u].erase(x);
			x.second-=moonde;
			dp[u].insert(x);
			break;
		}else{
			dp[u].erase(x);
			moonde-=x.second;
		}
	}
	if((long long)dp[u].size()==0||(*dp[u].begin()).first>w){
		dp[u].insert(make_pair(w,ww));
		return ;
	}
	auto xx=dp[u].lower_bound(make_pair(w,-1));
	auto x=*xx;
	if(x.first==w){
		dp[u].erase(x);
		x.second+=ww;
		dp[u].insert(x);
	}else{
		dp[u].insert(make_pair(w,ww));
	}
}

void solved(long long u){
	//cout<<"wtf: "<<u<<endl;
	for(auto x:adj[u]){
		solved(x);
		merge(u,x);
	}
	for(auto x:h[u]){
		ins(u,x.first,x.second);
	}
}
deque<int>wtf;

void cald(int u){
	if(vas[u]){
		while((int)wtf.size()>0&&wtf.back()!=u){
			wtf.pop_back();
		}
		return ;
	}
	vas[u]=1;
	wtf.push_front(u);
	cald(p[u]);
}

void pre(){
	for(int i=1;i<=n;i++){
		if(p[i]==i||vas[i]){
			continue;
		}
		cald(i);
		if((int)wtf.size()<=1){
			wtf.clear();
			continue;
		}
		set<int>st;
		for(auto x:wtf){
			st.insert(x);
		}
		int u=wtf.front();
		wtf.pop_front();
		p[u]=u;
		for(auto x:wtf){
			for(auto y:h[x]){
				h[u][y.first]+=y.second;
			}
			for(auto y:adj[x]){
				if(st.count(y)==0){
					adj[u].insert(y);
				}
			}
			adj[u].erase(x);
		}
		wtf.clear();
	}
}

void solve(){
	for(int i=1;i<=n;i++){
		if(p[i]!=i){
			continue;
		}
		solved(i);
		for(auto x:dp[i]){
			mainres-=x.second;
		}
	}
}

void khor(){
	cout<<mainres<<"\n";
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	//cout.tie(0);
	//freopen("inp.txt","r",stdin);
	vorod();
	pre();
//	//cout<<"ha"<<endl;
	solve();
	khor();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...