[CSP-J 2021] 小熊的果篮
首先,通过遍历,每次发现未访问过的,便比较是否与前一个一样,不一样则说明当前点为新堆,直接输出当前下标。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],n,tmp;
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(a[j]!=-1&&a[j]!=t){
cout<<j<<" ";
t=a[j];
a[j]=-1;
}
}
cout<<endl;
}
}
但很明显,这样只能得40分,会超时。
那么我们只好考虑使用其他方式,比如队列进行优化。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N], use[N];
struct node
{
int s, e, p;
}a, b;
int main()
{
int n, i, s=1, f;
queue<node>q, q2;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
a[n+1] = 1 - a[n];
for(i=2;i<=n+1;i++)
if(a[i]!=a[i-1])
{
q.push({s,i-1,a[i-1]});
s = i;
}
f = n;
while(f)
{
while(!q.empty())
{
a = q.front();
q.pop();
while(use[a.s]&&a.s<=a.e) a.s++;
if(a.s>a.e) continue;
cout<<a.s<<' ';
f--;
use[a.s] = 1;
a.s++;
if(a.s>a.e) continue;
q2.push(a);
}
while(!q2.empty())
{
a = q2.front();
q2.pop();
while(!q2.empty())
{
b = q2.front();
if(b.p==a.p)
{
a.e = b.e;
q2.pop();
}
else break;
}
q.push(a);
}
cout<<'\n';
}
return 0;
}