답안 #69883

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
69883 2018-08-21T19:22:05 Z khohko Min-max tree (BOI18_minmaxtree) C++17
29 / 100
477 ms 48948 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
#define ll long long
#define pb push_back
#define fr first
#define sc second
#define MAX ((ll)(1e12+100))
#define MX ((ll)(1e6+100))
#define ARRS ((ll)(2e5+100))
#define HS ((ll)(233))
#define MOD ((ll)(1e9+7))
#define EP ((double)(1e-9))
#define LG 21
#define mul(a,b) a=((a)*(b))%MOD
using namespace std;

ll n,m,q;
set<ll> *st[ARRS];
vector<ll> v[ARRS];
vector<ll> g[ARRS];
ll mn[ARRS];
ll mx[ARRS];
ll pr[ARRS];

void go(ll x,ll p){
	pr[x]=p;
	st[x]=new set<ll>;
	for(auto y:g[x])
		st[x]->insert(y);
	//cout<<x<<endl;
	for(auto y:v[x]){
		if(y==p)continue;
		go(y,x);
		if(st[x]->size()<st[y]->size())swap(st[x],st[y]);
		for(auto k:*st[y]){
			if(st[x]->find(k)!=st[x]->end())
				st[x]->erase(k);
			else st[x]->insert(k);
		}
	}

	st[x]->insert(0);
	st[x]->insert(MAX);

	mx[x]=*st[x]->upper_bound(0);
	mn[x]=-(*st[x]->begin());
	//mx[x]=max(-1ll,mx[x]);
	if(mx[x]==MAX)mx[x]=-1;
	if(mn[x]==0)mn[x]=-1;
}

ll f[ARRS];
ll pas[ARRS];
map<ll,ll> mp;


bool mv(ll x){
	if(x==-1)return 0;
	if(!x)return 1;
	if(f[x])return 0;
	f[x]=1;
	if(mx[x]&&mv(mp[mx[x]])){
		mp[mx[x]]=x;
		return 1;
	}
	return 0;
}

int main(){
	#ifdef KHOKHO
		freopen("in.in","r",stdin);
		freopen("out.out","w",stdout);
	#endif // KHOKHO
	ios::sync_with_stdio(0);
	cin>>n;
	for(int i=0; i<n-1; i++){
		ll k,p;
		cin>>k>>p;
		v[k].pb(p);
		v[p].pb(k);
	}
	cin>>q;
	for(int i=0; i<q; i++){
		char ch;
		ll x,y,k;
		cin>>ch>>x>>y>>k;
		k++;
		if(ch=='m'){
			g[x].pb(-k);
			g[y].pb(-k);
		}
		else {
			g[x].pb(k);
			g[y].pb(k);
		}
	}
	go(1,-1);

	mp[-1]=-1;
	for(int i=2; i<=n; i++){
		ll x=i;
		if(mn[x]&&mv(mp[mn[x]])){
			mp[mn[x]]=x;
		}
		else if(mx[x]&&mv(mp[mx[x]])){
			f[x]=1;
			mp[mx[x]]=x;
		}
	}

	for(auto x:mp)
		pas[mp[x.fr]]=x.fr;

	for(int i=2; i<=n; i++){
		if(!pas[i])pas[i]=max(0ll,mn[i]);
		cout<<pr[i]<<" "<<i<<" "<<pas[i]-1<<endl;
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 9720 KB Output is correct
2 Correct 10 ms 9832 KB Output is correct
3 Correct 12 ms 10040 KB Output is correct
4 Correct 12 ms 10040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 414 ms 42872 KB Output is correct
2 Correct 442 ms 48948 KB Output is correct
3 Correct 444 ms 48948 KB Output is correct
4 Correct 467 ms 48948 KB Output is correct
5 Correct 477 ms 48948 KB Output is correct
6 Correct 444 ms 48948 KB Output is correct
7 Correct 397 ms 48948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 306 ms 48948 KB Output is correct
2 Correct 271 ms 48948 KB Output is correct
3 Correct 264 ms 48948 KB Output is correct
4 Correct 306 ms 48948 KB Output is correct
5 Correct 290 ms 48948 KB Output is correct
6 Correct 342 ms 48948 KB Output is correct
7 Correct 361 ms 48948 KB Output is correct
8 Incorrect 335 ms 48948 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 9720 KB Output is correct
2 Correct 10 ms 9832 KB Output is correct
3 Correct 12 ms 10040 KB Output is correct
4 Correct 12 ms 10040 KB Output is correct
5 Correct 414 ms 42872 KB Output is correct
6 Correct 442 ms 48948 KB Output is correct
7 Correct 444 ms 48948 KB Output is correct
8 Correct 467 ms 48948 KB Output is correct
9 Correct 477 ms 48948 KB Output is correct
10 Correct 444 ms 48948 KB Output is correct
11 Correct 397 ms 48948 KB Output is correct
12 Correct 306 ms 48948 KB Output is correct
13 Correct 271 ms 48948 KB Output is correct
14 Correct 264 ms 48948 KB Output is correct
15 Correct 306 ms 48948 KB Output is correct
16 Correct 290 ms 48948 KB Output is correct
17 Correct 342 ms 48948 KB Output is correct
18 Correct 361 ms 48948 KB Output is correct
19 Incorrect 335 ms 48948 KB Output isn't correct