hihoCoder1381 - Little Y's Tree

Portal

Description

给出一个\(n(n\leq10^5)\)个点的带边权的树。进行\(Q\)次询问:每次删除树上的\(k\)条边,求剩下的\(k+1\)个连通块中最远点对距离的和。\(\Sigma k\leq10^5\),询问之间是独立的。

Solution

神奇而又毒瘤的做法。
考虑如何合并树上两个连通块的答案。设两个连通块的最远点对分别为\((v_1,v_2),(v_3,v_4)\),那么合并后的最远点对的两个端点一定是\(\{v_1,v_2,v_3,v_4\}\)中的两个。LCA用RMQ求的话时间复杂度是\(O(1)\)。

证明:
设两个连通块通过边\((p,q)\)连通。若合并后的最远路径不经过\((p,q)\),则其一定是\((v_1,v_2),(v_3,v_4)\)之一。若经过\((p,q)\),则可以将其看成\((u_1,p)+(p,q)+(q,u_2)\),而\((v_1,p),(v_2,p)\)必然是以\(p\)为端点的最长、次长路径,所以\(u_1\)必然是\(v_1,v_2\)之一;\(u_2\)同理。

删除边\((u,v)\)相当于将以\(v\)为根的子树从原树上断掉,断掉\(k\)条边相当于将原树变成了以\(1\)和\(v_{1..k}\)为根的\(k+1\)个连通块。那么做出原树的DFS序,断掉一个子树就相当于删掉一个区间。如图,子树\(1\)中的子树\(2\)和子树\(6\)被断掉,那么就删掉这两个区间,剩下的\(\{1,3\}\)即以\(1\)为根的连通块;同理\(2\)中的\(4\)被断掉,从\(2\)的DFS序中删掉\(4\)的就是\(\{2,5\}\)。
1339270-20180417195129443-1139333612.png
对所有区间排序并递归,可以求出每个连通块中有哪些点,那么该连通块中的最远点对相当于DFS序上的若干个区间的合并。由于新加入一个区间最多把原区间分成三份,所以最多要询问\(2k+1\)次。用线段树维护DFS序,每个节点记录该区间内的最远点对即可。虽然DFS上连续的点在原树上不一定连通,不过由于我们每次询问的部分都是连通的所以没关系啦。

时间复杂度\(O(logn\Sigma k)\)。

Code

//Little Y's Tree
#include <algorithm>
#include <cstdio>
using std::sort; using std::max; using std::swap;
typedef long long lint;
inline char gc()
{
    static char now[1<<16],*s,*t;
    if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
    return *s++;
}
inline int read()
{
    int x=0; char ch=gc();
    while(ch<'0'||'9'<ch) ch=gc();
    while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x;
}
const int N=1e5+10;
int n;
int cnt,h[N];
struct edge{int u,v,w,nxt;} ed[N<<1];
void edAdd(int u,int v,int w)
{
    cnt++; ed[cnt].u=u,ed[cnt].v=v,ed[cnt].w=w,ed[cnt].nxt=h[u],h[u]=cnt;
    cnt++; ed[cnt].u=v,ed[cnt].v=u,ed[cnt].w=w,ed[cnt].nxt=h[v],h[v]=cnt;
}
int fa[N],dpt[N]; lint dst[N];
int dfCnt1,dfn1[N],fr1[N],to1[N];
int dfCnt2,dfn2[N<<1],fr2[N];
void dfs(int u)
{
    dfn1[++dfCnt1]=u; fr1[u]=dfCnt1;
    dfn2[++dfCnt2]=u; fr2[u]=dfCnt2;
    for(int i=h[u];i;i=ed[i].nxt)
    {
        int v=ed[i].v,w=ed[i].w;
        if(v==fa[u]) continue;
        fa[v]=u,dpt[v]=dpt[u]+1,dst[v]=dst[u]+w;
        dfs(v); dfn2[++dfCnt2]=u;
    }
    to1[u]=dfCnt1;
}
int Lg2[N<<1],rmq[N<<1][20];
void bldLCA()
{
    Lg2[1]=0;
    for(int i=2;i<=dfCnt2;i++) Lg2[i]=Lg2[i>>1]+1;
    for(int i=1;i<=dfCnt2;i++) rmq[i][0]=dfn2[i];
    for(int k=1;k<=18;k++)
        for(int i=1;i+(1<<k-1)<=dfCnt2;i++)
        {
            int r1=rmq[i][k-1],r2=rmq[i+(1<<k-1)][k-1];
            rmq[i][k]=dpt[r1]<dpt[r2]?r1:r2;
        }
}
int lca(int u,int v)
{
    int i=fr2[u],j=fr2[v];
    if(i>j) swap(i,j);
    int t=Lg2[j-i+1];
    int r1=rmq[i][t],r2=rmq[j-(1<<t)+1][t];
    return dpt[r1]<dpt[r2]?r1:r2;
}
lint dist(int u,int v) {return dst[u]+dst[v]-2*dst[lca(u,v)];}
#define Ls (p<<1)
#define Rs (p<<1|1)
int rt=1; int maxP=0;
struct node
{
    lint len; int v1,v2;
    node(lint _len=0,int _v1=0,int _v2=0) {len=_len,v1=_v1,v2=_v2;}
}nd[N<<2];
node operator +(node x,node y)
{
    if(x.v1==0) return y; else if(y.v1==0) return x;
    node z=node(0,0,0);
    lint d[10],d0=0;
    d[1]=dist(x.v1,x.v2),d[2]=dist(x.v1,y.v1),d[3]=dist(x.v1,y.v2);
    d[4]=dist(x.v2,y.v1),d[5]=dist(x.v2,y.v2),d[6]=dist(y.v1,y.v2);
    for(int i=1;i<=6;i++) d0=max(d0,d[i]);
    if(d[1]==d0) z=node(d[1],x.v1,x.v2);
    else if(d[2]==d0) z=node(d[2],x.v1,y.v1);
    else if(d[3]==d0) z=node(d[3],x.v1,y.v2);
    else if(d[4]==d0) z=node(d[4],x.v2,y.v1);
    else if(d[5]==d0) z=node(d[5],x.v2,y.v2);
    else if(d[6]==d0) z=node(d[6],y.v1,y.v2);
    return z;
}
void update(int p) {nd[p]=nd[Ls]+nd[Rs];}
void bldTr(int p,int L0,int R0)
{
    maxP=max(maxP,p);
    if(L0==R0) {nd[p]=node(0,dfn1[L0],dfn1[L0]); return;}
    int mid=L0+R0>>1;
    bldTr(Ls,L0,mid),bldTr(Rs,mid+1,R0);
    update(p);
}
int optL,optR;
node query(int p,int L0,int R0)
{
    if(optL<=L0&&R0<=optR) return nd[p];
    int mid=L0+R0>>1; node res=node(0,0,0);
    if(optL<=mid) res=res+query(Ls,L0,mid);
    if(mid<optR) res=res+query(Rs,mid+1,R0);
    return res;
}
struct qRec{int fr,to; node ans;} q[N];
bool cmpQ(qRec x,qRec y) {return x.fr<y.fr;}
int m,now;
//solve(x)解决区间x及其内部区间,并将now移动到x外的第一个
void solve(int x)    
{
    if(x>m) return;
    now++; int pre=q[x].fr;
    while(now<=m&&q[now].to<=q[x].to)
    {
        optL=pre,optR=q[now].fr-1;
        if(optL<=optR) q[x].ans=q[x].ans+query(rt,1,n);
        pre=q[now].to+1;
        solve(now);
    }
    optL=pre,optR=q[x].to;
    if(optL<=optR) q[x].ans=q[x].ans+query(rt,1,n);
}
int main()
{
    n=read();
    for(int i=1;i<=n-1;i++)
    {
        int u=read(),v=read(),w=read();
        edAdd(u,v,w);
    }
    fa[1]=0,dfs(1);
    bldLCA(); bldTr(rt,1,n);
    int Q=read();
    while(Q--)
    {
        m=read();
        for(int i=1;i<=m;i++)
        {
            int x=read()<<1; int u=ed[x].u,v=ed[x].v;
            if(dpt[u]>dpt[v]) swap(u,v);
            q[i].fr=fr1[v],q[i].to=to1[v];
            q[i].ans=node(0,0,0);
        }
        m++; q[m].fr=1,q[m].to=n,q[m].ans=node(0,0,0);
        sort(q+1,q+m+1,cmpQ);
        solve(now=1);
        lint res=0;
        for(int i=1;i<=m;i++) res+=(q[i].ans).len;
        printf("%lld\n",res);
    } 
    return 0;
}

P.S.

Icefox不到100行orz,我写了150+

转载于:https://www.cnblogs.com/VisJiao/p/8869505.html

【能源系统优化】基于MATLAB的光储充一体化多目标调度:光伏自用率与充电成本权衡及储能联合调控 MATLAB 光储充一体化运行优化|光伏自用率与充电成本权衡 内容概要:本文围绕MATLAB实现的光储充一体化系统运行优化展开,旨在通过建立统一的能量调度模型,量化光伏自用率与充电成本之间的权衡关系,提升设备利用效率与运行安全性,并形成可复现的工程分析能力。项目采用多目标混合整数线性规划方法,综合考虑分时电价、储能损耗、光伏消纳与车辆充电需求,在满足功率平衡、储能状态递推、充放电互斥等约束条件下,实现经济性与环保性的协同优化。通过归一化加权目标函数,支持灵活调整运营策略偏好,并利用MATLAB R2025b完成从数据生成、建模求解到结果可视化的完整流程。配套GUI界面支持参数配置、模型训练、结果预测与运行监控,增强了系统的实用性与交互性。 适合人群:具备一定MATLAB编程基础,从事新能源系统规划、电动汽车充电站运营、微电网控制或综合能源管理的技术人员与研究人员,尤其适合工作年限1-3年、希望深入掌握能源系统优化建模与工程实现的研发人员。 使用场景及目标:①优化城市公共充电站、工业园区、高速服务区等场景的光储充协同运行,降低运营成本并提高光伏利用率;②支持日前调度与滚动优化,实现从静态分析到动态调控的升级;③为储能配置、容量规划、需求响应申报及投资回报评估提供量化决策工具;④通过GUI界面实现数据驱动的模型训练与预测,辅助制定最优充放电策略。 阅读建议:此资源以MATLAB为开发平台,强调从理论建模到工程落地的全过程实践。建议读者结合代码示例与GUI操作,理解数据预处理、多目标优化、混合整数求解与结果评价的关键步骤,并通过修改权重参数、运行场景与设备配置进行灵敏度分析,从而全面掌握光储充系统优化的核心逻辑与应用潜力。 立即下载

相关推荐

一码盾・EXE 软件一机一码加密授权系统|机器绑定+离线授权码,防复制防破解,支持试用期 次数 有效期,批量发卡,软件加密软件

一码盾(DFG EXE 加密盾 旗舰版)是一套给任意 EXE 加壳加密、按 “一机一码” 发放授权的工具,面向个人开发者、软件作者和小型工作室。 加密时把主程序连同 DLL、bin 目录、配置文件一起打包,用 AES-256-CBC 加密后追加到壳程序末尾,成品里查不到明文代码;文件尾部带 SHA256 校验,壳模板也会自校验,改一个字节就拒绝启动,同时检测调试器,防止用 patch 跳过授权。原程序只在授权通过后才释放到临时目录运行,退出即删。 授权采用一机一码机制:客户双击成品后,会先看到启动面板,上面显示由 CPU、主板、BIOS、系统盘、显卡算出的 16 位机器码;客户复制后发给你,你用注册机粘贴出码,再由他填入激活。支持永久、按天数、按次数三种授权,试用次数用完就必须激活,删掉试用文件也刷不出新次数,把系统时间往前改也没有用。 每个产品都会随机生成一把独立密钥,界面上只显示 8 位指纹。A 产品的注册机出的码,在 B 产品上验不过;单个注册机的密钥被逆向出来,也不会影响其它产品;注册机还可以加口令,防止它外泄后被人乱出码。密钥库用 DPAPI 加密,注册机文件丢了,点 “重新导出” 就能补回。 面板可以按你的品牌来定:公告、微信、QQ、邮箱、跳转链接、6 个预设主题色加任意取色,有完整版和精简版两种样式,还能设成已激活就直接进程序、不弹面板。全程离线运行,不需要服务器,也不用客户联网。 工具是单文件,Win10、11 自带 .NET Framework 4.7.2 就能运行,另外支持用命令行或 spec.json 批量加密,用注册机命令行批量出码,还有 42 项端到端自检,并附完整 C# 源码和一键编译脚本,方便二次开发。

DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)

题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权。 小J有q个询问,每次小J会删掉这个树中的k条边,这棵树被分成k+1个连通块。小J想知道每个连通块中最远点对距离的和。 这里的询问是互相独立的,即每次都是在小Y的原树上进...

weixin_34349320的博客 243

ORCA灵巧手工程文件

包括软件包、用户手册、3D模型、上位机等资料

【杂题】【线段树】[hihocoder #1381] Little Y's Tree

Description 小Y有一棵n个节点的树,每条边都有正的边权。 小J有q个询问,每次小J会删掉这个树中的k条边,这棵树被分成k+1个连通块。小J想知道每个连通块中最远点对距离的和。 这里的询问是互相独立的,即每次都是在小Y的原树上进行操作。 n,q,∑k&lt;=100000,边权&lt;=109n,q,∑k&lt;=100000,边权&lt;=109n,q,\su...

Never give in. 337

隔离型全桥LLC谐振变化器建模及参数设计资料【仿真+设计报告+计算书】

内容概要:本文系统阐述了隔离型全桥LLC谐振变换器的建模与参数设计方法,聚焦于2.5kW双向全桥LLC变换器的工程实现,涵盖变频与移相混合控制策略的原理与应用。资料包包含完整的Simulink闭环仿真模型、Mathcad计算书及详细的设计报告,深入解析了软开关技术、谐振参数优化、双闭环PI控制等核心技术,并结合控制理论展示了高频高效电源转换系统的设计流程与仿真调试方法。; 适合人群:具备电力电子与电力传动基础知识,从事开关电源、新能源变换器研发的工程师及高校研究生。; 使用场景及目标:①掌握全桥LLC谐振变换器的工作原理与数学建模方法;②学习基于Simulink的闭环控制系统设计与动态响应分析;③实现变频与移相混合控制策略下的谐振参数优化与系统稳定性调试;④应用于科研项目、毕业设计或工业产品开发中的高性能电源系统设计。; 阅读建议:此资源以仿真与计算为核心,建议读者结合提供的Simulink模型与Mathcad计算书同步操作,深入理解控制逻辑与参数设计流程,并通过调整谐振腔参数、观察闭环响应来强化实践能力。

蚊虫幼虫群及滋生地识别病媒生物检测数据集VOC+YOLO格式2868张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

hihocoder 1381 Little Y's Tree

Problem有一棵有n个节点的树,每次询问删掉k条边后剩下的k+1个联通块里的直径的和。Solution虚树典型套路,考虑怎么维护每个联通块的直径,显然把树看成有根树的话,每棵树因为子树的边被删掉从而在dfs序上变成了若干块,但是由于删掉一条边只会对其直接的父亲产生1的影响,所以加起来是有O(k)块的,那么就只要用线段树维护一下直径,打起来挺快的,一次过掉。Code#include<iostrea

samjia2000的博客 512

CR660x-4.4.198.9-100刷机固件

根据bs://gb.cmMelRla/deva-4.4编译所得,适用于CR660X,建议刷第3方不死后进行升级。不死教程自行寻找。

hiho1381 Little Y's Tree(dfs序+线段树+树的直径)

给定一棵树,边权为正整数。每次询问砍掉k条边之后,k+1个连通子树的直径和是多少。 我们考虑用线段树来维护连通子树的直径。 考虑如何合并两个连通子树的直径,即我们知道了连通子树的直径分别为x1-y1,d1;x2-y2,d2,我们要把这两个连通子树合并起来。那么新的直径的端点一定是这四个点之二。 至于为何,我们考虑这两个连通子树是由x-y这条边链接起来的。如果新的直径不经过x-y:那么就是原来的

Icefox的博客 341

【无人机协同】动态环境下多无人机系统的协同路径规划与防撞研究(Matlab代码实现)​

内容概要:本文围绕基于变频控制的多相交错LLC谐振变换器闭环仿真模型展开研究,系统阐述了多相交错并联技术在降低输出电流纹波与提升功率密度方面的优势,深入分析了交错角对纹波对消的影响及均流问题的成因。针对LLC谐振变换器在变频控制下的强非线性特性,研究采用扩展描述函数(EDF)进行小信号建模,克服了传统状态空间平均法在非线性系统中建模精度不足的缺陷,并在此基础上设计了输出电压外环PID控制器。通过Simulink仿真平台,对系统的稳态性能、启动过程、负载阶跃响应及频率调节的平滑性进行了全面验证,确保系统在动态工况下仍能维持软开关运行边界,提升了变换器的整体效率与稳定性。该研究为高频、高效率、低纹波电源系统的设计与优化提供了坚实的理论依据与实践指导。; 适合人群:具备电力电子、自动控制理论基础,从事开关电源、新能源变换器、高频电源系统或电力电子系统仿真的科研人员及工程师,特别适合电气工程、自动化等相关专业的研究生及工作1-3年的研发人员。; 使用场景及目标:①掌握多相交错LLC谐振变换器的工作原理及其在纹波抑制与功率扩容中的关键技术;②学习针对强非线性系统的EDF小信号建模方法,理解其在闭环控制器设计中的应用价值;③通过仿真模型复现与参数调试,提升对LLC变换器动态响应、稳定性分析与PID参数整定的实践能力; 阅读建议:建议结合文中提供的仿真模型与参数设计报告,逐步完成从建模、控制器设计到仿真验证的全流程操作,重点关注EDF建模的推导过程与闭环系统在不同工况下的动态响应表现,以深入理解高频谐振变换器的控制机理与工程实现要点。

horizon-j6-open-explorer-3.0.22-compiled-doc.zip

horizon-j6-open-explorer-3.0.22-compiled-doc.zip

[hihoCoder#1381]Little Y's Tree

[hihoCoder#1381]Little Y's Tree 试题描述 小Y有一棵n个节点的树,每条边都有正的边权。 小J有q个询问,每次小J会删掉这个树中的k条边,这棵树被分成k+1个连通块。小J想知道每个连通块中最远点对距离的和。 这里的询问是互相独立的,即每次都是在小Y的原树上进行操作。 输入 第一行一个整数n,接下来n-1行每行三个整数u,v,w,其中第i行表...

weixin_30396699的博客 210

英飞凌TLF35584 SBC实战:手把手教你配置WDG看门狗与ERR监控(基于AUTOSAR架构)

本文详细介绍了基于AUTOSAR架构的英飞凌TLF35584 SBC芯片WDG看门狗与ERR监控功能的配置方法。通过硬件平台搭建、寄存器级配置、AUTOSAR模块集成及诊断策略优化,帮助开发者快速掌握关键配置技巧,提升嵌入式系统的安全性和可靠性。

weixin_30256901的博客 477

hiho一下第二周 Hihocoder #1014 : Trie树

#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个

Luke的学习笔记 3645

Zemax操作33--5倍激光扩束器

5倍扩束

lzy750750的博客 2933

如何用DETR(detection transformer)训练自己的数据集

DETR(detection transformer)简介 DETR是Facebook AI的研究者提出的Transformer的视觉版本,是CNN和transformer的融合,实现了端到端的预测,主要用于目标检测和全景分割。 DETR的Github地址:link

weixin_50233398的博客 3万+
上一篇: BZOJ4411 - [Usaco2016 Feb]Load balancing
下一篇: 洛谷P2522 - [HAOI2011]Problem b
ayw1069
博客等级 码龄11年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值