十三届河南省赛C-Alice and Bob(尺取、前缀和、二分)

Alice and Bob

https://ac.nowcoder.com/acm/contest/17148/C

C-Alice and Bob

题目大意:

m次询问,每次询问一个区间中有多少个连续的的子区间不同数的个数大于等于k
强制在线

思路:

首先考虑朴素做法
假设i作为左端点时向右扩展到f[i]这个区间有k个数字
枚举区间[L,R]内 的所有的数字作为左端点
对于[L,R]内的一个点t,

  1. f[t]<=R,那么t作为左端点的贡献是(R - f[t] + 1)
  2. f[t]>R,那么t作为左端点的贡献是 0

由于f数组是不递减的,我们可以在[L,R]中二分一个位置pos
如果pos作为左端点的贡献是0,那么[pos,R]的所有贡献都是0
对于有贡献的部分可以用公式
图片说明
这部分可以用前缀和公式O(1)求
f数组和以尺取O(n)求

Code

ll n, a[maxn], m, k, kind;
map<ll, ll> mp;
ll f[maxn], s[maxn];
void add(ll x) {
    mp[a[x]]++;
    if (mp[a[x]] == 1)
        kind++;
}
void del(ll x) {
    mp[a[x]]--;
    if (mp[a[x]] == 0)
        kind--;
}
int main() {
    // ios::sync_with_stdio(false);
    n = read(), m = read(), k = read();
    rep(i, 1, n) a[i] = read();
    int R = 1, L = 1;
    for (L = 1; L <= n; L++) {
        while (kind < k && R <= n)
            add(R), R++;
        if (kind == k)
            f[L] = R - 1;
        else
            f[L] = n + 1;
        del(L);
    }
    rep(i, 1, n) s[i] = s[i - 1] + f[i];
    ll ans = 0;
    while (m--) {
        ll l, r, l1, r1;
        l1 = read(), r1 = read();
        l = min(l1 ^ ans, r1 ^ ans) + 1;
        r = max(l1 ^ ans, r1 ^ ans) + 1;

        int L = 1, R = n, pos;
        while (L <= R) {
            int mid = (L + R) >> 1;
            if (f[mid] > r)
                pos = mid, R = mid - 1;
            else
                L = mid + 1;
        }
        pos--;
        if(pos<l) puts("0"),ans = 0;
        else {
            ll s1 =0 , s2 =0 ;
            s2 = (r+1)*(pos-l+1);
            s1 = s[pos] - s[l-1];
            printf("%lld\n",s2 - s1),ans =  s2 - s1;
        }

    }

    return 0;
}
全部评论
逮到
点赞 回复 分享
发布于 2021-06-01 18:54

相关推荐

不愿透露姓名的神秘牛友
07-03 18:13
点赞 评论 收藏
分享
牛客92804383...:在他心里你已经是他的员工了
点赞 评论 收藏
分享
白火同学:只是实习的话,你这份简历应该也差不多了。真要优化的话,因为面实习的话,没有开发经验,面试更重视技术栈水平。 1、重视JavaSE的基础吧,集合、泛型算是比较基础的基础,多线程、反射、JVM内存模型才是基础; 2、技术栈写到具体的点,比如Elasticsearch的使用写到某个点,限制面试官自由发挥,防止问了相关问题最后又答不上,如果真没把握建议不写,降低面试官的心理预期; 3、技术栈不要重复,比如技术栈第二条和第八条可以合并改为“熟悉Redis中间件,包括基本数据结构、缓存策略、持久化机制,了解缓存三剑客及其解决方案,并有相关项目经验。”; 4、项目指标量化,比如“达到xx秒的响应速度”(不过这个就有点偏校招社招的要求了,实习简历不写也无伤大雅)。
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务