传送门写一个大根堆就可以了 , 注意并查集找fa不能路径压缩 , 因为每个点所在的集合的根是变化的
传送门将前i-1小放在第一个小根堆(大的在上)后面的放在第二个大根堆(小的在上) , 每次插入到
传送门#include<bits/stdc++.h>#define N 200050using namespace std;int n,m,a[N],l[N],r[N],flag[N...
传送门首先想到枚举每个点作为领导 , 然后我们需要快速查出x为根的子树可以有多少个节点满足这些节点加起来
分析 #include<bits/stdc++.h>#define N 1000005#define LL long longusing namespace std;LL l,n,m,a[N],b[N],p[N],q[N],ans;struct Node{ LL pos,val; bool operator < (const Node &a) const{
题目描述:L 的书籍被 M 偷了以后伤心欲绝,决定再购买一些回来,现在有 N 本书可以买,每本书的价格是 a[ i ]元
可以将两个堆合并的堆1.斜堆最主要的操作----int merge(int x,int y){ if(!x) return y;//x为空,返回y if(!y) return x;//同理 //为了方便,将y接在x的子树上 if(a[x].val<a[y].val)//小根堆 swap(x,y); a[x].r=merge(a[x].r,y);
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号