1.并查集
for(int i=1;i<=n;i++){
fa[i]=i;
}//初始化
int find(int x){
if(fa[x]!=x){
fa[x]=find(fa[x]);
}
return fa[x];
}//find father,这里用了路径压缩
void merger(int x,int y){
if(find(x)!=find(y)){
fa[x]=y;
}
}
2.各种高精(普及同模之后几乎没有了)
getline(cin,a);
getline(cin,b);
if(a.size()>b.size()){
b=string((a.size()-b.size()),0)+b;
}else{
a=string(b.size()-a.size(),0)+a;
}
c='0'+a;
for(int i=a.size()-1;i>=0;i--){
c[i+1]=a[i]-'0'+b[i]-'0';
//c[i+1]=a[i]-'0'-(b[i]-'0');
}
for(int i=a.size()-1;i>=0;i--){
if(c[i]>=10){
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
//if(c[i]<0){
// c[i]=c[i]+10;
// c[i-1]=c[i]-1;
//}
}
3.归并排序(求逆序对)不断递归分解然后回的时候排序
void merger(int l,int mid,int r){
int i=s;int j=mid+1;
int k=s;
while(i<=mid&&j<=r){
if(a[i]>a[j]){
zancun[k++]=a[j++];
ans=mid-i+1;//从小到大排序,后面一定比他当前大
}else{
zancun[k++]=a[i++];
}
}
while(i<=mid){
zancun[k++]=a[i++];
}
while(j<=r){
zancun[k++]=a[j++];
}
for(int i=l;i<=r;i++){
a[i]=zancun[i];
}
}
void fen(int l,int r){
if(l<=r){
mid=(l+r)>>1;
fen(l,mid);
fen(mid+1,r);
merger(l,mid,r);
}
}
4.二分答案最大值最小等问题一定可以用二分降复杂度