POJ 2481 Cows(树状数组)

文章地址:http://henuly.top/?p=602

题目:

Farmer John’s cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in his field is particularly good.

Farmer John has N cows (we number the cows from 1 to N). Each of Farmer John’s N cows has a range of clover that she particularly likes (these ranges might overlap). The ranges are defined by a closed interval [S,E].

But some cows are strong and some are weak. Given two cows: cowi and cowj, their favourite clover range is [Si, Ei] and [Sj, Ej]. If Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj, we say that cowi is stronger than cowj.

For each cow, how many cows are stronger than her? Farmer John needs your help!

Input:

The input contains multiple test cases.

For each test case, the first line is an integer N (1 <= N <= 105), which is the number of cows. Then come N lines, the i-th of which contains two integers: S and E(0 <= S < E <= 105) specifying the start end location respectively of a range preferred by some cow. Locations are given as distance from the start of the ridge.

The end of the input contains a single 0.

Output:

For each test case, output one line containing n space-separated integers, the i-th of which specifying the number of cows that are stronger than cowi.

Sample Input:

3
1 2
0 3
3 4
0

Sample Output:

1 0 0

题目链接

树状数组,将牛的S值看做坐标系上的横坐标x,E值看做坐标系上的纵坐标y,所要求的就是每个点左上方有多少个点(Ei - Si > Ej - Sj表示E和S同时相等不算),这么转换着理解就和HDU 1541、POJ 2352很像,不过需要先排序。

HDU 1541 POJ 2352 Stars (树状数组)

AC代码:

#pragma comment(linker, "/STACK:102400000,102400000")
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+5;
const int mod = 1e9+7;
const double eps = 1e-8;
const double pi = asin(1.0)*2;
const double e = 2.718281828459;
bool Finish_read;
template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}

struct clover {
    int S, E, id;
    clover(int _S = 0, int _E = 0, int _id = 0): S(_S), E(_E), id(_id) {}
};

int n;
int cnt[maxn];
int c[maxn];

bool cmp(clover a, clover b) {
    if (a.E == b.E) {
        return a.S < b.S;
    }
    return a.E > b.E;
}

void update(int x) {
    while (x < maxn) {
        c[x]++;
        x += lowbit(x);
    }
}

int getSum(int x) {
    int ans = 0;
    while (x > 0) {
        ans += c[x];
        x -= lowbit(x);
    }
    return ans;
}

int main(int argc, char *argv[]) {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    while (~scanf("%d", &n) && n) {
        mem(c, 0);
        mem(cnt, 0);
        vector<clover> cow;
        for (int i = 0, S, E; i < n; ++i) {
            read(S); read(E);
            clover add;
            add.S = S + 1;
            add.E = E + 1;
            add.id = i;
            cow.pb(add);
        }
        sort(cow.begin(), cow.end(), cmp);
        vector<int> ans(n);
        for (int i = 0; i < n; ++i) {
            int temp = i;
            for (int j = i - 1; j >= 0; --j) {
                if (cow[j].S == cow[i].S) {
                    if (cow[j].E == cow[i].E) {
                        temp = j;
                        continue;
                    }
                }
                break;
            }
            if (temp != i) {
                ans[cow[i].id] = ans[cow[temp].id];
            }
            else {
                ans[cow[i].id] = getSum(cow[i].S);
            }
            update(cow[temp].S);
        }
        for (int i = 0; i < n; ++i) {
            printf("%d", ans[i]);
            if (i != n - 1) {
                printf(" ");
            }
            else {
                printf("\n");
            }
        }
    }
#ifndef ONLINE_JUDGE
    fclose(stdin);
    fclose(stdout);
    system("gedit out.txt");
#endif
    return 0;
}

猜你喜欢

转载自blog.csdn.net/tony5t4rk/article/details/81163306
今日推荐