社区讨论
莫队怎么你了但是TLE
P1972[SDOI2009] HH 的项链参与者 5已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lo1cl9gt
- 此快照首次捕获于
- 2023/10/22 18:50 2 年前
- 此快照最后确认于
- 2023/11/02 19:10 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct node {
int l, r, k;
}q[N];
int pos[N], ans[N], cnt[N];
int a[N];
void read(int &k) {
int t = 0, f = 1;
char c = getchar();
while(c < '0' or c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' and c <= '9') {
t = t * 10 + c - '0';
c = getchar();
}
k = f * t;
}
bool cmp(node x, node y) {
if(pos[x.l] != pos[y.l])
return pos[x.l] < pos[y.l];
if(pos[x.l] & 1)
return x.r > y.r;
return x.r < y.r;
}
int Ans = 0;
void add(int x) {
cnt[a[x]]++;
if(cnt[a[x]] == 1)
Ans++;
}
void del(int x) {
cnt[a[x]]--;
if(cnt[a[x]] == 0)
Ans--;
}
int m, n;
int main() {
//std::ios::sync_with_stdio(0);
read(n);
int block = sqrt(n);
for(int i = 1; i <= n; i++) {
read(a[i]);
pos[i] = (i - 1) / block + 1;
}
cin>>m;
for(int i = 1; i <= m; i++) {
read(q[i].l);
read(q[i].r);
q[i].k = i;
}
sort(q + 1, q + m + 1, cmp);
int l = 1, r = 0;
for(int i = 1; i <= m; i++) {
while(l < q[i].l) del(l++);
while(r > q[i].r) del(r--);
while(l > q[i].l) add(--l);
while(r < q[i].r) add(++r);
ans[q[i].k] = Ans;
}
for(int i = 1; i <= m; i++)
printf("%d\n", ans[i]);
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...