看完理论知识来做的额这道题 ,前面一直wa 很多细小的地方都没有考虑周全,还没有理解到线段树的精髓。先记录下:
代码如下 :
#include<stdio.h> #define nn 100000 struct node { int l,r,val; }t[nn*4]; int value;
//建线段树 void make (int s,int e,int id) { t[id].l=s; t[id].r=e; t[id].val=1; if(s==e)return ; else { int mid=(t[id].l+t[id].r)/2; make(s,mid,id*2); make(mid+1,e,id*2+1); } } //更新每个节点的数据 void update (int s,int e,int id) { if(t[id].val==value) return ; if(t[id].l==s&&t[id].r==e) { t[id].val=value; return; } // 这步操作是很重要的? if(t[id].val>0) { t[id*2+1].val=t[id*2].val=t[id].val; t[id].val=0; } int mid=(t[id].l+t[id].r)/2; if(s>mid)update(s,e,id*2+1); else if(e<=mid)update(s,e,id*2); else { update(mid+1,e,id*2+1); update(s,mid,id*2); } } //查询 计算最终的值 int query(int id) { if(t[id].val>0) return t[id].val*(t[id].r-t[id].l+1); return query(id*2+1)+query(id*2); } int main() { int T; int num=0; int n; int Q; int a,b; scanf("%d",&T); while(T--) { num++; scanf("%d",&n); make(1,n,1); scanf("%d",&Q); while(Q--) { scanf("%d%d%d",&a,&b,&value); update(a,b,1); } printf("Case %d: ",num); printf("The total value of the hook is %d.\n",query(1)); } }
本文通过一道具体的题目,深入探讨了线段树的构建、更新及查询算法,并分享了作者在实现过程中的心得与体会。
491

被折叠的 条评论
为什么被折叠?



