HDU4893 2014多校第三场1007 Wow! Such Sequence!
2014-07-29 17:15
260 查看
线段树题目...花了一下午时候去做..提交一直WA,不知道错在哪,后来考虑到中间过程可能会超出int.我判断差值最小的时候用的0xfffffff,可能会出现大于的情况,修改之后果断AC,不容易...
题目时除了单点更新之外,还要求在(l,r)之间每个值更新为离这个值最近的一个Fibonacci数..如果已经修改过的点再重复修改就会产生很多不必要的操作,从而超时,所以用cover标记是否已经更新为Fibonacci数。进行单点更新后吧cover重新置0。
题目时除了单点更新之外,还要求在(l,r)之间每个值更新为离这个值最近的一个Fibonacci数..如果已经修改过的点再重复修改就会产生很多不必要的操作,从而超时,所以用cover标记是否已经更新为Fibonacci数。进行单点更新后吧cover重新置0。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> struct node { int l,r,cover; __int64 x; }data[400500]; __int64 f[100]; __int64 ab(__int64 x) { if(x>=0) return x; else return -x; } void fibi() { int i; f[0]=1;f[1]=1; for(i=2;i<=90;i++) f[i]=f[i-1]+f[i-2]; } void build(int l,int r,int k) { data[k].l=l; data[k].r=r; data[k].x=0; data[k].cover=0; if(l==r) return ; int mid=(l+r)/2; build(l,mid,k*2); build(mid+1,r,k*2+1); } void addd(int k,int x,int add) { if(data[k].l==data[k].r&&data[k].l==x) { data[k].x+=add; data[k].cover=0; return ; } int mid=(data[k].l+data[k].r)/2; if(x<=mid) addd(k*2,x,add); else addd(k*2+1,x,add); data[k].x=data[k*2].x+data[k*2+1].x; if(data[k*2].cover==0||data[k*2+1].cover==0) data[k].cover=0; } void updata(int l,int r,int k) { int mid=(data[k].l+data[k].r)/2; if(data[k].cover==1) return ; if(data[k].l==data[k].r) { __int64 i,min=0xfffffffff,mini=0;//这里min值要大于int上限 for(i=0;i<=90;i++) { if(ab(f[i]-data[k].x)<min) { min=ab(f[i]-data[k].x); mini=f[i]; } } data[k].x=mini;X data[k].cover=1; return ; } if(l>mid) updata(l,r,k*2+1); else if(r<=mid) updata(l,r,k*2); else { updata(l,mid,k*2); updata(mid+1,r,k*2+1); } data[k].x=data[k*2].x+data[k*2+1].x; if(data[k*2].cover==1&&data[k*2+1].cover==1) data[k].cover=1; } __int64 query(int l,int r,int k) { if(data[k].l==l&&data[k].r==r) return data[k].x; int mid=(data[k].l+data[k].r)/2; if(l>mid) return query(l,r,k*2+1); else if(r<=mid) return query(l,r,k*2); else return query(l,mid,k*2)+query(mid+1,r,k*2+1); } int main() { int n,m; while(scanf("%d %d",&n,&m)!=EOF) { fibi(); build(1,n,1); int a,b,c; while(m--) { scanf("%d %d %d",&a,&b,&c); if(a==1) addd(1,b,c); else if(a==2) printf("%I64d\n",query(b,c,1)); else updata(b,c,1); } } return 0; }
相关文章推荐
- 【2014 Multi-University Training Contest 3 1007】/【HDU 4893】 Wow! Such Sequence!
- 【2014 Multi-University Training Contest 3 1007】/【HDU 4893】 Wow! Such Sequence!
- hdu 4893 Wow! Such Sequence! 2014 Multi-University Training Contest 3
- HDU4893 Wow! Such Sequence! 线段树
- hdu4893 Wow! Such Sequence! 线段树
- 2014多校3 Wow! Such Sequence!线段树
- hdu4893 Wow! Such Sequence! 线段数
- HDU4893 Wow! Such Sequence!
- 2014多校3 Wow! Such Sequence!段树
- Wow! Such Sequence! (线段树) hdu4893
- hdu4893 Wow! Such Sequence!,树状数组,线段树,单点修改,区间更新
- hdu4893 Wow! Such Sequence!
- hdu4893 Wow! Such Sequence!
- HDU4893--Wow! Such Sequence! (线段树 延迟标记)
- HDU 4893 Wow! Such Sequence!
- 【HDU】4893 Wow! Such Sequence! 线段树
- HDOJ 4893 Wow! Such Sequence!
- HDOJ--4893--Wow! Such Sequence!【线段树+单点、区间更新】
- hdu 4893 Wow! Such Sequence! 线段树单点更新+区间更新+区间查询
- HDU 4893 Wow! Such Sequence!