30分 求助大佬 注释写满了QAQ
查看原帖
30分 求助大佬 注释写满了QAQ
1082637
Neflibatas楼主2023/12/6 23:41
#include<iostream>
#include<map>
using namespace std;

long long l, n, m1;
long long s[50010];//各个点到原点距离(用来求d)
long long d[50010];//各个点到上一个点距离
long long p[50010];//判断一个点是否被去除并且是否更新 若为0则被去除 若不为此点到上点的距离则未被更新
multimap<long long, long long>m;//<到上一个点距离,该点的下标> 使用map可保证map.begin()是要删除的点

int main()
{
	cin >> l >> n >> m1;
	for(int i=1;i<=n;i++)//读入起点与终点之间的点
	{
		scanf_s("%d", &s[i]);
		d[i] = s[i]-s[i-1];
		m.insert(make_pair(d[i], i));
		p[i] = d[i];
	}
	d[n + 1] = l - s[n];
	p[n + 1] = d[n + 1];
	m.insert(make_pair(d[n + 1], n + 1));//把终点加入

	while (m1--)//删除点
	{
		map<long long, long long>::iterator it = m.begin();//获得距离最短点
		while (it->first!= p[it->second])//如果该点被更新(进行删i点后d[i+1]会改变,同时插入map,会导致map中存在不同key却表示同一个点,这时用这个while来保证这个key是有效的点)
			it++;
		long long b = it->second;
		p[it->second] = 0;//将点删除
		while (!p[b])//寻找下一个(存在的)点
			b++;
		d[b] += d[it->second];//将下一个点到上个点的距离改变
		p[b] = d[b];//更新p
		m.insert(make_pair(d[b], b));//插入map排序
	}
	map<long long, long long>::iterator it = m.begin();
	while (it->first != p[it->second])
		it++;
	cout << it->first << endl;
}
2023/12/6 23:41
加载中...