#2-4wa 5-10tle求调!悬一关
查看原帖
#2-4wa 5-10tle求调!悬一关
991813
sen_lin114514楼主2024/11/9 12:23
#include <algorithm>
#include <iostream>

using namespace std;

const int N = 2 * (2e5 + 10);

int n,m;//战士数量,边防站数量 

struct node
{
	long long l,r;
	int id;//编号 
}node[N];

bool cmp(const struct node &t1,const struct node &t2)
{
	return t1.l < t2.l;
}

long long f[N][20];//区间i走2^j步到的区间 
long long lg[N];//log2n

void init()
{
	int nxt = 1;
	for (int i = 1 ; i <= n * 2 ; i ++)
	{
		while (nxt <= n * 2 && node[nxt].l <= node[i].r)
		{
			nxt ++;
		}
		f[i][0] = nxt - 1;
	}
	for (int i = 1 ; (i << 1) <= n ; i ++)//倍增操作 
	{
		for (int j = 1 ; j <= n * 2 ; j ++)
		{
			f[j][i] = f[f[j][i - 1]][i - 1];
		}
	}
	lg[1] = 0;
	for (int i = 2 ; i <= m + 3 ; i ++)
	{
		lg[i] = lg[i / 2] + 1;
	}
}

long long aans[N];

void solve(int x)
{
	int len = node[x].l + m;
	int now = x;//现在的位置 
	long long ans = 1;
	for (int i = lg[m]; i >= 0 ; i --)//从大跳 
	{
		int p = f[now][i];
		if (p && node[p].r < len)
		{
			ans += 1 << i;
			now = p;
		}
	}
	aans[node[x].id] = ans + 1;
	return;
}

int main()
{
	std :: cin >> n >> m;
	for (int i = 1 ; i <= n ; i ++)
	{
		std :: cin >> node[i].l >> node[i].r;
		node[i].id = i;
		if (node[i].l > node[i].r)
		{
			node[i].r += m;//扩展至两倍处理环 
		}
	}
	sort(node + 1,node + 1 + n,cmp);//贪心策略按左端点排序
	for (int i = n + 1 ; i <= 2 * n ; i ++)
	{
		node[i].l = node[i - n].l + m;
		node[i].r = node[i - n].r + m;
	}//处理环
	init();
	for (int i = 1 ; i <= n ; i ++) solve(i);
	for (int i = 1 ; i <= n ; i ++)
	{
		std :: cout << aans[i] << " ";
	}
	return 0;
}
2024/11/9 12:23
加载中...