BZOJ P2131 免费的馅饼
2017-03-09 19:05
218 查看
直接按馅饼暴力DP O(N^2)显然不能AC,因为N最大有100000
然后上网查了题解,直接按照DP的转移方程化出一个公式,然后发现是在一个类似于二维的平面图上进行转移
然后通过一维先后进行更新,一维直接树状数组维护完美AC,不得不说从公式推导到优化都很巧妙
ORZ看来我还是太弱了
然后上网查了题解,直接按照DP的转移方程化出一个公式,然后发现是在一个类似于二维的平面图上进行转移
然后通过一维先后进行更新,一维直接树状数组维护完美AC,不得不说从公式推导到优化都很巧妙
ORZ看来我还是太弱了
#include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; const int M=100003; int low(int x){ return(x&(-x)); } int W,n,ans; int d[M],f[M],Y[M]; struct os{ int x,y,t,p,v; bool operator <(os other)const{ if(x==other.x){ return y>other.y; }else{ return x<other.x; } } }a[M]; int get(int x){ int mx=0; for(;x;x-=low(x)){ mx=max(mx,d[x]); } return mx; } void add(int x,int data){ for(;x<=n+1;x+=low(x)){ d[x]=max(d[x],data); } } int main(){ cin>>W>>n; a[0].x=a[0].y=a[0].t=-W; for(int i=1;i<=n;i++){ cin>>a[i].t>>a[i].p>>a[i].v; a[i].t<<=1; a[i].x=a[i].t+a[i].p; a[i].y=a[i].t-a[i].p; } sort(a,a+n+1); for(int i=0;i<=n;i++){ Y[i]=a[i].y; } sort(Y,Y+n+1); for(int i=0;i<=n;i++){ a[i].y=lower_bound(Y,Y+n+1,a[i].y)-Y+1; } for(int i=1;i<=n;i++){ f[i]=a[i].v+get(a[i].y); add(a[i].y,f[i]); } for(int i=1;i<=n;i++){ ans=max(ans,f[i]); } cout<<ans<<endl; return 0; } /* in: 3 4 1 2 3 5 2 3 6 3 4 1 1 5 out: 12 */
相关文章推荐
- bzoj 2131: 免费的馅饼(树状数组+DP)
- bzoj 2131: 免费的馅饼【dp+树状数组】
- [BZOJ2131]免费的馅饼(DP+树状数组)
- [BZOJ2131]免费的馅饼-树状数组优化DP
- [bzoj2131] 免费的馅饼
- [BZOJ]2131 免费的馅饼 DP + 绝对值转化
- bzoj2131: 免费的馅饼
- [BZOJ]2131: 免费的馅饼 DP+树状数组
- 【bzoj2131】免费的馅饼 dp+树状数组
- 【BZOJ2131】免费的馅饼,坐标转换与DP
- [bzoj2131]免费的馅饼_树状数组
- 免费馅饼
- BZOJ3624 [Apio2008]免费道路
- HDU---1176-免费馅饼(DP)
- 【bzoj3624】【apio2008】免费道路
- HD 1176 免费馅饼 (DP)
- 杭电1176 免费馅饼(数塔dp)
- hdu1176 免费馅饼(变形数塔)
- hdu 1176 免费馅饼 dp
- BZOJ 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富