题目

给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E。(k为路径p上的边的权值和)。

分析

点分治,设当前为x的,求在以x为根的子树中,经过x的路径(包括起点或终点在x)中长度大于等于S的最小值。

假设i有3个儿子,j、k、l,

首先将以j为根的子树中的所有点到x的距离求出来,放进队列中。排个序。

接着将以k为根的子树中的所有点到x的距离求出来,一个一个点枚举,在队列中二分,求出一段大于等于S并且最小的路径,与ans比较,取小。再将它们放进队列中。排个序。

再以j为根的子树中的所有点到x的距离求出来,同样更新答案,在再加入队列。

对于起点或终点在x的,在一开始就加入队列,就可以了。

时间复杂度\(O(nlog_2^2n)\)

事实上菊花图卡不过,但还是水过了。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=100005;
using namespace std;
int dis[N],d[N],root,last[N],next[N*2],to[N*2],v[N*2],s,e,ans=maxlongint,n,m,tot,size[N],mx,ff;
bool bz[N];
int bj(int x,int y,int z)
{
next[++tot]=last[x];
last[x]=tot;
to[tot]=y;
v[tot]=z;
}
int findroot(int x,int fa)
{
size[x]=1;
int num=0;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa && bz[j])
{
findroot(j,x);
size[x]+=size[j];
num=max(num,size[j]);
}
}
num=max(ff-size[x],num);
if(num<mx)
{
root=x;
mx=num;
}
}
int sodis(int x,int fa,int val)
{
d[++tot]=val;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa && bz[j])
{
sodis(j,x,val+v[i]);
}
}
}
int rf(int l,int r,int val)
{
while(l<r)
{
int mid=(l+r)/2;
if(d[mid]+val<s)
l=mid+1;
else
r=mid;
}
if(d[l]+val>=s)
ans=min(d[l]+val,ans);
else
if(d[r]+val>=s)
ans=min(d[r]+val,ans);
}
int dg(int x,int fa)
{
bz[x]=false;
tot=1;
d[1]=0;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa && bz[j])
{
int k=tot+1;
sodis(j,x,v[i]);
for(int l=k;l<=tot;l++)
{
rf(1,k-1,d[l]);
}
sort(d+1,d+1+tot);
}
}
int f=tot;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa && bz[j])
{
ff=f-1;
root=0;
mx=maxlongint;
findroot(j,x);
dg(root,x);
}
}
}
int main()
{
scanf("%d%d%d",&n,&s,&e);
for(int i=1;i<=n-1;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
bj(x,y,z);
bj(y,x,z);
}
memset(bz,true,sizeof(bz));
root=0;
ff=n;
mx=maxlongint;
findroot(1,0);
dg(root,0);
if(ans>e)
printf("-1\n");
else
printf("%d\n",ans);
}

【NOIP2016提高A组模拟8.19】(雅礼联考day2)树上路径的更多相关文章

  1. 【NOIP2016提高A组模拟8.19】(雅礼联考day2)总结

    第一题又有gcd,又有xor,本来想直接弃疗,不过后来想到了个水法: 当两个相邻的数满足条件时,那么他们的倍数也可能满足条件.然后没打,只打了个暴力. 正解就是各种结论,各种定理搞搞. 第二题,想都不 ...

  2. 【NOIP2016提高A组模拟8.19】(雅礼联考day2)公约数

    题目 给定一个正整数,在[1,n]的范围内,求出有多少个无序数对(a,b)满足gcd(a,b)=a xor b. 分析 显然a=b是一定不满足, 我们设\(a>b\), 易得gcd(a,b)&l ...

  3. [jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)

    题目链接: http://172.16.0.132/senior/#main/show/4668 题目: 题解: 考虑把A数组里的每个元素分解质因数,对于每个质因数开一个vector存一下包含这个质因 ...

  4. 【JZOJ4715】【NOIP2016提高A组模拟8.19】树上路径

    题目描述 给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E.(k为路径p上的边的权值和) 输入 第一行给出N,S,E.N代表树的点数,S,E如题目描述. 下面N- ...

  5. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  6. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)总结

    考的还ok,暴力分很多,但有点意外的错误. 第一题找规律的题目,推了好久.100分 第二题dp,没想到. 第三题树状数组.比赛上打了个分段,准备拿60分,因为时间不够,没有对拍,其中有分段的20分莫名 ...

  7. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Binary

    题目 分析 首先每个数对\(2^i\)取模.也就是把每个数的第i位以后删去. 把它们放进树状数组里面. 那么当查询操作, 答案就位于区间\([2^i-x,2^{i-1}-1-x]\)中,直接查询就可以 ...

  8. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Value

    题目 分析 易证,最优的答案一定是按\(w_i\)从小到大放. 我们考虑dp, 先将w从小到大排个序,再设\(f_{i,j}\)表示当前做到第i个物品,已选择了j个物品的最大值.转移就是\[f_{i, ...

  9. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Matrix

    题目 分析 假设,我们从\(F_{i,2}\)出发,那么对\(F_{n,n}\)的贡献就是\(某个系数乘以a^{n-i}b^{n-1}r_i\): 同理,如果从\(F_{2,i}\)出发,那么对\(F ...

随机推荐

  1. VIM常用操作手册

    VIM常用操作手册 1.多行操作,多行注释,多行取消注释 https://jingyan.baidu.com/article/9c69d48f43ed6d13c8024e7b.html 2.常用操作 ...

  2. div 加滚动条 超过div宽度 自动换行 div居中

    一.div 中加滚动条 一. <div style=" overflow:scroll; width:400px; height:400px;”></div> 记住宽 ...

  3. #Java学习之路——基础阶段二(第十四篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  4. java script 的注释与分号

    // 单行注释 /**/多行注释 在js 中 变量.函数和操作符都是区分大小写的 什么是标识符 变量.函数.属性的名字.或者函数的参数. 变量的命名规范:不能以数字开头. 变量声明: var  nam ...

  5. [转帖] Linux 下面 perl 命令的简介

    https://www.jb51.net/article/123326.htm 感觉挺好的 改天需要仔细学习一下. 前言 本文主要给大家介绍了关于Perl单行命令的相关内容,分享出来供大家参考学习,下 ...

  6. Object的create、assign、getPrototypeOf与拷贝

    Object的create.assign.getPrototypeOf与拷贝:https://www.cnblogs.com/ninalei/p/8655567.html

  7. 微软宣布加入 OpenJDK,打不过就改变 Java 未来!

    近日,微软的 Bruno Borges 在 OpenJDK 邮件列表中发布了一条消息,内容包含接下来发生的事情以及微软如何开始将其团队整合到 OpenJDK 社区. 在邮件中,Bruno Borges ...

  8. 多个电脑上免密登陆命令、scp远程拷贝、修改文件的用户和组

    多个电脑上免密登陆命令: 1.ssh-keygen    生成密钥 2.ssh-copy-id   IP 拷贝公钥到指定服务器并授权 3.ssh   Ip 验证登录,已无需输入密码 scp远程拷贝: ...

  9. vue 实践技巧合集

    前言 本文纯属个人平时实践过程中的一些经验总结,算是一点点小技巧吧,不是多么高明的技术,如果对你有帮助,那么不胜荣幸. 本文不涉及罕见API使用方法等,大部分内容都是基于对vue的一些实践而已.由于涉 ...

  10. java.lang.IllegalArgumentException: id to load is required for loading

    java.lang.IllegalArgumentException: id to load is required for loading at org.hibernate.event.LoadEv ...