传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2561

考虑做mst的时候,什么时候这条边不在这棵mst上呢? 就是比他小的权值的边讲这条边的两边并进了一个联通块里面,那么对于所有的小于所求边的权值的边建一个图,然后求一个最小割使得U, V 不联通,一共做两遍加起来就是答案

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll;
const ll maxn = 210000; struct node {
ll val, size, dis, lazy;
node *l, *r;
}e[maxn * 8]; ll ne = 0; void swap(node *&a, node* &b) {
node* t = a; a = b, b = t;
} void test(node* x) {
if(x) {
cout << x-> val <<" "<< x-> size << endl;
test(x-> l), test(x-> r);
}
} void update(node *x) {
x-> size = 1;
if(x-> l) x-> size += x-> l-> size;
if(x-> r) x-> size += x-> r-> size;
} void pushdown(node* x) {
if(!x || !x-> lazy) return;
if(x-> l) x-> l-> val += x-> lazy, x-> l-> lazy += x-> lazy;
if(x-> r) x-> r-> val += x-> lazy, x-> r-> lazy += x-> lazy;
x-> lazy = 0;
} node* merge(node* a, node *b) {
if(!a) return b;
if(!b) return a;
pushdown(a), pushdown(b);
if(a-> val < b-> val) swap(a, b);
a-> r = merge(a-> r, b);
ll dl = a-> l ? a-> l-> size : -1;
ll dr = a-> r ? a-> r-> size : -1;
if(dl < dr) swap(a-> l, a-> r);
a-> dis = a-> r ? a-> r-> dis + 1 : 0;
update(a);
return a;
} void pop(node* &x) {
pushdown(x);
x = merge(x-> l, x-> r);
} ll n, m; struct edge {
ll t, d;
edge* next;
}se[maxn * 2], *head[maxn]; ll oe = 0; void addedge(ll f, ll t, ll d) {
se[oe].t = t, se[oe].d = d, se[oe].next = head[f], head[f] = se + oe ++;
} ll int_get() {
ll x = 0; char c = (char)getchar(); bool f = 0;
while(!isdigit(c)) {
if(c == '-') f = 1;
c = (char)getchar();
}
while(isdigit(c)) {
x = x * 10 + (int)(c - '0');
c = (char)getchar();
}
if(f) x= -x;
return x;
} void read() {
n = int_get(); m = int_get();
for(ll i = 2; i <= n; ++ i) {
ll f, w;
f = int_get(), w = int_get();
addedge(i, f, w), addedge(f, i, w);
}
} ll s[maxn], top = 0; node* rt[maxn];
ll h[maxn]; void dfs(ll x, ll fa) {
h[x] = h[fa] + 1;
for(edge* p = head[x]; p; p = p-> next) {
if(p-> t != fa) dfs(p-> t, x);
}
s[++ top] = x;
} ll ans[maxn]; void sov() {
dfs(1, 0);
for(ll j = 1; j <= top; ++ j) {
ll i = s[j];
rt[i] = e + ne ++; rt[i]-> dis = 0; rt[i]-> val = 0; rt[i]-> size = 1;
for(edge* p = head[i]; p; p = p-> next) {
if(h[p-> t] > h[i]) {
if(rt[p-> t]) rt[p-> t]-> lazy += p-> d, rt[p-> t]-> val += p-> d;
rt[i] = merge(rt[i], rt[p-> t]);
}
}
while(rt[i] && rt[i]-> val > m) pop(rt[i]);
ans[i] += rt[i] ? rt[i]-> size : 0;
}
for(ll i = 1; i <= n; ++ i) printf("%lld\n", ans[i]);
} int main() {
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
read(), sov();
return 0;
}

bzoj 2561的更多相关文章

  1. BZOJ 2561 最小生成树 | 网络流 最小割

    链接 BZOJ 2561 题解 用Kruskal算法的思路来考虑,边(u, v, L)可能出现在最小生成树上,就是说对于所有边权小于L的边,u和v不能连通,即求最小割: 对于最大生成树的情况也一样.容 ...

  2. BZOJ 2561 最小生成树(最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2561 题意:给定一个边带正权的连通无向图G= (V,E),其中N=|V|,M=|E|,N ...

  3. BZOJ 2561: 最小生成树(最小割)

    U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...

  4. bzoj 2561: 最小生成树

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

  5. BZOJ 2561: 最小生成树【最小割/最大流】

    Description 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v), ...

  6. bzoj 2561: 最小生成树【最小割】

    看错题了以为多组询问吓得不行-- 其实还挺好想的,就是数据范围一点都不网络流.把U作为s,V作为t,以最小生成树为例,(U,V,L)要在最小生成树上,就要求所有边权比L小的边不能连通(U,V)所在的联 ...

  7. 【BZOJ】【2561】最小生成树

    网络流/最小割 对于所有小于L的边求一个割使得U,V不连通,这样就可以保证L可能在最小生成树里. 最大生成树同理. 答案累加一下即可.(Orz Hzwer) (我一开始怎么会sb地去想到一起求呢……) ...

  8. 8月清北学堂培训 Day5

    今天是杨思祺老师的讲授~ 最短路练习题: POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...

  9. DP&图论 DAY 5 上午

    DP&图论  DAY 5  上午 POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...

随机推荐

  1. SCP-bzoj-1069

    项目编号:bzoj-1069 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 求凸包后在凸包上旋转卡壳.然而复杂度要求较低,故可直接枚举四边形的一条对角线,另两个顶点在凸包上随这条对角线的移动 ...

  2. Centos6.6部署Redis集群

    Centos6.6部署Redis集群 1环境准备 1环境安装redis 1安装ruby 2配置redis主从环境 3部署redis sentinel服务器 5集群使用 13当前集群环境说明 13测试功 ...

  3. hbase shell插入根据条件查询数据

    hbase shell插入根据条件查询数据 创建并插入数据: hbase(main):179:0> create 'scores','grade','course' hbase(main):18 ...

  4. PAT 1036 Boys vs Girls (25 分)

    1036 Boys vs Girls (25 分)   This time you are asked to tell the difference between the lowest grade ...

  5. 大数据和AI怎么与现代教育相结合?

    大数据和AI怎么与现代教育相结合? 比尔·盖茨曾预言,"5年以后,你将可以在网上免费获取世界上最好的课程,而且这些课程比任何一个单独大学提供的课程都要好." 现在看来,虽然并不是每 ...

  6. C/C++程序员 面试经历总结

    最近在找工作,遇到了一些面试题,很惭愧的是很多都没答上来. 现在把一些问题总结一下,算是记录一下面试的经历吧.以后有空简单地回答一下, 同时也欢迎各位同仁解答,共同学习一下吧!   一.嵌入式C语言面 ...

  7. sql server日志传送实践(基于server 2008 R2)

    SQL Server 2008 R2 主从数据库同步 相关参考:http://blog.itpub.net/30126024/viewspace-2639526/ sql server日志传送(基于s ...

  8. 马士兵对话京东T6阿里P7(薪水):月薪5万,他为何要离职?

    马士兵大佬你知道吗? 你竟然不知道?你怎么可能不知道!你不知道是不可能的! 记得自己的第一行Java代码,你的Hello World是跟着谁学的吗?我的就是马士兵老师! 马士兵是唯一一个在当时讲课是让 ...

  9. Android组件内核之Activity调用栈分析(一)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680 导语 我们陈述一下Activity,Activity是整个应用用户交互的 ...

  10. [Java Performance] 线程及同步的性能之线程池/ThreadPoolExecutors/ForkJoinPool

    线程池和ThreadPoolExecutors   虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理 ...