Points on Plane Codeforces

https://www.luogu.org/problemnew/show/CF576C

看题面,一眼按莫队的方法排一下

直接交就会和我一样发现WA掉了。。。

算一下会发现,上限是3e9(块内左端点1e9,块内右端点1e9,块间右端点移动1e9),大于题面的2.5e8

(出题人还真的造出数据把它卡掉了。。而且好像是要让它FST的样子,那些数据在很后面。。)

事实上,块间右端点移动是可以优化的!只要右端点一轮从坐标小的移到坐标大的,下一轮反过来,就可以减少这个1e9到一个相当少的数字

简单的实现方法就是,偶数块中小的移到大的,奇数块中反过来

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 #define fi first
 7 #define se second
 8 #define mp make_pair
 9 #define pb push_back
10 typedef long long ll;
11 typedef unsigned long long ull;
12 typedef pair<int,int> pii;
13 
14 int n;
15 struct P
16 {
17     int fi,se,n;
18 };
19 P p[1001000];
20 int bl[1001000];
21 int sz;
22 bool c1(const P &a,const P &b)
23 {
24     return bl[a.fi]==bl[b.fi]?((bl[a.fi]&1)?a.se<b.se:a.se>b.se):a.fi<b.fi;
25 }
26 int main()
27 {
28     int i;
29     scanf("%d",&n);sz=1000;
30     for(i=1;i<=n;i++)
31     {
32         scanf("%d%d",&p[i].fi,&p[i].se);p[i].n=i;
33     }
34     for(i=0;i<=1000000;i++)    bl[i]=i/sz;
35     sort(p+1,p+n+1,c1);
36     for(i=1;i<=n;i++)    printf("%d ",p[i].n);
37     return 0;
38 }
原文地址:https://www.cnblogs.com/hehe54321/p/9433617.html