求救!几乎全WA
查看原帖
求救!几乎全WA
1610845
xymethane楼主2025/7/26 11:27
#include<iostream>
#include<algorithm>
#define Max 200000
using namespace std;

struct fighter
{	int id;
	long long l, r; 
}a[2 * Max + 5];

int n;
long long m;
int f[Max + 5][20];
long long g[Max + 5][20];
int res[Max + 5];

bool cmp(fighter& x, fighter& y)
{	return x.l < y.l;
}

int main()
{	
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{	scanf("%lld%lld", &a[i].l, &a[i].r);
		if (a[i].r < a[i].l) a[i].r += m;
		a[i].id = i;
	}
	sort(a + 1, a + n + 1, cmp);
	for (int i = n + 1; i <= n * 2; i++)
		a[i] = a[i - n],
		a[i].l += m, a[i].r += m;
	
	int p, q;
	for (p = 1, q = 2; p <= n; p++)
	{	while (a[q + 1].l <= a[p].r) q++;
		f[p][0] = a[q].id;
		g[p][0] = a[q].r - a[p].r;
	}
	
	for (int t = 1; t <= 18; t++)
		for (int i = 1; i <= n; i++)
			f[i][t] = f[f[i][t - 1]][t - 1],
			g[i][t] = g[i][t - 1] + 
						g[f[i][t - 1]][t - 1];
			
	for (int i = 1; i <= n; i++)
	{	int now = i, ID = a[i].id;
		long long remain = m - a[i].r + a[i].l;
		int ans = 1;
		for (int t = 18; t >= 0; t--)
			if (g[now][t] <= remain)
					remain -= g[now][t],
					ans += 1 << t, 
					now = f[now][t];
		if (remain > 0)
			ans++;
		res[ID] = ans;
	}
	for (int i = 1; i <= n; i++)
		cout << res[i] << ' ';	
	
	return 0;
} 
2025/7/26 11:27
加载中...