zcmu1607: Auskragende Dornenstränge des zweiten Jahres (baumartige Anordnung)

Link: https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1607

Thema

n Zahl ai, q mal Abfrage, fragen, wie viele Zahlen zwischen 1 und x größer sind als a [x]

Ideen

Diskretisierung + Baumarray-Offline-Verarbeitung

Verwenden Sie eine eindeutige Diskretisierung, um die relative Größe zu ermitteln. Anschließend können Sie mithilfe des Baumarrays aufzeichnen, wie viele Stellen vor dem i-ten Bit größer als er sind, das ans-Array aufzeichnen und bei der Anfrage direkt auf das ans-Array zugreifen

AC-Code

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define lowbit(x) x&(-x)
const int maxn = 1e5 + 500;
int a[maxn], b[maxn], ans[maxn], c[maxn];
void add(int x, int k){
    for(int i = x; i < maxn; i += lowbit(i))
        c[i] += k;
}
int get(int x){
    int ans = 0;
    for(int i = x; i > 0; i -= lowbit(i))
        ans += c[i];
    return ans;
}
int main(){
    int n, q;
    while(~scanf("%d",&n)){
        if(n == -1) break;
        memset(c, 0, sizeof(c));
        for(int i = 1; i <= n; i ++){
            scanf("%d",&a[i]);
            b[i] = a[i];
        }
        sort(b + 1, b + n + 1);
        int m = unique(b + 1, b + n + 1) - b;
        for(int i = 1; i <= n; i ++){
            int x = (n + 5) - (lower_bound(b + 1, b + m + 1, a[i]) - b); //保证所有数都大于0就成
            ans[i] = get(x);
            add(x, 1);
        }
        scanf("%d",&q);
        while(q --){
            int x; scanf("%d",&x);
            printf("%d\n",ans[x]);
        }
    }
    return 0;
}

 

Ich denke du magst

Origin blog.csdn.net/weixin_43911947/article/details/112353375
Empfohlen
Rangfolge