bzoj2157: 旅游 树链剖分模板题

BZOJ 2157 「国家集训队」旅游(树链剖分,线段树,边权转点权)【BZOJ计划】 【BZOJ修复计划 #20】BZOJ 2157 旅游 【国家集训队2011】 阅读详情

今天考试碰到一个树链剖分的模板题,由于脑抽一时忘记了整个子树是怎么修改的。。。。其实就是加上个siz。。。。

然后就找了一个操作比较全的树链剖分切了。。。。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define INF 0x3f3f3f3f
#define maxn 125000
int id,w[maxn],siz[maxn],val[maxn],en,ha[maxn],dep[maxn];
int first[maxn],next[maxn],to[maxn],top[maxn],fa[maxn],X[maxn],Y[maxn],Z[maxn];
int save[maxn],sum[maxn],minn[maxn],maxx[maxn],n,m,son[maxn];
bool rev[maxn];
void add(int a,int b,int c)
{
    en++;
    to[en]=b;
    val[en]=c;
    next[en]=first[a];
    first[a]=en;
}
void dfs(int now)
{
    int v,maxv=0;siz[now]=1;
    for(int i=first[now];i;i=next[i])
    {
        v=to[i];
        if(fa[now]==v) continue;
        fa[v]=now;dep[v]=dep[now]+1;
        dfs(v);
        siz[now]+=siz[v];
        if(maxv<siz[v])
        {
            maxv=siz[v];
            son[now]=v;
        }
    }
}
void getid(int now,int root)
{
    int v;id++;w[now]=id;top[now]=root;
    if(son[now]) getid(son[now],root);
    for(int i=first[now];i;i=next[i])
    {
        v=to[i];
        if(v==son[now]||v==fa[now]) continue;
        getid(v,v);
    }
}
void pushup(int rt)
{
    minn[rt]=min(minn[rt<<1],minn[rt<<1|1]);
    maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]);
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt)
{
    if(rev[rt])
    {
        rev[rt]^=1;rev[rt<<1]^=1;rev[rt<<1|1]^=1;
        sum[rt<<1]*=-1;sum[rt<<1|1]*=-1;
        maxx[rt<<1]*=-1;minn[rt<<1]*=-1;
        swap(maxx[rt<<1],minn[rt<<1]);
        maxx[rt<<1|1]*=-1;minn[rt<<1|1]*=-1;
        swap(maxx[rt<<1|1],minn[rt<<1|1]);
    }
}
void update(int l,int r,int rt,int pos,int v)
{
    if(l==r)
    {
        sum[rt]=maxx[rt]=minn[rt]=v;
        return;
    }
    pushdown(rt);
    int mid=(l+r)>>1;
    if(pos<=mid) update(lson,pos,v);
    else update(rson,pos,v);
    pushup(rt);
}
void modify(int l,int r,int rt,int x,int y)
{
    if(x<=l&&r<=y)
    {
        sum[rt]*=-1;
        maxx[rt]*=-1;minn[rt]*=-1;
        swap(maxx[rt],minn[rt]);
        rev[rt]^=1;
        return;
    }
    pushdown(rt);
    int mid=(l+r)>>1;
    if(x<=mid) modify(lson,x,y);
    if(y>mid) modify(rson,x,y);
    pushup(rt);
}
int getmax(int l,int r,int rt,int x,int y)
{
    if(x<=l&&r<=y)
    {
        return maxx[rt];
    }
    pushdown(rt);
    int ans=-INF;
    int mid=(l+r)>>1;
    if(x<=mid) ans=max(ans,getmax(lson,x,y));
    if(y>mid) ans=max(ans,getmax(rson,x,y));
    return ans;
}
int getmin(int l,int r,int rt,int x,int y)
{
    if(x<=l&&r<=y)
    {
        return minn[rt];
    }
    pushdown(rt);
    int ans=INF;
    int mid=(l+r)>>1;
    if(x<=mid) ans=min(ans,getmin(lson,x,y));
    if(y>mid) ans=min(ans,getmin(rson,x,y));
    return ans;
}
int getsum(int l,int r,int rt,int x,int y)
{
    if(x<=l&&r<=y)
    {
        return sum[rt];
    }
    pushdown(rt);
    int ans=0;
    int mid=(l+r)>>1;
    if(x<=mid) ans+=getsum(lson,x,y);
    if(y>mid) ans+=getsum(rson,x,y);
    return ans;
}
int getans1(int x,int y)
{
    int ans=-INF;
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        ans=max(ans,getmax(1,n,1,w[top[x]],w[x]));
        x=fa[top[x]];
    }
    if(x==y) return ans;
    if(dep[x]>dep[y]) swap(x,y);
    ans=max(ans,getmax(1,n,1,w[son[x]],w[y]));
    return ans;
}
int getans2(int x,int y)
{
    int ans=0;
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        ans+=getsum(1,n,1,w[top[x]],w[x]);
        x=fa[top[x]];
    }
    if(x==y) return ans;
    if(dep[x]>dep[y]) swap(x,y);
    ans+=getsum(1,n,1,w[son[x]],w[y]);
    return ans;
}
void getans3(int x,int y)
{
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        modify(1,n,1,w[top[x]],w[x]);
        x=fa[top[x]];
    }
    if(dep[x]>dep[y]) swap(x,y);
    modify(1,n,1,w[son[x]],w[y]);
}
int getans4(int x,int y)
{
    int ans=INF;
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        ans=min(ans,getmin(1,n,1,w[top[x]],w[x]));
        x=fa[top[x]];
    }
    if(x==y) return ans;
    if(dep[x]>dep[y]) swap(x,y);
    ans=min(ans,getmin(1,n,1,w[son[x]],w[y]));
    return ans;
}
void build(int now)
{
    int v;
    for(int i=first[now];i;i=next[i])
    {
        v=to[i];
        if(v==fa[now]) continue;
        ha[(i+1)/2]=v;
        update(1,n,1,w[v],val[i]);
        build(v);
    }
}
int main()
{
    int a,b,c,op;
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        a++;b++;
        X[i]=a;Y[i]=b;Z[i]=c;
        add(a,b,c);
        add(b,a,c);
    }
    dfs(1);
    getid(1,1);
    build(1);
    scanf("%d",&m);
    char st[10];
    while(m--)
    {
        scanf("%s",st);
        if(st[0]=='C')
        {
            scanf("%d%d",&a,&b);
            update(1,n,1,w[ha[a]],b);
        }
        if(st[0]=='N')
        {
            scanf("%d%d",&a,&b);
            a++;b++;
            getans3(a,b);
        }
        if(st[0]=='S')
        {
            scanf("%d%d",&a,&b);
            a++;b++;
            printf("%d\n",getans2(a,b));
        }
        if(st[0]=='M'&&st[1]=='A')
        {
            scanf("%d%d",&a,&b);
            a++;b++;
            printf("%d\n",getans1(a,b));
        }
        if(st[0]=='M'&&st[1]=='I')
        {
            scanf("%d%d",&a,&b);
            a++;b++;
            printf("%d\n",getans4(a,b));
        }
    }
    return 0;
}
/*
5
0 1 1
1 2 1
0 3 1
3 4 1
7
MAX 2 4
MIN 2 4
SUM 2 4
C 1 2
MAX 2 4
MIN 2 4
SUM 2 4
*/

AD2019画板子:想让某块铜皮‘露出来’上锡?手把手教你设置实心区域的开窗与阻焊 本文详细介绍了在AD2019中如何精准设置实心区域的铜皮开窗与阻焊层,以实现露铜上锡效果。通过解析阻焊层与钢网层的工艺参数,提供实战配置流程和高级应用技巧,帮助工程师优化大电流设计的载流能力与散热效率。 阅读详情

相关推荐

电源完整性必看!用SIwave提取PDN阻抗曲线的3个关键设置与常见报错解决

本文深入探讨了在SIwave中进行电源完整性(PI)仿真时,提取PDN阻抗曲线的三个核心设置要点。重点解析了端口阻抗设为0.1欧姆的物理意义与SYZ参数仿真中的阻抗匹配原则,并提供了针对常见收敛性问题和模型误差的实战排查思路,旨在帮助工程师获得更精确可靠的仿真结果,为去耦电容优化提供依据。

b9c0d的博客 350

BZOJ2157 旅游

BZOJ2157 旅游 题目描述 传送门 题目分析 给出一棵树,然后要求维护链边权和,链上最大最小值,以及链乘\(-1\)。 考虑使用树链剖分,先把边权转化为父节点点权,然后直接维护就可以了。问题主要在于最小最大值在下传标记时的更改。显而易见的是这俩数都取反之后直接\(swap\)就可以了。 注意,根据线段树写法不同要在树剖里特判\(x=y\)的情况。 可笑的是这个题对于取相反数操作直接暴力递归...

weixin_30576859的博客 115

用Proteus8.9自带STM32F401VE的Controller仿真STM32F407ZGT6,F429IGT6

@用Proteus8.9自带STM32F401VE的Controller仿真STM32F407ZGT6,F429IGT6 一, 目前得到的 Proteus8.9版本软件能够支持的Cortex-M4固件库项目,只能到达STM32F401VE (如下图1所示)。 (图1) 作为ST公司Cortex-M4更为广泛应用的F407,F429系列芯片;现在的Proteus8.9版本软件还没有固件库支持,不能...

kaillen的博客 3万+

BZOJ 2157 旅游 (树链剖分)

2157: 旅游 Description Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N − 1 座桥。Ray 发现...

xcatf的博客 292

ERA5 hourly data批量下载与cdo处理(一)

本篇文章主要介绍了ERA数据的批量下载

qq_40511689的博客 3871

别再死磕V1了!手把手教你用WPS Web Office V3 SDK快速集成(附Java Demo避坑指南)

本文详细介绍了如何从WPS Web Office V1迁移到V3版本,重点讲解了V3在性能、安全性和扩展性上的优势,以及Java开发者如何快速集成V3 SDK。文章包含核心功能实现、高级功能适配(如Solon框架)和常见问题排查指南,帮助开发者高效完成迁移并避免常见陷阱。

weixin_27215337的博客 335

POJ 3237 Tree /BZOJ 2157旅游 -- 树链剖分边权处理+取反

类似SPOJ QTREE模板题,还是要注意跳过LCA!!!(因为用最深的点权维护边权,LCA其实是上一个点的边权,不管update还是query) 只不过多了个取相反数操作 关于区间取相反数,如果是维护区间和,就加个负号;但如果是维护最大值,应该最大值最小值互换。 注释部分,表示按位取反如何维护最值(与本题无关) ①POJ 3237 Tree #include <stdio...

zjyang12345的博客 282

PCB层叠结构与阻抗计算

1.Core 和 PP PCB两个重要组成部分:Core 和 Prepreg(半固态片,简称PP)。 如下图所示, Core 的两个表面都铺有铜箔,可作为信号层、电源层、地层等导电层,Core的上下表面之间填充的是固态材料; PP的表面不铺铜,在PCB中起填充作用,其材质是半固体的树脂材料,因此比Core略软一些。 在制作多层板时,需配合使用Core和PP,一般在两个Core 之间应选PP作为填...

sinat_15677011的博客 1万+

BZOJ 2157 旅游 树链剖分

题目大意:维护一棵树,每条边有边权,支持下列操作: 1.修改某条边的边权 2.将某条路经上的边权反转 3.询问某条路经上的和 4.询问某条路经上的最大值 5.询问某条路经上的最小值 裸链剖怎么这么多- - 边权的处理方式是把边权放到两端点中深度较大的那个里 反转就把和取反,最大最小值交换后取反就行了 为何这数据范围给我一种“暴力MS能艹过去?”的错觉- - #include

世界 2580

优化算法 | 赏金猎人优化算法(Bounty Hunter Optimizer, BHO)及其在多无人机移动边缘计算与路径规划中的应用(附matlab源代码)

移动边缘计算(Mobile Edge Computing, MEC)通过将计算资源下沉至网络边缘,有效解决了物联网终端设备计算能力不足与能耗受限的问题。无人机(Unmanned Aerial Vehicle, UAV)因其高机动性、灵活部署和广域覆盖等优势,被广泛用作MEC的移动服务器平台。多无人机辅助MEC系统的核心优化问题在于:如何在满足任务处理时延约束和无人机能量限制的前提下,联合优化无人机的三维飞行轨迹、任务卸载决策与计算资源分配,以最小化系统总能耗或最大化任务完成效率。

尘世冰封的专栏 223

使用HART Server PC软件进行HART设备的组态、调试和分析的完整指南

HART协议是一种用于工业自动化中的双向通信协议,能够在4-20mA模拟信号的基础上叠加数字信号,从而实现设备的远程监控和管理。HART协议兼具模拟和数字通信的优点,被广泛应用于过程控制系统中。设备组态:通过软件可以对HART设备进行组态,配置设备参数。设备调试:支持设备的在线调试和故障诊断,方便快速解决问题。数据分析:提供设备运行数据的实时监控和历史数据分析功能。报表生成:支持生成各类报表,便于数据记录和管理。

qq_38334677的博客 2468

bzoj2157旅游

bzoj2157旅游 题意: 给定有权树,支持单边权修改,路径边权取相反数,路径边权求和,路径边权求最大最小值。 题解: 用link-cut tree link-cut tree与树链剖分有些类似,都是用某种数据结构维护树链。但也有很大差异:树链剖分是依据子树节点数确定轻重边,一经确定,不能更改,所以用相对静态的线段树维护,常数也较小。而link-cut tre...

anheku1562的博客 150

具身智能中的(VLA)算法与实践——第一讲 基础与概览

本文介绍了视觉-语言-动作(VLA)模型的基础概念及其在AI领域的重要性。VLA模型通过融合多模态数据实现具身智能,使AI系统能感知环境并执行物理动作。文章探讨了大型语言模型(LLMs)和视觉语言模型(VLMs)如何赋能具身智能,包括指令解析、场景理解和动作规划。同时提供了Python、PyTorch/TensorFlow开发环境的详细搭建指南,包含GPU配置建议和测试代码。VLA模型在机器人操作、导航、人机协作等领域具有广泛应用前景,是实现通用人工智能的关键技术。

u012133341的博客 1598

[BZOJ 2157]旅游

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 题目描述 Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 NNN 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N−1N − 1N−1 座桥。Ray 发现,有些桥...

asdkjc的博客 135

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

BZOJ 2157: 旅游 (树链剖分+线段树)

树链剖分后线段树维护区间最大最小值与和. 支持单点修改与区间取反. 直接写个区间取反标记就行了.线段树板题.(1A警告) #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> using namespace std; typedef long long ...

Ark 359

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

洛谷P1505 [国家集训队]旅游(BZOJ2157)

树链剖分 洛谷题目传送门 BZOJ题目传送门 操作有点多的裸树剖。套路下放边权后就是打板子。注意操作的时候不要包括LCA。 代码: #include&lt;cctype&gt; #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;algorithm&gt; #define N 20005 #define F inline ...

forezxl的博客 454

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】

题目链接 【洛谷】 【BZOJ】 题目描述 Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N − 1 座桥。 Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁。于是,他给每座桥定义一个...

weixin_30415801的博客 232

BZOJ2157:旅游 树链剖分

2157: 旅游 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 1090  Solved: 539 [Submit][Status][Discuss] Description Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约

Oakley 542

BSOJ1495(BZOJ2157) 旅游 树链剖分

1495 -- 【BZOJ2157】旅游 Description   Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N ? 1 座桥。Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁。于是,

.. 756

【BZOJ2157】旅游,树链剖分练习

What...can...I...help...you......today?

xiaoyimi的博客 1332

BZOJ 2157: 旅游 树链剖分

DescriptionRay 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N − 1 座桥。Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁。于是,他给每座桥定义一个愉悦度w,也就是说,Ray 经过这座

I good vegetable a! 401

[BZOJ2157]旅游

题面戳我 Description Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N − 1 座桥。Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁。于是,他给每座桥定义一个愉悦度w,也...

abcyan1235的博客 63

bzoj2157 旅游 树链剖分

其实就是个树链剖分,但是变成了边权而已,把边权移到他深度更大的端点上就行了。问题是操作太多了,而且还有个改变权值和取反我还要单独拉出来打。。打了半个小时,,编译调了半天,6000多B,都不想肉眼检查结果1A了。。有点窃喜。。 注意取反哪里的最大最小值的维护,要倒过来。#include<cstdio> #include<cstring> #include<iostream> #include<alg

老臣 365

[BZOJ]2157: 旅游 树链剖分

Description Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N − 1 座桥。Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁。于是,他给每座桥定义一个愉悦度w,也就是说,Ray

TYB的博客 468
上一篇: bzoj2820: YY的GCD 莫比乌斯反演
下一篇: bzoj2836: 魔法树 树链剖分
IED98
博客等级 码龄12年 5粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值