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分


