专栏文章

题解:AT_abc260_e [ABC260E] At Least One

AT_abc260_e题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mipsmop3
此快照首次捕获于
2025/12/03 17:17
3 个月前
此快照最后确认于
2025/12/03 17:17
3 个月前
查看原文

[ABC260E] At Least One - 题解

1.题目大意

给定 mmnn 对整数 (ai,bi)(a_i, b_i),要求对于每个 kk1km1 \leq k \leq m),计算满足以下条件的连续子数组 [l,r][l, r](长度为 kk)的数量:对于每一对 (ai,bi)(a_i, b_i),子数组至少包含 aia_ibib_i 中的一个。

2.解题思路

本题的核心在于高效地统计满足条件的子数组数量。我们可以利用差分数组贪心思想来优化计算。

注意:

  1. 单调性:如果子数组 [l,r][l, r] 满足条件,那么任何包含 [l,r][l, r] 的子数组也一定满足条件。
  2. 最小区间:对于每个 ll,存在一个最小的 rr 使得 [l,r][l, r] 满足条件,且这个 rrll 增加而单调不减。

算法步骤

  1. 预处理:对于每对 (ai,bi)(a_i, b_i),记录其影响的范围。
  2. 差分数组:通过差分数组高效统计每个 kk 对应的满足条件的子数组数量。
  3. 后缀和:利用后缀和计算最终答案。

code

CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int s[200010],a[200010],ans[200010],n,m;

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int xx,yy,ss=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {
        scanf("%d%d",&xx,&yy);
        a[1]=max(a[1],xx-1);
        a[xx+1]=max(a[xx+1],yy-xx-1);
        a[yy+1]=max(a[yy+1],m-yy);
    }
    for(int i=1;i<=m;i++) {
        a[i+1]=max(a[i+1],a[i]-1);
    }
    for(int i=1;i<=m;i++) {
        s[a[i]]++;
    }
    for(int i=m;i>=1;i--) {
        ss+=s[i];
        ans[i]=m-i+1-ss;
    }
    for(int i=1;i<=m;i++) {
        printf("%d ",ans[i]);
    }
    return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...