BZOJ5312 冒險 勢能均攤線段樹

2022-04-30 03:51:09 字數 1793 閱讀 7340

題目鏈結

這玩意兒是聽shadowice說的,好像很厲害的樣子

我們維護出區間&,區間|,區間最大值

結論:如果一次操作對區間& 和 區間| 產生的影響是相同的,那麼該操作對整個區間的影響都是相同的

證明可以看這裡

然後就做完了。。

時間複雜度$o(nklogn)$,$k$是二進位制位數,這裡是20

#include#include

#define ull unsigned long long

#define ll long long

//#define int long long

#define ls (k << 1)

#define rs (k << 1 | 1)

using

namespace

std;

const

int maxn = 2 * 1e6 + 10, inf = 1e9 + 7, mod = 998244353

;inline

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *f;

}int

n, m;

inta[maxn];

struct

node t[maxn];

void update(int

k) void ps(int k, int

val)

void pushdown(int

k) void build(int k, int ll, int

rr) ;

if(ll == rr)

int mid = ll + rr >> 1

; build(ls, ll, mid); build(rs, mid + 1

, rr);

update(k);

}void intand(int k, int ll, int rr, int

val)

pushdown(k);

int mid = t[k].l + t[k].r >> 1

;

if(ll <=mid) intand(ls, ll, rr, val);

if(rr >mid) intand(rs, ll, rr, val);

update(k);

}void intor(int k, int ll, int rr, int

val)

pushdown(k);

int mid = t[k].l + t[k].r >> 1

;

if(ll <=mid) intor(ls, ll, rr, val);

if(rr >mid) intor(rs, ll, rr, val);

update(k);

}int query(int k, int ll, int

rr)

main()

else

if(opt == 2

) else printf("

%d\n

", query(1

, l, r));

}return0;

}/*3 27 11

1 53 847

*/

bzoj5312 冒險 線段樹

kaiser終於成為冒險協會的一員,這次冒險協會派他去冒險,他來到一處古墓,卻被大門上的守護神擋住了去路,守護神給出了乙個問題,只有答對了問題才能進入,守護神給出了乙個自然數序列a,每次有一下三種操作。1,給出l,r,x,將序列l,r之間的所有數都 and x 2,給出l,r,x,將序列l,r之間的...

bzoj5312 冒險 勢能均攤線段樹

bzoj5312 冒險 如果一次操作對區間 和 區間 產生的影響是相同的,那麼該操作對整個區間的影響都是相同的 對於每次操作,在某些位上的值,對於整個區間影響是相同的,對相同影響的操作直接打標記 否則遞迴子樹 複雜度證明 include includeinline int read while c ...

BZOJ5312 冒險 線段樹 位運算

kaiser終於成為冒險協會的一員,這次冒險協會派他去冒險,他來到一處古墓,卻被大門上的守護神擋住了去路,守護神給出了乙個問題,只有答對了問題才能進入,守護神給出了乙個自然數序列a,每次有一下三種操作。1,給出l,r,x,將序列l,r之間的所有數都 and x 2,給出l,r,x,將序列l,r之間的...