洛谷1558 色板遊戲(線段樹,位運算 )

2022-05-25 18:48:06 字數 1303 閱讀 7753

題目大意:

給定乙個長度為n的序列,每乙個位置的初始顏色都是1,現在有m個操作。

\(c\ l\ r\ x\)將\([l,r]\)的顏色都修改成x

\(p\ l\ r\)查詢[l,r]的顏色有多少種

其中!顏色種類不超過30

經過觀察,我們發現這個題的顏色種類特別少!那麼我們可以直接將線段樹節點所對應的區間含的顏色壓成乙個二進位制

然後在合併的時候

\(f[root]=f[2*root] | f[2*root+1]\)

就可以了

再就是query的時候,同樣也是求乙個總的按位或的乙個值

直接求就行

而修改操作就是將\(f[root]\)直接改為\((1<

順便下方標記就可以

上**

#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

inline int read()

while (isdigit(ch))

return x*f;

}const int maxn = 1e5+1e2;

ll f[4*maxn],add[4*maxn];

int n,m;

int count(ll x)

return cnt;

}void up(int root)

void pushdown(int root,int l,int r)

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

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

build(2*root,l,mid);

build(2*root+1,mid+1,r);

up(root);

}void update(int root,int l,int r,int x,int y,ll p)

pushdown(root,l,r);

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

if (x<=mid) update(2*root,l,mid,x,y,p);

if (y>mid) update(2*root+1,mid+1,r,x,y,p);

up(root);

}ll query(int root,int l,int r,int x,int y)

int l;

int main()

if (s[1]=='p')

} return 0;

}

色板遊戲(洛谷 1558)

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