2025-11-06 学习日记

发布于 2025-11-06 12:00 522 字 3 min read 手写 每个字都是我自己敲的。

2025-12-24 学习日记2025-12-17 学习日记2025-12-14 学习日记2025-12-09 学习日记2025-12-08 学习日记2025-12-07 学习日记2025-12-06 学习日记2025-12-05 学习日记2025-12-04 学习日记2025-12-03 学习日记2025-12-02 学习日记2025-12-01 学习日记2025-11-30 学习日记2025-11-29 学习日记2025-11-28 学习日记2025-11-27 学习日记2025-11-26 学习日记2025-11-25 学习日记2025-11-24 学习日记2025-11-23 学习日记2025-11-22 学习日记2025-11-21 学习日记2025-11-20 学习日记2025-11-19 学习日记2025-11-18 学习日记2025-11-17 学习日记2025-11-16 学习日记2025-11-15 学习日记2025-11-14 学习日记2025-11-13 学习日记2025-11-12 学习日记2025-11-11 学习日记2025-11-10 学习日记2025-11-09 学习日记2025-11-08 学习日记2025-11-07 学习日记2025-11-06 学习日记2025-11-05 学习日记2025-11-04 学习日记2025-11-03 学习日记2025-11-02 学习日记2025-11-01 学习日记2025-10-31 学习日记2025-10-30 学习日记2025-10-29 学习日记2025-10-28 学习日记2025-10-27 学习日记2025-10-26 学习日记2025-10-25 学习日记2025-10-24 学习日记2025-10-23 学习日记2025-10-22 学习日记2025-10-21 学习日记2025-10-20 学习日记2025-10-19 学习日记2025-10-18 学习日记2025-10-17 学习日记2025-10-16 学习日记2025-10-15 学习日记2025-10-14 学习日记2025-10-13 学习日记2025-10-11 学习日记2025-10-10 学习日记2025-10-09 学习日记2025-10-03 学习日记2025-10-02 学习日记2025-10-01 学习日记2025-09-30 学习日记2025-09-29 学习日记2025-09-28 学习日记2025-09-27 学习日记2025-09-26 学习日记2025-09-25 学习日记2025-09-24 学习日记2025-09-23 学习日记2025-09-22 学习日记2025-09-21 学习日记2025-09-20 学习日记2025-09-18 学习日记2025-09-17 学习日记2025-09-16 学习日记2025-09-15 学习日记2025-09-14 学习日记2025-09-13 学习日记2025-09-12 学习日记2025-09-11 学习日记2025-09-10 学习日记2025-09-09 学习日记2025-09-08 学习日记2025-09-04 学习日记2025-09-03 学习日记2025-09-02 学习日记2025-09-01 学习日记2025-08-31 学习日记2025-08-29 学习日记2025-08-28 学习日记2025-08-27 学习日记2025-08-26 学习日记2025-08-25 学习日记2025-08-24 周记2025-08-23 学习日记2025-08-22 学习日记2025-08-21 学习日记2025-08-20 学习日记2025-08-19 学习日记2025-08-18 学习日记2025-08-17 周记2025-08-16 学习日记2025-08-15 学习日记2025-08-14 学习日记2025-08-13 学习日记2025-08-12 学习日记2025-08-11 学习日记
今日学习记录 1. Problem-2149E-cf 关键词: 问题分析: 就是找到数组中的一个连续子数组,该数组满足(l<len<r),恰好有 k 个不同的元素 找到满足条件的数组数 核心思路: 恰好型滑窗 首先看到连续子数组反应滑窗,包含 k 个不同的数字,就是恰好型滑窗,对于这类问题可以分解为两个小问题,就是求至多为 k 的数组数,和至多为 k-1 的数组数,相差就为答案...

今日学习记录

1. Problem-2149E-cf

关键词:滑动窗口 问题分析: 就是找到数组中的一个连续子数组,该数组满足(l<len<r),恰好有 k 个不同的元素 找到满足条件的数组数 核心思路:

恰好型滑窗

首先看到连续子数组反应滑窗,包含 k 个不同的数字,就是恰好型滑窗,对于这类问题可以分解为两个小问题,就是求至多为 k 的数组数,和至多为 k-1 的数组数,相差就为答案 题目还有个别的就是对长度的限制,这个好判断,就是最小为多少,最大又为多少 对于 k 个不同的数字,直接记录到 map 中(因为还要看数量) 注意

0 的时候要从 map 中删除,因为不同看的是 map 的 size,数量为 0 但是键还在 map 中 但是这是 cf,还没完,使用常规的 map 会超时,我们要自定义哈希函数进行优化才能过

**最终代码:

/*

恰好型滑窗

*/

#include <bits/stdc++.h>

using namespace std;

#define ve vector

using ll = long long;

using ull = unsigned long long;

using sr = string;

using db = double;

const int N = 2e5+5;

int T;

int n,k,l,r;

ve<int> arr(N);

struct custom_hash {

    static uint64_t splitmix64(uint64_t x) {

        x += 0x9e3779b97f4a7c15;

        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;

        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;

        return x ^ (x >> 31);

    }

    size_t operator()(uint64_t x) const {

        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();

        return splitmix64(x + FIXED_RANDOM);

    }

};

ll f(int m){

    ll ans = 0;

    unordered_map<int,int> mp;

    for(int i = 0,j = 0;i<n;i++){

        mp[arr[i]]++;

        while(j<=i&&mp.size()>m){

            mp[arr[j]]--;

            if(mp[arr[j]]==0) mp.erase(arr[j]);

            j++;

        }

        ans += max(min(i-j+1,r)-l+1,0);

    }

    return ans;

}

void solve(){

    cin>>n>>k>>l>>r;

    for(int i = 0;i<n;i++) cin>>arr[i];

    cout<<f(k) - f(k-1)<<endl;

}

signed main() {

    ios_base::sync_with_stdio(false);

    cin.tie(nullptr);

    cin>>T;

    while(T--) solve();

}

学到的点:

  1. 恰好型滑窗

执笔 手写

随机文章

加载中...