并查集
嘉伟森的猫
NYU Shanghai本科,MBZUAI机器学习硕士,深度学习/强化学习菜鸡
展开
-
Codeforces 1156D 0-1-Tree(并查集)
传送门题意:给一棵n个点,边被黑白染色的树,问有多少对点对满足从x沿最短路径走到y,经过白边(1-edges)后不经过黑边(0-edges)。题解:开两个并查集,第一个只连黑边,第二个只连白边,讨论三种路径:①黑②白③黑转白。前两种在并查集merge的时候可以计算,第三种路径怎么搞?对于某个点x,经过它的第三种路径有条。为什么这么不会算重,因为树是没有环的(脑补一下似乎没毛病)。做完发现可以不用讨论,直接。减去那个1就是去掉(pos, pos)这条路径。WA了好久发现应该find的地方写成了原创 2020-07-16 18:28:19 · 206 阅读 · 0 评论 -
Codeforces 1139C Edgy Trees(并查集)
传送门题意:给一棵n个点,边被红黑染色的树,给定m,有多少种选法,选出可重集满足从走到,再从走到,......,再从走到(都走最短路径),至少经过一条黑边。题解:由于是最少经过一条黑边,直接算不好算,所以正难则反尝试算有多少种选法使得走下来只经过红边。显然这样选必须在某个只含红边的极大连通子图里选。于是只用并查集连红边,每次合并计算一下贡献即可,类似Codeforces 1213G。记计算出的选法有种,那么。#include<cstdio>#include<cstring&原创 2020-07-15 17:57:08 · 247 阅读 · 0 评论 -
Codeforces 1213G Path Queries(并查集+离线)
传送门题意:给一棵n个点有边权的树,m次询问,第i次询问有多少点对的简单路径上最大边权不超过。题解:直接在一棵建好的树上搞貌似不太可行...好像点分治可以莽一下?于是尝试离线做法,把询问从小到大排序,每次把边权小于当前询问的边都连起来,算一下合并联通块造成的贡献即可。我居然不是那个写点分的莽子(偷笑)....#include<cstdio>#include<cstring>#include<iostream>#include<algorith原创 2020-07-14 18:31:11 · 199 阅读 · 0 评论 -
Codeforces 734E Anton and Tree(并查集+树的直径)
传送门题意:给一棵黑白染色过的树,每次操作可以将一块连通的同色子图(连通块内不含另一颜色)染成另一颜色,问最小需要操作几次才能将树上所有节点统一为同一颜色。题解:先用并查集缩点,把同一颜色的连通的缩成一个点,得到新树,然后直径上的点数/2即可。(从直径中间那个点开始染色,把同色的区间不断往直径两端扩展,这个过程中非直径上的点的颜色也会被统一)脑洞还是不够大....树的直径又没看出来诶#include<cstdio>#include<cstring>#includ原创 2020-07-10 14:46:49 · 144 阅读 · 0 评论 -
Codeforces 1209D Cow and Snacks(并查集)
传送门题意:有n个点心,m个客人,每个客人有两个喜欢的点心,现需要给客人安排一定顺序,每轮到一个人,他吃掉所有剩下的他喜欢的点心(有一个吃一个,有俩吃俩)。一个都吃不到的人就会伤心。请问合理安排后最小的伤心人数是多少。题解:我们需要尽可能平均分配,就让每个人尽可能只吃一个(可以理解为重复利用一些点心?A吃了1,2,B吃了2,3相当于2利用了两次)。于是灵光乍现想到把每个客人看成一条边然后跑个最长路之类的东西?后来细想一下发现不对,如果这么建图,一个人会伤心当且仅当这条边两端已经被连通过,所以应该用并原创 2020-07-02 11:16:30 · 191 阅读 · 0 评论