HDU 4417

(オフライン+フェンウィックの木|木の会長)
質問の意味:考えます N N < 105 多数の AA< 109 M M < 105 一つは、BEGを求め、それぞれの時間を尋ねました [ L R ] 以下でレンジ HH< 109 どのように多くの数字?

1つのアイデア:私たちの意志の配列 A 小規模から大規模まで、と根拠を尋ねます H 小規模から大規模なソートします。そして、それぞれの時間は、列挙するクエリは、現在よりも少ない中で、すべてのお問い合わせは、インサートツリー状の配列に出かけます H デジタル A 、これは、要件を満たすために、クエリ間隔の結果です。要するに、このアイデアは、オフライン処理方法がより少ない」硬化します H 「条件は間隔フェンウィックツリーが変更の問い合わせの対象となったようなものである。
(注ながら書かれたという記述を挿入 A 時間 クロスボーダーないでください)

アイデア2:木の会長、もっとすべき

コード1:

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 100010;

int a[maxn], ans[maxn], tree[maxn];
struct Num {
    int num, pos;
    Num(){}
    Num(int a, int b):num(a),pos(b){}
    bool operator < (const Num &A) const {
        return num < A.num;
    }
}mynum[maxn];
struct Query {
    int id, l, r, mx;
    Query(){}
    Query(int a, int b, int c, int d):id(a),l(b),r(c),mx(d){}
    bool operator < (const Query &A)const {
        return mx < A.mx;
    }
}qu[maxn];

int lowbit(int x) {
    return x&(-x);
}

void update(int pos, int num) {
    for(int i=pos; i<maxn; i+=lowbit(i))
        tree[i] += num;
}

int get_sum(int pos) {
    int ret = 0;
    for(int i=pos; i>0; i-=lowbit(i))
        ret += tree[i];
    return ret;
}

int main() {
    int T, n, m, cas = 0;
    scanf("%d",&T);
    while(T --) {
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++) {
            scanf("%d",&a[i]);
            mynum[i] = Num(a[i], i);
        }
        sort(mynum+1, mynum+n+1);
        for(int i=1; i<=m; i++) {
            int l, r, mx;
            scanf("%d%d%d",&l,&r,&mx);
            qu[i] = Query(i, l+1, r+1, mx);
        }
        sort(qu+1, qu+m+1);
        memset(tree, 0, sizeof(tree));
        int cur = 1;
        for(int i=1; i<=m; i++) {
            while(cur <= n && mynum[cur].num <= qu[i].mx) {
                update(mynum[cur].pos, 1);
                cur ++;
            }
            int tot = get_sum(qu[i].r) - get_sum(qu[i].l-1);
            //printf("get : %d %d\n",get_sum(qu[i].r),get_sum(qu[i].l-1));
            ans[qu[i].id] = tot;
        }
        printf("Case %d:\n",++cas);
        for(int i=1; i<=m; i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}
公開された40元の記事 ウォン称賛44 ビュー90000 +

おすすめ

転載: blog.csdn.net/Site1997/article/details/78815171