求助
查看原帖
求助
882092
zMinYu楼主2023/10/16 16:08
#include <bits/stdc++.h>
using namespace std;
struct zs {
	int c, d, id;
};
const int N = 2e5 + 7, LogN = log2(2e5 + 7);
bool cmp(zs x, zs y) {
	return x.c < y.c;
}
int n, m;
zs a[N << 1];
int st[N][LogN];
void zinit() {
	for (int i = 1, j = 1; i <= n; i++) {
		while (j <= n && a[j].c <= a[i].d) j++;
		st[i][0] = j - 1;
	} 
	for (int j = 1; (1 << j) <= n / 2; j++) {
		for (int i = 1; i <= n; i++) {
			st[i][j] = st[st[i][j - 1]][j - 1];
		}
	}
}
int anss[N];
void getans(int x) {
	int now = x;
	int len = a[now].c + m, ans = 0;
	for (int i = log2(N * 2); i >= 0; i--) {
		int pos = st[now][i];
		if (pos && a[pos].d < len) {
			now = pos;
			ans += 1 << i;
		}
	}
	anss[a[x].id] = ans + 1;
}
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		a[i].id = i;
		cin >> a[i].c >> a[i].d;
		if (a[i].c > a[i].d) a[i].c += m;
	}
	sort(a + 1, a + 1 + n, cmp);
	for (int i = 1; i <= n; i++) {
		a[i + n] = a[i];
		a[i + n].c += m;
		a[i + n].d += m;
	}
	n = n + n;
	zinit();
	for (int i = 1; i <= n / 2; i++) getans(i);
	for (int i = 1; i <= n / 2; i++) cout << anss[i] << ' ';
	return 0;
} 

死磕书本写的,但不知道哪里写炸了。

2023/10/16 16:08
加载中...