40pts WA 求调
查看原帖
40pts WA 求调
469375
Imtking楼主2022/10/9 15:04
#include <iostream>

using namespace std;

int n, tx, a[20010];

struct node
{
	int k, id;
};

inline node min(node a, node b)
{
	return a.k < b.k ? a : b;
}

struct tree
{
	node k; int f, l, r;
} t[40010];

inline void build(int tp, int l, int r)
{
	t[tp].l = l, t[tp].r = r;
	if (l == r) {t[tp].k = {a[l], l}; return;}
	int mid = (l + r) >> 1;
	build(tp << 1, l, mid);
	build(tp << 1 | 1, mid + 1, r);
	t[tp].k = min(t[tp << 1].k, t[tp << 1 | 1].k);
}

inline void down(int tp)
{
	t[tp << 1].k.k += t[tp].f;
	t[tp << 1 | 1].k.k += t[tp].f;
	t[tp << 1].f += t[tp].f;
	t[tp << 1 | 1].f += t[tp].f;
	t[tp].f = 0;
}

inline void change(int tp, int x, int k)
{
	if (t[tp].l == t[tp].r)
	{
		t[tp].k.k = k;
		return;
	}
	down(tp);
	int mid = (t[tp].l + t[tp].r) >> 1;
	if (x <= mid) change(tp << 1, x, k);
	else change(tp << 1 | 1, x, k);
	t[tp].k = min(t[tp << 1].k, t[tp << 1 | 1].k);
}

inline bool check(int x)
{
	build(1, 1, x);
	long long sum = 0;
	for (int i = x + 1; i <= n + x + 1; ++i)
	{
		node p = t[1].k;
		if (p.k <= 1e5)
		{
			sum += p.k;
			t[1].k.k -= p.k;
			t[1].f -= p.k;
			change(1, p.id, a[i]);
		}
		else return sum <= tx;
	}
	return sum <= tx;
}

int main()
{
	cin >> n >> tx;
	for (int i = 1; i <= n; ++i) cin >> a[i];
	for (int i = n + 1; i <= n + n; ++i) a[i] = 1e9;
	int l = 1, r = n, k;
	while (l <= r)
	{
		int mid = (l + r) >> 1;
		if (check(mid)) r = mid - 1, k = mid;
		else l = mid + 1;
	}
	cout << k;
	return 0;
}
2022/10/9 15:04
加载中...