進製
題目大意:
給出乙個數字串,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終於算出了他想要的數,但是他卻忘記了最初的數是什麼。不過幸運的是他記下了整個操作序列,他想請你幫他算出最...