HDU-1698(线段树入门)

来源:互联网 发布:淘宝改版中国质造 编辑:程序博客网 时间:2024/06/12 00:52

请您先别看着个代码,这个代码是我自己在通过自己对线段树的了解,自己写的...

那不是一般的烂...是经过我无数的改正才改过来的 希望大家不要借鉴哦,,一会等我看看,别人的代码,然后再整理整理,出个漂亮的代码.嘿嘿

 

这个是超时的....

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>int N;struct Node{int left;int right;int val;}tnode[1000005];void Buildtree(int l,int r,int n,int t){int mid=(r+l)/2;if(l!=0&&r!=0){if(l!=r){tnode[n].left=l;tnode[n].right=r;tnode[n].val=t;Buildtree(l,mid,2*n,mid-l+1);Buildtree(mid+1,r,2*n+1,r-mid);}else{tnode[n].left=l;tnode[n].right=r;tnode[n].val=1;}}}void update(int n){if(n==0)return;if(n%2==0){tnode[n/2].val=tnode[n].val+tnode[n+1].val;update(n/2);//printf("update(l=%d___r=%d)==%d\n",tnode[n/2].left,tnode[n/2].right,tnode[n/2].val);}else{tnode[(n-1)/2].val=tnode[n].val+tnode[n-1].val;update((n-1)/2);}}int getsum(){return tnode[1].val;}void motify(int l,int r,int val,int n){int mid=(tnode[n].left+tnode[n].right)/2;if(tnode[n].left==l&&tnode[n].right==r&&l==r){tnode[n].val=val;update(n);}else{if(r<=mid){motify(l,r,val,2*n);}else if(l>=mid+1){motify(l,r,val,2*n+1);}else if(l<=mid&&r>=mid+1){motify(l,mid,val,2*n);motify(mid+1,r,val,2*n+1);}}}int main(){int T;int M;while(scanf("%d",&T)!=EOF){for(int k=1;k<=T;k++){scanf("%d",&N);Buildtree(1,N,1,10);//for(int i=1;i<=30;i++)//{//printf("i=%d__l=%d____r=%d____val=%d__\n",i,tnode[i].left,tnode[i].right,tnode[i].val);//}//printf("\n");//system("pause");scanf("%d",&M);int a,b,val;for(int i=1;i<=M;i++){scanf("%d%d%d",&a,&b,&val);motify(a,b,val,1);//for(int i=1;i<=30;i++)//{//printf("i=%d__l=%d____r=%d____val=%d__\n",i,tnode[i].left,tnode[i].right,tnode[i].val);//}//printf("\n");}printf("Case %d: The total value of the hook is ",k);int ans=getsum();printf("%d.\n",ans);}}return 0;}


 

 

下面不上比较好看的代码..嘿嘿,,

 

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>int N;struct Node{int left;int right;int val;}tree[300005];int Buildtree(int i,int a,int b){tree[i].left=a;tree[i].right=b;if(a==b){return tree[i].val=1;}int mid=(a+b)/2;return tree[i].val=Buildtree(2*i,a,mid)+Buildtree(2*i+1,mid+1,b);}int update(int i,int a,int b,int val){if(tree[i].left==tree[i].right){return tree[i].val=val;}int mid=(tree[i].left+tree[i].right)/2;if(a>mid){return tree[i].val=update(2*i+1,a,b,val)+tree[2*i].val;}else if(b<=mid){return tree[i].val=update(2*i,a,b,val)+tree[2*i+1].val;}else{return tree[i].val=update(2*i,a,mid,val)+update(2*i+1,mid+1,b,val);}}int main(){int T;int M;scanf("%d",&T);for(int k=1;k<=T;k++){scanf("%d",&N);Buildtree(1,1,N);//printf("%d____\n",tree[1].val);scanf("%d",&M);for(int i=1;i<=M;i++){int a,b,val;scanf("%d%d%d",&a,&b,&val);update(1,a,b,val);//printf("%d******\n",tree[1].val);}printf("Case %d: The total value of the hook is %d.\n",k,tree[1].val);}return 0;}