CF1017G The Tree

本文介绍了一种结合树剖分与线段树的数据结构优化算法,用于解决复杂查询与更新问题。通过树剖分预处理和线段树动态维护,实现高效查询与修改操作,特别适用于树形结构数据的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


/*
这是什么神仙题目QAQ

首先考虑在序列上的问题

先不考虑修改成白色, 一个白点能r被染成黑色 意味着能够找到一个l使得在l-r中的操作1次数大于等于
r - l + 1
我们把初始值覆盖成-1就相当于单点+1求最大后缀和了

然后覆盖成白色, 相当于在这个点减去一些值使得最后到达他的最大后缀是-1, 然后对子树进行覆盖

上树同理 树剖即可 

*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#define pii pair<int, int>
#include<cmath>
#define ll long long
#define M 100010
#define mmp make_pair
using namespace std;
int read() {
    int nm = 0, f = 1;
    char c = getchar();
    for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
    for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
    return nm * f;
}
int fa[M], sz[M], son[M], dfn[M], dft, top[M], deep[M], n, q;
vector<int> to[M];
#define ls now << 1
#define rs now << 1 | 1
#define lson l, mid, now << 1
#define rson mid + 1, r, now << 1 | 1

void dfs(int now, int f) {
    deep[now] = deep[f] + 1;
    sz[now] = 1;
    for(int i = 0; i < to[now].size(); i++) {
        int vj = to[now][i];
        dfs(vj, now);
        if(sz[son[now]] < sz[vj]) son[now] = vj;
        sz[now] += sz[vj];
    }
}

void dfs(int now) {
    dfn[now] = ++dft;
    if(son[now]) {
        top[son[now]] = top[now];
        dfs(son[now]);
    }
    for(int i = 0; i < to[now].size(); i++) {
        int vj = to[now][i];
        if(vj == son[now]) continue;
        top[vj] = vj;
        dfs(vj);
    }
}

int len[M << 2], mx[M << 2], s[M << 2], laz[M << 2];

void pushup(int now) {
    mx[now] = max(mx[rs], mx[ls] + s[rs]);
    s[now] = s[ls] + s[rs];
}

void add(int now) {
    laz[now] = 1;
    mx[now] = -1, s[now] = -len[now];
}

void pushdown(int now) {
    if(!laz[now]) return;
    add(ls);
    add(rs);
    laz[now] = 0;
}
void build(int l, int r, int now) {
    len[now] = r - l + 1;
    if(l == r) {
        mx[now] = s[now] = -1;
        return;
    }
    int mid = (l + r) >> 1;
    build(lson), build(rson);
    pushup(now);
}

void modify(int l, int r, int now, int pl, int v) {
    if(l > pl || r < pl) return;
    if(l == r) {
        mx[now] += v, s[now] += v;
        return;
    }
    pushdown(now);
    int mid = (l + r) >> 1;
    modify(lson, pl, v), modify(rson, pl, v);
    pushup(now);
}

void cover(int l, int r, int now, int ln, int rn) {
    if(l > rn || r < ln) return;
    if(l >= ln && r <= rn) {
        add(now);
        return;
    }
    pushdown(now);
    int mid = (l + r) >> 1;
    cover(lson, ln, rn), cover(rson, ln, rn);
    pushup(now);
}
pair<int,int> biao, tmp;

pii operator + (pii a, pii b) {
    return mmp(max(b.first, a.first + b.second), a.second + b.second);
}

pii que(int l, int r, int now, int ln, int rn) {
    if(l >= ln && r <= rn) return mmp(mx[now], s[now]);
    int mid = (l + r) >> 1;
    pushdown(now);
    if(rn <= mid) return que(lson, ln, rn);
    if(ln > mid) return que(rson, ln, rn);
    return que(lson, ln, rn) + que(rson, ln, rn);
}

int query(int x) {
    tmp = biao;
    for(; x; x = fa[top[x]]) {
        tmp = que(1, n, 1, dfn[top[x]], dfn[x]) + tmp;
    }
    return tmp.first;
}

int main() {
    biao = mmp(-0x3e3e3e3e, 0);
    n = read(), q = read();
    for(int i = 2; i <= n; i++) fa[i] = read(), to[fa[i]].push_back(i);
    dfs(1, 1);
    top[1] = 1;
    dfs(1);
    build(1, n, 1);
    while(q--) {
        int op = read(), x = read();
        if(op == 1) {
            modify(1, n, 1, dfn[x], 1);
        }
        if(op == 2) {
            int t = query(x);
            modify(1, n, 1, dfn[x], -(t + 1));
            if(sz[x] > 1) cover(1, n, 1, dfn[x] + 1, dfn[x] + sz[x] - 1);
        }
        if(op == 3) {
            puts(query(x) >= 0 ? "black" : "white");
        }
    }
    return 0;
}


转载于:https://www.cnblogs.com/luoyibujue/p/10519489.html

<think>好的,用户遇到了ROS Melodic安装时的依赖问题,具体是在安装ros-melodic-desktop-full时出现依赖未满足的错误。我需要根据提供的引用信息来找出解决方法。 首先,用户提到使用sudo apt install ros-melodic-desktop-full时,报错依赖问题。引用[2]中的情况类似,依赖包无法安装。可能的解决方法包括更新软件源、使用aptitude替代apt,或者手动安装缺失的依赖。 引用[2]的解决方法是建议使用sudo aptitude install来安装,因为它能处理更复杂的依赖关系。而引用[3]提到更换为中科大的源解决了问题。所以,我需要综合这两个方法。 步骤可能包括:首先确保软件源正确,特别是ROS的源是否已正确添加,并且更新了包列表。如果源没有问题,可以尝试使用aptitude,因为它有时能提供解决方案。如果仍然不行,可能需要手动安装每个缺失的依赖包。 另外,用户可能在之前的尝试中,软件源配置有误,导致无法找到这些包。需要检查/etc/apt/sources.list.d/中的ROS源是否正确,并运行sudo apt update更新。 总结解决步骤:1. 检查并更换为国内源;2. 更新软件包列表;3. 使用aptitude安装;4. 手动安装依赖。同时,提醒用户注意版本兼容性和系统更新状态。</think>### 逐步解决方案 #### 1. 检查软件源配置 **问题根源**:依赖项无法安装通常与软件源未正确配置或未更新有关。ROS Melodic要求Ubuntu 18.04系统,且需添加官方或国内镜像源[^3]。 **操作步骤**: 1. 确认已添加ROS仓库: ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' ``` 2. 添加密钥: ```bash sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 ``` 3. 更换国内镜像源(如中科大源): ```bash sudo sed -i 's/packages.ros.org/mirrors.ustc.edu.cn\/ros\/ubuntu/g' /etc/apt/sources.list.d/ros-latest.list ``` #### 2. 更新软件包列表 ```bash sudo apt update ``` #### 3. 使用aptitude安装(推荐) aptitude工具能更灵活解决依赖冲突[^2][^3]: 1. 安装aptitude: ```bash sudo apt install aptitude ``` 2. 执行批量安装: ```bash sudo aptitude install ros-melodic-desktop-full ros-melodic-desktop ros-melodic-perception ros-melodic-simulators ros-melodic-urdf-sim-tutorial ``` - **交互操作**:若提示依赖冲突,按`n`查看备选方案,选择允许降级或删除冲突包的选项(通常选方案1)。 #### 4. 手动安装缺失依赖 若上述失败,可单独安装缺失组件: ```bash sudo apt install ros-melodic-desktop ros-melodic-perception ros-melodic-simulators ros-melodic-urdf-sim-tutorial ``` #### 5. 验证安装 ```bash source /opt/ros/melodic/setup.bash printenv | grep ROS ``` ### 关键注意事项 1. **系统版本**:确保使用Ubuntu 18.04,其他版本会导致依赖不兼容。 2. **网络环境**:国内用户需优先使用镜像源加速下载[^3]。 3. **依赖冲突**:避免混合安装不同ROS版本或手动修改系统库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值