题意:有n只奶牛,每一只有自己的强度,用闭区间 [ l, r ] 表示, 若有两只奶牛,强度分别为 A = [ a, b ], B = [ c, d ],当c <= a 且 b <= d 且 b-a != d-c 时, 说牛B比牛A强。对于每一头奶牛,求比它强的奶牛数。
题解:注意排序的选择,选s还是t,升序还是降序,都有影响,要保持树状数组的性质,更新时最好向上,求和时最好向下。
另外,将这题的左右区间变成坐标的话,有点类似stars那题。
#include <iostream>
using namespace std;
#define N 100005
int c[N], num[N], n;
struct item
{
int s, t, id;
} node[N];
int cmp ( const void* a, const void* b )
{
item* first = (item*)a;
item* second = (item*)b;
if ( first->t == second->t ) /* t降序,t相同时s升序。当然换一种方式也可以对先对s排序,具体讨论 */
return first->s - second->s;
return second->t - first->t;
}
int lowbit ( int x )
{
return x & ( -x );
}
void update ( int x )
{
for ( int i = x; i <= N; i += lowbit(i) )
c[i]++;
}
int getSum ( int x )
{
int sum = 0;
for ( int i = x; i > 0; i -= lowbit(i) )
sum += c[i];
return sum;
}
int main()
{
int l, r, i;
while ( scanf("%d",&n) && n )
{
memset(c,0,sizeof(c));
for ( i = 1; i <= n; ++i )
{
scanf("%d%d",&l, &r);
node[i].s = l + 1;
node[i].t = r + 1;
node[i].id = i;
}
qsort(node+1,n,sizeof(item),cmp);
for ( i = 1; i <= n; ++i )
{
if ( node[i].s == node[i-1].s && node[i].t == node[i-1].t ) /* 相同处理 */
{
update ( node[i].s );
num [ node[i].id ] = num [ node[i-1].id ];
continue;
}
else
{
num[ node[i].id ] = getSum ( node[i].s );
update ( node[i].s );
}
}
for ( i = 1; i < n; ++i )
printf("%d ", num[i]);
printf("%d\n",num[i]);
}
return 0;
}