比赛 树形数据结构进阶(再进阶) 评测结果 WWWWWAWWWWWWWWWWWWWW
题目名称 区间 最终得分 5
用户昵称 LikableP 运行时间 3.432 s
代码语言 C++ 内存使用 33.29 MiB
提交时间 2025-04-19 10:25:08
显示代码纯文本
#include <cstdio>

template <typename T>
T max(T x, T y) {
	return x > y ? x : y;
}

const int MAXN = 5e5 + 10;
const int MAXV = 1e9;

struct SEQ{
	int l, r;
} seq[MAXN];

struct NODE {
	int ls, rs;
	int maxx;
	int lazy;
} node[MAXN * 40];

int nodeNum;
void PushDown(int root) {
	if (node[root].lazy) {
		node[node[root].ls].maxx += node[root].lazy;
		node[node[root].ls].lazy += node[root].lazy;
		node[node[root].rs].maxx += node[root].lazy;
		node[node[root].rs].lazy += node[root].lazy;
		node[root].lazy = 0;
	}
}

void Merge(int root) {
	node[root].maxx = max(node[node[root].ls].maxx, node[node[root].rs].maxx);
}

void AddSeq(int &root, int lt, int rt, int lq, int rq, int val) {
	if (!root) root = ++nodeNum;
	if (lt == lq && rt == rq) {
		node[root].maxx += val;
		node[root].lazy += val;
		return ;
	}
	PushDown(root);
	int mid = lt + ((rt - lt) >> 1);
	if (rq <= mid) {
		AddSeq(node[root].ls, lt, mid, lq, rq, val);
	} else if (lq > mid) {
		AddSeq(node[root].rs, mid + 1, rt, lq, rq, val);
	} else {
		AddSeq(node[root].ls, lt, mid, lq, mid, val);
		AddSeq(node[root].rs, mid + 1, rt, mid + 1, rq, val);
	}
	Merge(root);
}

int n, m;
int root;

int main() {
	freopen("interval.in", "r", stdin);
	freopen("interval.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%d %d", &seq[i].l, &seq[i].r);
		AddSeq(root, 0, MAXV, seq[i].l, seq[i].r, 1);
	}
	if (node[root].maxx < m) {
		printf("-1");
		return 0;
	}
	printf("1");
	return 0;
}