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;
}
/*
....................................
*/