AcWing 4412. 构造数组
原题链接
困难
作者:
greenqwq
,
2024-04-14 21:22:38
,
所有人可见
,
阅读 9
//结论:当a数组两两相同的时候,b数组均相同
//我们可以把数组对应的下标看成一段段区间,如果二者有交集,那么就合并(对于a数组两两相等的时候)
//答案为:因为第一段肯定为0,第二段要么跟第一段要么就不要跟第一段,2种情况,因此:2^(n-1)
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
typedef pair<int,int>PII;
const int N = 2e5+10,mod=998244353;
int n,w[N];
vector<PII>segs,res;
map<int,int>S;//哈希表去重
map<int,int>l,r;//存储,防止溢出
//同时也注意map会比unordered_map快很多
signed main(){
cin>>n;
//记录每个值的起始位置和终止位置
for(int i=1;i<=n;i++){
cin>>w[i];
if(!l[w[i]])l[w[i]]=i;
r[w[i]]=i;
}
//这样让所有相同值的都仅仅入segs一次
for(int i=1;i<=n;i++){
if(!S[w[i]]){
segs.push_back({l[w[i]],r[w[i]]});
S[w[i]]=1;
}
}
int cnt=0;
int s=1;
sort(segs.begin(),segs.end());
int st=-2e9,ed=-2e9;
//默认左闭右开
for(auto seg:segs){
if(ed<seg.x){//不相交
if(st!=-2e9)res.push_back({st,ed});
st=seg.x,ed=seg.y;
}else{
ed=max(ed,seg.y);
}
}
if(st!=-2e9)res.push_back({st,ed});
// cout<<res.size()<<endl;
for(int i=0;i<res.size()-1;i++){
s=s*2%mod;
}
cout<<s;
return 0;
}