Successor

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2631    Accepted Submission(s): 634

Problem Description
Sean owns a company and he is the BOSS.The other Staff has one Superior.every staff has a loyalty and ability.Some times Sean will fire one staff.Then one of the fired man’s Subordinates will replace him whose ability is higher than him and has the highest loyalty for company.Sean want to know who will replace the fired man.
 
Input
In the first line a number T indicate the number of test cases. Then for each case the first line contain 2 numbers n,m (2<=n,m<=50000),indicate the company has n person include Sean ,m is the times of Sean’s query.Staffs are numbered from 1 to n-1,Sean’s number is 0.Follow n-1 lines,the i-th(1<=i<=n-1) line contains 3 integers a,b,c(0<=a<=n-1,0<=b,c<=1000000),indicate the i-th staff’s superior Serial number,i-th staff’s loyalty and ability.Every staff ‘s Serial number is bigger than his superior,Each staff has different loyalty.then follows m lines of queries.Each line only a number indicate the Serial number of whom should be fired.
 
Output
For every query print a number:the Serial number of whom would replace the losing job man,If there has no one to replace him,print -1.
 
Sample Input
1
3 2
0 100 99
1 101 100
1
2
 
Sample Output
2
-1
 
Author
FZU
 

  题目的意思是给出一棵树, 然后树上每个节点有能力值,忠诚值。给出m个询问,要你找出某个结点后代中,忠诚值最高且能力值比它大的。

  一开始思路不难想出要 , 按照能力值从大到小,编号从小到大排完再插入( 因为题目给出编号小的是上司 ,所以要先插入 ,因为如果下属先插入

的话 ,如果它属于同它能力值相同的上司的后代,他有可能影响了它上司的更新,没有符合能力值严格大于的条件 )。然后取出忠诚值最大的话就用一颗

线段树处理就OK了。关键是怎么保证取的范围是属于这个节点的后代呢, 我就是卡了这个 ,其实,处理完DFS序以后,那个区间正正是该节点的后代了。

最后单点更新该点到DFS序的起始点中就可以了。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <algorithm> using namespace std;
typedef long long LL;
typedef pair<LL,int> pii;
const int N = ;
const int inf = 1e9+; #define X first
#define Y second
#define root 1,n,1
#define lr rt<<1
#define rr rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1 int n,m; struct node{
int id,b,c;
bool operator<(const node &a)const{
if( c != a.c )return c>a.c;
else return id < a.id ;
}
}e[N]; int pos1[N] , pos2[N] , dfs_clock , ans[N] , F[N]; vector<int>g[N]; void Init() {
for( int i = ; i < N ; ++i ) g[i].clear();
}
void dfs( int u ) {
pos1[u] = pos2[u] = ++dfs_clock;
for( int i = ; i < g[u].size() ; ++i ) {
int v = g[u][i];
dfs(v); pos2[u] = pos2[v];
}
} int date[N<<] ; void Up( int rt ) {
if( date[rr] == - || ( F[ date[lr] ] >= F[ date[rr] ] ) ) date[rt] = date[lr] ;
else date[rt] = date[rr];
} void Build( int l , int r , int rt ) {
date[rt] = - ;
if( l == r ) return ;
int mid = (l+r)>>;
Build(lson) , Build(rson) ;
} void Update( int l , int r , int rt , int x ,int id ) {
if( l == r ) {
date[rt] = id ; return ;
}
int mid = (l+r)>>;
if( x <= mid ) Update(lson,x,id);
else Update(rson,x,id);
Up(rt);
} int Query( int l , int r , int rt , int L , int R ) {
if( l == L && r == R ) {
return date[rt];
}
int mid = (l+r)>>;
if( R <= mid ) return Query(lson,L,R);
else if( L > mid ) return Query(rson,L,R);
else {
int id1 = Query(lson,L,mid) , id2 = Query( rson,mid+,R ) ;
if( id2 == - || ( F[id1] >= F[id2] ) ) return id1 ;
else return id2 ;
}
} void Solve() {
dfs_clock = ; dfs();
Build(root);
sort( e , e + n ) ;
for( int i = ; i < n ; ++i ) {
int id = e[i].id ;
ans[id] = Query(root,pos1[id],pos2[id]);
Update(root,pos1[id],id );
}
} void Read() {
scanf("%d%d",&n,&m);
e[].id = , e[].c = e[].b = inf , F[] = inf ;
for( int i = ; i < n ; ++i ) {
int fa ;scanf("%d%d%d",&fa,&e[i].b,&e[i].c);
e[i].id = i ; F[i] = e[i].b ;
g[fa].push_back(i);
}
} void Output() {
while( m-- ) {
int x ;scanf("%d",&x);
printf("%d\n",ans[x]);
}
}
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
ios::sync_with_stdio(false);
int _ ; scanf("%d",&_);
while(_--) Init() , Read() , Solve() , Output() ;
}

HDU 4366 Successor( DFS序+ 线段树 )的更多相关文章

  1. HDU - 4366 Successor DFS区间+线段树

    Successor:http://acm.hdu.edu.cn/showproblem.php?pid=4366 参考:https://blog.csdn.net/colin_27/article/d ...

  2. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  3. HDU - 4366 Successor DFS序 + 分块暴力 or 线段树维护

    给定一颗树,每个节点都有忠诚和能力两个参数,随意指定一个节点,要求在它的子树中找一个节点代替它,这个节点要满足能力值大于它,而且是忠诚度最高的那个. 首先,dfs一下,处理出L[i], R[i]表示d ...

  4. hdu 4366 Successor - CDQ分治 - 线段树 - 树分块

    Sean owns a company and he is the BOSS.The other Staff has one Superior.every staff has a loyalty an ...

  5. Assign the task HDU - 3974(dfs序+线段树)

    There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...

  6. HDU 5692 Snacks(DFS序+线段树)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

  8. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

  9. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

随机推荐

  1. shell根据系统当前的时间向用户输出问候信息

  2. JAVA- 内部类及匿名内部类

    普通类,我们平时见到的那种类,就是一个后缀为.java的文件中,直接定义的类,比如 public Cat{ private String name; private int age; } 内部类, 内 ...

  3. openstack--all-in-one部署

    安装过程 本次宿主机(即安装OpenStack的机器)的操作系统是CentOS 7.5.安装的OpenStack是目前最新的rocky版本,官方文档建议机器至少有16 GB的内存,处理器硬件虚拟化扩展 ...

  4. centos6.5 相关命令

    挂载U盘 1.进入mnt目录: #cd /mnt 2.新建一个USB目录: #mkdir usb 3.查看U盘的目录: #fdisk –l 4.挂载: #mount –t vfat /dev/sdb1 ...

  5. 服务器构建CentOS+Jenkins+Git+Maven之爬坑

    ssh端口变更后,git如何访问远端中央代码库 参考来源: http://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin http://blog.csdn ...

  6. 网站升级HTTPS教程

    远程桌面连接工具 由于运营商的肆意劫持,越来越多的网站开始使用HTTPS协议,开启HTTPS会优待提升排名,我减少被劫持页面等等   现在越来越多的网站开始使用HTTPS协议,其实百度从2014年底就 ...

  7. 网络体系应用层之DNS系统

    1.概述 域名系统 DNS 是因特网使用的命名系统,用来把便于人们使用的机器名字(即域名)转换为 ip 地址. 用户与因特网上某个主机通信时,必须要知道对方的 ip 地址,然而用户很难记住长达32位二 ...

  8. 空间日志编辑器:word文档图文快速粘贴到web

    百度ueditor可以实现word文档图文快速粘贴到web 1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况 本文使用的后台是Java.前 ...

  9. paper 168: 2018-FATTEN 论文解析-feature space transfer for data augmentation

    paper download:https://arxiv.org/abs/1801.04356 本文的核心就是使用GAN网络生成新的数据. 这个总体框图,常规结构,具体是通过在appearance和p ...

  10. flutter 中的AppBar

    在flutter中的很多页面中,都会有下面这段代码: 对应就是下图中的红色线框区域,被称作AppBar顶部导航. 项目准备 在使用AppBar之前,我们先新建一个tabBar的项目: 然后在pages ...