| ||||||||||
| 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了 贴代码庆祝一下 两点:E可能等于0,所以要加一,以及注意前后奶牛相等的情况
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int C[1000001];
int maxL;
int N;
struct point{
int S;
int E;
int index;
bool operator<(const point& rhs)const{
if (E == rhs.E)
return S<rhs.S;
return E>rhs.E;
}
}a[100005];
int lowbit(int x){
return x&(-x);
}
int sum(int x){
int ret = 0;
while(x>0){
ret += C[x];
x-=lowbit(x);
}
return ret;
}
void add(int x ,int d){
while(x<=maxL){
C[x] += d;
x += lowbit(x);
}
}
int main(){
while (true){
scanf("%d",&N);
if (N==0)
break;
int ans[1000000];
maxL = 0;
memset(C,0,sizeof(C));
memset(ans,0,sizeof(ans));
for (int i = 0;i<N;++i){
scanf("%d %d",&a[i].S,&a[i].E);
a[i].S ++;
a[i].E ++;
if (a[i].S > maxL)
maxL = a[i].S;
a[i].index = i;
}
sort(a,a+N);
for (int i = 0;i<N;++i){
if (i == 0){
add(a[0].S,1);
continue;
}
if (i>0){
if (a[i].S == a[i-1].S && a[i].E== a[i-1].E)
ans[a[i].index]= ans[a[i-1].index];
else {
ans[a[i].index]= sum(a[i].S);
}
add(a[i].S,1);
}
}
for (int i = 0;i<N-1;++i){
printf("%d ",ans[i]);}
printf("%d\n",ans[N-1]);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator