转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893
----------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎光临天资小屋:http://user.qzone.qq.com/593830943/main
----------------------------------------------------------------------------------------------------------------------------------------------------------
1 1 2 1 1 5 4 1 1 7 1 3 17 3 2 4 2 1 5
0 22
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <set>
using namespace std;
#define ll __int64
#define lson l , mid , rt << 1
#define rson mid + 1 , r , rt << 1 | 1
#define maxn 111111
ll num[maxn];
ll sum[maxn<<2];//求和
ll add[maxn<<2];
int se[maxn<<2];
ll f[111],x;
void Pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
add[rt]=add[rt<<1]+add[rt<<1|1];
}
void build(int l,int r,int rt)
{
sum[rt]=0;se[rt]=-1;
if(l == r)
{
add[rt]=1;
return ;
}
int mid = (l + r) >> 1;
build(lson);
build(rson);
Pushup(rt);
}
void Pushdown(int rt,int l,int r)
{
if(se[rt]!=-1)
{
sum[rt<<1]+=add[rt<<1];
sum[rt<<1|1]+=add[rt<<1|1];
add[rt<<1]=add[rt<<1|1]=0;
se[rt<<1]=se[rt<<1|1]=1;
se[rt]=-1;
}
}
void update(int L,int R,ll c,int l,int r,int rt)
{
if(L <= l && r <= R)
{
sum[rt]+=c;
int x=(int)(lower_bound(f,f+77,sum[rt])-f);//寻找相应的斐波那契数
if(x == 0)
{
add[rt]=f[0]-sum[rt];
}
else
{
if(f[x]==sum[rt])
{
return ;
}
else if(sum[rt]-f[x-1]<=f[x]-sum[rt])//离的更近的
{
add[rt]=f[x-1]-sum[rt];
}
else
add[rt]=f[x]-sum[rt];
}
return ;
}
Pushdown(rt,l,r);
int mid = (l + r) >> 1;
if(L <= mid)
update(L,R,c,lson);
if(mid < R)
update(L,R,c,rson);
Pushup(rt);
}
void ins(int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R)
{
sum[rt]+=add[rt];
add[rt]=0; se[rt]=1;
return ;
}
Pushdown(rt,l,r);
int mid = (l + r) >> 1;
if(L <= mid)
ins(L,R,lson);
if(mid < R)
ins(L,R,rson);
Pushup(rt);
}
ll query(int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R)
{
return sum[rt];
}
Pushdown(rt,l,r);
ll res=0;
int mid = (l + r) >> 1;
if(L <= mid)
res+=query(L, R, lson);
if(mid < R)
res+=query(L, R, rson);
return res;
}
int main()
{
int n,m;
f[0]=1;f[1]=1;
for(int i=2;i<=77;++i)
f[i]=f[i-1]+f[i-2];
while(~scanf("%d%d",&n,&m))
{
build(1,n,1);
int op,a,b;
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d",&op,&a,&b);
if(op==1)
{
update(a,a,b,1,n,1);//单点增加区间为a->a;
}
else if(op==2)
{
printf("%I64d\n",query(a,b,1,n,1));
}
else if(op==3)
{
ins(a,b,1,n,1);
}
}
}
return 0;
}hdu 4893 Wow! Such Sequence!(线段树功能:单点更新,区间更新相邻较小斐波那契数),布布扣,bubuko.com
hdu 4893 Wow! Such Sequence!(线段树功能:单点更新,区间更新相邻较小斐波那契数)
原文地址:http://blog.csdn.net/u012860063/article/details/38307429