学姐是野兔先辈β
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=832
Problem Description
In the world line 1.048596%
雙葉理央是梓川咲太為數不多的朋友。
棲息于理科實驗室,一直在做著梓川咲太永遠也想不明白的實驗。偶爾用半升的燒杯煮咖啡,度過悠閑的校園時光。
梓川咲太無聊的時候也經常拜訪理科實驗室。黃金周的最后一天,上午,雙葉理央也在辛勤的做著實驗,不過這次有點不同,并沒有常識中的實驗儀器,雙葉理央面對電腦陷入深思。
“你來的正好,聽我說?!?#xff0c;雙葉理央罕見的沒有先讓梓川咲太出去,“我最近在用Binary Indexed Tree去解決一個有關數據結構的問題,里面有一個語句是x&(-x),這是對方程lowbit(x)的模擬操作?!?br />
梓川咲太想吐槽些什么,可是立刻被雙葉理央遞過來的咖啡堵住了嘴。
“聽我說完,lowbit(x)的含義為x的二進制表達式中,最低位1所對應的值,比如說6的二進制為110,所以lowbit(6)=2?!?br />
感覺說的不夠詳細的理央整理了一下思緒,繼續說道。
“更一般的,設 a[m],a[m-1].....a[1]是數x的二進制表示,而a[m]是x二進制的最低位,k是最小的滿足a[k]=1的下標。則此時,lowbit(x)的值就等于 2^(k-1)?!?br />
"恩恩,是這樣嗎,我懂了。"
梓川咲太什么都聽不懂。
“現在有這么一個操作,就稱為f(x)吧。當輸入一個非負整數x,如果x等于0,則返回0;否則他有二分之一的概率會返回x-lowbit(x),也有二分之一的概率的記錄返回x+lowbit(x)。”
雙葉理央開始在黑板上寫下數學公式。
“現在有一個長度為n的數組A,我會對它進行m次操作。
操作有兩種,第一種是1 L R,對于每一個下標i屬于[L,R],將Ai變為f(Ai)。
第二種是 2 L R,詢問在區間[L,R],Ai的值的期望值的總和?!?br />
“當然,這些操作對于每一個f(Ai)操作都是獨立的,不會影響其他的部分的結果......”
雙葉理央說完以后開始陷入深思,沒過多久就展現出茅塞頓開的表情。
“......大概就是這樣,也不是什么難題......笨蛋梓川果然是當小黃鴨的最好人選。行了,你快滾出去吧?!?br />
梓川咲太很自覺的離開了理科實驗室。
之后,梓川咲太騎車去湘南臺站附近的圖書館,給妹妹梓川楓借還書的時候,『那個』進入了視線。
野兔先輩屹立在書架的彼岸。
這一天,梓川咲太與野兔先輩邂逅了。
?
?
Input
第一行一個整數T,表示有T組樣例
對于每組樣例
第一行兩個整數n,m(1<=n,m<=1e5),表示數組的長度n與操作的次數m
第二行n個整數Ai(1<=Ai<=1e4),表示數組每個的數字
之后的m行,每一行有三個整數 t,L,R(t==1 或 t==2,1<=L<=R<=n ).
輸入保證n和m的和不超過1e6。
?
?
Output
對于每一組詢問操作,輸出對應區間的Ai的值的期望得分的值。
?
?
Sample Input
?1 3 2 1 2 3 1 3 3 2 1 2
?
?
Sample Output
?3
Hint
Scanf Recommed
C++版本一
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUGusing namespace std; typedef long long ll; const int N=100000+10; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m; int tree[N<<2]; void PushUp(int rt){tree[rt] = tree[rt*2] + tree[rt*2+1];} void Build(int l, int r, int rt){if(l == r){scanf("%d",&tree[rt]);return ;}int m = (l+r) / 2;Build(l,m,rt*2);Build(m+1,r,rt*2+1);PushUp(rt); } int Query(int l, int r, int rt, int L, int R){if(L <= l && r <= R){return tree[rt];}int m = (l+r) / 2;int ret = 0;if(L <= m) ret += Query(l, m, rt*2, L, R);if(m < R) ret += Query(m+1, r, rt*2+1, L, R);return ret; }int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endifscanf("%d",&t);while(t--){scanf("%d%d",&n,&m);Build(1,n,1);int T,l,r;while(m--){scanf("%d%d%d",&T,&l,&r);if(T==1){}else{printf("%d\n", Query(1,n,1,l,r));}}}//cout << "Hello world!" << endl;return 0; }C++版本二
https://www.cnblogs.com/MingSD/p/10050324.html
#include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); #define LL long long #define ULL unsigned LL #define fi first #define se second #define pb push_back #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lch(x) tr[x].son[0] #define rch(x) tr[x].son[1] #define max3(a,b,c) max(a,max(b,c)) #define min3(a,b,c) min(a,min(b,c)) typedef pair<int,int> pll; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const LL mod = (int)1e9+7; const int N = 1e5 + 100; int a[N]; int main(){int n, m, T;scanf("%d", &T);while(T--){scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++i)scanf("%d", &a[i]), a[i] += a[i-1];int op, l, r;while(m--){scanf("%d%d%d", &op, &l, &r);if(op == 2){printf("%d\n", a[r] - a[l-1]);}}}return 0; }?
總結