Submission #442062

#TimeUsernameProblemLanguageResultExecution timeMemory
442062kig9981Worst Reporter 4 (JOI21_worst_reporter4)C++17
100 / 100
451 ms107060 KiB
#include <bits/stdc++.h>

#ifdef NON_SUBMIT
#define TEST(n) (n)
#define tout cerr
#else
#define TEST(n) ((void)0)
#define tout cin
#endif

using namespace std;

vector<int> adj[200000];
map<int,long long> D[200000];
long long O[200000];
int P[200000], H[200000], C[200000], R[200000], cnt[200000];

void dfs(int c)
{
	long long v=C[c], m;
	for(auto n: adj[c]) {
		dfs(n);
		if(D[R[c]].size()<D[R[n]].size()) swap(R[c],R[n]);
		for(auto[a,b]: D[R[n]]) D[R[c]][a]+=b;
		O[c]+=O[n];
	}
	O[c]+=C[c];
	D[R[c]][H[c]]+=C[c];
	if(cnt[c]) {
		D[R[c]][H[c]+1]-=C[c];
		return;
	}
	while(v) {
		auto it=D[R[c]].upper_bound(H[c]);
		if(it==D[R[c]].end()) break;
		m=min(v,it->second);
		it->second-=m;
		v-=m;
		if(it->second==0) D[R[c]].erase(it);
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	TEST(freopen("input.txt","r",stdin));
	TEST(freopen("output.txt","w",stdout));
	TEST(freopen("debug.txt","w",stderr));
	int N;
	long long ans=0;
	queue<int> Q;
	cin>>N;
	for(int i=0;i<N;i++) {
		cin>>P[i]>>H[i]>>C[i];
		H[R[i]=i]=1000000000-H[i];
		cnt[--P[i]]++;
	}
	for(int i=0;i<N;i++) if(cnt[i]==0) Q.push(i);
	while(!Q.empty()) {
		int c=Q.front();
		Q.pop();
		if(--cnt[P[c]]==0) Q.push(P[c]);
	}
	for(int i=0;i<N;i++) if(cnt[i]==0) adj[P[i]].push_back(i);
	for(int i=0;i<N;i++) if(cnt[i]) dfs(i);
	for(int i=0;i<N;i++) if(cnt[i]) {
		long long mn;
		cnt[i]--;
		for(int p=P[i];p!=i;p=P[p]) {
			cnt[p]--;
			if(D[R[p]].size()>D[R[i]].size()) swap(R[p],R[i]);
			for(auto[a,b]: D[R[p]]) D[R[i]][a]+=b;
			O[i]+=O[p];
		}
		mn=O[i];
		for(auto[a,b]: D[R[i]]) mn=min(mn,O[i]-=b);
		ans+=mn;
	}
	cout<<ans<<'\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...