学姐是野兔先辈β
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=832
Problem Description
In the world line 1.048596%
雙葉理央是梓川咲太為數(shù)不多的朋友。
棲息于理科實驗室,一直在做著梓川咲太永遠(yuǎn)也想不明白的實驗。偶爾用半升的燒杯煮咖啡,度過悠閑的校園時光。
梓川咲太無聊的時候也經(jīng)常拜訪理科實驗室。黃金周的最后一天,上午,雙葉理央也在辛勤的做著實驗,不過這次有點不同,并沒有常識中的實驗儀器,雙葉理央面對電腦陷入深思。
“你來的正好,聽我說。”,雙葉理央罕見的沒有先讓梓川咲太出去,“我最近在用Binary Indexed Tree去解決一個有關(guān)數(shù)據(jù)結(jié)構(gòu)的問題,里面有一個語句是x&(-x),這是對方程lowbit(x)的模擬操作。”
梓川咲太想吐槽些什么,可是立刻被雙葉理央遞過來的咖啡堵住了嘴。
“聽我說完,lowbit(x)的含義為x的二進(jìn)制表達(dá)式中,最低位1所對應(yīng)的值,比如說6的二進(jìn)制為110,所以lowbit(6)=2。”
感覺說的不夠詳細(xì)的理央整理了一下思緒,繼續(xù)說道。
“更一般的,設(shè) a[m],a[m-1].....a[1]是數(shù)x的二進(jìn)制表示,而a[m]是x二進(jìn)制的最低位,k是最小的滿足a[k]=1的下標(biāo)。則此時,lowbit(x)的值就等于 2^(k-1)。”
"恩恩,是這樣嗎,我懂了。"
梓川咲太什么都聽不懂。
“現(xiàn)在有這么一個操作,就稱為f(x)吧。當(dāng)輸入一個非負(fù)整數(shù)x,如果x等于0,則返回0;否則他有二分之一的概率會返回x-lowbit(x),也有二分之一的概率的記錄返回x+lowbit(x)。”
雙葉理央開始在黑板上寫下數(shù)學(xué)公式。
“現(xiàn)在有一個長度為n的數(shù)組A,我會對它進(jìn)行m次操作。
操作有兩種,第一種是1 L R,對于每一個下標(biāo)i屬于[L,R],將Ai變?yōu)閒(Ai)。
第二種是 2 L R,詢問在區(qū)間[L,R],Ai的值的期望值的總和。”
“當(dāng)然,這些操作對于每一個f(Ai)操作都是獨立的,不會影響其他的部分的結(jié)果......”
雙葉理央說完以后開始陷入深思,沒過多久就展現(xiàn)出茅塞頓開的表情。
“......大概就是這樣,也不是什么難題......笨蛋梓川果然是當(dāng)小黃鴨的最好人選。行了,你快滾出去吧。”
梓川咲太很自覺的離開了理科實驗室。
之后,梓川咲太騎車去湘南臺站附近的圖書館,給妹妹梓川楓借還書的時候,『那個』進(jìn)入了視線。
野兔先輩屹立在書架的彼岸。
這一天,梓川咲太與野兔先輩邂逅了。
?
?
Input
第一行一個整數(shù)T,表示有T組樣例
對于每組樣例
第一行兩個整數(shù)n,m(1<=n,m<=1e5),表示數(shù)組的長度n與操作的次數(shù)m
第二行n個整數(shù)Ai(1<=Ai<=1e4),表示數(shù)組每個的數(shù)字
之后的m行,每一行有三個整數(shù) t,L,R(t==1 或 t==2,1<=L<=R<=n ).
輸入保證n和m的和不超過1e6。
?
?
Output
對于每一組詢問操作,輸出對應(yīng)區(qū)間的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; }?
總結(jié)