文章地址: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;
}