bzoj1206-[HNOI2005]虚拟内存

卡读的毒瘤题==

看懂之后用map模拟.或者线段树

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll;

//---------------------------------------
int n,m,ans;
struct tnd{int cnt,t;};
bool operator<(tnd l,tnd r){return l.cnt!=r.cnt?l.cnt<r.cnt:l.t<r.t;}
map<int,tnd> name;
map<tnd,int> cs;
int sz;
bool sol(int v,int t){
    if(name.find(v)!=name.end()){
        tnd tmp=name[v];
        cs.erase(tmp);
        tmp.cnt++;
        name[v]=tmp,cs[tmp]=v;
        return 1;
    }
    else if(sz<n){
        tnd tmp=(tnd){1,t};
        name[v]=tmp,cs[tmp]=v;
        ++sz;
        return 0;
    }
    else{
        int v0=cs.begin()->second;
        name.erase(v0),cs.erase(cs.begin());
        tnd tmp=(tnd){1,t};
        name[v]=tmp,cs[tmp]=v;
        return 0;
    }
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n>>m;
    int a;
    rep(i,1,m){
        cin>>a;
        if(sol(a,i))++ans;
    }
    cout<<ans<<'\n';
    return 0;
}

转载于:https://www.cnblogs.com/ubospica/p/9871223.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值