답안 #868177

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
868177 2023-10-30T16:21:16 Z amirhoseinfar1385 Magic Tree (CEOI19_magictree) C++17
13 / 100
2000 ms 15440 KB
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
vector<int>adj[maxn];
int n,m,k;
pair<int,int>allq[maxn];
set<pair<int,int>>st[maxn];

void insert(int u){
	if(allq[u].second==0){
		return ;
	}
	auto x=allq[u];
	pair<int,int>y;
	if((int)st[u].size()>0&&(*st[u].rbegin()).first>x.first){
		y=*st[u].lower_bound(make_pair(x.first,-1));
	}
	else{
		y.first=-1;
	}
	if(y.first==x.first){
		x.second+=y.second;
		st[u].erase(y);
	}
	st[u].insert(x);
	int z=x.first;
	while((int)st[u].size()>0&&(*st[u].rbegin()).first>z){
		y=*st[u].lower_bound(make_pair(z+1,-1));
		if(y.second<allq[u].second){
			st[u].erase(y);
			allq[u].second-=y.second;
		}	
		else{
			st[u].erase(y);
			y.second-=allq[u].second;
			st[u].insert(y);
			allq[u].second=0;
			break;
		}
	}
}

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

/*void co(int u){
	cout<<"u: "<<u<<" \n";
	for(auto x:st[u]){
		cout<<x.first<<" "<<x.second<<"\n";
	}
}*/

void solve(int u=1){
	if((int)adj[u].size()==0){
		insert(u);
		//co(u);
		return ;
	}
	solve(adj[u][0]);
	swap(st[u],st[adj[u][0]]);
	for(int i=1;i<(int)adj[u].size();i++){
		solve(adj[u][i]);
		merge(u,adj[u][i]);
	}
	insert(u);
	//co(u);
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++){
		int d;
		cin>>d;
		adj[d].push_back(i);
	}
	for(int i=0;i<m;i++){
		int v,d,w;
		cin>>v>>d>>w;
		allq[v]=make_pair(d,w);
	}
	solve();
	long long res=0;
	for(auto x:st[1]){
		res+=x.second;
	}
	cout<<res<<'\n';
}

Compilation message

magictree.cpp: In function 'void merge(int, int)':
magictree.cpp:44:11: warning: unused variable 'fv' [-Wunused-variable]
   44 |  int fu=u,fv=v;
      |           ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8028 KB Output is correct
2 Correct 2 ms 8284 KB Output is correct
3 Incorrect 2 ms 8284 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 48 ms 15440 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8284 KB Output is correct
2 Correct 2 ms 8284 KB Output is correct
3 Incorrect 2 ms 8284 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2094 ms 9976 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8028 KB Output is correct
2 Correct 2 ms 8284 KB Output is correct
3 Incorrect 2 ms 8284 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 8540 KB Output is correct
2 Correct 22 ms 9968 KB Output is correct
3 Correct 22 ms 9928 KB Output is correct
4 Correct 16 ms 10072 KB Output is correct
5 Correct 7 ms 8924 KB Output is correct
6 Correct 16 ms 10856 KB Output is correct
7 Correct 16 ms 13144 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8028 KB Output is correct
2 Correct 2 ms 8284 KB Output is correct
3 Incorrect 2 ms 8284 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8028 KB Output is correct
2 Correct 2 ms 8284 KB Output is correct
3 Incorrect 2 ms 8284 KB Output isn't correct
4 Halted 0 ms 0 KB -