답안 #69891

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
69891 2018-08-21T20:28:49 Z khohko Min-max tree (BOI18_minmaxtree) C++17
29 / 100
462 ms 45196 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)
		if(x.fr>0)pas[x.sc]=x.fr;
 
	for(int i=2; i<=n; i++){
		if(!pas[i]){
          pas[i]=1;
          if(mn[i]>=0)
          pas[i]=mn[i];
          if(mx[i]>=0)
          pas[i]=mx[i];
        }
		cout<<pr[i]<<" "<<i<<" "<<pas[i]-1<<endl;
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 9720 KB Output is correct
2 Correct 11 ms 9832 KB Output is correct
3 Correct 11 ms 9912 KB Output is correct
4 Correct 13 ms 9992 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 402 ms 40596 KB Output is correct
2 Correct 386 ms 45196 KB Output is correct
3 Correct 421 ms 45196 KB Output is correct
4 Correct 462 ms 45196 KB Output is correct
5 Correct 376 ms 45196 KB Output is correct
6 Correct 355 ms 45196 KB Output is correct
7 Correct 377 ms 45196 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 264 ms 45196 KB Output is correct
2 Correct 260 ms 45196 KB Output is correct
3 Correct 223 ms 45196 KB Output is correct
4 Correct 245 ms 45196 KB Output is correct
5 Correct 263 ms 45196 KB Output is correct
6 Correct 277 ms 45196 KB Output is correct
7 Correct 267 ms 45196 KB Output is correct
8 Incorrect 290 ms 45196 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 9720 KB Output is correct
2 Correct 11 ms 9832 KB Output is correct
3 Correct 11 ms 9912 KB Output is correct
4 Correct 13 ms 9992 KB Output is correct
5 Correct 402 ms 40596 KB Output is correct
6 Correct 386 ms 45196 KB Output is correct
7 Correct 421 ms 45196 KB Output is correct
8 Correct 462 ms 45196 KB Output is correct
9 Correct 376 ms 45196 KB Output is correct
10 Correct 355 ms 45196 KB Output is correct
11 Correct 377 ms 45196 KB Output is correct
12 Correct 264 ms 45196 KB Output is correct
13 Correct 260 ms 45196 KB Output is correct
14 Correct 223 ms 45196 KB Output is correct
15 Correct 245 ms 45196 KB Output is correct
16 Correct 263 ms 45196 KB Output is correct
17 Correct 277 ms 45196 KB Output is correct
18 Correct 267 ms 45196 KB Output is correct
19 Incorrect 290 ms 45196 KB Output isn't correct