行业知识
Luogu【算法2-1】前缀和、差分与离散化
2026-10-19 00:20:17
来源:互联网转载
Problem A
思路分析
���单的前缀和板子,不多说。
AC代码
#includeusing namespace std;using ll =unsigned long long;ll n, m;ll a[200000];ll pre[200000], sum[200000];int main() {cin >> n;for (ll i = 1; i cin > a[i];pre[i] = a[i] + pre[i - 1];}cin >> m;for (ll i = 1; i ll l = 0, r = 0;cin > l >> r;sum[i] = pre[r] - pre[l - 1];}for (ll i = 1; i cout cin n;for (int i = 1; i for (int j = 1; j cin squ[i][j];//lin[i][j]表示的是第i行前j个(其实也就是第j列)数字的和lin[i][j] = lin[i][j - 1] + squ[i][j];//sum[i][j]表示的是以第1行第1个数字为左上角,以第i行第j个数字为右下角的矩形的面积。sum[i][j] = sum[i - 1][j] + lin[i][j];}}//分别枚举左上角的坐标(x1,y1)和右下角(x2,y2)的坐标。for (int x1 = 1; x1 for (int y1 = 1; y1 for (int x2 = 1; x2 for (int y2 = 1; y2 if (x2 x2>>y2; //上面提到的操作 mat[x1][y1]++; mat[x2+1][y1]--; mat[x1][y2+1]--; mat[x2+1][y2+1]++; } for(int i=1;i for(int j=1;j //求前缀和,处理出每个点的值 mat[i][j]+=mat[i-1][j]+mat[i][j-1]-mat[i-1][j-1]; coutcin n; for (int i = 1; i cin a[i] b[i];}sort(a + 1, a + 1 + n);sort(b + 1, b + 1 + n);for (int i = 1; i l += b[i] - a[i];//注意iif (b[i] a[i + 1]) {l -= b[i] - a[i + 1];}}}cout cin n m > c;for (ll i = 1; i for (ll j = 1; j cin map[i][j];//求前缀和sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + map[i][j];}}for (int i = c; i for (int j = c; j //枚举以(i,j)为右下角、边长为c的正方形的面积,注意更新坐标if (sum[i][j] - sum[i - c][j] - sum[i][j - c] + sum[i - c][j - c] maxn) {maxn = sum[i][j] - sum[i - c][j] - sum[i][j - c] + sum[i - c][j - c];nx = i - c + 1;ny = j - c + 1;}}}cout
下一篇:小黄车为什么滴滴的响?