zcmu1607:2年目の片持ちのとげのストランド(木のような配列)

リンク:https//acm.zcmu.edu.cn/JudgeOnline/problem.php?id = 1607

トピック

n個のai、q回のクエリ、1からxまでの数がa [x]よりも大きいかどうかを尋ねます

アイデア

離散化+ツリー配列オフライン処理

一意の離散化を使用して相対サイズを知ると、ツリー配列を使用して、i番目のビットが彼よりも大きい前の桁数を記録し、ans配列を記録してから、照会時にans配列に直接アクセスできます。

ACコード

#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;
}

 

おすすめ

転載: blog.csdn.net/weixin_43911947/article/details/112353375