HDU 4366 Successor( DFS序+ 线段树 )
Successor
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2631 Accepted Submission(s): 634
题目的意思是给出一棵树, 然后树上每个节点有能力值,忠诚值。给出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序+ 线段树 )的更多相关文章
- HDU - 4366 Successor DFS区间+线段树
Successor:http://acm.hdu.edu.cn/showproblem.php?pid=4366 参考:https://blog.csdn.net/colin_27/article/d ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU - 4366 Successor DFS序 + 分块暴力 or 线段树维护
给定一颗树,每个节点都有忠诚和能力两个参数,随意指定一个节点,要求在它的子树中找一个节点代替它,这个节点要满足能力值大于它,而且是忠诚度最高的那个. 首先,dfs一下,处理出L[i], R[i]表示d ...
- 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 ...
- 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 ...
- HDU 5692 Snacks(DFS序+线段树)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Educational Codeforces Round 6 E dfs序+线段树
题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...
- 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
随机推荐
- Python之反向迭代
需求:得到反方向迭代一个序列解决:使用内置的 reversed() 函数 a = [1, 2, 3, 4] for x in reversed(a): print(x) # 4 3 2 1 反向迭代仅 ...
- 【JAVA】eclipse-使用入门及常用快捷键
目录 下载与安装 HelloWorld 新建项目 视图与视窗 快捷键 个性化设置 导入项目 jar包 下载与安装 下载 网址:官网下载 注意: 下载javaee版 注意与本机的java环境相匹配,32 ...
- Matomo(Piwik)安装说明-----------基于LNPM环境
Matomo(Piwik)安装说明 安装前环境检查 Piwik要求PHP版本高于PHP5.5(选用PHP7.2) Piwik需要pdo和pdo_mysql或mysqli支持(选用mysqli) Piw ...
- 二、jquery Try{}catch(e){}
一.Try{}catch(e){} try{ $.each($("div"),function(i,item){ if(...){ throw("异常信息"); ...
- 【归纳】Layui table.render里的json后台传入
在使用Layui的table元素时,传入的json的数据格式是有其自身定义的,需要另外添加一些字符,以正确传入. 为了传入符合前端格式的数据: table.render({ elem: '#test' ...
- Swagger添加文件上传测试
先上对比图 图一无法选择文件,图二可以选择文件 图一 图二 添加过滤器 public class SwaggerFileUploadFilter : IOperationFilter { /// &l ...
- idea中创建.xml文件或别的文件
- Unit Testing of Classes in Java
Every class can have a main method. That is a handy trick for unit testing of classes. For example, ...
- Delphi Win API 函数 [ ShellAPI ] ShellExecute 函数
引用单元:uses ShellAPI; 函数原型:function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory ...
- IDEA不认识jstl
解决方案:一.在pom.xml文件查看是否<packaging>的值是否是war 二:在jsp文件中加上这句话. <%@page isELIgnored="false&q ...