QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#577382 | #6885. Simple Tree Problem | forgive_ | ML | 0ms | 0kb | C++14 | 3.9kb | 2024-09-20 10:57:26 | 2024-09-20 10:57:27 |
answer
#include<bits/stdc++.h>
using namespace std ;
typedef long long LL ;
const int N = 1e6+5 ;
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[21][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 ; tot = 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
*/
Details
Tip: Click on the bar to expand more detailed information
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 ...