与题意无关故不放题面了,代码中 m 最多 106,n 最多 104,整个代码复杂度 O(mlogn),题目时限 5s 仍然 TLE。
按理说 STL 开了 O2 后常数也不应该很大,请教哪里可以再卡常?
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define PII pair<int,int>
#define fi first
#define se second
#define mkp make_pair
int n,m,cnt;
map<int,int>mp,el;
struct cmp{
bool operator()(PII a,PII b)const{
if(mp[a.fi]==mp[b.fi])
return a.se<b.se;
return mp[a.fi]<mp[b.fi];
}
};
set<PII,cmp>st;
int main(){
// freopen("8.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int p,te;
scanf("%d",&p);
te=el[p];
// cout<<p<<" "<<te<<" !!!"<<endl;
auto ti=st.find(mkp(p,te));
if(ti!=st.end()){
st.erase(ti);
mp[p]++,cnt++;
// cout<<p<<" "<<mp[p]<<" "<<cnt<<endl;
st.insert(mkp(p,te));
}
else{
if(st.size()>=n){
auto it=st.begin();
mp[it->fi]=0;
// cout<<"del: "<<it->fi<<endl;
st.erase(it);
}
el[p]=i,mp[p]++,st.insert(mkp(p,i));
// cout<<p<<" "<<mp[p]<<" "<<el[p]<<" wow"<<endl;
}
}
printf("%d\n",cnt);
return 0;
}