3306: 树(线段树)

3306: 树

1.思路

  首先dfs整颗树将树转换线性结构,前两个操作比较简单,然后主要是对于操作三,有三种情况:

    1.x=rt,那么我们直接求出整颗树中的最小值就是答案;

    2.x在原树中为rt的祖先节点,那么我们首先求出从x到rt路径上的x的第一个节点y,那么答案就是除了以y为根的子树的其他所有节点的最小值;

    3.对于除了以上两种情况,直接求出以x为根的子树的最小值即为答案.

    

2.代码

 

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
#define ls rt<<1
#define rs rt<<1|1

struct Edge{
    int to, next;  
};

Edge e[N];
int head[N];
int dep[N];
int tot;

void addEdge(int u, int v) {
    e[++tot] = Edge{v, head[u]};
    head[u] = tot;
}

int a[N], b[N];
int l[N], r[N];
int dfs_clock;
int f[N][20];
void dfs(int u) {
    l[u] = ++ dfs_clock;
    a[dfs_clock] = b[u];
    for(int i = head[u]; i; i = e[i].next) {
        int to = e[i].to;
        dep[to] = dep[u] + 1;
        f[to][0] = u;
        dfs(to);
    }
    r[u] = dfs_clock;
}

int v[N<<2];
inline void pushUp(int rt) {
    v[rt] = v[ls] < v[rs]? v[ls] : v[rs];
} 

void build(int rt, int l, int r) {
    if(l == r) {
        v[rt] = a[l];
        return ;
    }
    int mid = (l + r) >> 1;
    build(ls, l, mid);
    build(rs, mid+1, r);
    pushUp(rt);
}

void update(int rt, int l, int r, int a, int b) {
    if(l == r) {
        v[rt] = b;
        return ;
    }
    int mid = (l + r) >> 1;
    if(a <= mid) {
        update(ls, l, mid, a, b);
    }
    else {
        update(rs, mid+1, r, a, b);
    }
    pushUp(rt);
}

int query(int rt, int l, int r, int a, int b) {
    if(a > b) return INT_MAX;
    if(a <= l && r <= b) {
        return v[rt]; 
    }
    int mid = (l + r) >> 1;
    int res = INT_MAX;
    if(a <= mid) {
        res = min(res, query(ls, l, mid, a, b));
    }
    if(b > mid) {
        res = min(res, query(rs, mid+1, r, a, b));
    }
    return res;
}

void initLca(int n) {
    for(int j = 1; j < 20; ++ j) {
        for(int i = 1; i <= n; ++ i) {
            f[i][j] = f[f[i][j-1]][j-1];
        }
    }
}

int go(int x, int d) {
    for(int i = 0; i < 20; ++ i) {
        if(d&(1<<i)) {
            x = f[x][i];
        }
    }
    return x;
}

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    int rt;
    for(int i = 1; i <= n; ++ i) {
        int x;
        scanf("%d%d", &x, &b[i]);
        if(x == 0) rt = i;
        else addEdge(x, i);
    } 
    dfs(rt);
    build(1, 1, n);
    initLca(n);
    while(m --) {
        char op[5];
        scanf("%s", op);
        if(op[0] == 'Q') {
            int x;
            scanf("%d", &x);
            if(x == rt) {
                printf("%d\n", v[1]);
            }
            /*  error
            else if(dep[x] > dep[rt]) {
                int res = query(1, 1, n, l[x], r[x]);
                printf("%d\n", res);
            } 
            */
            else if(l[x] < l[rt] && r[x] >= r[rt]) {
                int di = dep[rt] - dep[x] - 1; 
                int y = go(rt, di);
                int res = query(1, 1, n, 1, l[y]-1);
                res = min(res, query(1, 1, n, r[y]+1, n));
                printf("%d\n", res);
            }
            else {
                int res = query(1, 1, n, l[x], r[x]);
                printf("%d\n", res);
            }
        }
        else if(op[0] == 'V'){
            int x, y;
            scanf("%d%d", &x, &y);
            update(1, 1, n, l[x], y);
        }
        else {
            scanf("%d", &rt);
        }
    }

    return 0;
}

 

  

 

 

转载于:https://www.cnblogs.com/topk/p/7704492.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
毕设新项目基于python3.7+django+sqlite开发的学生就业管理系统源码+使用说明(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 学生就业管理系统(前端) ## 项目开发环境 - IDE: vscode - node版本: v12.14.1 - npm版本: 6.13.4 - vue版本: @vue/cli 4.1.2 - 操作系统: UOS 20 ## 1.进入项目目录安装依赖 ``` npm install ``` ## 2.命令行执行进入UI界面进行项目管理 ``` vue ui ``` ## 3.编译发布包(请注意编译后存储路径) #### PS:需要将编译后的包复制到后端项目的根目录下并命名为'static' 学生就业管理系统(后端) ## 1.项目开发环境 - IDE: vscode - Django版本: 3.0.3 - Python版本: python3.7.3 - 数据库 : sqlite3(测试专用) - 操作系统 : UOS 20 ## 2.csdn下载本项目并生成/安装依赖 ``` pip freeze > requirements.txt pip install -r requirements.txt ``` ## 3.项目MySQL数据库链接错误 [点击查看解决方法](https://www.cnblogs.com/izbw/p/11279237.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值