zoj (单点更新区间查询:线段树)
来源:互联网 发布:董小枫淘宝店 编辑:程序博客网 时间:2024/04/29 17:30
题意:有n天,每天都可以买西瓜,每个西瓜的价格是ai,每个西瓜能吃bi天。问这n天每天都有西瓜吃的最小的代价是多少?如果你在第i天买了一个西瓜,那么之前买的西瓜就要全部扔掉,才能开始吃新的西瓜。
定义dp[i]为到i天为止,每天都有西瓜吃的最小代价,那么状态转移方程就是:dp[i]=min(dp[i],dp[i-k-1]+a[i-k])。这样时间复杂度会达到O(n^2),所以要优化。在递推的过程中,我们达到第i-k天之后,去更新第i-k+1天到第i天的代价。如果我们能一次性更新这些范围,就可以将复杂度降下来,优化的方法就是线段树。
转化的方法还是挺巧妙的。对于第i-k天,我们只去更新第i天这个点,然后在查询的时候,我们查询的是第i天到第n天里的最小值,因为如果我们得到的是在第i天到 第n天的某一个最小值,那么这个最小值一定是在第i天或第i-1天前更新到的。可以仔细想想。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define N 50005using namespace std;const long long Max=pow(10,10);int n;long long a[N];long long b[N];long long dp[N];long long tree[N*4];void built(int L,int R,int fa){ tree[fa]=Max; if(L==R) return ; int mid=(L+R)/2; built(L,mid,fa*2); built(mid+1,R,fa*2+1);}int idex;long long val;void uptate(int L,int R,int fa){ if(L==R) { tree[fa]=min(val,tree[fa]); return; } int mid=(L+R)/2; if(idex<=mid) uptate(L,mid,fa*2); else uptate(mid+1,R,fa*2+1); tree[fa]=min(tree[fa*2],tree[2*fa+1]);}int LL,RR;long long query(int L,int R,int fa){ if(LL<=L&&RR>=R) return tree[fa]; int mid=(R+L)/2; long long t1=Max; long long t2=Max; if(LL<=mid) t1=query(L,mid,fa*2); if(RR>mid) t2=query(mid+1,R,fa*2+1); return min(t1,t2);}int main(){ while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int j=1;j<=n;j++) scanf("%lld",&b[j]); built(1,n,1); dp[0]=0; for(int i=1;i<=n;i++) { int last=i+b[i]-1; last=min(n,last); idex=last; val=dp[i-1]+a[i]; uptate(1,n,1); LL=i; RR=n; dp[i]=query(1,n,1); } printf("%lld\n",dp[n]); } return 0;}
- zoj (单点更新区间查询:线段树)
- 线段树单点更新和区间查询
- hdu1166(线段树单点更新区间查询)
- hdu5316 Magician (线段树+单点更新+区间查询+区间合并)
- zoj 3633 线段树单点更新 区间最大值
- zoj 3635 线段树 区间求位置 单点更新
- [模板]线段树的建树、查询、单点更新、区间更新
- 线段树(堆式)[单点更新, 区间查询]
- hdoj 4339 线段树 单点更新,区间查询
- HDU 2795 线段树(单点更新 区间查询)
- HDOJ3016Man Down(线段树(区间更新,单点查询)+DP)
- HDU1754线段树单点更新区间查询(数组版)
- Necklace (线段树单点更新+区间查询+离线操作)
- HDU 4819:单点更新,区间查询的二维线段树
- hdu 4046 Panda (线段树 单点更新 区间查询)
- POJ 3264 Balanced Lineup (线段树单点更新 区间查询)
- Flipping Parentheses (线段树 单点更新 区间查询)
- 【单点更新,区间查询,线段树】【HDU1166】【敌兵布阵】
- 递归
- VC常用函数介绍
- HDU-2199(search_bin-精度)
- hibernate
- 在唐山,神奇城市
- zoj (单点更新区间查询:线段树)
- 浏览器127.0.0.7对应localhost的地址
- 30个优秀的CSS技术和实例
- MVC
- 解决eclipse无法运行或调试的办法
- WPF 3D入门,MeshGeometry3D的Positions、TriangleIndices和TextureCoordinates的简单理解
- android.os.BadParcelableException: ClassNotFondException when unmarshalling
- Android ApiDemos示例解析(121):Views->Grid->1. Icon Grid
- The Shape of Donggua 工大的原创几何题 挺好,顶一下。