80分求助,#8#9TLE
查看原帖
80分求助,#8#9TLE
391043
bodybo楼主2023/7/21 10:18

采用队列存储有效堆的方式,感觉已经最优了,为何还过不了#8#9,求教,代码如下:

#include <cstdio>
#include <queue>

using namespace std;

//堆结构体,没一堆存储起始和终止下标,最大可能有2e5个堆(101010101010...10) 
struct Tdata
{
	int val;
	int start;
	int end;
} data[200005];

queue<Tdata*> q; //队列存储有效堆,即Tdata的start<=end 
 
int main()
{
	int n;
	scanf("%d", &n);
	
	int k = 0;
	int v = -1;
	for(int i=1; i<=n; i++)
	{
		int val; 
		scanf("%d", &val);
		if (v != val)  //水果变了,创建一个新堆,开始start=end=i 
		{
			v = val;
			k++;
			data[k] = {val, i, i};
			q.push(&data[k]);
		}
		else  //水果没变,更新end 
		{
			data[k].end = i;
		}
	}
	
	
	while(!q.empty())
	{
		v = -1;
		int size = q.size();
		for(int i=1; i<=size; i++) //依次检查当前队列中的每一个堆 
		{
			Tdata* p = q.front(); //取出当前堆 
			q.pop();
			if (v != p->val)	//当前堆水果变了
			{
				printf("%d ", p->start++); //输出当前堆的start,同时start加1 
				v = p->val;
			}
			if (p->start <= p->end)  //如果当前堆有效,再次将其放入队尾 
				q.push(p);
		}
		printf("\n");
	}
	
	return 0;
}

2023/7/21 10:18
加载中...