はまやんはまやんはまやん

hamayanhamayan's blog

Consecutive Sum [CSAcademy #47 B]

https://csacademy.com/contest/round-47/task/consecutive-sum/

解法

[L,R]のRの地点を全探索する。
「sm=[0,i]の総和」と「v={0, [0,0]の総和, [0,1]の総和, [0,2]の総和, …}」を作りながら、[?,i]を順に探索する。
各iについて、v上の二分探索を使って、[0,i]-[0,x]=Dとなるxを求める。
そのようなxがあれば、それから答えを出す。
全て探索して、無ければ-1

typedef long long ll;
int N;
//---------------------------------------------------------------------------------------------------
pair<int, int> solve() {
    vector<ll> v;
    v.push_back(0);
    ll sm = 0;
    rep(i, 1, 101010) {
        sm += i;
        ll d = sm - N;
        auto ite = lower_bound(v.begin(), v.end(), d);
        if (ite == v.end()) continue;
        if (*ite == d && ite - v.begin() + 1 != i) return { ite - v.begin() + 1, i };
        v.push_back(sm);
    }
    return { -1, -1 };
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    auto ans = solve();
    if (ans.first < 0) printf("-1\n");
    else printf("%d %d\n", ans.first, ans.second);
}