三分:一般用来求最值
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); }//并查集
一般题目都是一个一个关系的建,问什么时候全部联通,还有反向并查集,建好后一个一个的摧毁,问什么时候没有联通。
浙公网安备 33010602011771号