luogu4088 [USACO18FEB]Slingshot
这题在线得写树套树,所以我写的离线+树状数组
对于每个询问,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的更多相关文章
- 洛谷P4088 [USACO18FEB]Slingshot
题面 大意:给出n个弹弓,可以用ti的时间把xi位置运到yi,在给出m组询问,求xj到yj最小时间. sol:首先如果不用弹弓,时间应为abs(xj-yj).否则时间就是abs(xi-xj)+abs( ...
- [USACO18FEB]Slingshot
题意可化为: 在二维平面中有n个点,坐标为\((x_i,y_i)\),点权为\(t_i\). 现有m个询问,每次给定点\((x,y)\),求\(\min\{|x-x_i|+|y-y_i|+t_i,|y ...
- P4088 [USACO18FEB]Slingshot 线段树+扫描线
\(\color{#0066ff}{ 题目描述 }\) Farmer John最讨厌的农活是运输牛粪.为了精简这个过程,他产生了一个新奇的想法:与其使用拖拉机拖着装满牛粪的大车从一个地点到另一个地点, ...
- LUOGU P4088 [USACO18FEB]Slingshot(线段树)
传送门 解题思路 推了推式子发现是个二维数点,想了想似乎排序加线段树难写,就写了个树套树,结果写完看见空间才\(128M\)..各种奇技淫巧卡空间还是\(MLE\)到天上.后来只好乖乖的写排序+线段树 ...
- 洛谷 P4088 [USACO18FEB] Slingshot P(线段树+二维数点)
题目链接 题意:有一个数轴,上面有 \(n\) 个传送门,使用第 \(i\) 个传送门,你可以从 \(x_i\) 走到 \(y_i\),花费的时间为 \(t_i\) 秒.你的速度为 \(1\) 格/秒 ...
- 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, ...
- 线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G
题面:P4269 [USACO18FEB]Snow Boots G 题解: 把所有砖和靴子排序,然后依次处理每一双靴子,把深度小于等于它的砖块都扔线段树里,问题就转化成了求线段树已有的砖块中最大的砖块 ...
- FZU 1683 纪念SlingShot(矩阵水)
纪念SlingShot [题目链接]纪念SlingShot [题目类型]矩阵水 &题解: 这代码调了十多分钟,结果是Mul没返回值,好zz啊. 令sum(n)=sum(n-1)+f(n) 那么 ...
- fuzhou 1683 纪念SlingShot ***
Problem 1683 纪念SlingShot Accept: 361 Submit: 1287Time Limit: 1000 mSec Memory Limit : 32768 KB ...
随机推荐
- 问题:oracle 排序 null值放在最后;结果: ORACLE中null的排序问题
ORACLE中null的排序问题 关键字: oracle nulls 问题描述: 在平时的业务处理中,经常遇到要对业务数据进行排序,并且要对null值也做相应的排序.在Oracle中,进行Ord ...
- 微信开发准备(一)--Maven仓库管理新建WEB项目
转自:http://www.cuiyongzhi.com/post/13.html 在我们的项目开发中经常会遇到项目周期很长,项目依赖jar包特别多的情况,所以我们经常会在项目中引入Maven插件,建 ...
- Javascript面向对象(三):非构造函数的继承
这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承". 今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是 ...
- MongoDB数据导入hbase + 代码
需求: 从mongoDB里面查出来数据,判断是否有该列簇,如果有则导入此条数据+列簇,如果没有,则该条数据不包含该列簇 直接贴出代码: package Test; import java.util.A ...
- net.sf.fjep.fatjar_0.0.32 eclipse4.x 可以用的jar包
http://pan.baidu.com/s/1nvlIw21?errno=0&errmsg=Auth%20Login%20Sucess&stoken=bb98db9f451c00ae ...
- 解决html中的乱码问题
1.最简单粗暴的方法就是加一个meta标签,不过值得我们注意的是我们的meta标签是与我们的head标签是同一级的,所以千万不能将meta标签加到我们的head标签中. <meta http-e ...
- python笔记--5--文件操作
文件内容操作三部曲:打开.读写.关闭 open(file, mode='r', buffering=1, encoding=None, errors=None, newline=None, close ...
- java输入输出--I/O操作基础知识学习
一.java的I/O流 1. 输入流(字节流和字符流,字节流操作的数据单元是8位的字节,字符流操作的是16位的字符)(InputStream 和Reader作为基类) 2.输出流(字节流和字符流,字节 ...
- Switch/Case 的穿透性
/*键盘录入1到12 ,对应输出该月份对应的季节 .如果输入的不是1到12,输出提示信息:您输入的数据有误. PS: 春季:3,4,5月份 夏季: 6,7,8月份 秋季: 9,10,11月份 冬季:1 ...
- 36-图像有用区(dfs, bfs)
http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=92 图像有用区域 时间限制:3000 ms | 内存限制:65535 KB 难度:4 ...