P9572 「NnOI R2-T4」Colorful Days♪
Eltaos_xingyu · · 题解
题目传送门
(姐姐砍我!)
令两个指针
首先统计
cin>>n>>m>>c1>>c2;
for(int i=1;i<=n;i++){
cin>>s[i];
v[s[i]].push_back(i);
}
对,要开
然后,对于每一个 ti++ 就行了。
如果有,就在 lower_bound 查找第一个 v[t[ti]].end(),那么没有查到任何一个 k++,并且将 lower_bound 正常运行。如果正常返回,那么直接把
什么?你说你不知道什么是 lower_bound?这个函数返回的是一个升序区间内第一个大于等于参数值的指针,这你懂了吧?
指针 lower_bound 的时间复杂度最坏为
下面是 AC 代码:
#include<bits/stdc++.h>
using namespace std;
int si,ti,c1,c2,t[10000001],s[10000001],k=1,cnt=0;
vector<int> v[1000001];
vector<int>::iterator it;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m>>c1>>c2;
for(int i=1;i<=n;i++){
cin>>s[i];
v[s[i]].push_back(i);
}
for(int i=1;i<=m;i++){
cin>>t[i];
}
ti=1;
si=1;
while(1){
while(v[t[ti]].empty()&&ti<=m)ti++;
if(ti>m)break;
cnt++;
it=lower_bound(v[t[ti]].begin(),v[t[ti]].end(),si);
if(it==v[t[ti]].end()){
k++;
si=*v[t[ti]].begin()+1;
}
else{
si=*it+1;
}
ti++;
}
cout<<c1*cnt<<" "<<c2*k;
}