20pt求调
查看原帖
20pt求调
326254
LonginusMonkey楼主2024/8/16 09:49

不知道错在哪里

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 400000 + 100;
int n, m;
struct node{
	int c, d, id;
}arr[maxn];
bool cmp(node x, node y) {
	if(x.c == y.c) {
		return x.d < y.d;
	}
	return x.c < y.c;
}

int to[maxn];
int dp[maxn][64]; // dp[i][j]表示i位置2^j个人可以跳到哪 
int ans[maxn];

signed main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> m;
	for(int i=1; i<=n; ++i) {
		cin >> arr[i].c >> arr[i].d;
		if(arr[i].d<arr[i].c) arr[i].d += m;
		arr[i].id = i;
	}
	sort(arr+1, arr+1+n, cmp);
	int right = 1;
	for(int i=1; i<=n; ++i) {
		arr[i+n].c = arr[i].c+m; arr[i+n].d = arr[i].d + m;
		arr[i+n].id = i;
	}
	for(int i=1; i<=2*n; ++i) {
		while(right <= 2*n and arr[i].d >= arr[right].c) {
			++right;
		}
		dp[i][0] = right-1;
	}
	for(int i=1; i<=2*n; ++i) {
		for(int j=1; j<63; ++j) {
			dp[i][j] = dp[dp[i][j-1]][j-1];
		}
	}
	for(int i=1; i<=n; ++i) {
		int up = arr[i].c + m, tmans = 0, p = i;
		for(int j=19; j>=0; --j) {
			if(dp[p][j] and arr[dp[p][j]].d < up) {
				tmans += (1ll<<j); p = dp[p][j];
			}
		}
		ans[arr[i].id] = tmans+2;
	}
	for(int i=1; i<=n; ++i) {
		cout << ans[i] << " ";
	}
	return 0;
}
2024/8/16 09:49
加载中...