2023/4/10小记

题先咕咕咕,写小记主要是为了说废话。

学whk的感觉大概就是这样。

睁开眼重新堕入平凡的世界
辗转枯燥的时间一天又一天
曾为之绚乱的爱 是那么遥远
——《八重回归·真》

讲真我真的感觉我早晚能把妄想症全搬一遍,就算知道很幼稚但是真的忍不住被戳心窝子。

太像了。当时推游戏的时候差点推破防了,幸亏当时在“危险”的环境之下才不至于直接哭出来吧。在看到了救赎,看到了绝望,看到了另一次深渊。在机房要卷题,所以不说了。(其实是真的不知道该说什么)。在找到了同样喜欢的人的时候还是感觉十分开心的。

P4169天使玩偶
cdq分治,每次只考虑一个方向,旋转四次。
注意这里的旋转不是按照(0,0)旋转,而是按照max_x,max_y旋转。
抄板子的时候要注意运算操作(恼)

//#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int INF =0x3f3f3f3f,N=1e6+5;
int n,m,lx,ly,rx,ry,c[N],ans[N];
struct szsz{
    int t[N];
    #define lowbit(x) x&(-x)
    void update(int pos,int val){
        for(;pos<=ly;pos+=lowbit(pos))
        t[pos]=max(t[pos],val);
        return ;
    }
    int query(int pos){
        int ret=0;
        for(int i=pos;i;i-=lowbit(i)) ret=max(t[i],ret);
        return ret;
    }
    void clear(int pos){
        for(;pos<=ly;pos+=lowbit(pos))
        t[pos]=0;
        return ;
    }
}T;
struct ask{
    int x,y,t;bool f;
    ask(){} ask(const int &X ,const int &Y,const int &T,const bool &F):
        x(X),y(Y),t(T),f(F){}
    
    inline bool operator < (const ask &a) const {
        return (x!=a.x)?x<a.x:y<a.y;
    }
}q[N],p[N],a[N];
void cdq(int l,int r){
    if(l==r) return ;
    int mid=(l+r)>>1;
    cdq(l,mid),cdq(mid+1,r);
    int j=l;
    for(int i=mid+1;i<=r;i++){
        if(!p[i].f){
            for(;j<=mid&&p[j].x<=p[i].x;j++)
            if(p[j].f) T.update(p[j].y,p[j].x+p[j].y);
            int tmp=T.query(p[i].y);
            if(tmp) ans[p[i].t]=min(ans[p[i].t],p[i].x+p[i].y-tmp);
        }
    }
    for(int i=l;i<j;i++) if(p[i].f) T.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];
    return ;
}
inline void del(){
    rx=ry=m=0;
    for(int i=1;i<=n;i++) if(!p[i].f) rx=max(rx,p[i].x),ry=max(ry,p[i].y);
    for(int i=1;i<=n;i++)if(p[i].x<=rx&&p[i].y<=ry) q[++m]=p[i];
    for(int i=1;i<=m;i++)p[i]=q[i];
}
int main(){
    scanf("%d%d",&n,&m);
    int k,x,y;
    for(int i=1;i<=n;i++){
        scanf("%d%d",&x,&y);x++,y++;
        p[i]=ask(x,y,i,1);
        lx=max(x,lx),ly=max(y,ly);
    }
    while(m--){
        scanf("%d%d%d",&k,&x,&y);
        x++,y++;
        n++;
        p[n]=ask(x,y,n,k&1);
        lx=max(x,lx),ly=max(y,ly);
    }
    // cout<<lx<<" "<<ly<<'\n';
    for(int i=1;i<=n;i++) a[i]=p[i];
    memset(ans,INF,sizeof(ans));lx++,ly++;
    del();
    cdq(1,m);
    // for(int i=1;i<=n;i++) cout<<p[i].x<<" "<<p[i].y<<" "<<p[i].t<<" "<<p[i].f<<'\n';
    for(int i=1;i<=n;i++) p[i]=a[i],p[i].x=lx-p[i].x;
    // for(int i=1;i<=n;i++) if(!a[i].f)printf("%d\n",ans[i]);
    del(),cdq(1,m);
    for(int i=1;i<=n;i++)p[i]=a[i],p[i].y=ly-p[i].y;
    del(),cdq(1,m);
    for(int i=1;i<=n;i++)p[i]=a[i],p[i].x=lx-p[i].x,p[i].y=ly-p[i].y;
    del(),cdq(1,m);
    for(int i=1;i<=n;i++) if(!a[i].f)printf("%d\n",ans[i]);
    

    return 0;
}
/*
....................................
*/

posted @ 2023-04-10 14:57  洛浔  阅读(32)  评论(0编辑  收藏  举报