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 }