#12 MLE 玄关求调
查看原帖
#12 MLE 玄关求调
1419569
Z_kazuha楼主2024/12/9 11:54
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+6;
int n,maxx,maxy,ans[N],ox,oy,m;
struct node{
    int x,y,t,f;
    bool operator < (const node &a)const{
        return x<=a.x;
    }
}p[N],q[N],a[N];
void del(){
    ox=oy=m=0;
    for(int i=1;i<=n;i++){
        if(!p[i].f)ox=max(ox,p[i].x),oy=max(oy,p[i].y);
    }
    for(int i=1;i<=n;i++){
        if(p[i].x<=ox&&p[i].y<=oy)q[++m]=p[i];
    }
    for(int i=1;i<=m;i++)p[i]=q[i];
}
int c[N];
int lowbit(int x){return x&-x;}
void add(int x,int d){
    for(;x<=maxy;x+=lowbit(x))c[x]=max(c[x],d);
}
int query(int x){
    int res=0;
    for(;x;x-=lowbit(x))res=max(res,c[x]);
    return res;
}
void clear(int x){
    for(;x<=maxy;x+=lowbit(x))c[x]=0;
}
void cdq(int l,int r){
    if(l==r)return;
    int mid=(l+r)>>1;
    cdq(l,mid),cdq(mid+1,r);
    int i=mid+1,j=l;
    while(i<=r){
        if(!p[i].f){
            while(j<=mid&&p[j].x<=p[i].x){
                if(p[j].f)add(p[j].y,p[j].x+p[j].y);
                j++;
            }
            int tmp=query(p[i].y);
            if(tmp)ans[p[i].t]=min(ans[p[i].t],p[i].x+p[i].y-tmp);
        }
        i++;
    }
    for(int i=l;i<j;i++)if(p[i].f)clear(p[i].y);
    merge(p+l,p+mid+1,p+mid+1,p+r+1,q+l);
    for(int i=l;i<=r;i++)p[i]=q[i];
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int x,y;
        cin>>x>>y;
        x++,y++;
        p[i]=node{x,y,i,1};
        maxx=max(maxx,x),maxy=max(maxy,y);
    }
    for(int i=1;i<=m;i++){
        int k,x,y;
        cin>>k>>x>>y;
        x++,y++,n++;
        p[n]=node{x,y,n,k&1};
        maxx=max(maxx,x),maxy=max(maxy,y);
    }
    for(int i=1;i<=n;i++)a[i]=p[i];
    memset(ans,0x3f3f3f3f,sizeof(ans));
    maxx++,maxy++;
    del(),cdq(1,m);
    for(int i=1;i<=n;i++)p[i]=a[i],p[i].y=maxy-p[i].y;
    del(),cdq(1,m);
    for(int i=1;i<=n;i++)p[i]=a[i],p[i].x=maxx-p[i].x;
    del(),cdq(1,m);
    for(int i=1;i<=n;i++)p[i]=a[i],p[i].x=maxx-p[i].x,p[i].y=maxy-p[i].y;
    del(),cdq(1,m);
    for(int i=1;i<=n;i++){
        if(!a[i].f)cout<<ans[i]<<endl;
    }
    return 0;
}
2024/12/9 11:54
加载中...