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

正题

题目链接: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^91n106,1m5×104,1wi300,1vi109


解题思路

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

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=fi1,jki+si,z
si,zs_{i,z}si,z表示w=iw=iw=i的物品中前zzz大的价值和)

这个式子很难用常规的优化,但是可以用四边形不等式。至于证明,我们有wi,j=sj−iw_{i,j}=s_{j-i}wi,j=sji
要证明
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+1wi,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}sji+sjisji+1+sji1
然后因为si+1−sis_{i+1}-s_{i}si+1si是递减的,所以成立。

那么我们现在对于每个枚举的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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷P2497:基站建设(splay、斜率优化)

所谓splay斜率优化dp&#xff0c;就是利用splay和斜率对dp进行优化 &#xff08;逃&#xff09; 解析 在斜优的时候&#xff0c;有时我们会发现我们插入的点的横坐标并不单调 这个时候我们就无法利用单调队列维护凸包了 这时&#xff0c;我们就要请出今天的主角&#xff1a;s…

MediatR 知多少

引言首先不用查字典了&#xff0c;词典查无此词。猜测是作者笔误将Mediator写成MediatR了。废话少说&#xff0c;转入正题。先来简单了解下这个开源项目MediatR&#xff08;作者Jimmy Bogard&#xff0c;也是开源项目AutoMapper的创建者&#xff0c;在此表示膜拜&#xff09;&a…

网络分析(带权并查集)

网络分析 题意&#xff1a; 有n个节点&#xff0c;一开始彼此独立&#xff0c;有两个操作&#xff0c;第一个操作时是连接两个节点&#xff0c;第二个操作是对一个节点x&#xff0c;&#xff08;在进行第二个操作时&#xff0c;与该点相连的点也会x&#xff09; 问每个节点的…

良心发现,时隔一年再回首莫比乌斯反演(公式性质证明+题目练习)

文章目录莫比乌斯反演引入公式性质模板公式证明莫比乌斯函数前缀和题目练习完全平方数[HAOI2011]ProblembYY的GCD[SDOI2014]数表[国家集训队]Crash的数字表格/JZPTAB[SDOI2015]约数个数和寒假疫情期间跟着lmm学了一遍&#xff0c;完全是懵逼到底状态&#xff0c;以至于后面考到…

P7293-[USACO21JAN]Sum of Distances P【统计,bfs】

正题 题目链接:https://www.luogu.com.cn/problem/P7293 题目大意 有kkk张联通无向图&#xff0c;有kkk个人从每张图的点111出发&#xff0c;定义所有人的位置合为一个状态&#xff0c;求初始状态到达所有能到达状态的最短时间的和。 输出答案对 109710^971097 取模。 ∑n≤…

模板:次短路

所谓次短路&#xff0c;就是又次又短的路 &#xff08;逃&#xff09; 解析 使用两遍swap是更新sec的好方法 一定要判断是严格次短才更新sec的答案&#xff01; 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define il inline const int …

平面切分

平面切分 问题描述 题解&#xff1a; 我对这种题极其非常不擅长。。。 另外吐槽为什么acwing的数据卡的这么死&#xff0c;蓝桥杯官网数据那么水 其实题目很简单&#xff0c;如果只有一个直线&#xff0c;那么就是两部分&#xff0c;如果是两个直线&#xff0c;这两个直线不相…

新起点!新征程!微软技术俱乐部(苏州)成立大会暨微软技术交流会

2019年1月19日&#xff0c;苏州微软将举办苏州史上最盛大的开发者聚会&#xff0c;微软技术俱乐部成立大会暨微软技术交流会。超越苹果&#xff0c;登顶世界市值第一&#xff01;云与AI两大技术支柱支撑起的微软帝国&#xff0c;正向万亿美元俱乐部挺进&#xff01;微软的改变我…

P7990-[USACO21DEC]Closest Cow Wins S【堆,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P7990 题目大意 数轴上有kkk个点是草地&#xff0c;每个草地有不同收益&#xff0c;mmm个点是地方的点&#xff0c;现在你要放置nnn个我方的点&#xff0c;不能和敌方的点重合。 如果一个草地离最近的我方的点距离严格小于最…

模板:整除分块

所谓整除分块&#xff0c;就是按照整除的结果分块 &#xff08;逃&#xff09; 解析 一个关键的结论&#xff1a; 对于 i≤ni\le ni≤n&#xff0c;满足 ⌊nx⌋⌊ni⌋\lfloor\dfrac{n}{x}\rfloor\lfloor\dfrac{n}{i}\rfloor⌊xn​⌋⌊in​⌋ 的最大的 xxx 为 ⌊n⌊ni⌋⌋\lfl…

[Cnoi2019]须臾幻境(LCT维护最大生成树+主席树/分块)

文章目录titlesolutioncodetitle solution 一棵nnn个点的树有n−1n-1n−1条边。 一般的&#xff0c;对于森林而言则有点数-边数树的个数 那么我们将无向图随便生成一个生成树&#xff0c;形成森林。 询问的连通块的个数就变为求森林的树的个数&#xff0c;即森林的点数 n …

跨平台、跨语言应用开发工具,Elements 介绍

目录1&#xff0c;Elements 介绍2&#xff0c;Elements 版本3&#xff0c;Elements 能干嘛4&#xff0c;Elements IDES5&#xff0c;Elements 工具1&#xff0c;Elements 介绍RemObjects Elements&#xff0c;是多平台移动项目开发工具&#xff0c;是一款可以帮助开发人员在 不…

蓝桥杯--字串排序

题目&#xff1a; 小蓝的幸运数字是 &#xff0c;他想找到一个只包含小写英文字母的字符串&#xff0c;对这个串中的字符进行冒泡排序&#xff0c;正好需要 V次交换。请帮助小蓝找一个这样的字符串。如果可能找到多个&#xff0c;请告诉小蓝最短的那个。如果最短的仍然有多个&…

P4688-[Ynoi2016]掉进兔子洞【莫队,bitset】

正题 题目链接:https://www.luogu.com.cn/problem/P4688 题目大意 给出一个长度为nnn的序列aaa。 然后mmm次询问给出三个区间&#xff0c;求这三个区间构成的可重集删去交集后剩下的数字个数和。 1≤n,m≤105,1≤ai≤1091\leq n,m\leq 10^5,1\leq a_i\leq 10^91≤n,m≤105,1…

洛谷P3791:普通数学题(整除分块、前缀和)

解析 似乎位运算和易或并没有太多性质上的联系… 所以换个角度分析 考虑按照二进制进行类似数位dp 暴力枚举 i 和 j 的前k,p位与n、m相同&#xff0c;下一位比n、m小。 然后后面的东西就可以随便填 每个异或的结果都有2^(两个数都可以随便填的位数)的方案 然后乘上一个约数个…

后缀自动机(SAM)构造实现过程演示+习题集锦

文章目录后缀自动机算法实现过程模板习题洛谷后缀自动机模板题品酒大会[HEOI2015]最短不公共子串字符串蒟蒻写这篇blogblogblog主要是存一下&#xff0c;后缀自动机的详细搭建过程&#xff0c;方便以后复习 具体的某些证明&#xff0c;为什么这么做&#xff0c;正确性劈里啪啦一…

使用logdashboard进行可视化的日志追踪

本文源码在Github可以找到下载LogDashboard如果你还不了解LogDashboard请看这里。 LogDashboard 1.1版本支持请求追踪,虽然目前版本还没有发布。不过这个功能可以先睹为快效果图下载项目首先我们可以在 https://github.com/liangshiw/LogDashboard/tree/master/samples/Request…

ARC132D-Between Two Binary Strings【贪心】

正题 题目链接:https://atcoder.jp/contests/arc132/tasks/arc132_d 题目大意 给出两个恰好有nnn个111和mmm个000的字符串s,ts,ts,t&#xff0c;定义两个字符串距离为通过交换两个相邻的字符把一个变成另一个的最小步数。 对于字符串kkk如果dis(s,k)dis(k,t)dis(s,t)dis(s,k…

CodeCraft-21 and Codeforces Round #711 (Div. 2)

CodeCraft-21 and Codeforces Round #711 (Div. 2) 题号题目考点AGCD Sum签到&#xff0c;模拟BBox Fitting贪心CPlanar Reflections规律暴力&#xff08;直接乱搞就对了&#xff09;DBananas in a Microwave思维题&#xff0c;贪心ETwo Houses交互题&#xff08;未补&#xf…

模板:插头DP

所谓插头dp&#xff0c;就是使用插头的dp &#xff08;逃&#xff09; 解析 好难呀qwq 终于算是学明白了吧 推荐博客 字太多了不想打了 自己过去看吧 感觉写的非常清晰了 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define il inline …