EVERYTHING HAPPENS FOR T|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-05-24 16:05阅读: 81评论: 0推荐: 0

abc260_e At Least One 题解

At Least One

题意

给定一个整数 mn 对数 (ai,bi),我们定义一个 f(x) 函数表示满足以下要求的整数序列数量:

  • 整数序列为 (1,2,3m) 的一个子段且序列长度为 x
  • 对于 1in,满足 ai 或者 bi 在整数序列中出现过(可以都出现,不可以都不出现)。

f(1),f(2)f(m)

数据范围

  • 1n2×105
  • 2m2×105
  • 1ai<biM

思路

暴力

枚举左右端点,判断是否满足要求,统计答案。

时间复杂度:O(m2×n)

优化

枚举左右端点就 T 了,但我们能够发现:如果 (1,2,3m) 的一个区间 [l,r] 满足要求,则:

  • 对于所有 1il,rjm,区间 [i,j] 必然满足要求。

也就是说,对于每个左端点为 i,它对答案的贡献必然是一个区间。

枚举左端点,对于每个左端点 i 找到最小的 j 使得区间 [i,j] 满足要求,那么 f(ji+1),f((j+1)i+1)f(mi+1) 都要加一,这个很明显可以用差分维护。

对了,这个只能提供常数优化,重要的还是思想。

最终正解

枚举左端点 i 没问题,但暴力查找最小的 j 是会超时的,怎样优化这个 O(n×m) 呢?

又是一顿观察,我们可以发现:随着 i 从小到大,最小的 j 是单调不减的,可以考虑使用双指针,左指针每次加 1,那么右指针怎么更新呢?

  • 很显然,对于一个 1kn,如果 aki+1,那么对于它来说,右指针并不需要移动,只需保持 j 就行了。
  • 反之,如果 ak<i+1,那么 j 至少也要移动到 bk 去,即 jbk
  • 而如果 bk<i,那么就可以退出 i 循环了,后面的必然都不合法。

做法就出来了,先预处理出当左端点为 i 时,右端点至少为几,假设用 c 数组存储。

  • 对于每个 1incai+1=max(cai+1,bi)

然后就是枚举左端点 i,枚举的同时更新 ci,取前缀最大值即可,注意左端点最大为 min1in{bi}

复杂度

  • 时间:O(n+m)
  • 空间:O(m)

Code

挑战最短代码,不服来战。

点击查看代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 2e5 + 10;
int n, m, a, b, c[N], mr, ans[N];
int main () {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m;
mr = m;
for (int i = 1; i <= n; i++) {
cin >> a >> b;
c[0] = max(c[0], a), c[a + 1] = max(c[a + 1], b), mr = min(mr, b); // i = 1 时右端点至少为 max(a[i]),更新 c 数组
}
for (int i = 1; i <= mr; i++) {
c[i] = max({c[i - 1], c[i], i}); // 前缀最大值
ans[c[i] - i + 1]++, ans[m - i + 2]--; // 差分
}
for (int i = 1; i <= m; i++) {
ans[i] += ans[i - 1]; // 还原差分数组
cout << ans[i] << ' ';
}
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17428344.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(81)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
平凡之路 (Live版) - 朴树
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 朴树/韩寒

作曲 : 朴树

编曲 : 朴树

徘徊着的 在路上的

你要走吗 via via

易碎的 骄傲着

那也曾是我的模样

沸腾着的 不安着的

你要去哪 via via

谜一样的 沉默着的

故事你真的在听吗

我曾经跨过山和大海

也穿过人山人海

我曾经拥有着的一切

转眼都飘散如烟

我曾经失落失望失掉所有方向

直到看见平凡才是唯一的答案

当你仍然

还在幻想

你的明天 via via

她会好吗 还是更烂

对我而言是另一天

我曾经毁了我的一切

只想永远地离开

我曾经堕入无边黑暗

想挣扎无法自拔

我曾经像你像他像那野草野花

绝望着也渴望着

也哭也笑平凡着

jia do

la so

哦~

向前走 就这么走

就算你被给过什么

向前走 就这么走

就算你被夺走什么

向前走 就这么走

就算你会错过什么

向前走 就这么走

就算你会

我曾经跨过山和大海

也穿过人山人海

我曾经拥有着的一切

转眼都飘散如烟

我曾经失落失望失掉所有方向

直到看见平凡才是唯一的答案

我曾经毁了我的一切

只想永远地离开

我曾经堕入无边黑暗

想挣扎无法自拔

我曾经像你像他像那野草野花

绝望着 渴望着 也哭也笑平凡着

我曾经跨过山和大海

也穿过人山人海

我曾经问遍整个世界

从来没得到答案

我不过像你像他像那野草野花

冥冥中这是我 唯一要走的路啊

时间如烟

如此这般

明天已在 via via

风吹过的 路依然远

你的故事讲到了哪

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示