[bzoj5192][Usaco2018 Feb][LCT]New Barns

别再只调PID了!手把手教你从LC谐振到检波,搞定STM32智能车电磁循迹硬件电路 本文深入解析STM32智能车电磁循迹硬件电路设计,从LC谐振选频到数字信号处理,提供完整的信号链路设计要点与实战技巧。通过优化电磁杆布局和信号放大电路,显著提升赛道位置检测精度,误差可控制在±0.5cm以内,为智能车竞赛提供可靠硬件支持。 阅读详情

Description

FarmerJohn注意到他的奶牛们如果被关得太紧就容易吵架,所以他想开放一些新的牛棚来分散她们。每当FJ建造一
个新牛棚的时候,他会将这个牛棚用至多一条双向道路与一个现有的牛棚连接起来。为了确保他的奶牛们足够分散
,他有时想要确定从某个特定的牛棚出发,到它能够到达的最远的牛棚的距离(两个牛棚之间的距离等于从一个牛
棚出发到另一个之间必须经过的道路条数)。FJ总共会给出Q(1≤Q≤10^5)次请求,每个请求都是“建造”和“
距离”之一。对于一个建造请求,FJ建造一个牛棚,并将其与至多一个现有的牛棚连接起来。对于一个距离请求,
FJ向你询问从某个特定的牛棚通过一些道路到离它最远的牛棚的距离。保证询问的牛棚已经被建造。请帮助FJ响应 所有的请求。

Input

第一行包含一个整数Q 以下Q行,每行包含一个请求。每个请求的格式都是“B p”或是“Q k”
分别告诉你建造一个牛棚并与牛棚p连接,或是根据定义求从牛棚k出发最远的距离。 如果p=-1,则新的牛棚不会与其他牛棚连接。
否则,p是一个已经建造的牛棚的编号。 牛棚编号从1开始,所以第一个被建造的谷仓是1号谷仓,第二个是2号谷仓,以此类推。

Output

对于每个距离请求输出一行。注意一个没有连接到其他牛棚的牛棚的最远距离为0

Sample Input

7

B -1

Q 1

B 1

B 2

Q 3

B 2

Q 2

Sample Output

0

2

1

HINT

输入样例对应下面的牛棚网:

(1)

\   

 (2)---(4)

/

(3)

对于请求1,我们建造牛棚1。对于请求2,我们询问从1出发到最远连接的牛棚的距离。由于牛棚1没有与其他牛棚

连接,所以回答是0。对于请求3,我们建造牛棚2并将其与牛棚1连接。对于请求4,我们建造牛棚3并将其与牛棚2

连接。对于请求5,我们询问从3出发到最远连接的牛棚的距离。在这时,最远的是牛棚1,距离为2单位。对于请求

6,我们建造牛棚4并将其与牛棚2连接。对于请求7,我们询问从2出发到最远连接的牛棚的距离。所有其他三个牛

棚1,3,4都与2相距相同的距离1,所以这就是我们的回答。

题解

考场上只写了个LCT,然后发现LCT只能处理二叉情况以为不能用LCT了
动态点分治?兄弟我不会
LCT是可做的!
可以知道,每次询问的答案一定在一棵树的直径两个上
给一个简单的证明
设直径两个端点为u,v,当前询问节点now,假设找到了一个不在树的直径上的点且与now距离最大的点P
由于树上路径唯一,对于v,P和v有一个公共祖先lca。可以知道,now到lca的距离是一定的,那么根据上面的假设,可以知道lca到P的距离比lca到v的距离长,那么对于u,可以发现这种情况下,u到v的距离也是比u到P的距离短的,那么直径的v端点应该为P而不是v。反之亦然,得证
用LCT维护每一棵树的直径长度,并查集维护直径左端点右端点,插入的时候维护直径即可
对于维护时直径端点的证明类似如上

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int fa[110000],belong[110000];
int findfa(int x)
{
    if(fa[x]!=x)fa[x]=findfa(fa[x]);
    return fa[x];
}
int l[110000],r[110000];//第i个连通块中树的直径左端点/右端点 
struct node
{
    int f,son[2],c;
    bool fz;node(){fz=false;}
}tr[110000];int trlen;
void upd(int now){tr[now].c=tr[tr[now].son[0]].c+tr[tr[now].son[1]].c+1;}
void reverse(int now)
{
    swap(tr[now].son[0],tr[now].son[1]);
    int lc=tr[now].son[0],rc=tr[now].son[1];
    tr[lc].fz^=1;tr[rc].fz^=1;
    tr[now].fz=false;
}
void rotate(int x,int w)
{
    int f=tr[x].f,ff=tr[f].f;
    int R,r;
    R=f;r=tr[x].son[w];
    tr[R].son[1-w]=r;
    if(r!=0)tr[r].f=R;
    R=ff;r=x;
    if(tr[R].son[0]==f)tr[R].son[0]=x;
    else if(tr[R].son[1]==f)tr[R].son[1]=x;
    tr[r].f=R;
    R=x;r=f;
    tr[R].son[w]=r;
    tr[r].f=R;
    upd(f);upd(x);
}
int tmp[110000];
void splay(int x,int rt)
{
    int i=x,s=0;
    while(tr[i].f!=rt && (tr[tr[i].f].son[0]==i || tr[tr[i].f].son[1]==i))
    {
        tmp[++s]=i;
        i=tr[i].f;
    }
    tmp[++s]=i;
    while(s)
    {
        int i=tmp[s--];
        if(tr[i].fz)reverse(i);
    }
    while(tr[x].f!=rt && (tr[tr[x].f].son[0]==x || tr[tr[x].f].son[1]==x))
    {
        int f=tr[x].f,ff=tr[f].f;
        if(ff==rt || (tr[ff].son[0]!=f && tr[ff].son[1]!=f))
        {
            if(tr[f].son[0]==x)rotate(x,1);
            else rotate(x,0);
        }
        else
        {
            if(tr[ff].son[0]==f && tr[f].son[0]==x)rotate(f,1),rotate(x,1);
            else if(tr[ff].son[1]==f && tr[f].son[0]==x)rotate(x,1),rotate(x,0);
            else if(tr[ff].son[1]==f && tr[f].son[1]==x)rotate(f,0),rotate(x,0);
            else rotate(x,0),rotate(x,1);   
        }
    }
}
void access(int x)
{
    int y=0;
    while(x!=0)
    {
        splay(x,0);
        tr[x].son[1]=y;
        if(y!=0)tr[y].f=x;
        y=x;x=tr[x].f;
    }
}
void mark_root(int x){access(x);splay(x,0);tr[x].fz^=1;}
void link(int x,int y){mark_root(x);tr[x].f=y;access(x);}
int findsum(int x,int y){mark_root(x);access(y);splay(y,0);return tr[y].c-1;}
char ch[10];
int main()
{
//  freopen("c.in","r",stdin);
//  freopen("c.out","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int u;
        scanf("%s%d",ch+1,&u);
        if(ch[1]=='Q')printf("%d\n",max(findsum(u,l[belong[u]]),findsum(u,r[belong[u]])));
        else
        {
            if(u==-1)
            {
                trlen++;tr[trlen].c=1;
                fa[trlen]=trlen;belong[trlen]=trlen;
                l[trlen]=r[trlen]=trlen;
            }
            else
            {
                int P=belong[u],now=++trlen;tr[now].c=1;
                link(now,u);belong[now]=belong[u];fa[now]=findfa(u);
                int d0=findsum(l[P],now),d1=findsum(r[P],now),d2=findsum(l[P],r[P]);
                if(d0>=d2 && d0>=d1)r[P]=now;
                else if(d1>=d2 && d1>=d0)l[P]=now;
            }
        }
    }
    return 0;
}
面向边缘计算的YOLOv12模型剪枝-蒸馏联合优化实战教程** 这套剪枝-蒸馏联合方案的优势在于其系统性和可靠性。它不是单一的技巧,而是一套完整的工程流程,确保了从研发到部署的无缝衔接。 阅读详情

相关推荐

细胞膜电学特性的分数阶微积分建模

分数阶微积分在细胞膜电学特性建模中的应用主要体现在对细胞膜的电容行为和神经元放电活动的更精确描述上。

冰河世纪20的博客 623

BZOJ5192[Usaco2018 Feb] New Barns

原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5192 New Barns Description FarmerJohn注意到他的奶牛们如果被关得太紧就容易吵架,所以他想开放一些新的牛棚来分散她们。每当FJ建造一个新牛棚的时候,他会将这个牛棚用至多一条双向道路与一个现有的牛棚连接起来。为了确保他的奶牛们足够分散,他有时想要确定...

ShadyPi的IT笔记 552

SDIO_WiFi驱动学习之SDIO架构介绍及源码分析

一、引言 因为WiFi驱动比较复杂,所以WiFi驱动的博客将分为两篇来写。 本篇博客主要介绍Linux下的SDIO架构及源码分析。 二、SDIO WiFi SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈,能够实现用户主平台数据通过SDIO口到无线网络之间的转换。SDIO具有传输数据快,兼容SD、MMC接口等特点。 对于SDIO接口的WiFi,首先,它是一个SDIO的卡设备,然后具备了WiFi的功能。所

陈子陌的博客 1万+

牛客2024年除夕娱乐赛(题解)

牛客2024年除夕娱乐赛(题解)

ros275229的博客 656

Windows系统下LaTeX环境搭建与编辑器配置全攻略

本文详细介绍了在Windows系统下搭建LaTeX环境的完整流程,包括TeX Live的安装、TeXStudio编辑器的配置优化以及常见问题排查。特别针对中文用户推荐使用清华镜像源加速下载,并提供了XeLaTeX编译器配置、中文支持等实用技巧,帮助用户快速上手LaTeX文档编写。

weixin_42554408的博客 449

WPS制作甘特图实操(带图超详细)

一、数据准备 图1 二、添加公式 在表格的E3处添加公式:=IF(C3>=G3,0,IF(C3+D3>=G3,G3-C3,D3)),点击该单元格的右下角。使鼠标箭头变“+”后下拉拖拽,复制该公式。F3处的公式为:=D3-E3,使用相同的拖拽方式复制公式应用,操作完毕如下图3. 图2 图3 三、插入图表 1、选中方框1内容,按住ctrl按键,继续选择2、3列的内容,点击插入全部图表中的条形图,选择2对应的图标样式,生成图6的样式。 点击图6中的3标尺,右击选择数据弹出图8,点击+号选择表格中

m0_49047167的博客 3万+

C++工程师养成 每日一题(VECTOR使用)

牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2 为了让...

weixin_45853151的博客 368

SAP交货单过账避坑指南:序列号处理、Buffer清理与BAPI提交回滚的那些事儿

本文深入解析SAP交货单过账中的序列号处理、Buffer清理与BAPI提交回滚等关键问题,提供WS_DELIVERY_UPDATE和BAPI_OUTB_DELIVERY_CONFIRM_DEC的实战优化方案。通过详细的技术分析和最佳实践,帮助开发者避免常见陷阱,提升交货单处理的稳定性和效率。

weixin_31155097的博客 431

2018.12.12【BZOJ5192】【洛谷P4271】New Barns(LCT维护直径)

BZOJ传送门 洛谷传送门 解析: 许久没有写LCT,手都有点生了。 思路: 这道题是显然的需要维护直径的,因为有结论,树上距离一个点的最远点一定是某个直径的端点。证明很显然,就不证了。 那么怎么维护动态的直径呢? 我们可以用LCT维护一个森林,对于每棵树记录直径的两个端点,加入一个新点的时候更新,我们有如下结论:新的直径与原来直径至少有一个端点重合。 那么LCT乱搞一波就做完了。 代码: #...

zxyoi_dreamer的博客(不定期诈尸) 545

疾病负担研究(GBD)介绍

今天我们来聊一聊第一个公共数据库——GBD数据库,全称叫做global burden of disease(全球疾病负担),该数据库每年都会更新,目前已经更新到GBD2019。 这里直接给大家贴出网址:Global Burden of Disease Study 2019 (GBD 2019) Data Resources | GHDx 上图中红色圈圈标识的就是数据库的数据获取界面的链接,大家直接点击即可. 数据的检索十分方便: Context下拉菜单中可以选择不同的选项,默认是caus

weixin_44240228的博客 1万+

【SEED Labs 2.0】V*N Tunneling Lab

本文为 SEED Labs 2.0 - V*N Tunneling Lab 的实验记录。本实验工作量较大,但难度不大,重点在于搞清是谁发给谁,走的什么路径。另外,本次实验由于网络中的设备较多,修改了环境变量方便分清哪个窗口是哪个设备。这样操作起来就方便多了。...

Chenyang的博客 6979

牛客竞赛语法入门班选择结构习题代码整理

牛客竞赛语法入门班选择结构习题代码整理

沐遥的博客 1594

板蓝根挥发油微胶囊化技术及其在抗菌织物整理中的应用研究

微胶囊技术是一种通过成膜材料将具有反应活性或挥发性的液体或固体包封成微小颗粒的技术。该技术因其优异的缓释保护和物态改变性能,已在医药、食品、化妆品等多个领域得到广泛应用。本研究采用复凝聚法制备板蓝根挥发油的微胶囊,利用明胶和阿拉伯胶作为壁材,旨在提升其稳定性和抗菌性能。

qq_62634009的博客 584

牛客竞赛记录——小紫的劣势博弈

来源:牛客网。小紫的劣势博弈

2401_89874225的博客 538

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【OJ比赛日历】快周末了,不来一场比赛吗? #11.11-11.17 #12场

实时聚合多平台的(Kaggle、天池…)和(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注!以下信息仅供参考,以比赛官网为准。

CompHub的博客 385

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

牛客周赛63部分题解

【代码】牛客周赛63部分题解。

song0789的博客 476

efm32 入门.pdf

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

牛客竞赛NC273390||A Math Problem

n,q,x,a的范围在1到10的5次方,也就是说,a取10的5次方,x取零时,每个a的平方可以达到10的10次方,逼近int的范围(int的范围最大值是21亿),10的5次方个a的总和就是10的15次方,还在long long的范围内,这个时候我们可以选择开long来存储n个a值相加,x范围相同,则同理。题目理解起来很简单,就是根据题目给出n个a值和x值,计算a-x的平方,然后把他们分别相加即可,看不懂英文的可以直接看输入输出也很容易理解。直接用(a-x)的平方=a的平方-2*a*x+x的平方计算即可。

Zhtsj的博客 500

信息学竞赛有什么好的比赛网站?

1、HustOJ MYOJ 热心家长创建的一个自测 OJ,与华中科技大学颇有渊源。不定期举办一些针对初学者的比赛。菜鸟们不妨一试。 2、信奥题库 信奥题库https://www.oitiku.com/ 3、计蒜客 www.jisuanke.com 课程要付费,但是月赛和题库是免费的,判题速度快,手感还不错 计蒜客比赛 比赛 - 计蒜客计蒜客比赛平台为广大选手提供ACM、ICPC网络赛,NOIP普及组和提高组模拟赛,蓝桥杯省赛、国赛模拟赛,并承接各种商业比赛,是竞赛党练习、参赛的专业

青少年趣味编程 1万+

计算机专业学生在大学不要错过了这些竞赛!

计算机专业学生在大学不要错过了这些竞赛!

分享Python知识 5636

牛客挑战赛60题解

牛客挑战赛60题解

欢迎您的光顾awa 1089

牛客2025年愚人节比赛

来源:牛客网。

2301_80079117的博客 1660

[USACO18FEB]New Barns P

题目的意思是让我们动态维护直径。 很容易得到以下两个定理: 1.两棵树合并以后的直径端点是原来两棵树的四个直径端点中的两个; 2.距离一个点最远的点一定是一个直径的端点。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; template<typename T>inl

zsyzClb的博客 272

P4271 [USACO18FEB]New Barns

传送门 动态维护树上节点到其他所有点的最长距离 算是 $LCT$ 的模板之一吧 $LCT$ 维护直径,这一题其实可以不用维护直径的,但是我当模板写了 首先我们都知道 $LCT$ 里面的 $splay$ 维护的是一段树链,$splay$ 的子树内的节点恰好为原树上一段连续的链 对每条实链的 $splay$ 维护 $lmx[x],rmx[x],mxs[x],sum[x]$ ,分别表...

weixin_30667301的博客 182

【考题·动态规划】[USACO2018]Directory Traversal(二次扫描·树形DP)

题目描述 奶牛Bessie令人惊讶地精通计算机。她在牛棚的电脑里用一组文件夹储存了她所有珍贵的文件,比如: bessie/ folder1/ file1 folder2/ file2 folder3/ file3 file4 只有一个“顶层”的文件夹,叫做bessie。 Bessie可以浏览任何一个她想要访问的文件夹。从一个给定的文件夹,每一个文件都可以通过一个“相对路径”被引用。在一个相对路径中...

Ronaldo7_ZYB的博客 509

牛客竞赛每日俩题 - Day13

洪泛法BFS 26进制计数字符串

weixin_73961973的博客 634

组队竞赛-Java-牛客模拟三

在做笔试中算法题目时,理解题意和解题思路是非常关键。其实此题目知道了解题思路后是非常简单的。 package 模拟三; import java.util.Arrays; import java.util.Scanner; /** * 题目描述:牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i. * 现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.

崔洪振367 1395
上一篇: [bzoj3240][矩阵乘法]矩阵游戏
下一篇: SAM学习笔记
Rose_max
博客等级 码龄10年 97粉丝 610原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值