牛客寒假演算法基礎集訓營4 B 進製(線段樹)

2022-09-29 00:51:13 字數 1060 閱讀 8968

進製

題目大意:

給出乙個數字串,q 次以下兩種操作:

輸入 1 x y,修改第 x 個字元為 y

輸出 2 x y ,代表查詢區間 [x,y] 子串所能表示的某進製的最小值,對 1e9+7 取模。

思路:要得到最小值,顯然進製的選擇是區間最大值+1。

看操作是單點修改和區間查詢,我們考慮用線段樹來維護區間上 2-10 進製的值以及區間最大值。

考慮怎樣進行區間合併:

假設當前是十進位制

14352

/ \

143 53

\[14352 = 143 * 10^2 + 53

\]可以發現區間 k 進製的合併是由 k 進製下 左孩子節點 * k 進製的右孩子節點的數字個數次冪 + 右孩子節點 所得到。我們需要維護 k 進製下每個節點的值,以及左兄弟節點與之合併時需要的冪次。

進製不合法的情況我們一樣可以進行更新操作,因為我們並不會去選用這樣的進製,因此其對於我們的結果沒有影響。

在實現上,我們可以通過過載結構體中的加號來進行區間的合併,這樣線段樹主體的結構顯得比較清晰明了,並且容易去修改和除錯。

code:

struct node 

}node operator+(const node &node) const

return res;

}ll operator()() const

};#define ls (v << 1)

#define rs (ls | 1)

#define tm ((tl + tr) >> 1)

struct segment else

};dfs(1, 1, n);

}void upd(int x, int y) else

};dfs(1, 1, n);

}ll query(int x, int y) ;

return dfs(1, 1, n)();

}};int main() else

}return 0;

}

牛客寒假演算法基礎集訓營4

a 第一行是乙個正偶數 n,表示石子的堆數。第二行是 n 個正整數 a1,a2,ana1,a2,an,表示每堆石子的個數。博弈,由於每次取石子只能取最左一堆或最右一堆,且必須取完,那麼選擇奇數和和偶數和中比較大的一項,但是堆數為偶數,這無論如何先手贏。所以直接輸出就好了。include define...

牛客寒假演算法基礎集訓營

首先看到這個題目資料範圍就可以知道這不是乙個可以暴力過的題。所以應該要推乙個結論。我們可以將這個同學的一來一回看成一組,那麼就可以理解為乙個來回中n可以減少n m 1 個人。那麼我們現在要讓所有人都進去,那就是看n m 1 的數量。但是有可能存在一些情況,就是說當你的倒數第二組中的回來的那趟使得n變...

牛客寒假演算法基礎集訓營1

菜雞乙個,只做出兩道,先掛一下,剩下的會了繼續更 1 小a的計算器 題目描述 小a的數學基礎實在太差了,以至於他只會用計算器算數。他的計算器比較特殊,只有 即加減乘除 四種運算。經過一番周折,小a終於算出了他想要的數,但是他卻忘記了最初的數是什麼。不過幸運的是他記下了整個操作序列,他想請你幫他算出最...