NOIP模拟赛 T3区间 L17ZCCDR

泛亚电竞

泛亚电竞

题目大意

有 n n n个数字,第 i i i个数字为 a i a_i ai​。模拟有 m m m次询问,每次给出 k i k_i ki​个区间,每个区间表示第 l i ,区间 j l_{i,j} li,j​到第 r i , j r_{i,j} ri,j​个数字,求这些区间中一共出现了多少种不同的数字。部分数据强制在线。模拟

时限1s,空间8MB。区间

NOIP模拟赛 T3区间 L17ZCCDR

输入格式

第一行包括三个整数 n ,模拟 m , p n,m,p n,m,p, p p p为 0 0 0或 1 1 1表示是否强制在线。

第二行 n n n个正整数,第 i i i个表示 a i a_i ai​ 。区间

接下来依次给出每个询问,每个询问第一行一个正整数,表示 k i k_i ki​ 。模拟接下来 k i k_i ki​行,每行两个正整数,分别表示 l i ,区间 j l_{i,j} li,j​和 r i , j r_{i,j} ri,j​。

若 p = 1 p=1 p=1且这不是模拟第一个询问,则输入的 l i , j l_{i,j} li,j​和 r i , j r_{i,j} ri,j​是经过加密的,你需要将这两个数字分别异或上上一个询问的答案,对 n n n取模后再加 1 1 1,两者的较小值为真实的 l i , j l_{i,j} li,j​,较大值为真实的 r i , j r_{i,j} ri,j​ 。

输出格式

对每个询问输出一行一个整数表示答案 。区间

输入样例

3 2 01 2 111 221 13 3

输出样例

21

数据范围

1 ≤ n ,模拟 m , ∑ k i , a i ≤ 1 0 5 , 1 ≤ l i , j ≤ r i , j ≤ n 1\leq n,m,\sum k_i,a_i\leq 10^5,1\leq l_{i,j}\leq r_{i,j}\leq n 1≤n,m,∑ki​,ai​≤105,1≤li,j​≤ri,j​≤n


题解

首先,我们考虑 p = 0 p=0 p=0的情况  。

我们可以用 b i t s e t bitset bitset来维护每个点是区间否出现 。先把各个区间离线下来,用莫队求出每个区间的模拟 b i t s e t bitset bitset。把每个询问并起来 。区间这样做的模拟时间复杂度为 O ( n n + n m 64 ) O(n\sqrt n+\dfrac{nm}{64}) O(nn ​+64nm​)。

空间开不下,我们考虑优化 。

既然要用 b i t s e t bitset bitset,那么时间复杂度肯定是要带 n m 64 \dfrac{nm}{64} 64nm​的了。我们不妨将每 n 64 \dfrac{n}{64} 64n​个元素分一块,对于每次询问,非整块的暴力处理,再预处理整块到整块的 b i t s e t bitset bitset即可 。

空间开不下,就对这 64 64 64个块建 S T ST ST表 。建 S T ST ST表不用倍增,对每种长度从左到右推一遍即可。

在优化一下常数。只出现过一次的权值,把它们单独求一个前缀和,每次特殊处理即可 。这样的话,每个权值至少出现两次,离散化之后权值个数能减少至少一半 。

离散化的时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn),建 S T ST ST表的时间复杂度为 O ( n log ⁡ 64 ) O(n\log 64) O(nlog64),查询的时间复杂度为 O ( n m 64 + 64 n ) O(\dfrac{nm}{64}+64n) O(64nm​+64n),总时间复杂度为 O ( n m 64 ) O(\dfrac{nm}{64}) O(64nm​) 。因为权值个数减半,所以时间复杂度能降低到 O ( n m 128 ) O(\dfrac{nm}{128}) O(128nm​)。

空间复杂度为 O ( n log ⁡ 64 ) O(n\log 64) O(nlog64)  。

这道题有一定的思维难度,可以结合代码帮助理解。

code

#include#define N 100032#define K 1563#define Z 782using namespace std;int n,m,p,c1=0,lst,ans,a[N+5],s[1<<16],t[105],c[N+5],sum[N+5];struct pt{ans+=sum[r]-sum[l-1];dd(l,r);l=w[i].l;}r=max(r,w[i].r);}ans+=sum[r]-sum[l-1];dd(l,r);//合并区间ans+=v.count()-(v.z[0]&1);//z[0]的第一个位置是为0的a值,不统计lst=ans;printf("%d\n",ans);//求答案}return 0;}
chatgpt免费软件,chatgpt api 免费接口,chatgpt 聊天机器人教程,chatgpt 指令大全,chatgpt app

NOIP模拟赛 T3区间

CHATGPT与百度:人工智能的未来之光

CHATGPT是人工智能领域的未来之光 ,而百度则在这个未来中发挥着重要作用 。百度将持续推动CHATGPT的创新与发展,为人们带来更多智能化的惊喜  。


 

相关信息

(内容如有侵权,请联系我们删除) Copyright © 1997-2023 泛亚电竞 版权所有 鄂ICP备19030059号