SPOJ GRASSPLA Grass Planting(树链剖分)

【C++PTA】6-1 Point类的运算 (10 分) 定义Point类,有坐标x,y两个私有成员变量;对Point类重载“+”(相加)、“-”(相减)和“==”(相等)运算符,实现对坐标的改变,要求用友元函数和成员函数两种方法实现。对Point类重载<<运算符,以使得代码 Point p; cout<<p<<endl;可以输出该点对象的坐标。 函数接口定义: 实现Point类。 裁判测试程序样例: /* 请在这里填写答案 */ int main(int argc, char const *argv[]) { P 阅读详情

题意:

一棵树,有m次操作,每次给u,v图色或者查询u,v之间一共被涂了几次

思路:

树链剖分的基础题,对于每次查询和涂色,都按照正常的错做来就行了,一点一点根据链来往上爬,更新线段树即可。

错误及反思:

因为懒,有一部分代码沿用了上个题,结果疯狂TLE和WA,只能说不能偷懒啊,不过中途确实把很多东西重新想了好几遍,还是很不错的

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int N=201000;
pair<int,int> edge[N];
int segtree[N*4];
int lazy[N*4];
int depth[N],fa[N],son[N],top[N],si[N],id[N];
int n,tot=0,tid=0,m;
int first[N];
pair<int,int> b[N];
void addedge(int x,int y)
{
    edge[tot].first=y;
    edge[tot].second=first[x];
    first[x]=tot++;
    edge[tot].first=x;
    edge[tot].second=first[y];
    first[y]=tot++;
}
void dfs1(int now,int bef,int dep)
{
    depth[now]=dep;
    fa[now]=bef;
    si[now]=1;
    for(int i=first[now];i!=-1;i=edge[i].second)
    {
        if(edge[i].first!=bef)
        {
            dfs1(edge[i].first,now,dep+1);
            si[now]+=si[edge[i].first];
            if(son[now]==-1) son[now]=edge[i].first;
            else son[now]=si[edge[i].first]>si[son[now]]?edge[i].first:son[now];
        }
    }
}
void dfs2(int now,int tp)
{
    id[now]=tid++;
    top[now]=tp;
    if(son[now]!=-1) dfs2(son[now],tp);
    for(int i=first[now];i!=-1;i=edge[i].second)
        if(edge[i].first!=fa[now]&&edge[i].first!=son[now])
            dfs2(edge[i].first,edge[i].first);
}
void pushdown(int l,int r,int rt)
{
    if(lazy[rt])
    {
        int m=(l+r)/2;
        lazy[rt<<1]+=lazy[rt];
        lazy[rt<<1|1]+=lazy[rt];
        segtree[rt<<1]+=lazy[rt]*(m-l+1);
        segtree[rt<<1|1]+=lazy[rt]*(r-m);
        lazy[rt]=0;
    }
}
int cal(int L,int R,int l,int r,int rt)
{
    if(L<=l&&R>=r)
        return segtree[rt];
    pushdown(l,r,rt);
    int m=(l+r)/2;
    int ans=0;
    if(L<=m) ans+=cal(L,R,lson);
    if(R>m) ans+=cal(L,R,rson);
    return ans;
}
int query(int L,int R)
{
    int f1=top[L],f2=top[R];
    int ans=0;
    while(f1!=f2)
    {
         if(depth[f1]<depth[f2])
         {
             swap(f1,f2);
             swap(L,R);
         }
         ans+=cal(id[f1],id[L],0,tid-1,1);
         L=fa[f1];
         f1=top[L];
    }
    if(L==R) return ans;
    if(depth[L]>depth[R]) swap(L,R);
    ans+=cal(id[son[L]],id[R],0,tid-1,1);
    return ans;
}
void update(int L,int R,int l,int r,int rt)
{
    if(L<=l&&R>=r)
    {
        lazy[rt]++;
        segtree[rt]+=r-l+1;
        return ;
    }
    pushdown(l,r,rt);
    int m=(l+r)/2;
    if(L<=m) update(L,R,lson);
    if(R>m) update(L,R,rson);
    segtree[rt]=segtree[rt<<1],segtree[rt<<1|1];
}
void change(int L,int R)
{
    int f1=top[L],f2=top[R];
    while(f1!=f2)
    {
        if(depth[f1]<depth[f2])
        {
            swap(f1,f2);
            swap(L,R);
        }
        update(id[f1],id[L],0,tid-1,1);
        L=fa[f1];
        f1=top[L];
    }
    if(L==R) return ;
    if(depth[L]>depth[R]) swap(L,R);
    update(id[son[L]],id[R],0,tid-1,1);
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(son,-1,sizeof(son));
    memset(first,-1,sizeof(first));
    for(int i=0;i<n-1;i++)
    {
        scanf("%d%d",&b[i].first,&b[i].second);
        addedge(b[i].first,b[i].second);
    }
    dfs1(1,1,1);
    dfs2(1,1);
    while(m--)
    {
        char temp[10];
        int ta,tb;
        scanf("%s%d%d",temp,&ta,&tb);
        if(temp[0]=='P')
            change(ta,tb);
        else
            printf("%d\n",query(ta,tb));
    }
}
基于Matlab使用雷达资源管理有效跟踪多个机动目标仿真(附源码) 多功能雷达可以搜索目标,确认新轨道,并重新访问轨道以更新状态。为了执行这些功能,多功能雷达通常由资源管理器管理,该资源管理器创建用于搜索、确认和跟踪的雷达任务。这些任务是根据优先级和时间安排的,因此,在每个时间步长中,多功能雷达都可以将其波束指向所需的方向。在此示例中,对于用于跟踪机动目标的雷达,有两个相互冲突的要求:目标的数量及其初始位置通常事先不知道。因此,雷达必须不断搜索感兴趣的区域才能找到目标。此外,雷达需要在进入雷达覆盖区域后立即检测并建立对每个目标的跟踪。目标机动的时间段事先是未知的。 阅读详情

相关推荐

别再搞混了!MATLAB通信仿真中EbN0转SNR的保姆级公式推导与避坑指南

本文深入解析MATLAB通信仿真中EbN0与SNR转换的核心公式,揭示数字仿真与理论系统的关键差异。通过真实案例展示错误参数设置导致的隐蔽问题,并提供完整的参数自查清单和正确实现代码,帮助工程师和学生避免常见错误,确保仿真结果准确可靠。

weixin_28746223的博客 348

AI流式响应JSON解析:partial-json-parser原理与实战

JSON作为数据交换的核心格式,其解析通常依赖于标准库的完整语法检查。然而,在AI流式响应等实时场景中,数据以碎片化形式陆续到达,传统JSON.parse()会因语法不完整而直接失败,无法实现渐进式数据提取。这催生了增量解析技术,它通过状态机追踪解析上下文,在语法允许范围内对不完整输入进行‘最大努力’解析,实时输出已确定的结构化信息。该技术对提升大语言模型应用交互体验具有关键价值,尤其在处理OpenAI API流式响应、智能体中间件等需要实时解析AI思考过程与指令混合输出的场景中。本文聚焦的partial-

weixin_30765505的博客 688

华为Atlas 300I推理卡驱动安装全攻略:从环境检查到常见问题解决

本文提供了华为Atlas 300I推理卡驱动安装的完整实战指南。从安装前的系统环境检查、内核版本匹配,到详细的二进制.run文件安装步骤、源码编译及高级定制化部署,涵盖了驱动安装的全流程。文章重点解析了安装过程中的关键决策、常见问题排查与解决方案,并针对生产环境的多卡配置、性能调优及安全加固给出了专业建议,旨在帮助用户高效、稳定地完成AI推理加速卡的部署。

swift5iosmith的博客 628

2419. Grass Planting

2419. Grass Planting 题目描述 到了一年中Farmer John在他的草地里种草的时间了。整个农场由N块草地组成(1≤N≤10^5),方便起见编号为1…N,由N−1条双向的小路连接,每块草地都可以经过一些小路到达其他所有的草地。 Farmer John当然可以在每块草地里种不同种类的草,但是他想要使得使用的草的种类数最小,因为他用的草的种类数越多,他就需要负担更高的花费。 不...

蒟蒻こんにゃく 713

Qt+OpenGL+Cesium三件套:打造高性能3D GIS桌面应用的5个关键点

本文深入探讨了如何利用Qt、OpenGL和Cesium数据规范构建高性能桌面级3D GIS应用。文章聚焦于五个关键点:架构选型、OpenGL渲染优化、3D Tiles数据解析与调度、内存与多线程管理,以及高级特性实现,旨在帮助开发者在C++生态中打造不依赖网络、运算能力更强的重型3D地理信息客户端。

weixin_28197941的博客 380

VPI与Matlab协同仿真:相干光通信接收端DSP算法全解析

本文详细解析了如何利用VPI与Matlab协同仿真,构建完整的相干光通信接收端DSP算法处理闭环。重点介绍了从VPI导出数据后,在Matlab中实现时钟恢复、偏振解复用和载波相位估计等核心算法的步骤与原理,并阐述了如何通过误码率计算完成仿真验证,为相干光通信系统算法研究与验证提供了高效实用的方法。

ll5678的博客 609

[USACO11DEC]牧草种植Grass Planting(树链剖分)

题目 传送门 题解 这道题就是把树链剖分中的点标记改成了边的标记,然后我就不会做了; 我么发现,每一个点对应着多个孩子,但是只有一个父亲,于是我们就可以把某个点到父亲的点的边的权值转移到这个点上; 如何防止把最近公共祖先也标记上,这就是树链剖分的一点小变形,找完连头之后左端点+1; 还是对算法理解的不够深刻。 代码 #include &lt;cstdio&gt; #include ...

A_Comme_Amour的博客 495

linux驱动由浅入深系列:基于高通平台分析触摸屏(TP)、虚拟按键驱动

触摸屏的触摸板(touch panel简称TP)驱动的基本架构和普通按键驱动基本一致,可以参考文章:linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动)。只是其功能稍稍复杂些,配置也多些,下面一起来看一下。 TP包括 触摸屏、虚拟按键、虚拟按键背光灯 TP驱动芯片厂商主要有:Goodix(汇顶),FocalTech(敦泰科技),cypress(赛普拉斯),synapt

Radia的专栏 4767

SPOJ GRASSPLA Grass Planting

题目:http://www.spoj.com/problems/GRASSPLA/en/ 题意:给定一棵树,树有边权,初始边权都为0。有两种操作:第一种是两点之间的边权均加1,第二种是求两点之间的边权和。 思路:树链剖分啊,线段树区间求和。写成多实例一直莫名RE,改成单实例就过了 #include #include #include #include using na

弱智就要多努力 719

深度强化学习 | 基于SAC算法的移动机器人路径跟踪(附Pytorch实现)

软性演员-评论家(Soft Actor-Critic, SAC)算法是基于最大熵原理的离线策略方法,本节将基于深度强化学习中的SAC算法实现移动机器人的路径跟踪,介绍网络设计、动作空间设计和奖励函数设计,并提供Pytorch实现加深理解

FRIGIDWINTER的博客 5734

32、运算放大器的工作原理与应用

本文详细介绍了运算放大器的工作原理与多种应用场景,涵盖开环与闭环放大器的基本概念、理想运算放大器的特性及其‘黄金规则’。文章深入解析了反相放大器、同相放大器、单位增益跟随器与反相器的配置和增益计算,并探讨了电压比较器及窗口比较器的工作机制。同时提供了运算放大器在实际应用中的选型流程、使用注意事项以及常见故障排查方法,帮助读者全面掌握运算放大器的设计与应用要点。

u5v6w7的博客 163

树链剖分--细节发现 BSOJ3690:Grass Planting种草

Description Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional roads, such that there is exactly one path between any two pastures. Bessie, a cow who loves her grazi

.. 562

使用CubeMX配置STM32H7的FreeRTOS

本文将介绍如何使用CubeMX配置STM32H7的FreeRTOS,并提供相应的源代码示例。通过使用CubeMX,你可以轻松地配置FreeRTOS和系统资源,并生成相应的初始化代码和配置文件。在"FreeRTOS"选项卡的"Tasks"部分,可以配置系统中的任务。首先,打开CubeMX软件。在"FreeRTOS"选项卡的"Resources"部分,你可以配置FreeRTOS使用的资源,例如,堆内存和信号量。例如,我们可以创建两个简单的任务,一个任务将在循环中切换LED的状态,另一个任务将通过串口打印消息。

JeeVue的博客 711

SPOJ - QTREE 树链剖分

题解思路:时间复杂度:由于任一轻儿子对应的子树大小要小于父节点所对应子树大小的一半因此从一个轻儿子沿轻边向上走到父节点后 所对应的子树大小至少变为两倍以上经过的轻边条数自然是不超过log2Nlog2N的然后由于重链都是间断的 ((连续的可以合成一条))所以经过的重链的条数是不超过轻边条数+1+1的因此经过重链的条数也是loglog级别的综合可知原命题得证#include&lt;bits/stdc+...

过路人丶的博客 305

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【 SPOJ - GRASSPLA】 Grass Planting (树链剖分+树状数组)

54 种草约翰有 N 个牧场,编号为 1 到 N。它们之间有 N − 1 条道路,每条道路连接两个牧场。通过这些道路,所有牧场都是连通的。刚开始的时候,所有道路都是光秃秃的,没有青草。约翰会在一些道路上批量种草。每次开始种草的时候,约翰会选择一个牧场作为起点,一个牧场作为终点,找到从起点到终点的最短路径,在这条路径上所有的道路上分别种下一棵新的青草。贝西在监督约翰的工作,她迫不及待...

weixin_30502965的博客 198

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Grass Planting 题解

GrassGrassGrass PlantingPlantingPlanting 题解 题目 解题方法 方法111:树形dpdpdp 设dpidp_idpi​表示以iii为根的子树需要使用的最少的草的种类数,fif_ifi​表示iii节点的儿子个数,bib_ibi​表示与iii结点相连的结点数量。 除了根节点以外的其他结点都与bib_ibi​个结点相连,而有一个结点恰好是它的父亲结点。但是由于...

linweitong2020的博客 632

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[USACO11DEC]牧草种植Grass Planting

题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional roads, such that there is exactly one path between any two pastures. Bessie, a cow who loves her...

weixin_30389003的博客 311

[Usaco2011 Dec]Grass Planting

Description Farmer John has N barren pastures connected by N-1 bidirectional roads, such that there is exactly o ne path between any two pastures. Bessie, a cow who loves her grazing time, often c

雪影 394

树链剖分(SPOJ-QTREE)(模板)

先推荐一个菊苣的博客讲解 。对于这种查询树链,修改树边的问题,我们可以使用树链剖分。首先处理出重边和轻边:① uu 和 son[u]son[u] 为重边,当且仅当 son[u]son[u] 是 uu 的所有点中,其子树点数最多的。②不是重边的边为轻边。由重边形成的链为重链。性质:①从根节点到任意点的轻边数量为 O(logn)O(logn) 。证明:轻边的两端点的子树点数之差至少为2倍。②从根节点到任

On the way 504

[USACO11DEC] 牧草种植Grass Planting

https://www.luogu.org/problemnew/show/3038 将为边加权转化成为点加权 对于每条边,我们将其深度更大的端点加权,则区间 [l, r] 的加权(或询问)即为去掉深度最小的点,给其余点加权(或询问)。 1)最后一次树剖查询时,当前两点 x,y 必定在同一重链上(y 的深度小于 x); 2)根据处理前的 dfs 序,我们是优先遍历重儿子,那么重儿子在线段树...

weixin_30561425的博客 252

NEERC 17 L Laminar Family (树链剖分)

题意: &nbsp;&nbsp;&nbsp;&nbsp; 给你一颗树,每次选取一个路径,把路径上的所有点加入到一个集合里面,问最后的集合是否两两之间满足 A∈BA∈B A\in B 或者B∈AB∈AB\in A或者A∪B=∅A∪B=∅A\cup B = \emptyset 思路: &nbsp;&nbsp;&nbsp;&nbsp;我们发现,如果最后是符合条件的,那么必定是一个集合被另一个集合...

Roll_Keyboard的博客 549

bzoj 1103 大都市meg (dfs序+线段树)

题意: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;一颗树,每条边权是1,两种操作,一种查询x到根的距离,一种把某边改为0 思路: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 对于一个边变了,那么影响的就是子树,所以dfs序+线段树就行了,这题对于时间要求很低,vector存边,每次暴力找答案也能A 错误及反思: 代码: ...

Roll_Keyboard的博客 457

Codeforces Round #336 (Div. 1) D. Power Tree(dfs序线段树)

题意:思路:     首先,直接模拟很不现实,只能先离线,造出空树,再慢慢更新树      那么现在想一下怎么维护这颗树,首先,我们算每个点对根节点的贡献,发现每个点的贡献可以表示为vi∗sz1∗sz2∗...∗v_i*sz_1*sz_2*...*(其中sz1,sz2是这个点和根节点的路径上的点,这些点的直接儿子),只要我们新加入一个节点,假设父亲的直接儿子节点个数为sz,那么这次修改就是把它父亲

Roll_Keyboard的博客 419

spoj Qtree6/bzoj 3637 Query on a tree VI(树链剖分+线段树/LCT)

题意: 思路: 首先,我们要开两颗线段树,一颗表示,当前节点为白时,和子树所组成的最大联通块大小是多少,另一颗表示,当前节点为黑时,和子树所组成的最大联通块大小是多少。 那么我们查询点u的答案的时候,就向上找到最远的相同颜色的点v,点v所保存的答案就是u的答案(我们v为最远同色祖先)。 更新某个点u的颜色的时候,就是把u的父亲和最远同色祖先的父亲,这一条路径上的都更新(注意,黑白各更新...

Roll_Keyboard的博客 413

hdu 5111 Alexandra and Two Trees (主席树+树剖)

题意: 给你两颗树,q次查询,每次查询,问你第一颗树u1到v1,第二棵树u2到v2上,出现的数字交集大小,每颗树上不会有重复数字 思路: &nbsp;&nbsp;&nbsp;&nbsp; 我们首先先想这样一个问题,给你两个数列a1,a2,a3...ana1,a2,a3...ana_1,a_2,a_3...a_n和b1,b2,b3,...bmb1,b2,b3,...bmb_1,b_2,b_...

Roll_Keyboard的博客 387

BZOJ 1036 树的统计Count(树链剖分)

题意:给你一棵树,n个节点,每个节点都有一个val,现在进行q次操作,操作有三种,第一种查询u到v的最大值,第二种,查询u到v的val和,第三种,将某个点修改val思路:树链剖分基本题,相比起前面几道树链剖分,这个题维护的是点,虽然我们从理论上来说,树链剖分是根据边来剖分的,但是其实我们维护的时候维护点更简单,所以这个题虽然写起来麻烦一点,但是逻辑上反而更顺 用两颗线段树分别维护最大值和最小值,和

Roll_Keyboard的博客 375
上一篇: SPOJ QTREE Query on a tree(树链剖分)
下一篇: BZOJ 1036 树的统计Count(树链剖分)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值