hdu 1698 線段樹(修改線段值)

來源:互聯網
上載者:User

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 />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.