How F
  • 板块学术版
  • 楼主I_Love_DS
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/30 22:37
  • 上次更新2024/12/1 09:34:54
查看原帖
How F
1118614
I_Love_DS楼主2024/11/30 22:37

线段树没调出来 WA * 34

#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 50;

int h, w, n, ans[N];
struct node {
	int x, y1, y2, id;
	node() {}
	node(int X, int Y1, int Y2, int Id) {x = X, y1 = Y1, y2 = Y2, id = Id;}
	friend bool operator < (const node &x, const node &y) {
		return x.x > y.x;
	}
} a[N];

struct tree {
	int v, tag;
} t[4 * N];

void pushdown(int k) {
	if (!t[k].tag) return;
	t[k + k].v += t[k].tag;
	t[k + k].tag += t[k].tag;
	t[k + k + 1].v += t[k].tag;
	t[k + k].tag += t[k].tag;
	t[k].tag = 0;
}

void pushup(int k) {
	t[k].v = max(t[k + k].v, t[k + k + 1].v);
}

void buildtree(int k, int l, int r) {
	if (l == r) {
		t[k].v = 0;
		t[k].tag = 0;
		return;
	}
	int m = (l + r) / 2;
	buildtree(k + k, l, m);
	buildtree(k + k + 1, m + 1, r);
}

void insert(int k, int l, int r, int x, int y, int z) {
	//cerr << "ok2" << endl;
	if (l == x && r == y) {
		t[k].v += z;
		t[k].tag += z;
		return;
	}
	pushdown(k);
	int m = (l + r) / 2;
	if (y <= m) insert(k + k, l, m, x, y, z);
	else if (x > m) insert(k + k + 1, m + 1, r, x, y, z);
	else insert(k + k, l, m, x, m, z), insert(k + k + 1, m + 1, r, m + 1, y, z);
	pushup(k);
}

int calc(int k, int l, int r, int x, int y) {
	//cerr << "ok1" << endl;
	if (l == x && r == y) return t[k].v;
	pushdown(k);
	int m = (l + r) / 2, ans = 0;
	if (y <= m) ans = calc(k + k, l, m, x, y);
	else if (x > m) ans = calc(k + k + 1, m + 1, r, x, y);
	else ans = max(calc(k + k, l, m, x, m), calc(k + k + 1, m + 1, r, m + 1, y));
	pushup(k);
	return ans;
}

int main() {
	scanf("%d%d%d", &h, &w, &n);
	for (int i = 1; i <= n; i++) {
		int x, y, l;
		scanf("%d%d%d", &x, &y, &l);
		a[i] = node(x, y, y + l - 1, i);
	}
	sort(a + 1, a + n + 1);
	for (int i = 1; i <= n; i++) {
		int d = calc(1, 1, w, a[i].y1, a[i].y2);
		ans[a[i].id] = h - d;
		insert(1, 1, w, a[i].y1, a[i].y2, 1);
	}
	for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
	return 0;
}
2024/11/30 22:37
加载中...