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 十分纠结究竟要带多少的现金,假如现金带多了,就会比较危险,假如带少了,看到想买的右 ...
随机推荐
- 常见的H5移动端Web页面Bug问题解决方案总汇
解决jquery ajax调用远程接口的跨域问题 首先,接口必须允许远程调用.这是后端或者运维的事情.你必须保证你得到的一个接口是允许远程调用的.否则,就没啥了. $.ajax({ type:'get ...
- Layui数据表格加入自定义扩展方法(重新渲染Render当前页数据)
具体开发中遇到的问题如下, 数据表格的重新渲染或重新加载会导致当前操作的分页 或 配置被清空.我正在操作第5页,重新渲染后就回到了最原始第1页. 需要达到的效果是: 不调用接口,仅仅只是从table. ...
- Mybatis源码初探——优雅精良的骨架
@ 目录 前言 精良的Mybatis骨架 宏观设计 基础支撑 日志 日志的加载 日志的使用 数据源 数据源的创建 池化技术原理 数据结构 获取连接 回收连接 缓存 缓存的实现 CacheKey 反射 ...
- 洛谷 P3694 邦邦的大合唱站队 状压DP
题目描述 输入输出样例 输入 #1 复制 12 4 1 3 2 4 2 1 2 3 1 1 3 4 输出 #1 复制 7 说明/提示 分析 首先要注意合唱队排好队之后不一定是按\(1.2.3..... ...
- Python-读取文件的大小
1.python读取文件以及文件夹的大小 1. os.path.getsize(file_path):file_path为文件路径 import os os.path.getsize('d:/svn/ ...
- python入门006
一:可变与不可变类型 可变类型:值改变,id不变,证明改的是原值,证明原值是可以被改变的 不可变类型:值改变,id也变了,证明是产生新的值,压根没有改变原值,证明原值是不可以被修改的 2.验证 2.1 ...
- Linux下diff命令用法详解
大家好,我是良许. 我们在平时工作的时候,经常要知道两个文件之间,以及同个文件不同版本之间有何异同点.在 Windows 下,有 beyond compare 这个好用的工具,而在 Linux 下,也 ...
- MYSQL 之 JDBC(二): 数据库连接(二)通过DriverManager获取数据库连接
通过DriverManager获取数据库连接 修改一下配置文件 driver=com.mysql.cj.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/ ...
- vue + echart 实现中国地图 和 省市地图(可切换省份)
一.中国地图 1.先导入echarts,然后再main.js里引入echarts // 引入echartsimport echarts from 'echarts'Vue.prototype.$ech ...
- vue : 无法加载文件 C:\Users\ui61895076\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
说白了就是这个编辑器不能用罢了 执行以下代码 1.鼠标右击以管理员身份运行vscode; 2. 执行:get-ExecutionPolicy,显示Restricted,表示状态是禁止的; 3. 执行: ...