JZOJ4918. 最近公共祖先
来源:互联网 发布:js点击屏幕 隐藏div 编辑:程序博客网 时间:2024/04/30 00:28
题目大意
给定一棵
有
- 将一个点染为黑点
- 询问一个点
u 找到除自己外的一个黑点v 使得u,v 的LCA的权值尽可能大,输出这个权值。
Data Constraint
题解
考虑单独计算每个点对其他点的贡献。
对于一个修改操作
所以线段树维护答案,做区间修改操作即可。
时间复杂度:
SRC
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std ;#define N 100000 + 10struct Tree { int val , tag ;} T[4*N] ;bool Exist[N] ;int Node[2*N] , Next[2*N] , Head[N] , tot ;int W[N] , fa[N] , DFN[N] , R[N] ;int n , m , Cnt , ret ;void link( int u , int v ) { Node[++tot] = v ; Next[tot] = Head[u] ; Head[u] = tot ;}void DFS( int x ) { DFN[x] = R[x] = ++ Cnt ; for (int p = Head[x] ; p ; p = Next[p] ) { if ( Node[p] == fa[x] ) continue ; fa[Node[p]] = x ; DFS( Node[p] ) ; R[x] = R[Node[p]] ; }}void Update( int v ) { if ( T[v].tag <= 0 ) return ; int ls = v + v , rs = v + v + 1 ; T[ls].val = max( T[ls].val , T[v].tag ) ; T[rs].val = max( T[rs].val , T[v].tag ) ; T[ls].tag = max( T[ls].tag , T[v].tag ) ; T[rs].tag = max( T[rs].tag , T[v].tag ) ; T[v].tag = 0 ;}void Modify( int v , int l , int r , int x , int y , int value ) { if ( x > y ) return ; if ( l == x && r == y ) { T[v].val = max( T[v].val , value ) ; T[v].tag = max( T[v].tag , value ) ; return ; } Update( v ) ; int mid = (l + r) / 2 ; if ( y <= mid ) Modify( v + v , l , mid , x , y , value ) ; else if ( x > mid ) Modify( v + v + 1 , mid + 1 , r , x , y , value ) ; else { Modify( v + v , l , mid , x , mid , value ) ; Modify( v + v + 1 , mid + 1 , r , mid + 1 , y , value ) ; } T[v].val = max( T[v+v].val , T[v+v+1].val ) ;}void Search( int v , int l , int r , int x ) { if ( l == x && r == x ) { ret = T[v].val ; return ; } Update( v ) ; int mid = (l + r) / 2 ; if ( x <= mid ) Search( v + v , l , mid , x ) ; else Search( v + v + 1 , mid + 1 , r , x ) ; T[v].val = max( T[v+v].val , T[v+v+1].val ) ;}int main() { freopen( "lca.in" , "r" , stdin ) ; freopen( "lca.out" , "w" , stdout ) ; scanf( "%d%d" , &n , &m ) ; for (int i = 1 ; i <= n ; i ++ ) scanf( "%d" , &W[i] ) ; for (int i = 1 ; i < n ; i ++ ) { int u , v ; scanf( "%d%d" , &u , &v ) ; link( u , v ) ; link( v , u ) ; } DFS( 1 ) ; memset( T , -1 , sizeof(T) ) ; for (int i = 1 ; i <= m ; i ++ ) { char op[10] ; scanf( "%s" , op + 1 ) ; if ( op[1] == 'M' ) { int x ; scanf( "%d" , &x ) ; Modify( 1 , 1 , n , DFN[x] , R[x] , W[x] ) ; if ( Exist[x] ) continue ; Exist[x] = 1 ; while ( fa[x] ) { int y = fa[x] ; Modify( 1 , 1 , n , DFN[y] , DFN[x] - 1 , W[y] ) ; Modify( 1 , 1 , n , R[x] + 1 , R[y] , W[y] ) ; if ( Exist[y] ) break ; Exist[y] = 1 ; x = y ; } } else { int x ; scanf( "%d" , &x ) ; ret = -1 ; Search( 1 , 1 , n , DFN[x] ) ; printf( "%d\n" , ret ) ; } }}
以上.
1 0
- [JZOJ4918]最近公共祖先
- JZOJ4918. 最近公共祖先
- 【JZOJ4918】最近公共祖先
- JZOJ4918.【GDOI2017模拟12.9】最近公共祖先
- 最近公共祖先LCA
- 最近公共祖先(LCA)
- 最近公共祖先
- Lca 最近公共祖先
- 【最近公共祖先】Tree
- LCA----最近公共祖先
- 最近公共祖先问题
- LCA (最近公共祖先)
- POJ1330(最近公共祖先)
- 最近公共祖先
- 最近公共祖先模版
- 最近公共祖先问题
- 最近公共祖先
- 最近公共祖先
- 摸爬滚打DirectX11_day03——Direct3d程序流程分析
- 手机访问网站自动跳转到手机页面
- 排序算法:希尔排序(优化插入排序)
- 哈尔滨理工大学第六届程序设计团队赛—D
- HDU 1846 巴什博弈 (裸题) 同2188
- JZOJ4918. 最近公共祖先
- java基础--native关键字
- px4原生源码学习-(2)--实时操作系统篇
- android 上传图片到服务器端
- 过一遍HTML标签(三)
- Dlib人脸特征点检测性能测试(光照+各部分功能模块运行时间)
- ExtJS 6.2 GPL 及离线文档下载地址
- Struts2中的验证
- ID 在很多数中间出现次数为奇数的数