社区讨论
常数太大,求帮忙优化
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 条回复,欢迎继续交流。
正在加载回复...