洛谷P1558 色板遊戲

2022-04-30 23:48:31 字數 1930 閱讀 9069

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

色板長度為\(l\),\(l\)是乙個正整數,所以我們可以均勻地將它劃分成\(l\)塊\(1\)厘公尺長的小方格。並從左到右標記為\(1, 2, ... l\)。

現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事:

"\(c\)

\(a\)

\(b\)

\(c\)" 指在\(a\)到 \(b\) 號方格中塗上顏色 \(c\)。

"\(p\)

\(a\)

\(b\)"指老師的提問:\(a\)到 \(b\)號方格中有幾種顏色。

學校的顏料盒中一共有 \(t\) 種顏料。為簡便起見,我們把他們標記為 \(1, 2, ... t\). 開始時色板上原有的顏色就為\(1\)號色。 面對如此複雜的問題,阿寶向你求助,你能幫助他嗎?

輸入格式:

第一行有\(3\)個整數 \(l (1 \leq l \leq 100000)\), \(t (1 \leq t \leq 30)\) 和 \(o (1 \leq o \leq 100000)\)。 在這裡\(o\)表示事件數。

接下來 \(o\) 行, 每行以 "\(c\)

\(a\)

\(b\)

\(c\)" 或 "\(p\)

\(a\)

\(b\)" 得形式表示所要做的事情(這裡 \(a\), \(b\), \(c\) 為整數, 可能\(a\)> \(b\),這樣的話需要你交換\(a\)和\(b\))

輸出格式:

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

輸入樣例#1:

2 2 4

c 1 1 2

p 1 2

c 2 2 2

p 1 2

輸出樣例#1:

2

1

思路:正解貌似是基於二進位制來建線段樹,但是我不會……於是我就非常暴力的建了\(t\)棵線段樹,因為\(t\)只有\(30\)嘛,所以建\(30\)棵線段樹也不會爆,沒棵線段樹代表乙個顏色,然後對於每乙個\(c\)操作,就是修改要修改的那個顏色的對應線段樹的對應修改區間為\(1\),其餘線段樹的對應修改區間修改為\(0\),然後查詢就是把每棵線段樹的區間顏色數加起來。但是**可能因為常數優化的不太好等原因,不開\(o(2)\)會\(tle\)乙個點。

**:

#include#include#define maxn 100007

#define ls rt<<1

#define rs rt<<1|1

#define re register

using namespace std;

int n,t,m,sum[31][maxn<<2],lazy[31][maxn<<2];

char s[2];

inline void pushup(int i, int rt)

inline void pushdown(int i, int rt)

else

lazy[i][rt]=0;

}void build(int rt, int l, int r)

int mid=(l+r)>>1;

build(ls,l,mid);

build(rs,mid+1,r);

pushup(1,rt);

}void modify(int i, int rt, int l, int r, int l, int r, int val)

int csum(int i, int rt, int l, int r, int l, int r)

int main()

}else

} return 0;

}

洛谷 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。現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 1.c a b c 指在a到 b 號方格中塗上顏色 c。2.p a b 指老師的提問 a...