http://acm.hdu.edu.cn/showproblem.php?pid=1698
/*修改函數Update():在修改區間的時候,如果正好和區間對應,則改變當前點的value值,如果不對應,<br />則要修改的區間必是當前區間的子區間,再當前區間的兩個子區間修改就行了,<br />關鍵點是:先將當前區間value值賦給它的兩個子區間,同時當前區間的value值要賦零,表示當前區間裡的儲存的值不是同一個值。<br />*/<br />#include<iostream><br />using namespace std;<br />struct node<br />{<br />int left,right;<br />int val,num;<br />}a[300000];</p><p>void creat(int s,int t,int step)<br />{<br />a[step].left=s;<br />a[step].right=t;<br />a[step].num=s-t+1;<br />if(a[step].left==a[step].right)<br />{ a[step].val=1;return;}<br />int mid=(s+t)/2;<br />a[step].val=0;<br />creat(s,mid,2*step);<br />creat(mid+1,t,2*step+1);<br />}</p><p>/*TLE!!!<br />int update(int step,int s,int t,int v)//更新線段!!!<br />{<br />if(a[step].left==a[step].right)<br />return a[step].val=v;<br />int mid=(a[step].left+a[step].right)/2;<br />if(mid<s)//更新右子樹<br />return a[step].val=update(2*step+1,s,t,v) + a[2*step].val;<br />else<br />if(mid>=t)//更新左子樹<br />return a[step].val=update(2*step,s,t,v) + a[2*step+1].val;<br />else<br />return a[step].val=update(2*step,s,t,v)+update(2*step+1,s,t,v);<br />}<br />*/</p><p>void update(int s,int t,int step,int value)<br />{<br />if(s<=a[step].left && a[step].right<=t)<br />{<br />a[step].val=value;<br />a[step].num=(a[step].right-a[step].left+1)*value;<br />return ;<br />}<br />else<br />{<br />if(a[step].val>0)<br />{<br />a[2*step].val=a[step].val;<br />a[2*step].num=(a[2*step].right-a[2*step].left+1)*a[2*step].val;<br />a[2*step+1].val=a[step].val;<br />a[2*step+1].num=(a[2*step+1].right-a[2*step+1].left+1)*a[2*step+1].val;<br />a[step].val=0;<br />}<br />if(s<=a[2*step].right)<br />update(s,t,2*step,value);<br />if(t>=a[2*step+1].left)<br />update(s,t,2*step+1,value);<br />a[step].num=a[2*step].num+a[2*step+1].num;<br />}<br />}</p><p>int main()<br />{<br />//freopen("a.txt","r",stdin);<br />int ca;<br />int k;<br />scanf("%d",&ca);<br />for(k=1;k<=ca;k++)<br />{<br />int n,m;<br />scanf("%d%d",&n,&m);<br />int i;<br />creat(1,n,1);<br />for(i=1;i<=m;i++)<br />{<br />int x,y,z;<br />scanf("%d%d%d",&x,&y,&z);<br />update(x,y,1,z);<br />}<br />printf("Case %d: The total value of the hook is %d./n",k,a[1].num);<br />}<br />return 0;<br />}<br />