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

相关推荐

03-08 18:11
门头沟学院 Java
Java抽象小篮子:海投就完事了,简历没什么问题,最大问题是学历
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
9578次浏览 87人参与
# 你的实习产出是真实的还是包装的? #
1710次浏览 40人参与
# 巨人网络春招 #
11301次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7453次浏览 43人参与
# 简历第一个项目做什么 #
31555次浏览 330人参与
# 重来一次,我还会选择这个专业吗 #
433352次浏览 3926人参与
# 米连集团26产品管培生项目 #
5731次浏览 214人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186969次浏览 1122人参与
# 牛客AI文生图 #
21408次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152290次浏览 887人参与
# 研究所笔面经互助 #
118872次浏览 577人参与
# 简历中的项目经历要怎么写? #
310060次浏览 4193人参与
# AI时代,哪些岗位最容易被淘汰 #
63407次浏览 803人参与
# 面试紧张时你会有什么表现? #
30488次浏览 188人参与
# 你今年的平均薪资是多少? #
213009次浏览 1039人参与
# 你怎么看待AI面试 #
179861次浏览 1234人参与
# 高学历就一定能找到好工作吗? #
64313次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76436次浏览 374人参与
# 我的求职精神状态 #
447984次浏览 3128人参与
# 正在春招的你,也参与了去年秋招吗? #
363243次浏览 2637人参与
# 腾讯音乐求职进展汇总 #
160584次浏览 1111人参与
# 校招笔试 #
470425次浏览 2963人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务