暑假集训 7月4日
基础算法:
二分

#include <bits/stdc++.h> using namespace std; #define int long long const int N = 2e5 + 10; int n, m; int a[N], b[N]; bool check(int x) { int ans = 0; for(int i = 1; i <= n; i ++ ) { if(a[i] < x ) { if(b[i] < x - a[i]) return false; ans += x - a[i]; } } if(ans > m) return false; return true; } signed main() { cin >> n >> m; for(int i = 1; i <= n; i ++ ) cin >> a[i]; for(int i = 1; i <= n; i ++ ) cin >> b[i]; int l = 0, r = n * 2; while(l < r) { int mid = (l + r + 1) / 2; if(check(mid)) l = mid; else r = mid - 1; } cout << l << "\n"; }
前缀和:
一维前缀和
i从1开始
预处理s[i]=s[i-1]+a[i];
查询区间[l,r]的和,s[r]-s[l-1]
差分 :
一维差分
i从1开始
预处理b[i]=a[i]-a[i-1]
对区间[l,r]每个数加k
b[l]+=k,b[r+1]-=k;
for (int i=1;i<=n;i++)b[i]+=b[i-1];//得到更改区间值以后的a数组
二维前缀和(快速查询子矩阵和)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
查询子矩阵左上角x1,y1,右下角x2,y2的和为
sum[x2][y2]-sum[x2][y1-1]-[x1-1][y2]+sum[x1-1][y1-1]
二维差分(子矩阵每个数+k)
差分相当于前缀和的逆运算
b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]
b[x1][y1]+=k,b[x1][y2+1]-=k,b[x2+1][y1]-=k,b[x2+1][y2+1]+=k;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
双指针
离散化
STL
map:count返回0或1,看该元素出没出现过
位运算
补题:

浙公网安备 33010602011771号