这一题
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=500000+5;
int c[maxn],n,m;
int szsh(int x){
return x & -x;
}
void add(int i,int x){
while(i<=n){
c[i]+=x;
i+=szsh(i);
}
}
int find(int x){
int sum=0;
while(x){
sum+=c[x];
x-=szsh(x);
}
return sum;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
add(i,x);
}
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&z,&x,&y);
if(z==1)
add(x,y);
else
printf("%d\n",find(y)-find(x-1));
}
return 0;
}
并查集:
//路径压缩:
#include <bits/stdc++.h>
using namespace std;
const int maxn=10000+10;
int fa[maxn],n,x,y,z,m;
int find(int x){
if(fa[x]==x)
return x;
else
return fa[x]=find(fa[x]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&z,&x,&y);
if(z==1){
fa[find(x)]=find(y);
}
else{
if(fa[find(x)]==find(y))
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}
//启发式合并:
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
int fa[maxn],rank[maxn];
int find(int x){
if(fa[x]==x)return x;
else return fa[x]=find(fa[x]);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&z,&x,&y);
if(z==1){
if(find(x)!=find(y)){
if(rank[find(x)]>rank[find(y)]){
fa[find(y)]=find(x);
rank[find(x)]++;
}else{
fa[find(x)]=find(y);
rank[find(y)]++;
}
}
}else{
if(find(x)==find(y))printf("Y\n");
else printf("N\n");
}
}
return 0;
}