codeforces 576c// Points on Plane// Codeforces Round #319(Div. 1)

题意:有n个点,找到一个顺序走遍这n个点,并且曼哈顿距离不超过25e8。

由于给的点坐标都在0-1e6之间。将x轴分成1000*1000,即1000长度为1块。将落在同一块的按y排序,编号为奇的块和偶的块一个升序,一个降序。有3个量值得关注。一是同一块中x的变化量,其实是不超过1000*n1,n1是第1块中点的数量。那么1000*n1+1000*n2......=1000*n<1e9。后两个量是同一块中y的高度差,另一个是本块最后一个和另一块第一个的高度差。这种做法下相邻两块这两个高度差的和是小于1.5e6的。1000块小于1.5e9。1e9+1.5e9刚好25e8。为什么高度差的和小于1.5e6?假设第k块是降序,Y的高度差是1e6,那么最低的一个点高度是0。如果它与下一块的第一个点的距离大于0.5e6,下一块所有点都要集中在上半部分,从而下一块的内部高度差就小于1e6。事实上,本块的最后一个点与下一块的第一个点的距离的增加必然导致下一块内部的高度差减小。

//#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
#include <list>
using namespace std;
const int SZ=1000010,INF=0x7FFFFFFF;
typedef long long lon;
const double EPS=1e-9;
struct nd{
    int x,y,id;
    nd(int a,int b,int _id):x(a),y(b),id(_id){}
};
vector<nd> vct[1010];

bool cmp1(nd &x,nd &y)
{
    return x.y>y.y;
}
bool cmp2(nd &x,nd &y)
{
    return x.y<y.y;
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    int n;
    cin>>n;
    for(int i=0;i<n;++i)
    {
        int a,b;
        cin>>a>>b;
        int block=a/1000;
        vct[block].push_back(nd(a,b,i));
    }
    for(int i=0;i<1010;++i)
    {
        if(i&1)
        {
            sort(vct[i].begin(),vct[i].end(),cmp2);
        }
        else
        {
            sort(vct[i].begin(),vct[i].end(),cmp1);
        }
    }
    bool ok=0;
    for(int i=0;i<1010;++i)
    {
        for(int j=0;j<vct[i].size();++j)
        {
            if(ok)cout<<" ";
            cout<<vct[i][j].id+1;
            ok=1;
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/gaudar/p/9671348.html

时间: 2024-10-05 22:18:32

codeforces 576c// Points on Plane// Codeforces Round #319(Div. 1)的相关文章

codeforces 576C Points on Plane

题意:给出n个点,要求排序后,相邻两点的欧拉距离之和小于等于2.5e9做法:由于0≤?xi,?yi?≤?1e6,所以可以将x<=1000的点分成一份,1000<x<=2000的点分成第二份,以此类推,分成一千份.然后每一份中的点都按照y单调排序.拿任意一份点做实验,如果从最小的y开始往上走,那么y的贡献最多1e6,那么一千份就总共最多贡献1e9. 最后考虑x的贡献,在某一份点中,从一个点走到另一个点最多贡献1e3,那么这份总共最多贡献1e9,也就是所有点都在这一份里面,那么考虑所有点集,

Codeforces 576C. Points on Plane(构造)

将点先按x轴排序,把矩形竖着划分成$10^3$个块,每个块内点按y轴排序,然后蛇形走位上去. 这样一个点到下一个点的横坐标最多跨越$10^3$,一共$10^6$个点,总共$10^9$,一个块内最多走$10^6$,一共$10^3$个块,一共$10^9$,跨过块的部分一共$2*10^6$,也就是总共不会超过$2*10^9+2*10^6$. #include<iostream> #include<cstring> #include<cstdlib> #include<c

Codeforces Round #319 (Div. 2) C Vasya and Petya&#39;s Game

因为所有整数都能被唯一分解,p1^a1*p2^a2*...*pi^ai,而一次询问的数可以分解为p1^a1k*p2^a2k*...*pi^aik,这次询问会把所有a1>=a1k && a2 >= a2k &&... a3 >= a3k的数从原来的集合中分开.ai表示pi的幂. 那么只有当这个数的素因子的最大幂都被询问过一次,这个数才能确定.因此答案是所有的不大于n的只有一个素因子的数. #include<bits/stdc++.h> using

Codeforces Round 319 # div.1 &amp; 2 解题报告

Div. 2 Multiplication Table (577A) 题意: 给定n行n列的方阵,第i行第j列的数就是i*j,问有多少个格子上的数恰为x. 1<=n<=10^5, 1<=x<=10^9 题解: 送分题…对于每一行,判断是否存在数x即可…也可以枚举x的因子判断是否出现在表内… #include<cstdio>#include<cstring>inlineint read(){int s =0;char c;while((c=getchar())

Codeforces Round #319 (Div. 2) E - Points on Plane

题目大意:在一个平面里有n个点,点坐标的值在1-1e6之间,让你给出一个遍历所有点的顺序,要求每个点走一次,且 曼哈顿距离之和小于25*1e8. 思路:想了一会就有了思路,我们可以把1e6的x,y坐标都分成2000份,每份500,然后这样整个平面就被分成 了2000*2000个区域,然后按区域输出点就行了. 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 vector<int> ans[2005][2005];

Codeforces Round #319 (Div. 2) D

E A tree of size n is an undirected connected graph consisting of n vertices without cycles. Consider some tree with n vertices. We call a tree invariant relative to permutation p = p1p2... pn, if for any two vertices of the tree u andv the condition

Codeforces Round #319 (Div. 2) B Modulo Sum

直接O(n*m)的dp也可以直接跑过. 因为上最多跑到m就终止了,因为sum[i]取余数,i = 0,1,2,3...,m,会有m+1种可能,m的余数只有m种必然有两个相同. #include<bits/stdc++.h> using namespace std; const int maxn = 1e3+5; int cnt[maxn]; bool dp[maxn][maxn]; #define Y { puts("YES"); return 0; } int main(

Codeforces Round #245 (Div. 2) A - Points and Segments (easy)

水到家了 #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Point{ int index, pos; Point(int index_ = 0, int pos_ = 0){ index = index_; pos = pos_; } bool operator < (const Point& a) const{ return p

Codeforces Round #486 (Div. 3) D. Points and Powers of Two

Codeforces Round #486 (Div. 3) D. Points and Powers of Two 题目连接: http://codeforces.com/group/T0ITBvoeEx/contest/988/problem/D Description There are n distinct points on a coordinate line, the coordinate of i-th point equals to xi. Choose a subset of