【CodeForces】576 C. Points on Plane

【题目】C. Points on Plane

【题意】给定坐标系中n个点的坐标(范围[0,10^6]),求一种 [ 连边形成链后总长度<=2.5*10^9 ] 的方案。n<=10^6。

【算法】思维题(分块思想)

【题解】将这个10^6*10^6的矩阵划分为1000个10^3*10^6的矩阵,第奇数个矩阵内部按y升序连边,第偶数个矩阵内部按y降序连边,两个矩阵之间就直接连边。

1.到达每个点横坐标要移动10^3,总距离10^9。

2.每个矩阵内部纵坐标要移动10^6,总距离10^9。

3.矩阵之间的连边,每次最长2*10^3,总距离2*10^6。

所以总距离为2*10^9+2*10^6,满足要求。

排序的实现和分块类似,复杂度O(n log n)。

#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
int read(){
    char c;int s=0,t=1;
    while(!isdigit(c=getchar()))if(c=='-')t=-1;
    do{s=s*10+c-'0';}while(isdigit(c=getchar()));
    return s*t;
}
const int maxn=1000010;
struct cyc{int x,y,id;}a[maxn];
int n;
bool cmp(cyc a,cyc b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
int main(){
    n=read();
    for(int i=1;i<=n;i++){
        a[i].x=read()/1000;
        a[i].y=read();
        if(a[i].x%2)a[i].y=-a[i].y;
        a[i].id=i;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)printf("%d ",a[i].id);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/8032541.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值