题意可化为:

在二维平面中有n个点,坐标为\((x_i,y_i)\),点权为\(t_i\)。

现有m个询问,每次给定点\((x,y)\),求\(\min\{|x-x_i|+|y-y_i|+t_i,|y-x|\}\)

排序离散化后扫描线+分类讨论即可

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std; const int MAXN=1<<18;
const long long INF=1ll<<62; int n,m,mx;
long long ans[MAXN];
long long tree[2][MAXN<<1];
struct rpg{
int x,y;
long long t;
int id,rey;
}a[MAXN]; inline int read()
{
int x=0;char ch=getchar();
while(ch<'0'||'9'<ch) ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x;
} bool cmp1(rpg a,rpg b){return a.y<b.y;}
bool cmp2(rpg a,rpg b){return a.x<b.x;} void init()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) a[i].x=read(),a[i].y=read(),a[i].t=read(),a[i].id=i;
for(int i=n+1;i<=n+m;++i) a[i].x=read(),a[i].y=read(),a[i].t=abs(a[i].y-a[i].x),a[i].id=i;
sort(a+1,a+n+m+1,cmp1);a[1].rey=1;
for(int i=2;i<=n+m;++i) a[i].rey=a[i].y==a[i-1].y?a[i-1].rey:a[i-1].rey+1;
mx=a[n+m].rey;
return;
} void cchg(int k,int l,int r,int v,int id,bool kd)
{
if(l==r){
if(!kd) tree[0][k]=min(tree[0][k],a[id].y-a[id].x+a[id].t),tree[1][k]=min(tree[1][k],a[id].t-a[id].x-a[id].y);
else tree[0][k]=min(tree[0][k],a[id].x+a[id].y+a[id].t),tree[1][k]=min(tree[1][k],a[id].x-a[id].y+a[id].t);
return;
}int i=k<<1,mid=l+r>>1;
if(v<=mid) cchg(i,l,mid,v,id,kd);
else cchg(i|1,mid+1,r,v,id,kd);
tree[0][k]=min(tree[0][i],tree[0][i|1]);
tree[1][k]=min(tree[1][i],tree[1][i|1]);
return;
} long long cask(int k,int l,int r,int le,int ri,bool kd)
{
if(le<=l&&r<=ri) return tree[kd][k];
int i=k<<1,mid=l+r>>1;long long mi=INF;
if(le<=mid) mi=min(mi,cask(i,l,mid,le,ri,kd));
if(mid<ri) mi=min(mi,cask(i|1,mid+1,r,le,ri,kd));
return mi;
} void solve()
{
sort(a+1,a+n+m+1,cmp2);
memset(tree,0x7f,sizeof(tree));
int ct1=1,ct2=0;
while(ct1<=n+m){
while(ct2+1<=n+m&&a[ct2+1].x==a[ct1].x){
++ct2;
if(a[ct2].id<=n) cchg(1,1,mx,a[ct2].rey,ct2,0);
}for(int i=ct1;i<=ct2;++i) if(a[i].id>n) a[i].t=min(a[i].t,min(cask(1,1,mx,1,a[i].rey,1)+a[i].y,cask(1,1,mx,a[i].rey,mx,0)-a[i].y)+a[i].x);
ct1=ct2+1;
}memset(tree,0x7f,sizeof(tree));
ct1=n+m,ct2=n+m+1;
while(ct1){
while(ct2-1&&a[ct2-1].x==a[ct1].x){
--ct2;
if(a[ct2].id<=n) cchg(1,1,mx,a[ct2].rey,ct2,1);
}for(int i=ct2;i<=ct1;++i) if(a[i].id>n) a[i].t=min(a[i].t,min(cask(1,1,mx,1,a[i].rey,1)+a[i].y,cask(1,1,mx,a[i].rey,mx,0)-a[i].y)-a[i].x);
ct1=ct2-1;
}for(int i=1;i<=n+m;++i) if(a[i].id>n) ans[a[i].id-n]=a[i].t;
for(int i=1;i<=m;++i) printf("%lld\n",ans[i]);
return;
} int main()
{
init();
solve();
return 0;
}

[USACO18FEB]Slingshot的更多相关文章

  1. 洛谷P4088 [USACO18FEB]Slingshot

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

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

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

  3. luogu4088 [USACO18FEB]Slingshot

    link 这题在线得写树套树,所以我写的离线+树状数组 对于每个询问,Ans=\(\max_{j=1}^n{|a_j-x_i|+|b_j-y_i|+t_i}\) 拆成四种情况 \(x_i\le a_j ...

  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. Swift5 语言参考(七) 属性

    属性提供有关声明或类型的更多信息.Swift中有两种属性,即适用于声明的属性和适用于类型的属性. 您可以通过编写@符号后跟属性的名称以及属性接受的任何参数来指定属性: @attribute name ...

  2. 人工智能-机器学习之numpy方法

    机器学习 最重要的东西就是算法   这里面的水很深  所以呢我就简单的整理了一下 基础的操作     #导入numpy库 as别名 为了怕重名 import numpy as np # 打印版本号 p ...

  3. python爬取微信公众号

    爬取策略 1.需要安装python selenium模块包,通过selenium中的webdriver驱动浏览器获取Cookie的方法.来达到登录的效果 pip3 install selenium c ...

  4. jdk1.8一键安装脚本(linux环境)

    1.下载jdk安装包和安装脚本 下载地址:https://pan.baidu.com/s/1bo6ADQ3 其中包括: jdk安装包:jdk-8u151-linux-x64.tar.gz jdk一键安 ...

  5. odoo开发笔记 -- wkhtmltox打印不显示中文 --ubuntu字体安装

    wkhtmltox 是一个开源的将网页内容转换成PDF的软件包,常嵌套在网页页面里边做打印功能. 以微软雅黑字体为例(其他的宋体.黑体等点阵字体都一样的),我们的雅黑字体文件是:Yahei.ttf(放 ...

  6. 如何在Ubuntu 14.04上利用jexus搭建支持php+mysql数据库的网站服务

      准备部分:sudo apt-get update          sudo apt-get install unzip -y第一部分:安装jexus    在终端运行以下命令    cd /tm ...

  7. (转)详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数

    原文:https://www.jb51.net/article/138363.htm hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,n ...

  8. MySQL Replication之主从切换

    在生产环境中,我们的架构很多都是一主多从.比如一个主数据库服务器M,两个从数据库服务器S1,S2同时指向主数据库服务器M.当主服务器M因为意外情况宕机,需要将其中的一个从数据库服务器(假设选择S1)切 ...

  9. 人人,金山西山居,腾讯互娱,微信,网易游戏offer及面经

    转自:http://www.itmian4.com/forum.php?mod=viewthread&tid=3985 首先感谢师兄在两年前发的贴([天道酬勤] 腾讯.百度.网易游戏.华为Of ...

  10. Tomcat学习总结(1)——Tomcat入门教程

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下: 范例:将JavaWebDemoProject这个Ja ...