bzoj 1999 分类: bzoj noip...


树网的核 加强版,好题~


可以证明,如果存在多条直径,选取任意一条直径都是等价的。


证明:

如图,考虑两条直径 AB, CD,其中它们的重合部分为 EF

 A                           B
  \                         /                         
   \                       /
    \_____________________/
    /E                   F\
   /                       \
  /                         \
 C                           D

先证 |AE| = |CE|, |BF| = |DF|

|AE| +|EF| + |BF| = |CE| + |EF| + |DF| ⟹|AE| + |BF| = |CE| + |DF|

若|AE| > |CE|, 则 |BF| < |DF|,那么 |AD| >|AB|
而AB为树的直径,推出矛盾,所以 |AE| <= |CE|

同理可证 |AE| >= |CE|,|BF| <= |DF|,|BF| >= |DF|

∴ |AE| = |CE|, |BF| = |DF|


现在证明,在任意一条直径上选取路径 p 计算偏心距是等价的。

如果 p 没有覆盖 EF,其它直径上的点对偏心距没有贡献。

如果 p 覆盖 EF。

  • 当 p 在AB上时,CD上的点对偏心距的贡献为 |CE| 和 |DF|
  • 当 p 在CD上时,AB上的点对偏心距的贡献为 |AE| 和 |BF|

∵ |AE| = |CE|, |BF| = |DF|
∴ 在任意一条直径上选取路径 p 计算偏心距是等价的

综上所述,结论成立。


根据贪心的原则,在直径上选取尽量长的路径 p 可以使得偏心距最小。

对于这条路径,如何计算偏心距?

记直径左端点为 L, 右端点为 R,这条路径左端点为 l,右端点为 r。

ECC(p) = max{max{g(i) | i ∈p },dist(L, l) , dist(r, R)}

其中 g(i) 表示 i 点不经过直径能到达的最远距离。

对于 max{g(i) | i ∈p },用单调队列维护 g(i) | i ∈p 下降即可。

时间复杂度:O(n)


/**************************************************************
    Problem: 1999
    User: cyxhahaha
    Language: C++
    Result: Accepted
    Time:1496 ms
    Memory:58324 kb
****************************************************************/

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <string>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <utility>
#include <iostream>
#include <algorithm>

template<class Num>void read(Num &x)
{
    char c; int flag = 1;
    while((c = getchar()) < '0' || c > '9')
        if(c == '-') flag *= -1;
    x = c - '0';
    while((c = getchar()) >= '0' && c <= '9')
        x = (x<<3) + (x<<1) + (c-'0');
    x *= flag;
    return;
}
template<class Num>void write(Num x)
{
    if(x < 0) putchar('-'), x = -x;
    static char s[20];int sl = 0;
    while(x) s[sl++] = x%10 + '0',x /= 10;
    if(!sl) {putchar('0');return;}
    while(sl) putchar(s[--sl]);
}

#define REP(__x,__st,__ed) for(int __x = (__st); __x <= (__ed); __x++)

const int maxn = 5e5 + 5, Nya = -1;

int n, S;

struct Edge
{
    int v, w, next;

    Edge(int v=0,int w=0,int next=0):v(v),w(w),next(next){}

}edge[maxn<<1];

int el, head[maxn];

int dist[maxn], path[maxn], len;
int Lmax[maxn], Rmax[maxn], Mmax[maxn];
bool hash[maxn];

void NewEdge(int u,int v,int w)
{
    edge[++el] = Edge(v, w, head[u]), head[u] = el;
}

void dfs(int a,int fa,int arr[])
{
    for(int i = head[a]; i; i = edge[i].next)
    {
        int p = edge[i].v;

        if(p == fa) continue;

        arr[p] = arr[a] + edge[i].w;

        dfs(p, a, arr);
    }
}

int gainmax(int a,int fa)
{
    int ret = 0;

    for(int i = head[a]; i ; i = edge[i].next)
    {
        int p = edge[i].v;

        if(p == fa || hash[p]) continue;

        ret = std::max(gainmax(p, a) + edge[i].w, ret);
    }
    return ret;
}

bool find(int a,int aim,int fa)
{
    if(a == aim)
    {
        path[++len] = a;
        return true;
    }
    for(int i = head[a]; i; i = edge[i].next)
    {
        if(edge[i].v == fa) continue;

        if(find(edge[i].v, aim, a))
        {
            path[++len] = a;
            return true;
        }
    }
    return false;
}
void init()
{
    int u, v, w;

    read(n), read(S);
    for(int i = 1; i < n; i++)
    {
        read(u), read(v), read(w);
        NewEdge(u, v, w);
        NewEdge(v, u, w);
    }
}
void diameter()
{
    int s = 1, t = 1;

    dist[1] = 0, dfs(1, 0, dist);

    REP(i, 1, n)
        if(dist[i] > dist[s])
            s = i;

    dist[s] = 0, dfs(s, 0, dist);

    REP(i, 1, n)
        if(dist[i] > dist[t])
            t = i;

    find(t, s, 0);              

    REP(i, 1, len) hash[path[i]] = true;

    REP(i, 1, len) Mmax[i] = gainmax(path[i], 0);

    REP(i, 1, len)
    {
        Lmax[i] = dist[path[i]] - dist[path[1]];
        Rmax[i] = dist[path[len]] - dist[path[i]];
    }
}
void solve()
{
    static int line[maxn];
    int f = 0, r = 0, ans = Nya, cal;

    for(int i = 1, j = 1; i <= len; i++)
    {
        if(f != r && line[f] < i) line[f++] = 0;

        while(j <= n && dist[path[j]] - dist[path[i]] <= S)
        {
            while(f != r && Mmax[line[r-1]] <= Mmax[j]) line[--r] = 0;
            line[r++] = j++;
        }

        cal = std::max(Mmax[line[f]], std::max(Lmax[i], Rmax[j-1]));

        if(ans == Nya || cal < ans) ans = cal;

    }

    write(ans);
}

int main()
{
#ifndef ONLINE_JUDGE    
    freopen("1999.in","r",stdin);
    freopen("1999.out","w",stdout);
#endif

    init(), diameter(), solve();

#ifndef ONLINE_JUDGE    
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;   
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/dashgua/p/4722956.html

Cesium功能集(十二):Cesium中流体仿真 【代码】Cesium功能集(十二):Cesium中流体仿真。 阅读详情

相关推荐

MRI多序列,多中心数据集预处理--使用FSL-Flirt 配准数据

FLIRT(FMRIB 的线性图像配准工具)是用于线性(仿射)模态内和模态间脑图像配准的全自动稳健且准确的工具。 什么是配准 在这两张图片上,很容易看出它们没有对齐,左边相对右边倾斜,虽然我们人类视觉系统还是能把对应的解剖关系连系在一起,但是我们使用计算机分析时确不能够 因此,我们希望相同的解剖结构对齐,用坐标表示的话,希望他们在相同的坐标上。如下图 对齐这些解剖结构的过程就叫做配准(register) 因此,配准的目的也是使相同的解剖结构在同一个位置,便于分析。可以将CT和MRI配准,看同一结构在两个

Tina姐的博客 1万+

蓝书(算法竞赛进阶指南)刷题记录——BZOJ1999 树网的核(树的直径)

题目:BZOJ1999. 题目大意:定义一条路径到一个点的距离为一条路径中距离这个点最近的一个点到这个点的距离,一条路径的偏心距为一个距离这条路径距离最远的点到这条路径的距离.给定一棵树,求在这棵树的一条直径上的两个点连成一条路径F,使得F的长度小于s且偏心距最短. 我们首先可以从题目上得出,任意一条直径的最小偏心距相等. 所以我们考虑取出一条直径后,暴力枚举直径上的核的两个端点,将核上的点打上标...

hzk_cpp的博客 387

DCM4CHEE Archive Light 应用配置-存储配置

本文介绍了在DICOM归档系统中配置和管理存储的方法,包括通过用户界面和LDAP导入两种方式。主要内容包括: 存储配置概述:用户可根据需求配置单个或多个存储设备,支持在磁盘空间不足或多任务并行时使用。存储分为Archive设备级(序列元数据存储)和Application Entity级(对象存储/元数据存储)。 用户界面操作: 设备级存储配置:通过菜单导航添加/编辑存储描述符,设置Storage ID、URI等关键参数 应用级存储引用:在设备扩展和网络AE中分别配置元数据和对象存储引用 LDAP配置方法:

洪城叮当的博客 1415

[BZOJ1999] 树网的核 [数据加强版] (树的直径)

[BZOJ1999] 树网的核 [数据加强版] (树的直径) 传送门 如果只是想验证算法正确性这里是洛谷数据未加强版 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V, E分别表示结点与边的集合,W表示各边长度的集合,并设T有n个结点。...

Tricksterism 318

k3s快速搭建k8s集群环境

k8s 搭建方式有多种,如果你是内网环境,希望占用服务器资源少或是边缘系统(如ARM系统),强烈推荐您使用 k3s进行安装 目录k3s 简介k3s架构中文官方文档三台服务器快速搭建k8s集群安装说明步骤1 修改主机名,保持唯一步骤2 安装docker步骤3 安装master节点步骤4 安装worker节点加入集群步骤5 查看集群步骤6 部署 k8s仪表盘 dashboard k3s 简介 轻量级 Kubernetes。安装简单,内存只有一半,所有的二进制都不到 100MB K3s 是一个完全符合 Ku.

gzt19881123的专栏 2445

记录rk3588 在Linux 6.1内核版本声卡 bug。

rk3588 Audio bug

Yongheng6的博客 855

洛谷1099 & bzoj1999 树网的核(树的直径)(双指针)

题目 洛谷1099 树网的核bzoj1999 树网的核(加强版) 题解 树的直径 首先要发现一个结论:在任意一条树的直径上求最小偏心距是一样的! 简单证明一下,自己yy吧~ 这样以后就可以乱搞了,O(N^3)暴力也可以过n=300的数据。 直接上O(N)正正解! 随便搞出一条直径来,这些点分别是a1,a2,…,at。在直径上一个点al,会有一个最大的ar,使得dist[ar]-dist[a...

A_Bright_CH的博客 447

DeepSeek与YOLO融合技术的微信小程序实现方案

本文介绍了一个基于微信小程序和Flask后端的智能图像检测系统。系统采用DeepSeek-7B进行自然语言理解,YOLOv8执行目标检测,并通过融合验证模块确保结果准确性。核心流程包括:用户通过小程序上传图片和文本需求,后端解析意图后执行目标检测,最后验证并返回结果。关键技术包括DeepSeek的指令理解、动态阈值调整和模型优化(ONNX、TensorRT)。系统适用于工业质检等场景,如"检测表面划痕",能自动识别目标并验证结果。部署需GPU服务器,并包含安全机制保障系统稳定运行。

老郑的博客 272

BZOJ 1999 树网的核(加强版)

BZOJ 1999 树网的核(加强版) 看到八中OJ上面吧NOIP原题的n=300扩大到了n=500000,就研究了一下O(n)的算法。 首先要确定的是如果有好几条直径的话,任意一个上面都会有一个核。 证明的话可以这么想:先考虑有两条直径的情况,因为这是一棵树,所...

aimifeng9177的博客 189

audio语音相关的基础知识-VAD,ASR,AEC,AGC,BF等

有音素之间的间隙,也有静音和语音本身的间隙,为了对数据从时间上进行相对的校准,语音端点检测技术就应运而生了,因此端点检测技术可以决定这种校准的相对精度,使得同一内容的特征更趋于相同,当然,一般情况下是不可能完全相同的。盲源分离的目的是求得源信号的最佳估计,盲辨识的目的是求得传输通道的。这个技术的主要任务是从带有噪声的语音中准确的定位出语音的开始和结束点,因为语音中含有很长的静音,也就是把静音和实际语音分离开来,因为是语音数据的原始处理,所以VAD是语音信号处理过程的关键技术之一。呈现出与会者清晰的声音。

u013250861的博客 1033

PCL 贪婪投影三角剖分算法【2025最新版】

本博客在学习PCL中的贪婪投影三角算法的基础上,实现了使用彩色点云重建彩色模型的应用案例。博客长期更新,最近一次更新时间为:2025年7月6日。

点云侠的博客 37万+

洛谷 1099 ( bzoj 1999 ) [Noip2007]Core树网的核

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999 《算法竞赛进阶指南》346页。https://www.cnblogs.com/shenben/p/5895325.html 1.用随便一条直径算就行了。   由题知所有直径都有交点。故有公共部分。   如果分叉形状。核选在分叉后的地方,偏心距一定它是到直径的较远端点的距离。不然...

weixin_34115824的博客 140

Python调用CANoe(2)(测试模块配置)

本节内容在Python和CANoe的数据交互(1)的基础认知上,继续探索Python如何加载TestSetup,以及运行tse测试文件

蚂蚁小兵 1万+

答疑时间

NOIp 2014 借教室 前缀和做法http://redbag.duapp.com/?p=1670 洛谷 挤牛奶 前缀和https://www.luogu.org/problem/show?pid=1204 NOIp 2010 关押罪犯 并查集http://redbag.duapp.com/?p=1672//参考最小生成树的思想,把最大的边隔离开来 洛谷 作弊https://ww...

weixin_34115824的博客 266

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

bzoj1999

这道题真的做得头皮发麻 题解。。。lyd书上。。。 头皮发麻 。。。 #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int maxn=600000+10; c...

allia990718的博客 191

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

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

bzoj1999: [Noip2007]Core树网的核/2282: [Sdoi2011]消防

noip版:洛谷1099 加强版:bzoj1999 双倍经验(与bzoj1999相同):bzoj2282 对于n&lt;=300的,跑一遍floyd,枚举所有在直径上的线段即可 #include&lt;bits/stdc++.h&gt; using namespace std; int n,s,x,y,z,dis[303][303],mx,a[303],b[303],cnt,i,j,k,l...

xumingyang0的博客 287

计算机控制技术及应用

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

BZOJ1999(Noip2007)[Core树网的核]--最长链+DFS大法

bzoj1999

Greninja的博客 1247

【BZOJ1999】树网的核,求树的直径+单调队列乱搞

学了博弈还是不会怎么办

xiaoyimi的博客 1171

[树的直径] BZOJ 1999 [Noip2007]Core树网的核

做这个题 主要是复习几个性质 对于树中的任意一点,距离其最远的点一定是树的直径的某一端点 所有直径的中心相同,这个中心可以是一个顶点,也可以在一条边上。所有点到他的最远点都要通过这个中心 所有的直径所能求出的该最小偏心距相等 然后我们就直接找出一条直径 在上面two-pointers扫一下就好了 每次我们用 当前区间内不经过直径上的点抵达的其他点的最大深度和到两端的距离的最大值 更新下答案#inc

雯舞 744

1999: [Noip2007]Core树网的核

1999: [Noip2007]Core树网的核 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1081  Solved: 305 [Submit][Status][Discuss] Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork

CRZbulabula的博客 675

【题解】洛谷P1099(同bzoj1999)[NOIP2007T4]树网的核 树的直径

题目链接 题目描述 设T=(V,E,W)T=(V,E,W)T=(V,E,W)是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称TTT为树网(treebetwork),其中VVV,EEE分别表示结点与边的集合,WWW表示各边长度的集合,并设TTT有nnn个结点。 路径:树网中任何两结点aaa,bbb都存在唯一的一条简单路径,用d(a,b)d(a, b)d(a,b)表示以a,ba,...

翻过这座山,他们就会听到你的故事 499

【BZOJ】1999 [Noip2007]Core树网的核 树的直径+DFS

题目传送门看到题目描述比较长的题目就想弃掉了……还要加强读题的能力啊。题目大意:给定一棵无根树,取一条长度小于给定长度的树链,使得距离这条树链距离最远的节点最近,问最近距离。首先我们知道以下两个性质: 对于树中的任意一点,距离其最远的点一定是树的直径的某一端点。 所有树的直径是等价的,即任意一条树的直径的最小偏心距相等。 于是我们可以先两次DFS求出树的直径,然后考虑以下两种情况: 当前节点在树的直

Chester King 378

NOIP2007/BZOJ1999 树网的核【题解】

描述 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V, E分别表示结点与边的集合,W表示各边长度的集合,并设T有n个结点。 路径:树网中任何两结点a,b都存在唯一的一条简单路径,用d(a,b)表示以a,b为端点的路径的长度,它是该路径上各边长度之和。我们称d(a,b)为a,b两结...

zjh_2017的博客 456

NOIP2007/BZOJ1999 字串变换【题解】

描述 已知有两个字串 AA,BB 及一组字串变换的规则(至多6个规则): ·A1 -&amp;gt; B1 ·A2 -&amp;gt; B2 规则的含义为:在 AA中的子串 A1A1 可以变换为 B1B1、A2A2 可以变换为 B2B2 …。 例如:A=’abcd’ B=’xyz’ 变换规则为: ‘abc’-&amp;gt;‘xu’ ‘ud’-&amp;gt;‘y’ ‘y’-&amp;gt;‘yz’ 则此时,AA 可以经...

zjh_2017的博客 494

BZOJ1999 树网的核[数据加强版]

1999: [Noip2007]Core树网的核 Time Limit:10 SecMemory Limit:64 MBSubmit:1214Solved:336[Submit][Status][Discuss] Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中...

weixin_34178244的博客 172

树网的核 NOIP2007 BZOJ-1999

题目链接:BZOJ-1999(洛谷P1099) 主要思路: 先把树的直径求出来(同时记录直径上的点)(随便选一条就可以),用尺取枚举核(最长的满足的路径)(可以利用DFS序将树的直径连续标记)。预处理出直径上的点不经过直径能到达的最远距离以及每个点到直径的左右端点的距离(我的代码中在尺取中求尺取左端点到直径左端点的距离)。每个核的偏心距即为核的左端点到直径左端的的距离,核的右端点到直径右端点的...

Loging的博客 232
上一篇: bzoj 2821 分类: bzoj 2015...
下一篇: codeforces Round 314 div.2 分类: code...
aa288288
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值