现在的位置: 首页 > 综合 > 正文

1878: [SDOI2009]HH的项链 (树状数组+离散化+离线处理)

2018年01月13日 ⁄ 综合 ⁄ 共 979字 ⁄ 字号 评论关闭
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000001;

inline int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x*f;
}
const int N = 50005;
int n, m, l = 1, mx, a[N], next[N], t[N], p[1000001];

struct data {
    int l, r, id, ans;
} q[4 * N];

inline bool cmp1(data a, data b) {
    return a.l == b.l ? a.r < b.r : a.l < b.l;
}

inline bool cmp2(data a, data b) {
    return a.id < b.id;
}

inline void update(int x, int v) {
    for (int i = x; i <= n; i += i & (-i))
        t[i] += v;
}

inline int ask(int x) {
    int res = 0;
    for (int i = x; i; i -= i & (-i))
        res += t[i];
    return res;
}

int main() {
    n = read();
    for (int i = 1; i <= n; i++) {
        a[i] = read();
        mx = max(a[i], mx);
    }
    for (int i = n; i; i--) {
        next[i] = p[a[i]];
        p[a[i]] = i;
    }
    for (int i = mx; i; i--)
        if (p[i])update(p[i], 1);
    m = read();
    for (int i = 1; i <= m; i++) {
        q[i].l = read();
        q[i].r = read();
        q[i].id = i;
    }
    sort(q + 1, q + m + 1, cmp1);
    for (int i = 1; i <= m; i++) {
        while (l < q[i].l) {
            if (next[l])update(next[l], 1);
            l++;
        }
        q[i].ans = ask(q[i].r) - ask(q[i].l - 1);
    }
    sort(q + 1, q + m + 1, cmp2);
    for (int i = 1; i <= m; i++)
        printf("%d\n", q[i].ans);
    return 0;
}

抱歉!评论已关闭.