#include <map>
#include <set>
#include <list>
#include <cmath>
#include<cctype>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
#define MAXN 100005
using namespace std;
int gcd(int a, int b)
{
return a % b == 0 ? b : gcd(b, a % b);
}
int input[MAXN];
LL N;
LL C[MAXN];
LL ans[MAXN];
struct node
{
LL x,y;
friend bool operator <(const node &a,const node &b)
{
if (a.y==b.y)
{
return a.x<b.x;
}
else return a.y<b.y;
}
}tree[MAXN];
void update(LL pos,LL val)
{
while (pos<=MAXN) //MAXN为总长度
{
C[pos]+=val;
pos+=pos&-pos;
}
}
int read(int pos)
{
int ans=0;
while (pos>0)
{
ans+=C[pos];
pos-=pos&-pos;
}
return ans;
}
void show()
{
for (int i=0;i<N;i++)
printf("%lld %lld\n",tree[i].x,tree[i].y);
}
void init()
{
memset(C,0,sizeof(C));
memset(ans,0,sizeof(ans));
for (LL i=0;i<N;i++)
{
scanf("%lld%lld",&tree[i].x,&tree[i].y);
tree[i].x++;tree[i].y++;
}
sort(tree,tree+N);
//show();
}
void slove()
{
init();
for (LL i=0;i<N;i++)
{
ans[read(tree[i].x)]++;
update(tree[i].x,1);
}
for (int i=0;i<N;i++)
{
printf("%lld\n",ans[i]);
}
}
int main()
{
while (scanf("%lld",&N)==1)
{
slove();
}
return 0;
}
CDOJ 数据结构训练F 树状数组
最新推荐文章于 2024-08-09 23:16:53 发布