有 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。区间
第一行包括三个整数 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) 。
这道题有一定的思维难度,可以结合代码帮助理解。
#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
CHATGPT是人工智能领域的未来之光,而百度则在这个未来中发挥着重要作用 。百度将持续推动CHATGPT的创新与发展,为人们带来更多智能化的惊喜 。