树链剖分模板题

swapidc去云平台 swapidc去云平台,里面附带有精品源码0后门,最后希望大家多多支持csdn社区 立即下载

1036: [ZJOI2008]树的统计Count

Time Limit: 10 Sec   Memory Limit: 162 MB
Submit: 3401   Solved: 1418
[ Submit][ Status]

Description

一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身

Input

输入的第一行为一个整数n,表示节点的个数。接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有一条边相连。接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。接下来1行,为一个整数q,表示操作的总数。接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。 对于100%的数据,保证1<=n<=30000,0<=q<=200000;中途操作中保证每个节点的权值w在-30000到30000之间。

Output

对于每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示要求输出的结果。

Sample Input

4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4

Sample Output

4
1
2
2
10
6
5
6
5
16

 

入门题

/* **********************************************
Author      : kuangbin
Created Time: 2013/8/12 21:58:47
File Name   : F:\2013ACM练习\专题学习\数链剖分\树的统计Count.cpp
*********************************************** */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;

const int MAXN = 30010;
struct Edge
{
    int to,next;
}edge[MAXN*2];
int head[MAXN],tot;
int top[MAXN]; //top[v] 表示v所在的重链的顶端节点
int fa[MAXN]; //父亲节点
int deep[MAXN];//深度
int num[MAXN]; //num[v]表示以v为根的子树的节点数
int p[MAXN]; //p[v]表示v在线段树中的位置
int fp[MAXN];//和p数组相反
int son[MAXN];//重儿子
int pos;
void init()
{
    tot = 0;
    memset(head,-1,sizeof(head));
    pos = 0;
    memset(son,-1,sizeof(son));
}
void addedge(int u,int v)
{
    edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++;
}
void dfs1(int u,int pre,int d) //第一遍dfs求出fa,deep,num,son
{
    deep[u] = d;
    fa[u] = pre;
    num[u] = 1;
    for(int i = head[u];i != -1;i = edge[i].next)
    {
        int v = edge[i].to;
        if(v != pre)
        {
            dfs1(v,u,d+1);
            num[u] += num[v];
            if(son[u] == -1 || num[v] > num[son[u]])
                son[u] = v;
        }
    }
}
void getpos(int u,int sp)
{
    top[u] = sp;
    p[u] = pos++;
    fp[p[u]] = u;
    if(son[u] == -1) return;
    getpos(son[u],sp);
    for(int i = head[u]; i != -1 ; i = edge[i].next)
    {
        int v = edge[i].to;
        if(v != son[u] && v != fa[u]) getpos(v,v);
    }
}

struct Node
{
    int l,r;
    int sum;
    int Max;
}segTree[MAXN*3];
void push_up(int i)
{
    segTree[i].sum = segTree[i<<1].sum + segTree[(i<<1)|1].sum;
    segTree[i].Max = max(segTree[i<<1].Max,segTree[(i<<1)|1].Max);
} 
int s[MAXN];
void build(int i,int l,int r)
{
    segTree[i].l = l;
    segTree[i].r = r;
    if(l == r)
    {
        segTree[i].sum = segTree[i].Max = s[fp[l]];
        return ;
    }
    int mid = (l + r)/2;
    build(i<<1,l,mid);
    build((i<<1)|1,mid+1,r);
    push_up(i);
}
void update(int i,int k,int val)//更新线段树的第k个值为val
{
    if(segTree[i].l == k && segTree[i].r == k)
    {
        segTree[i].sum = segTree[i].Max = val;
        return;
    }
    int mid = (segTree[i].l + segTree[i].r)/2;
    if(k <= mid)update(i<<1,k,val);
    else update((i<<1)|1,k,val);
    push_up(i);
}
int queryMax(int i,int l,int r)//查询线段树[l,r]区间的最大值
{
    if(segTree[i].l == l && segTree[i].r == r)
    {
        return segTree[i].Max;
    }
    int mid = (segTree[i].l + segTree[i].r)/2;
    if(r <= mid) return queryMax(i<<1,l,r);
    else if(l > mid)return queryMax((i<<1)|1,l,r);
    else return max(queryMax(i<<1,l,mid),queryMax((i<<1)|1,mid+1,r));
}
int querySum(int i,int l,int r) //查询线段树[l,r]区间的和
{
    if(segTree[i].l == l && segTree[i].r == r)
        return segTree[i].sum;
    int mid = (segTree[i].l + segTree[i].r)/2;
    if(r <= mid)return querySum(i<<1,l,r);
    else if(l > mid)return querySum((i<<1)|1,l,r);
    else return querySum(i<<1,l,mid) + querySum((i<<1)|1,mid+1,r);
}
int findMax(int u,int v)//查询u->v路径上节点的最大权值
{
    int f1 = top[u] , f2 = top[v];
    int tmp = -1000000000;
    while(f1 != f2)
    {
        if(deep[f1] < deep[f2])
        {
            swap(f1,f2);
            swap(u,v);
        }
        tmp = max(tmp,queryMax(1,p[f1],p[u]));
        u = fa[f1];
        f1 = top[u];
    }
    if(deep[u] > deep[v]) swap(u,v);
    return max(tmp,queryMax(1,p[u],p[v]));
}
int findSum(int u,int v) //查询u->v路径上节点的权值的和
{
    int f1 = top[u], f2 = top[v];
    int tmp = 0;
    while(f1 != f2)
    {
        if(deep[f1] < deep[f2])
        {
            swap(f1,f2);
            swap(u,v);
        }
        tmp += querySum(1,p[f1],p[u]);
        u = fa[f1];
        f1 = top[u];
    }
    if(deep[u] > deep[v]) swap(u,v);
    return tmp + querySum(1,p[u],p[v]);
}
int main() 
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n;
    int q;
    char op[20];
    int u,v;
    while(scanf("%d",&n) == 1)
    {
        init();
        for(int i = 1;i < n;i++)
        {
            scanf("%d%d",&u,&v);
            addedge(u,v);
            addedge(v,u);
        }
        for(int i = 1;i <= n;i++)
            scanf("%d",&s[i]);
        dfs1(1,0,0);
        getpos(1,1);
        build(1,0,pos-1);
        scanf("%d",&q);
        while(q--)
        {
            scanf("%s%d%d",op,&u,&v);
            if(op[0] == 'C')
                update(1,p[u],v);//修改单点的值
            else if(strcmp(op,"QMAX") == 0)
                printf("%d\n",findMax(u,v));//查询u->v路径上点权的最大值
            else printf("%d\n",findSum(u,v));//查询路径上点权的和
        }
    }
    return 0;
}


react-window 大数据列表和表格数据渲染组件之虚拟滚动 ReactWindow是一个高性能的React虚拟滚动组件库,专门用于高效渲染大型列表和表格数据。它通过“窗口化”技术,仅渲染用户可见区域的内容,大幅提升性能并减少内存消耗。主要特点包括:支持固定/可变大小列表项、多种布局类型(垂直/水平/网格)、轻量级设计(不足5KB)以及平滑的滚动体验。相比传统渲染方式,它能轻松处理成千上万条数据,并提供自动滚动、自适应容器大小等高级功能。与同类库相比,ReactWindow具有更简洁的API和更优的性能表现,是处理大数据量渲染场景的理想选择。 阅读详情

相关推荐

Python+OpenCV实战:雨天车牌识别准确率提升300%的5个关键技巧

本文针对雨天车牌识别准确率骤降的难题,分享了五个基于Python和OpenCV的实战技巧。通过暗通道先验去雾、雨纹抑制、光照不变量颜色空间转换、多尺度自适应阈值分割以及融合传统特征与轻量级深度学习的混合识别策略,系统性地提升了算法在恶劣天气下的鲁棒性。这些方法能有效解决图像模糊、对比度低、字符断裂粘连等问题,为智能交通等实际应用提供可靠解决方案。

k8l9m0n的博客 716

【洛谷】3384 【模板】树链剖分

题目传送门 这题就是模板的树链剖分,因为题目已经说得很清楚了。 树链剖分就是把一棵树分成若干条链的数据结构,当一棵树退化成了一条链时,不管是求LCA还是求两个节点之间的距离都变得十分简单了,树链剖分就是这样降低时间复杂度的。 将一棵树剖成了若干条链之后,就可以套用其他的数据结构来维护链上的许多信息,又是降低复杂度。 所以,如此分析,树链剖分是一种非常优秀的数据结构。 但是,说实话,代码的

Chester King 905

QT | QT打包生成单个EXE文件

1.以release方式运行程序 2.在release文件夹中找到.exe文件 如果没有找到exe,可能是因为在项目中勾选了shadow build,你可以在构建目录中找到exe 3.将exe放在一个新建的文件夹中,因为待会儿会生成很多dll文件 4.点击电脑左下角搜索QT,打开Qt 5.8 for Desktop (MinGQW 5.3.0 32bit) 5.进入刚刚新建的文件夹,输入wi...

⊳ideal world⊲~ヽ(゚︺゚)Hi 1238

模板swap

template void swap(tp (&a)[num], tp (&b)[num]) { for(size_t t=0; t<num; ++t) swap(a[t],b[t]); } 交换数组内容, 此模板必须使用引用, 否则num值无法传过去,这是一个指针降阶的问题

james1990的专栏 1101

金蝶云星空应用开发初级考试题目汇总

摘要:本文为金蝶云星空应用开发初级考试题目汇总

2401_86113757的博客 3799

使用AI编写测试用例——详细教程

现阶段AI还不能完全替代人工测试用例编写,但如果把AI当做一个提高效率的工具,它将会是一个很强大的辅助。

公众号|软件测试老吴 3万+

swap vs templates 模板类中定义自己的swap函数

template 模板类 与 swap函数

绝知此事要躬行 4509

在Docker中集成GPU监控体系

先上效果图 等文档整理出来再更

tamako0v0的博客 2470

超级好看的Swap云旧模板

这款模板很好看,需要自行准备原版swap安装程序 下载地址:蓝奏云盘 下载地址:百度云盘提取码: y97u

kuzina111的博客 603

手把手教你用Simulink给C2000配置SCI串口发送数据(附模型与避坑点)

本文详细介绍了如何使用Simulink为C2000系列微控制器配置SCI串口发送数据,包括硬件资源分配、模型搭建、参数设置及调试技巧。通过代码生成和串口通信实践,帮助开发者高效实现嵌入式系统开发,避免常见通信问题。

weixin_30831529的博客 295

Codex 实战 Skills:用 Skill 自动识别并提取 PDF/图片表格数据,效率提升 10 倍

本文介绍如何构建一个多模态文件解析 Skill,用于自动识别和提取 PDF/图片中的表格数据,提升 AI 智能体处理非结构化文档的效率。文章分析了传统方法的局限性,提出分层解析架构(预处理、检测、提取推理、后处理),推荐技术栈包括 pdfplumber、OpenCV 和多模态大模型。详细说明了 Skill 的元数据定义、数据模型设计(使用 Pydantic)和核心实现流程,通过混合策略实现从复杂文档到结构化 JSON/Markdown 的转换,使 AI 代理具备"阅读"多模态文档的能力。

yueyeguzhuo的专栏 305

树链剖分模板题汇总

记录几个树链剖分的模板题,包括点操作,边操作和带方向的操作。点操作HDU 3966#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <stack> #include <set

r_clover的博客 1815

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?此外,用户还可以选择将接收到的图片、视频和文件保存到指定的文件夹中。‌用户可以在微信设置中调整这一设置。

qq_15963745的博客 5088

树链剖分详解及其模板题

详解 前言 什么是树链剖分 具体步骤 例题 洛谷 P3384 poj 3237

tangzhide123yy的博客 919

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

树链剖分模板题 [HAOI2015]T2

洛谷原题 就是一道树链剖分的模板题 多谢fancy学姐,几乎是照着她改的,但是理解了 难点在2操作 用st[]记录当前节点在线段树上的标号 ed[]记录当前节点的子树上在线段树上的最大标号(这棵树上的节点标号肯定都在一个区间里) 修改时把单点修改和区间修改放一块了 上代码 #include<cstdio> #include<vector> #include<iostream> usi

pcccccccccc的博客 394

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

树链剖分——入门及模板题

一篇很好的博客https://www.cnblogs.com/ivanovcraft/p/9019090.html 树链剖分:将树分割成一条条链,然后按照dfs序进行维护 为什么要进行树链剖分? 首先来说一般的dfs序:可以想象普通的dfs序只能保证同一子树的结点序号是连续的 但是这样的dfs并没有很好的性质,比如我们要处理从root点到某个叶子结点上的路径,普通的dfs序就无法维护这样的路...

weixin_30757793的博客 202

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

树链剖分模板题【spoj 375】【HDU 3966】【POJ 3237】【poj2763】【bzoj2243】

边权【spoj 375】 #include&lt;bits/stdc++.h&gt; using namespace std; typedef long long ll; const int maxn = 10010; struct Edge{ int to,next; }edge[maxn*2]; int head[maxn],tot; int top[maxn],fa[maxn...

纸箱xyr 214

BZOJ 1036 树链剖分模板题

BZOJ 1036 题意:一棵树,每个点有权值,三种操作:修改一个点的值;询问一条链上最大值;询问一条链上权值和。 tags:模板题 // bzoj 1036 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #defi...

weixin_30609331的博客 110

【树链剖分】模板题

【树链剖分】模板题

行码棋 725

BZOJ3384 模板题【树链剖分】

已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作:操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和

Jimmy_King 267

p3384 树链剖分模板题

线段树 在图论里面的应用 线段树是处理区间问题的 在图论的树里面的应用就是通过重链的方式dfs编号,形成一段连续的区间,就可以用线段树来处理了; 能做到的事情为 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径...

junerbaci的博客 171

hdu-3699-Aragorn's Story-樹鏈剖分模板題

樹鏈剖分學習blog:http://blog.youkuaiyun.com/jiangshibiao/article/details/24669751 關於這題的學習blog:http://blog.youkuaiyun.com/acdreamers/article/details/10594121 下面來說說樹鏈剖分の我的理解。 作為一個樹鏈剖分的初學者,看到個大牛的博客里一上來就描述做法,稍顯得有點吃...

diejixiang8988的博客 173
上一篇: Max_Flow dinic
梁千仞
博客等级 码龄15年 12粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值