hdu 1698 线段树(区间成段修改)

一开始直接上,一个个地修改,然后果断超时了,百思不得其解唯有百度,goole

看了别人的博客,虽然现在代码写出来了,也明白了算法,但对于算法的分析太弱了

依然不是很明白为什么这样比直接上快这么多,突然让我意识到,算法分析非常重要

具有好的算法分析能力才更有可能设计出更好的算法,以后这方面得多多加强!!!

超时代码:

#include<stdio.h> #define N 100005 struct node{ int l; int r; int sum; }; node tree[3*N]; void buid_tree(int k,int left,int right) { int mid; int L,R; tree[k].l = left; tree[k].r = right; if(right-left == 1){ tree[k].sum = 1; return ; } mid = (tree[k].l+tree[k].r)/2; L = 2*k; R = L+1; buid_tree(L,left,mid); buid_tree(R,mid,right); tree[k].sum = tree[L].sum+tree[R].sum; return ; } void tree_insert(int k,int left,int right,int data) { int mid; int L,R; if(left <= tree[k].l && right >= tree[k].r && tree[k].r-tree[k].l == 1){ tree[k].sum = data; return ; } mid = (tree[k].l+tree[k].r)/2; L = 2*k; R = L+1; if(left < mid) tree_insert(L,left,right,data); if(right > mid) tree_insert(R,left,right,data); tree[k].sum = tree[L].sum+tree[R].sum;//printf("(%d %d %d %d %d)/n",k,tree[L].sum,tree[R].sum,tree[k].sum,data); return ; } int main() { int tcase; int n,q; int x,y,z; int i; int walk = 0; scanf("%d",&tcase); while(tcase--){ scanf("%d %d",&n,&q); buid_tree(1,1,n+1); while(q--){ scanf("%d %d %d",&x,&y,&z); tree_insert(1,x,y+1,z); } printf("Case %d: The total value of the hook is %d./n",++walk,tree[1].sum); } return 0; }

两个AC代码:其实差不多

#include<stdio.h> #define N 100005 struct node{ int l; int r; int sum; int cover; }; node tree[3*N]; void buid_tree(int k,int left,int right) { int mid; int L,R;//printf("(%d) ",k); tree[k].l = left; tree[k].r = right; tree[k].sum = 1; tree[k].cover = 1; if(right-left == 1){ return ; } mid = (tree[k].l+tree[k].r)/2; L = 2*k; R = L+1; buid_tree(L,left,mid); buid_tree(R,mid,right); return ; } void tree_insert(int k,int left,int right,int data) { int mid; int L,R;//printf("((%d)%d %d (%d %d)) ",k,left,right,tree[k].l,tree[k].r); if(left == tree[k].l && right == tree[k].r){ tree[k].cover = 1; tree[k].sum = data; return ; } mid = (tree[k].l+tree[k].r)/2; L = 2*k; R = L+1; if(tree[k].cover){ tree[k].cover = 0; tree[L].cover = tree[L].cover =1; tree[L].sum = tree[R].sum = tree[k].sum; } if(mid >= right) tree_insert(L,left,right,data); else if(mid <= left) tree_insert(R,left,right,data); else{ tree_insert(L,left,mid,data); tree_insert(R,mid,right,data);//printf("(%d %d %d %d %d)/n",k,tree[L].sum,tree[R].sum,tree[k].sum,data); } return ; } int tree_search(int k) { int L; int R; if(tree[k].cover){ return (tree[k].r-tree[k].l)*tree[k].sum; } L = 2*k; R = L+1; return tree_search(L)+tree_search(R); } int main() { int tcase; int n,q; int x,y,z; int i; int walk = 0; scanf("%d",&tcase); while(tcase--){ scanf("%d %d",&n,&q); buid_tree(1,1,n+1); while(q--){ scanf("%d %d %d",&x,&y,&z); tree_insert(1,x,y+1,z); } printf("Case %d: The total value of the hook is %d./n",++walk,tree_search(1)); } return 0; }

 

#include<stdio.h> #define N 100005 struct node{ int l; int r; int color; }; node tree[3*N]; void buid_tree(int k,int left,int right) { int mid; int L,R; tree[k].l = left; tree[k].r = right; tree[k].color = 1; if(right-left == 1) return ; mid = (left+right)/2; L = 2*k; R = L+1; buid_tree(L,left,mid); buid_tree(R,mid,right); return ; } void tree_insert(int k,int left,int right,int data) { int mid; int L,R; if(tree[k].color == data) return ; if(left <= tree[k].l && right >= tree[k].r){ tree[k].color = data; return ; } L = 2*k; R = L+1; if(tree[k].color){ tree[L].color = tree[R].color = tree[k].color; tree[k].color = 0; } mid = (tree[k].l+tree[k].r)/2; if(left < mid) tree_insert(L,left,right,data); if(right > mid) tree_insert(R,left,right,data); return ; } int tree_search(int k) { int L,R; if(tree[k].color) return (tree[k].r-tree[k].l)*tree[k].color; L = 2*k; R = L+1; return tree_search(L)+tree_search(R); } int main() { int tcase; int walk = 0; int n,q; int x,y,z; scanf("%d",&tcase); while(tcase--){ scanf("%d %d",&n,&q); buid_tree(1,1,n+1); while(q--){ scanf("%d %d %d",&x,&y,&z); tree_insert(1,x,y+1,z); } printf("Case %d: The total value of the hook is %d./n",++walk,tree_search(1)); } return 0; }

你可能感兴趣的:(算法,struct,tree,search,insert,hook)