博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #319 (Div. 1) C. Points on Plane 分块
阅读量:6612 次
发布时间:2019-06-24

本文共 2265 字,大约阅读时间需要 7 分钟。

C. Points on Plane

Time Limit: 1 Sec  

Memory Limit: 256 MB

题目连接

http://codeforces.com/contest/576/problem/C

Description

On a plane are n points (xiyi) with integer coordinates between 0 and 106. The distance between the two points with numbers a and bis said to be the following value:  (the distance calculated by such formula is called Manhattan distance).

We call a hamiltonian path to be some permutation pi of numbers from 1 to n. We say that the length of this path is value .

Find some hamiltonian path with a length of no more than 25 × 108. Note that you do not have to minimize the path length.

Input

The first line contains integer n (1 ≤ n ≤ 106).

The i + 1-th line contains the coordinates of the i-th point: xi and yi (0 ≤ xi, yi ≤ 106).

It is guaranteed that no two points coincide.

Output

Print the permutation of numbers pi from 1 to n — the sought Hamiltonian path. The permutation must meet the inequality .

If there are multiple possible answers, print any of them.

It is guaranteed that the answer exists.

Sample Input

5

0 7
8 10
3 4
5 0
9 12

Sample Output

4 3 1 2 5 

HINT

In the sample test the total distance is:

(|5 - 3| + |0 - 4|) + (|3 - 0| + |4 - 7|) + (|0 - 8| + |7 - 10|) + (|8 - 9| + |10 - 12|) = 2 + 4 + 3 + 3 + 8 + 3 + 1 + 2 = 26

题意

给你一个曼哈顿距离的图,然后要求你找到一个链,链穿了所有的点

然后要求这链的长度<=25*10e8

题解:

就分块咯,分成1000块,每个块内y坐标最多走10e6长度,x坐标最多走n*10e3个,n表示一块内的点数

n是一个二次函数维护的东西……所以大概答案最后就是10e3(10e6+10e6) = 2*10e9

所以大概看看脸,就能把这道题AC了

代码:

//qscqesze#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef long long ll;using namespace std;//freopen("D.in","r",stdin);//freopen("D.out","w",stdout);#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)#define maxn 1000500#define mod 1001#define eps 1e-9#define pi 3.1415926int Num;//const int inf=0x7fffffff;const ll inf=999999999;inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}//*************************************************************************************pair
> p[maxn];int main(){ int n=read(); for(int i=0;i

 

转载地址:http://tzaso.baihongyu.com/

你可能感兴趣的文章
小程序引入多个e-charts
查看>>
Node.js实现热加载
查看>>
PLSQL_Oracle基本概念总结(汇总)
查看>>
分布式icinga2安装与使用
查看>>
【ASP.NET程序员福利】打造一款人见人爱的ORM(二)
查看>>
video设置视频的宽高
查看>>
C#学习九之WPF应用使用SQLite数据库详解
查看>>
【原创】Mindjet Manager思维导图软件云服务功能的使用方法
查看>>
MVC 防止 CSRF 的方法
查看>>
不使用xib创建iphone window
查看>>
sqlserver 连接查询的问题,a表无重复记录,与b表中的记录为1对N关系,如何在查得a表信息时统计b表记录数...
查看>>
2018.5.7每天一题面试题----面向对象的特征
查看>>
Jquery 弹出框出插件 仿IOS效果
查看>>
paper 8:支持向量机系列五:Numerical Optimization —— 简要介绍求解求解 SVM 的数值优化算法。...
查看>>
第八条:覆盖equals时请遵守通用约定
查看>>
flask_sqlalchemy的使用
查看>>
eclipse 常用快捷键
查看>>
PHP开发调试环境配置
查看>>
ElasticSearch客户端注解使用介绍
查看>>
html5 css练习 画廊 元素旋转
查看>>