好题。   可是感觉题目描写叙述不是非常清楚

这题仅仅是询问开除某人后,他的下属中谁会替代他的位置。不会更新这个位置

要求一个子树中忠诚度最高的人。

能够想到dfs树。保留时间戳。每一个节点便表示一个区间

那么便能够建树维护最高忠诚度。。。仅仅是要保证能力值也要比被开除者高

那么依据能力值从大到小对员工排序,依次更新。那么能够保证之前更新的节点的能力值都大于当前要查询的节点

这里要注意一点,能力值同样的员工要同一时候查询和更新

最后一点是。。

。按理说更新时应该更新这个员工表示的区间   可是这样会超时

事实上仅仅用更新此员工区间的第一个值就能够了,由于查询的时候是员工表示的区间。那么必定能够查询到更新的这个值

记得数组开大一点。。。非常easyRE

//#pragma comment(linker, "/STACK:102400000,102400000")
//HEAD
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm> #include <queue>
#include <string>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <cstdlib> using namespace std;
//LOOP
#define FE(i, a, b) for(int i = (a); i <= (b); ++i)
#define FED(i, b, a) for(int i = (b); i>= (a); --i)
#define REP(i, N) for(int i = 0; i < (N); ++i)
#define CLR(A,value) memset(A,value,sizeof(A))
//STL
#define PB push_back
//INPUT
#define RI(n) scanf("%d", &n)
#define RII(n, m) scanf("%d%d", &n, &m)
#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define RS(s) scanf("%s", s) #define FF(i, a, b) for(int i = (a); i < (b); ++i)
#define FD(i, b, a) for(int i = (b) - 1; i >= (a); --i)
#define CPY(a, b) memcpy(a, b, sizeof(a))
#define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define EQ(a, b) (fabs((a) - (b)) <= 1e-10)
#define ALL(c) (c).begin(), (c).end()
#define SZ(V) (int)V.size()
#define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p)
#define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q)
#define WI(n) printf("%d\n", n)
#define WS(s) printf("%s\n", s)
#define sqr(x) x * x #define LL(x) ((x) << 1)
#define RR(x) ((x) << 1 | 1)
typedef vector <int> VI;
typedef unsigned long long ULL;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxn = 50010;
const double eps = 1e-10;
const LL MOD = 1e9 + 9; int n, m, dfs_c;
int s[maxn], e[maxn];
int ans[maxn];
map<int, int> mm; struct Node{
int id, loy, ab;
bool operator<(const Node& x) const{
if (ab != x.ab)
return ab > x.ab;
return id < x.id;
}
}a[maxn]; struct Seg{
int l, r, num;
}seg[maxn * 5]; VI t[maxn]; void dfs(int u, int fa)
{
s[u] = ++dfs_c;
REP(i, t[u].size())
{
int v = t[u][i];
if (v != fa)
dfs(v, u);
}
e[u] = ++dfs_c;
} void build(int l, int r, int rt )
{
seg[rt].num = -1;
seg[rt].l = l, seg[rt].r = r;
if (l == r)
return;
int mid = (l + r) >> 1;
build(l, mid, LL(rt));
build(mid + 1, r, RR(rt));
} void update(int pos, int val, int rt)
{
if (seg[rt].l == seg[rt].r && seg[rt].l == pos)
{
// cout << "pos " << pos << ' ' << val<< endl;
seg[rt].num = val;
return;
}
int mid = (seg[rt].l + seg[rt].r) >> 1;
if (pos <= mid)
update(pos, val, LL(rt));
else
update(pos, val, RR(rt));
seg[rt].num = max(seg[LL(rt)].num, seg[RR(rt)].num);
} int query(int l, int r, int rt)
{
if (seg[rt].l == l && seg[rt].r == r)
return seg[rt].num;
int mid = (seg[rt].l + seg[rt].r) >> 1;
if (r <= mid)
return query(l, r, LL(rt));
else if (l > mid)
return query(l, r, RR(rt));
return max(query(l, mid, LL(rt)), query(mid + 1, r, RR(rt)));
} int main()
{
int T; RI(T);
while (T--)
{
RII(n, m);
REP(i, n + 1) t[i].clear();
dfs_c = 0; mm.clear();
int x, y, z;
a[0].id = 0, a[0].loy = -1, a[0].ab = -1;
FE(i, 1, n - 1)
{
RIII(x, y, z);
t[x].PB(i);
a[i].loy = y, a[i].ab = z, a[i].id = i;
mm[y] = i;
}
dfs(0, -1);
// cout << "dfs Done" << endl;
build(1, dfs_c, 1);
// cout << "build Done" << endl;
sort(a, a + n);
CLR(ans, -1);
for (int i = 0, j; i < n; i = j)
{
j = i;
while (j < n && a[j].ab == a[i].ab)
{
int tmp = query(s[a[j].id], e[a[j].id], 1);
if (mm.count(tmp))
ans[a[j].id] = mm[tmp];
// cout << tmp << endl;
j++;
}
for (int k = i; k < j; k++)
update(s[a[k].id], a[k].loy, 1);
// for (int k = 1; k < 3 * dfs_c; k++)
// printf(" L: %d R:%d num:%d\n", seg[k].l, seg[k].r , seg[k].num);
}
while (m--)
{
RI(x);
WI(ans[x]);
}
}
return 0;
}
/* */

hdu4366 Successor的更多相关文章

  1. HDU4366 Successor【dfs序 分块】

    HDU4366 Successor 题意: 给出一棵根为\(1\)的树,每个点有两个权值\(x,y\),每次询问一个点的子树中\(x\)比这个点的\(x\)大且\(y\)值最大的那个点 题解: 如果以 ...

  2. hdu4366 Successor (dfs序+zkw线段树)

    Successor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  3. 【HDU4366】【DFS序+分块】Successor

    Problem Description Sean owns a company and he is the BOSS.The other Staff has one Superior.every st ...

  4. [LeetCode] Inorder Successor in BST 二叉搜索树中的中序后继节点

    Given a binary search tree and a node in it, find the in-order successor of that node in the BST. No ...

  5. Leetcode 285. Inorder Successor in BST

    Given a binary search tree and a node in it, find the in-order successor of that node in the BST. 本题 ...

  6. Inorder Successor in Binary Search Tree

    Given a binary search tree (See Definition) and a node in it, find the in-order successor of that no ...

  7. 71 Query Rank Min Max Successor of BST

    [本文链接] http://www.cnblogs.com/hellogiser/p/query-min-max-successor-of-bst.html [代码]  C++ Code  12345 ...

  8. LeetCode Inorder Successor in BST

    原题链接在这里:https://leetcode.com/problems/inorder-successor-in-bst/ Given a binary search tree and a nod ...

  9. 285. Inorder Successor in BST

    题目: Given a binary search tree and a node in it, find the in-order successor of that node in the BST ...

随机推荐

  1. 转:PHP关于反斜杠处理函数addslashes()和stripslashes()的用法

    1.php处理\函数:addslashes()和stripslashes()函数 addslashes():对输入字符串中的某些预定义字符前添加反斜杠,这样处理是为了数据库查询语句等的需要.这些预定义 ...

  2. ASP.NET 对字符串大小写切换

    来源:http://www.codeproject.com/Tips/297011/How-to-Toggle-String-Case-in-NET#alternative22 使用LINQ: pub ...

  3. maven 错误处理

    如果是方法找不到或者返回参数变了,那么肯定是包被升级了,那么到仓库下把对应的包删掉,然后maven自动下载最新的. 如果是包找不到,或者类找不到,那么把maven ->update maven可 ...

  4. vs开发 winform 设置winform 获取管理员权限启动

    因为需要设置为开机项 没有管理员权限对注册表访问失败 C# 以管理员身份运行WinForm程序 转载https://www.bbsmax.com/A/obzbkKrQJE/ 鱼洛 2016-07-29 ...

  5. Error parsing XML: not well-formed (invalid token) 报错

    鼠标右键选择Source然后再选Format 就可以解决此问题

  6. wait/waitpid函数与僵尸进程、fork 2 times

    一.僵尸进程 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程, ...

  7. spring mvc 依赖包

    <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop&l ...

  8. django1.8读书笔记模型高级进阶

    一.访问外键和多对多值 例如:模型类定义如下 from django.db import models class Publisher(models.Model): name = models.Cha ...

  9. [na]那些OVER的封装(pppoe/ppp/ipsec)

    什么over什么,如pppoe, ppp的封装都在over对象之后,入下图: PPPOE Ipsec

  10. [na]acl拒绝访问流量审计

    acl审计拒绝的流量及拒绝提示 interface Ethernet0/0 ip address 12.1.1.2 255.255.255.0 ip access-group 10 in half-d ...