P4088
显然题目是在求 \(\min (|a_j-b_j|,|a_j-x_i|+|b_j-y_i|+t_i)\)。
考虑拆掉绝对值。
\[|a_j-x_i|+|b_j-y_i|+t_i=
\begin{cases}
a_j+b_j-(x_i+y_i)+t_i,a_j\ge x_i,b_j\ge y_i\\
a_j-b_j-(x_i-y_i)+t_i,a_j\ge x_i,b_j\le y_i\\
-a_j+b_j-(-x_i+y_i)+t_i,a_j\le x_i,b_j\ge y_i\\
-a_j-b_j-(-x_i-y_i)+t_i,a_j\le x_i,b_j\le y_i\\
\end{cases}
\]
两个限制,第一个可以离线下来排序处理,第二个是求 \(1\) 到 \(i\) 和 \(i\) 到 \(n\) 的最小值,直接树状数组维护即可,对于 \(i\) 到 \(n\) 取反一下就可以了。
注意初始设为 \(|a_j-b_j|\)。
最后时间复杂度 \(O(M\log N)\)。
code
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define per(i,r,l) for(int i=(r);i>=(l);--i)
const int N=1e5+5,M=1e6+5;
const ll inf=2e9;
struct node{ll x,y;ll t;}a[N],q[N];
ll n,m;
struct BIT{
ll t[M],b[M],m;
void clear(){memset(t,0x3f,sizeof t);}
void init(){
sort(b+1,b+1+m);
m=unique(b+1,b+1+m)-(&b[1]);
}
void up(ll x,ll z){
x=lower_bound(b+1,b+1+m,x)-b;
for(;x<=m;x+=x&-x) t[x]=min(t[x],z);
}
ll get(ll x){
x=lower_bound(b+1,b+1+m,x)-b;
ll res=t[0];for(;x;x-=x&-x)res=min(res,t[x]);return res;
}
}T[2];
ll ans[N];
void solve(){
T[0].clear(),T[1].clear();
cin>>n>>m;
rep(i,1,n)cin>>a[i].x>>a[i].y>>a[i].t,T[0].b[++T[0].m]=a[i].y,T[1].b[++T[1].m]=inf-a[i].y+1;
sort(a+1,a+1+n,[](node q,node w){return q.x<w.x;});
rep(i,1,m) cin>>q[i].x>>q[i].y,q[i].t=i,ans[i]=abs(q[i].x-q[i].y);
rep(i,1,m) T[0].b[++T[0].m]=q[i].y,T[1].b[++T[1].m]=inf-q[i].y+1;
T[0].init(),T[1].init();
sort(q+1,q+1+m,[](node qq,node qw){return qq.x<qw.x;});
int now=1;
rep(i,1,m){
while(now<=n&&a[now].x<=q[i].x){
T[0].up(a[now].y,-(a[now].x+a[now].y)+a[now].t);
T[1].up(inf-a[now].y+1,-(a[now].x-a[now].y)+a[now].t);
now++;
}
ans[q[i].t]=min({ans[q[i].t],q[i].x+q[i].y+T[0].get(q[i].y),q[i].x-q[i].y+T[1].get(inf-q[i].y+1)});
}
T[0].clear(),T[1].clear();
now=n;
per(i,m,1){
while(now>=1&&a[now].x>=q[i].x){
T[0].up(a[now].y,-(-a[now].x+a[now].y)+a[now].t);
T[1].up(inf-a[now].y+1,-(-a[now].x-a[now].y)+a[now].t);
now--;
}
ans[q[i].t]=min({ans[q[i].t],-q[i].x+q[i].y+T[0].get(q[i].y),-q[i].x-q[i].y+T[1].get(inf-q[i].y+1)});
}
rep(i,1,m) cout<<ans[i]<<'\n';
}
int main(){
cin.tie(0)->ios::sync_with_stdio(false);
solve();
}

浙公网安备 33010602011771号