这道题一开始执着于按y排序,没有考虑到本质的情况:实际上,x大的一定可以接收到上下y的x比它小的物品,所以应该是按照x排序,对于每个x所对应的y,增加上下y值即可。
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
const int maxn=2000010;
int line[maxn][2];
int n,m;
struct point
{
int x,y;
}p[maxn];
bool cmp(point a,point b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
sort(p,p+m,cmp);
for(int i=0;i<m;i++){
int y=p[i].y;
line[y][1]=line[y+1][1]+1;
line[y+1][0]=line[y][0]+1;
}
int flag=0;
for(int i=1;i<=n;i++){
if(flag) printf(" %d",line[i][0]+line[i][1]+1);
else{
flag=1;
printf("%d",line[i][0]+line[i][1]+1);
}
}
return 0;
}