[Luogu4169][Violet]天使玩偶/SJY摆棋子

luogu

题意

一个平面上有\(n\)个点,\(m\)次操作,每次新增一个点,或者是询问离某个点最近的点的距离。这里的距离是曼哈顿距离。
\(n,m\le3*10^5\)

sol

写一发\(CDQ\)
只考虑询问点在其他点的右上方的情况,假设询问点是\(A\),那么所求的距离就是\((X_A-X_i)+(Y_A-Y_i)=(X_A+Y_A)-(X_i+Y_i)\)
所以我们只需要找出满足\(X_i \le X_A,Y_i \le Y_A\)\(X_i+Y_i\)的最大值就好了。
\(CDQ\)前先按时间戳排序,向上归并时按\(X\)排序。考虑左边对右边的贡献时,按\(Y\)值为下标插入树状数组,然后查询前缀最大值。
对于不在右上方的情况,只要把坐标轴翻转四次就可以了。





然而。
这题卡常。
以下是一些卡常技巧。

清空树状数组的时候,如果当前位已经是\(0\)就直接\(return\)
预先记录按照时间戳的排序,每次\(CDQ\)完后直接复制一遍,不需要排序。
删除不必要的点(不会被任何询问考虑到的点)

常数巨大无比。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi()
{
    int x=0,w=1;char ch=getchar();
    while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if (ch=='-') w=0,ch=getchar();
    while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return w?x:-x;
}
const int N = 1e6+5;
struct node{
    int tim,opt,x,y;
    bool operator < (const node &b) const
        {
            if (x!=b.x) return x<b.x;
            if (y!=b.y) return y<b.y;
            return opt<b.opt;
        }
}a[N],p[N],q[N];
int n,m,X,Y,c[N],ans[N];
inline void modify(int k,int v){while(k<=Y)c[k]=max(c[k],v),k+=k&-k;}
inline int query(int k){int s=0;while(k)s=max(s,c[k]),k-=k&-k;return s;}
inline void clear(int k){while(k<=Y)if(c[k])c[k]=0,k+=k&-k;else return;}
void CDQ(int l,int r)
{
    if (l==r) return;
    int mid=l+r>>1;CDQ(l,mid);CDQ(mid+1,r);
    int L=l,R=mid+1;
    for (int i=l;i<=r;++i)
        if (L<=mid&&(R>r||p[L]<p[R]))
        {
            q[i]=p[L++];
            if (q[i].opt==1) modify(q[i].y,q[i].x+q[i].y);
        }
        else
        {
            q[i]=p[R++];
            if (q[i].opt==2)
            {
                int tmp=query(q[i].y);
                if (tmp) ans[q[i].tim]=min(ans[q[i].tim],q[i].x+q[i].y-tmp);
            }
        }
    for (int i=l;i<=r;++i) p[i]=q[i],clear(p[i].y);
}
void Delete()
{
    int xx=0,yy=0;m=0;
    for (int i=1;i<=n;++i)
        if (p[i].opt==2)
            xx=max(xx,p[i].x),yy=max(yy,p[i].y);
    for (int i=1;i<=n;++i)
        if (p[i].x<=xx&&p[i].y<=yy)
            q[++m]=p[i];
    for (int i=1;i<=m;++i) p[i]=q[i];
}
int main()
{
    n=gi();m=gi();memset(ans,63,sizeof(ans));
    for (int i=1;i<=n;++i)
    {
        a[i]=(node){0,1,gi()+1,gi()+1};
        X=max(X,a[i].x);Y=max(Y,a[i].y);
    }
    for (int i=1;i<=m;++i)
    {
        a[++n]=(node){i,gi(),gi()+1,gi()+1};
        X=max(X,a[n].x);Y=max(Y,a[n].y);
    }
    ++X;++Y;
    for (int i=1;i<=n;++i) p[i]=a[i];
    Delete();CDQ(1,m);
    for (int i=1;i<=n;++i) p[i]=a[i],p[i].x=X-p[i].x;
    Delete();CDQ(1,m);
    for (int i=1;i<=n;++i) p[i]=a[i],p[i].y=Y-p[i].y;
    Delete();CDQ(1,m);
    for (int i=1;i<=n;++i) p[i]=a[i],p[i].x=X-p[i].x,p[i].y=Y-p[i].y;
    Delete();CDQ(1,m);
    for (int i=1;i<=n;++i) if (a[i].opt==2) printf("%d\n",ans[a[i].tim]);
    return 0;
}

转载于:https://www.cnblogs.com/zhoushuyu/p/8809015.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值