暑假集训 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,看该元素出没出现过

位运算

补题:

 

posted @ 2022-07-08 10:30  好腻友Π  阅读(21)  评论(0)    收藏  举报