请教各位这一份代码哪里可以卡卡常
  • 板块学术版
  • 楼主GuidingStar
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/9/23 20:16
  • 上次更新2023/10/27 10:14:31
查看原帖
请教各位这一份代码哪里可以卡卡常
199561
GuidingStar楼主2022/9/23 20:16

与题意无关故不放题面了,代码中 mm 最多 10610^6nn 最多 10410^4,整个代码复杂度 O(mlogn)O(m\log n),题目时限 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;
}
2022/9/23 20:16
加载中...