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

免费的馅饼 bzoj-2131

题目大意

注释:$1\le n \le 10^5$,$1\le w \le 10^8$。

想法:首先,想到dp

状态:dp[i][j]表示i分钟在位置j的最大收益

优化优化

状态:dp[i]表示最后收到i的最大收益。

转移:顺序枚举i:1->n即可。

然后,我们尝试优化

对于这个状态我们会发现转移的时候有一个绝对值的死东西,我们将它拆开就有:

2*t[j]+pos[j]<=2*t[i]+pos[i]且2*t[j]-pos[j]<=2*t[i]-pos[i]

然后按照减法为下标,用加法在树状数组上更新即可。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int w,n,f[100010],hash[100010],cnt,ans,s[100010];
struct pies
{
	int t,p,v,w1,w2;
}a[100010];
int cmp(const pies &a,const pies &b)
{
	return a.w1<b.w1;
}
int lowbit(int x){return x&(-x);}
int ask(int i)
{
	int Max=0;
	while (i!=0)
	{
		Max=max(Max,s[i]);
		i-=lowbit(i);
	}
	return Max;
}
void add(int i,int val)
{
	while (i<=cnt)
	{
		s[i]=max(s[i],val);
		i+=lowbit(i);
	}
}
int main()
{
	scanf("%d%d",&w,&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&a[i].t,&a[i].p,&a[i].v);
		a[i].t*=2;
		a[i].w1=a[i].t-a[i].p;
		a[i].w2=a[i].t+a[i].p;
		hash[++cnt]=a[i].w2;
	}
	sort(hash+1,hash+cnt+1);
	cnt=unique(hash+1,hash+cnt+1)-hash-1;
	for (int i=1;i<=n;i++)
	{
		a[i].w2=lower_bound(hash+1,hash+cnt+1,a[i].w2)-hash;
	}
	sort(a+1,a+n+1,cmp);
	for (int i=1;i<=n;i++)
	{
		f[i]=ask(a[i].w2)+a[i].v;
		ans=max(ans,f[i]);
		add(a[i].w2,f[i]);
	}
	printf("%d\n",ans);
	return 0;
}

小结:无。

原文地址:https://www.cnblogs.com/ShuraK/p/9363131.html

时间: 2024-10-08 08:52:49

[bzoj2131]免费的馅饼_树状数组的相关文章

【bzoj2131】免费的馅饼 dp+树状数组

题解: 昨天好像做了个几乎一模一样的题目 按照ti排序 |p[i]-p[j]|<=2*(t[i]-t[j]) 然后去绝对值变为三维偏序 发现后两个式子可以推出ti<tj 所以就变成二维偏序 按照一个排序套树状数组就可以了 原文地址:https://www.cnblogs.com/yinwuxiao/p/9665328.html

See you~_树状数组

Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algorithm and Programming, and I met so many good friends. I want to say sorry to Mr, Yin, I must leave now ~~>.<~~. I am very sorry, we

BZOJ_3653_谈笑风生_树状数组

Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ? 设a 和 b 为 T 中的两个不同节点.如果 a 与 b 在树上的距离不超过某个给定 常数x,那么称“a 与b 谈笑风生”. 给定一棵n个节点的有根树T,节点的编号为1 到 n,根节点为1号节点.你需 要回答q 个询问,询问给定两个整数p和k,问有多少个有序三元组(a;b;c)满足: 1. a.b和 c为 T 中三个不同的点,且 a为

BZOJ_5055_膜法师_树状数组+离散化

Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘积, 但目前的宇宙很不乐观,胡乱偷取可能造成维度的崩溃, 所以,他必须按逆序偷取这些维度,且在偷取中, 每次偷取的维度的能量必须严格小于他上次偷取的能量, 由于膜法师生活在多元宇宙,所以他可以让所有可能的偷取方案全部发生 题目描述 但他数学不好,所以找到了你帮他求出能为长者续几秒, 你要做的,就是在

[bzoj3529][Sdoi2014]数表_树状数组_莫比乌斯反演

数表 bzoj-3529 Sdoi-2014 题目大意:n*m的数表,第i行第j列的数是同时整除i和j的所有自然数之和.给定a,求数表中所有不超过a的和. 注释:$1\le n,m \le 10^5$. 想法:我们先不考虑那个a的限制:我们设f(i)表示整除i的自然数之和. $\sum\limits_{i=1}^n\sum\limits_{j=1}^m f(gcd(i,j))$ $\sum\limits_{i=1}^n\sum\limits_{j=1}^m f(d)\cdot [gcd(i,j)

[bzoj1103][POI2007]大都市meg_dfs序_树状数组

大都市meg bzoj-1103 POI-2007 题目大意:给定一颗n个点的树,m次操作.将一条路的边权更改成0:查询一个点到根节点的点权和.开始的时候所有边的边权都是1. 注释:$1\le n,m\le 2.5\cdot 10^5$. 想法:我们先拉出dfs序.其实严格来讲是出栈入栈序,就是每个点在序上出现两次的那个. 开始的时候入栈时的点权是1,出栈是-1.修改就是把出栈入栈都改成0.然后用树状数组查询前缀和即可. 最后,附上丑陋的代码... ... #include <iostream>

[bzoj3378][Usaco2004 Open]MooFest 狂欢节_树状数组

MooFest 狂欢节 bzoj-3378 Usaco-2004 Open 题目大意:给定一个n个数的a序列,每两个数之间有一个距离,两个点之间的权值为$max(a[i],a[j])*dis(i,j)$. 注释:$1\le n\le 2\cdot 10^4$. 想法:裙子说了,这种$max$和$min$的题通常要枚举这个$max$和$min$到底是多少. 这样的话我们就将所有点按权值从大到小排序. 往树状数组里插. 查询直接查询即可. 最后,附上丑陋的代码... ... #include <io

[bzoj3289]Mato的文件管理_莫队_树状数组

Mato的文件管理 bzoj-3289 题目大意:给定一个n个数的序列.m次询问:一段区间中的逆序对个数. 注释:$1\le n\,mle 5\cdot 10^4$. 想法: 开始想这个题的大佬们,给您点儿提示吧:$O(nlogn\sqrt(n))$可过哦! 所以这个题就是莫队的裸题了. 我们的莫队上的区间在动的时候随时更新树状数组上的信息即可.. 然后碰见了一整块区间,我们就直接求逆序对即可, 最后,附上丑陋的代码... ... #include <iostream> #include &l

敌兵布阵_树状数组

Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Dere