HDU 4189

来源:互联网 发布:塔吉克斯坦 知乎 编辑:程序博客网 时间:2024/06/08 13:11
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>#include <algorithm>#define pb push_back#define mp make_pair#define fi first#define se second#define VI vector<int>#define pii pair<int,int>#define LL __int64#define DB doubleusing namespace std;const int MAXN = 200100;//const LL INF = 0x3f3f3f3f3f3f3f3fL;LL INF;const int MOD = 1e9 + 7;const double eps = 1e-10;int n,m,topx,topy;struct Point{    LL x,y,id;}p[MAXN],q[MAXN];map<LL,LL> xid,yid;LL cntx[MAXN],cnty[MAXN];LL tree[MAXN],Ans[MAXN];LL lowbit(int x){    return x & (-x);}void update(int x,LL val,int Limit){    while(x <= Limit){        tree[x] = max(tree[x],val);        x += lowbit(x);    }}LL query(int x){    LL res = -INF;    while(x > 0){        res = max(tree[x],res);        x -= lowbit(x);    }    return res;}bool cmpx(Point a,Point b){    return a.x < b.x;}bool cmpy(Point a,Point b){    return a.y < b.y;}void solve(){    int k;    sort(p,p + n,cmpx);    sort(q,q + m,cmpx);    memset(tree,-INF,sizeof(tree));    k = 0;    for(int i = 0; i < m;i++){        while(k < n && p[k].x <= q[i].x){            update(yid[p[k].y],p[k].x + p[k].y,topy + 1);            k++;        }        LL res = query(yid[q[i].y]);        Ans[q[i].id] = min(q[i].x + q[i].y - res,Ans[q[i].id]);    }    memset(tree,-INF,sizeof(tree));    k = 0;    for(int i = 0; i < m;i++){        while(k < n && p[k].x <= q[i].x){            update(topy - yid[p[k].y] + 1,p[k].x - p[k].y,topy + 1);            k++;        }        LL res = query(topy - yid[q[i].y] + 1);        Ans[q[i].id] = min(q[i].x - q[i].y - res,Ans[q[i].id]);    }    memset(tree,-INF,sizeof(tree));    k = n - 1;    for(int i = m - 1; i >= 0;i--){        while(k >= 0 && p[k].x >= q[i].x){            update(yid[p[k].y],p[k].y - p[k].x,topy + 1);            k--;        }        LL res = query(yid[q[i].y]);        Ans[q[i].id] = min(q[i].y - q[i].x - res,Ans[q[i].id]);    }    memset(tree,-INF,sizeof(tree));    k = n - 1;    for(int i = m - 1; i >= 0;i--){        while(k >= 0 && p[k].x >= q[i].x){            update(topy - yid[p[k].y] + 1,0 - (p[k].y + p[k].x),topy + 1);            k--;        }        LL res = query(topy - yid[q[i].y] + 1);        Ans[q[i].id] = min(0 - (q[i].y + q[i].x) - res,Ans[q[i].id]);    }}int main(){    INF = 0x3f3f3f3f;    INF = (INF << 32) + INF;    bool flag = false;    while(scanf("%d",&n) != EOF){        if(n == -1) break;        if(flag) printf("\n");        else flag = true;        topx = topy = 0;        for(int i = 0; i < n;i++){            scanf("%I64d%I64d",&p[i].x,&p[i].y);    //        cntx[topx++] = p[i].x;            cnty[topy++] = p[i].y;        }        scanf("%d",&m);        for(int i = 0; i < m;i++){            scanf("%I64d%I64d",&q[i].x,&q[i].y);            q[i].id = i;      //      cntx[topx++] = q[i].x;            cnty[topy++] = q[i].y;        }  //      sort(cntx,cntx + topx);        sort(cnty,cnty + topy);  //      topx = unique(cntx,cntx + topx) - cntx;        topy = unique(cnty,cnty + topy) - cnty;   //     xid.clear();        yid.clear();   //     for(int i = 1; i <= topx; i++)   //         xid[cntx[i-1]] = i;        for(int i = 1; i <= topy; i++)            yid[cnty[i-1]] = i;        memset(Ans,INF,sizeof(Ans));        solve();        for(int i = 0; i < m; i++)            printf("%I64d\n",Ans[i]);    }    return 0;}


原创粉丝点击