P9349题解
首先读题后,如果直接按照题目模拟,每次放置新棋子就寻找之前的同一颜色棋子,那么复杂度
低复杂度做法
定义最后一个颜色是
那为什么这样是对的呢?(以下简称
-
如果
l>lci ,则l \sim r 和i \sim lci 不相交。 -
如果
l<lci 且r<lci ,则l \sim r 被i \sim lci 覆盖,可以略去。 -
如果
l<lci 且r>lci ,则在遍历到r 之前,i \sim lci 已经将l 染色,此种情况不可能出现。
综上所述,以此方法将一段区间染色后,区间内棋子不会再改变颜色,这样就可以在每次染色之后直接令
最后注意
代码
#include<cstdio>
#include<map>
using namespace std;
const int N=2e5+5;
int n,color[N];
map<int,int> last;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&color[i]);
last[color[i]]=i;
}
for(int i=1;i<=n;i++){
int lci=last[color[i]];
for(int j=i+1;j<lci;j++)color[j]=color[i];
i=lci;
}
for(int i=1;i<=n;i++)printf("%d\n",color[i]);
return 0;
}