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; }
相关文章推荐
- 这里是MYSQL操作的C语言代码,我贴几个,你们看吧333
- 暂时回来这里喘一口气……
- 受不了blogspot贴代码无排版,放这里好了
- 简单扩展winform中的ListBox,实现项闪烁、项变色,和代码拉动滚动条(新手村真是冷,斗胆放在这里,如果不合适,立马撤下)
- 搜狐你还会“回来”吗?
- 向上滚动代码,不是无缝的,老代码,放在这里备忘
- 初学DirectX,不太好理解代码写到这里。
- AC了 hdu1160 FatMouse 肥肥鼠 原来 dp 真的很好玩!c代码与大家分享!
- QQ空间实在是不适合保存代码,以后大部分程序的技术资料会转到这里来。
- 换blog地址了,这里的太不稳定了!以后好了再回来吧,现在的地址在里面!
- [闭月羞花猫]C++ OR JAVA ? 暂别CSDN前,给各位初学者的一点建议。(大家不要悲伤,过两天我还会回来的)
- 我给了老公3个月的花心期!爱还会再回来吗?
- 2008715回来看自己的代码的困惑
- 终于把我的以前写的代码都找回来了呵呵,就等着空间上传了
- 替朋友写的段代码,先放这里
- 这里是MYSQL操作的C语言代码,我贴几个,你们看吧
- 看来我还是回来这里吧!
- Java中有关日期的操作,昨天晚上赴约,搞到12点多才回来,今天写这一小段代码都花了一段漫长的时间,哎。。
- dojo tree 最终版,包含前面的所有功能,并进一步重构了代码,这里直接贴代码,不再做解释
- 不知道如何用google code上传代码的看这里