陣列氣泡排序
阿新 • • 發佈:2022-03-28
數論分塊的結論
給定一個n,n / i的取值有\(\sqrt{n}\)級別個,並且對於每一個i,它對應的分塊的區間為(i, n / (n / i)).
A - 區間最大值
題目連結
https://ac.nowcoder.com/acm/contest/30896/A
解析
n % i = n - (n / i) * i,所以原題等價於求(n / i) * i的最小值,從矩陣分塊的角度思考,應該選擇每個分塊最左端的那個點,又由於矩陣分塊為\(O(\sqrt{n})\)的做法,所以對於每一個詢問,利用矩陣分塊掃一遍即可。
Ac程式碼
點選檢視程式碼
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; ll n, m; int main() { scanf("%lld%lld", &n, &m); while(m --){ ll ans = 0; ll l, r, rr; scanf("%lld%lld", &l, &r); for(ll i = l; i <= r; i = rr + 1){ ans = max(ans, n - (n / i) * i); rr = n / (n / i); } printf("%lld\n", ans); } return 0; }