[ABC266Ex] Snuke Panic (2D)
Problem Statement
Takahashi is trying to catch many Snuke.
There are some pits in a two-dimensional coordinate plane, connected to Snuke's nest.
Now, $N$ Snuke will appear from the pits. It is known that the $i$-th Snuke will appear from the pit at coordinates $(X_i,Y_i)$ at time $T_i$, and its size is $A_i$.
Takahashi is at coordinates $(0,0)$ at time $0$ and can do the following two kinds of moves.
- Move at a speed of at most $1$ in the $x$-direction (positive or negative).
- Move at a speed of at most $1$ in the positive $y$-direction.
Moving in the negative $y$-direction is not allowed.
He can catch a Snuke appearing from a pit if and only if he is at the coordinates of that pit exactly when it appears.
The time it takes to catch a Snuke is negligible.
Find the maximum sum of the sizes of Snuke that Takahashi can catch by moving optimally.
Constraints
- $1 \leq N \leq 10^5$
- $1 \leq T_i \leq 10^9$
- $0 \leq X_i,Y_i \leq 10^9$
- $1 \leq A_i \leq 10^9$
- The triples $(T_i,X_i,Y_i)$ are distinct.
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
$N$
$T_1$ $X_1$ $Y_1$ $A_1$
$T_2$ $X_2$ $Y_2$ $A_2$
$\vdots$
$T_N$ $X_N$ $Y_N$ $A_N$
Output
Print the answer as an integer.
Sample Input 1
3
1 0 0 100
3 2 1 10
5 3 1 1
Sample Output 1
101
The optimal strategy is as follows.
- Wait at coordinates $(0,0)$ to catch the first Snuke at time $1$.
- Go to coordinates $(3,1)$ to catch the third Snuke at time $5$.
It is impossible to catch both the first and second Snuke, so this is the best he can.
Sample Input 2
2
100 0 1 1
200 1 0 10
Sample Output 2
10
Moving in the negative $y$-direction is not allowed, so he cannot catch the first Snuke and then the second.
Sample Input 3
10
797829355 595605750 185676190 353195922
913575467 388876063 395940406 533206504
810900084 201398242 159760440 87027328
889089200 220046203 85488350 325976483
277429832 161055688 73308100 940778720
927999455 429014248 477195779 174616807
673419335 415891345 81019893 286986530
989248231 147792453 417536200 219371588
909664305 22150727 414107912 317441890
988670052 140275628 468278658 67181740
考虑 dp,定义 \(dp_{i}\) 为到达点 \(i\) 时的最大得分。明显 dp 无环。
满足以下条件时,\(dp_i\) 可以从 \(dp_j\) 转移.
- \(t_j<t_i\)
- \(y_j<y_i\)
- \(|x_i-x_j|+y_i-y_j\le t_i-t_j\)(路程差要小于时间差)
然后会发现,若条件 3 满足,条件 1 也满足。
然后把条件 3 的绝对值拆开,移项。
- \(y_j<y_i\)
- \(t_j-x_j-y_j\le t_i-x_i-y_i\)
- \(t_j+x_j-y_j\le t_i+x_i-y_i\)
那么就是一个三维偏序问题。把所有点按 \(y\) 排序,然后第二维第三维用一个树状数组套线段树维护就行了。注意将从 \(0\) 都到不了的点清掉。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long LL;
int n,x,y,t,aaa,lshc[N],lshb[N],rt[N],lc[N*200],rc[N*200],idx;
LL k,ans,tr[N*200];
struct node{
int a,b,c,d;
bool operator<(const node&n)const{
if(a!=n.a)
return a<n.a;
if(b!=n.b)
return b<n.b;
return c<n.c;
}
}a[N];
void xiugai(int&o,int l,int r,int x,LL z)
{
if(!o)
o=++idx;
if(l==r)
{
tr[o]=max(tr[o],z);
return;
}
int md=l+r>>1;
if(md>=x)
xiugai(lc[o],l,md,x,z);
else
xiugai(rc[o],md+1,r,x,z);
tr[o]=max(tr[lc[o]],tr[rc[o]]);
}
LL query(int o,int l,int r,int x,int y)
{
if(!o)
return 0;
if(x<=l&&r<=y)
return tr[o];
int md=l+r>>1;
LL ans=0;
if(md>=x)
ans=max(ans,query(lc[o],l,md,x,y));
if(md<y)
ans=max(ans,query(rc[o],md+1,r,x,y));
return ans;
}
void update(int x,int y,LL z)
{
for(;x<=n;x+=x&-x)
xiugai(rt[x],1,n,y,z);
}
LL ask(int x,int y)
{
LL ans=0;
for(;x;x-=x&-x)
ans=max(ans,query(rt[x],1,n,1,y));
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&t,&x,&y,&aaa);
if(t-x-y<0||x+t-y<0)
{
--i,--n;
continue;
}
a[i]=(node){y,t-x-y,x+t-y,aaa};
lshb[i]=t-x-y;
lshc[i]=x+t-y;
}
for(int i=1;i<=n;i++)
rt[i]=++idx;
sort(a+1,a+n+1);
sort(lshb+1,lshb+n+1);
sort(lshc+1,lshc+n+1);
for(int i=1;i<=n;i++)
{
// printf("%d\n",i);
a[i].b=lower_bound(lshb+1,lshb+n+1,a[i].b)-lshb;
a[i].c=lower_bound(lshc+1,lshc+n+1,a[i].c)-lshc;
}
for(int i=1;i<=n;i++)
{
// puts("hjhyyds");
// printf("%d %d %d\n",a[i].b,a[i].c,a[i].d);
k=ask(a[i].b,a[i].c)+a[i].d;
update(a[i].b,a[i].c,k);
ans=max(ans,k);
}
printf("%lld",ans);
}
[ABC266Ex] Snuke Panic (2D)的更多相关文章
- 2D、3D形变
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Monaco; color: #a5b2b9 } span.Apple-tab-span { ...
- CSS 3学习——transform 2D转换
首先声明一点,transform属性不为none的元素是它的定位子元素(绝对定位和固定定位)的包含块,而且对内创建一个新的层叠上下文. 注意:可以通过 transform-box 属性指定元素的那个盒 ...
- UWP简单示例(三):快速开发2D游戏引擎
准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ...
- 赠书:HTML5 Canvas 2d 编程必读的两本经典
赠书:HTML5 Canvas 2d 编程必读的两本经典 这两年多一直在和HTML5 Canvas 打交道,也带领团队开发了世界首款基于HTML5 Canvas 的演示文档工具---AxeSlide( ...
- egret3D与2D混合开发,画布尺寸不一致的问题
egret3d的GUI目前还没有,在做3d游戏的时候没有UI可用,只能使用egret2d的EUI组件库,egret3d与egret2d混合开发,canvas3d的大小与位置与canvas2d并没有重合 ...
- 一段良好的程序永远不应该发生panic异常
panic来自被调函数的信号,表示发生了某个已知的bug.一段良好的程序永远不应该发生panic异常 对于大部分程序而言,永远无法保证能够成功运行,因为错误原因往往超出程序员的控制范围.任何进行io操 ...
- IOS 2D游戏开发框架 SpriteKit-->续(创建敌对精灵)
这次包括之后讲的spritekit 我都会围绕一个案例来说,这个案例就是一个简单的2d飞机大战游戏,今天这里我讲创建敌对精灵,就是敌对飞机,敌对飞机不停的被刷新到屏幕上.....当然这里涉及到的类其实 ...
- 2D动画的制作
通过css3的transform transition可以实现平移,旋转,缩放,拉伸等效果 1.缩放 -webkit-transform: scale(1); -moz-transform: sca ...
- 2D banner
1.这是我第一次发博客咯!看到本文章后不喜勿喷,有什么需要改进的地方请多多指教! 2.今天和大家分享一下2D banner,代码如下,注释都有.因为本地测试和上传到博客环境不太一样,样式变化比较大,样 ...
- 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了
地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图
随机推荐
- 使用flask开发web应用
Flask环境搭建 要开发flash应用,我们需要做一些准备工作 我写了个初始化的脚本 Pip_init.sh来安装初始工作 可以到我的git上去下载该脚本进行初始化安装 要启动flask应用,我们需 ...
- Azure Data Factory(八)数据集验证之服务主体(Service Principal)
一,引言 如下图所示,今天我们接着上一篇内容,继续讲解 Azure Data Factory 中的数据集连接服务的认证方式:Service Principal 关于 Service Principal ...
- WPF中的DesignerProperties
在WPF开发过程中,最容易遇到的一个问题:就是在自定义控件的过程中写好业务逻辑后,在调用的地方,打开.xmal文件设计器时出现异常,经过排查发现是由于自定义控件初始化过程中需要进行赋值操作.为了能够让 ...
- 每日一库:Prometheus
什么是 Prometheus Prometheus 是一个开源的系统监控和警报工具,最初由 SoundCloud 开发,并于 2012 年发布为开源项目.它是一个非常强大和灵活的工具,用于监控应用程序 ...
- Vue-入门vue,及第一个vue程序
一.初始Vue 什么是vue Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架.它基于标准 HTML.CSS 和 JavaScript 构建,并提 ...
- SpringBootAdmin_监控
监控的意义 监控服务状态是否宕机 监控服务运行指标(内存.虚拟机.线程.请求等) 监控日志 管理服务(服务下线) 监控的实施方式 大部分监控平台都是主动拉取监控信息,而不是被动地等待应用程序传递信息 ...
- Jmeter连接数据库sql语句操作,查询后取值做变量
第一步 :导入jar包 第二步 :创建JDBC Reques 第三步 :创建JDBC Connection Configuration 第四步:在request中输入数据进行操作 Query Typ ...
- Lab3 存储过程与触发器
实验三 存储过程与触发器 实验目的: 学习SQL语言进行编程的基本方法与技术,能够编写存储过程.触发器解决数据库需要处理的复杂问题. 实验内容: 1. 设计一个存储过程或者自定义函数,练习存储 ...
- 喜闻乐见最新的ORM查询BUG,看看有没你关注的
起因,想测试下查询语句的生成,按以下逻辑代码示例 var query = rep.GetLambdaQuery().Take(100); var join = query.Select(b => ...
- Langchain-Chatchat项目:4.2-P-Tuning v2使用的数据集
本文主要介绍P-tuning-v2论文中的5种任务,分别为Glue任务.NER任务.QA任务.SRL任务.SuperGlue任务,重点介绍了下每种任务使用的数据集. 一.Glue任务 GLUE ...