数据需要加强
查看原帖
数据需要加强
375895
SSL_wj楼主2021/10/27 15:08

我的做法是拿个 set 维护所有块,然后直接暴力扫描,过了民间数据,参考代码:

#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
set<pair<int,int> >e[2];int n,c[200010],g,a;pair<int,int>o2;set<pair<int,int> >::iterator it;
int main()
{
//	freopen("data.in","r",stdin);
//	freopen("ans.out","w",stdout); 
	scanf("%d",&n),c[0]=2;
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&c[i]);
		if(c[i-1]==c[i])++o2.second;
		else e[0].insert(o2),o2=make_pair(i,i);
	}
	e[0].insert(o2),e[0].erase(e[0].begin());
	while(e[g].size())
	{
		printf("%d ",(o2=*e[g].begin()).first),e[g].erase(e[g].begin()),a=c[o2.first++];if(o2.first<=o2.second)e[g^1].insert(o2);
		for(it=e[g].begin();it!=e[g].end();++it)if(c[it->first]!=a){printf("%d ",(o2=*it).first),a^=1;if((++o2.first)<=o2.second)e[g^1].insert(o2);}else e[g^1].insert(*it);
		putchar('\n'),e[g].clear(),g^=1;
	}
	return 0;
}

但是这样时间复杂度是错的,没有合并颜色相同的相邻块,可以通过这个 data 叉掉:

#include<cstdio>
using namespace std;
const int n=200000;
int main()
{
	freopen("data.in","w",stdout);
	printf("%d\n",n);
	for(int i=n/3;i;--i)printf("0 1 1 ");for(int i=n%3;i;--i)printf("0 ") ;
	return 0;
}

n=100000 时CF上跑到15s+后RE了,请求加强数据。

2021/10/27 15:08
加载中...