(Nowcoder) J LRU management (静态链表)

2024-03-20 17:08

本文主要是介绍(Nowcoder) J LRU management (静态链表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

题意读懂了,感觉这就是个大模拟,但是直接模拟复杂度太大,所以我们要用链表指针搞一搞。不知道是不是我写的实在太挫,还是卡常,一直狂T,哭了。

划重点,加上这个才过。设置哈希桶大小,队友加了才过,估了,才知道这玩也,相见恨晚,还是太菜了呀。

rk.rehash(500005);
a.rehash(500005);

#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define sc(n) scanf("%d",&n)
#define SC(n,m) scanf("%d %d",&n,&m)
#define SZ(a) int((a).size())
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const double pi=acos(-1.0);
const double eps=1e-9;
const int maxn=1e6+5;
int T,q,m;
struct node{int pre,nxt;int val;
};
unordered_map<int,node> a;
unordered_map<string,int> rk;
char alls[maxn][20];
int allop[maxn],allv[maxn];
inline int read(){char ch = getchar(); int x = 0, f = 1;while(ch < '0' || ch > '9') {if(ch == '-') f = -1;ch = getchar();} while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0';ch = getchar();} return x * f;
}
int main(){T = read();rk.rehash(500005);a.rehash(500005);while(T--){q = read();m = read();int op,s,v,nlen=0;int fa=-1,last;a.clear(),rk.clear();rep(i,1,q){allop[i] = read();scanf(" %s",alls[i]);allv[i] = read();}int cnt=0;rep(i,1,q){if(rk.count(alls[i])==0) rk[alls[i]]=++cnt;}rep(i,1,q){op=allop[i],s=rk[alls[i]],v=allv[i];if(op==0){ //addif(nlen==0){a[fa].nxt=s;a[s].pre=fa,a[s].val=v;last=s,nlen++;printf("%d\n",v);}else{if(a.count(s)==0 || a[s].val==inf){ //不存在sa[last].nxt=s,a[s].pre=last;a[s].val=v,last=s,nlen++;printf("%d\n",v);if(nlen>m){ //删除头部if(m==1){int fato=a[fa].nxt;a[fato].val=inf;a[fato].pre=0,a[fato].nxt=0;a[fa].nxt=s,a[s].pre=fa;last=s;}else{int fato=a[fa].nxt;a[fato].val=inf;int to=a[fato].nxt;a[to].pre=fa,a[fa].nxt=to;a[fato].pre=0,a[fato].nxt=0;}nlen--;}}else{//存在sprintf("%d\n",a[s].val);if(s==last) continue;int spre=a[s].pre,sto=a[s].nxt;a[sto].pre=spre,a[spre].nxt=sto;a[last].nxt=s;a[s].pre=last;last=s;}}}else{ //queryif(a.count(s)==0 || a[s].val==inf){puts("Invalid");}else{if(v==0)    printf("%d\n",a[s].val);if(v==-1){if(a[s].pre==fa)    puts("Invalid");else    printf("%d\n",a[a[s].pre].val);}if(v==1){if(s==last) puts("Invalid");else printf("%d\n",a[a[s].nxt].val);}}}}}return 0;
}

 

这篇关于(Nowcoder) J LRU management (静态链表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830170

相关文章

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

LRU 实现原理

前言 我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来。缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据。常用淘汰算法有 LRU,LFU,FIFO,这篇文章我们聊聊 LRU 算法。 LRU 简介 LRU 是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概

安装SQL2005后SQL Server Management Studio 没有出来的解决方案

一种情况,在安装 sqlServer2005 时 居然出现两个警告: 1 Com+ 目录要求 2 Edition change check 郁闷!网上说出现两个警告,是肯定装不成功的!我抱着侥幸的态度试了下,成功了。 安装成功后,正准备 “ 仅工具、联机丛书和示例(T)” 但是安装不了,他提示我“工作站组件”安装过了对现有组件无法更新或升级。 解决办法: 1 打开“控

C++/《C++为什么要有静态成员函数》

摘要        本文说明了什么是静态成员变量,什么是静态成员函数的概念,讨论了访问私有静态成员变量的三个方法。得出用静态成员函数访问静态私有成员变量是最佳方法即回答了“C++为什么要有静态成员函数“的问题。 类的静态成员 我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是

c++的静态变化!

静态成员   对于非静态成员,一个类的每个对象都自己存有一个副本,每个对象根据自己拥有的非静态的数据成员来区别于其他对象。而静态成员则解决了同一个类的多个对象之间数据和函数的共享问题。   静态数据成员   静态数据成员的作用是:实现同一类的不同对象之间的数据共享。   #include<IOSTREAM>   using namespace std;   class Po