E Minimum Array 樹狀陣列 二分

2021-10-06 16:34:25 字數 1584 閱讀 8200

其實貪

心還是比

較顯

然其實貪心還是比較顯然

其實貪心還是

比較顯然對於

乙個ai

,我們最

好找到b

j=n−

ai

對於乙個a_i,我們最好找到b_j=n-a_i

對於乙個ai

​,我們

最好找到

bj​=

n−ai​這樣

對n求餘

後就是0

,最

優這樣對n求餘後就是0,最優

這樣對n求餘

後就是0

,最優

如 過沒

有n−a

i這個數

,就乙個

乙個往後

看直到n

如過沒有n-a_i這個數,就乙個乙個往後看直到n

如過沒有n−

ai​這

個數,就

乙個乙個

往後看直

到n 如果還

沒有,再

從0開始

看到n−

ai−1

如果還沒有,再從0開始看到n-a_i-1

如果還沒有,

再從0開

始看到n

−ai​

−1 那麼這

個過程肯

定不能暴

力,所以

我們用樹

狀陣列區

間求

和那麼這個過程肯定不能暴力,所以我們用樹狀陣列區間求和

那麼這個過程

肯定不能

暴力,所

以我們用

樹狀陣列

區間求和初始

在所有b

i的位置

加上1,

然後每次

按照上面

的步

驟初始在所有b_i的位置加上1,然後每次按照上面的步驟

初始在所有b

i​的位

置加上1

,然後每

次按照上

面的步驟二分

出乙個最

優的bi

二分出乙個最優的b_i

二分出乙個最

優的bi

#include using namespace std;

const int maxn=2e5+10;

int n;

int a[maxn],b[maxn],zero;

class like_tree_array

public:

int ask(int x)

void add(int x,int k)

int query(int l,int r)

}tree;

bool two_divied(int pre,int w,int i)

if(isok==0) return false;

cout<<(a[i]+r-1)%n<<" ";//前面加了1,現在減去

tree.add(r,-1);

return true;

}int main()

for(int i=1;i<=n;i++)

}

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...

樹狀陣列 瞎bb 樹狀陣列

樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...

Messenger Simulator(樹狀陣列)

參考 題意 給定乙個初始序列1,2,3 n.m次操作,每次將ai 1 a i n a i 1 a i n ai 1 a i n 提到第一位,求整個過程中,每個數出現的最左和左右的位置,並輸出。1 n m 3 e5 1 n,m 3e5 1 n m 3 e5 題解 模擬,每次提數,將選中的數向前提,被提...