1. 程式人生 > 其它 >陣列氣泡排序

陣列氣泡排序

數論分塊的結論

給定一個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;
}