線段樹 構造 A 或位運算

2022-06-12 22:18:13 字數 1466 閱讀 1044

乙個長度為\(n\)的非負整數序列,

需要滿足\(m\)個區間或值為閾值的限制條件

現在要構造乙個這樣的序列,不存在輸出no

線段樹支援區間與,但查詢區間或,下傳標記,那就很好做了

#include #include #define rr register

using namespace std;

const int inf = (1 << 30) - 1, n = 100011;

int a[n], w[n << 2], lazy[n << 2], n, m, l[n], r[n], z[n];

inline signed iut()

inline void print(int ans)

inline void build(int k, int l, int r)

inline void pdown(int k)

inline void update(int k, int l, int r, int x, int y, int z)

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

if (lazy[k] ^ inf)

pdown(k);

if (y <= mid)

update(k << 1, l, mid, x, y, z);

else if (x > mid)

update(k << 1 | 1, mid + 1, r, x, y, z);

else

update(k << 1, l, mid, x, mid, z), update(k << 1 | 1, mid + 1, r, mid + 1, y, z);

w[k] = w[k << 1] | w[k << 1 | 1];

}inline signed query(int k, int l, int r, int x, int y)

inline void dfs(int k, int l, int r) ;

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

if (lazy[k] ^ inf)

pdown(k);

dfs(k << 1, l, mid);

dfs(k << 1 | 1, mid + 1, r);

w[k] = w[k << 1] | w[k << 1 | 1];

}signed main()

for (rr int i = 1; i <= m; ++i)

if (query(1, 1, n, l[i], r[i]) < z[i])

return !printf("no");

dfs(1, 1, n), printf("yes");

for (rr int i = 1; i <= n; ++i) putchar(i == 1 ? 10 : 32), print(a[i]);

return 0;

}

POJ 2777 線段樹 位運算

poj 2777 有乙個長位l的區間,有t種顏色,進行o次操作,每次操作 1 n 100000,1 t 30 1 o 100000 每次操作有兩種形式 p a b c 將區間 a,b 染成顏色c q a b 詢問區間 a,b 有多少種不同的顏色 每個點的初始顏色都是1 注意 a可能大於b 線段樹的區...

線段樹構造

線段樹是一棵二叉樹,他的每個節點包含了兩個額外的屬性start和end用於表示該節點所代表的區間。start和end都是整數,並按照如下的方式賦值 實現乙個build方法,接受 start 和 end 作為引數,然後構造乙個代表區間 start,end 的線段樹,返回這棵線段樹的根。您在真實的面試中...

位運算 異或運算

今天刷題時遇到乙個題,本以為是暴力 大模擬,結果看完別人的ac 後人都傻了,竟然是位運算。其中用到了異或 這種運算子。先上原題連線 傳送門 題目意思很好理解,有無限多個路燈,編號為1.2.3 剛開始時都是關著的,每次對一盞燈的操作都會改變它的狀態 即開變成關,關變成開 每次操作會給你乙個實數a和乙個...