专栏文章
题解: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.题目大意
给定 和 对整数 ,要求对于每个 (),计算满足以下条件的连续子数组 (长度为 )的数量:对于每一对 ,子数组至少包含 或 中的一个。
2.解题思路
本题的核心在于高效地统计满足条件的子数组数量。我们可以利用差分数组和贪心思想来优化计算。
注意:
- 单调性:如果子数组 满足条件,那么任何包含 的子数组也一定满足条件。
- 最小区间:对于每个 ,存在一个最小的 使得 满足条件,且这个 随 增加而单调不减。
算法步骤
- 预处理:对于每对 ,记录其影响的范围。
- 差分数组:通过差分数组高效统计每个 对应的满足条件的子数组数量。
- 后缀和:利用后缀和计算最终答案。
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 条评论,欢迎与作者交流。
正在加载评论...