K - K-Bag

K-Bag

https://ac.nowcoder.com/acm/contest/5671/K

K 思维

思路

一个 Part-K-Bag 一定是由 "零个或多个 K-Bag" + "不含 K-Bag 的 Part-K-Bag" 组成。

为方便起见,下称 "零个或多个 K-Bag" 为 K-Bags, "不含 K-Bag 的 Part-K-Bag" 为 Exclude-K-Bag。

1、我们先维护 Exclude-K-Bag 从左端和从右端的最长延申范围 [1, r), (l, n],如果区间 [r + 1, l - 1] 的长度为0,那么这个序列不存在 K-Bags,但是它是一个 Part-K-Bag,因为它的左右两端形成两个 Exclude-K-Bag

2、如果区间 [r + 1, r - l] 的长度不为 0, 如果序列为 Part-K-Bag,那么一定存在 K-Bags 跨过这个区间,我们使用双指针维护区间长度,找到合适的区间为止。如果找不到合适区间,那么它一定不是 Part-K-Bags

时间复杂度:

代码


#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;

unordered_map<int, int> mp;
int a[N];

int find_furthest(int from, int to, int step) {
    mp.clear();
    for (int i = from; i != to; i += step)
        if (++mp[a[i]] > 1)
            return i;
    return to;
}

bool solve(int n, int k) {
    int lr = find_furthest(0, n, 1);
    int rl = find_furthest(n - 1, -1, -1);
    if (rl - lr + 1 <= 0) return true;

    mp.clear();
    // len: the length of longest k-bag
    // siz: the number of element equal to len
    int siz = 0, len = 0, tail = 0;
    for (int i = 0; i < n; ++i) {
        while (mp[a[i]] > len) {
            if (--mp[a[tail]] == len) --siz;
            tail++;
        }
        if (mp[a[i]]++ == len) ++siz;
        if (siz == k) {
            len++, siz = 0;
            if (tail <= lr && i >= rl) return true;
        }
    }
    return false;
}

int main() {
    int t, n, k;
    scanf("%d", &t);
    while (t--) {
        scanf("%d%d", &n, &k);
        for (int i = 0; i < n; ++i)
            scanf("%d", &a[i]);
        puts(solve(n, k) ? "YES" : "NO");
    }
    return 0;
}
全部评论

相关推荐

09-30 20:49
湖南工学院 Java
SP小夜:举报了哥,你什么都没做错,全怪我那令人作呕的嫉妒和卑微的自尊心,看见你的文字我完全破防了,我直接丢盔弃甲了,看见你这图的那一秒,我满头大汗,浑身发冷,亿郁症瞬间发作了,生活仿佛没了颜色,像是被抓住尾巴的赛亚人,带着海楼石的能力者,抽离尾兽的人柱力,像是没了光的奥特曼,彻底断绝了生的希望。我几乎都快羡慕得疯了,倒在床上蒙住被子就开始抱着枕头尖叫流泪,嘴里一边喊着卧槽卧槽,一边又忍着,我边发边哭,打字的手都是抖的,后来我的手抖得越来越厉害,从心头涌起的思想、情怀和梦想,这份歆羡和悔恨交织在一起,我的笑还挂在脸上,可是眼泪一下子就掉下来了。求你了别发了,我生活再难再穷我都不会觉得难过,只有你们发这种东西的时候,我的心里像被刀割一样的痛,打着字泪水就忍不住的往下流。每天早上7点起床晚上9点睡觉,年复一年地学到现在,憧憬着一个月赚上万块的幸福生活,憧憬着美好阳光的未来。我打开了手机,看到你的图,我感到了深深的差距,我直接跳进了家门口的井里。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务