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\) 转移.

  1. \(t_j<t_i\)
  2. \(y_j<y_i\)
  3. \(|x_i-x_j|+y_i-y_j\le t_i-t_j\)(路程差要小于时间差)

然后会发现,若条件 3 满足,条件 1 也满足。

然后把条件 3 的绝对值拆开,移项。

  1. \(y_j<y_i\)
  2. \(t_j-x_j-y_j\le t_i-x_i-y_i\)
  3. \(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)的更多相关文章

  1. 2D、3D形变

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Monaco; color: #a5b2b9 } span.Apple-tab-span { ...

  2. CSS 3学习——transform 2D转换

    首先声明一点,transform属性不为none的元素是它的定位子元素(绝对定位和固定定位)的包含块,而且对内创建一个新的层叠上下文. 注意:可以通过 transform-box 属性指定元素的那个盒 ...

  3. UWP简单示例(三):快速开发2D游戏引擎

    准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ...

  4. 赠书:HTML5 Canvas 2d 编程必读的两本经典

    赠书:HTML5 Canvas 2d 编程必读的两本经典 这两年多一直在和HTML5 Canvas 打交道,也带领团队开发了世界首款基于HTML5 Canvas 的演示文档工具---AxeSlide( ...

  5. egret3D与2D混合开发,画布尺寸不一致的问题

    egret3d的GUI目前还没有,在做3d游戏的时候没有UI可用,只能使用egret2d的EUI组件库,egret3d与egret2d混合开发,canvas3d的大小与位置与canvas2d并没有重合 ...

  6. 一段良好的程序永远不应该发生panic异常

    panic来自被调函数的信号,表示发生了某个已知的bug.一段良好的程序永远不应该发生panic异常 对于大部分程序而言,永远无法保证能够成功运行,因为错误原因往往超出程序员的控制范围.任何进行io操 ...

  7. IOS 2D游戏开发框架 SpriteKit-->续(创建敌对精灵)

    这次包括之后讲的spritekit 我都会围绕一个案例来说,这个案例就是一个简单的2d飞机大战游戏,今天这里我讲创建敌对精灵,就是敌对飞机,敌对飞机不停的被刷新到屏幕上.....当然这里涉及到的类其实 ...

  8. 2D动画的制作

    通过css3的transform  transition可以实现平移,旋转,缩放,拉伸等效果 1.缩放 -webkit-transform: scale(1); -moz-transform: sca ...

  9. 2D banner

    1.这是我第一次发博客咯!看到本文章后不喜勿喷,有什么需要改进的地方请多多指教! 2.今天和大家分享一下2D banner,代码如下,注释都有.因为本地测试和上传到博客环境不太一样,样式变化比较大,样 ...

  10. 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了

    地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图

随机推荐

  1. PhotoShop Beta(爱国版)安装教程-内置AI绘画功能

    PS beta版安装教程 Window和Mac版都有,里面内置AI绘画功能 ps Beta版真的太爽了,今天来和大家分享下安装教程. 很多人拿这资料卖5块 9.9 19.9,球友们直接用,建议赶紧装, ...

  2. influxdb 函数 non_negative_derivative 使用

    转载请注明出处: 在InfluxDB中,non_negative_derivative()函数用于计算指定字段的非负导数.它可以用来计算时间序列数据的速率或增长率. 该函数的语法如下: non_neg ...

  3. 教你用API插件开发一个AI快速处理图片小助手

    本文分享自华为云社区<[案例教学]华为云API图引擎服务 GES的便捷性-AI帮助快速处理图片小助手>,作者:华为云PaaS服务小智. 调用云服务.API.SDK.调试.查看-- &quo ...

  4. Solution -「CF 888E」Maximum Subsequence

    Description Link. 给一个数列和 \(m\),在数列任选若干个数,使得他们的和对 \(m\) 取模后最大. Solution 记录一下犯下的一个 nt 错误. 首先我们有一个显然的 D ...

  5. 想转行DevOps工程师?快来看看DevOps工程师的学习路径,少走弯路

    DevOps方法论 :::tips DevOps方法论的主要来源是Agile, Lean 和TOC, 独创的方法论是持续交付. ::: DevOps 是一种软件开发方法,涉及持续开发,持续测试,持续集 ...

  6. Go语言常用标准库——log、net_http、strconv、time包

    文章目录 log 使用Logger 配置logger 标准logger的配置 flag选项 配置日志前缀 配置日志输出位置 创建logger 总结 net_http net/http介绍 HTTP协议 ...

  7. scnhealthcheck

    在CPU补丁中,Oracle提供了一个脚本 scnhealthcheck.sql 用于检查数据库当前SCN的剩余情况.该脚本的算法和以上描述相同,最终将最大合理SCN 减去当前数据库SCN,计算得出一 ...

  8. Arithmetic Progression 题解

    Arithmetic Progression 题目大意 存在一个打乱了顺序的等差数列 \(a\),你可以询问不超过 \(60\) 次,每次可以以以下两种方式之一进行询问: 查询 \(a\) 中是否有严 ...

  9. 练习回—编译安装nginx

    练习回 练习,编译安装nginx. 1.yum安装依赖环境 yum -y install pcre-devel zlib-devel gcc gcc-c++ make 2."下载" ...

  10. Office XXE攻击

    一.什么是Office XXE攻击 Office XXE攻击是xxe攻击的一种,由于.xlsx与.docx是基于xml文件存储内容的,后端在解析这些xml时自然也会存在xxe攻击的可能. 这里是.xl ...