正题

题目链接:https://loj.ac/p/6039


题目大意

有nnn个物品,第iii个费用为wiw_iwi​,价值为viv_ivi​,对于k∈[1,m]k\in[1,m]k∈[1,m]求费用为mmm时能获得的最大价值。

1≤n≤106,1≤m≤5×104,1≤wi≤300,1≤vi≤1091\leq n\leq 10^6,1\leq m\leq 5\times 10^4,1\leq w_i\leq 300,1\leq v_i\leq 10^91≤n≤106,1≤m≤5×104,1≤wi​≤300,1≤vi​≤109


解题思路

好早以前写的不过不知道为啥错了,现在来补个新的。

wiw_iwi​很小,考虑以其为突破口,显然地我们可以把wiw_iwi​相同的按照viv_ivi​从大到小排序,那么对于每个wiw_iwi​,我们就可以选择若干个。

设fi,jf_{i,j}fi,j​表示做到w=iw=iw=i时费用为jjj的最大价值和,那么有
fi,j=fi−1,j−ki+si,zf_{i,j}=f_{i-1,j-ki}+s_{i,z}fi,j​=fi−1,j−ki​+si,z​
(si,zs_{i,z}si,z​表示w=iw=iw=i的物品中前zzz大的价值和)

这个式子很难用常规的优化,但是可以用四边形不等式。至于证明,我们有wi,j=sj−iw_{i,j}=s_{j-i}wi,j​=sj−i​
要证明
wi,j+wi+1,j+1≥wi,j+1+wi+1,jw_{i,j}+w_{i+1,j+1}\geq w_{i,j+1}+w_{i+1,j}wi,j​+wi+1,j+1​≥wi,j+1​+wi+1,j​
sj−i+sj−i≥sj−i+1+sj−i−1s_{j-i}+s_{j-i}\geq s_{j-i+1}+s_{j-i-1}sj−i​+sj−i​≥sj−i+1​+sj−i−1​
然后因为si+1−sis_{i+1}-s_{i}si+1​−si​是递减的,所以成立。

那么我们现在对于每个枚举的w=iw=iw=i,把所有的ik+j(j∈[0,i))ik+j(\ j\in[0,i)\ )ik+j( j∈[0,i) )都分成一组。

然后对于每一组我们都用四边形不等式优化,不过我忘了优化的方法了,还是记一下吧:

对于所有的可能的决策我们用一个单调队列记录,顺带记录ziz_izi​表示队列里第iii个决策和第i+1i+1i+1个决策的交叉点(在ziz_izi​之前qiq_{i}qi​更优,ziz_izi​以之后qi+1q_{i+1}qi+1​更优)。

然后每次弹出队列前面的来找答案,加入的时候我们就二分出队尾和新加入的决策交换点,然后一直弹尾部直到不交叉。

时间复杂度:O(mwlog⁡m)O(mw\log m)O(mwlogm)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=5e4+10;
ll n,m,g,f[2][N],q[N],z[N];
vector<ll> w[310];
bool cmp(ll x,ll y)
{return x>y;}
ll calc(ll i,ll j,ll p,ll k)
{return f[!g][i*p+k]+w[p][j-i-1];}
ll bound(ll i,ll j,ll p,ll k){ll l=i+1,r=(m-k)/p;while(l<=r){ll mid=(l+r)>>1;if(calc(i,mid,p,k)<calc(j,mid,p,k))l=mid+1;else r=mid-1;}return l;
}
signed main()
{freopen("jewelry.in","r",stdin);freopen("jewelry.out","w",stdout); scanf("%lld%lld",&n,&m);for(ll i=1,c,v;i<=n;i++){scanf("%lld%lld",&c,&v);w[c].push_back(v);}g=0;for(ll p=1;p<=300;p++){if(w[p].empty())continue;g^=1;memcpy(f[g],f[!g],sizeof(f[g]));
//      memset(f[g],0,sizeof(f[g]));sort(w[p].begin(),w[p].end(),cmp);while(w[p].size()<=m/p)w[p].push_back(0);for(ll i=1;i<w[p].size();i++)w[p][i]+=w[p][i-1];for(ll k=0;k<p;k++){ll head=1,tail=0;for(ll i=0;i*p+k<=m;i++){while(head<tail&&z[head]<=i)head++;if(head<=tail)f[g][i*p+k]=max(f[g][i*p+k],calc(q[head],i,p,k));while(head<tail&&z[tail-1]>=bound(i,q[tail],p,k))tail--;z[tail]=bound(i,q[tail],p,k);q[++tail]=i;}}}for(ll i=1;i<=m;i++)printf("%lld ",f[g][i]);return 0;
}

Loj#6039-「雅礼集训 2017 Day5」珠宝【四边形不等式,dp】相关推荐

  1. loj 6038「雅礼集训 2017 Day5」远行

    http://www.elijahqi.win/archives/3236 题目描述 Miranda 生活的城市有 N NN 个小镇,一开始小镇间没有任何道路连接.随着经济发现,小镇之间陆续建起了一些 ...

  2. 【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行

    题目描述 Miranda 生活的城市有 \(N\) 个小镇,一开始小镇间没有任何道路连接.随着经济发现,小镇之间陆续建起了一些双向的道路但是由于经济不太发达,在建设过程中,会保证对于任意两个小镇,最多 ...

  3. 「雅礼集训 2017 Day5」珠宝

    题目描述 Miranda 准备去市里最有名的珠宝展览会,展览会有可以购买珠宝,但可惜的是只能现金支付,Miranda 十分纠结究竟要带多少的现金,假如现金带多了,就会比较危险,假如带少了,看到想买的右 ...

  4. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

    [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...

  5. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 -- 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  6. Loj 6036 「雅礼集训 2017 Day4」编码 - 2-sat

    题目传送门 唯一的传送门 题目大意 给定$n$个串,每个串只包含 '0','1','?' ,其中 '?' 至多在每个串中出现1次,它可以被替换为 '0' 或 '1' .问是否可能任意两个不同的串不满足 ...

  7. LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)

    题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...

  8. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

  9. LOJ #6052. 「雅礼集训 2017 Day11」DIV

    完了我是数学姿势越来越弱了,感觉这种CXRdalao秒掉的题我都要做好久 一些前置推导 首先我们很容易得出\((a+bi)(c+di)=k \Leftrightarrow ac-bd=k,ad+bc= ...

最新文章

  1. 反正我不信!马斯克谈元宇宙:没人愿意把屏幕贴脸上
  2. 清华团队将Transformer用到3D点云分割
  3. 144. Binary Tree Preorder Traversal
  4. python 调用c++ 传输图片
  5. OVS原理(四十二)
  6. 数据库空值(Null)小结
  7. Android之ndk-build出现c:28:51: error: ‘get_string‘ undeclared here (not in a function)解决办法
  8. python/c++计算psnr
  9. 压力测试以及编译安装httpd2.4
  10. 蓝桥杯 基础练习 高精度加法
  11. 详解文本分类之DeepCNN的理论与实践
  12. J2EE领域的一些技术框架结构图
  13. 辰信领创携手天津麒麟全力保障国产操作系统安全
  14. 163微信邮箱在哪里找到,你知道微信邮箱地址在哪里找到吗
  15. Pyinstaller打包成使用了pyonnet包的exe时报错System.IO.FileNotFoundException:Unable to find assembly ‘XXX.dll‘。
  16. ArcGIS地图抽稀
  17. nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 异常
  18. Zabbix 监控MySQL最大连接数
  19. iOS仿写有妖气漫画、视频捕获框架、启动页广告页demo、多种动画效果等源码...
  20. MySql数据库中,表字段新增,修改,删除

热门文章

  1. 《SAS编程与数据挖掘商业案例》学习笔记之一
  2. android动画设置的单位,Kotlin语言入门—实现单位转换,view设置,动画等
  3. vst3插件_Steinberg发布新的VST 3.7 SDK,音乐软件开发者速来围观
  4. ctf php 读取flag,BugkuCTF flag.php(反序列化)
  5. typora公式zuo对齐_Markdown编辑神器-Typora
  6. mysql数据库设计三大范式_了解数据库设计三大范式
  7. [Nginx]nginx 配置实例-负载均衡
  8. [mybatis]动态sql_内置参数_parameter_databaseid
  9. [mybatis]动态sql_choose_分支选择
  10. hdu 2069 Coin Change(改)-dp