[BZOJ]2131: 免费的馅饼 DP+树状数组
2017-11-02 08:11
148 查看
Description
我们又注意到,满足第2、3条不等式,那么第1条就一定满足。那么对于第2、3条,移项可得:2×t[i]+p[i]>=2×t[j]+p[j]2×t[i]−p[i]>=2×t[j]−p[j]
设x[i]=2×t[i]+p[i],y[i]=2×t[i]−p[i],f[j]能转移到f[i]的条件就是x[j]<=x[i]且y[j]<=y[i],你也可以这么理解,平面上在i左下角的点都可以转移到i。然后就好搞了,对x排序,然后离散化y,用树状数组维护最大值,就可以做到O(nlogn)转移了。
题解:
这题好神啊!首先要会最简单的DP:先按t从小到大排序,f[i]表示接到排序后第i块馅饼的最大分数和,那么转移就是把前面的扫一遍,复杂度O(n2)。我们观察转移的条件,若能从f[j]转移到f[i],那么有:t[j]<=t[i]p[i]−p[j]<=2×(t[i]−t[j])p[j]−p[i]<=2×(t[i]−t[j])(后面两条不等式实际上是由|p[i]−p[j]|<=2×(t[i]−t[j])得到的)我们又注意到,满足第2、3条不等式,那么第1条就一定满足。那么对于第2、3条,移项可得:2×t[i]+p[i]>=2×t[j]+p[j]2×t[i]−p[i]>=2×t[j]−p[j]
设x[i]=2×t[i]+p[i],y[i]=2×t[i]−p[i],f[j]能转移到f[i]的条件就是x[j]<=x[i]且y[j]<=y[i],你也可以这么理解,平面上在i左下角的点都可以转移到i。然后就好搞了,对x排序,然后离散化y,用树状数组维护最大值,就可以做到O(nlogn)转移了。
代码:
#include<bits/stdc++.h> using namespace std; #define pa pair<int,int> #define LL long long const int Maxn=100010; const int inf=2147483647; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} return x*f; } int w,n,f[Maxn],Y[Maxn],ans=-1; struct A{int t,p,v,x,y;}a[Maxn]; bool cmpxy(A a,A b){return((a.x==b.x)?a.y<b.y:a.x<b.x);} int mx[Maxn]; void change(int x,int y){for(;x<=n;x+=(x&-x))mx[x]=max(mx[x],y);} int getmax(int x){int re=-1;for(;x;x-=(x&-x))re=max(re,mx[x]);return re;} map<int,int>o; int main() { w=read();n=read(); for(int i=1;i<=n;i++) { int t=read(),p=read(),v=read(); a[i].t=t,a[i].p=p,a[i].v=v; a[i].x=2*t+p;a[i].y=Y[i]=2*t-p; } sort(a+1,a+1+n,cmpxy); sort(Y+1,Y+1+n);int num=0; for(int i=1;i<=n;i++) { if(Y[i]!=Y[i-1]||i==1)o[Y[i]]=++num; else continue; } for(int i=1;i<=n;i++) { int t=o[a[i].y]; ans=max(ans,f[i]=getmax(t)+a[i].v); change(t,f[i]); } printf("%d",ans); }
相关文章推荐
- [BZOJ2131]免费的馅饼(DP+树状数组)
- 【bzoj2131】免费的馅饼 dp+树状数组
- bzoj 2131: 免费的馅饼【dp+树状数组】
- 【BZOJ2131】免费的馅饼,坐标转换与DP
- bzoj 2131: 免费的馅饼(树状数组+DP)
- bzoj2131: 免费的馅饼
- [BZOJ2131]免费的馅饼-树状数组优化DP
- [BZOJ]2131 免费的馅饼 DP + 绝对值转化
- [bzoj2131]免费的馅饼_树状数组
- [bzoj2131] 免费的馅饼
- BZOJ P2131 免费的馅饼
- HDU 1176免费馅饼(Dp)
- HDU - 1176 免费馅饼 (简单DP)
- HDU1176:免费馅饼
- NYOJ 613 HDU 1173 免费馅饼 (动态规划)
- #HDU 1176 免费馅饼
- 免费馅饼
- acm sdut 免费馅饼
- hdoj 1176 免费馅饼
- HDU1176 免费馅饼(水DP)