传送门: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. 在 IntelliJ IDEA 中这样使用 Git,效率提升2倍以上

    1.Git简介 Git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可 ...

  2. Reverse array

    数组颠倒算法 #include <iostream> #include <iterator> using namespace std; void reverse(int* A, ...

  3. CSS 布局 - Overflow

    CSS 布局 - Overflow CSS overflow 属性用于控制内容溢出元素框时显示的方式. 这里的文本内容是可以滚动的,滚动条方向是垂直方向.dd马达价格 这里的文本内容是可以滚动的,滚动 ...

  4. epoll学习(二)

    首先看程序一,这个程序想要实现的功能是当用户从控制台有任何输入操作时,输出”hello world!”. l 程序一 #include <unistd.h> #include <io ...

  5. AcWing 207. 球形空间产生器 (高斯消元)打卡

    有一个球形空间产生器能够在n维空间中产生一个坚硬的球体. 现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. ...

  6. Git Git管理码云项目

    Git  一.下载安装 1. 要使用git 先安转git 请到官网下载最新git  https://git-scm.com/downloads 2. 一路默认安装,安装完成右键查看下是否有Git. 二 ...

  7. http协议和file协议的区别

    1.在本地直接使用浏览器打开  html文件 和 通过本地服务器打开  html文件  有什么区别呢.  https://segmentfault.com/q/1010000006554881/a-1 ...

  8. redis集群-4

    redis集群原理 redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态.每个节点都和其 ...

  9. 楼房重建 (rebuild)

    楼房重建 (rebuild) 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子.为了简化问题 ...

  10. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】05、Shiro集成

    1.POM文件中加入Shiro和fastJSON依赖 <dependency> <groupId>org.apache.shiro</groupId> <ar ...