原题链接

题解

距离省选只有一周了我居然才开始数据结构康复计划

这题很简单,就是点分树,然后二分一个值,我们计算有多少条路径大于这个值

对于一个点分树上的重心,我们可以通过双指针的方法求出它子树里的路径任意搭配大于这个值的方案

然后同一个子树里重复计算的删掉

再计算和自己祖先之间的路径

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 50005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
struct node {
int to,next,val;
}E[MAXN * 2]; int N,sumE,head[MAXN],rt;
int64 K; int dep[MAXN],fa[MAXN][20],d[MAXN],zz[MAXN]; bool vis[MAXN]; vector<int> poi;
vector<int> dis[2][MAXN];
int tot;
void add(int u,int v,int c) {
E[++sumE].to = v;
E[sumE].next = head[u];
E[sumE].val = c;
head[u] = sumE;
}
void dfs(int u) {
zz[u] = zz[fa[u][0]] + 1;
for(int i = 1 ; i <= 18 ; ++i) fa[u][i] = fa[fa[u][i - 1]][i - 1];
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa[u][0]) {
fa[v][0] = u;
dep[v] = dep[u] + E[i].val;
dfs(v);
}
}
}
int que[MAXN],ql,qr;
int Calc_G(int st) {
static int f[MAXN],siz[MAXN],son[MAXN];
ql = 1;qr = 0;
que[++qr] = st;f[st] = 0;siz[st] = 1;son[st] = 0;
while(ql <= qr) {
int u = que[ql++];
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != f[u] && !vis[v]) {
siz[v] = 1;son[v] = 0;
f[v] = u;que[++qr] = v;
}
}
}
int res = que[qr];
for(int i = qr ; i >= 1 ; --i) {
int u = que[i];
if(f[u]) {
siz[f[u]] += siz[u];
son[f[u]] = max(son[f[u]],siz[u]);
}
son[u] = max(son[u],qr - siz[u]);
if(son[u] < son[res]) res = u;
}
return res;
}
void dfs_for_dis(int u,int f) {
poi.pb(u);
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != f && !vis[v]) {
d[v] = d[u] + E[i].val;
dfs_for_dis(v,u);
}
}
} void dfs_divide(int u) {
int G = Calc_G(u);
vis[G] = 1;
for(int i = head[G] ; i ; i = E[i].next) {
int v = E[i].to;
if(!vis[v]) {
poi.clear();
d[v] = E[i].val;
dfs_for_dis(v,G);
++tot;
for(int j = 0 ; j < poi.size() ; ++j) {
dis[1][tot].pb(d[poi[j]]);
dis[0][G].pb(d[poi[j]]);
}
}
}
for(int i = head[G] ; i ; i = E[i].next) {
int v = E[i].to;
if(!vis[v]) dfs_divide(v);
}
}
int64 check(int mid) {
int64 res = 0;
for(int i = 1 ; i <= N ; ++i) {
int l = 0,r = dis[0][i].size() - 1;
while(r >= 0) {
while(l < dis[0][i].size() && dis[0][i][r] + dis[0][i][l] < mid) ++l;
if(dis[0][i][r] >= mid) res += 2;
res += dis[0][i].size() - l;
--r;
}
l = 0,r = dis[1][i].size() - 1;
while(r >= 0) {
while(l < dis[1][i].size() && dis[1][i][r] + dis[1][i][l] < mid) ++l;
res -= dis[1][i].size() - l;
--r;
}
}
res /= 2;
for(int i = 1 ; i <= N ; ++i) {
int t = dep[i] - mid;
int u = i;
for(int j = 18 ; j >= 0 ; --j) {
if(fa[u][j] && dep[fa[u][j]] > t) {
u = fa[u][j];
}
}
res -= zz[u] - zz[rt];
}
return res;
}
void Init() {
read(N);read(rt);read(K);
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
sumE = 0;tot = 0;
for(int i = 1 ; i <= N ; ++i) {dis[0][i].clear();dis[1][i].clear();} int u,v,c;
for(int i = 1 ; i < N ; ++i) {
read(u);read(v);read(c);
add(u,v,c);add(v,u,c);
}
dep[rt] = 0;
fa[rt][0] = 0;
dfs(rt);
dfs_divide(rt);
for(int i = 1 ; i <= N ; ++i) {
sort(dis[0][i].begin(),dis[0][i].end());
sort(dis[1][i].begin(),dis[1][i].end());
}
}
void Solve() {
Init();
int L = 0,R = 500000001;
while(L < R) {
int mid = (L + R + 1) >> 1;
if(check(mid) >= K) L = mid;
else R = mid - 1;
}
if(R == 0) {puts("NO");return;}
out(L);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
int T;
read(T);
while(T--) Solve();
}

【HDU】HDU5664 Lady CA and the graph的更多相关文章

  1. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...

  2. 【HDU】2222 Keywords Search

    [算法]AC自动机 [题解]本题注意题意是多少关键字能匹配而不是能匹配多少次,以及可能有重复单词. 询问时AC自动机与KMP最大的区别是因为建立了trie,所以对于目标串T与自动机串是否匹配只需要直接 ...

  3. 【HDU】2191 多重背包问题

    原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 [算法]多重背包(有限背包) 动态规划 [题解]http://blog.csdn.net/acdreamers/article/detail ...

  4. 【HDU】6110 路径交(2017百度之星) 线段树+RMQ-LCA+树链的交

    [题目]2017"百度之星"程序设计大赛 - 初赛(A) [题意]给定n个点的带边权树,m条编号1~m的路径,Q次询问编号区间[L,R]所有链的交集的长度.n<=500000 ...

  5. 【HDU】6148 Valley Numer 数位DP

    [算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...

  6. 【HDU】5269 ZYB loves Xor I

    [算法]trie [题解] 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的 ...

  7. 【HDU】3068 最长回文

    [算法]manacher [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> us ...

  8. 【HDU】6012 Lotus and Horticulture (BC#91 T2)

    [算法]离散化 [题解] 答案一定存在于区间的左右端点.与区间左右端点距离0.5的点上 于是把所有坐标扩大一倍,排序(即离散化). 让某个点的前缀和表示该点的答案. 初始sum=∑c[i] 在l[i] ...

  9. 【HDU】6146 Pokémon GO

    [题意]一个2*n的网格,再保证步数最少的情况下,求从任意格出发遍历完所有格的方案数,格子八连通.n<=10000,T<=100. [算法]递推,DP [题解]原题链接:蓝桥杯 格子刷油漆 ...

随机推荐

  1. 【转】Java并发编程:Thread类的使用

    一.线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于对Thread类中的方法的理解. 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以 ...

  2. Linux 两组信号对比(关闭和停止进程信号)

    之前看信号的时候,没有太注意不同信号的对比.今天再次看到的时候,突然感觉对一些信号,非常相似,乃至非常容易混淆.今天周末就抽空总结一下. 一.关闭进程信号 常见的4中关闭进程信号是SIGKILL,SI ...

  3. Ex4_21 最短路径算法可以应用于货币交易领域..._第十二次作业

    (a)   建立一个有向图G(V,E),每个顶点表示一种货币,两个顶点之间的边权的大小ex[u][v]表示两种货币之间的汇率,若要找一个最有利的兑换序列,把货币s兑换成货币t,即在若干种兑换序列中选择 ...

  4. Ex 4_10 给定一个有向图G=(V,E),其中边...(bellman-ford算法的应用).._第十二次作业

    在bellman-ford算法中,循环n-1(n为顶点个数)次可以找出从源点到其他顶点的最多n-1条边的最短路径,若循环k次则可以找出从源点到其他顶点的最多k条边的最短路径. package org. ...

  5. 【原创】Linux基础之opensuse15

    装机 装机之后执行 sudo zypper ar -fc https://mirrors.aliyun.com/opensuse/distribution/leap/15.0/repo/oss ope ...

  6. emoji错误:ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value:

    1 前言 由于mysql数据库要存储微信昵称,但是当微信昵称带有emoj表情会出现标题的错误. 然后发现是emoj编码是4个字节保存的,于mysql数据库编码格式utf8默认保存的是1到3个字节. 2 ...

  7. python创建udp服务端和客户端

    1.udp服务端server from socket import * from time import ctime HOST = '' PORT = 8888 BUFSIZ = 1024 ADDR ...

  8. auth模块(登录验证)

    settings:'django.contrib.auth.middleware.AuthenticationMiddleware',#这个是认证的中间件,认证成功的话,就可以把这个用户user封装到 ...

  9. Windows上的程序员神器Cmder

    用过Windows版本Git的都知道Git自带了Git Bash,这个在很大程度上满足了我的需求,随着Git的版本升级越来越好用 安装Cmder Cmder官网,它把conemu,msysgit和cl ...

  10. 【进阶1-2期】JavaScript深入之执行上下文栈和变量对象(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/hZIpnkKqdQgQnK1BcrH6Nw 阅读笔记 JS是单线程的语言,执行顺序肯定是顺 ...