80pts TLE ON #8,9
查看原帖
80pts TLE ON #8,9
695194
Lucyna_Kushinada楼主2023/7/13 20:29
#include<bits/stdc++.h>
using namespace std;
#define N 200010
int n,len=1,dead,bf=1;
bool a[N];
stack<int>task;
int rd(){
	int x=0;char c=0;
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9'){
		x=10*x+c-'0';
		c=getchar();
	}
	return x;
}
struct block{
	int l,r,nex=-1,pre=-1;
	bool v,live=1;
}b[N];
void init(){
	int l=1;
	for(int i=1;i<=n;i++){
		if(a[i]!=a[i-1]&&i!=1){
			l=i;
			b[len].nex=len+1;
			len++;
		}
		b[len].l=l;
		b[len].r=i;
		b[len].v=a[i];
		if(len>1)b[len].pre=len-1;
	}
}
void print(int &k){
	if(!b[k].live)return;
	if(b[b[k].pre].v!=b[k].v||b[k].pre==-1){
		cout<<b[k].l<<' ';
		b[k].l++;
	}
	if(b[k].l>b[k].r){
		task.push(k);
		b[k].live=0;
		dead++;
	}
	k=b[k].nex;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	n=rd();
	for(int i=1;i<=n;i++)a[i]=rd();
	init();
	while(dead<len){
		int i=bf;
		while(!b[i].live&&i<=len)i=b[i].nex;
		bf=i;
		while(i>0)print(i);
		while(!task.empty()){
			int k=task.top();
			if(b[k].pre!=-1)b[b[k].pre].nex=b[k].nex;
			if(b[k].nex!=-1)b[b[k].nex].pre=b[k].pre;
			task.pop();
		}
		cout<<"\n";
	}
	return 0;
}
2023/7/13 20:29
加载中...