阿寶上學了,今天老師拿來了一塊很長的塗色板。
色板長度為\(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...