link

这题在线得写树套树,所以我写的离线+树状数组

对于每个询问,Ans=\(\max_{j=1}^n{|a_j-x_i|+|b_j-y_i|+t_i}\)

拆成四种情况

\(x_i\le a_j,y_i\le b_j: a_j+b_j+t_i-x_i-y_i\)

\(x_i\le a_j,y_i> b_j: a_j-b_j+t_i-x_i+y_i\)

\(x_i> a_j,y_i\le b_j: -a_j+b_j+t_i+x_i-y_i\)

\(x_i> a_j,y_i> b_j: -a_j-b_j+t_i+x_i+y_i\)

第一维直接排序(不用离散化但是我智障我离散化了)

第二维分四种情况树状数组即可,由于查询的是前缀、后缀最值(而不是区间最值)所以直接树状数组维护最值即可

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std; struct shot { int x, y, t; } a[100010];
struct shit { int a, b, id; } q[100010]; long long upd1[100010], upd2[100010], upd3[100010], upd4[100010]; int N, M;
int disc1[200010], disc2[200010], A[100010], B[100010], x[100010], y[100010], tot1, tot2;
long long ans[100010], fenwick[200010]; template<class _T> void chkmin(_T &a, _T b) { if (b < a) a = b; }
void chenge(int x, long long k) { for (int i = x; i <= tot2; i += i & -i) chkmin(fenwick[i], k); }
long long query(int x)
{
long long res = 0x3f3f3f3f3f3f3f3fLL;
for (int i = x; i > 0; i &= i - 1) chkmin(res, fenwick[i]);
return res;
} int main()
{
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; i++) scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].t), disc1[++tot1] = a[i].x, disc2[++tot2] = a[i].y;
for (int i = 1; i <= M; i++) scanf("%d%d", &q[i].a, &q[i].b), disc1[++tot1] = q[i].a, disc2[++tot2] = q[i].b, q[i].id = i;
sort(disc1 + 1, disc1 + 1 + tot1), tot1 = unique(disc1 + 1, disc1 + tot1 + 1) - disc1 - 1;
sort(disc2 + 1, disc2 + 1 + tot2), tot2 = unique(disc2 + 1, disc2 + tot2 + 1) - disc2 - 1;
sort(a + 1, a + 1 + N, [](const shot &a, const shot &b) { return a.x < b.x; });
sort(q + 1, q + 1 + M, [](const shit &a, const shit &b) { return a.a < b.a; });
for (int i = 1; i <= N; i++)
{
x[i] = lower_bound(disc1 + 1, disc1 + 1 + tot1, a[i].x) - disc1;
y[i] = lower_bound(disc2 + 1, disc2 + 1 + tot2, a[i].y) - disc2;
upd1[i] = (long long)a[i].t - a[i].x - a[i].y;
upd2[i] = (long long)a[i].t - a[i].x + a[i].y;
upd3[i] = (long long)a[i].t + a[i].x - a[i].y;
upd4[i] = (long long)a[i].t + a[i].x + a[i].y;
}
for (int i = 1; i <= M; i++)
{
ans[q[i].id] = abs(q[i].a - q[i].b);
A[i] = lower_bound(disc1 + 1, disc1 + 1 + tot1, q[i].a) - disc1;
B[i] = lower_bound(disc2 + 1, disc2 + 1 + tot2, q[i].b) - disc2;
}
memset(fenwick, 0x3f, sizeof(fenwick));
for (int i = 1, j = 1; i <= M; i++)
{
while (j <= N && x[j] <= A[i]) chenge(y[j], upd1[j]), j++;
chkmin(ans[q[i].id], query(B[i]) + q[i].a + q[i].b);
}
memset(fenwick, 0x3f, sizeof(fenwick));
for (int i = 1, j = 1; i <= M; i++)
{
while (j <= N && x[j] <= A[i]) chenge(tot2 - y[j] + 1, upd2[j]), j++;
chkmin(ans[q[i].id], query(tot2 - B[i] + 1) + q[i].a - q[i].b);
}
memset(fenwick, 0x3f, sizeof(fenwick));
for (int i = M, j = N; i >= 1; i--)
{
while (j >= 1 && x[j] >= A[i]) chenge(y[j], upd3[j]), j--;
chkmin(ans[q[i].id], query(B[i]) - q[i].a + q[i].b);
}
memset(fenwick, 0x3f, sizeof(fenwick));
for (int i = M, j = N; i >= 1; i--)
{
while (j >= 1 && x[j] >= A[i]) chenge(tot2 - y[j] + 1, upd4[j]), j--;
chkmin(ans[q[i].id], query(tot2 - B[i] + 1) - q[i].a - q[i].b);
}
for (int i = 1; i <= M; i++) printf("%lld\n", ans[i]);
return 0;
}

luogu4088 [USACO18FEB]Slingshot的更多相关文章

  1. 洛谷P4088 [USACO18FEB]Slingshot

    题面 大意:给出n个弹弓,可以用ti的时间把xi位置运到yi,在给出m组询问,求xj到yj最小时间. sol:首先如果不用弹弓,时间应为abs(xj-yj).否则时间就是abs(xi-xj)+abs( ...

  2. [USACO18FEB]Slingshot

    题意可化为: 在二维平面中有n个点,坐标为\((x_i,y_i)\),点权为\(t_i\). 现有m个询问,每次给定点\((x,y)\),求\(\min\{|x-x_i|+|y-y_i|+t_i,|y ...

  3. P4088 [USACO18FEB]Slingshot 线段树+扫描线

    \(\color{#0066ff}{ 题目描述 }\) Farmer John最讨厌的农活是运输牛粪.为了精简这个过程,他产生了一个新奇的想法:与其使用拖拉机拖着装满牛粪的大车从一个地点到另一个地点, ...

  4. LUOGU P4088 [USACO18FEB]Slingshot(线段树)

    传送门 解题思路 推了推式子发现是个二维数点,想了想似乎排序加线段树难写,就写了个树套树,结果写完看见空间才\(128M\)..各种奇技淫巧卡空间还是\(MLE\)到天上.后来只好乖乖的写排序+线段树 ...

  5. 洛谷 P4088 [USACO18FEB] Slingshot P(线段树+二维数点)

    题目链接 题意:有一个数轴,上面有 \(n\) 个传送门,使用第 \(i\) 个传送门,你可以从 \(x_i\) 走到 \(y_i\),花费的时间为 \(t_i\) 秒.你的速度为 \(1\) 格/秒 ...

  6. FOJ 1683 纪念SlingShot(矩阵快速幂)

    C - 纪念SlingShot Description 已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5, ...

  7. 线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G

    题面:P4269 [USACO18FEB]Snow Boots G 题解: 把所有砖和靴子排序,然后依次处理每一双靴子,把深度小于等于它的砖块都扔线段树里,问题就转化成了求线段树已有的砖块中最大的砖块 ...

  8. FZU 1683 纪念SlingShot(矩阵水)

    纪念SlingShot [题目链接]纪念SlingShot [题目类型]矩阵水 &题解: 这代码调了十多分钟,结果是Mul没返回值,好zz啊. 令sum(n)=sum(n-1)+f(n) 那么 ...

  9. fuzhou 1683 纪念SlingShot ***

    Problem 1683 纪念SlingShot Accept: 361    Submit: 1287Time Limit: 1000 mSec    Memory Limit : 32768 KB ...

随机推荐

  1. Java堆初始大小的建议值

    摘自:<Java Performance>第三章 Initial Heap Space Size Configuration This section describes how to u ...

  2. spring特点与好处

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development a ...

  3. IE双边距bug

    标准参考 根据 W3C CSS2.1 规范中的描述,对于非替换的浮动元素,若 'margin-left' 或 'margin-right' 特性的计算值为 'auto',则它们的实际使用值为 '0'. ...

  4. java如何从cmd运行并使用text文件作为输入源的总结

    大家好,好几天没写东西了,又和大家见面了 首先,编译我们的.java文件,生成.class文件 使用命令 javac yourname.java 编译 然后使用java youname < yo ...

  5. POJ 1741 点分治

    方法:指针扫描数组 每次选择树的重心作为树根,从树根出发进行一次DFS,求出点到树根的距离,把节点按照与树根的的距离放进数组d,设置两个指针L,R分别从前.后开始扫描,每次满足条件时答案累加R-L., ...

  6. C++面向对象类的实例题目四

    题目描述: 以面向对象的概念设计一个类,此类包含3个私有数据:unlead.lead(无铅汽油和有铅汽油)以及total(当天总收入,无铅汽油的价格是17元/升,有铅汽油的加个是16元/升),请以构造 ...

  7. java中静态方法和非静态方法调用的一点小困扰,已解决。

    public static void main(String[] args) { // TODO Auto-generated method stub SimpleGui1B gui=new Simp ...

  8. 每日一Git计划启动

    效仿某大神,每日一Git,初次启动,维时30天 规范: 1. 不能提交纯属搞笑灌水的 2. 可以提交ACM题目代码 3. 想不到了..靠自觉的东西,对自己有提升的就做,没提升纯属刷数据的就不算吧.. ...

  9. C++笔记--指针数组和结构

    指针 类型为T*的变量能保存一个类型T对象的地址 Char c=‘a’:Char * p=& c://保存了c的地址 指针的操作一般都是间接的引用,就是相当于引用指针所指的对象. 0是一个特殊 ...

  10. 《Effective Java》第5章 泛型

    第23条:请不要在新代码中使用原生态类型 声明中具有一个或者多个类型参数( type parameter)的类或者接口,就是泛型(generic)类或者接口. 每种泛型定义一组参数化的类型(param ...