loj #6039 「雅礼集训 2017 Day5」珠宝 分组背包 决策单调性优化
LINK:珠宝
去年在某个oj上写过这道题 当时懵懂无知wa的不省人事 终于发现这个东西原来是有决策单调性的。
可以发现是一个01背包 但是过不了 冷静分析 01背包的复杂度有下界 如果过不了说明必然存在某种特殊的条件。
果然 物品的代价<=300. 一个贪心对于代价相同的物品显然可以优先选取最大的 我们把代价相同的物品给压在一起。
可以发现 这类似于分组背包的dp f[i]表示i容量的最大值 f[i]=max(f[i-j*c]+w[c][j]);
不过这个w数组差分之后是逐渐递减的。
可以发现 可以利用单调队列优化 不过我们只能维护一半单调队列 因为队列里的点的值每次增加各不相同 也并不单调。
所以无法快速查找决策。
但是 我们可以考虑一下决策的单调性 对于 i来说 有决策 i-kp 或者 i-wp (w>k). 如果前者比后者优那么对于更大的 i来说 刚刚的i-kp仍然比i-wp优 因为w数组是差分后单调递减的 所以显然。
所以对于一个点w来说 其最优决策为 k 那么对于比w大的那些点来说 决策是单调递增的。
对于决策单调性优化dp 可以采用分治法 或者 存三元组单调队列上二分法。
这里建议采用分治法 简单粗暴 好写 常数小。
一个小坑点:在分治的时候 >=也要更新 因为可能之后的所有决策没有能更新当前mid的 也没有能和mid相等的 这个点可能更新后面的点 所以我们要保留这样的一个点来对后面造成贡献。
可以发现对前面没有什么影响。
const int MAXN=1000010;
int n,m,maxx,now;
vector<ll>v[310];
ll f[MAXN],g[MAXN],s[MAXN],sum[MAXN];
inline ll cmp(ll x,ll y){return x>y;}
inline void solve(int l,int r,int L,int R)//L~R为决策转移空间
{
	int mid=(l+r)>>1;
	int p=mid;g[mid]=s[mid];
	for(int i=L;i<=R&&i<mid;++i)
	{
		ll ww=s[i]+sum[mid-i];
		if(ww>g[mid])g[mid]=ww,p=i;
	}
	if(l<mid)solve(l,mid-1,L,p);
	if(r>mid)solve(mid+1,r,p,R);
}
int main()
{
	freopen("1.in","r",stdin);
	n=read();m=read();
	rep(1,n,i)
	{
		int x=read(),y=read();
		v[x].push_back(y);
		maxx=max(maxx,x);
	}
	rep(1,maxx,i)
	{
		if(!v[i].size())continue;now=i;
		sort(v[i].begin(),v[i].end(),cmp);
		int len=m/i,sz=v[i].size();
		rep(1,len,j)sum[j]=sum[j-1]+(j>sz?0:v[i][j-1]);
		for(int j=0;j<i;++j)
		{
			int top=0;
			for(int k=j;k<=m;k+=i)s[++top]=f[k];
			solve(1,top,1,top);
			for(int k=j,w=1;k<=m;k+=i,++w)f[k]=g[w];
		}
	}
	for(int i=1;i<=m;++i)printf("%lld ",f[i]);
	return 0;
}
loj #6039 「雅礼集训 2017 Day5」珠宝 分组背包 决策单调性优化的更多相关文章
- [LOJ#6039].「雅礼集训 2017 Day5」珠宝[决策单调性]
		题意 题目链接 分析 注意到本题的 \(C\) 很小,考虑定义一个和 \(C\) 有关的状态. 记 \(f(x,j)\) 表示考虑到了价格为 \(x\) 的物品,一共花费了 \(j\) 元的最大收益. ... 
- @loj - 6039@ 「雅礼集训 2017 Day5」珠宝
		目录 @description@ @solution@ @accpeted code@ @details@ @description@ Miranda 准备去市里最有名的珠宝展览会,展览会有可以购买珠 ... 
- [loj6039]「雅礼集训 2017 Day5」珠宝 dp+决策单调性+分治
		https://loj.ac/problem/6039 我们设dp[i][j]表示考虑所有价值小于等于i的物品,带了j块钱的最大吸引力. 对于ci相同的物品,我们一定是从大到小选k个物品,又发现最大的 ... 
- LOJ#6038. 「雅礼集训 2017 Day5」远行(LCT)
		题面 传送门 题解 要不是因为数组版的\(LCT\)跑得实在太慢我至于去学指针版的么--而且指针版的完全看不懂啊-- 首先有两个结论 1.与一个点距离最大的点为任意一条直径的两个端点之一 2.两棵树之 ... 
- 【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行
		题目描述 Miranda 生活的城市有 \(N\) 个小镇,一开始小镇间没有任何道路连接.随着经济发现,小镇之间陆续建起了一些双向的道路但是由于经济不太发达,在建设过程中,会保证对于任意两个小镇,最多 ... 
- loj#6040. 「雅礼集训 2017 Day5」矩阵(线性代数+递推)
		题面 传送门 题解 我的线代学得跟屎一样看题解跟看天书一样所以不要指望这题我会写题解 这里 //minamoto #include<bits/stdc++.h> #define R reg ... 
- loj#6038 「雅礼集训 2017 Day5」远行
		分析 代码 #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ... 
- LOJ#6038. 「雅礼集训 2017 Day5」远行 [LCT维护子树的直径]
		树的直径一定是原联通块4个里的组合 1.LCT,维护树的直径,这题就做完了 2.直接倍增,lca啥的求求距离,也可以吧- // powered by c++11 // by Isaunoya #inc ... 
- 「雅礼集训 2017 Day5」珠宝
		题目描述 Miranda 准备去市里最有名的珠宝展览会,展览会有可以购买珠宝,但可惜的是只能现金支付,Miranda 十分纠结究竟要带多少的现金,假如现金带多了,就会比较危险,假如带少了,看到想买的右 ... 
随机推荐
- web开发,前后分离接口规范
			1. 前言 随着互联网的高速发展,前端页面的展示.交互体验越来越灵活.炫丽,响应体验也要求越来越高,后端服务的高并发.高可用.高性能.高扩展等特性的要求也愈加苛刻,从而导致前后端研发各自专注于自己擅长 ... 
- UiAutomator源码学习(1)-- UiDevice
			UiDevice提供对设备状态信息的访问. 也可以使用此类来模拟设备上的用户操作,例如按键盘或按Home和Menu按钮.UiDevice类的完整源码 UiDevice.java 废话不多说,我们首先根 ... 
- 【线型DP】【LCS】洛谷P4303 [AHOI2006]基因匹配
			P4303 [AHOI2006]基因匹配 标签(空格分隔): 考试题 nt题 LCS优化 [题目] 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ... 
- HttpContext, HttpContextBase, HttpContextWrapper之间关系
			HttpContext是最原始的ASP.NET Context. MVC的目的之一是能够单元测试. HttpContextBase, 是用来在MVC中替代HttpContext.但是这是一个abstr ... 
- spring cloud gateway 限流做法
			标题 随风倒十分 反对法 
- Scala 面向对象(十一):特质(接口) 四
			1 扩展类的特质 特质可以继承类,以用来拓展该类的一些功能 所有混入该特质的类,会自动成为那个特质所继承的超类的子类 如果混入该特质的类,已经继承了另一个类(A类),则要求A类是特质超类的子类,否则就 ... 
- selenium:selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
			可用链接: 1.http://blog.csdn.net/heatdeath/article/details/71136174 2.https://www.cnblogs.com/yousuosiys ... 
- bzoj2288【POJ Challenge】生日礼物*
			bzoj2288[POJ Challenge]生日礼物 题意: 给一个序列,求不超过m个连续的部分,使元素和最大.序列大小≤100000 题解: 先把连续的正数和负数合并起来,接着如果正数个数小于m则 ... 
- 像写Flutter一样开发Android原生应用
			要问到Flutter和Android原生App,在开发是有何区别,编程方式是绕不开的话题.Flutter采用声明式编程,Android原生开发则采用命令式编程. 声明式编程 VS. 命令式编程 我们首 ... 
- 不是吧,阿sir,2020年程序员要不好过?
			自从网传程序员到了35岁之后必须要转行,现在又有人传言:“疫情之下,程序员今年要过苦日子了,降薪裁员是大趋势.” 不是,我就不明白了,你们怎么就看不得程序员好呢?天天巴望着程序员降薪.转行.裁员… ... 
