日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cf242 E

發布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cf242 E 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:

$n$ 個數 $a_i$,?

兩種詢問

$1, l, r$ 查詢 $[l, r]$ 的和

$2, l, r, x$ 將區間 $[l, r]$ 所有數異或 $x$

?

建立 $30$ 課線段樹

第 $i$ 顆線段樹維護所有 $a$ 二進制的第 $i$ 為上的數字 $0, 1$

異或操作分別以 $x$ 的二進制相應位異或相應線段樹

可見只有當 $x$ 的二進制位為 $1$ 是操作有效

#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <string>using namespace std;#define LL long long#define gc getchar() inline int read() {int x = 0; char c = gc; while(c < '0' || c > '9') c = gc; while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc; return x;} inline LL read_LL() {LL x = 0; char c = gc; while(c < '0' || c > '9') c = gc; while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc; return x;} #undef gcconst int N = 1e5 + 10;int Size[N << 2]; int n, m, Ans;#define lson jd << 1 #define rson jd << 1 | 1struct Node {int W[N << 2], F[N << 2];void Push_down(int jd) {F[lson] ^= 1, F[rson] ^= 1;W[lson] = Size[lson] - W[lson];W[rson] = Size[rson] - W[rson];F[jd] = 0;}void Push_up(int jd) {W[jd] = W[lson] + W[rson];}void Sec_G(int l, int r, int jd, int x, int y) {if(x <= l && r <= y) {F[jd] ^= 1;W[jd] = Size[jd] - W[jd];return ;}if(F[jd]) Push_down(jd);int mid = (l + r) >> 1;if(x <= mid) Sec_G(l, mid, lson, x, y);if(y > mid ) Sec_G(mid + 1, r, rson, x, y);Push_up(jd);}void Sec_A(int l, int r, int jd, int x, int y) {if(x <= l && r <= y) {Ans += W[jd];return ;}if(F[jd]) Push_down(jd);int mid = (l + r) >> 1;if(x <= mid) Sec_A(l, mid, lson, x, y);if(y > mid) Sec_A(mid + 1, r, rson, x, y);} } Tree[35];void Build_tree(int l, int r, int jd) {Size[jd] = r - l + 1;if(l == r) {int x = read();for(int i = 0; (1 << i) <= x; i ++) {Tree[i + 1].W[jd] = (bool) ((1 << i) & x);}return ;}int mid = (l + r) >> 1;Build_tree(l, mid, lson), Build_tree(mid + 1, r, rson);for(int i = 1; i <= 30; i ++) {Tree[i].W[jd] = Tree[i].W[lson] + Tree[i].W[rson];} }int main() {n = read();Build_tree(1, n, 1);m = read();for(; m; m --) {int opt = read(), l = read(), r = read();if(opt == 2) {int x = read();for(int i = 0; (1 << i) <= x; i ++) {if(((1 << i) & x)) {Tree[i + 1].Sec_G(1, n, 1, l, r);}}} else {LL Answer = 0;for(int i = 1; i <= 30; i ++) {Ans = 0;Tree[i].Sec_A(1, n, 1, l, r);Answer += (1ll * Ans * (LL) pow(2, i - 1));}cout << Answer << "\n";}}return 0; }

?

轉載于:https://www.cnblogs.com/shandongs1/p/9574811.html

總結

以上是生活随笔為你收集整理的cf242 E的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。