标签:des style os io ar strong for 数据 art
Description
Input
Output
Sample Input
3 1 2 0 3 3 4 0
Sample Output
1 0 0
Hint
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int d1[1000000],maxn,d[1000000]; //d1[]为树状数组,d[]存比当前牛强壮的牛的个数
struct node
{
int g,h,y;
}t[1000000];
int cmp(struct node a,struct node b) //排序以g从大到小排序
{
if(a.h==b.h)
return a.g<b.g;
return a.h>b.h;
}
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)
{
int res=0;
while(x>0)
{
res+=d1[x];
x-=lowbit(x);
}
return res;
}
void add(int x)
{
while(x<=maxn)
{
d1[x]++;
x+=lowbit(x);
}
}
int main()
{
int a,b,i,j,n;
while(scanf("%d",&n)&&n)
{
maxn=0;
memset(d1,0,sizeof(d1));
memset(d,0,sizeof(d));
for(i=0;i<n;i++)
{
scanf("%d%d",&t[i].g,&t[i].h);
t[i].y=i;
t[i].g++,t[i].h++; //避免0进入树状数组
if(t[i].g>maxn)
maxn=t[i].g;
}
sort(t,t+n,cmp); //排完序后就和星星那道题像了
d[t[0].y]=sum(t[0].g);
add(t[0].g);
for(i=1;i<n;i++)
{
if(t[i].g==t[i-1].g&&t[i].h==t[i-1].h) //如果当前点与前一个店相同,比他强壮的牛数就和去前面的牛一样
d[t[i].y]=d