noi2017 整數 線段樹or模擬

2022-09-22 00:39:06 字數 1306 閱讀 7960

orzyyb

題目大意:你需要維護乙個有$3\times 10^7$個二進位制位的數,有一種修改方式和一種詢問方式

對這個數加上$a\times2^b$,其中$|a|≤10^9$,$b≤3\times 10^7$,保證需要維護的這個數始終非負

詢問這個數第k個二進位制位的值

總共有$10^6$次詢問/修改操作

我們不難發現,如果只有加法操作的話,對任意乙個位執行加法操作,均攤進製次數是1。

證明是顯然的(我貌似之前在mc裡面用紅石電路模擬過二進位制進製過程。。。。)

也就是說暴力加暴力進製的複雜度是正確的。

但是這裡有a並不保證非負,這樣一來通過精心(大霧)的構造方式,可以讓你瘋狂進製/退位,所以並不能單純暴力模擬。

我們考慮對加法部分和減法部分分開維護(設a為加法的部分,b為減法的部分),這樣的進製複雜度顯然就是對的。

考慮到$a≥b$,那麼顯然有$\frac≥\frac$。

對於每次查詢操作,我們分別找出a的第k位和b的第k位

現在對答案會產生影響的顯然是a的末k-1位和b的末k-1位相減後,a的第k位是否需要退位。

我們考慮開乙個set,若a的第i位和b的第i位不同,那麼我們就把i丟入set中。

我們考慮在set中找到滿足

set的維護在對大數做修改的時候去更新。

考慮到這個數非常大,直接維護會超時,我們不妨做一波壓位,然後再來維護,這樣就跑得快很多了。

注意!對於乙個32位的數,左移32位的操作會直接被忽略。

當然之前還有一些比較菜的想法,維護整個數的差分序列,若差分序列某個位置不為0就丟入set中,然後也來壓位一波,不過**估計長很多。

時間複雜度:$o(n\ log\ n)$

1 #include2

#define m 500005

3#define s 64

4#define l unsigned long long

5using

namespace

std;67

intn,t1,t2,t3;

8 l a[m]=,b[m]=,p=-1;9

sets;

1011

void upd(int

x)16}17

18int

main()

36 }else47}

48 }else61}

62 printf("

%d\n

",ans);63}

64}65 }

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 博士將他的計算任務抽象為對乙個整數的...

NOI2017模擬4 2 查詢 線段樹

給出若干條線段,用 x1,y1 x2,y2 表示其兩端點座標,現在要求支援兩種操作 0 x1 y1 x2 y2 表示加入一條新的線段,x1,y1 x2,y2 1 x0 詢問所有線段中,x座標在x0處的最高點的y座標是什麼,如果對應位置沒有線段,則輸出0。o nlog 2n 的 include inc...