제출 #491941

#제출 시각아이디문제언어결과실행 시간메모리
491941TheScrasseDetecting Molecules (IOI16_molecules)C++17
100 / 100
69 ms11932 KiB
#include <bits/stdc++.h>
using namespace std;

#define nl "\n"
#define nf endl
#define ll long long
#define pb push_back
#define _ << ' ' <<

#define INF (ll)1e18
#define mod 998244353
#define maxn 200010

ll i, i1, j, k, k1, t, n, m, res, flag[10], a[maxn], b;
ll l, u, ps[maxn], p[maxn], bsl, bsm, bsu;
vector<int> rs;
vector<array<ll, 2>> v;

ll rsq(ll l, ll r) {
    if (l <= 0) return -INF;
    if (r >= n + 1) return INF;
    return (ps[r] - ps[l - 1]);
}

vector<int> find_subset(int _l, int _u, vector<int> w) {
    n = w.size(); l = _l; u = _u;

    for (i = 1; i <= n; i++) v.pb({w[i - 1], i});
    sort(v.begin(), v.end());

    for (i = 1; i <= n; i++) {
        a[i] = v[i - 1][0]; p[i] = v[i - 1][1];
    }

    for (i = 1; i <= n; i++) ps[i] = ps[i - 1] + a[i];

    for (i = 1; i <= n; i++) {
        bsl = 0; bsu = n;
        while (bsl != bsu) {
            bsm = (bsl + bsu) / 2;
            if (rsq(bsm, bsm + i - 1) >= l) bsu = bsm;
            else bsl = bsm + 1;
        }

        k = rsq(bsl, bsl + i - 1);
        if (k < l || k > u) continue;
        for (j = bsl; j <= bsl + i - 1; j++) rs.pb(p[j] - 1);
        return rs;
    }

    return rs;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...