求大神帮调-WA80分
查看原帖
求大神帮调-WA80分
1023865
xuezhiyu楼主2024/7/10 21:27

用的拓展树状数组取代的线段树,但是不知道什么问题WA了两个点,80分:

请各位

代码:

#include <algorithm>
#include <cstring>
#include <iostream>
#define int long long

using namespace std;

struct cow {
	int l, r, s;
};

const int N = 1e4 + 10, M = 1e5 + 10, m = 1e5 + 5;
cow cows[N];
int n, s, e;
int c[M], a[M];
int f[N], ans = 0x3f3f3f3f3f3f3f3fll;

int lowbit(int x) {
	return x & -x;
}

int getmin(int l, int r) {
	int ans = 0x3f3f3f3f3f3f3f3fll;
	while (r >= l) {
		ans = min(ans, a[r]);
		r--;
		for (; r - lowbit(r) >= l; r -= lowbit(r)) ans = min(ans, c[r]);
	}
	return ans;
}

void update(int x, int v) {
	a[x] = v;
	for (int i = x; i <= m; i += lowbit(i)) {
		c[i] = a[i];
		for (int j = 1; j < lowbit(i); j *= 2) c[i] = min(c[i], c[i - j]);
	}
}

signed main() {
	memset(f, 0x3f, sizeof(f));
	memset(a, 0x3f, sizeof(a));
	memset(c, 0x3f, sizeof(c));
	scanf("%lld%lld%lld", &n, &s, &e);
	if (s == e) {
		printf("0");
		return 0;
	}
	s += 2, e += 2;
	for (int i = 1; i <= n; i++) {
		scanf("%lld%lld%lld", &cows[i].l, &cows[i].r, &cows[i].s);
		cows[i].l += 2, cows[i].r += 2;
	}
	sort(cows + 1, cows + n + 1, [](cow a, cow b) {return a.r < b.r;});
	for (int i = 1; i <= n; i++)
		if (cows[i].l <= s)
			f[i] = cows[i].s;
	for (int i = 1; i <= n; i++)
		update(cows[i].r, (f[i] = min(f[i], getmin(cows[i].l - 1, cows[i].r - 1) + cows[i].s)));
	for (int i = n; i >= 1 && cows[i].r >= e; i--)
		ans = min(ans, f[i]);
	if (ans == 0x3f3f3f3f3f3f3f3f) printf("-1");
	else printf("%lld", ans);
	return 0;
}
2024/7/10 21:27
加载中...