【学习笔记】[CTSC2017] 网络

news2024/12/28 15:33:35

我的评价是毒瘤😅

首先想到的肯定是原树上的直径。

于是得到第一个结论:这条边的两个端点一定在直径上。

第二个结论:每个点距离最远的那个点是直径的两个端点之一。

发现直径上形成了一个环。显然这个环的长度应该 ≥ L \ge L L,因此对于环外的点是很好讨论的。

发现环上的点比较难处理,所以想到二分来增加限制。设直径的两个端点是 u , v u,v u,v,假设固定了环的右端点 i i i,发现可以直接把 dist(u,j) \text{dist(u,j)} dist(u,j)的范围解出来,二分即可。

写了一发,结果直接全 wa \text{wa} wa。。。请教某位不愿透露姓名的大佬过后发现第二个结论是错的。。。并且给出了构造。。。

请添加图片描述
比如说这个图。。。显然直径是 8 → 6 8\to 6 86,考虑在 5 , 7 5,7 5,7之间添加一条长度为 3 3 3的边,这样距离最远的点对是 1 , 3 1,3 1,3,显然都不是直径的端点。。。

其实之前那个做法都想的差不多了,就是拆式子。。。

又要重新推一遍。。。烦死了。。。考场上肯定是打不完了。。。

考虑限制点对的时候,如果钦定 i < j i<j i<j,去判断 d i s i + d i s j + d i s ( j , u ) − d i s t ( i , u ) > m i d dis_i+dis_j+dis(j,u)-dist(i,u)>mid disi+disj+dis(j,u)dist(i,u)>mid,那么无论怎么做都是二维数点;但是实际上可以证明二分的下界是 2 max ⁡ ( d i s i ) 2\max(dis_i) 2max(disi),这样就不用考虑 i , j i,j i,j的大小关系了,可以优化掉一个 log ⁡ \log log。总之发现只用移动指针就做完了。

虽然对复杂度影响也不是很大。

复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

remark \text{remark} remark 感觉挺难想到一来就拆式子的。。。

#include<bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pb push_back
#define db double
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int N=1e5+5;
int n,U,V,a[N],cnt,ban[N];
ll len,diam,dis[N],pre[N],dis2[N],Max[N],tmp[N];
vector<pair<int,int>>G[N];
void dfs(int u,int topf,int &rt){
    if(rt==0||dis[u]>dis[rt])rt=u;
    for(auto v:G[u]){
        if(v.fi==topf)continue;
        pre[v.fi]=u,dis[v.fi]=dis[u]+v.se,dfs(v.fi,u,rt);
    }
}
int find(ll L,ll R,int ps){
    int l=lower_bound(tmp+1,tmp+1+ps,L)-tmp;
    int r=upper_bound(tmp+1,tmp+1+ps,R)-tmp;
    if(r-l>0)return 1;
    return 0;
}
void locate(int u,int topf,ll &Max){
    Max=max(Max,dis2[u]);
    for(auto v:G[u]){
        if(v.fi==topf||ban[v.fi])continue;
        dis2[v.fi]=dis2[u]+v.se,locate(v.fi,u,Max);
    }
}
vector<pair<ll,int>>vec1,vec2;
ll s1[N],s2[N],s3[N],s4[N];
int check(ll mid){
    assert(vec1.size()==cnt);
    assert(vec2.size()==cnt);
    s1[cnt]=-inf,s2[cnt]=inf,s3[cnt]=-inf,s4[cnt]=inf;
    for(int i=cnt-1;i>=0;i--){
        int j=vec1[i].se;
        s1[i]=max(s1[i+1],-dis[j]+Max[j]);
        s2[i]=min(s2[i+1],-dis[j]-Max[j]);
        s3[i]=max(s3[i+1],dis[j]+Max[j]);
        s4[i]=min(s4[i+1],dis[j]-Max[j]);
    }
    ll A=-inf,B=inf,C=-inf,D=inf;
    int j=cnt;
    for(int i=0;i<cnt;i++){
        while(j-1>=0&&vec2[i].fi+vec1[j-1].fi>mid){
            j--;
        }
        int x=vec2[i].se;
        A=max(A,dis[x]+Max[x]+s1[j]+len-mid);
        B=min(B,dis[x]-Max[x]+s2[j]+mid-len);
        C=max(C,dis[x]+Max[x]+s3[j]+len-mid);
        D=min(D,dis[x]+dis[x]-Max[x]+s4[j]+mid-len);
    }
    swap(A,B),A=-A,B=-B;
    for(int i=2;i<=cnt;i++){
        ll L=max(C-tmp[i],-B+tmp[i]),R=min(D-tmp[i],-A+tmp[i]);
        if(find(L,R,i-1))return 1;
    }
    return 0;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
    while(cin>>n>>len&&(n||len)){
        for(int i=1;i<=n;i++)G[i].clear();
        for(int i=1;i<n;i++){
            int x,y,z;cin>>x>>y>>z;
            G[x].pb({y,z});
            G[y].pb({x,z});
        }
        U=V=0,dis[1]=0,dfs(1,0,U),dis[U]=0,dfs(U,0,V),diam=dis[V];
        int x=V;cnt=0;while(x!=U)a[++cnt]=x,x=pre[x];
        a[++cnt]=x;reverse(a+1,a+1+cnt);
        for(int i=1;i<=n;i++)ban[i]=0;
        for(int i=1;i<=cnt;i++)ban[a[i]]=1;
        for(int i=1;i<=cnt;i++)Max[a[i]]=0,dis2[a[i]]=0,locate(a[i],0,Max[a[i]]);
        for(int i=1;i<=cnt;i++)tmp[i]=dis[a[i]];
        vec1.clear(),vec2.clear();
        for(int i=1;i<=cnt;i++)vec1.pb({dis[a[i]]+Max[a[i]],a[i]});
        for(int i=1;i<=cnt;i++)vec2.pb({-dis[a[i]]+Max[a[i]],a[i]});
        sort(vec1.begin(),vec1.end()),sort(vec2.begin(),vec2.end());
        ll l=0,r=diam,res=diam;
        //fixed
        for(int i=1;i<=cnt;i++)l=max(l,2*Max[a[i]]);
        while(l<=r){
            ll mid=l+r>>1;
            if(check(mid))res=mid,r=mid-1;
            else l=mid+1;
        }
        cout<<res<<"\n";
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/754335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql分区表----分类、优势、特点、优点

范围分区&#xff08;Range Partitioning、哈希分区&#xff08;Hash Partitioning&#xff09;列 表分区&#xff08;List Partitioning&#xff09;、键值分区&#xff08; Key partition &#xff09; 文章目录 mysql分区表概述&#xff1a;MYSQL分区表简单而言就是将一张大…

跨域问题解决

由于同源策略&#xff0c;需要协议&#xff0c;域名&#xff0c;端口三个都相同才能进行访问&#xff0c;是一种浏览器的保护策略 CORS:Cross Origin Resource Sharing SpringBoot 项目中解决跨域 1.在目标方法中加入CrossOrigin注解 2.添加一种过滤器 分别是允许哪些域&#…

分享几种在家就能做的网赚方式,下班暑假都可以做的副业推荐

在当前的互联网时代中&#xff0c;网上赚钱已经成为受到广泛关注的一个话题。越来越多的人渴望通过利用互联网来实现经济上的自由&#xff0c;然而&#xff0c;同时也面临一些风险和挑战。 尽管网上有很多兼职赚钱的机会&#xff0c;但并不是所有方式都可信赖。有些机会可能会…

JVM_00000

JVM 所谓虚拟机&#xff08;Virtual Machine&#xff09;就是一台虚拟的计算机。它是一款软件&#xff0c;用来执行一系列虚拟计算机指令。大体上&#xff0c;虚拟机可以分为系统虚拟机和程序虚拟机。 Visual Box&#xff0c;VMware就属于系统虚拟机&#xff0c;它们完全是对物…

【动手学习深度学习--逐行代码解析合集】18网络中的网络(NiN)

【动手学习深度学习】逐行代码解析合集 18网络中的网络&#xff08;NiN&#xff09; 视频链接&#xff1a;动手学习深度学习–网络中的网络&#xff08;NiN&#xff09; 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、NiN网络…

IDE/VS项目属性中的 <字符集> 配置项,它到底是干什么用的?

文章目录 概述对配置项的基础测试VS默认的字符集配置Unicode字符集和多字节字符集是否影响文本编辑器 使VS像记事本那样显示文件编码VS下编译UTF-8无BOM的代码文件VS可以搞定ANSI和带BOM的源代码文件VS搞不定UTF-8无BOM的源代码文件乱码字符是怎么翻译出来的?猜猜看再起航 使V…

解决windows上端口占用问题

在开发中总会碰到端口占用问题&#xff0c;最后导致我们项目或服务无法正常启动。 解决方案如下&#xff1a; # 1.根据端口号查进程 例如8082端口 netstat -aon | findstr :8082 # 2.根据进程id查应用名 tasklist|findstr "11376" # 3.根据pid删除进程 taskkill …

检测到错误页面web应用服务器版本信息泄露

详细描述 Web服务器未能正确处理异常请求导致Web服务器版本信息泄露&#xff0c;攻击者收集到服务器信息后可进行进一步针对性攻击。 解决办法 临时修复建议如下&#xff1a; 1、关闭web服务器错误提示。 2、关闭运行平台的错误提示。 3、建立错误机制&#xff0c;不要把真实…

python numpy axis=0,1,2, 分清楚

理解维度问题&#xff0c;记忆右边图片坐标的0,1&#xff0c;2&#xff0c; 就记住了计算方向问题&#xff0c;每个矩阵想象一张图片&#xff0c;多个图片叠加&#xff0c; 哪个维度做&#xff0c;哪个维度就被降维度1&#xff0c;默认无 所以 &#xff08;4,3&#xff0c;2&am…

linux系统管理:常用命令和技巧

目录 0 前言 1 sudo and su 1.1 su: 切换用户 1.2 sudo: 切换用户 2 权限设置&#xff1a;chmod, chown 2.1 chmod&#xff1a;访问权限设置 2.2 chown&#xff1a;设置文件或目录的主人 2.3 chgrp&#xff1a;设计文件或者目录属于哪个组 2.4 查询组成员 2.5 查询某…

搭建微服务工程 【详细步骤】

一、准备阶段 &#x1f349; 本篇文章用到的技术栈 mysqlmybatis[mp]springbootspringcloud alibaba 需要用到的数据库 订单数据库: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for shop_order -- --------------…

Nacos服务注册和配置中心(Config,Eureka,Bus)1

SCA(Spring Cloud Alibaba)核心组件 Spring Cloud是若干个框架的集合&#xff0c;包括spring-cloud-config、spring-cloud-bus等近20个子项目&#xff0c;提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案,Spring C…

Kafka 深度剖析

1、应用场景 1.1 kafka场景 Kafka最初是由LinkedIn公司采用Scala语言开发&#xff0c;基于ZooKeeper&#xff0c;现在已经捐献给了Apache基金会。目前Kafka已经定位为一个分布式流式处理平台&#xff0c;它以 高吞吐、可持久化、可水平扩展、支持流处理等多种特性而被广泛应用…

Docker安装SonarQube

1.查看稳定版本的SonarQube&#xff0c;注意7.9之后的版本不在支持Mysql。使用PostgreSQL Download | SonarQube | Sonar 2.拉取PostgreSQL和SonarQube docker pull postgres docker pull sonarqube:9.9-community community代表社区版 3.在下面的目录下创建docker-compose…

云计算运维工程师简历怎么写?带简历案例

求职岗位&#xff1a;云计算运维工程师 职位要求&#xff1a; 1&#xff09;熟悉Linux操作系统的和管理与维护&#xff0c;有Linux操作系统性能监控和优化工作经验&#xff1b; 2&#xff09;熟悉日常服务器的数据备份、迁移、扩容等技术工作&#xff0c;能够解决相应运维工作…

H3C-Cloud Lab实验-NAT实验

实验拓扑图&#xff1a; IP地址规划&#xff1a; 实验需求&#xff1a; 1. 按照图示配置 IP 地址 2. 私网 A 通过 R1 接入到互联网&#xff0c;私网 B 通过 R3 接入到互联网 3. 私网 A 内部存在 Vlan10 和 Vlan20&#xff0c;通过 R1 上单臂路由访问外部网络 4. 私网 A 通过…

(数学)+(二分)

cf826-C. Place for a Selfie 给n条直线和m条开口向上的抛物线&#xff0c;问对于每条抛物线来说&#xff0c;存不存在和它不相交的直线&#xff0c;存在的话&#xff0c;输出直线的斜率。 直线与抛物线联立&#xff0c;(b-k)^2-4ac<0则不相交&#xff0c;|b-k|越小越好&…

操作系统16:文件共享和文件保护

目录 1、文件共享 &#xff08;1&#xff09;基于有向无循环图实现文件共享 1.1 - 有向无循环图 DAG(Directed Acyclic Graph) 1.2 - 利用索引结点 &#xff08;2&#xff09;利用符号链接实现文件共享 2、文件保护 &#xff08;1&#xff09;保护域(Protection Domain)…

自动化测试需要学什么【附学习路线和学习教程】

目录 一、接口自动化测试 1、HTTP和HTTPS协议 2、接口文档 3、接口测试工具Jmeter和Postman 5、总结 二、UI自动化测试 1 、Web自动化测试 1.1 Selenium 1.3 总结 2 App自动化测试 2.1 应该选择哪款工具&#xff1f; 三、持续集成 四、总结 随着自动化测试行业的薪…

关于nginx学习记录(二)

系列文章目录 第一章 Nginx 学习入门——Nginx的概述及安装 第二章 Nginx学习入门——Nginx常用命令及nginx.conf配置了解 目录 系列文章目录 一、Nginx 操作常用的命令 二、Nginx 配置文件 1. nginx配置文件位置:/usr/local/nginx/conf 2.nginx.conf配置文件组成: ⑴ 全…