This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
int n,p[200005],h[200005];
ll val[200005];
vector<int> adj[200005];
set<ll> ss[200005];
map<ll,ll> temp[200005];
bool mark[200005],vis[200005];
void dfs1(int x) {
vis[x]=true;
for (auto s : adj[x]) if (!vis[s]) dfs1(s);
}
void dfs2(int x) {
for (auto s : adj[x]) dfs2(s);
if (!mark[x]) {
if (adj[x].size()) {
swap(ss[x],ss[adj[x][0]]);
swap(temp[x],temp[adj[x][0]]);
for (int i=1; i<adj[x].size(); ++i) {
int c=adj[x][i];
if (ss[c].size()>ss[x].size()) swap(temp[x],temp[c]), swap(ss[x],ss[c]);
for (auto s : ss[c]) temp[x][s]+=temp[c][s], ss[x].insert(s);
}
}
temp[x][0]+=val[x]; ss[x].insert(0);
temp[x][h[x]]-=val[x]; ss[x].insert(h[x]);
temp[x][h[x]+1]+=val[x]; ss[x].insert(h[x]+1);
if (temp[x][h[x]]<0) {
ll k=-temp[x][h[x]];
auto it=ss[x].find(h[x]);
temp[x][h[x]]=0;
auto h=it; --it;
ss[x].erase(h);
while (true) {
if (temp[x][*it]<k) {
k-=temp[x][*it];
temp[x][*it]=0;
auto h=it; --it;
ss[x].erase(h);
} else {
temp[x][*it]-=k;
if (temp[x][*it]==0) ss[x].erase(it);
break;
}
}
}
} else {
ss[x].insert(0);
temp[x][0]=val[x];
for (auto s : adj[x]) temp[x][0]+=temp[s][0];
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin>>n;
for (int i=1; i<=n; ++i) {
cin>>p[i]>>h[i]>>val[i];
adj[p[i]].push_back(i);
}
ll ans=0;
for (int i=1; i<=n; ++i) {
if (!vis[i]) {
dfs1(i);
while (!vis[p[i]]) {
i=p[i];
dfs1(i);
}
for (int j=0; j<adj[p[i]].size(); ++j) {
if (adj[p[i]][j]==i) {
swap(adj[p[i]][j],adj[p[i]].back());
adj[p[i]].pop_back();
break;
}
}
int idx=p[i];
bool same=true;
while (idx!=i) {
if (val[idx]!=val[i]) same=false;
idx=p[idx];
}
if (!same) {
idx=p[i];
while (idx!=i) {
mark[idx]=true;
idx=p[idx];
}
mark[i]=true;
}
dfs2(i);
ans+=temp[i][0];
}
}
cout<<ans;
}
Compilation message (stderr)
worst_reporter2.cpp: In function 'void dfs2(int)':
worst_reporter2.cpp:26:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
26 | for (int i=1; i<adj[x].size(); ++i) {
| ~^~~~~~~~~~~~~~
worst_reporter2.cpp: In function 'int main()':
worst_reporter2.cpp:83:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
83 | for (int j=0; j<adj[p[i]].size(); ++j) {
| ~^~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |