题目传送门 逃跑的Barn 题目描述 It's milking time at Farmer John's farm, but the cows have all run away! Farmer John needs to round them all up, and needs your help in the search. FJ's farm is a series of N (1 <= N <= 200,000) pastures numbered 1...N connected b…
P3066 逃跑的Barn 左偏树 题面 题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 注意到答案的两个性质: 一个点的所有答案一定包含在其所有儿子的答案中 如果节点\(i​\)当前满足条件,那么所有距离(相对于根节点)比它小的节点当前也都满足(所以建个大根堆) 所以考虑使用左偏树,每个节点都建个大根堆,在\(dfs\)时计算出所有点深度,再利用这些性质回溯时依次合并所有堆,显然答案即为堆的大小. 注意long long卡了我好久 #include <cs…
题目描述It's milking time at Farmer John's farm, but the cows have all run away! Farmer John needs to round them all up, and needs your help in the search. FJ's farm is a series of N (1 <= N <= 200,000) pastures numbered 1...N connected by N - 1 bidirec…
题目链接 还是80分,不是很懂. /* 七个操作(用左偏树)(t2表示第二棵子树): 1.合并:直接合并(需要将一个t2中原有的根节点删掉) 2.单点加:把这个点从它的堆里删了,加了再插入回去(有负数)(它可能成为这一个堆的根,所以也要从t2中删除再插入) 3.整个连通块加:根节点打标记(从t2中删除,改数,再插入到t2) 4.所有节点加:全局标记 5.输出某个点的值:向上加上所有父节点的值,输出 6.输出某个点所在连通块的最大值:找到根,输出 7.输出所有节点的最大值:将所有堆的根节点取出,再…
题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: 将第x个节点的权值增加v A2 x v: 将第x个节点所在的连通块的所有节点的权值都增加v A3 v: 将所有节点的权值都增加v F1 x: 输出第x个节点当前的权值 F2 x: 输出第x个节点所在的连通块中,权值最大的节点的权值 F3: 输出所有节点中,权值最大的节点的权值 输入输出格…
题目传送门 数字序列 题目描述 给定一个整数序列 a1​,a2​,⋅⋅⋅,an​ ,求出一个递增序列 b1​<b2​<⋅⋅⋅<bn​ ,使得序列 ai​ 和 bi​ 的各项之差的绝对值之和 ∣a1​−b1​∣+∣a2​−b2​∣+⋅⋅⋅+∣an​−bn​∣ 最小. 输入输出格式 输入格式: 第一行为数字 n (1≤n≤10^6) ,接下来一行共有 n 个数字,表示序列 a_i (0≤a_i≤2×10^9) . 输出格式: 第一行输出最小的绝对值之和. 第二行输出序列 bi​ ,若有多种方…
P3377 [模板]左偏树(可并堆) 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数在用一个堆内,则无视此操作) 操作2: 2 x 输出第x个数所在的堆最小数,并将其删除(若第x个数已经被删除,则输出-1并无视删除操作) code: // luogu-judger-enable-o2 #include <iostream> #include <cstdio…
正解:左偏树 解题报告: 传送门$QwQ$ 开始看到的时候$jio$得长得很像之前做的一个$dp$,,, 但是$dp$那题是说不严格这里是严格? 不难想到我们可以让$a_{i},b_{i}$同时减去$i$这样就变成那道题辣,,,?$QwQ$ 但是如果$dp$的话复杂度是$O(n^2)$的就假了$QwQ$ 这里介绍一个左偏树做法,复杂度是$O(nlogn)$的$QwQ$ 先考虑两个特殊情况,分别是$a$递减和$a$递增$QwQ$? 递增很显然就$b_{i}=a_{i}$就成$QwQ$ 然后如果是递…
题面链接 一句话题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 我:似乎并不好做啊...看了题解后大雾... sol:考虑树上差分,对于一个点,在他那个位置++,再找到最远的一个点使得该点与当前点的距离小于等于l,在找到的那个点的父亲处--,至于实现倍增好像可以轻松解决. #include <cstdio> using namespace std; #define int long long ; ],re[N],d[N]; signed main() {…
传送门 每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上 然后开始dfs,每一次把子树里那些还活着的骑士合并上来 然后再考虑当前点的堆,一直pop直到骑士全死光或者剩下的骑士的攻击力都大于等于当前城池的生命值,同时维护城池和骑士的答案 然后修改的话在堆顶打一个标记,需要的时候下传即可 //minamoto #include<bits/stdc++.h> #define ll long long using namespace std; #define getc()…