程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1698

HDU 1698

編輯:C++入門知識

 線段樹中的成段更新。 初始權值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.2cto.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); 
    } 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved