三分:一般用来求最值
const double eps = 1e-6;
double fx(double x) {
    return  x;
}//函数
int main() {
    double l, r;
    while (r - l < eps) {
        double midl = (r + l) / 2;
        double midr = (midl + r) / 2;
        if (fx(midl) < fx(midr)) {
            l = midl;
        }
        else {
            r = midr;
        }//求最大值则赋值较小的,求最小值则赋值较大的
    }
    cout << l << endl;
    return 0;
}

前缀和:用于快速求区间和;

差分:用于快速对连续数组进行更改,如航班问题;

 1 //前缀和,差分
 2 int arr[N][N];
 3 int sum[N][N];
 4 int cha[N][N];
 5 int main(){
 6     int n,m;
 7     cin>>n>>m;
 8     for(int i=1;i<=n;++i){
 9         for(int j=1;j<=m;++j){
10             cin>>arr[i][j];
11             sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+arr[i][j];
12             cha[i][j]=arr[i][j]+arr[i-1][j-1]-arr[i-1][j]-arr[i][j-1];
13         }
14     }
15     //int t = sum[i][j] - sum[i - m][j] - sum[i][j - m] + sum[i - m][j - m];//表示求以ij为右下角的边长为m的正方形的区间和 
16     //int t=sum[i][j]-sum[i][j-l]-sum[i-c][j]+sum[i-c][j-l]//求cl的长方形和 
17     int ret=0;
18     for(int i=1;i<=a;++i){
19         for(int j=1;j<=b;++j){
20             ret+=cha[i][j];
21         }
22     }
23     cout<<ret<<endl;//利用差分求arr[a][b]的值 
24     
25     //发生更改时差分的变化 
26     arr[i][j]+=m;
27     cha[i+1][j+1]+=m;
28     cha[i][j]+=m;
29     cha[i+1][j]-=m;
30     cha[i][j+1]-=m;
31     return 0;
32 }
33 //二维差分。
34 //差分主要用于区间的变化,如航班问题,对首尾进行更改就可以。

并查集用来查找亲戚关系,也就是查找两个元素是否是同一个集合的

int fa[N];
int f(int x){
    if(fa[x]==x)
    return x;
    return fa[x]=f(fa[x]);
}
void init(int n){
    for(int i=1;i<=n;++i){
        fa[i]=i;
    }
}//一定要初始化
void merge(ll x,ll y){
    fa[f(y)]=f(x);
}//并查集 

一般题目都是一个一个关系的建,问什么时候全部联通,还有反向并查集,建好后一个一个的摧毁,问什么时候没有联通。