社区讨论

萌新求助

CF1000FOne Occurrence参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@loct1wkq
此快照首次捕获于
2023/10/30 19:16
2 年前
此快照最后确认于
2023/11/05 05:56
2 年前
查看原帖
RT,此题WA on #3, 不知道为什么,求大佬解答
CPP
#include <bits/stdc++.h>
using namespace std;
#define R register int
const int N = 5e5 + 10;
int a[N], cnt[N], n, m, tag[N], Ans[N];
struct node {
    int l, r, op, id;
}q[N];
stack <int> s;
bool inline cmp (register node x, register node y) {
    return (x.op  ^ y.op) ? x.l < y.l : ((x.op & 1) ? x.r < y.r : x.r > y.r);
}
void inline add(int x) {
    if(cnt[x] == 1) tag[x] ++;
    cnt[x] ++;
    if(cnt[x] == 1)
        if(tag[x]) tag[x] --;
        else s.push(x);
}
void inline del(int x) {
    if(cnt[x] == 1) tag[x] ++;
    cnt[x] --;
    if(cnt[x] == 1)
        if(tag[x]) tag[x] --;
        else s.push(x);
}
int main () {
    scanf("%d", &n);
    int size = sqrt(n);
    for(R i = 1; i <= n; i ++)
        scanf("%d", &a[i]);
    scanf("%d", &m);
    for(R i = 1; i <= m; i ++) {
        scanf("%d%d", &q[i].l, &q[i].r);
        q[i].id = i; q[i].op = (q[i].l - 1) / size + 1;
    }
    sort(q + 1, q + m + 1, cmp);
    int l = 1, r = 0;
    for(R i = 1; i <= m; i ++) {
        while(q[i].l < l) add(a[-- l]);
        while(q[i].l > l) del(a[l ++]);
        while(q[i].r > r) add(a[++ r]);
        while(q[i].r < r) del(a[r --]);
        while(!s.empty() && tag[s.top()]) s.pop();
        if(!s.empty()) Ans[q[i].id] = s.top();
    }
    for(R i = 1; i <= m; i ++)
        printf("%d\n", Ans[i]);
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...