这道题一开始执着于按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;
}
本文探讨了在二维平面上解决信号接收问题的方法。通过分析发现,关键在于按照横坐标x进行排序,而非纵坐标y。对于每个点,通过更新对应纵坐标y的上下值来统计信号覆盖范围,实现高效求解。
&spm=1001.2101.3001.5002&articleId=82864273&d=1&t=3&u=4c8b07764a4542d0a5686a8e2528034b)
4296

被折叠的 条评论
为什么被折叠?



