色板遊戲(線段樹)

2021-07-22 15:49:28 字數 1831 閱讀 5450

題目背景:

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

題目描述:

色板長度為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

思路:

線段樹

區間修改就是普通的修改,關鍵在區間查詢,即如何統計出某一區間中有多少種顏色。

寫乙個函式:check,如果tree[tree[k].lch].color!=tree[tree[k].rch].color,則把tree[k].color設為-1,意思是這個節點左二子和右兒子的顏色不一樣。

#include

#include

#include

using

namespace

std;

const

int maxn=100010;

int n,m,t,tot;

bool flag[35];

struct node

tree[maxn*4];

char c;

int init()

while(c>='0'&&c<='9')

return f*p;

}void build_tree(int ll,int rr)

else tree[cur].color=1;

}void update(int k)

void check(int k)//檢查函式

void change(int k,int l,int r,int p)

if(tree[k].flag)

update(k);

int mid=(tree[k].l+tree[k].r)>>1;

if(lif(r>mid) change(tree[k].rch,l,r,p);

check(k);

}void find(int k,int l,int r)

if(tree[k].flag)

update(k);

int mid=(tree[k].l+tree[k].r)>>1;

if(lif(r>mid) find(tree[k].rch,l,r);

}int main()

else

}return

0;}

色板遊戲(線段樹)

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

P1558 色板遊戲 線段樹

乙個簡單的 或 線段樹.竟然坑了我乙個小時.因為顏色很小,所以把狀態壓起來.然後每個節點上的數值代表當前顏色狀態.然後節點合併很簡單,直接或起來.需要注意一下的地方是修改時的 lazy 要完全覆蓋,這裡不能或.include define ll long long define in x x rea...

P1558 色板遊戲 狀壓線段樹

題面 洛谷p1558 每次不同顏色覆蓋一段區間,每次詢問一段區間有多少種顏色 因為顏色數 t 很小,使用二進位制表示狀態當前區間有那些顏色,二進位制第 i 位表示此區間是否含有 i 這種顏色,線段樹合併資訊時左右兒子資訊或一下就好了。scanf讀入char炸了我好久,最後換成cin就ac了 ac c...