題:
題意:倆個操作,操作1:(l,r,x),區間[l,r]的數全部異或上x。操作2:(l ,r)輸出區間[l,r]和;
分析:對陣列a建線段樹,對於線段樹的每乙個節點進行二進位制拆位,每個位就統計有多少個1,更新操作對於涵蓋區間的二進位制位就等於其長度減去更新前的1的個數;
#includeusingview codenamespace
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;
}
線段樹區間異或
題目描述 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 ...