正解主席树55分WA,有没有好心人能帮忙调一下
查看原帖
正解主席树55分WA,有没有好心人能帮忙调一下
574660
JC1226楼主2025/1/27 16:47
//整体思路:二分 + 可持久化线段树 
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, M = N * 64; //空间没爆 
int seg, n, m;
int root[N];
struct Seg
{
	int lf, rt;
	int price, weight;
}tr[M];
struct juice
{
	int d, p, l;
}a[N];

bool cmp(juice x, juice y)
{
	return x.d > y.d;
}

void Seg_modify(int &x, int y, int l, int r, int price, int limit) 
{
	x = ++seg;
	tr[x] = tr[y];
	tr[x].weight += limit;
	tr[x].price += price * limit;
	if (l == price && r == price) return ;
	int mid = l + (r - l) / 2;
	if (price <= mid) Seg_modify(tr[x].lf, tr[y].lf, l, mid, price, limit);
	else Seg_modify(tr[x].rt, tr[y].rt, mid + 1, r, price, limit);
}

int Seg_query(int x, int l, int r, int k) 
{
	if (l == r) return l * k;
	int mid = l + (r - l) / 2;
	if (tr[tr[x].lf].weight >= k) return Seg_query(tr[x].lf, l, mid, k);
	else return tr[tr[x].lf].price + Seg_query(tr[x].rt, mid + 1, r, k - tr[tr[x].lf].weight);
}

signed main() 
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i].d >> a[i].p >> a[i].l;
	sort(a + 1, a + n + 1, cmp);
	for (int i = 1; i <= n; i++)
		Seg_modify(root[i], root[i - 1], 1, n, a[i].p, a[i].l); //在i - 1的基础上新增 
	while(m--)
	{
		int price, limit;
		cin >> price >> limit;
		//二分答案 写法有些诡异,但是能保证二分板子没错awa。 
		int l = 1, r = n, ans = -1;
		while (l <= r)
		{
			int mid = l + (r - l) / 2;
			if (Seg_query(root[mid], 1, n, limit) <= price && tr[root[mid]].weight >= limit) r = mid - 1, ans = mid;
			else l = mid + 1;
		}
		if (ans == -1) cout << -1 << "\n";
		else cout << a[r + 1].d << "\n";
	}
	return 0;
}
2025/1/27 16:47
加载中...