bool cmp(query x, query y)
{
return pos[x.l]<pos[y.l] || (pos[x.l] == pos[y.l] && (pos[x.l]&1 ? x.r < y.r : x.r > y.r));
}
这一段cmp是利用奇偶进行优化。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define MAX_N 1000010
int n, qnum, ans;//n个数字,q组询问
int num[MAX_N], pos[MAX_N], vis[MAX_N], sum[MAX_N];
typedef struct Node
{
int l, r, pos;
}query;
query q[MAX_N];
bool cmp(query x, query y)
{
return pos[x.l]<pos[y.l] || (pos[x.l] == pos[y.l] && (pos[x.l]&1 ? x.r < y.r : x.r > y.r));
}
void del(int i)
{
vis[num[i]]--;
if(vis[num[i]] == 0)
ans--;
}
void add(int i)
{
vis[num[i]]++;
if(vis[num[i]] == 1)
ans++;
}
//求区间[i, j]中不同数字的数目
int main()
{
scanf("%d", &n);
for(int i = 1;i <= n;i++)
{
scanf("%d", &num[i]);
pos[i] = (i-1)/sqrt(n) + 1;//分块
}
scanf("%d", &qnum);
for(int i = 1;i <= qnum;i++)
{
scanf("%d%d", &q[i].l, &q[i].r);
q[i].pos = i;
}
sort(q + 1, q + 1 + qnum, cmp);
int l = 1,
r = 0;
for(int i = 1;i <= qnum;i++)
{
while(l < q[i].l)
{
del(l);
l++;
}
while(l > q[i].l)
{
l--;
add(l);
}
while(r < q[i].r)
{
r++;
add(r);
}
while(r > q[i].r)
{
del(r);
r--;
}
sum[q[i].pos] = ans;
}
for(int i = 1;i <= qnum;i++)
printf("%d\n", sum[i]);
return 0;
}