题解 P6142 【[USACO20FEB]Delegation P】
这题思路大佬们都讲了,我来讲哈我的做法 不知道为啥,大佬们都用的双指针...虽然感觉上对的,而且我hack不掉, 但是我总感觉有某种神奇的数据会让他出问题 .于是,我选择用set 双指针比较头尾貌似挺有道理,但是我总感觉如果他的子树能配对,传上去的数一定是最大的.而双指针不能保证传上去的是最大的数.比如1 3 5 6 10.假设要选的数是7,双指针会选1 10, 3 6, 然后返回一个5.然而我们可以划分为1 6和3 5,返回10(如果有理解错,欢迎指正) 而set的方法就好写多了.每次配对子树的时候,我们只选最小能使子树配对满足要求的数.这个操作可以用lower_bound做.如果用vector可以用二分实现(但码量就大不少了). 更新答案有几种情况(必须在出发点才更新答案): 1.如果出发点的子树全部能配对,那么这个数是可以选的 2.如果出发点含有的未配对子树,并且子树的权值 \(>=\) 我们要选的数,那么这个数是可以选的 这些都有一个共同的前提:他的子树能够成功配对. 如果有任何一个子树不能配对,那么这个数绝对不能选 #include <iostream> #include <algorithm> #include <vector> #include <set> using namespace std; const int MAXN = 1e5+5; int n,st;