bzoj 2561
传送门: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的更多相关文章
- BZOJ 2561 最小生成树 | 网络流 最小割
链接 BZOJ 2561 题解 用Kruskal算法的思路来考虑,边(u, v, L)可能出现在最小生成树上,就是说对于所有边权小于L的边,u和v不能连通,即求最小割: 对于最大生成树的情况也一样.容 ...
- BZOJ 2561 最小生成树(最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2561 题意:给定一个边带正权的连通无向图G= (V,E),其中N=|V|,M=|E|,N ...
- BZOJ 2561: 最小生成树(最小割)
U,V能在最小(大)生成树上,当且仅当权值比它小(大)的边无法连通U,V. 两次最小割就OK了. --------------------------------------------------- ...
- bzoj 2561: 最小生成树
#include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...
- BZOJ 2561: 最小生成树【最小割/最大流】
Description 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v), ...
- bzoj 2561: 最小生成树【最小割】
看错题了以为多组询问吓得不行-- 其实还挺好想的,就是数据范围一点都不网络流.把U作为s,V作为t,以最小生成树为例,(U,V,L)要在最小生成树上,就要求所有边权比L小的边不能连通(U,V)所在的联 ...
- 【BZOJ】【2561】最小生成树
网络流/最小割 对于所有小于L的边求一个割使得U,V不连通,这样就可以保证L可能在最小生成树里. 最大生成树同理. 答案累加一下即可.(Orz Hzwer) (我一开始怎么会sb地去想到一起求呢……) ...
- 8月清北学堂培训 Day5
今天是杨思祺老师的讲授~ 最短路练习题: POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...
- DP&图论 DAY 5 上午
DP&图论 DAY 5 上午 POJ 1125 Stockbroker Grapevine 有 N 个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径.现在有一个消息要由某个人开 ...
随机推荐
- java基础学习笔记六(继承)
继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...
- shell脚本学习(2)查找
1 grep 用法: grep -F fa 找含有fa字符的字符串 yuyuyu@ubuntu:~$ grep -F fa < do.txt grep -i fa 忽略大 ...
- Android动画效果 translate、scale、alpha、rotate 切换Activity动画 控件位置调整
2011.10.28注:如果需要控件停在动画后的位置,需要设置android:fillAfter属性为true,在set节点中.默认在动画结束后回到动画前位置.设置android:fillAfter后 ...
- 2019牛客多校第四场D-triples I 贪心
D-triples 题意 给你一个\(n\),问至少有几个数或运算起来可以等于\(n\),并且输出数量和这个几个数.题目说明给的\(n\)一定符合条件(不会输出\(n= 1\) 之类不存在情况). 思 ...
- svn提交代码失败提示清理(清理失败并且报错信息乱码解决办法)
原因是;svn的数据库队列原因 1,下载sqlite3.exe, sqlite官网http://www.sqlite.org/download.html) 2.在Windows的D盘中新建tools ...
- Java学习之单例模式
单例设计模式:解决一个类在内存中只存在一个对象思想:1.为了避免过多创建类的对象,禁止此类以外创建对象(构造方法私有化)2.为了类可以被使用就必须创建此类对象,只好在本类中,创建对象3.在此类中创建的 ...
- java.lang
package cn.sxt; import java.lang.*; public class BooleanDemo { public static void main(Stri ...
- a标签动态修改手机号跳到拨打界面
<div class="primaryButton"> <a :href.stop="'tel:' + createData.salesPhone&qu ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- LeetCode Array Easy 26.Remove Duplicates from Sorted Array 解答及疑惑
Description Given a sorted array nums, remove the duplicates in-place such that each element appear ...