日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZOJ 1610 Count the Colors 【线段树】

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZOJ 1610 Count the Colors 【线段树】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

<題目鏈接>

題目大意:

在[0,8000]這個區間內,不斷進行一些操作,將其中的一些區間染成特定顏色,如果區間重復的話,后面染的色塊會覆蓋前面染的色塊,問最終[0,8000]這個區間內每種顏色的色塊數量是多少。

解題分析:

首先要注意,這是對區間進行更新,。所以update的時候是對輸入區間[a,b]的左閉右開或者是左開右閉進行處理。然后本題思路非常清晰,就是按照輸入順序更新線段樹對應區間,然后對[0,8000]這個區間從左向右進行色塊的統計。PS:雖然最后還是要將所有lazy下放到所有的葉子節點,進行色塊數量的暴力統計,但是pushdown函數確實能夠減少 update 的一些復雜度。

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){ //區間染色 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),達到從左到右逐步查詢的效果,當遇到染色的點時,判斷其是否與前一個點相同,如果不同,就說明該顏色的區塊 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); //由于本題是區間更新,所以不能直接更新[a,b]這個閉區間的所有點,而是對a~b的左開右閉或者左閉右開區間進行更新,類似于圖的將邊權轉化為點權 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

轉載于:https://www.cnblogs.com/00isok/p/9691282.html

總結

以上是生活随笔為你收集整理的ZOJ 1610 Count the Colors 【线段树】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。