动态电分治+二分

肯定要枚举所有点对,那么我们建出点分树降低树高,然后每个点存下点分树中所有子树到这个点的距离,然后二分+lower_bound就行了。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + ;
namespace IO
{
const int Maxlen = N * ;
char buf[Maxlen], *C = buf;
int Len;
inline void read_in()
{
Len = fread(C, , Maxlen, stdin);
buf[Len] = '\0';
}
inline void fread(int &x)
{
x = ;
int f = ;
while (*C < '' || '' < *C) { if(*C == '-') f = -; ++C; }
while ('' <= *C && *C <= '') x = (x << ) + (x << ) + *C - '', ++C;
x *= f;
}
inline void fread(long long &x)
{
x = ;
long long f = ;
while (*C < '' || '' < *C) { if(*C == '-') f = -; ++C; }
while ('' <= *C && *C <= '') x = (x << ) + (x << ) + *C - '', ++C;
x *= f;
}
inline void read(int &x)
{
x = ;
int f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = (x << ) + (x << ) + c - ''; c = getchar(); }
x *= f;
}
inline void read(long long &x)
{
x = ;
long long f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = (x << 1ll) + (x << 3ll) + c - ''; c = getchar(); }
x *= f;
}
} using namespace IO;
int rd()
{
int x = , f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
return x * f;
}
struct edge {
int nxt, to, w;
} e[N << ];
int n, q, cnt = , root, rt, tot, k;
int head[N], size[N], f[N], Fa[N], dep[N], val[N << ], vis[N], Log[N << ], pos[N << ], mn[N << ][], dis[N];
vector<int> ddis[N], DDis[N];
void link(int u, int v, int w)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
e[cnt].w = w;
}
void getroot(int u, int last, int S)
{
f[u] = ;
size[u] = ;
for(int i = head[u]; i; i = e[i].nxt) if(!vis[e[i].to] && e[i].to != last)
{
getroot(e[i].to, u, S);
size[u] += size[e[i].to];
f[u] = max(f[u], size[e[i].to]);
}
f[u] = max(f[u], S - size[u]);
if(f[u] < f[root]) root = u;
}
int getsize(int u, int last)
{
int ret = ;
for(int i = head[u]; i; i = e[i].nxt) if(e[i].to != last && !vis[e[i].to])
ret += getsize(e[i].to, u);
return ret;
}
void divide(int u)
{
vis[u] = ;
for(int i = head[u]; i; i = e[i].nxt) if(!vis[e[i].to])
{
root = ;
getroot(e[i].to, u, getsize(e[i].to, u));
Fa[root] = u;
divide(root);
}
}
void dfs(int u, int last)
{
mn[pos[u] = ++tot][] = dis[u];
for(int i = head[u]; i; i = e[i].nxt) if(e[i].to != last)
{
dis[e[i].to] = dis[u] + e[i].w;
dep[e[i].to] = dep[u] + ;
dfs(e[i].to, u);
mn[++tot][] = dis[u];
}
}
int Dis(int u, int v)
{
int ret = dis[u] + dis[v];
if(pos[u] < pos[v]) swap(u, v);
int x = Log[pos[u] - pos[v] + ];
return ret - * min(mn[pos[v]][x], mn[pos[u] - ( << x) + ][x]);
}
int ask(vector<int> &t, int x)
{
return upper_bound(t.begin(), t.end(), x) - t.begin();
}
int check(int u, int x)
{
int ret = ;
for(int i = u; i; i = Fa[i])
{
int d = ask(ddis[i], x - Dis(u, i));
ret += d;
if(ret > * n) return ret;
}
for(int i = Fa[u]; i; i = Fa[i]) if(Dis(u, i) <= x) ++ret;
for(int i = u; Fa[i]; i = Fa[i])
{
int d = ask(DDis[i], x - Dis(u, Fa[i]));
ret -= d;
}
return ret;
}
int query(int u, int k)
{
int l = , r = 1e9 + , ret = ;
while(r - l > )
{
int mid = (l + r) >> ;
int tmp = check(u, mid);
if(check(u, mid) >= k) r = ret = mid;
else l = mid;
}
return ret;
}
int main()
{
char opt[];
scanf("%s", opt);
read(n);
read(k);
for(int i = ; i < n; ++i)
{
int u, v, w;
read(u);
read(v);
read(w);
link(u, v, w);
link(v, u, w);
}
dfs(, );
for(int i = ; i <= tot; ++i) Log[i] = Log[i >> ] + ;
for(int j = ; j <= ; ++j)
for(int i = ; i + ( << j) - <= tot; ++i)
mn[i][j] = min(mn[i][j - ], mn[i + ( << (j - ))][j - ]);
f[] = 1e9;
getroot(, , getsize(, ));
rt = root;
divide(root);
for(int i = ; i <= n; ++i)
{
for(int j = Fa[i]; j; j = Fa[j]) ddis[j].push_back(Dis(i, j));
for(int j = i; Fa[j]; j = Fa[j]) DDis[j].push_back(Dis(i, Fa[j]));
}
for(int i = ; i <= n; ++i)
{
sort(ddis[i].begin(), ddis[i].end());
sort(DDis[i].begin(), DDis[i].end());
}
for(int i = ; i <= n; ++i) printf("%d\n", query(i, k));
return ;
}

bzoj2117的更多相关文章

  1. 【BZOJ2117】 [2010国家集训队]Crash的旅游计划

    [BZOJ2117] [2010国家集训队]Crash的旅游计划 Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Cra ...

  2. BZOJ4317Atm的树&BZOJ2051A Problem For Fun&BZOJ2117[2010国家集训队]Crash的旅游计划——二分答案+动态点分治(点分树套线段树/点分树+vector)

    题目描述 Atm有一段时间在虐qtree的题目,于是,他满脑子都是tree,tree,tree…… 于是,一天晚上他梦到自己被关在了一个有根树中,每条路径都有边权,一个神秘的声音告诉他,每个点到其他的 ...

  3. [BZOJ2051]A Problem For Fun/[BZOJ2117]Crash的旅游计划/[BZOJ4317]Atm的树

    [BZOJ2051]A Problem For Fun/[BZOJ2117]Crash的旅游计划/[BZOJ4317]Atm的树 题目大意: 给出一个\(n(n\le10^5)\)个结点的树,每条边有 ...

  4. BZOJ2117: [2010国家集训队]Crash的旅游计划

    裸点分,点分树每层维护有序表,查询二分,复杂度$O(nlog^3n)$. #include<bits/stdc++.h> #define M (u+v>>1) #define ...

  5. [BZOJ2117]Crash的旅游计划

    Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Crash和陶陶所要去的城市里有N (N > 1) 个景点,Cra ...

随机推荐

  1. C++11 并发指南四(<future> 详解三 std::future & std::shared_future)(转)

    上一讲<C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)>主要介绍了 <future> 头文件中的 std::pack ...

  2. MapReduce框架在Yarn上的具体解释

    MapReduce任务解析 在YARN上一个MapReduce任务叫做一个Job. 一个Job的主程序在MapReduce框架上实现的应用名称叫MRAppMaster. MapReduce任务的Tim ...

  3. Windows下利用CMake和VS2013编译OpenCV

    转载自:http://www.chengxulvtu.com/2014/03/19/windows_build-opencv-with-cmake-and-vs2013.html   获取OpenCV ...

  4. 用python模拟TCP3次握手连接及发送数据

    源码如下: from scapy.all import * import logging logging.getLogger('scapy.runtime').setLevel(logging.ERR ...

  5. PHP后台批量删除数据

    html <form action="" method="post"> <div><input type="submit ...

  6. EasyRTMP视频直播推送H264 sps解析错误导致播放画面拉伸问题解决

    EasyRTMP是将H264流以及AAC流以RTMP协议推送到RTMP服务器上进行直播.EasyRTMP推送库中会从H264流中提取中SPS.PPS进行解析,开发的时候遇到过有些SPS解析有误,获取到 ...

  7. redis事务和乐观锁

    1 MULTI/EXEC 执行本事务. MULTI set foo bar get foo set foo hello EXEC 在EXEC执行前,三条命令都放入队列中,然后EXEC触发执行.没有回滚 ...

  8. MongoDB 学习五:索引

    这章我们介绍MongoDB的索引,用来优化查询. 索引介绍 数据库索引有些类似书的目录. 一个查询如果没有使用索引被称为表扫描,意思是它必须像阅读整本书那样去获取一个查询结果.一般来说,我们应尽量避免 ...

  9. 一步步玩pcDuino3--uboot下的ping,加入命令能够接受来自host的ping

    uboot是一个很优秀的开源项目.不只能够学习bootloader.嵌入式,各种总线协议. 还能够了解网络协议栈.在嵌入式开发中,常常使用uboot的tftp和nfs来加快开发的效率.那么在tftp能 ...

  10. 时间操作(Java版)—获取给定日期N天后的日期

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/wangshuxuncom/article/details/34896777         获取给定 ...