| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
尼玛!一道逆序数纠结我好几天,终于AC,庆祝一下,靠!!!#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,b[100010],c[100010];
int nima;
struct node{
int t1;
int t2;
int num;
}a[100010];
bool cmp(struct node a,struct node b)
{
if(a.t1==b.t1)
return a.t2<b.t2;
return a.t1>b.t1;
}
int lowbit(int x)
{
return x&(-x);
}
void insert(int x)
{
while(x<=nima)
{
c[x]+=1;
x=x+lowbit(x);
}
}
int sum(int x,int y)
{
int s=0;
while(y>=x)
{
s+=c[y];
y=y-lowbit(y);
}
return s;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF&&n)
{
nima=-1;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i].t1,&a[i].t2);
a[i].num=i;
if(nima<a[i].t2)
nima=a[i].t2;
}
memset(c,0,sizeof(c));
sort(a+1,a+n+1,cmp);
/*for(i=1;i<=n;i++)
printf("%d %d\n",a[i].t1,a[i].t2);*/
b[a[n].num]=sum(a[n].t2,nima)-sum(1,a[n].t2-1);
insert(a[n].t2);
for(j=1,i=n-1;i>=1;i--,j++)
{
if(a[i].t1!=a[i+1].t1||a[i].t2!=a[i+1].t2)
b[a[i].num]=j-sum(1,a[i].t2-1);
else
b[a[i].num]=b[a[i+1].num];
insert(a[i].t2);
}
/* for(i=1;i<=n;i++)
printf("%d ",c[i]);
printf("\n");*/
for(i=1;i<n;i++)
printf("%d ",b[i]);
printf("%d\n",b[n]);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator