[loj3052]春节十二响】的更多相关文章

首先可以发现对于两条链来说,显然是对两边都排好序,然后大的配大的,小的配小的(正确性比较显然),最后再加入根(根只能单独选)这个结果其实也可以理解为将所有max构成一条新的链,求出因此,对于每一个结点计算出答案,然后与别的点合并得到父亲,用启发式合并+set时间复杂度为两个log. 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 200005 4 struct ji{ 5 int nex,to; 6 }edge[N];…
[BZOJ5499][2019省队联测]春节十二响(贪心) 题面 BZOJ 洛谷 题解 如果是一条折链,显然维护两侧的值,每次两个堆分别弹出一个\(max\)然后合并一下,最后再放回去就可以了. 那么现在回到一棵树上,可以认为就是本身有一条链,现在每次要合并一条链进来,那么拿一个堆维护这个合并过程就可以了.为了保证复杂度用启发式合并. 在\(C++11\)下可以直接使用\(.swap()\)函数来进行优先队列的交换. 为了在\(BZOJ\)上过就写的普通的启发式合并. #include<cstd…
题目地址:P5290 [十二省联考2019]春节十二响 骗分方法 如果你实在一点思路也没有,暴力都不会打,那么请考虑一下骗分. 方法一 输出所有 \(M\) 的和. 期望得分:0分. 实际还有5分 方法二 注意到有 \(15\) 分为一条链,分两种情况考虑: 1号点有一个儿子--详见方法一. 1号点有两个儿子--把对这两个儿子下的两条链弄成两个堆,每次取出两个堆的堆顶,取 \(max\) 加入答案,当一个堆取尽后,把另一个堆里的所有元素加入答案,最后加入 \(M_1\) . 期望得分:15分.…
P5290 [十二省联考2019]春节十二响 从特殊到一般 我们先看链的情况. 我们把点$1$左右的两条子链分别扔入堆里 每次取出两个堆的最大值,把答案累加上更大的那个(另一堆为空则直接加上去). 那么......如果$1$连着多条链咋办? 我们又发现,你可以每次把每2条链所对的堆两两合并,并不影响答案. 那么......如果$1$连着多棵树咋办? 其实是链是树已经没多大区别了,因为它们之间互不影响. 于是做法就出来了 dfs把子树合并,一层层合并上去就好辣 注意为了保证复杂度$O(nlog^2…
联考Day2T2...多亏有这题...让我水了85精准翻盘进了A队... 题目大意: 挺简单的就不说了吧...(这怎么简述啊) 题目思路: 看到题的时候想了半天,不知道怎么搞.把样例画到演草纸上之后又画了几条链手动找最优解,然后发现只需要知道怎么合并子树就行了.因为题目说的很清楚,合并出来链就行,然后手动模拟了一下合并,由于有父子关系的两个点不能被合并在一起,那么从最优的角度考虑显然贪心,把其他链中的最大与当前链最大取\(\max\),第二大同理,以此类推.那么显然需要一个堆维护,然后考虑合并后…
题目链接 [洛谷传送门] [LOJ传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为多少. (题目大意来自洛谷题解某一篇) 题解 分析一下这一道题目. 首先,因为不能存在祖先关系,那么在一条链上的所有点一定是要分开来取的. 那么很显然,根必须一个点一个集合,那么在递归子树,同样的操作,把子树独立的递归,然后合并子树内的最大值. 代码 #include <bits/stdc++.h>…
题目链接 LOJ:https://loj.ac/problem/3052 洛谷:https://www.luogu.org/problemnew/show/P5290 BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id=5499 Solution 部分分有一个链的情况极大的提示了正解. 考虑链情况怎么做,显然是\(1\)号节点向下延伸出了两条支链,那么我们可以分别\(\rm sort\)然后最大的和最大的成对,次打的同理,这样显然是最优的.…
这题是最近看到的今年省选题中最良心的一道了吧 看题+想题+写题都可以在0.5h内解决,送分含义明显啊 首先理解了题意后我们很快就能发现两个点如果要被分在一段那么必须在它们的祖先处合并 首先我们考虑下二叉树怎么做,发现如果对于每个节点维护一个堆,然后每次在一个点合并两个儿子的堆 根据简单分析我们发现必然是不断取出两个堆中最大的元素合并直到一个空了为止 那么普通的树怎么做呢,如果你稍微有点经验就会发现这个很好扩展,直接把所有儿子合并即可 但是这样一个元素可能会重复入堆多次,解决方法也很简单,直接启发…
嘟嘟嘟 这题真没想到这么简单-- 首先有60分大礼:\(O(n ^ 2logn)\)贪心.(我也不知道为啥就是对的) 然后又送15分链:维护两个堆,每次去堆顶的最大值. 这时候得到75分已经很开心了,但其实离AC也就差一点点. 链的做法已经给了我们提示:合并两个堆.其实这就相当于二叉树.那多叉树呢?就合并多个堆呗!从子树向上递归的时候不断将子树启发式合并,复杂度就保证了. 代码真的很短 #include<cstdio> #include<iostream> #include<…
题目链接 思路 先考虑一条链的情况怎么做. 因为只有两个子树,并且两个子树都是链.所以可以把这两条链找出来,然后\(sort\)一下.合并起来. 然后推广到树上 对于每一棵树都可以按照和上面同样的方法合并成一条链. 这样就可以\(O(n^2logn)\)做了. 考场上就想到这些.而且链的情况还忘了存档... 启发式合并 只要对于每个节点维护出一个堆,并且进行启发式合并.就可以达到\(O(nlogn)\)的复杂度了. 还是太菜了... 代码 /* * @Author: wxyww * @Date:…