标签:des style http color java os strong io
很典型的线段树,注意就是一个数字如果变成了斐波那契数字之后如果在change的话,它是不会反生改变的,因为最近的斐波那契数字就是它本身了啊。
用一个flag表示这一段上的数字是否change过,如果flag == 1已经change过,就不会在向下更新。否则的话就进行更新,最后会到达一个节点,更新这个节点。这里用暴力更新就行,找到最近的斐波那契数字。
Add就是一个点更新,sum求和就是一个区间总和的查询。
1 1 2 1 1 5 4 1 1 7 1 3 17 3 2 4 2 1 5
0 22
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#define clear(A, X, SIZE) memset(A, X, sizeof(A[0]) * (SIZE))
#define clearall(A, X) memset(A, X, sizeof(A))
#define max( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define min( x, y ) ( ((x) < (y)) ? (x) : (y) )
#define LL __int64
using namespace std;
const int maxn = 101000;
int vis[maxn];
LL Fi[maxn];
struct node
{
int l, r;
int flag;
LL sum;
} f[4*maxn];
void Del()
{
Fi[1] = 1;
Fi[2] = 1;
for(int i = 3; i <= 79; i++)
Fi[i] = Fi[i-1]+Fi[i-2];
}
void Bulid(int l, int r, int site)
{
f[site].l = l;
f[site].r = r;
f[site].flag = 0;
f[site].sum = 0;
if(l == r) return ;
int mid = (l+r)/2;
Bulid(l, mid, site<<1);
Bulid(mid+1, r, site<<1|1);
f[site].sum = f[site<<1].sum+f[site<<1|1].sum;
}
void Add(int k, int d, int site)
{
if(f[site].l == f[site].r)
{
f[site].sum += d;
f[site].flag = 0;
return;
}
int mid = (f[site].l+f[site].r)/2;
if(mid >= k) Add(k, d, site<<1);
if(mid < k) Add(k, d, site<<1|1);
f[site].sum = f[site<<1].sum+f[site<<1|1].sum;
f[site].flag = 0;
}
LL Query_Sum(int l, int r, int site)
{
if(f[site].l == l && f[site].r == r)
return f[site].sum;
int mid = (f[site].l+f[site].r)/2;
if(r <= mid)
return Query_Sum(l, r, site<<1);
if(l > mid)
return Query_Sum(l, r, site<<1|1);
return Query_Sum(l, mid, site<<1)+Query_Sum(mid+1, r, site<<1|1);
}
void Change(int l, int r, int site)
{
if(f[site].l == l && f[site].r == r )
{
if(f[site].flag) return ;
if(f[site].l == f[site].r )
{
int i;
for(i = 1; i <= 79; i++)
if(f[site].sum <= Fi[i]) break;
LL x1 = abs(f[site].sum-Fi[i-1]);
LL x2 = abs(Fi[i]-f[site].sum);
if(x1 <= x2 && i-1 > 0) f[site].sum = Fi[i-1];
else f[site].sum = Fi[i];
f[site].flag = 1;
return;
}
int mid = (l+r)/2;
Change(l, mid, site<<1);
Change(mid+1, r, site<<1|1);
f[site].sum = f[site<<1].sum+f[site<<1|1].sum;
if(f[site<<1].flag&&f[site<<1|1].flag)
f[site].flag = 1;
return;
}
int mid = (f[site].l+f[site].r)/2;
if(r <= mid)
Change(l, r, site<<1);
else if(l > mid)
Change(l, r, site<<1|1);
else
{
Change(l, mid, site<<1);
Change(mid+1, r, site<<1|1);
}
f[site].sum = f[site<<1].sum+f[site<<1|1].sum;
if(f[site<<1].flag && f[site<<1|1].flag)
f[site].flag = 1;
}
int main()
{
int n, m;
Del();
while(cin >>n>>m)
{
int x;
int l, r;
Bulid(1, n, 1);
for(int i = 0; i < m; i++)
{
scanf("%d %d %d",&x, &l, &r);
if(x == 1)
Add(l, r, 1);
else if(x == 2)
cout<<Query_Sum(l, r, 1)<<endl;
else if(x == 3)
Change(l, r, 1);
}
}
}
HDU 4893 Wow! Such Sequence!(线段树),布布扣,bubuko.com
HDU 4893 Wow! Such Sequence!(线段树)
标签:des style http color java os strong io
原文地址:http://blog.csdn.net/xu12110501127/article/details/38292381