您的位置:首页 > 编程语言

hdu 4893 线段树lazy wa代码 先放这里 我还会回来的!!

2014-07-30 16:19 417 查看
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<math.h>
#include<algorithm>
#include<vector>
#define maxx 100010
using namespace std;
#define ss __int64

struct node {int l,r;ss sum; bool flag;};
node tree[maxx*4];
ss f[100];

void getfib()
{
f[0]=f[1]=1;
for(int i=2;i<=90;i++)
{
f[i]=f[i-1]+f[i-2];
//printf("%I64d\n",f[i]);
}
}

int solve(ss x)  //jiang  x  bian wei  zui jin d fib
{
int l=0,r=90,best=0;
while(l<r)
{
int mid=(l+r)/2;
if(f[mid]<=x)
{
l=mid+1;
best=max(best,mid);
}
else
r=mid-1;
}
return best;
}

void build(int left,int right,int k)
{
int mid;
tree[k].l=left;
tree[k].r=right;
tree[k].sum=0;
tree[k].flag=false;
if(left==right)
return ;
mid=(left+right)/2;
build(left,mid,k*2);
build(mid+1,right,k*2+1);
}

void down(int k)
{
if(tree[k].flag==false)
return ;
tree[k].flag=false;
if(tree[k].l==tree[k].r)
{

int temp,a,b;
temp=solve(tree[k].sum);
printf("1----%d\n",tree[k].sum);
a=abs(tree[k].sum-f[temp]);
b=abs(tree[k].sum-f[temp+1]);
if(a<b)
{
tree[k].sum=f[temp];
}
else if(a==b)
{
tree[k].sum=min(f[temp],f[temp+1]);
}
else
tree[k].sum=f[temp+1];
printf("2------%d\n",tree[k].sum);
return ;

}
down(k*2);
down(k*2+1);
tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
}

int sum(int left,int right,int k)
{
if(tree[k].l==left&&tree[k].r==right)
{
if(tree[k].flag)
down(k);
return tree[k].sum;
}
int mid;
mid=(tree[k].l+tree[k].r)/2;
if(right<=mid)
return sum(left,right,k*2);
else if(left>=mid+1)
return sum(left,right,k*2+1);
else
return sum(left,mid,k*2)+sum(mid+1,right,k*2+1);
}

void add(int x,int zhi,int k)
{
if(tree[k].l==x&&x==tree[k].r)
{
if(tree[k].flag)
down(k);
tree[k].sum+=zhi;
return ;
}
int mid;
mid=(tree[k].l+tree[k].r)/2;
if(x<=mid)
add(x,zhi,k*2);
else
add(x,zhi,k*2+1);
tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;
}

void biaoji(int left,int right,int k)
{
if(tree[k].l==left&&tree[k].r==right)
{
printf("biao  %d %d\n",tree[k].l,tree[k].r);
tree[k].flag=true;
return ;
}
int mid;
mid=(tree[k].l+tree[k].r)/2;
if(right<=mid)
biaoji(left,right,k*2);
else if(left>=mid+1)
biaoji(left,right,k*2+1);
else
{
biaoji(left,mid,k*2);
biaoji(mid+1,right,k*2+1);
}
}

int main()
{
int i,j,n,m,a,b,c;
getfib();
while(~scanf("%d%d",&n,&m))
{
build(1,n,1);
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(a==1)
add(b,c,1);
if(a==2)
printf("%d\n",sum(b,c,1));
if(a==3)
biaoji(b,c,1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐