洛谷P1558 色板遊戲

2022-05-01 10:03:11 字數 1577 閱讀 5107

阿寶上學了,今天老師拿來了一塊很長的塗色板。

色板長度為l,l是乙個正整數,所以我們可以均勻地將它劃分成l塊1厘公尺長的小方格。並從左到右標記為1, 2, ... l。現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事:1. "c a b c" 指在a到 b 號方格中塗上顏色 c。2. "p a b" 指老師的提問:a到 b號方格中有幾種顏色。學校的顏料盒中一共有 t 種顏料。為簡便起見,我們把他們標記為 1, 2, ... t. 開始時色板上原有的顏色就為1號色。 面對如此複雜的問題,阿寶向你求助,你能幫助他嗎?

輸入格式:

第一行有3個整數 l (1 <= l <= 100000), t (1 <= t <= 30) 和 o (1 <= o <= 100000). 在這裡o表示事件數, 接下來 o 行, 每行以 "c a b c" 或 "p a b" 得形式表示所要做的事情(這裡 a, b, c 為整數, 可能a> b)

輸出格式:

對於老師的提問,做出相應的回答。每行乙個整數。

輸入樣例#1:

2 2 4

c 1 1 2

p 1 2

c 2 2 2

p 1 2

輸出樣例#1:

2

1分析:這道題肯定是要用線段樹來做,但是要怎麼儲存資訊呢?儲存顏色數肯定不對,我們要儲存擁有哪些顏色,但是用陣列又不太好,觀察發現顏色的個數非常少,所以可以轉化為二進位制來做,每次pushup就用|操作就好了.

#include #include 

#include

#include

#include

using

namespace

std;

int l,t,o,c[1000010],flag[1000010

];void pushup(int

o)void pushdown(into)}

void build(int l,int r,int

o)

int mid = (l + r) >> 1

; build(l,mid,o * 2

); build(mid + 1,r,o * 2 + 1

); pushup(o);

}void update(int l,int r,int o,int x,int y,int

v) pushdown(o);

int mid = (l + r) >> 1

;

if (x <=mid)

update(l,mid,o * 2

,x,y,v);

if (y >mid)

update(mid + 1,r,o * 2 + 1

,x,y,v);

pushup(o);

}int query(int l,int r,int o,int x,int

y)int

main()

else

printf(

"%d\n

",cnt);}}

return0;

}

洛谷 P1558 色板遊戲

阿寶上學了,今天老師拿來了一塊很長的塗色板。色板長度為l,l是乙個正整數,所以我們可以均勻地將它劃分成l塊1厘公尺長的小方格。並從左到右標記為1,2,l。現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 1.c a b c 指在a到 b 號方格中塗上顏色 c。2.p a b 指老師的提問 a...

洛谷P1558 色板遊戲

阿寶上學了,今天老師拿來了一塊很長的塗色板。色板長度為l,l是乙個正整數,所以我們可以均勻地將它劃分成l塊1厘公尺長的小方格。並從左到右標記為1,2,l。現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 1.c a b c 指在a到 b 號方格中塗上顏色 c。2.p a b 指老師的提問 a...

洛谷P1558 色板遊戲

阿寶上學了,今天老師拿來了一塊很長的塗色板。色板長度為 l l 是乙個正整數,所以我們可以均勻地將它劃分成 l 塊 1 厘公尺長的小方格。並從左到右標記為 1,2,l 現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 c a b c 指在 a 到 b 號方格中塗上顏色 c p a b 指老師...