Loj#6039-「雅礼集训 2017 Day5」珠宝【四边形不等式,dp】
正題
題目鏈接:https://loj.ac/p/6039
題目大意
有nnn個(gè)物品,第iii個(gè)費(fèi)用為wiw_iwi?,價(jià)值為viv_ivi?,對于k∈[1,m]k\in[1,m]k∈[1,m]求費(fèi)用為mmm時(shí)能獲得的最大價(jià)值。
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
解題思路
好早以前寫的不過不知道為啥錯(cuò)了,現(xiàn)在來補(bǔ)個(gè)新的。
wiw_iwi?很小,考慮以其為突破口,顯然地我們可以把wiw_iwi?相同的按照viv_ivi?從大到小排序,那么對于每個(gè)wiw_iwi?,我們就可以選擇若干個(gè)。
設(shè)fi,jf_{i,j}fi,j?表示做到w=iw=iw=i時(shí)費(fèi)用為jjj的最大價(jià)值和,那么有
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大的價(jià)值和)
這個(gè)式子很難用常規(guī)的優(yōu)化,但是可以用四邊形不等式。至于證明,我們有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?
然后因?yàn)?span id="ze8trgl8bvbq" class="katex--inline">si+1?sis_{i+1}-s_{i}si+1??si?是遞減的,所以成立。
那么我們現(xiàn)在對于每個(gè)枚舉的w=iw=iw=i,把所有的ik+j(j∈[0,i))ik+j(\ j\in[0,i)\ )ik+j(?j∈[0,i)?)都分成一組。
然后對于每一組我們都用四邊形不等式優(yōu)化,不過我忘了優(yōu)化的方法了,還是記一下吧:
對于所有的可能的決策我們用一個(gè)單調(diào)隊(duì)列記錄,順帶記錄ziz_izi?表示隊(duì)列里第iii個(gè)決策和第i+1i+1i+1個(gè)決策的交叉點(diǎn)(在ziz_izi?之前qiq_{i}qi?更優(yōu),ziz_izi?以之后qi+1q_{i+1}qi+1?更優(yōu))。
然后每次彈出隊(duì)列前面的來找答案,加入的時(shí)候我們就二分出隊(duì)尾和新加入的決策交換點(diǎn),然后一直彈尾部直到不交叉。
時(shí)間復(fù)雜度: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; }總結(jié)
以上是生活随笔為你收集整理的Loj#6039-「雅礼集训 2017 Day5」珠宝【四边形不等式,dp】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的世界錾制石砖怎么合成?石砖怎么做?有
- 下一篇: 步进电机接线