歷屆試題 log大俠

2022-02-23 04:03:37 字數 2610 閱讀 8017

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 #include2

using

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 #include2

3using

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 現在小明的問題是 如果已知了初始狀態和要達到的...