A 快速幂 模板题
B 并查集+树状数组
题意:初始情况有n个帮派,有两种操作:将两个帮派合并和询问第k大帮派的人数。
可以用并查集维护每个人所属的帮派,用树状数组存有i个人的帮派的个数。
树状数组模板如下:
int lowbit(int x){
return x&(-x);
}
void update(int i,int k){
while(i<=n){
c[i]+=k;
i+=lowbit(i);
}
}
int getsum(int i){
int res=0;
while(i>0){
res+=c[i];
i-=lowbit(i);
}
return res;
}
int find_kth(int k){//找第k小
int ans=0, cnt=0;
for(int i=20;i>=0;i--){
ans+=(1<<i);
if(ans>=n||cnt+c[ans]>=k){
ans-=(1<<i);
}else{
cnt+=c[ans];
}
}
return ans+1;
}
主要代码:
update(a[fx], -1);
update(a[fy], -1);
update(a[fx]+a[fy], 1);
fa[fx]=fy;
a[fy]+=a[fx];
num--;
C
D
E
F
G
H
I 模拟题
J 签到题