區間染色 kuagnbin線段樹專題(3)

2021-10-01 13:22:44 字數 3021 閱讀 3771

hdu 1698 just a hook

p2161 [shoi2009]會場預約

本來是把區間染色放到第一次總結的,但是後來才發現自己對區間染色並沒有那麼熟練,所以特意提取出來總結一遍。

區間染色的查詢主要有兩種:一種是直接詢問[l,r]之間的顏色種類,還有就是對每個顏色有一定的權值,求[l,r]之前的權值和

第一道題就是根據顏色的權值求區間和,第二種就是詢問顏色種類個數

寫第一道題的時候幾乎是秒殺,當時思路很清晰,對雜色標記的向上傳遞處理的很好,一遍ac

關鍵在於push_up上,每次push_up要根據兒子節點的顏色來考慮是不是要打上-1(即雜色)的標記,還有查詢的時候對於雖然完全覆蓋但仍是雜色的節點應該繼續往下搜尋。

hdu 1698 just a hook

#include

#include

#include

using

namespace std;

const

int maxn =

1e5+10;

int tree[maxn<<2]

;//-1,0,1,2分別表示雜色,銅,銀,金

int n,q;

void

push_down

(int id)

void

push_up

(int id)

void

update

(int id,

int stl,

int str,

int l,

int r,

int val)

push_down

(id)

;int mid =

(stl+str)

>>1;

if(r<=mid)

update

(id<<

1,stl,mid,l,r,val)

;else

if(l>mid)

update

(id<<1|

1,mid+

1,str,l,r,val)

;else

push_up

(id);}

intquery

(int id,

int l,

int r)

push_down

(id)

;int mid =

(l+r)

>>1;

return

query

(id<<

1,l,mid)

+query

(id<<1|

1,mid+

1,r);}

intmain()

int ans =

query(1

,1,n);

printf

("case %d: the total value of the hook is %d.\n"

,kase,ans);}

return0;

}

p2161 [shoi2009]會場預約

這道題也幾乎一樣,但是自己寫的時候完全沒有感覺,一開始寫的很爛,後來參考自己寫上一道題的寫法才寫出來。

兩種操作:

①區間染色,並且把所有和這個區間相交的所有其他顏色區間都刪去

②詢問一共有多少種顏色

第二種操作顯然可以在第一種操縱上維護,可以直接輸出結果。

因此關鍵就在於如何區間染色,還是和上面一道題一樣,維護雜色,就算完全覆蓋區間但是是雜色的情況仍要繼續向下找。統計顏色只要再維護乙個vis陣列即可。

還有就是題目沒有給出最大區間的範圍,於是可以離線求出start和end值,再建樹。

//不知不覺自己寫了乙個很漂亮的線段樹染色的板子  just a hook

//不知道自己當時怎麼寫出來的。。。

#include

#include

#include

using

namespace std;

const

int inf =

1<<25;

const

int maxn =

1e5+5;

int start[maxn<<1]

,stop[maxn<<1]

,exec[maxn<<1]

,vis[maxn<<1]

;int tree[maxn<<3]

;int ans1,ans2;

//刪除的個數,總個數

void

push_up

(int id)

void

push_down

(int id)

void

deepmore

(int id,

int l,

int r)

if(tree[id]==-

1)}void

update

(int id,

int stl,

int str,

int l,

int r,

int k)

push_down

(id)

;int mid =

(stl+str)

>>1;

if(r<=mid)

update

(id<<

1,stl,mid,l,r,k)

;else

if(l>mid)

update

(id<<1|

1,mid+

1,str,l,r,k)

;else

push_up

(id);}

intmain()

else exec[i]=2

;}for(

int i=

1;i<=n;i++

)else

printf

("%d\n"

,ans2);}

return0;

}

ZOJ 1610 線段樹區間染色

給長度8000公尺的板,對其中區間染色,問最後能看到的顏色,和該顏色一共出現了幾段 線段覆蓋法 資料比較水 也可以暴力水過 線段樹 include stdio.h include string.h struct node data 40010 int color 8011 void build in...

線段樹區間染色 注意事項

具體思路 用線段樹儲存每個區間的顏色,然後再打乙個染色的標記,注意最後統計的時候,相鄰區間的不注意的話會被算成兩種。如果按照我一開始的思路的打,1,4 這個區間,5,8 這個區間,如果 1,4 的顏色和 5,7 的顏色相同,但是如果 5,8 是乙個混色的時候,這個時候會被統計成兩個顏色,其實是只有一...

線段樹模板題3 區間染色問題

1.3線段樹模板題3 區間染色問題 在dota遊戲中,帕吉的肉鉤實際上是大多數英雄中最恐怖的東西。掛鉤由長度相同的幾個連續的金屬棍組成。現在,帕吉 pudge 希望對掛接進行一些操作。讓我們將鉤子的連續金屬棒從1編號為n。對於每次操作,pudge可以將連續的金屬棒 從x編號為y 更改為銅質棒,銀質棒...