首页 > 编程语言 >2022“杭电杯”中国大学生算法设计超级联赛(3)-K - Taxi -曼哈顿+二分

2022“杭电杯”中国大学生算法设计超级联赛(3)-K - Taxi -曼哈顿+二分

时间:2022-09-29 00:55:36浏览次数:59  
标签:Taxi qy qx int second 2022 max 杭电杯 first

K - Taxi

题意

开始给你n个点 每个点的坐标\((x_i,y_i)\),权值\(w_i\),一共q次询问, 每次询问给你一个点(qx, qy),求该点到前面某个点的距离的最大值是多少。
两个点之间的距离定义为\(min(|x - xi| + |y - yi|, wi)\)。

思路

我们可以O(1)地求出集合外一点到该集合中的某一个点的最大曼哈顿距离。

\[max(abs(qx - x) + abs(qy - y)) = max(qx-x+qy-y, qx-x+y-qy, x-qx+qy-y, x-qx+y-qy) = max((qx+qy)-(x+y), (x+y)-(qx+qy), (qx-qy)-(x-y), (x-y)-(qx-qy)) = max(|(qx+qy) - (x+y)|, |(qx-qy) - (x-y)|)\]

维护区间的\(mx_x+y, mi_x+y, mx_x-y, mi_x-y\)即可求得区间最大曼哈顿距离

然后我们将点按权值从大到小排
然后二分城市 对于某个点x 比较x及以后的最大曼哈顿距离d,如果d>x.w说明x即以后的区间可以找到比x.w大的更优解, 我们就再向右二分。
如果d<x.w,那么说明x及以后找不到比x.w小的更优解那么我们先记录这段的最大曼哈顿距离(\(ans=max(ans,d)\))然后往左找更优解。

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;

const int N = 1e5 + 10;
const ll INF = 0x3f3f3f3f3f3f3f3f;
int n, q, mi1[N], mx1[N], mi2[N], mx2[N], ans;
pair<int, pair<int, int>>p[N];

bool check(int id, int x, int y) {
    int d = max(abs(x + y - mi1[id]), abs(x + y - mx1[id]));
    d = max({ d, abs(x - y - mi2[id]), abs(x - y - mx2[id]) });
    if (d >= p[id].first) return true;
    ans = max(ans, d);
    return false;
}

void solve()
{
    cin >> n >> q;
    for (int i = 1, x, y, w; i <= n; i++) {
        cin >> x >> y >> w;
        p[i] = { w, {x, y} };
    }
    sort(p + 1, p + 1 + n);
    mi1[n] = mx1[n] = p[n].second.first + p[n].second.second;
    mi2[n] = mx2[n] = p[n].second.first - p[n].second.second;
    for (int i = n - 1; i >= 1; i--) {
        mi1[i] = min(mi1[i + 1], p[i].second.first + p[i].second.second);
        mx1[i] = max(mx1[i + 1], p[i].second.first + p[i].second.second);
        mi2[i] = min(mi2[i + 1], p[i].second.first - p[i].second.second);
        mx2[i] = max(mx2[i + 1], p[i].second.first - p[i].second.second);
    }
    
for (int i = 1, x, y; i <= q; i++) {
        cin >> x >> y;
        ans = min(p[1].first, abs(x - p[1].second.first) + abs(y - p[1].second.second));
        int l = 1, r = n;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (check(mid, x, y)) {
                ans = max(ans,  min(p[mid].first, abs(x - p[mid].second.first) + abs(y - p[mid].second.second)));
                l = mid + 1;
            }
            else r = mid - 1;
        }
        cout << ans << "\n";
    }
   
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int _t = 1;
    cin >> _t;
    while (_t--)
        solve();
    return 0;
}

标签:Taxi,qy,qx,int,second,2022,max,杭电杯,first
From: https://www.cnblogs.com/yaqu-qxyq/p/16740082.html

相关文章

  • 做题记录整理dp15 P1772. [ZJOI2006] 物流运输(2022/9/28)
    P1772.[ZJOI2006]物流运输图论+dp首先看数据范围这么小,其实就可以猜到很可能是先把i到j天的最短路都求出来然后就会发现dp方程很简单了dp[i]=min(dp[j]+最短路[j+1][......
  • 【C语言】Visual Studio 2022开发环境搭建
    1.下载VisualStudio2022VisualStudio的官方网站:​​https://visualstudio.microsoft.com/​​点击下载VisualStudio社区版Community2.安装VisualStudio2022双击Visual......
  • 2022保研经历-有删减
    2022保研经历我也知道大家仅仅是想看题目而已。个人基本情况下面是我的个人情况,可以帮助大家试探各个学校报名的门槛。因为夏令营过后,有学长延毕了,所以排名提高一丢丢......
  • 2022-09-28 依赖注入
    目录spring依赖注入方式setter注入简单类型引用类型构造器注入引用类型(了解)简单类型(了解)问题,解决方法方式一方式二依赖注入方式选择依赖自动装配自动装配方式有哪些依......
  • 2022-09-28 第六小组 张宁杰 Spring框架_01
    bean的生命周期生命周期:从创建到消亡的完整过程bean生命周期:bean从创建到销毁的整体过程bean生命周期控制:在bean创建后到销毁前做一些事情具体描述初始化容器创建......
  • USACO 2022赛季 简要题解
    DECGOLD-A-PairedUpG有\(n\)只奶牛,第\(i\)只在位置\(x_i\),有重量\(y_i\)。求在满足匹配要求的情况下,非匹配的奶牛的重量之和的最大/最小值。两只奶牛能......
  • 【闲话】2022.09.28
    又颓了一会KaTeX,真开心今天没有考试,于是自己切了会CDQ,切了会莫反,又思考了一下如何做可持久化字典树。没有切基环树,太难了,对于我这种蒟蒻而言。发现自己还想切一个由......
  • 2022 ICPC 网络预选赛(9.25)
    真容易颓。E构造一个序列\(a_1\)已经确定使得\((a_i,a_{i-1})=1,a_i>1\)求整个序列最大值。容易知道\(a_2\)是与\(a_1\)互质的最小质数若是2接下填3,2,3,2,3即可.若......
  • 自动化测试2022-9-28
    之前一直使用pycharm写web自动化脚本,今天第一次尝试使用vscode,一开始使用就遇到了“NoModuleNamed***”的报错解决方法:在导入自定义包之前先把路径加到sys.path中具体......
  • 2022.9.24———【CSP-S模拟10】游寄
    \(Preface\)\(Rank42/42\)垫底了我超\(0pts+12pts+0pts+0pts=12pts\)\(\mathfrak{T1}\欧几里得的噩梦\)上来就干了一个线性基,我没学。他说的全集就是本来所......