[USACO18FEB]Slingshot
题意可化为:
在二维平面中有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的更多相关文章
- 洛谷P4088 [USACO18FEB]Slingshot
题面 大意:给出n个弹弓,可以用ti的时间把xi位置运到yi,在给出m组询问,求xj到yj最小时间. sol:首先如果不用弹弓,时间应为abs(xj-yj).否则时间就是abs(xi-xj)+abs( ...
- P4088 [USACO18FEB]Slingshot 线段树+扫描线
\(\color{#0066ff}{ 题目描述 }\) Farmer John最讨厌的农活是运输牛粪.为了精简这个过程,他产生了一个新奇的想法:与其使用拖拉机拖着装满牛粪的大车从一个地点到另一个地点, ...
- luogu4088 [USACO18FEB]Slingshot
link 这题在线得写树套树,所以我写的离线+树状数组 对于每个询问,Ans=\(\max_{j=1}^n{|a_j-x_i|+|b_j-y_i|+t_i}\) 拆成四种情况 \(x_i\le a_j ...
- 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 ...
随机推荐
- Linux 学习错误点整理之网络配置
本人是一名实习生,最近在学习Linux,在实操的过程中还是遇到了一些问题,所以想记录下来,供自己以后复习,也希望能给跟我一样的菜鸟的人带来一点点帮助. 我用的是VMware Workstation P ...
- [POC]K8 DLLhijack Test
POC: 2016.11 Winrar却持 XP资源管理器却持 DLL却持VS全版本 https://www.cnblogs.com/k8gege/p/10261254.html POC:https: ...
- node-rsa非对称加密
写在最前:此文的目的是介绍编码,减少刚接触时的弯路,所以内容且不做详细累述 一.使用 node-rsa 进行非对称加解密 因为 比特币 中使用的非对称加密,所以在npm中对比找到一个比较方便也直观的库 ...
- hive中解决中文乱码
一.个人初始开发环境的基本情况以及Hive元数据库说明 ①hive的元数据库改成了mysql(安装完mysql之后也没有进行其它别的设置) ②hive-site.xml中设置元数据库对应的配置为 j ...
- JAVA面试精选【Java基础第三部分】
上一篇,我们给出了大概35个题目,都是基础知识,有童鞋反映题目过时了,其实不然,这些是基础中的基础,但是也是必不可少的,面试题目中还是有一些基础题目的,我们本着先易后难的原则,逐渐给出不同级别的题目, ...
- 堆与堆排序/Heap&Heap sort
最近在自学算法导论,看到堆排序这一章,来做一下笔记.堆排序是一种时间复杂度为O(lgn)的原址排序算法.它使用了一种叫做堆的数据结构.堆排序具有空间原址性,即指任何时候都需要常数个额外的元素空间存储临 ...
- docker内存和cpu调试
本地启动了一个sshd的容器服务,但该容器经常会被重启导致ssh连接失败,使用kubectl describe pod命令查看改命令发现有容器返回值为137,一般是系统环境原因,且一般为内存不足导致的 ...
- JDK7 异常的多重捕获
Java 7之前的版本: 1 2 3 4 5 6 7 8 9 10 catch (IOException ex) { logger.error(ex); throw new MyE ...
- PHP strlen()函数和strpos()函数
strlen() 函数返回字符串的长度(字符数) 代码: <?php echo strlen("Hello world!"); ?> 上面的代码将输出:12 ...
- [转]TFS常用的命令行详解
本文转自:http://blchen.com/tfs-common-commands/ 微软的TFS和Visual Studio整合的非常好,但是在开发过程中,很多时候只用GUI图形界面就会发现一些复 ...