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 十分纠结究竟要带多少的现金,假如现金带多了,就会比较危险,假如带少了,看到想买的右 ...
随机推荐
- 如何写出高性能的CSS3动画
小伙伴们在写CSS3动画时,会发现在手机上很多时候会感到卡顿,然后Google到的解决方案大多是开启GPU加速transform: translate3d(0,0,0); 可解决,但是为什么开启GPU ...
- pandas 模拟生成数据集的快速方法
快速生成一个DataFrame的方法: #模拟生成数据集的方法 import pandas as pd import numpy as np boolean=[True,False] gender=[ ...
- Django初级之django简介
1.Django简介 Django是Python语言中的一个web框架,Python语言中主流的web框架有Django.Tornado.Flask 等多种.Django相较与其它WEB框架,其优势为 ...
- 微信小程序开发中遇到的几个小问题
本地图片不显示,开发工具运行是没问题的,但真机调试却显示不了 item.img = '/goods/img/图片.png' <image src="{{item.img}}" ...
- java 面向对象(三十七):反射(一) 反射的概述
1.本章的主要内容 2.关于反射的理解 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属 ...
- 数据可视化之分析篇(九)PowerBI数据分析实践第三弹 | 趋势分析法
https://zhuanlan.zhihu.com/p/133484654 以财务报表分析为例,介绍通用的分析方法论,整体架构如下图所示: (点击查看大图) 我会围绕这五种不同的方法论,逐步阐述他们 ...
- python面向对象07/异常处理
python面向对象07/异常处理 目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 ...
- MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列)
写在之前:不建议那种上来就是各种面试题罗列,然后背书式的去记忆,对技术的提升帮助很小,对正经面试也没什么帮助,有点东西的面试官深挖下就懵逼了. 个人建议把面试题看作是费曼学习法中的回顾.简化的环节,准 ...
- JavaScript动画实例:螺旋线
数学中有各式各样富含诗意的曲线,螺旋线就是其中比较特别的一类.螺旋线这个名词来源于希腊文,它的原意是“旋卷”或“缠卷”.例如,平面螺旋便是以一个固定点开始向外逐圈旋绕而形成的曲线.在2000多年以前, ...
- void operator()()的功能
在学习多线程的时候看到这样的一段代码,为什么要重载()呢?真有这个必要吗? #include <iostream> #include <thread> class Counte ...