BZOJ2051——A Problem For Fun
0、题意:给出一个N个结点的树,每条边有一个正整数权值,定义两个结点的距离为连接这两个结点路径上边权的和。对于每个结点i,它到其他N-1个结点都有一个距离,将这些距离从小到大排序,输出第K个距离。
1、分析:这个题我问了一下Claris,然后理解了,我们存下logn个分支结构,然后我们在分治结构中二分就好了QAQ
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 2000010
inline int read(){
char ch = getchar(); int x = 0, f = 1;
while(ch < '0' || ch > '9'){
if(ch == '-') f = -1;
ch = getchar();
}
while('0' <= ch && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
struct Edge{
int u, v, w, next;
} G[M];
int head[M], ed;
int size, f[M], son[M], ok[M];
int cnt, now;
int V[2][M], g[M], nxt[M], W[M], ED;
int rl[M], rr[M], el[M], er[M];
int q[M], tot, n, m;
inline void add(int u, int v, int w){
G[++ ed] = (Edge){u, v, w, head[u]};
head[u] = ed;
}
inline void ADD(int u, int v1, int v2, int w){
V[0][++ ED] = v1;
V[1][ED] = v2;
nxt[ED] = g[u];
g[u] = ED;
W[ED] = w;
}
inline void FindRoot(int x, int fa){
son[x] = 1; f[x] = 0;
for(int i = head[x]; i != -1; i = G[i].next) if(G[i].v != fa && !ok[i]){
FindRoot(G[i].v, x);
son[x] += son[G[i].v];
if(son[G[i].v] > f[x]) f[x] = son[G[i].v];
}
if(size - son[x] > f[x]) f[x] = size - son[x];
if(f[x] < f[now]) now = x;
}
inline void dfs(int x, int fa, int dis){
q[++ tot] = dis;
for(int i = head[x]; i != -1; i = G[i].next) if(G[i].v != fa && !ok[i]){
dfs(G[i].v, x, dis + G[i].w);
}
}
inline void dfs2(int x, int fa, int dis){
ADD(x, now, cnt, dis);
q[++ tot] = dis;
for(int i = head[x]; i != -1; i = G[i].next) if(G[i].v != fa && !ok[i]){
dfs2(G[i].v, x, dis + G[i].w);
}
}
inline void solve(int x){
q[rl[x] = ++ tot] = 0;
for(int i = head[x]; i != -1; i = G[i].next) if(!ok[i]){
dfs(G[i].v, x, G[i].w);
}
sort(q + rl[x], q + tot + 1);
rr[x] = tot;
for(int i = head[x]; i != -1; i = G[i].next) if(!ok[i]){
el[++ cnt] = tot + 1;
dfs2(G[i].v, x, G[i].w);
sort(q + el[cnt], q + tot + 1);
er[cnt] = tot;
}
for(int i = head[x]; i != -1; i = G[i].next) if(!ok[i]){
ok[i ^ 1] = 1;
f[0] = size = son[G[i].v];
FindRoot(G[i].v, now = 0);
solve(now);
}
}
inline int ask(int L, int r, int x){
int l = L, t = l - 1, mid;
while(l <= r){
mid = (l + r) / 2;
if(q[mid] <= x) l = (t = mid) + 1;
else r = mid - 1;
}
return t - L + 1;
}
inline int query(int x, int k){
int t = ask(rl[x], rr[x], k) - 1;
for(int i = g[x]; i != -1; i = nxt[i]) t += ask(rl[V[0][i]], rr[V[0][i]], k - W[i]) - ask(el[V[1][i]], er[V[1][i]], k - W[i]);
return t;
}
inline int getans(int x){
int l = 1, r = 10000 * (n - 1), mid;
while(l < r){
mid = (l + r) / 2;
if(query(x, mid) < m) l = mid + 1;
else r = mid;
}
return l;
}
int main(){
n = read(), m = read();
memset(head, -1, sizeof(head)); ED = ed = -1;
memset(g, -1, sizeof(g));
for(int i = 1; i < n; i ++){
int u = read(), v = read(), w = read();
add(u, v, w); add(v, u, w);
}
size = f[0] = n;
FindRoot(1, now = 0);
solve(now);
for(int i = 1; i <= n; i ++) printf("%d\n", getans(i));
return 0;
}
BZOJ2051——A Problem For Fun的更多相关文章
- [BZOJ2051]A Problem For Fun/[BZOJ2117]Crash的旅游计划/[BZOJ4317]Atm的树
[BZOJ2051]A Problem For Fun/[BZOJ2117]Crash的旅游计划/[BZOJ4317]Atm的树 题目大意: 给出一个\(n(n\le10^5)\)个结点的树,每条边有 ...
- BZOJ2051 : A Problem For Fun
树的点分治,将点分治的过程记录下来,每一个分治结构按到分治中心的距离维护所有点. 对于一个点二分答案,然后在$O(\log n)$个分治结构中二分查找,时间复杂度$O(n\log^3n)$. #inc ...
- 1199 Problem B: 大小关系
求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...
- No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.
Gson解析JSON字符串时出现了下面的错误: No-args constructor for class X does not exist. Register an InstanceCreator ...
- C - NP-Hard Problem(二分图判定-染色法)
C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144 ...
- Time Consume Problem
I joined the NodeJS online Course three weeks ago, but now I'm late about 2 weeks. I pay the codesch ...
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- hdu1032 Train Problem II (卡特兰数)
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
随机推荐
- SaltStack项目实战(六)
SaltStack项目实战 系统架构图 一.初始化 1.salt环境配置,定义基础环境.生产环境(base.prod) vim /etc/salt/master 修改file_roots file_r ...
- uC/OS-II内核的服务文件
/*************************************************************************************************** ...
- js005-引用类型
js005-引用类型 数据类型分为基本类型和引用类型:基本类型值如下:Undefined.Null.Bollean.Number.String 本章内容: 1.使用对象 2.创建并操作数组 3.理解基 ...
- Mac下切换bash
MAC下的终端是神器,安装ZSH后,突然间发现太不好操作了,即使再配上oh-my-zsh也感觉不爽. 然后想删除,自己尝试了下找不到命令删除,于是在网上找找,但是也没找到.最后直接进隐藏文件夹,直接一 ...
- CSV文件的读取 导出
CSV文件是 逗号分隔值文件 内容基本是这么存的... 姓名,年龄,性别/r/n王有才,,男/r/n王二妞,,女 一行值内用逗号 , 分开 行与行之间用 /r/n 分隔 说白了,他其实是一个字符 ...
- python递归理解图
递归:下一级只能return给自己的上一级. import re val="9-2*5/3+7/3*99/4*2998+10*568/14" val="9-2*5/3+7 ...
- Apache CXF实现WebService入门教程(附完整源码)
Apache CXF实现WebService非常简单实用,只需要几步就可以实现一个简单的web service. 首先我们需要新建一个maven项目,在pom中添加依赖和jetty作为测试的web s ...
- Sql Server作业
参考资料: http://jingyan.baidu.com/article/49ad8bce7287315834d8fab4.html
- struts2文件上传提示信息国际化
1.在src的目录下新建文件fileUpload.properties 如图: fileUpload.properties文件内容为(把英文提示自定义为中文提示) struts.messages.er ...
- 自定义列表dl的使用原因和场合
为什么要使用自定义列表? dl和ol, ul的区别? 要正确理解dl的意图, 理解 dl的 "语义" ! 才能知道为什么要使用dl, 以及在什么时候/ 什么情况下使用 dl? dl ...