1. 程式人生 > >Codeforces 576C. Points on Plane(構造)

Codeforces 576C. Points on Plane(構造)

onclick const code hide gpo alt || r++ img

  將點先按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<cstdio>
#include<algorithm>
using
namespace std; const int maxn=1000010; struct poi{int x, y, pos;}a[maxn]; int n, x; void read(int &k) { int f=1; k=0; char c=getchar(); while(c<0 || c>9) c==- && (f=-1), c=getchar(); while(c<=9 && c>=0) k=k*10+c-0, c=getchar(); k*=f; } inline
bool cmp1(poi a, poi b){return a.x<b.x;} inline bool cmp2(poi a, poi b){return a.y<b.y;} int main() { read(n); for(int i=1;i<=n;i++) read(a[i].x), read(a[i].y), a[i].pos=i; sort(a+1, a+1+n, cmp1); int now=1; for(int i=1;i<=1000;i++) { x=i*1000; int
l=now, r=now; for(;a[r].x<=x && r<=n;r++); r--; if(l>r) continue; sort(a+1+l, a+1+r, cmp2); now=r+1; if(i&1) for(int j=l;j<=r;j++) printf("%d ", a[j].pos); else for(int j=r;j>=l;j--) printf("%d ", a[j].pos); } }
View Code

Codeforces 576C. Points on Plane(構造)