动态电分治+二分

肯定要枚举所有点对,那么我们建出点分树降低树高,然后每个点存下点分树中所有子树到这个点的距离,然后二分+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. scheme语言编写执行

    scheme是lisp的一种 编辑器能够用emacs.网上有非常多教导怎样编写的 (begin (display "hello") (newline)) 编写完以.scm保存,这里 ...

  2. Ffmpeg 获取USB Camera 视频流

    本文讲述的案例是如何通过Ffmpeg实现从USB Camera中获取视频流并将视频流保存到MP4文件. 本文亦适用于从USB Camera 获取视频流并将视频流转发到rtmp服务的案例,二者基本的原理 ...

  3. 微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服

    微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服 2014/10/08 · Testin · 开发人员訪谈 2013年11月1日,谷歌运行董事长施密特(Eric Emerson Sch ...

  4. angularJS contenteditable 指令双向绑定

    项目遇到需求有点奇葩:双击div使其可编辑,失去焦点后进行数据绑定 通过自定义指令完成 好了上代码: .directive('contentEditable', function() { return ...

  5. HDU 5296 Annoying problem LCA+树状数组

    题解链接 Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  6. SQL还有多少"理所当然";还有那些"就是这样"

    前言废话——sql是程序员的饭碗,繁琐but万能,但能干并不意味着适合干,每当多表关联寻找外键时,我都在经历一种没有选择的痛苦.sql不完美,但长期代码让人无暇顾及完美,再痛苦的呐喊到最后都归于疲倦已 ...

  7. #include &lt;sys/socket.h&gt;找不到头文件

    ubuntu下socket编程涉及到头文件sys/socket.h 和sys/types.h.我是用的codeblocks编辑器,当我想查看socket,h头文件时编辑器提示找不到头文件. 我就想可能 ...

  8. go网关

    package main import ( "flag" "fmt" "io" "net" "os" ...

  9. Jquey模糊选择

    Jquey模糊选择   属性字头选择器(Attribute Contains Prefix Selector): jQuery 属性字头选择器的使用格式是 jQuery(‘[attribute|=va ...

  10. mybatis入门--主键返回(九)

    自增主键返回 mysql自增主键,执行insert提交之前自动生成一个自增主键. 通过mysql函数获取到刚插入记录的自增主键: LAST_INSERT_ID() 是insert之后调用此函数. 修改 ...