AT2377 Blue and Red Tree】的更多相关文章

AT2377 Blue and Red Tree 法一:正推 红色的边在蓝色的树上覆盖,一定每次选择的是覆盖次数为1的边的覆盖这条边的红色边连出来 覆盖次数可以树剖找到 这条红色边,可以开始的时候每个红色边的编号打标记到线段树节点的vector里 找一个覆盖次数为1的边的时候,沿途的vector不断弹出已经连出的红色边,一定会找到有且只有一个红色边 链的覆盖次数--,标记这个红色边已经连好. 法二:倒推在Ta的博客查看 最后连的一定是一个红色和蓝色的重(chong)边 不断找重边,然后缩点,(u…
题意 There is a tree with \(N\) vertices numbered \(1\) through \(N\). The \(i\)-th of the \(N−1\) edges connects vertices \(a_i\) and \(b_i\). Initially, each edge is painted blue. Takahashi will convert this blue tree into a red tree, by performing t…
题目链接 AtCoder:https://agc014.contest.atcoder.jp/tasks/agc014_e 洛谷:https://www.luogu.org/problemnew/show/AT2377 Solution 秒了\(O(n^2)\)不会优化是什么鬼...最后膜了大佬的题解才会写... 注意到最后一条边一定在蓝图上存在,在红图上也存在,那么我们可以找到任意一条这样的边,把两端的点合并起来,蓝图和红图都合并,剩下的是一个子问题,做\(n-1\)遍就好了,复杂度\(O(n…
题目描述 有一棵\(n\)个点的树,最开始所有边都是蓝边.每次你可以选择一条全是蓝边的路径,删掉其中一条,再把这两个端点之间连一条红边.再给你一棵树,这棵树的所有边都是红边,问你最终能不能把原来的树变成这棵新树. \(n\leq 100000\) 题解 考虑最后一条加的边,那么当前也有一条相同的蓝边.也就是说,如果把这两棵树合在一起,这两个点之间会有两条边.然后可以把这两个点缩成一个点. 所以我们每次选择之间有两条边的一对点,把这两个点合在一起.可以直接遍历度数较小的那个点\(x\)相邻的边,把…
传送门 思路 官方题解是倒推,这里提供一种正推的做法. 不知道你们是怎么想到倒推的--感觉正推更好想啊QwQ就是不好码 把每一条红边,将其转化为蓝树上的一条路径.为了连这条红边,需要保证这条路径仍然完整. 考虑连完之后要删掉的那条蓝边,显然它只能被当前连的红路径覆盖而没有被其他路径覆盖,否则就玩不下去了. 即:每次只能删掉一条被覆盖一次的蓝边. 有没有可能一条蓝边没有被覆盖过呢?显然是不可能的,因为每条蓝边最终都要删去,若没有覆盖过则无法删去. 那么做法就很显然了:树剖,线段树维护最小值和覆盖了…
题目链接 \(Description\) 给定两棵\(n\)个点的树,分别是由\(n-1\)条蓝边和\(n-1\)条红边组成的树.求\(n-1\)次操作后,能否把蓝树变成红树. 每次操作是,选择当前树上一条只由蓝边组成的简单路径\(u\to v\),删掉路径上的任意一条蓝边,然后在路径上任选两个点,在这两个点之间加一条红边. \(n\leq10^5\). \(Solution\) 模拟一下样例二,就比较容易想到: 考虑能否从红树变回到蓝树. 我们每次要找到当前树上一条蓝边组成的路径\(u\to…
Description 给定一棵\(n\)个节点的蓝边树,再给定一棵\(n\)个节点的红边树.请通过若干次操作将蓝树变成红树.操作要求和过程如下: 1.选定一条边全为蓝色的路径: 2.将路径上的一条蓝边断开,并将路径的两个端点之间连一条红边. 问能否实现目标. Solution 我们发现这个过程只会做恰好\(n-1\)次,因为每次都会减少一条蓝边.增加一条红边. 考虑红树上的一条边\((u,v)\),显然在蓝树上操作时,我们选择了一条以\(u\)和\(v\)为端点的路径,才造就了这条边.因此红树…
题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_e 题目翻译 有一棵有\(N\)个点的树,初始时每条边都是蓝色的,每次你可以选择一条由蓝色边构成的简单路径,让这条路径的两个端点间连上一条红边,然后断开这条路径上的某条蓝边.这样做\(N-1\)次,就可以把原本的蓝树变成红树.现在给你蓝树和红树的样子,问你可不可能把给出的蓝树变成给出的红树.\(N\leqslant 10^5\) 题解 先膜一发大佬的题解:https://blog.csdn.…
题目链接 https://atcoder.jp/contests/agc014/tasks/agc014_e 题解 完了考场上树剖做法都没想到是不是可以退役了... 首先有一个巨难写的据说是\(O(n\log^3n)\)的树剖+树套树做法: 对于每条红边\((u,v)\), 给蓝树上两点间路径\(+1\), 然后每次选出一个值为\(1\)的边,找到覆盖它的红边然后把这条\(1\)的边断掉加上红边,再去掉红边的影响. 下面来说正解. 依然是上面的思路,然后发现假设断掉前\((i-1)\)条蓝边之后…
不断删除重边,然后将两个点的边集启发式合并(要考虑到两棵树),合并时发现重边就加入队列,最后判断是否全部删完即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 set<int>s[N]; 5 map<int,int>mat[N]; 6 queue<pair<int,int> >q; 7 int n,x,y,ans,f[N]; 8 int find(int…