2026.7.29模考总结(下半)

T3 魔法药水

题面(有亿点难总结, 放图片了)

误因

AC需要主席树,根本没学过,以下为60分代码(思路很好理解)

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;

struct nichongqbima {
    int d, p, l;
} a[N], b[N];
int cnt[N], n, m;

bool cmp(nichongqbima x, nichongqbima y) {
    return x.p < y.p;
}
bool cmp2(nichongqbima x, nichongqbima y) {
    return x.d > y.d;
}

bool check(int lim, int gg, int ll) {
    int g = gg, h = ll;
    for (int i = 1; i <= n; i++) {
        if (a[i].d < lim) continue;
        if (h > a[i].l) {
            h -= a[i].l;
            g -= a[i].l * a[i].p;
            if (g < 0) return 0;
        } else {
            if (g - h * a[i].p >= 0) return 1;
        }
    }
    return 0;
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    freopen("medicine.in", "r", stdin);
    freopen("medicine.out", "w", stdout);
    cin >> n >> m;
    int big = -1e9, small = 1e9;
    bool flag = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].d >> a[i].p >> a[i].l;
        if (a[i].p != 1) flag = 1;
        b[i] = a[i];
        big = max(big, a[i].d);
        small = min(small, a[i].d);
    }

    if (!flag) {
        sort(a + 1, a + n + 1, cmp2);
        for (int i = 1; i <= n; i++) {
            cnt[i] = cnt[i - 1] + a[i].l;
        }
        while (m--) {
            int q, w;
            cin >> q >> w;
            if (q < w) {
                cout << -1 << endl;
                continue;
            }
            if (cnt[n] < w) {
                cout << -1 << endl;
                continue;
            }
            int l = 1, r = n, pos = n;
            while (l <= r) {
                int mid = (l + r) / 2;
                if (cnt[mid] >= w) {
                    pos = mid;
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            }
            cout << a[pos].d << endl;
        }
        return 0;
    }

    sort(a + 1, a + n + 1, cmp);
    for (int i = 1; i <= n; i++) b[i] = a[i];
    while (m--) {
        int g, h;
        cin >> g >> h;
        int gg = g, ll = h;
        int l = small, r = big, ret = -1145141919;
        while (l <= r) {
            for (int i = 1; i <= n; i++) a[i] = b[i];
            int mid = (l + r) / 2;
            if (check(mid, gg, ll)) {
                l = mid + 1;
                ret = mid;
            } else {
                r = mid - 1;
            }
        }
        if (ret == -1145141919) cout << -1 << endl;
        else cout << ret << endl;
    }
    return 0;
}

T4 密文

题面:


太难了,给我难飞了,有大佬吗?

还好有部分分,可以订出10分

1 个赞