2020牛客暑期多校训练营Decrement on the Tree(图论,set)
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)相关推荐
- 2020牛客暑期多校训练营(第六场)
2020牛客暑期多校训练营(第六场) 额,睡了一下午,直接错过了比赛... 文章目录 A African Sort 题意: 题解: 代码: B Binary Vector C Combination ...
- 2020牛客暑期多校训练营(第四场)
2020牛客暑期多校训练营(第四场) 这场属实有点难受 文章目录 A Ancient Distance B Basic Gcd Problem 题目 代码: C Count New String D ...
- 2020牛客暑期多校训练营(第一场)
文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...
- 2020牛客暑期多校训练营(第二场)
2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...
- 2020牛客暑期多校训练营(第七场)J.Pointer Analysis
2020牛客暑期多校训练营(第七场)J.Pointer Analysis 题目链接 题目描述 Pointer analysis, which aims to figure out which obje ...
- 2020牛客暑期多校训练营(第三场)A.Clam and Fish
2020牛客暑期多校训练营(第三场)A.Clam and Fish 题目链接 题目描述 There is a fishing game as following: The game contains ...
- 2020牛客暑期多校训练营(第五场)——E Bogo Sort
2020牛客暑期多校训练营(第五场)--E Bogo Sort 题目描述 Today Tonnnny the monkey learned a new algorithm called Bogo So ...
- E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)
E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...
- 2020牛客暑期多校训练营(第一场)A B-Suffix Array(后缀数组,思维)
链接:https://ac.nowcoder.com/acm/contest/5666/A 来源:牛客网 题目描述 The BBB-function B(t1t2-tk)=b1b2-bkB(t_1 t ...
最新文章
- 字节一实习生求助:晚上九点半在公司打游戏,被领导发现后开除,将来找工作会背调出来吗?...
- LeetCode 41. First Missing Positive--Python 解法--数学题-找到不存在的最小正整数-O(1)空间复杂度
- char,Character,int,字符及编码日记
- Bootstrap中模态框多层嵌套时滚动条问题
- 「 每日一练,快乐水题 」504. 七进制数
- OpenCV背景扣除Background Subtraction
- qq空间说说服务器维护,如何解决QQ空间说说发表不了
- 华为弹性云服务器ECS使用学习0
- 深挖Kubernetes存储为何如此难及其解决方案
- hbuilder制作简单网页_企业信息化网站+营销服务之电子商务网站制作流程
- Arcgis Javascript那些事儿(十)--发布网络分析服务
- python面值组合_算法题 - 拼凑面额 - Python
- c语言错误码2,平方根2.我做过C语言的一些错误
- 广州天河租房随笔记录
- 基于Pytorch的YoLoV4模型代码及作品欣赏
- 计算机诞生了自主意识,计算机会有意识吗?整合信息或非人类独有
- 记一次很坑很坑的报错java.lang.Exception: The class is not public.
- 【转载】HBase基本概念和hbase shell常用命令用法
- 中兴力维动环监控接线图_肖东晖:动环是基本点 视频监控是增长点
- Python从放弃到入门,公众号历史文章爬取成pdf的项目实践与自主学习法
热门文章
- 分享一个妄想山海脚本辅助,另附PHP随机数生成器代码
- Unity3D 程序最简单的开机启动——创建快捷方式
- DS18B20数字温度计使用(转)
- mac搜索不到wifi wtg_Mac连不上WiFi怎么办?Mac连不上无线网络解决办法
- python分支机构_基于Python爬取天眼查网站的企业信息!Python无所不能!
- 有 2*n 的一个长方形方格,用一个1*2 的骨牌铺满方格 编写一个程序,试对给出的任意一个n(n0), 输出铺法总数。
- C语言:按照样例输出打印一个长方形图形
- P3373 【模板】线段树1和P3373 【模板】线段树 2
- python pip本身的安装路径
- Java获取图片传到前端,生成二维码给前端