mxqz线段树
查看原帖
mxqz线段树
526017
COsm0s楼主2023/4/2 08:21

T了,不知道什么原因。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 5;
int minn[N << 2];
inline int read() {
	int x = 0, m = 1;
	char ch = getchar();
	while(!isdigit(ch)) {
		if(ch == '-') m = -1;
		ch = getchar();
	}
	while(isdigit(ch)) {
		x = x * 10 + ch - 48;
		ch = getchar();
	}
	return x * m;
}
inline void write(int x) {
	if(x < 0) {
		putchar('-');
		write(-x);
		return;
	}
	if(x >= 10) write(x / 10);
	putchar(x % 10 + '0');
}
namespace tree {
	inline void PushUp(int x) {
		minn[x] = min(minn[x << 1], minn[x << 1 | 1]);
	}
	inline void UpDate(int l, int r, int x, int aim, int C) {
		if(l == r) {
			minn[x] = min(minn[x], C);
			return ;
		}
		int mid = l + r >> 1;
		if(mid >= aim) UpDate(l, mid, x << 1, aim, C);
		else UpDate(mid + 1, r, x << 1 | 1, aim, C);
		PushUp(x);
	}
	inline int Query(int rt, int l, int r, int L, int R) {
		if(l >= L && r <= R) return minn[rt];
		int mid = (l + r) >> 1, ans = INT_MAX;
		if(L <= mid) ans = min(Query(rt << 1, l, mid, L, R), ans);
		if(R > mid) ans = min(ans, Query(rt << 1 | 1, mid + 1, r, L, R));
		return ans;
	}
}
namespace slove {
	int m, n;
	int main() {
		m = read(), n = read();
		for(int i = 1; i <= (m << 2); i ++) minn[i] = INT_MAX;
		tree::UpDate(1, m, 1, 1, 0);
		for(int i = 1; i <= n; i ++) {
			int l = read(), r = read();
			tree::UpDate(1, m, 1, r, tree::Query(1, 1, m, l, r) + 1);
		}
		write(tree::Query(1, 1, m, m, m));
		putchar('\n');
	}
}
signed main() {
	int T = read();
	while(T --) {
		slove::main();
		if(T) putchar('\n');
	}
	return 0;
}
2023/4/2 08:21
加载中...