CF576C 题解
  mCXaTqFXnf8W 2023年11月01日 69 0

注意到 \(\sum\limits_{i=2}^N |x_{p_i} - x_{p_{i-1}}| + |y_{p_i} - y_{p_{i-1}}|\)。 本质上是两个点之间的曼哈顿距离

而曼哈顿最小距离生成树要 \(O(n^2 \log n)\) ,显然过不了。

注意到我们写过一个叫莫队的东西。

而莫队的复杂度为 \(O(n \sqrt n)\) ,也就是我们要求的东西。

加一点小优化,奇偶排序。

就可以过了。

怎么证明?

可以看一看这一篇博客

精简来说就是控制了左右指针跨越块的数量。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000001;
struct query{
    int l,r,id;
}q[maxn];
int n;
int sq;
bool cmp(query a,query b)
{
    if(a.l/sq==b.l/sq)
    {
        if(a.l/sq&1)
        {
            return a.r<b.r;
        }
        else
        {
            return a.r>b.r;
        }
    }
    else
    {
        return a.l<b.l;
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    sq=1145;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>q[i].l>>q[i].r;
        q[i].id=i;
    }
    sort(q+1,q+n+1,cmp);
    for(int i=1;i<=n;i++)
        cout<<q[i].id<<' ';
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: 图的存储结构 下一篇: 算法为什么会超时
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jTMfQq5cr55P   2024年05月17日   42   0   0 算法与数据结构
  jTMfQq5cr55P   2024年05月17日   38   0   0 算法与数据结构
mCXaTqFXnf8W
作者其他文章 更多