NOI2017 整數 壓位分塊 set

2021-08-20 18:51:09 字數 1502 閱讀 5405

題目簡述:

一開始你有乙個數x=

0 x=0

n(n≤106)

n (n

≤106)

次操作:

1.給x

x

加上a×

2k' role="presentation" style="position: relative;">a×2

ka×2

k(a≤

109,k

≤3×10

7)( a≤

109,k

≤3×10

7)

2.查詢

x x

的二進位制表達表示2b

(b≤3

×107)

' role="presentation" style="position: relative;">2b(

b≤3×

107)2

b(b≤

3×107

)的那位的值

根據最基本的均攤分析,我們知道只支援加的二進位制計數器均攤複雜度是o(

1)o (1

)的

所以如果本題只支援加法的話可以利用un

sign

edin

t uns

igne

dint

壓位 複雜度可以達到o(

30n32)

=o(n

) o(30

n32)=

o(n)

但是可能產生減法怎麼辦?

大力維護乙個加法的結果

再維護乙個減法的結果

查詢怎麼辦?

大力比較字尾的大小即可 利用s

ets et

記錄大小不同的塊的編號

所以這是道分塊題2333

總複雜度o(

30n32l

og230

n32)=

o(nl

og2n

) o(30

n32lo

g230n

32)=o

(nlo

g2n)

實際上根本跑不滿,

還是很快的

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=1000010;

typedef

unsigned

long

long lsq;

lsq plus[maxn],minus[maxn];

setst;

set::iterator it;

int n,t1,t2,t3,opt;

int main()

}else

if(a<0)}}

else}}

}

NOI2017 整數 解題報告

有一些比較簡單的 log 2n 做法 比如暴力在動態開點線段樹上維護每個位置為 0 還是 1 我們發現涉及到某一位加上 1 或者減去 1 實際上對其他位的影響只有區間覆蓋,通過線段樹上二分可以得到區間覆蓋的位置,然後暴力區間覆蓋即可。反正我這種菜雞大常數寫法只得到了68分.考慮利用勢能,注意到如果同...

noi2017 整數 線段樹or模擬

orzyyb 題目大意 你需要維護乙個有 3 times 10 7 個二進位制位的數,有一種修改方式和一種詢問方式 對這個數加上 a times2 b 其中 a 10 9 b 3 times 10 7 保證需要維護的這個數始終非負 詢問這個數第k個二進位制位的值 總共有 10 6 次詢問 修改操作 ...

題解 NOI2017整數 線段樹

在人類智慧型的山巔,有著一台字長為10485761048576位 此數字與解題無關 的超級計算機,著名理論計算機科 學家p博士正用它進行各種研究。不幸的是,這天颱風切斷了電力系統,超級計算機 無法工作,而 p 博士明天就要交實驗結果了,只好求助於學過oi的你.p 博士將他的計算任務抽象為對乙個整數的...