MnZn 整体二分15pts 求调
查看原帖
MnZn 整体二分15pts 求调
503792
Svemit楼主2024/3/29 13:30

rt,调炸了。

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

int n, m;
struct Node {
	int d, p;
	ll l;
	bool operator <(const Node &t) const {
		return d > t.d;
	}

	void read() {
		cin >> d >> p >> l;
	}
} a[N];

struct Segment_Tree {
	struct Data {	
		int l, r;
		ll lim, sum; // sum 钱数 lim 上限
		#define l(x) tr[x].l
		#define r(x) tr[x].r
		#define sum(x) tr[x].sum
		#define lim(x) tr[x].lim
	} tr[N << 2];

	void pushup(int x) {
		sum(x) = sum(x * 2) + sum(x * 2 + 1);
		lim(x) = lim(x * 2) + lim(x * 2 + 1); 
	}

	void build(int l, int r, int x) {
		tr[x] = {l, r, 0ll, 0ll};
		if (l == r) return;
		int mid = (l + r) / 2;
		build(l, mid, x * 2), build(mid + 1, r, x * 2 + 1);
		pushup(x);
	}

	void update(int x, int p, ll v) {
		if (l(x) == r(x)) {
			lim(x) += v;
			sum(x) += 1ll * v * l(x);
			return;
		}
		int mid = (l(x) + r(x)) / 2;
		if (p <= mid) update(x * 2, p, v);
		else update(x * 2 + 1, p, v);
		pushup(x);
	}

	ll query(int x, ll k) { // 要k升果汁至少多少钱
		if (!k) return 0ll;
		if (l(x) == r(x)) {
			return 1ll * k * l(x);
		}
		if (k <= lim(x * 2)) return query(x * 2, k);
		else return sum(x * 2) + query(x * 2 + 1, k - lim(x * 2));
	}
} SegT;

struct Q {
	ll g, l;
	int id;
};
int ans[N];

void solve(int l, int r, vector<Q> &qry) {
	if (l > r) return;
	if (l == r) {
		for (auto q : qry) ans[q.id] = a[l].d;
		return;
	}
	int mid = (l + r) / 2;
	vector<Q> q1, q2;
	for (int i = l; i <= mid; i ++) {
		SegT.update(1, a[i].p, a[i].l);
	}
	for (auto q : qry) {
		if (SegT.query(1, q.l) <= q.g) q1.push_back(q);
		else q2.push_back(q);
	}
	solve(mid + 1, r, q2);
	for (int i = l; i <= mid; i ++) {
		SegT.update(1, a[i].p, -a[i].l);
	}
	solve(l, mid, q1);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);

	cin >> n >> m;
	for (int i = 1; i <= n; i ++) {
		a[i].read();
	}
	SegT.build(0, N - 5, 1);
	a[++ n] = {-1, 0, (ll)1e18};
	sort(a + 1, a + 1 + n);

	vector<Q> qry;

	for (int i = 1; i <= m; i ++) {
		ll g, l;
		cin >> g >> l;
		qry.push_back({g, l, i});
	}

	solve(1, n, qry);
	
	for (int i = 1; i <= m; i ++) {
		cout << ans[i] << '\n';
	}

	return 0;
}
2024/3/29 13:30
加载中...