十三届河南省赛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

相关推荐

白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

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