[线段数]hdu 4366 Successor

线段树解决查找替换问题
该博客介绍如何使用线段树解决一个在树形结构中寻找最大忠诚值子孙的问题。首先通过DFS将树转化为线性结构,然后按能力值排序,用线段树进行查询和插入操作。代码中展示了线段树的构建、更新和查询函数,并给出了完整的C++实现。
/**
[线段数]hdu 4366 Successor
在能力值大于自身能力的子孙中找一个最大忠诚值的取代自己
一个很好的线段树,关键在于思维要到。
先dfs标记时间戳将树形结构转化为线性结构
建树
将能力值从大到小排序后依次查询,插入

题目保证了每个staff的loyty不一样,故可以给他和编号做个映射。
*/
#include <stdio.h>
#include <string.h>
#include <map>
#include <algorithm>
#include <vector>

using namespace std;

#define N 100000
#define L(i) (i << 1)
#define R(i) (i << 1 | 1)
int titamp = 0;

vector<int> g[N];
map<int,int> mp;
struct _staff
{
    int loy,abt,id;
    void input(int i)
    {
        int f;
        scanf("%d%d%d",&f,&loy,&abt);
        g[f].push_back(i);
        id = i;
        mp[loy] = i;
    }
}sta[N];

struct _st
{
    int l,r,maxx;
    int mid()
    {
        return (l + r) >> 1;
    }
}st[N<<1];

boo
### Successor 的定义与用法 在编程领域,`successor` 通常指代某个对象、节点或状态的“后继者”。具体含义和用法取决于上下文环境。以下是 `successor` 在不同场景中的定义与用法: #### 1. 据结构中的 Successor据结构中,`successor` 常用于描述一个节点的直接后继节点。例如,在二叉搜索树(Binary Search Tree, BST)中,某个节点的 successor 是其右子树中最左侧的节点[^1]。如果该节点没有右子树,则需要沿着父节点路径向上查找,直到找到第一个值大于当前节点的祖先节点。 ```python def find_successor(node): if node is None: return None # 如果有右子树,successor 是右子树中最左节点 if node.right: current = node.right while current.left: current = current.left return current # 如果没有右子树,则沿父节点路径向上查找 ancestor = node.parent child = node while ancestor and child == ancestor.right: child = ancestor ancestor = ancestor.parent return ancestor ``` #### 2. 责任链模式中的 Successor 在责任链设计模式中,`successor` 表示处理请求的下一个对象。每个对象都有一个指向其后继者的引用,并将请求沿着链传递给下一个处理器,直到某个处理器能够处理该请求为止[^3]。 ```java abstract class Handler { protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } public abstract void handleRequest(int request); } class ConcreteHandlerA extends Handler { @Override public void handleRequest(int request) { if (request >= 0 && request < 10) { System.out.println("ConcreteHandlerA handled request " + request); } else if (successor != null) { successor.handleRequest(request); } } } class ConcreteHandlerB extends Handler { @Override public void handleRequest(int request) { if (request >= 10 && request < 20) { System.out.println("ConcreteHandlerB handled request " + request); } else if (successor != null) { successor.handleRequest(request); } } } ``` #### 3. 接口实现中的 Successor 在接口设计中,`successor` 可以表示一种逻辑上的继承关系或行为扩展。通过实现接口,类可以定义自己的行为,同时遵循接口的规范[^2]。虽然接口本身不涉及 `successor` 的具体定义,但在某些框架中,接口可能被用来描述某种顺序或链条关系。 ```java interface ChainElement { void setNext(ChainElement successor); void process(Request request); } class Authentication implements ChainElement { private ChainElement successor; @Override public void setNext(ChainElement successor) { this.successor = successor; } @Override public void process(Request request) { if (request.isAuthenticated()) { System.out.println("User is authenticated."); if (successor != null) { successor.process(request); } } else { System.out.println("Authentication failed."); } } } ``` ### 总结 `Successor` 的定义和用法因上下文而异。在据结构中,它通常指代节点的后继;在责任链模式中,它是请求传递链中的下一个处理器;在接口实现中,它可以表示逻辑上的继承或行为扩展。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值