USACO18FEB

SlingShot

 1 #include<bits/stdc++.h>
 2 #define P pair<ll,ll>
 3 #define fir first
 4 #define sec second
 5 using namespace std;
 6 typedef long long ll;
 7 int read()
 8 {
 9     int x=0;char ch=getchar();
10     while (ch<'0'||ch>'9') ch=getchar();
11     while ('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
12     return x;
13 }
14 const int N=1e9,T=6e6,M=1e5+5;
15 const ll inf=1ll<<60;
16 P Min[T];
17 int ls[T],rs[T],A[M],x,y,sc,n,rt0[M],rt1[M],m;
18 struct node{ll a,b,c;}p[M];
19 bool cmp(const node &A,const node &B) {return A.a<B.a;}
20 P fmin(P a,P b){
21     return P(min(a.fir,b.fir),min(a.sec,b.sec));
22 };
23 void ins(int &k,int pk,int l,int r,int x,P y)
24 {
25     k=++sc;ls[k]=ls[pk];rs[k]=rs[pk];Min[k]=Min[pk];
26     if (l==r) {Min[k]=fmin(Min[k],y);return;}
27     int mid=(l+r)>>1;
28     if (x<=mid) ins(ls[k],ls[pk],l,mid,x,y);
29     else ins(rs[k],rs[pk],mid+1,r,x,y);
30     Min[k]=fmin(Min[ls[k]],Min[rs[k]]);
31 }
32 P qry(int k,int l,int r,int L,int R)
33 {
34     if (!k) return P(inf,inf);
35     if (L<=l&&r<=R) return Min[k];
36     int mid=(l+r)>>1;P mn=P(inf,inf);
37     if (L<=mid) mn=fmin(mn,qry(ls[k],l,mid,L,R));
38     if (R>mid) mn=fmin(mn,qry(rs[k],mid+1,r,L,R));
39     return mn;
40 }
41 int main()
42 {
43     n=read();m=read();Min[0]=P(inf,inf);
44     for (int i=1;i<=n;i++)
45       p[i].a=read(),p[i].b=read(),p[i].c=read(),A[i]=p[i].a;
46     sort(p+1,p+n+1,cmp);
47     sort(A+1,A+n+1);//寻址数组 
48     for (int i=n;i>=1;i--)
49         ins(rt0[i],rt0[i+1],0,N,p[i].b,P(p[i].a-p[i].b+p[i].c,p[i].a+p[i].b+p[i].c));
50     for (int i=1;i<=n;i++)
51         ins(rt1[i],rt1[i-1],0,N,p[i].b,P(-p[i].a-p[i].b+p[i].c,-p[i].a+p[i].b+p[i].c));
52     while (m--)
53     {
54         x=read();y=read();
55         ll ans=abs(x-y);
56         int k=upper_bound(A+1,A+n+1,x)-A-1; 
57         ans=min(ans,qry(rt0[k+1],1,N,1,y).fir-x+y);
58         ans=min(ans,qry(rt1[k],1,N,1,y).fir+x+y);
59         ans=min(ans,qry(rt0[k+1],1,N,y,N).sec-x-y);
60         ans=min(ans,qry(rt1[k],1,N,y,N).sec+x-y);
61         printf("%lld\n",ans);
62     }
63     return 0;
64 }

猜你喜欢

转载自www.cnblogs.com/Scx117/p/9123933.html