(此題與poj2777重題)
為了加深對線段樹的記憶,然後開始搞這道題。
tm的wa了一下午就是發現x可能大於y(然而題目裡說的還很清楚,我tm沒看見)
1.儲存時不是儲存顏色,而是將它狀壓成乙個整數(如序號為3的顏色存為1<<3=8)
2.回溯時不是取和相加,而是直接按位或(|),原理等下講
3.最後的查詢完畢的值統計一下二進位制下有多少個1就是ans
最後講一下為什麼要|
假如3種顏色 2,3,3,在樹上記為4,8,8,它們對應的二進位制就是(100,1000,1000)
有沒有發現,每個數的二進位制下都只有一位上有1,而且不同顏色的數1的位置不同
因此在|的時候,只要這一位上有1,那麼就一定有這種顏色
線段樹就是板子,套一套就好了
code
#include#includeusing
namespace
std;
const
int n=100005
;int tree[n*4],add[n*4
],l,t,o,x,y,z;
char
ch;inline
void read(int &x)
while (ch>='
0'&&ch<='
9') x=x*10+ch-'
0',ch=getchar();
x*=flag;
}inline
void write(int
x)inline
void up(int
root)
inline
void down(int
root)
}inline
void build(int root,int l,int
r)
int mid=l+r>>1
; build(root*2
,l,mid);
build(root*2+1,mid+1
,r);
up(root);
}inline
void change(int root,int l,int r,int beg,int end,int
col)
down(root);
int mid=l+r>>1
;
if (beg<=mid) change(root*2
,l,mid,beg,end,col);
if (end>mid) change(root*2+1,mid+1
,r,beg,end,col);
up(root);
}inline
int query(int root,int l,int r,int beg,int
end)
inline
int calc(int
x)
return
res;
}int
main()
else
}return0;
}
luoguP1558 色板遊戲
題目背景 阿寶上學了,今天老師拿來了一塊很長的塗色板。題目描述 色板長度為l,l是乙個正整數,所以我們可以均勻地將它劃分成l塊1厘公尺長的小方格。並從左到右標記為1,2,l。現在色板上只有乙個顏色,老師告訴阿寶在色板上只能做兩件事 1.c a b c 指在a到 b 號方格中塗上顏色 c。2.p a ...
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...