当前位置:编程学习 > C/C++ >>

HDU 1698

 线段树中的成段更新。 初始权值1-n为1.每次更新的时候判断一下是否找到当前要找的区间。如果找到直接返回。。没有找到就把当前这个大区间的权值改为0,表示子节点是由不同权值构成的!
下面是AC代码:
[cpp]
#include<cstdio> 
using namespace std; 
#define maxn 100010 
struct node{ 
    int id,l,r,m; 
    int val; 
}T[maxn<<2]; 
void build(int id,int l,int r){ 
     T[id].id = id ;  T[id].l = l ;  T[id].r = r;  T[id].val=1; 
     T[id].m=(l+r)>>1; 
     if(l==r)   return; 
     int m=(l+r)>>1;  build(id<<1,l,m);  build((id<<1)+1,m+1,r); 

void update(int id,int l,int r,int val){ 
     if(T[id].l==l&&T[id].r==r){ 
        T[id].val=val;  return; 
     } www.zzzyk.com
     if(T[id].val>0){ 
        T[id<<1].val=T[(id<<1)+1].val=T[id].val; 
        T[id].val=0; 
     } 
     if(T[id].m>=r)      update(id<<1,l,r,val); 
     else if(T[id].m<l)  update((id<<1)+1,l,r,val); 
     else{ 
           update(id<<1,l,T[id].m,val); 
           update((id<<1)+1,T[id].m+1,r,val); 
     } 

int count(int id){ 
     if(T[id].val==0){ 
       return count(id<<1)+count((id<<1)+1); 
     } 
     else{ 
       return (T[id].r-T[id].l+1)*T[id].val; 
     } 

int main(){ 
    int t,ca=1,n,Q,x,y,val;  scanf("%d",&t); 
    while(t--){ 
         scanf("%d",&n);    build(1,1,n); 
         scanf("%d",&Q); 
         while(Q--){ 
              scanf("%d%d%d",&x,&y,&val); 
              update(1,x,y,val); 
         } 
         int ans=count(1); 
         printf("Case %d: The total value of the hook is ",ca++); 
         printf("%d.\n",ans); 
    } 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,