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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

树状数组 + 位运算 LA 4013 A Sequence of Numbers

發(fā)布時間:2023/12/9 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树状数组 + 位运算 LA 4013 A Sequence of Numbers 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

題目傳送門

題意:n個數(shù),兩種操作,一是每個數(shù)字加x,二是查詢& (1 << T) == 1 的個數(shù)

分析:因為累加是永遠的,所以可以離線處理。樹狀數(shù)組點是c[16][M] 表示數(shù)字x%(1 << j) 后的數(shù)字pos,考慮第j位的個數(shù)。當詢問時根據(jù)add不同的值不同的處理情況。

#include <bits/stdc++.h> using namespace std;typedef long long ll; const int N = 1e5 + 5; const int R = (int) 1 << 16; const int M = R + 10; struct BIT {int c[16][M];void init(void) {memset (c, 0, sizeof (c));}void updata(int b, int pos) {pos++; //pos 可能等于0while (pos < M) {c[b][pos] += 1;pos += pos & -pos;}}int sum(int b, int pos) {pos++;int ret = 0;while (pos > 0) {ret += c[b][pos];pos -= pos & -pos;}return ret;} }bit;int main(void) {int n, cas = 0;while (scanf ("%d", &n) == 1) {if (n == -1) break;bit.init ();for (int x, i=0; i<n; ++i) {scanf ("%d", &x);for (int j=0; j<16; ++j) {bit.updata (j, x % (1 << (j + 1)));}}ll add = 0, ans = 0; char str[2];while (scanf ("%s", &str) == 1) {if (str[0] == 'E') break;if (str[0] == 'C') { //離線int x; scanf ("%d", &x);add += x;if (add >= R) add %= R;}else {int t; scanf ("%d", &t);int tail = add % (1 << t);if (add & (1 << t)) { //(1<<t)位上已經(jīng)有1ans += bit.sum (t, (1 << t) - 1 - tail); //+tail 之前之后,都是0ans += bit.sum (t, (1 << (t + 1)) - 1) - bit.sum (t, (1 << (t + 1)) - 1 - tail); //+tail 之前1,之后0}else {ans += bit.sum (t, (1 << (t + 1)) - 1 - tail) - bit.sum (t, (1 << t) - 1 - tail); //+tail 之后1}}}printf ("Case %d: %lld\n", ++cas, ans);}return 0; }

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/Running-Time/p/5221529.html

總結(jié)

以上是生活随笔為你收集整理的树状数组 + 位运算 LA 4013 A Sequence of Numbers的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。