ZOJ 1610 Count the Colors 【线段树】
生活随笔
收集整理的這篇文章主要介紹了
ZOJ 1610 Count the Colors 【线段树】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
<題目鏈接>
題目大意:
在[0,8000]這個區(qū)間內(nèi),不斷進行一些操作,將其中的一些區(qū)間染成特定顏色,如果區(qū)間重復(fù)的話,后面染的色塊會覆蓋前面染的色塊,問最終[0,8000]這個區(qū)間內(nèi)每種顏色的色塊數(shù)量是多少。
解題分析:
首先要注意,這是對區(qū)間進行更新,。所以update的時候是對輸入?yún)^(qū)間[a,b]的左閉右開或者是左開右閉進行處理。然后本題思路非常清晰,就是按照輸入順序更新線段樹對應(yīng)區(qū)間,然后對[0,8000]這個區(qū)間從左向右進行色塊的統(tǒng)計。PS:雖然最后還是要將所有l(wèi)azy下放到所有的葉子節(jié)點,進行色塊數(shù)量的暴力統(tǒng)計,但是pushdown函數(shù)確實能夠減少 update 的一些復(fù)雜度。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 #define Lson rt<<1,l,mid 7 #define Rson rt<<1|1,mid+1,r 8 const int M =8e3; 9 int tr[M<<2],lazy[M<<2],last; 10 int col[M<<1]; 11 void Pushdown(int rt){ 12 if(lazy[rt]!=-1){ 13 int tmp=lazy[rt]; 14 lazy[rt<<1]=lazy[rt<<1|1]=tmp; 15 tr[rt<<1]=tr[rt<<1|1]=tmp; 16 lazy[rt]=-1; 17 } 18 } 19 void update(int rt,int l,int r,int L,int R,int c){ //區(qū)間染色 20 if(L<=l&&r<=R){ 21 lazy[rt]=c; 22 tr[rt]=c; 23 return; 24 } 25 Pushdown(rt); 26 int mid=(l+r)>>1; 27 if(L<=mid)update(Lson,L,R,c); 28 if(R>mid)update(Rson,L,R,c); 29 } 30 void query(int rt,int l,int r){ //運用遞歸(類似于dfs),達到從左到右逐步查詢的效果,當(dāng)遇到染色的點時,判斷其是否與前一個點相同,如果不同,就說明該顏色的區(qū)塊 31 if(l==r){ 32 if(tr[rt]!=last&&tr[rt]!=-1)col[tr[rt]]++; 33 last=tr[rt]; 34 return; 35 } 36 Pushdown(rt); 37 int mid=(l+r)>>1; 38 query(Lson); 39 query(Rson); 40 } 41 int main(){ 42 int n; 43 while(scanf("%d",&n)!=EOF){ 44 memset(tr,-1,sizeof(tr)); 45 memset(lazy,-1,sizeof(lazy)); 46 memset(col,0,sizeof(col)); 47 while(n--){ 48 int x,y,c; 49 scanf("%d%d%d",&x,&y,&c); 50 update(1,1,M,x+1,y,c); //由于本題是區(qū)間更新,所以不能直接更新[a,b]這個閉區(qū)間的所有點,而是對a~b的左開右閉或者左閉右開區(qū)間進行更新,類似于圖的將邊權(quán)轉(zhuǎn)化為點權(quán) 51 } 52 last=-1; 53 query(1,1,M); 54 for(int i=0;i<=M;i++){ 55 if(col[i])printf("%d %d\n",i,col[i]); 56 } 57 printf("\n"); 58 } 59 return 0; 60 }?
?
2018-09-22
轉(zhuǎn)載于:https://www.cnblogs.com/00isok/p/9691282.html
總結(jié)
以上是生活随笔為你收集整理的ZOJ 1610 Count the Colors 【线段树】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三节 循环链表的Go语言实现
- 下一篇: u盘启动后鼠标没用怎么办 U盘启动后无法