關於區間異或的線段樹

2022-05-01 11:09:11 字數 1361 閱讀 3987

題:

題意:倆個操作,操作1:(l,r,x),區間[l,r]的數全部異或上x。操作2:(l ,r)輸出區間[l,r]和;

分析:對陣列a建線段樹,對於線段樹的每乙個節點進行二進位制拆位,每個位就統計有多少個1,更新操作對於涵蓋區間的二進位制位就等於其長度減去更新前的1的個數;

#includeusing

namespace

std;

#define lson root<<1,l,midd

#define rson root<<1|1,midd+1,rtypedef

long

long

ll;const

int n=30

;const

int m=1e5+5

;ll lz[m

<<2][n],tr[m<<2

][n],a[m];

void up(int

root)

void build(int root,int l,int

r) }

return

; }

int midd=(l+r)>>1

; build(lson);

build(rson);

up(root);

}void pushdown(int root,int l,int

r) }

}void update(int l,int r,int x,int root,int l,int

r)

return

; }

pushdown(root,l,r);

int midd=(l+r)>>1

;

if(l<=midd)

update(l,r,x,lson);

if(r>midd)

update(l,r,x,rson);

up(root);

}ll query(

int l,int r,int root,int l,int

r)

return

ans;

}pushdown(root,l,r);

int midd=(l+r)>>1

; ll res=0

;

if(l<=midd)

res=query(l,r,lson);

if(r>midd)

res+=query(l,r,rson);

return

res;

}int

main()

else

}return0;

}

view code

線段樹區間異或

題目描述 akn 覺得第一題太水了,不屑於寫第一題,所以他又玩起了新的遊戲。在遊戲中,他發現,這個遊戲的傷害計算有乙個規律,規律如下 擁有乙個傷害串,是乙個長度為 nnn 的只含字元 0 和字元 1 的字串。規定這個字串的首字元是第乙個字元,即下標從 111 開始。給定乙個範圍 l,r l,r l,...

線段相交的異或值 (線段樹 or 優先佇列)

vvq 最近迷上了線段這種東西 現在他手上有 n 條線段,他希望在其中找到兩條有公共點的線段,使得他們的異或值最大。定義線段的異或值為它們並的長度減他們交的長度 第一行包括乙個正整數 n,表示 vvq 擁有的線段條數。接下來 n 行每行包括兩個正整數 l,r,表示 vvq 擁有的線段的 左右端點。一...

小Q的無敵異或 所有區間的異或和

給定乙個長度為n的非負整數序列,求序列的所有子區間異或值之和模998244353,和所有子區間之和的異或值。n 105,ai 106。題解 先考慮第一問。令xor i 表示前i項的異或值,xor l,r 表示第l項到第r項的異或值,那麼xor l,r xor r xor l 1 考慮xor l,r ...