在做这一题时,首先想到了树状数组。可开始敲起代码来,就敲到了dp。呵呵。现在想来,好像不太现实。估计如果真要dp的话,得敲得树形DP了。
具体的数状数组做法如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 100010
int c[maxn];
int ans[300010],n;
struct node
{
int x,y,no;
}a[300010];
int lowbit(int i)
{return i&(-i);}
int sum(int i)
{
int s=0;
for(;i>0;i-=lowbit(i))
s+=c[i];
return s;
}
void update(int i)
{
for(;i<=maxn;i+=lowbit(i))
c[i]++;
}
int cmp(const void *a,const void *b)
{
node *aa=(node *)a;
node *bb=(node *)b;
if(aa->x!=bb->x)
return aa->x-bb->x;
else
return aa->y-bb->y;
}
int main()
{
int i,j;
while(~scanf("%d",&n))
{
memset(c,0,sizeof(c));
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].no=i;
}
qsort(a,n,sizeof(a[0]),cmp);
i=0;
while(1)
{
if(i==n)break;
ans[a[i].no]=sum(a[i].y);
update(a[i].y);
int temp=i;
for(temp=i;temp&&a[i].x==a[temp-1].x;temp--)//排除两者都相等的
{
if(a[i].y==a[temp-1].y)
ans[a[i].no]--;
else break;
}
i++;
}
for(j=0;j<n;j++)
{
printf("%d\n",ans[j]);
}
}
return 0;
}