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

2021-10-22 16:35:05 字數 1420 閱讀 8753

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

在dota遊戲中,帕吉的肉鉤實際上是大多數英雄中最恐怖的東西。掛鉤由長度相同的幾個連續的金屬棍組成。

現在,帕吉(pudge)希望對掛接進行一些操作。

讓我們將鉤子的連續金屬棒從1編號為n。對於每次操作,pudge可以將連續的金屬棒(從x編號為y)更改為銅質棒,銀質棒或金質棒。

吊鉤的總值計算為n個金屬棒的總和。更精確地,每種棒的值計算如下:

對於每個銅棒,值為1。

對於每個銀棒,值為2。

對於每個金色棒,值為3。

帕吉想知道執行該操作後,鉤子的總值。

您可能會認為原來的鉤子是由銅棒組成的。

初始的時候,整個序列都是1,接下來,每次輸入l,r,x。表示將l到r之間修改為x且x只會是1、2、3,最後問你序列總和。

輸入輸入包含幾個測試用例。輸入的第一行是案例數。不超過10個案例。

對於每種情況,第一行包含乙個整數n,1 <= n <= 100,000,這是帕吉肉鉤的棍棒數,第二行包含乙個整數q,0 <= q <= 100,000,這是操作次數。

接下來的q行,每行包含三個整數x,y,1 <= x <= y <= n,z,1 <= z <= 3,這定義了乙個操作:將編號從x到y的搖桿變成金屬種類z,其中z = 1表示銅種類,z = 2表示銀種類,z = 3表示金色種類。

輸出對於每種情況,在操作之後的一行中列印乙個數字,表示鉤子的總值。使用示例中的格式。

樣本輸入110

21 5 2

5 9 3

樣本輸出

情況1:掛鉤的總值為24。

//對比上乙個,記憶模版

#include

#include

#include

#include

#include

using namespace std;

const int n=2e5+6;

int n,m;

struct nodetr[n*4];

void push_up(int u)

void push_down(int u)

fa.add=0;

}void build(int u,int l,int r);

else;

int mid=l+r>>1;

build(u<<1,l,mid),build(u<<1|1,mid+1,r);

push_up(u);}}

void modify(int u,int l,int r,int x)

else

}int query(int u,int l,int r)

int main()

printf(「case %d: the total value of the hook is %d.\n」,tt,query(1,1,n));}}

沒什麼好說的和前兩道差不多,模版繼續背與理解吧

模板 線段樹(2)區間修改

好像叫做懶操作來著。還是叫延遲修改更高大上一點吧 區間修改 兩種操作 add l r v 把a l a l 1 a r 的值全部增加v query l r 計算子串行a l a l 1 a r 的元素和,最小值和最大值 修改 查詢的範圍均為 y1,y2 維護節點o,它對應區間 l,r void ma...

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

hdu 1698 just a hook p2161 shoi2009 會場預約 本來是把區間染色放到第一次總結的,但是後來才發現自己對區間染色並沒有那麼熟練,所以特意提取出來總結一遍。區間染色的查詢主要有兩種 一種是直接詢問 l,r 之間的顏色種類,還有就是對每個顏色有一定的權值,求 l,r 之前...

線段樹(2)區間修改

快速序列操作i,給出乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構支援一下兩種操作 set l,r,v 把al,al 1,ar的值全部修改為v v 0 query l,r 計算子串行al,al 1,ar的元素和 最小值和最大值。include include using namesp...