poj 3237 Tree 树链剖分 线段树

蓝桥杯STM32G431RBT6学习——GPIO 阅读详情

题目链接

题意

给定一棵树,每条边上都有权值。
三种操作:
1. 修改某条边的权值
2. 将某条树链上所有边的权值变为相反数
3. 询问某条树链上的最大边权

思路

先树链剖分,然后建线段树,维护一段的最大值和最小值( Lazy Tag 好题)。

Code

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lson (rt << 1)
#define rson (rt << 1 | 1)
#define maxn 100010
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
struct Edge {
    int to, ne, w;
    Edge(int a = 0, int b = 0, int c = 0) : to(a), ne(b), w(c) {}
}edge[maxn * 2];
struct node {
    int l, r, mx, mn, flag;
}tr[maxn * 4];
struct E {
    int u, v;
    E(int a = 0, int b = 0) : u(a), v(b) {}
}e[maxn];
int fa[maxn], dep[maxn], ne[maxn], son[maxn], sz[maxn], val[maxn], top[maxn], le[maxn], tot, cnt, p[maxn], w[maxn];
void add(int u, int v, int w) {
    edge[tot] = Edge(v, ne[u], w);
    ne[u] = tot++;
}
void dfs1(int u, int f, int d) {
    fa[u] = f, dep[u] = d, sz[u] = 1;
    for (int i = ne[u]; ~i; i = edge[i].ne) {
        int v = edge[i].to;
        if (v == f) continue;
        val[v] = edge[i].w;
        dfs1(v, u, d + 1);
        sz[u] += sz[v];
        if (son[u] == -1 || sz[son[u]] < sz[v]) son[u] = v;
    }
}
void dfs2(int u, int sp) {
    top[u] = sp; le[u] = ++cnt;
    if (son[u] == -1) return;
    dfs2(son[u], sp);
    for (int i = ne[u]; ~i; i = edge[i].ne) {
        int v = edge[i].to;
        if (v == fa[u] || v == son[u]) continue;
        dfs2(v, v);
    }
}
void swapp(int& mx, int& mn) {
    int temp = mx;
    mx = -mn;
    mn = -temp;
}
void push_up(int rt) {
    tr[rt].mx = max(tr[lson].mx, tr[rson].mx);
    tr[rt].mn = min(tr[lson].mn, tr[rson].mn);
}
void push_down(int rt) {
    if (tr[rt].flag) {
        tr[lson].flag ^= 1, tr[rson].flag ^= 1;
        swapp(tr[lson].mx, tr[lson].mn), swapp(tr[rson].mx, tr[rson].mn);
        tr[rt].flag = 0;
    }
}
void build(int rt, int l, int r) {
    tr[rt].l = l, tr[rt].r = r; tr[rt].flag = 0;
    if (l == r) { tr[rt].mx = tr[rt].mn = w[l]; return; }
    int mid = l + r >> 1;
    build(lson, l, mid); build(rson, mid + 1, r);
    push_up(rt);
}
void modify1(int rt, int l, int r) {
    if (tr[rt].l == l && tr[rt].r == r) {
        tr[rt].flag ^= 1;
        swapp(tr[rt].mx, tr[rt].mn);
        return;
    }
    push_down(rt);
    int mid = tr[rt].l + tr[rt].r >> 1;
    if (r <= mid) modify1(lson, l, r);
    else if (l > mid) modify1(rson, l, r);
    else { modify1(lson, l, mid); modify1(rson, mid + 1, r); }
    push_up(rt);
}
void modify2(int rt, int x, int w) {
    if (tr[rt].l == tr[rt].r) {
        tr[rt].mx = tr[rt].mn = w;
        return;
    }
    push_down(rt);
    int mid = tr[rt].l + tr[rt].r >> 1;
    if (x <= mid) modify2(lson, x, w);
    else modify2(rson, x, w);
    push_up(rt);
}
int query(int rt, int l, int r) {
    if (tr[rt].l == l && tr[rt].r == r) return tr[rt].mx;
    push_down(rt);
    int mid = tr[rt].l + tr[rt].r >> 1;
    if (r <= mid) return query(lson, l, r);
    else if (l > mid) return query(rson, l, r);
    else return max(query(lson, l, mid), query(rson, mid + 1, r));
}
int ask(int u, int v) {
    int fau = top[u], fav = top[v], ans = -inf;
    while (fau != fav) {
        if (dep[fau] < dep[fav]) swap(u, v), swap(fau, fav);
        ans = max(ans, query(1, le[fau], le[u]));
        u = fa[fau], fau = top[u];
    }
    if (u == v) return ans;
    if (dep[u] < dep[v]) swap(u, v);
    ans = max(ans, query(1, le[v]+1, le[u]));
    return ans;
}
void change(int u, int v) {
    int fau = top[u], fav = top[v];
    while (fau != fav) {
        if (dep[fau] < dep[fav]) swap(u, v), swap(fau, fav);
        modify1(1, le[fau], le[u]);
        u = fa[fau], fau = top[u];
    }
    if (u == v) return;
    if (dep[u] < dep[v]) swap(u, v);
    modify1(1, le[v]+1, le[u]);
}
void work() {
    tot = cnt = 0; memset(ne, -1, sizeof ne); memset(son, -1, sizeof son);
    int n;
    scanf("%d", &n);
    for (int i = 1; i < n; ++i) {
        int w;
        scanf("%d%d%d", &e[i].u, &e[i].v, &w);
        add(e[i].u, e[i].v, w); add(e[i].v, e[i].u, w);
    }
    dfs1(1, -1, 0); dfs2(1, 1);
    for (int i = 1; i <= n; ++i) w[le[i]] = val[i];
    for (int i = 1; i < n; ++i) p[i] = dep[e[i].u] > dep[e[i].v] ? e[i].u : e[i].v;
    build(1, 1, n);
    char s[10];
    while (scanf("%s", s) && s[0] != 'D') {
        int u, v;
        scanf("%d%d", &u, &v);
        if (s[0] == 'Q') printf("%d\n", ask(u, v));
        else if (s[0] == 'N') change(u, v);
        else modify2(1, le[p[u]], v);
    }
}
int main() {
    int T;
    scanf("%d", &T);
    while (T--) work();
    return 0;
}
智能网联汽车电子电气架构(下) 从资产的表现形式, 可以分为数据、 软件、 硬件、 服务等, 而从需要保护的业务过程和活动、 所关注信息的角度, 资产类型可包括基于 ECU 的控制功能、 与特定车辆相关的信息、 车辆状态信息、 用户信息、 配置信息、 特定的软件、 内容等。面向新一代 EEA 的安全需求, 基于芯片提供的 OTP, 或SHE\HSM 的安全存储能力, 实现系统关键数据(身份、 密钥等关键信息) 的安全存储, 保证系统的关键数据不被盗取、 破坏、 改写。结合攻击者的动机与识别出的系统用例, 分析对汽车电子系统可能的攻击。 阅读详情

相关推荐

使用nvm离线安装、管理node多版本以及配置环境变量(亲测)

使用nvm离线安装、管理node多版本以及配置环境变量(亲测)

JMHJAVA的专栏 1328

树链剖分+线段树 poj3237 Tree

传送门:点击打开链接 题意:3种操作,1单点更新,2路径正负反转,3路径查询最大值 思路:线段树维护最大值和最小值和一个懒惰标记,然后在线段树的基础上用树链剖分维护 #include #include #include #include #include #include #include #include #include #include #include #include #inclu

qwb的博客 856

cdh zookeeper未授权访问(安全漏洞)处理

前言: 最近公司在做安全漏洞扫描。发现cdh zookeeper存在未授权访问的问题。 ZooKeeper的节点有5种操作权限: CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写) 注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限 ZooKeeper的身份的认证有4种方式: world:默认方式,相当于全世界都能访问 auth:代表已经认证通过的..

belialxing的专栏 2446

poj 3237 Tree 题解(树链剖分,线段树)

原题链接: poj 题意简述 多组数据。给定一个树,带边权,要支持三种操作,分别是: 两个节点之间的路径的边权全部×−1\times -1×−1,即取相反数 单边修改边权值 求两个节点之间路径上的最长边 数据 输入 第一行一个ttt,表示有ttt组数据。对于每一个数据,先有一个nnn,表示点数。然后n−1n-1n−1行,每行两个数a,b,ca,b,ca,b,c表示a,ba,ba,b之间有一个边...

LightningUZ的博客 287

医学图像处理实战:ABIDE数据集获取与预处理全攻略

本文详细介绍了ABIDE数据集的获取与预处理全流程,涵盖官方脚本下载、Nilearn库高效下载、数据预处理与格式转换等关键步骤。ABIDE数据集作为自闭症脑成像研究的重要资源,提供了标准化的功能磁共振成像数据,适合机器学习模型训练。文章还提供了常见问题排查与优化建议,帮助开发者高效处理医学图像数据。

weixin_29069131的博客 255

企业华为TaurusDB数据库国产替代要点全记录

国产化数据库全方位对比、从互联网企业的先进经验来看mysql的用法、及sql优化、sql异构修改、及数据同步方面都做了一些讲解

深耕互联网的码农,在AI及国产化浪潮下,希望把自己的能力输出给更多的人 1063

「POJ3237」Tree【树链剖分+线段树】

题目链接:http://poj.org/problem?id=3237 Tree Time Limit: 5000MS Memory Limit: 131072K Description You are given a tree with NNN nodes. The tree’s nodes are numbered 111 through NNN and its edges are numbe...

wzw 234

基于RK3588边缘计算平台的人数统计系统设计与实现

针对人数统计场景优化的YOLOv5模型完整的模型转换和部署流程高效的嵌入式推理优化方案低成本、低功耗的部署方案实时性强,满足工业应用需求可扩展性好,适配多种应用场景引入注意力机制,提高小目标检测能力结合多模态信息,增强系统鲁棒性开发可视化管理平台,提升用户体验随着边缘计算和AIoT技术的快速发展,基于深度学习的智能视觉系统必将在更多领域发挥重要作用。本项目为相关应用的开发和部署提供了有价值的参考,为推动人工智能技术的产业化应用做出了积极贡献。

LXY_LOVE36的博客 145

POJ 3237 Tree (树链剖分+线段树)

题意: http://poj.org/problem?id=3237 给一棵树,操作三种  CHANGE i v Change the weight of the ith edge to v NEGATE a b Negate the weight of every edge on the path from a to b QUERY 

缺氧 704

DC/DC开关电源学习笔记(十三)Buck-Boost升降压电路工作原理

Buck-Boost电路是一种能够实现输出电压高于或低于输入电压的DC-DC变换器,且输出电压极性与输入电压相反。它结合了Buck(降压)和Boost(升压)两种拓扑的特点,广泛应用于需要灵活电压调整的场合,如电池供电设备、LED驱动和工业控制系统。本文将从电路结构、工作原理、关键公式推导及实际应用等方面进行详细分析。

小幽余生不加糖 3504

第81篇:Vibe Coding时代:LangGraph + Eval评估体系实战,解决 Agent 优化全靠感觉的问题

本文介绍了一个为LangGraph Coding Agent设计的评估体系解决方案。文章首先指出了当前AI Coding Agent开发中的常见问题:优化过程缺乏客观评估标准,导致改进效果难以量化。随后提出了一个完整的评估框架,包括评估指标(任务成功率、质量指标、安全指标、成本指标和流程指标)、项目结构设计和评估案例集。 核心内容包括: 设计了JSON格式的评估案例集,覆盖正常任务、边界任务和高风险场景 实现了模拟Agent输出的演示代码 构建了多维度评分系统,包括关键词匹配、禁用词检测和成本评估 提供了评

sundong_81的博客 47

POJ 3237 Tree (树链剖分+线段树)

POJ 3237 Tree题目大意:给你n个结点的树,有三种操作: 1.CHANGE i v 将i号边边权变为v 2.NEGATE a b 将a点到b点路径上的边权取相反数 3.QUERY a b 找到a点到b点路径上的边权的最大值 输出所有3操作结果,指令结束标志为”DONE”. 有多组数据.题目分析:(又滚去做树链剖分的题,元旦放假前开始做到现在,233)将边权转化成相连两点中子节点的

Continue 1041

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

POJ3237 Tree 树链剖分 线段树

欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树。树的节点被编号为1到N,边被编号为1到N-1。每一条边有一个权值。然后你要在树上执行一系列指令。指令可以是如下三种之一: CHANGE i v:将第i条边的权值改成v。 NEGATE a b:将点a到点b路径上所有边的...

weixin_30408165的博客 123

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【POJ3237】Tree 树链剖分+线段树

【POJ3237】Tree Description You are given a tree withNnodes. The tree’s nodes are numbered 1 throughNand its edges are numbered 1 throughN− 1. Each edge is associated with a weight. Then ...

aodanchui1057的博客 140

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

poj3237tree【树链剖分入门题+线段树】

休息了两天,今天开始做树链剖分,除了模板长以外,还是挺好理解的。就只是线段树+剖分独特的函数,然后树链剖分所用的数组有点多,没了。其中需要注意的一个点是“链”(路径)不一定是从根节点到叶子节点的,轻儿子这个点它也有重儿子啊啊啊。 再说这个题,单点更新,区间取相反数,区间求最大值。 /*********** poj3237 2015.1.23 2504K 657MS C++ 6396B ****

MissZhou要努力 1628

(树链剖分+线段树)POJ - 3237 Tree

前言: 一直听说树链剖分-树链剖分,现在见识一下,,,感觉不是很难0.0 看了一下kuangbin模板基本秒懂 对于点,按重边优先给予每个点一个编号,对于一条重链上的点,编号则是连续的,将所有编号映射到线段树上,即可进行一切区间操作。 对于边的处理,我们将所有边对应到这条边节点更深的那个点上即可。 如果需要的操作只有求和,和单点更新/区间更新,直接用树状数组也是可以的,可能常数...

dijieluan7764的博客 170

poj3237--Tree(树链剖分+线段树)

题目链接:poj--3237 题意很简单,给出n个节点的一棵树,有三种操作: 1、C修改第i条边的值为v 2、N改变节点a到b内边的权值的符号(取反) 3、Q询问节点a到b内权值的最大值 首先树链剖分,将边整合到线段树上,线段树数组cl,因为存在取反操作,所以最大值可能是由最小值取反得到,所以记录最大和最小值,cl[i][0]记录第i段的最大值,cl[i][1]记录最小值,lazy做标记

随风的专栏 945

【POJ3237】Tree(树链剖分+线段树(基于边权))

题目链接 题目大意: 有T组数据 给你n个点的树 有三种操作: 1.CHANGE i v :将第i条边的值改为v 2.NEGATE a b :将a点到b点路径上的边权取反 3.QUERY a b :查询a点到b点路径上最大的边权值由于有取反操作,我们记录最大值的同时记录下最小值 如果要取反,则将最大最小值取反并交换即可 用线段树维护注意懒惰标记

No Program No Life 621

poj 3237 Tree 树链剖分+线段树

Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbered 1 through N − 1. Each edge is associated with a weight. Then you are to execute a s...

weixin_30278237的博客 135

poj3237Tree 【树链剖分+线段树】

#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <cmath> #inclu

禅境花园 338

|poj 3237|树链剖分|线段树|Tree

poj 3237树剖+线段树。 刚开始想用记录该区域被NEGATE了几次,结果发现不可行,翻别人博客发现了原来维护最大值maxvmaxv和最小值minvminv,NEGATE就是maxv=−minv,minv=maxvmaxv=-minv, minv=maxv, 正确性显然。 #include<cstdio> #include<cstring> #include<algorithm> #defin

博客停更,请到"再见,优快云"文章中找新博客地址 483

POJ 3237 Tree 树链剖分 线段树

单点替换,区间取相反数,区间求最大值,其实线段树里面只要保存最小值和最大值就可以了,取反之后最小值变成最大值最大值变成最小值。 #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <set> #include &...

weixin_30389003的博客 96

POJ 3237 Tree(树链剖分+线段树)

Description 一棵树有n个节点,n-1条边,每条边有一个权值,三种操作 CHANGE i v:将第i条边的权值改成v NEGATE a b:将a到b路径上所有边的权值取反(x->-x) QUERY a b:查询a到b路径上所有边权值的最大值 Input 第一行一个整数t表示用例组数,每组用例第一行一个整数n表示点数,之后n-1行每行三个整数a b c表示a点和b点之间有一条权值

ZSQ 922

poj 3237 Tree(树链剖分,点权,线段树)

题目链接 题意:一棵树3个操作 1.chang i,v 把第i条边权值修改为v 2.negative a,b 把a到b权值取反 3.query a,b 查询a到b的边上的最大值 树链剖分就不说了,线段树,由于取反操作,所以我们同时记录下最小值,这样取反操作,就是最大的变最小了,最小的变最大了,附加一个懒惰标记。偶次反转是没变的。//#pragma comment(linker, "/STA

qwesde 351
上一篇: BZOJ 4551 树 dfs序+线段树 / 并查集
下一篇: hdu 1540 Tunnel Warfare 线段树 / set
kkkkahlua
博客等级 码龄12年 4粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值