LRU management

题目传送门

解题思路

用map索引对应地址,用双向链表维护序列。

代码如下

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll; inline int read(){
int res = 0, w = 0; char ch = 0;
while(!isdigit(ch)){
w |= ch == '-', ch = getchar();
}
while(isdigit(ch)){
res = (res << 3) + (res << 1) + (ch ^ 48);
ch = getchar();
}
return w ? -res : res;
} const int N = 500005; int l[N], r[N];
int data[N], cnt, tail, sum, front;
ll u[N];
map<ll, int> mp; int main()
{
int t;
t = read();
while(t --){
int q, m;
scanf("%d%d%*c", &q, &m);
front = sum = tail = cnt = 0;
for(int i = 0; i <= q + 1; i ++)
u[i] = l[i] = r[i] = data[i] = 0;
for(int i = 1; i <= q; i ++){
int opt;
scanf("%d%*c", &opt);
ll s = 1;
char ch;
while((ch = getchar()) != ' ')
s = s * 10 + ch - '0';
int v;
scanf("%d", &v);
if(opt == 0){
if(mp.find(s) == mp.end()){
data[++cnt] = v;
u[cnt] = s;
mp[s] = cnt;
r[tail] = cnt;
l[cnt] = tail;
r[cnt] = 0;
tail = cnt;
printf("%d\n", v);
if(sum == 0)
front = cnt;
++ sum;
}
else {
int k = mp[s];
printf("%d\n", data[k]);
if(sum > 1){
if(k == front)
front = r[k];
if(k != tail){
r[l[k]] = r[k];
l[r[k]] = l[k];
r[tail] = k;
l[k] = tail;
r[k] = 0;
tail = k;
}
}
}
if(sum > m){
-- sum;
mp.erase(u[front]);
front = r[front];
l[front] = 0;
}
}
else {
if(mp.find(s) == mp.end()){
puts("Invalid");
continue;
}
int k = mp[s];
if(v == -1){
if(l[k])
printf("%d\n", data[l[k]]);
else
puts("Invalid");
}
else if(v == 0){
printf("%d\n", data[k]);
}
else {
if(r[k])
printf("%d\n", data[r[k]]);
else
puts("Invalid");
}
}
}
mp.clear();
}
return 0;
}

2019牛客多校第三场J-LRU management(map+双向链表)的更多相关文章

  1. 牛客多校第三场J LRU management(双向链表)题解

    题意: 给一个长度为\(m\)的队列,现给定以下操作: \(opt=0\),插入一个串,如果不在队里直接插入栈尾,如果超出\(m\)删队首:在队里就拿出来重新放到队尾,返回\(v\)值. \(opt= ...

  2. 2019牛客多校第三场 F.Planting Trees

    题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...

  3. 2019牛客多校第三场D BigInteger——基础数论

    题意: 用  $A(n)$ 表示第 $n$ 个只由1组成分整数,现给定一个素数 $p$,求满足 $1 \leq i\leq n, 1 \leq j \leq m, A(i^j) \equiv 0(mo ...

  4. [2019牛客多校第三场][G. Removing Stones]

    题目链接:https://ac.nowcoder.com/acm/contest/883/G 题目大意:有\(n\)堆石头,每堆有\(a_i\)个,每次可以选其中两堆非零的石堆,各取走一个石子,当所有 ...

  5. [题解]Magic Line-计算几何(2019牛客多校第三场H题)

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示 ...

  6. [题解]Crazy Binary String-前缀和(2019牛客多校第三场B题)

    题目链接:https://ac.nowcoder.com/acm/contest/883/B 题意: 给你一段长度为n,且只有 ‘0’ 和 ‘1’ 组成的字符串 a[0,...,n-1].求子串中 ‘ ...

  7. 2019牛客多校第三场A Graph Games 分块思想

    题意:给你一张无向图,设s(x)为与x直接相连的点的集合,题目中有两种操作: 1:1 l r 将读入的边的序列中第l个到第r个翻转状态(有这条边 -> 没这条边, 没这条边 -> 有这条边 ...

  8. 启发式分治:2019牛客多校第三场 G题 Removing Stones

    问题可以转换为求有多少个区间数字的总和除2向下取整大于等于最大值.或者解释为有多少个区间数字的总和大于等于最大值的两倍(但是若区间数字总和为奇数,需要算作减1) 启发式分治: 首先按最大值位置分治,遍 ...

  9. 2019牛客多校第三场B-Crazy Binary String(前缀和+思维)

    Crazy Binary String 题目传送门 解题思路 把1记为1,把0记为-1,然后求前缀和,前缀和相等的就说明中间的01数一样.只要记录前缀和数值出现的位置即可更新出答案. 代码如下 #in ...

  10. 2019牛客多校第三场H-Magic Line

    Magic Line 题目传送门 解题思路 因为坐标的范围只有正负1000,且所有点坐标都是整数,所以所有点相连构成的最大斜率只有2000,而我们能够输出的的坐标范围是正负10^9.所以我们先把这n个 ...

随机推荐

  1. Python做单元测试小实例

    import sys#先定义一个函数,这个函数是计算高*宽,并返回计算结果def test(hight,width):    return hight*width #这是程序启动函数入口,给要测试的函 ...

  2. sublime useful packages

    Package control Prefixr Emmet

  3. 初步认识AutoMapper转载 https://www.cnblogs.com/fred-bao/p/5700776.html

    初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象   前言 通常 ...

  4. thymeleaf时间戳转换

    <span th:text="${#dates.format(curDate, 'yyyy-MM-dd HH:mm:ss')}"></span> <t ...

  5. 以您熟悉的编程语言为例完成一个hello/hi的简单的网络聊天程序

    Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信,应用程序通常通过"套接字"向网络发出 ...

  6. Django框架(二十一)—— Django rest_framework-权限组件

    目录 Django rest_framework-权限组件 一.权限组件的使用 1.使用语法 2.全局使用.局部使用.局部禁用权限 二.源码分析 1.Book中没有as_view 2.APIView的 ...

  7. java 重新学习 (六)

    一.java7以后,使用带泛型的接口,类定义变量,那么调用构造器创建对象时构造器的后面不必带上泛型.List<String> list = new ArrayList()<>; ...

  8. UVA_548Tree

    这是一个很经典的建树,然而当时不会!!!! 给你一个中序和后序 先建一个二叉树,然后找最优解(最优解就是一个叶子节点到根节点权值最小, 同时本身权值最小) //生成一棵树 int build(int ...

  9. 可重入锁:ReentrantLock理解使用

    (一)可重入性 可重入性描述这样的一个问题:一个线程在持有一个锁的时候,它内部能否再次(多次)申请该锁.如果一个线程已经获得了锁,其内部还可以多次申请该锁成功.那么我们就称该锁为可重入锁.通过以下伪代 ...

  10. python 3和python 2 的不同之 f - strings

    python3.6版本及以上版本才能使用 f "{}{}{}" f-string 格式化输出