求助整体二分T飞了
查看原帖
求助整体二分T飞了
483037
Galexccddne楼主2022/7/16 11:59

rt,只过了前五个点。

#include <bits/stdc++.h>
#define int long long
#define chk_die printf("ALIVE\n")
using namespace std;

int read() {
	int s = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9')
		f = (ch == '-' ? -1 : 1), ch = getchar();
	while (ch >= '0' && ch <= '9')
		s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
	return s * f;
}

int n, m;
int a[200005], b[200005];
int l[200005], r[200005], k[200005];
int ans[200005];

struct Value {
	int pos, v;
};

struct Query {
	int l, r, k, id;
};

struct bits_tree {
	#define lb(x) (x & (-x))
	int sum[200005];
	void clear() {
		memset(sum, 0, sizeof sum);
	}
	void mdf(int x, int v) {
		while (x <= n)
			sum[x] += v, x += lb(x);
	}
	int qry(int x) {
		int res = 0;
		while (x)
			res += sum[x], x -= lb(x);
		return res;
	}
} t;

void solve(int l, int r, vector<Value> a, vector<Query> q) {
	t.clear();
	if (l == r) {
		for (int i = 0; i < q.size(); i++)
			ans[q[i].id] = l;
		return ;
	}
	int mid = (l + r) / 2;
	vector<Value> a1, a2;
	vector<Query> q1, q2;
	for (int i = 0; i < a.size(); i++)
	    if (a[i].v <= mid)
	      	a1.push_back(a[i]), t.mdf(a[i].pos, 1);
	    else
	      	a2.push_back(a[i]);
	for (int i = 0; i < q.size(); i++) {
	    int vt = t.qry(q[i].r) - t.qry(q[i].l - 1);
	    if (q[i].k <= vt)
	      	q1.push_back(q[i]);
	    else
	      	q[i].k -= vt, q2.push_back(q[i]);
	}
	solve(l, mid, a1, q1), solve(mid + 1, r, a2, q2);
	return ;
}

signed main() {
	n = read(), m = read();
	for (int i = 1; i <= n; i++)
		b[i] = a[i] = read();
	sort(b + 1, b + n + 1);
	int tot = unique(b + 1, b + n + 1) - b - 1;
	for (int i = 1; i <= n; i++)
		a[i] = lower_bound(b + 1, b + tot + 1, a[i]) - b;
	for (int i = 1; i <= m; i++)
		l[i] = read(), r[i] = read(), k[i] = read();
	vector<Value> av;
	vector<Query> aq;
	for (int i = 1; i <= n; i++)
		av.push_back((Value){i, a[i]});
	for (int i = 1; i <= m; i++)
		aq.push_back((Query){l[i], r[i], k[i], i});
	solve(1, tot, av, aq);
	for (int i = 1; i <= m; i++)
		printf("%lld\n", b[ans[i]]);
	return 0;
}
2022/7/16 11:59
加载中...