Decrement on the Tree

题目描述

样例

input:
5 3
1 2 3
1 3 4
2 4 5
3 5 6
1 10
2 10
3 10
output:
8
12
10
10

题目大意

给你一棵树,现在你可以选择其中的一条链,将其边上的权值都减一。并且每条边的权值不能为负数。要求最少要删除多少次(每次只能减一),才能使得整棵树的权值都是0。(只需要输出答案,而不是修改)
并且,在给出答案之后,会有qqq次修改,将某一条边的权值改成另一个,这时你要再一次输出答案。

分析

首先看到题目有一种树剖的感觉,但是显然,求答案时无法很好地用树剖解决。

所以这题应该是要维护每条边的权值。我们不妨思考一下求答案的过程实际是什么。实际就是找最少的链将树覆盖,然后每条边的重叠次数都有限制。
由于每条链唯一地由两个端点决定,所以,我们不妨考虑一下一棵树被覆盖后的链的端点处在那些节点上。

如图,我已经将覆盖所用的链用不同的颜色标出。可以发现:

  • 如果出现图三的情况,即一个点相连的边的权值中MaxMaxMax大于其他边的和,那么其他边可以通过MaxMaxMax通向其他的节点作为终点,而MaxMaxMax减去其他边总和数量的链只有将这个点作为端点了。这样,以这个点为端点个数就是Max−OthersMax-OthersMax−Others。
  • 如果图二的情况,即没有一条边是大于其他边权和(虽然上图也是,但是请假装2不大于1:)),那么就要考虑欧拉回路的知识,如果是奇数,那么肯定有一个端点,如果是图一一样的偶数,那么可以做到这个点上没有端点。

那么用上述的方法可以求得整棵树上的端点个数,那么除以2就是链的个数了。

然后考虑修改的操作,我们只要维护一个multisetmultisetmultiset,由于每条边只会影响到相连的两个节点。然后找到要修改的值,直接修改就可以了。这里就大大体现了STLSTLSTL的优势美滋滋。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=1e5+10;
ll len[MAXN],sum[MAXN],ans=0;//len 第i条边的权值 sum 第i个点的与之相连的边权和 ans 端点个数
pair<ll,ll> edge[MAXN];//第i条边的两个端点
multiset<ll> du[MAXN];//点相连的每条边权
multiset<ll>::iterator it;//迭代器
ll getnum(int x){//获取第x个节点的端点数it=--(du[x].end());//Maxif(*it>sum[x]-*it) return *it-(sum[x]-*it);//如果Max大于其他点return sum[x]&1;//如果点没有出现上述情况,考虑奇数偶数
}
void update(int id,int x,ll w){//修改的边编号为id,当前考虑的点为x,修改为wans-=getnum(x);//减去当前节点的du[x].erase(du[x].find(len[id]));du[x].insert(w);//删除之前这条边,然后插入新的sum[x]=sum[x]-len[id]+w;//更新x节点的边权和ans+=getnum(x);//重新算当前节点的端点数,并加入答案
}
int main()
{ll n,q,id,u,v,w;scanf("%lld%lld",&n,&q);if(n==1){puts("0");while(q--) puts("0");return 0;}//SPJ没有边的情况,虽然没有这组测试数据,但是还是要加上的//如果没有边,multiset的末尾指针减一会炸掉for(int i=1;i<n;i++){scanf("%lld%lld%lld",&u,&v,&w);edge[i]=make_pair(u,v);len[i]=w;du[u].insert(w);du[v].insert(w);sum[u]+=w;sum[v]+=w;}//读入for(int i=1;i<=n;i++)ans+=getnum(i);printf("%lld\n",ans/2);//先算当前的答案while(q--){scanf("%lld%lld",&id,&w);ll u=edge[id].first,v=edge[id].second;//取出边的两个节点update(id,u,w);update(id,v,w);//修改答案和点的边权和len[id]=w;//修改边权printf("%lld\n",ans/2);}
}

END

multisetmultisetmultiset万岁!!!

2020牛客暑期多校训练营Decrement on the Tree(图论,set)相关推荐

  1. 2020牛客暑期多校训练营(第六场)

    2020牛客暑期多校训练营(第六场) 额,睡了一下午,直接错过了比赛... 文章目录 A African Sort 题意: 题解: 代码: B Binary Vector C Combination ...

  2. 2020牛客暑期多校训练营(第四场)

    2020牛客暑期多校训练营(第四场) 这场属实有点难受 文章目录 A Ancient Distance B Basic Gcd Problem 题目 代码: C Count New String D ...

  3. 2020牛客暑期多校训练营(第一场)

    文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...

  4. 2020牛客暑期多校训练营(第二场)

    2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...

  5. 2020牛客暑期多校训练营(第七场)J.Pointer Analysis

    2020牛客暑期多校训练营(第七场)J.Pointer Analysis 题目链接 题目描述 Pointer analysis, which aims to figure out which obje ...

  6. 2020牛客暑期多校训练营(第三场)A.Clam and Fish

    2020牛客暑期多校训练营(第三场)A.Clam and Fish 题目链接 题目描述 There is a fishing game as following: The game contains ...

  7. 2020牛客暑期多校训练营(第五场)——E Bogo Sort

    2020牛客暑期多校训练营(第五场)--E Bogo Sort 题目描述 Today Tonnnny the monkey learned a new algorithm called Bogo So ...

  8. E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)

    E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...

  9. 2020牛客暑期多校训练营(第一场)A B-Suffix Array(后缀数组,思维)

    链接:https://ac.nowcoder.com/acm/contest/5666/A 来源:牛客网 题目描述 The BBB-function B(t1t2-tk)=b1b2-bkB(t_1 t ...

最新文章

  1. 字节一实习生求助:晚上九点半在公司打游戏,被领导发现后开除,将来找工作会背调出来吗?...
  2. LeetCode 41. First Missing Positive--Python 解法--数学题-找到不存在的最小正整数-O(1)空间复杂度
  3. char,Character,int,字符及编码日记
  4. Bootstrap中模态框多层嵌套时滚动条问题
  5. 「 每日一练,快乐水题 」504. 七进制数
  6. OpenCV背景扣除Background Subtraction
  7. qq空间说说服务器维护,如何解决QQ空间说说发表不了
  8. 华为弹性云服务器ECS使用学习0
  9. 深挖Kubernetes存储为何如此难及其解决方案
  10. hbuilder制作简单网页_企业信息化网站+营销服务之电子商务网站制作流程
  11. Arcgis Javascript那些事儿(十)--发布网络分析服务
  12. python面值组合_算法题 - 拼凑面额 - Python
  13. c语言错误码2,平方根2.我做过C语言的一些错误
  14. 广州天河租房随笔记录
  15. 基于Pytorch的YoLoV4模型代码及作品欣赏
  16. 计算机诞生了自主意识,计算机会有意识吗?整合信息或非人类独有
  17. 记一次很坑很坑的报错java.lang.Exception: The class is not public.
  18. 【转载】HBase基本概念和hbase shell常用命令用法
  19. 中兴力维动环监控接线图_肖东晖:动环是基本点 视频监控是增长点
  20. Python从放弃到入门,公众号历史文章爬取成pdf的项目实践与自主学习法

热门文章

  1. 分享一个妄想山海脚本辅助,另附PHP随机数生成器代码
  2. Unity3D 程序最简单的开机启动——创建快捷方式
  3. DS18B20数字温度计使用(转)
  4. mac搜索不到wifi wtg_Mac连不上WiFi怎么办?Mac连不上无线网络解决办法
  5. python分支机构_基于Python爬取天眼查网站的企业信息!Python无所不能!
  6. 有 2*n 的一个长方形方格,用一个1*2 的骨牌铺满方格 编写一个程序,试对给出的任意一个n(n0), 输出铺法总数。
  7. C语言:按照样例输出打印一个长方形图形
  8. P3373 【模板】线段树1和P3373 【模板】线段树 2
  9. python pip本身的安装路径
  10. Java获取图片传到前端,生成二维码给前端