bzoj 3572 [Hnoi2014]世界树 虚树 dp

GPS从入门到放弃(一) --- GPS基础原理 GPS从入门到放弃(一) — GPS基础原理 GPS,全称Global Positioning System,已经广泛应用于我们的日常生活中了,现在的智能手机 里都会自带GPS定位功能。这是一个美国的全球定位系统,虽然我们现在也有北斗了,但毕竟GPS搞的早,所以先从它开始研究起。 整个GPS系统分三大部分: 地面站 卫星 接收机 地面站负责监控。它们通过接收、测量各个卫星信号,计算卫星的运行轨... 阅读详情

先建出虚树(似乎虚树可以不写重新标号)
dfs两次维护f[x] 在x的子树中距x最近的选中的点,g[x] 整棵树中距x最近的选中的点。
考虑虚树中的每一条边,这条边上的所有不在虚树上的点以及他的子树只能选这条边两端的虚树上的点的g[x]。
这里写图片描述
求出分界位置。对于求一条链上点的子树的大小之和,可以倍增维护一个点到祖先的size之和,假设求链fa[x]到fa[y]上点的子树之和(fa[y]是fa[x]的祖先),就是(fa[x]到fa[y]的size和)-(x到y的size和)。
再对于每个虚树上的点单独计算就好了。
(语文太渣,可以看代码。。。)

#include <bits/stdc++.h>
using namespace std;
#define inf 1e9
#define N 310000
#define MP make_pair
#define PA pair<int,int>
#define AD(x,y) MP(x.first+y,x.second)
int n,tot,cnt,Q,top,tim;
int head[N],nex[N<<1],to[N<<1],pos[N],a[N],b[N];
int st[N],deep[N],bel[N],num[N],bj[N],ans[N];
int fa[N][21],sum[N][21];
vector<int>vec[N];
PA f[N],g[N];
void add(int x,int y)
{
    tot++;
    nex[tot]=head[x];head[x]=tot;
    to[tot]=y;
}
void dfs(int x,int y)
{
    pos[x]=++cnt;deep[x]=deep[y]+1;
    sum[x][0]=1;fa[x][0]=y;
    for(int i=head[x];i;i=nex[i])
        if(to[i]!=y)
        {
            dfs(to[i],x);
            sum[x][0]+=sum[to[i]][0];
        }
}
int cmp(int x,int y){return pos[x]<pos[y];}
int lca(int x,int y)
{
    if(deep[x]<deep[y])swap(x,y);
    for(int i=20;i>=0;i--)
        if(deep[fa[x][i]]>=deep[y])
            x=fa[x][i];
    if(x==y)return x;
    for(int i=20;i>=0;i--)
        if(fa[x][i]!=fa[y][i])
            x=fa[x][i],y=fa[y][i];
    return fa[x][0];
}
void dfs1(int x)
{
    f[x]=MP(inf,0);
    if(bj[bel[x]]==tim)f[x]=MP(0,bel[x]);
    for(int i=0,t;i<vec[x].size();i++)
    {
        dfs1(t=vec[x][i]);
        f[x]=min(f[x],AD(f[t],deep[bel[t]]-deep[bel[x]]));
    }
}
PA up(int x,int y)
{
    int ret=0;
    for(int i=20;i>=0;i--)
        if(y>>i&1)
            ret+=sum[x][i],x=fa[x][i];
    return MP(ret,x);
}
int move(int x,int y)
{
    for(int i=20;i>=0;i--)
        if(deep[fa[x][i]]>deep[y])
            x=fa[x][i];
    return x;
}
int cal(int x,int y)
{
    PA v1=up(x,y),v2=up(fa[x][0],y);
    return v2.first-v1.first;
}
void dfs2(int x)
{   
    ans[g[x].second]+=sum[bel[x]][0];
    for(int i=0,t;i<vec[x].size();i++)
    {
        ans[g[x].second]-=sum[move(bel[t=vec[x][i]],bel[x])][0];
        g[t]=min(f[t],AD(g[x],deep[bel[t]]-deep[bel[x]]));
        dfs2(t);
        int v1=g[t].first-g[x].first,v2=deep[bel[t]]-deep[bel[x]],p1,p2;
        if(v1+v2<=1)p1=0;
        else if((v1+v2)&1)p1=(v1+v2)/2;
        else p1= g[x].second<g[t].second ? (v1+v2)/2 : (v1+v2)/2-1;
        p1=max(p1,0);p1=min(p1,v2-1);p2=v2-1-p1;
        int pos=up(bel[t],p2).second;
        if(p1)ans[g[x].second]+=cal(pos,p1);
        if(p2)ans[g[t].second]+=cal(bel[t],p2);
    }
}
int main()
{
    //freopen("tt.in","r",stdin);
    scanf("%d",&n);
    for(int i=1,x,y;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    dfs(1,0);
    for(int i=1;i<=20;i++)
        for(int j=1;j<=n;j++)
        {
            fa[j][i]=fa[fa[j][i-1]][i-1];
            sum[j][i]=sum[j][i-1]+sum[fa[j][i-1]][i-1];
        }
    scanf("%d",&Q);
    for(int m;Q--;)
    {
        scanf("%d",&m);tim++;
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&a[i]),bj[a[i]]=tim;
            b[i]=a[i];ans[b[i]]=0;
        }
        sort(a+1,a+1+m,cmp);
        st[top=1]=1;vec[1].clear();
        num[1]=1;bel[cnt=1]=1;
        for(int i=1;i<=m;i++)
        {
            int t;
            while((t=lca(st[top],a[i]))!=st[top])
            {
                if(deep[st[top-1]]<deep[t])
                {
                    num[t]=++cnt;bel[cnt]=t;
                    vec[cnt].clear();
                    vec[cnt].push_back(num[st[top]]);
                    st[top]=t;
                }
                else vec[num[st[top-1]]].push_back(num[st[top]]),top--;
            }
            if(st[top]!=a[i])
            {
                st[++top]=a[i];
                num[a[i]]=++cnt;bel[cnt]=a[i];
                vec[cnt].clear();
            }
        }
        for(int i=top;i>1;i--)
            vec[num[st[i-1]]].push_back(num[st[i]]);
        dfs1(1);
        g[1]=f[1];dfs2(1);
        for(int i=1;i<=m;i++)
            printf("%d ",ans[b[i]]);
        puts("");
    }
    return 0;
}
基于 ESP32-CAM 与 TinyML 的食堂餐盘自动识别与营养分析终端 【代码】基于 ESP32-CAM 与 TinyML 的食堂餐盘自动识别与营养分析终端。 阅读详情

相关推荐

vivado2020.1使用vitis生成QSPI启动文件报错

在使用vivado2020.1使用vitis,生成QSPI启动文件时会报错,data2mem命令无法识别,这是因为data2mem是xilinx7series芯片的命令,当使用ultrascale/ultrascale+芯片时则需要使用updatemem命令,这或许是vitis的一个bug吧,明明选择的是ultrascale的芯片,却一直调用打她mem命令,挺麻烦的,需要手动执行,在XSCT console窗口执行的命令如下: updatemem -force -meminfo \ F:/xc7z35t/x

qq_32134427的博客 2336

BZOJ 3572: [Hnoi2014]世界树 虚树Dp

title BZOJ 3572 LUOGU 3233 Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界。在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息、持续运转的根本基石。 世界树的形态可以用一个数学模型来描述:世界树中有n个种族,种族的编号分别从1到n,分别生活在编号为1到n的聚居地上...

dilu0653的博客 147

LSM6DS3TR-C IMU传感器入门:从MEMS原理到姿态解算实战

惯性测量单元(IMU)是现代智能设备实现运动感知的核心部件,其基础原理基于微机电系统(MEMS)技术。MEMS加速度计通过检测质量块在惯性力作用下的位移来测量线性加速度,而陀螺仪则利用科里奥利力效应感知角速度。这种技术使得微型化、低成本的6自由度运动测量成为可能,为机器人、无人机、可穿戴设备等提供了关键的空间姿态和运动状态信息。在实际工程中,开发者需要掌握I2C/SPI通信协议、传感器数据读取与校准,并通过互补滤波等算法融合加速度计和陀螺仪数据,实现稳定的姿态解算。LSM6DS3TR-C作为一款高性价比的6

weixin_28684655的博客 596

[BZOJ3572][Hnoi2014]世界树 && 虚树+DP

这玩意好难啊Orz 完全不理解那个模拟深搜到底是什么鬼 果然像我这样的人最好早点滚粗  要简历虚树 首先要选出虚树里面的点 那么关键点和关键点的LCA都要加入到虚树中来 那我们就深搜一遍 处理出每个节点的dfn值和儿子数  按照dfn值依次枚举每一个关键节点 这样可以把同一棵子树内的节点一起找到 用一个深度单调的栈来维护树中的节点 每次取出一个关键点 求出它和栈顶元素的lca  如

shiyukun1998的专栏 1536

python调用海康工业相机并用opencv显示(整体实现)

python语言调用海康机器人(hikrobotics)工业相机 第一章 Python 语言下连接海康工业相机,并获取数据 文章目录 系列文章目录 前言 目录 python语言调用海康机器人(hikrobotics)工业相机 文章目录 前言 一、底层接口的准备 二、使用步骤 1.引入库 2.枚举设备 3.判断设备类型 4.输入连接设备 5.创建相机实例并创建句柄 6.打开设备 7.获取相关参数 8.主动获取图像 9.开启取流并获取每张.

qq_39570716的博客 5万+

炸金花游戏(3)--基于EV(期望收益)的简单AI模型

前言:   炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章:  德州扑克AI--Programming Poker AI(译).  系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言,***简单很多, 也更偏重于运...

weixin_30377461的博客 2342

[HNOI2014][bzoj3572] 世界树 [虚树+dp]

题面: 传送门 思路: 一道虚树的好题,是很多虚树博客的入门题目 但是我认为这道题目出的难点和亮点不在于虚树,而在于建出虚树以后dp的思路与实现 下文中为方便描述,用势力范围来表示一个“议事处”管辖的节点集合 首先,看完题目以后一个直观的感受,就是我去考虑两个询问点之间,哪些点属于谁的势力范围,然后这样 这是个类似暴力的东西 那树上路径的中点怎么求?可以lca...

123

思科9117AP从零配置EWC模式实战:Wi-Fi6网络搭建避坑指南

本文详细介绍了思科9117AP在Wi-Fi6网络环境下配置EWC模式的实战指南,涵盖镜像准备、网络环境配置、模式转换步骤及高级运维技巧。通过EWC模式,企业可实现控制器与AP的一体化部署,显著降低成本和简化运维,特别适合中小企业Wi-Fi6网络搭建。

weixin_28318011的博客 333

BZOJ 3572 [HNOI2014]世界树 (虚树+DP)

题面:BZOJ传送门 洛谷传送门 题目大意:略 细节贼多的虚树$DP$ 先考虑只有一次询问的情况 一个节点$x$可能被它子树内的一个到x距离最小的特殊点管辖,还可能被管辖fa[x]的特殊点管辖 跑两次$dfs$即可,时间$O(n)$ 再考虑一条链的情况 一条链上有很多个特殊点,相邻两个特殊点$x,y$之间可能有很多连续的非特殊点,那么在这些连续的非特殊点上会有一个分...

weixin_30826761的博客 150

基于PChmi.dll的PLC报警显示和记录(C#)

本文介绍了如何使用C#编写基于PChmi.dll的程序,实现PLC报警的显示和记录功能。通过订阅PLC的报警事件,我们可以实时显示报警信息,并通过日志文件记录报警历史。PLC(可编程逻辑控制器)在工业自动化领域中扮演着重要的角色,而报警显示和记录是PLC应用中常见的需求。本文将介绍如何使用C#编写基于PChmi.dll的程序,实现PLC报警的显示和记录功能。当然,这只是实现报警显示和记录的基本框架,具体的实现方式可能因不同的PLC和HMI库而有所差异。你需要根据你所使用的具体库和设备进行相应的调整和修改。

ByteLegend的博客 1673

ClaudeCode入门01-环境安装(小白入门:手把手教你配置,超简单的一种接入方式)

文手把手教你从零搭建 Claude Code 开发环境。针对国内网络现状,我们采用 OpenRouter + Claude Code Router 的方案,支持支付宝/微信充值,无需科学上网即可完成配置。内容涵盖 Node.js 安装(macOS/Windows/Linux)、OpenRouter 注册与充值、Claude Code 和 Router 安装配置,以及一键启动脚本的编写。跟着截图一步步操作,10分钟搞定全部环境!

yueyeguzhuo的专栏 281

【BZOJ】3572: [Hnoi2014]世界树【虚树DP】

传送门:3572: [Hnoi2014]世界树 my code: #include #include #include #include using namespace std ; typedef long long LL ; typedef unsigned long long ULL ; typedef pair pii ; #define rep( i , a ,

poursoul 1186

YOLOv8 置信度阈值 (conf) 和 IoU 阈值 (iou) 详解:如何平衡漏检与误检?

摘要 本文深入探讨了YOLOv8目标检测模型中两个关键参数——置信度阈值(conf)和IoU阈值(iou)的核心作用。文章从目标检测的基础概念出发,解释了置信度分数反映模型预测可靠性,IoU衡量预测框重叠程度。重点剖析了非极大值抑制(NMS)机制如何通过这两个阈值进行预测框筛选:置信度阈值作为初筛门槛,IoU阈值决定重叠框的取舍。通过生动比喻和可视化图表,阐述了合理调节这两个参数能有效平衡误检与漏检问题,是优化YOLOv8模型实际表现的重要技巧。全文以实践为导向,帮助开发者掌握成为"调参大师&qu

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 1251

bzoj 3572 [Hnoi2014]世界树(虚树+DP)

3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 645  Solved: 362[Submit][Status][Discuss] Description  世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界。在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里

hahalidaxin的专栏 616

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

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

BZOJ3572【HNOI2014】世界树题解(虚树+树上倍增+换根DP)

题目:BZOJ3572. 题目大意:给定一棵nnn个点的树与一些询问,每次询问给定kkk个点aia_iai​.现在定义一个点从属于距离它最近的aia_iai​,若距离相等则属于编号最小的aia_iai​,要求输出对于每个aia_iai​有多少点属于aia_iai​. 1≤n,∑k≤3∗1051\leq n,\sum k\leq3*10^51≤n,∑k≤3∗105. 首先建出虚树,发现这题不在虚树上...

hzk_cpp的博客 326

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【BZOJ3572】【HNOI2014】—世界树(虚树+倍增+dp)

传送门 考虑将虚树建出来 我们先对于每个虚树的点点求出被哪个地方支配 然后考虑对每一条边考虑 如果两边点被同一点支配就不用管了 否则考虑倍增找到中点 分别计算一下贡献 可以处理一个remremrem表示子树中除去已经被计算过的剩下的sizsizsiz 也就可以方便统计那些没有关键点的子树了 具体可以看代码 #include<bits/stdc++.h> using namespace ...

Stargazer的博客 222

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[BZOJ3572][HNOI2014]世界树-虚树+树形DP

世界树Description世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界。在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息、持续运转的根本基石。世界树的形态可以用一个数学模型来描述:世界树中有n个种族,种族的编号分别从1到n,分别生活在编号为1到n的聚居地上,种族的编号与其聚居地的编号相同。有的聚居地之间有双向的道路相连,

「嫌われ者のフィロソフィ」 432

bzoj 3572: [Hnoi2014]世界树 (虚树+树形DP+LCA)

3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1412  Solved: 784 [Submit][Status][Discuss] Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界。在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们

clover_hxy的博客 570

bzoj 3572 [Hnoi2014]世界树 (虚树+树形dp)

3572: [Hnoi2014]世界树 Time Limit:20 SecMemory Limit:512 MBSubmit:2187Solved:1178[Submit][Status][Discuss] Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界。在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的...

weixin_30305735的博客 97

[ BZOJ3572 ] [ Hnoi2014 ] [ 虚树 ] [ 树形DP ] 世界树

学一发虚树 这个树形DP是真的烦,都调发烧了……我说真的#include <cstdio> #include <iostream> #include <algorithm>using namespace std;const int N=300010;int n,cnt,x,y,tms; int G[N],dfn[N],size[N];struct edge{ int t,nx; }E[N<<1

CE玩家 575

BZOJ 3572: [Hnoi2014]世界树 [虚树 DP 倍增]

传送门 题意: 一棵树,多次询问,给出$m$个点,求有几个点到给定点最近 写了一晚上... 当然要建虚树了,但是怎么$DP$啊 大爷题解传送门 我们先求出到虚树上某个点最近的关键点 然后枚举所有的边$(f,x)$,讨论一下边上的点的子树应该靠谁更近 倍增求出分界点 注意有些没出现在虚树上的子树 注意讨论的时候只讨论链上的不包括端点,否则$f$的子树会被贡献多次 ...

weixin_30546189的博客 94

BZOJ 3572: [Hnoi2014]世界树 虚树 树形dp

https://www.lydsy.com/JudgeOnline/problem.php?id=3572 http://hzwer.com/6804.html写的时候参考了hzwer的代码,不会写的题读一遍代码就好了(所以菜)。 虚树还是老一套,树形dp的部分比较有趣。 通过dfs两遍(从下往上总结一遍,从上往下再一遍)把每个点所归属的点找到。 对于那些没有出现在虚树中的点,对通过每条...

weixin_30292745的博客 121

2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)

传送门 虚树入门题? 好难啊。 在学习别人的写法之后终于过了。 这道题dp方程很好想。 主要是不好写。 简要说说思路吧。 显然最优值只能够从子树和父亲转移过来。 于是我们先dfs一遍用儿子更新父亲,然后再dfs一遍用父亲更新儿子。 这样搞完之后可以统计出每个点所属的管辖点。 然后统计。 但这样单次跑是O(n)O(n)O(n)的不优秀。 考虑优化算法的时间复杂度。 注意到所有管辖点加起来只有O(n)...

苟为蒟蒻又何妨 438

bzoj3572 [HNOI2014]世界树 虚树 +乱dp

这个题有Σ的条件,肯定还是用log结构求询问点相关了但这个题是点之间的距离关系,所以本来想用中点来代替原来的lca,但中点的个数不满足任何单调性,而且个数也不是n个所以还是要用lca,所以考虑lca和中点的关系,lca的好处就是n个点对之间只有最多n个lca这时就需要一定的转化,把原来的确定中点问题变成确定 最少影响点 问题因为如果把所有拐点表示出来,剩下的就都是线段了自然容易想到讨论lca的归属

-----PSI----- 274

【bzoj3572】[Hnoi2014]世界树 虚树+倍增lca+DP

Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界。在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息、持续运转的根本基石。 世界树的形态可以用一个数学模型来描述:世界树中有n个种族,种族的编号分别从1到n,分别生活在编号为1到n的聚居地上,种族的编号与其聚居地的编号相同。有的聚居地之间有双向的道路相

wang_sj的博客 364

洛谷3233 BZOJ3572 HNOI2014 世界树 虚树 树形dp

题目链接 题意: 给你一棵n个点的树,边的边权都是1,有m次询问,每次选出若干个点,对于每次询问,每个点要划分给离它最近的被选出来的点,如果有多个距离相同的点,则把这个点划分给这几个距离相同的点中编号最小的点,求每次询问选出的这些点各自分得了多少个点。nnn和∑选出的点的个数\sum选出的点的个数∑选出的点的个数都是3e5量级的。 题解: 每次询问选出树上若干个点的题目还是考虑建出虚树之后树形dp...

forever_shi的博客 300
上一篇: bzoj 3566 [SHOI2014]概率充电器 概率dp
下一篇: bzoj 3598 [Scoi2014]方伯伯的商场之旅 数位dp
make_it_for_good
博客等级 码龄11年 13粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值