70分代码求助!!!
查看原帖
70分代码求助!!!
287947
Icyfires18楼主2021/12/31 23:15
#include<iostream>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
using namespace std;
const int N=100001;
int n,m,ans;
int a[N],nex[N];
map<int,int>H;
//用于求nex[]和值存在标记 
priority_queue< pair<int,int> >Q;
//用于每次贪心取最远值 
inline void reade(int& rer){
    register char ch;
    for(ch=0;ch<'0'||ch>'9';ch=getchar());
    for(rer=0;ch>='0'&&ch<='9';ch=getchar())
        rer=(rer<<3)+(rer<<1)+(ch^48);
}
int main(){
    register int i,k;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)reade(a[i]);
    //输入a[] 
    for(i=1;i<=n;++i)nex[i]=n+i;
    for(i=1;i<=n;++i){
        if(k=H[a[i]])nex[k]=i;
        H[a[i]]=i;
    }H.clear();
    //预处理求邻值位置nex[] 
	for(i=1;Q.size()<m&&i<=n;++i){
        if(H[a[i]])continue;
        H[a[i]]=1,++ans;
        Q.push({nex[i],i});
	}//先填满Cache 
	for(i=i;i<=n;++i){
        if(H[a[i]]){
            Q.push({nex[i],i});
            continue;
        }++ans;//存在则继续 
        do k=Q.top().second,Q.pop();
		while(!H[a[k]]);
        H.erase(a[k]),H[a[i]]=1;
        Q.push({nex[i],i});
        //否则弹出再弹入,同时标记 
    }//后续处理 
	printf("%d",ans);
    return 0;
}

错数据点4,5,6;

错误记录

2021/12/31 23:15
加载中...