后三个超时,求助
查看原帖
后三个超时,求助
726264
shiluomax楼主2022/11/17 21:42
#include<iostream>
#include<map>
#include<list>
using namespace std;
int main()
{
	list<int>student;
	map<int, list<int>::iterator>mp;
	int N;//总人数
	int k, p;//k为目标同学(k为已在队列中的),p为0左边,为1右边
	int M;//踢出人数
	int x[100000];//的同学
	int begin=1;
	cin >> N;
	student.push_front(1);
	list<int>::iterator pos;
	mp[begin] = student.begin();
	for (int i = 2; i <= N; i++)
	{
		cin >> k >> p;
		if (p == 0)
		{
			student.insert(mp[k], i);//插入左边
			for (pos = mp[k]; ; pos--)//map定位每一个同学的地址//重复定位
			{
				mp[*pos] = pos;
				if (*pos==i)
				{
					mp[*pos] = pos;
					break;
				}
			}
		}
		else if(p==1)
		{
			if (mp[k] == --student.end()||student.size() == 1)//插入右边
			{
				student.push_back(i);
				for (pos = mp[k]; ; pos++)//map定位每一个同学的地址//重复定位
				{
					mp[*pos] = pos;
					if (*pos == i)
					{
						mp[*pos] = pos;
						break;
					}
				}
			}
			else
			{
				pos = mp[k];
				pos++;
				student.insert(pos, i);//插入右边
				for (pos = mp[k]; ; pos++)//map定位每一个同学的地址//重复定位
				{
					mp[*pos] = pos;
					if (*pos == i)
					{
						mp[*pos] = pos;
						break;
					}
				}
			}
		}
	}
	cin >> M;
	for (int i = 1; i <= M; i++)//储存踢人名单
		cin >> x[i];
	for (int i = 1; i <= M; i++)//踢出
		student.remove(x[i]);
	pos = student.begin();
	while (pos != student.end())//输出
	{
		cout << *pos << ' ';
		pos++;
	}
	return 0;
}
2022/11/17 21:42
加载中...