hdu 1698 Just a Hook (线段树)



看完理论知识来做的额这道题  ,前面一直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)); } }



你可能感兴趣的:(hdu 1698 Just a Hook (线段树))