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 十分纠结究竟要带多少的现金,假如现金带多了,就会比较危险,假如带少了,看到想买的右 ...
随机推荐
- 推荐一款ui架构--frozenui
首页是这样定义的 移动框架 重磅出击 简单易用,轻量快捷,为移动端服务的前端框架 链接地址 http://frozenui.github.io/base.html#layout
- windows php5.5安装redis扩展,并用redis存储session
1.确定安装版本 先通过phpinfo()查看php的Compiler.Architecture.Thread Safety,其中Thread Safety如果是enabled,那么就是线程安全(ts ...
- [POI2014]FAR-FarmCraft (树规+贪心)
题干 In a village called Byteville, there are houses connected with N-1 roads. For each pair of houses ...
- testNG jar包启动找不到org.testng.TestNG
主要是因为打包时依赖的jar包没有打入,网上有很多需要将对应的jar单独拷贝出来然后通过classpath引用启动,但是感觉这个就是个无底洞.拷贝了这么多个包最后还是说找不到ObjectId 启动命令 ...
- SSTI(模板注入)
SSTI 一. 什么是SSTI 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. ...
- 数据可视化之powerBI基础(八)PowerBI的表格,你真的会用吗
https://zhuanlan.zhihu.com/p/64413000 在PowerBI的可视化对象中,还有两个「表格」对象,表格的作用不仅可以在报表提供明细数据,还经常用来测试度量值的返回结果, ...
- 数据可视化之 图表篇(一)Power BI可视化,几张图表认识疫情现状
近期国际疫情愈演愈烈,在这个特殊的时期,一方面仍要照顾好自己.不要为疫情防治添乱,另一方面,也可以利用疫情数据提升自己的数据分析和可视化技能. 下面是我制作的几个可视化图表,分别注释了每个可视化用到 ...
- Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归
Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 目录 Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 内容纲要 1.函数名的第一类对象及使用 2.f ...
- 保存与恢复变量和模型,tensorflow官方文档阅读笔记
官方中文文档的网址先贴出来:https://tensorflow.google.cn/programmers_guide/saved_model tf.train.Saver 类别提供了保存和恢复模型 ...
- bzoj3892[Usaco2014 Dec]Marathon*
bzoj3892[Usaco2014 Dec]Marathon 题意: 在二维平面上有N个点,从(x1,y1)到(x2,y2)的代价为|x1-x2|+|y1-y2|.求从1号点出发,按从1到N的顺序依 ...