#AcWing:前缀和的应用

终于稳定复习了,继续更新…
前缀和和前缀乘积很简单了,现在都会了,现在我们看怎么构造这个区间。不是双重遍历左右区间,我们固定右区间变成查表。

AcWing.3574 乘积数量

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

int main()
{
    int n;
    LL z = 0, f = 0;
    scanf("%d", &n);
    int s = 1, sz = 1, sf = 0;
    
    for(int i = 1; i <= n; i++)
    {
        int a;
        scanf("%d", &a);
        if(a < 0) s *= -1;
        if(s > 0) z += sz, f += sf, sz++;
        else z += sf, f += sz, sf++;
    }
    
    printf("%lld %lld", f, z);
    return 0;
}

AcWing.1230 K倍区间

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef long long LL;

LL kk[N];
LL s[N];
int main()
{
    int n, k, a;
    LL ans = 0;
    scanf("%d %d", &n, &k);
    kk[0] = 1;
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &a);
        s[i] = s[i - 1] + a;
        ans += kk[s[i] % k];
        kk[s[i] % k]++;
    }
    printf("%lld", ans);
    return 0;
}

lc523: 连续的子数组和

6.2每日一题
another k倍区间 + 子数组长度至少为2(存储位置即可)

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        unordered_map<int, int> kk;
        int s = 0;
        kk[s] = 0;
        for(int j = 1; j <= n; j++)
        {
            s = (s + nums[j - 1]) % k;
            if(kk.find(s) != kk.end() && (j - kk[s]) >= 2)
                return 1;
            if(kk.find(s) == kk.end())
                kk[s] = j;
        }
        return false;
    }

lc525:连续数组

6.3每日一题,又是这个前缀和的改进,终于会了
y总教得好!
这一题的关键在于s1[j] - s1[i - 1] = s0[j] - s0[i - 1],即s1[j] - s0[j] = s1[i - 1] - s0[i - 1],遍历区间的右端点,等式的左侧和右侧其实是一个东西,边遍历便把s1[i - 1] - s0[i - 1]存到哈希表中,判断等式的时候只需要查表就可以了,将复杂度降到了O(n)

class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        int n = nums.size();
        int si = 0, ans = 0; //si = s1[i - 1] - s0[i - 1]
        unordered_map<int, int> len;
        len[si] = 0;
        for(int j = 1; j <= n; j++)
        {
            if(nums[j - 1] == 1) si++;
            else si--;
            if(len.find(si) != len.end())
                ans = max(ans, j - len[si]);
            else
                len[si] = j;
        }
        return ans;
    }
};
世界地图矢量数据可以通过多种网站进行下载。以下是一些提供免费下载世界地图矢量数据的网站: 1. Open Street Map (https://www.openstreetmap.org/): 这个网站可以根据输入的经纬度或手动选定范围来导出目标区域的矢量图。导出的数据格式为osm格式,但只支持矩形范围的地图下载。 2. Geofabrik (http://download.geofabrik.de/): Geofabrik提供按洲际和国家快速下载全国范围的地图数据数据格式支持shape文件格式,包含多个独立图层,如道路、建筑、水域、交通、土地利用分类、自然景观等。数据每天更新一次。 3. bbbike (https://download.bbbike.org/osm/): bbbike提供全球主要的200多个城市的地图数据下载,也可以按照bbox进行下载。该网站还提供全球数据数据格式种类齐全,包括geojson、shp等。 4. GADM (https://gadm.org/index.html): GADM提供按国家或全球下载地图数据的服务。该网站提供多种格式的数据下载。 5. L7 AntV (https://l7.antv.antgroup.com/custom/tools/worldmap): L7 AntV是一个提供标准世界地图矢量数据免费下载的网站。支持多种数据格式下载,包括GeoJSON、KML、JSON、TopJSON、CSV和高清SVG格式等。可以下载中国省、市、县的矢量边界和世界各个国家的矢量边界数据。 以上这些网站都提供了世界地图矢量数据免费下载服务,你可以根据自己的需求选择合适的网站进行下载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值