采用队列存储有效堆的方式,感觉已经最优了,为何还过不了#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;
}