社区讨论

请求帮帮看看为什么TLE

AT_abc352_d [ABC352D] Permutation Subsequence参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lvvx53rz
此快照首次捕获于
2024/05/07 12:56
2 年前
此快照最后确认于
2024/05/07 16:46
2 年前
查看原帖
我的理解是排序后滑动窗口,用线段树维护窗口的最大位置和最小位置,我认为时间复杂度是nlogn的,但是2e5的范围却超时了
CPP
#include<iostream>
#include<vector>
#include<algorithm>
#define lc p<<1
#define rc p<<1|1
using namespace std;
const int N = 2E5 + 7;
struct Node {
	int a, id;
}a[N];
bool cmp(Node a, Node b) {
	return a.a < b.a;
}
struct Node2 {
	int l, r, mx, mn;
}t[N << 2];
void pushup(int p) {
	t[p].mx = max(t[lc].mx, t[rc].mx);
	t[p].mn = min(t[lc].mn, t[rc].mn);
}
void pushdown(int p) {

}
pair<int, int> query(int p, int L, int R) {
	if (L > t[p].r || R < t[p].l) return{ 0,1e9 };
	if (L <= t[p].l && t[p].r <= R) {
		return { t[p].mx,t[p].mn };
	}
	int m = t[p].l + t[p].r >> 1;
	pushdown(p);
	pair<int, int>res = { 0,1e9 };
	res.first = max(query(lc, L, R).first, query(rc, L, R).first);
	res.second = min(query(lc, L, R).second, query(rc, L, R).second);
	return res;
}
void build(int p, int l, int r) {
	t[p] = { l,r,a[l].id,a[r].id };
	if (l == r)return;	
	int m = l + r >> 1;
	build(lc, l, m);
	build(rc, m + 1, r);
	pushup(p);
}
void solve() {
	int n, k; cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].a; a[i].id = i;
	}
	sort(a + 1, a + 1 + n, cmp);
	build(1, 1, n);
	int kk = 1, ans = 1e9;
	int Last = 1;
	for (int i = 1; i <= n; i++, kk++) {
		if (kk == k) {
			pair<int, int>pii = query(1, Last, i);
			int mx = pii.first, mn = pii.second;
			ans = min(ans, mx - mn);
			kk--;
			Last++;
		}
	}cout << ans << endl;
}
int main() {
	solve();
	return 0;
}

回复

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

正在加载回复...