bzoj 2131 免费的馅饼
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 免费的馅饼的更多相关文章
- bzoj 2131 : 免费的馅饼 (树状数组优化dp)
		题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2131 思路: 题目给出了每个馅饼的下落时间t,和位置p,以及价值v,我们可以得到如下状态 ... 
- 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 ... 
- 【BZOJ】2131: 免费的馅饼
		2131: 免费的馅饼 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 508 Solved: 310[Submit][Status][Discuss ... 
- [bzoj2131]免费的馅饼 树状数组优化dp
		2131: 免费的馅饼 Time Limit: 10 Sec Memory Limit: 259 MB[Submit][Status][Discuss] Description Input 第一行是 ... 
- [bzoj2131]免费的馅饼_树状数组
		免费的馅饼 bzoj-2131 题目大意: 注释:$1\le n \le 10^5$,$1\le w \le 10^8$. 想法:首先,想到dp 状态:dp[i][j]表示i分钟在位置j的最大收益 优 ... 
- 免费的馅饼 HYSBZ - 2131 (树状数组维护二维偏序)
		题目链接:https://cn.vjudge.net/problem/HYSBZ-2131 题目大意:中文题目 具体思路:对于任意的两个位置,posA和posB,我们可以如下推导. |posA-pos ... 
- bzoj2131 免费的馅饼——树状数组优化dp
		中文题目,问你最后能最多够得到多少价值的馅饼.因为宽度10^8且个数为10^5.所以不可以用dp[x][y]表示某时间某地点的最大权值. 假设你在x点处接到饼后想去y点接饼.那么需要满足的条件是t[y ... 
- BZOJ2131 免费的馅饼【线段树优化DP】
		Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三个正整数组成,分别表示了每个馅饼落到 ... 
- BZOJ 2131 [scoi2010] 传送带
		@(BZOJ)[三分法] Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段. 两条传送带分别为线段AB和线段CD. lxhgww在AB上的移动速度为P,在CD上的移 ... 
随机推荐
- 体系编程、SOC编程那些事儿
			转:https://blog.csdn.net/yueqian_scut/article/details/49968897 笔者将从芯片IC的系统设计的角度去诠释如何掌握体系编程和SOC编程.笔者有超 ... 
- CF932E Team Work(第二类斯特林数)
			题目 CF932E Team Work 前置:斯特林数\(\Longrightarrow\)点这里 做法 \[\begin{aligned}\\ &\sum\limits_{i=1}^n C_ ... 
- 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?
			import random import string def GenKey(length): chars = string.ascii_letters + string.digits return ... 
- 深入理解PHP之:Nginx 与 FPM 的工作机制
			网络上有很多关于如何配置 Nginx + FPM 的文章,但它们更多从操作的角度出发,告诉我们怎么做,但却没有告诉我们为什么要这么做,本文从 Nginx 与 FPM 的工作机制出发,探讨配置背后的原理 ... 
- phoenix部署手册-基于hbase
			背景描述: phoenix基于hbase的SQL层,映射hbase的表,也可以映射视图(VIEW) 部署安装比较简单 映射表和视图的区别: 映射表: 在Phoenix建表错误不易更改: 删除会连同hb ... 
- 20145201《Java程序设计》第7周学习总结
			20145201 <Java程序设计>第七周学习总结 教材学习内容总结 本周学习了课本第十二.十三章内容,即Lambda.时间与日期 第十二章 Lambda 12.1 认识Lambda语法 ... 
- python django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct[转]
			1.多表连接查询:当我知道这点的时候顿时觉得django太NX了. class A(models.Model): name = models.CharField(u'名称') clas ... 
- hi.baidu.com  百度流量统计
			在字幕侠的官网访问之后,发现 <meta name="baidu-site-verification" content="3uvZd9Aact" /> ... 
- java关键词整理——思维导图
			如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/5e27f174483042 
- ExtJS Ext.Ajax.request最好设为同步
			ExtJS 中Ext.Ajax.request最好设为同步,即async: false,因为如果Ajax后面需要用到Ajax更新的数据的话,设置同步,后面才能用到最新的数据. function Get ... 
