CF1223F Stack Exterminable Arrays 题解
这题是 CSP-S 2023 T2 的加强版。
区间
所以一个可消除区间肯定是由若干个左右端点颜色(
考虑对于每个右端点
很明显
于是可以对每个点用一个 map 维护每种颜色往左边跳到的第一个这种颜色的点的编号。每个点 map 都需要继承 map,可以直接 swap,因为后面 map 就不会再用到了。
时间复杂度
参考代码:
#include<bits/stdc++.h>
#define ll long long
#define mxn 300003
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rept(i,a,b) for(int i=a;i<b;++i)
using namespace std;
int q,n,a[mxn],p[mxn];
ll ans,f[mxn];
map<int,int>mp[mxn];
signed main(){
scanf("%d",&q);
while(q--){
scanf("%d",&n);
rep(i,1,n)scanf("%d",&a[i]),mp[i].clear(),f[i]=p[i]=0;
ans=0;
rep(i,1,n){
auto it=mp[i-1].find(a[i]);
if(it!=mp[i-1].end()){
p[i]=it->second-1;
f[i]=f[p[i]]+1,ans+=f[i];
swap(mp[i],mp[p[i]]);
}
mp[i][a[i]]=i;
}
printf("%lld\n",ans);
}
return 0;
}