Luogu P1558 色板遊戲

2022-04-02 23:25:45 字數 1554 閱讀 7517

(此題與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#include

using

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...