題目鏈結
這玩意兒是聽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之間的...