2020牛客多校第十场C-Decrement on the Tree

这篇博客探讨了在树结构上进行特定操作的问题,重点在于如何计算由这些操作产生的路径数量。作者指出,操作次数等价于路径数量的一半,并且路径的起点和终点是关键。当某条边的权重远大于其他边时,会出现多个起讫点。如果边权和为奇数,存在起讫点;否则,不存在起讫点。解决方案中提到了使用STL中的multiset来高效地查找最大值,以及在O(logN)时间复杂度内插入和删除边。
摘要由CSDN通过智能技术生成

Description

在这里插入图片描述

Solution

  • 首先,问有几次操作等价于问有几条路径
  • 显然我们只需要关心路径的起讫点
  • 路径数为起讫点数/2
  • 如图
    在这里插入图片描述
  • 如图C情况,当有一条边权值很大,超过其他所有边权和时,必然出现许多像粉色边一样的起讫点,点数为粉边数
  • 若没有超过,如AB所示,则像欧拉一笔画问题一样,边权和为奇数则有起讫点,否则没有
  • 维护时可以用STL中的multiset方便的查最大值,插入和删除边可以做到优秀的 O ( l o g N ) O(logN) O(logN)复杂度
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
multiset<ll> s[N];
multiset<ll>::iterator it;
int n,q,a[N],b[N
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值