atm參加了速算訓練班,經過刻苦修煉,對以2為底的對數算得飛快,人稱log大俠。
一天,log大俠的好友 drd 有一些整數序列需要變換,log大俠正好施展法力...
變換的規則是: 對其某個子串行的每個整數變為: [log_2 (x) + 1] 其中 表示向下取整,就是對每個數字求以2為底的對數,然後取下整。
例如對序列 3 4 2 操作一次後,這個序列會變成 2 3 2。
drd需要知道,每次這樣操作後,序列的和是多少。
【輸入格式】
第一行兩個正整數 n m 。
第二行 n 個數,表示整數序列,都是正數。
接下來 m 行,每行兩個數 l r 表示 atm 這次操作的是區間 [l, r],數列序號從1開始。
【輸出格式】
輸出 m 行,依次表示 atm 每做完乙個操作後,整個序列的和。
例如,輸入:
3 35 6 4
1 22 3
1 3程式應該輸出:108
6【資料範圍】
對於 30% 的資料, n, m <= 10^3
對於 100% 的資料, n, m <= 10^5
資源約定:
峰值記憶體消耗 < 256m
cpu消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。
所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。
注意: main函式需要返回0
注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別。
思路:首先我的演算法可以解決較小的用例,但是否可以通過所有的用例我不清楚,因為藍橋杯練習系統沒有這道題,應該超時,不可能那麼簡單。個人就是按照題中的要求來的,整個**的
時間複雜度為o(n^2),只不過要注意log函式在c++下標是e,所以要轉換為求下標為2的對數函式則可以表示為log(x)/log(2);
1 #include2using
namespace
std;
3int
n,m;
4int array[100000];5
int f(int a1,int
a2)6
10int sum=0;11
for(int i=0;i14return
sum;15}
16int
main()
1725
inta1,a2;
26int t=0;27
while(m--)
33for(int i=0;i)
36 }
裡對區間裡的值進行對數運算,可以看做是更新,區間更新,求和,很明顯是線段樹...
下面提供乙個大佬的**只供參考:
1 #include23using
namespace
std;45
67const
int maxn = 100010;8
9int
num[maxn];
1011
int tree[maxn*2
];12
13int
n,m;
1415
intl,r;
1617
intcnt;
1819
2021
2223
void build(int x,int l, int
r)24
2538
39return;40
41}4243
4445
int mid = (l+r)/2;46
47 build(x*2
,l,mid);
4849 build(x*2+1,mid+1
,r);
5051 tree[x] = tree[x*2]+tree[x*2+1
];5253}
5455
5657
void update(int x,int l,int r,int l,int
r)58
5966
67if (l ==r)
7475
7677
int mid = (l+r)/2;78
79if (r <=mid)
8081 update(x*2
,l,mid,l,r);
8283
else
if (l >mid)
8485 update(x*2+1,mid+1
,r,l,r);
8687
else
9495 tree[x] = tree[x*2]+tree[x*2+1
]; 96
97}
9899
100101
intmain()
102103
124125
return
0;
126127 }
藍橋 log大俠
atm參加了速算訓練班,經過刻苦修煉,對以2為底的對數算得飛快,人稱log大俠。一天,log大俠的好友 drd 有一些整數序列需要變換,log大俠正好施展法力.變換的規則是 對其某個子串行的每個整數變為 log 2 x 1 其中 表示向下取整,就是對每個數字求以2為底的對數,然後取下整。例如對序列 ...
歷屆試題 明碼
constructors 語法 bitset bitset unsigned long val bitsets能以無參的形式建立,或者提供乙個長無符號整數,它將被轉化為二進位制,然後插入到bitset中。當建立bitset時,模板中提供的數字決定bitset有多長。例如,以下 建立兩個bitsets...
試題 歷屆試題 翻硬幣
時間限制 1.0s 記憶體限制 256.0mb 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的...