QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#577377#6885. Simple Tree ProblemJZYZ#ML 0ms0kbC++143.9kb2024-09-20 10:52:042024-09-20 10:52:05

Judging History

你现在查看的是最新测评结果

  • [2024-09-20 10:52:05]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:0kb
  • [2024-09-20 10:52:04]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std ;

typedef long long LL ;
const int N = 1e6+10 ;

int n , a[N] , rk , cnt[N] ;
map<int,int> mp ;
struct nn 
{
	int lst , to , val , id ;
}E[2*N] ;
int head[N] , tt0 ;
inline void add( int x , int y , int val , int id )
{
	E[++tt0] = (nn){head[x],y,val,id};
	head[x] = tt0 ;
}
int st[22][N] , Lg2[N] ;
void make_st()
{
	for(int i = 2 ; i <= rk ; i ++ ) Lg2[i] = Lg2[i/2] + 1 ;
	for(int i = 0 ; i <= 20 ; i ++ ) {
		if( i == 0 ) {
			for(int j = 1 ; j <= rk ; j ++ ) st[0][j] = cnt[j] ;
		}
		else {
			for(int j = 1 ; j <= rk-(1<<i)+1 ; j ++ ) {
				st[i][j] = max( st[i-1][j] , st[i-1][j+(1<<(i-1))] ) ;
			}
		}
	}
}
int ask( int l , int r )
{
	int k = Lg2[r-l+1] ;
	return max( st[k][l] , st[k][r-(1<<k)+1] ) ;  
}
struct Segtree
{
	int ls , rs , Max1 , Max2 ;
}t[26*N] ;
int tot , rt[N] ;
inline int build( int l , int r ) 
{
	tot ++ ;
	t[tot].ls = t[tot].rs = 0 ;
	t[tot].Max1 = 0 ;
	t[tot].Max2 = ask(l,r) ;
	return tot ; 
}
int query1( int p , int l , int r , int d ) // Max1 >= d 的最大的 x 
{
	if( !p ) return 0 ;
	if( l == r ) {
		if( t[p].Max1 >= d ) return l ;
		return 0 ;
	}
	int mid = (l+r)>>1 ;
	if( t[t[p].rs].Max1 >= d ) return query1( t[p].rs , mid+1 , r , d ) ;
	return query1( t[p].ls , l , mid , d ) ;
}
int query2( int p , int l , int r , int d ) // Max2 >= d 的最大的 x 
{
	if( l == r ) {
		if( t[p].Max2 >= d ) return l ;
		return 0 ;
	}
	int mid = (l+r)>>1 ;
	if( !t[p].rs ) t[p].rs = build(mid+1,r) ;
	if( t[t[p].rs].Max2 >= d ) return query2( t[p].rs , mid+1 , r , d ) ;
	if( !t[p].ls ) t[p].ls = build(l,mid) ;
	return query2( t[p].ls , l , mid , d ) ;
}
int Merge( int p , int q , int l , int r )
{
	if( !p ) return q ;
	if( !q ) return p ;
	if( l == r ) {
		t[p].Max1 += t[q].Max1 ;
		t[p].Max2 -= a[l]-t[q].Max2 ;
		return p ;
	}
	int mid = (l+r)>>1 ;
	t[p].ls = Merge( t[p].ls , t[q].ls , l , mid ) ;
	t[p].rs = Merge( t[p].rs , t[q].rs , mid+1 , r ) ;
	t[p].Max1 = max( t[t[p].ls].Max1 , t[t[p].rs].Max1 ) ;
	t[p].Max2 = max( t[p].ls?t[t[p].ls].Max2:ask(l,mid) , t[p].rs?t[t[p].rs].Max2:ask(mid+1,r) ) ;
	return p ;
}
void modify( int p , int l , int r , int x )
{
	if( l == r ) {
		t[p].Max1 ++ ;
		t[p].Max2 -- ;
		return ;
	}
	int mid = (l+r)>>1 ;
	if( x <= mid ) {
		if( !t[p].ls ) t[p].ls = build(l,mid) ;
		modify( t[p].ls , l , mid , x ) ;
	}
	else {
		if( !t[p].rs ) t[p].rs = build(mid+1,r) ;
		modify( t[p].rs , mid+1 , r , x ) ;
	}
	t[p].Max1 = max( t[t[p].ls].Max1 , t[t[p].rs].Max1 ) ;
	t[p].Max2 = max( t[p].ls?t[t[p].ls].Max2:ask(l,mid) , t[p].rs?t[t[p].rs].Max2:ask(mid+1,r) ) ;
}
int ans[N] ;
void dfs( int x , int fa )
{
	rt[x] = build(1,rk) ;
	for(int i = head[x] ; i ; i = E[i].lst ) {
		int t = E[i].to ;
		if( t == fa ) continue ;
		dfs( t , x ) ;
		// 在 rt[t] 中求 E[i].id 的答案 
		ans[E[i].id] = max( query1( rt[t] , 1 , rk , E[i].val ) , query2( rt[t] , 1 , rk , E[i].val ) ) ;
		rt[x] = Merge( rt[x] , rt[t] , 1 , rk ) ;
	}
	modify( rt[x] , 1 , rk , a[x] ) ;
}
int b[N] ;
void solve()
{
	scanf("%d" , &n ) ;
	for(int i = 1 ; i <= n ; i ++ ) {
		scanf("%d" , &a[i] ) ;
		b[i] = a[i] ;
	}
	sort( b+1 , b+n+1 ) ;
	rk = unique( b+1 , b+n+1 ) - (b+1) ;
	for(int i = 1 ; i <= n ; i ++ ) {
		a[i] = lower_bound( b+1 , b+rk+1 , a[i] ) - b ;
		cnt[a[i]] ++ ;
	}
	// [1,rk]
	int x , y , v ;
	for(int i = 1 ; i < n ; i ++ ) {
		scanf("%d%d%d" , &x , &y , &v ) ;
		add( x , y , v , i ) ;
		add( y , x , v , i ) ;
	}
	make_st() ;
	dfs( 1 , 0 ) ;
	for(int i = 1 ; i < n ; i ++ ) {
		printf("%d\n" , b[ans[i]] ) ;
	}
	tt0 = 0 ;
	for(int i = 1 ; i <= n ; i ++ ) {
		head[i] = 0 ;
		ans[i] = 0 ;
		cnt[i] = 0 ;
	}
}

int main()
{
	int t ;
	scanf("%d" , &t ) ;
	while( t -- ) solve() ;
	return 0 ;
}
/*
3
5
5 2 1 2 2
3 4 2
3 2 1
2 1 1
2 5 1

5
2 1 3 1 5
2 4 1
2 1 2
1 3 2
1 5 3

1
3
*/

详细

Test #1:

score: 0
Memory Limit Exceeded

input:

10000
96
378804736 378804736 101171470 683875564 378804736 997225055 448759149 683875564 683875564 997225055 152015654 83284224 229458933 101171470 229458933 448759149 448759149 152015654 101171470 600214219 378804736 997225055 448759149 152015654 229458933 229458933 83284224 997225055 229458933 600...

output:

997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
997225055
...

result: