社区讨论

常数太大,求帮忙优化

P3834【模板】可持久化线段树 2参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi6wuk4l
此快照首次捕获于
2025/11/20 12:07
4 个月前
此快照最后确认于
2025/11/20 12:07
4 个月前
查看原帖
指针版的,不开内存池80,tle最后两个点,内存池开大了就MLE20,只能过最后两个点。调整好内存池大小就90,tle第9个点。
O2能过
CPP
#include<bits/stdc++.h>

using namespace std;

const int maxn = 2e5 + 5;

int n, m;
int itv[maxn];
int a[maxn];

struct Node {
	int val;
	Node *ch[2];
	Node(): val(0) { }
};
Node *root[maxn];

Node pool[25 * maxn]; int cnt;
inline Node* newNode() { return pool + cnt++; };

Node* BuildZero(int l, int r) 
{
	Node *o = newNode();
	if(l == r) return o;
	else o->ch[0] = BuildZero(l, l + r >> 1), o->ch[1] = BuildZero((l + r >> 1) + 1, r);
	return o;
}

Node* Build(Node *p, int l, int r, int i) 
{
	Node *o = newNode();
	o->val = p->val + 1;
	if(l == r) return o;
	int mid = (l + r >> 1);
	if(i > mid) {
		o->ch[1] = Build(p->ch[1], mid + 1, r, i);
		o->ch[0] = p->ch[0];
	} else {
		o->ch[0] = Build(p->ch[0], l, mid, i);
		o->ch[1] = p->ch[1];
	}
	return o;
}

void inline Init()
{
	cin >> n >> m;
	
	for(int i = 1; i <= n; ++i) {
		cin >> a[i];
		itv[i] = a[i];
	}
	sort(itv + 1, itv + n + 1);
	
	root[0] = BuildZero(1, n);
	for(int i = 1; i <= n; ++i) {
		root[i] = Build(root[i - 1], 1, n, lower_bound(itv + 1, itv + n + 1, a[i]) - itv);
	}
}

int inline Query(Node *ln, Node *rn, int l, int r, int k)
{
	 if(l == r) return l;
	 int mid = l + r >> 1;
	 int ls;
	 if((ls = (rn->ch[0]->val - ln->ch[0]->val)) >= k) {
	 	return Query(ln->ch[0], rn->ch[0], l, mid, k);
	 } else {
	 	return Query(ln->ch[1], rn->ch[1], mid + 1, r, k - ls);
	 }
}

void inline Solve()
{
	int l, r, k;
	while(m--) {
		cin >> l >> r >> k;
		cout << itv[Query(root[l - 1], root[r], 1, n, k)] << endl;
	}
}

int main()
{
	Init();
	Solve();
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...