【树状数组】Cows (POJ2481)
Time Limit:1000MS
Total Submit:16 Accepted:8
Description
【问题描述】
约翰是一个农民,他养了一群羊,一群很喜欢吃山上的三叶草的羊。所有的三叶草都生长在一条直线上,味道十分美妙。
约翰有N头牛,分别叫牛1到牛N。每头牛都有特别中意的三叶草范围,记为[S,E]——这是直线上的一个区间。不同牛喜欢的三叶草范围之间可能重叠。
有些牛比较强壮,有些牛比较弱小。给定两头牛:牛i和牛j。它们喜欢的三叶草范围分别为[Si, Ei]和[Sj, Ej]。如果Si <=Sj 并且 Ej <=Ei 并且 Ei-Si > Ej-Sj,那么就认为牛i比牛j更强壮。
对于每头牛,有多少头牛比它更强壮呢?约翰请你来帮忙。
Input
输入包括多组数据。对于每组数据,第一行是整数N (1 <= N <= 105),表示牛的头数。接下来N行,第i行有两个整数S和E(0 <= S < E <= 105),表示牛i喜欢的三叶草区间。
最后一组数据只有0,表示结束。
Output
对于每组测试数据,输出一行,包括n个用空格分开的整数,第i个整数表示比牛i更强壮的牛的数目。
Sample Input
3 1 2 0 3 3 4 0
Sample Output
1 0 0
Hint
对于C/C++程序员:数据规模较大,建议采用scanf 和 printf。
请将你的程序在 http://poj.org/problem?id=2481 上提交测试是否能通过!
Source
POJ2481
这题想了好久,也上网看了不少解题报告,都是说“和 数星星 那道题一样”,我却怎么也不明白,而且网上给的程序都是用C语言写的。很是郁闷。
其实这题给出区间边界x,y
先按 y从大到小排序,y相等的从小到大排序
树状数组的下标为x,把排好序的数组从头到尾扫一遍,把结果储存在另一个数组。
这题我先是超时,检查了好久,竟发现是快排写错了。少了个while循环。
然后又是WA,对两个区间完全相同的情况处理错了。
并且,POJ上是多组数据,而我得到的翻译版本竟是单组数据。。
var
procedure init;
var
begin
end;
procedure qsort1(x,y:longint);
var
begin
end;
function find(i:longint):longint;
begin
end;
procedure add(i:longint);
begin
end;
procedure main;
var
begin
end;
procedure print;
var
begin
end;
begin
end.