您当前的位置: 首页 >  算法

MangataTS

暂无认证

  • 5浏览

    0关注

    423博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

LRU算法的实现(STL+模拟)

MangataTS 发布时间:2021-01-16 22:19:00 ,浏览量:5

题目链接:传送门

解题思路:

我们可以开两个map和一个vector进行操作,第一个vis表示元素是否在容器里面,第二个mp表示的是键值对,第三个Vector的V表示的是最近访问的内容,值得注意的是,除了vis操作,其他的操作都不会让k变为最近访问,(因为这个wa了好几次),还有就是vis、pop、remove操作,如果不存在对应的内容,则不操作,最后注意多组输入要把这三个容器的东西清空

code:
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
map vis;//判断是否存在容器里面
map mp;
vector V;
int main()
{
	int n;
	while(~scanf("%d",&n)) {
	getchar();
	ll k;
	ll v;
	char op[30];
	while(n--) {
		scanf("%s",op);
		getchar();
		if(strcmp(op,"insert") == 0) {
			scanf("%lld%lld",&k,&v);
			getchar();
			mp[k] = v;
			if(!vis[k])
				vis[k] = true,V.push_back(k);
		}
		else if(!strcmp(op,"get")) {
			scanf("%lld",&k);
			getchar();
			if(vis[k]) {
				printf("%lld\n",mp[k]);
			}
			else {
				puts("-1");
			}
		}
		else if(!strcmp(op,"vis")) {
			scanf("%lld",&k);
			getchar();
			auto loc = find(V.begin(),V.end(),k);//注意这里不能用lower_bound,因为V不一定有序
			if(loc!= V.end() && *loc == k) {
				V.erase(loc);
				V.push_back(k);
			}
		}
		else if(!strcmp(op,"pop")) {
			if(V.size()) {//先判断V是否是空的,否则会RE
				mp[V.front()] = -1ll,vis[V.front()] = false;
				V.erase(V.begin());
			}
		}
		else if(!strcmp(op,"remove")) {
			scanf("%lld",&k);
			getchar();
			auto loc = find(V.begin(),V.end(),k);
			if(loc!= V.end() && *loc == k) {
				V.erase(loc);
				mp[k] = -1ll;
				vis[k] = false;
			}
		}
	}
	vis.clear();//注意清空STL的容器
	V.clear();
	mp.clear();

}
	return 0;
}
关注
打赏
1665836431
查看更多评论
立即登录/注册

微信扫码登录

0.0382s