Written with StackEdit.

Description

Input

第一行是用空格隔开的二个正整数,分别给出了舞台的宽度\(W\)(\(1\)到\(10^8\)之间)和馅饼的个数\(n\)(\(1\)到\(10^5\)).接下来\(n\)行,每一行给出了一块馅饼的信息。由三个正整数组成,分别表示了每个馅饼落到舞台上的时刻t[i](\(1\)到\(10^8\)秒),掉到舞台上的格子的编号\(p[i]\)(\(1\)和\(w\)之间),以及分值\(v[i]\)(\(1\)到\(1000\)之间)。游戏开始时刻为\(0\)。输入文件中同一行相邻两项之间用一个空格隔开。输入数据中可能存在两个馅饼的\(t[i]\)和\(p[i]\)都一样。

Output

一个数,表示游戏者获得的最大总得分。

Sample Input

3 4

1 2 3

5 2 3

6 3 4

1 1 5

Sample Output

12

HINT

对于\(100\%\)的数据,\(1<=w,t[i]<=10^8,1<=n<=100000.\)

Solution

  • 比较明显的朴素\(dp\)思路是,设\(f[i]\)表示最后拿的一个饼是第\(i\)个的最大收益.
  • 显然有\(f[i]=max\){\(f[j]|j<i,|p[i]-p[j]|\leq 2(t[i]-t[j])\)}\(+v[i]\).
  • 这样是\(O(n^2)\)的,需要优化.
  • 我们将限制条件中的绝对值式子拆开,得到两个不等式.
    • \(2t[i]+p[i]\geq 2t[j]+p[j].\)
    • \(2t[i]-p[i]\geq 2t[j]-p[j].\)
  • 那么我们将\(2t+p,2t-p\)视作两维,先按照一维排序,再对另一维离散化,利用树状数组优化转移.
  • \(j<i\)的条件此时可以直接忽略掉,因为\(f[i]\)现在表示某一维的值对应的最优解,不再与时间联系.
#include<bits/stdc++.h>
#define lowbit(x) x&(-x)
const int inf=1e9;
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
const int MAXN=1e5+10;
struct pies{
int t,p,v;//落地时间,落地位置,价值
int a,b;//b存储离散化后的值
// a = 2*t + p
// b = 2*t - p
bool operator < (const pies &rhs) const {
return a<rhs.a;
}
}x[MAXN];
struct unipies{
int b,id;
bool operator < (const unipies &rhs) const {
return b<rhs.b;
}
}y[MAXN];
int n,w;
int unin=0;
int f[MAXN];
//f[i]=f[j]+v[i], j<i && abs(p[i]-p[j])<=2*(t[i]-t[j])
void Unique()
{
sort(y+1,y+1+n);
y[0].b=-inf;
for(int i=1;i<=n;++i)
{
if(y[i].b!=y[i-1].b)
++unin;
x[y[i].id].b=unin;
}
}
int bit[MAXN];
inline void upd(int x,int c)
{
for(;x<=unin;x+=lowbit(x))
bit[x]=max(bit[x],c);
}
inline int query(int x)
{
int res=-inf;
for(;x;x-=lowbit(x))
res=max(res,bit[x]);
return res;
}
int main()
{
w=read(),n=read();
for(int i=1;i<=n;++i)
{
x[i].t=read();
x[i].p=read();
x[i].v=read();
x[i].a=x[i].t*2+x[i].p;
y[i].b=x[i].t*2-x[i].p;
y[i].id=i;
}
Unique();
sort(x+1,x+1+n);
for(int i=1;i<=n;++i)
{
int newv=query(x[i].b)+x[i].v;
upd(x[i].b,newv);
}
int ans=query(unin);
printf("%d\n",ans);
return 0;
}

参考了dalao的blog.

bzoj 2131 免费的馅饼的更多相关文章

  1. bzoj 2131 : 免费的馅饼 (树状数组优化dp)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2131 思路: 题目给出了每个馅饼的下落时间t,和位置p,以及价值v,我们可以得到如下状态 ...

  2. bzoj 2131: 免费的馅饼【dp+树状数组】

    简单粗暴的dp应该是把馅饼按时间排序然后设f[i]为i接到馅饼能获得的最大代价,转移是f[i]=max(f[j])+v[i],t[j]<=t[i],2t[i]-2t[j]>=abs(p[i ...

  3. 【BZOJ】2131: 免费的馅饼

    2131: 免费的馅饼 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 508  Solved: 310[Submit][Status][Discuss ...

  4. [bzoj2131]免费的馅饼 树状数组优化dp

    2131: 免费的馅饼 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description Input 第一行是 ...

  5. [bzoj2131]免费的馅饼_树状数组

    免费的馅饼 bzoj-2131 题目大意: 注释:$1\le n \le 10^5$,$1\le w \le 10^8$. 想法:首先,想到dp 状态:dp[i][j]表示i分钟在位置j的最大收益 优 ...

  6. 免费的馅饼 HYSBZ - 2131 (树状数组维护二维偏序)

    题目链接:https://cn.vjudge.net/problem/HYSBZ-2131 题目大意:中文题目 具体思路:对于任意的两个位置,posA和posB,我们可以如下推导. |posA-pos ...

  7. bzoj2131 免费的馅饼——树状数组优化dp

    中文题目,问你最后能最多够得到多少价值的馅饼.因为宽度10^8且个数为10^5.所以不可以用dp[x][y]表示某时间某地点的最大权值. 假设你在x点处接到饼后想去y点接饼.那么需要满足的条件是t[y ...

  8. BZOJ2131 免费的馅饼【线段树优化DP】

    Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三个正整数组成,分别表示了每个馅饼落到 ...

  9. BZOJ 2131 [scoi2010] 传送带

    @(BZOJ)[三分法] Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段. 两条传送带分别为线段AB和线段CD. lxhgww在AB上的移动速度为P,在CD上的移 ...

随机推荐

  1. OpenGL中的Shader

    http://blog.csdn.net/huangcanjun187/article/details/52474365 学习总结自:http://learnopengl.com/#!Getting- ...

  2. python中访问限制

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...

  3. JMS、MQ、ActiveMQ

    JMS 的一个标准或者说是一个协议. 通常用于企业级应用的消息传递. 主要有topic 消息(1 对多), queue 消息(1对1). ActiveMQ 是一个JMS 的实现, apache 出的. ...

  4. 重置root密码后仍然不能登陆

    一.忘记密码:二.输入正确用户名和密码时依旧无法登录. 一.忘记密码 进入单用户模式重置密码: 开机启动时,按‘E’键(倒计时结束前)进入界面 选择第二项,按‘E’键再次进入 在最后一行添加‘ 1’( ...

  5. Monkey测试命令【学习笔记】

    monkey --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes -v 30 ...

  6. PHP练习题二

    1.抓取远程图片到本地,你会用什么函数? fsockopen, A 2.用最少的代码写一个求3值最大值的函数. function($a,$b,$c){* W0 z* u6 k+ e. L  a: }5 ...

  7. SpringMVC的HelloWorld快速入门!

    1.加入JAR包: commons-logging-1.1.3.jar spring-aop-4.0.0.RELEASE.jar spring-beans-4.0.0.RELEASE.jar spri ...

  8. Android -- ContentProvider 内容提供者,创建和调用

    1. 概述 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentPr ...

  9. 2017版:KVM 性能优化之内存优化

    我们说完CPU方面的优化,接着我们继续第二块内容,也就是内存方面的优化.内存方面有以下四个方向去着手: EPT 技术 大页和透明大页 KSM 技术 内存限制 1. EPT技术 EPT也就是扩展页表,这 ...

  10. 手把手教你用Vue2+webpack+node开发一个H5 app

    手把手教你用Vue2+webpack+node开发一个H5 app ​前一篇vue2 + webpack + node 开发一个小demo说到了用vue的一些基本用法,这一篇就讲一个复杂一点的更完整的 ...