P9572 题解
P9572 「NnOI R2-T4」Colorful Days♪
题目大意
定义
解法
题目中,
既然第一问是一个个找
所以用一个记录枚举
然而这是
可不可以跳跃的找
再对这个过程优化,由于我们的预处理使得
最终复杂度:
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,c1,c2,s[N],t[N];
int ans,ans1=1,it=0,mp[N];
vector<int> pos[N];
int main(){
scanf("%d%d%d%d",&n,&m,&c1,&c2);
for(int i=1;i<=n;++i){
scanf("%d",&s[i]),mp[s[i]]=1;//标记出现
pos[s[i]].push_back(i);//预处理位置
}
for(int i=1;i<=m;++i) scanf("%d",&t[i]);
for(int i=1;i<=m;++i){
if(!mp[t[i]]) continue;
ans++;
if(pos[t[i]][pos[t[i]].size()-1]<=it){//最后一个位置也比当前枚举s的下标小,意味着必须得复制
it=pos[t[i]][0];//复制完距离it最近的就是第一个位置
ans1++;
continue;
}
int l=0,r=pos[t[i]].size()-1;//二分
while(l<=r){
int mid=(l+r)>>1;
if(pos[t[i]][mid]>it) r=mid-1;
else l=mid+1;
}
it=pos[t[i]][l];
}
printf("%d %d",c1*ans,c2*ans1);
return 0;
}