題目背景
阿寶上學了,今天老師拿來了一塊很長的塗色板。
題目描述
色板長度為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
分析:
線段樹
看到t的範圍不大,我就乾脆在每個線段樹節點中都開了乙個30的陣列,記錄該區間每種顏色的數量
其餘的就是樸素操作了
一開始狂wa不止,知道wo看到了這句話
這裡 a, b, c 為整數, 可能a> b
改了之後就a了。。。。坑坑坑!!!
luogu上我每個點都是1000ms–(沒有吸氧)
但是在poj2777上時限都一樣,
卻是悲慘的tle
只能說明poj的評測機比較辣雞。。
這裡寫**片
#include
#include
#include
using
namespace
std;
const
int n=100001;
struct node;
node t[n<<2];
int n,o,c,co[32];
inline
void print(int bh,int z)
void push(int bh)
}inline
void update(int bh)
void build(int bh,int l,int r)
int mid=(l+r)>>1;
build(bh<<1,l,mid);
build(bh<<1|1,mid+1,r);
update(bh);
}void change(int bh,int l,int r,int z)
int mid=(t[bh].x+t[bh].y)>>1;
if (l<=mid) change(bh<<1,l,r,z);
if (r>mid) change(bh<<1|1,l,r,z);
update(bh);
}void copy(int bh)
void ask(int bh,int l,int r)
int mid=(t[bh].x+t[bh].y)>>1;
if (l<=mid) ask(bh<<1,l,r);
if (r>mid) ask(bh<<1|1,l,r);
}int main()
else
}return
0;}
Luogu P1558 色板遊戲
此題與poj2777重題 為了加深對線段樹的記憶,然後開始搞這道題。tm的wa了一下午就是發現x可能大於y 然而題目裡說的還很清楚,我tm沒看見 1.儲存時不是儲存顏色,而是將它狀壓成乙個整數 如序號為3的顏色存為1 3 8 2.回溯時不是取和相加,而是直接按位或 原理等下講 3.最後的查詢完畢的值...
P1558 色板遊戲
題目位址 思路 位運算,狀態壓縮,線段樹 分析思路 線段樹code include include define clean x memset x,0,sizeof x define ls rt 2 define rs rt 2 1 const int maxl 100005 maxk 30 uns...
luogu 1558 色板遊戲
寫這篇部落格不是為了總結我的演算法,而是為了紀念讓我爆零的套路.色板長度為 l l 是乙個正整數,所以我們可以均勻地將它劃分成 l 塊 1 厘公尺長的小方格。並從左到右標記為 1,2,l 現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 c a b c 指在 a 到 b 號方格中塗上顏色 c...