2019牛客多校第三场J-LRU management(map+双向链表)
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+双向链表)的更多相关文章
- 牛客多校第三场J LRU management(双向链表)题解
题意: 给一个长度为\(m\)的队列,现给定以下操作: \(opt=0\),插入一个串,如果不在队里直接插入栈尾,如果超出\(m\)删队首:在队里就拿出来重新放到队尾,返回\(v\)值. \(opt= ...
- 2019牛客多校第三场 F.Planting Trees
题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^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 ...
- [2019牛客多校第三场][G. Removing Stones]
题目链接:https://ac.nowcoder.com/acm/contest/883/G 题目大意:有\(n\)堆石头,每堆有\(a_i\)个,每次可以选其中两堆非零的石堆,各取走一个石子,当所有 ...
- [题解]Magic Line-计算几何(2019牛客多校第三场H题)
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示 ...
- [题解]Crazy Binary String-前缀和(2019牛客多校第三场B题)
题目链接:https://ac.nowcoder.com/acm/contest/883/B 题意: 给你一段长度为n,且只有 ‘0’ 和 ‘1’ 组成的字符串 a[0,...,n-1].求子串中 ‘ ...
- 2019牛客多校第三场A Graph Games 分块思想
题意:给你一张无向图,设s(x)为与x直接相连的点的集合,题目中有两种操作: 1:1 l r 将读入的边的序列中第l个到第r个翻转状态(有这条边 -> 没这条边, 没这条边 -> 有这条边 ...
- 启发式分治:2019牛客多校第三场 G题 Removing Stones
问题可以转换为求有多少个区间数字的总和除2向下取整大于等于最大值.或者解释为有多少个区间数字的总和大于等于最大值的两倍(但是若区间数字总和为奇数,需要算作减1) 启发式分治: 首先按最大值位置分治,遍 ...
- 2019牛客多校第三场B-Crazy Binary String(前缀和+思维)
Crazy Binary String 题目传送门 解题思路 把1记为1,把0记为-1,然后求前缀和,前缀和相等的就说明中间的01数一样.只要记录前缀和数值出现的位置即可更新出答案. 代码如下 #in ...
- 2019牛客多校第三场H-Magic Line
Magic Line 题目传送门 解题思路 因为坐标的范围只有正负1000,且所有点坐标都是整数,所以所有点相连构成的最大斜率只有2000,而我们能够输出的的坐标范围是正负10^9.所以我们先把这n个 ...
随机推荐
- python singleton 4种单例
def singleton(cls, *args, **kwargs): instances = {} def inner(cls, *args, **kwargs): if cls not in i ...
- MySQL-视图上进行增删改查
https://dev.mysql.com/doc/refman/5.7/en/view-updatability.html https://dev.mysql.com/doc/refman/8.0/ ...
- 33. 构建第一个job
1.点击 New Item 2.Enter an item name 输入一个name,点击Freestyle project 3.我们可以输入一个描述,点击Advanced 4.勾选Use cust ...
- 安装项目依赖pipreqs并生成requirements.txt
安装项目依赖:sudo pip3 install pipreqs 生成依赖文件(requirements.txt):pipreqs ./ # 进入项目目录,在项目文件夹里生成安装依赖文件里的环境: ...
- VS2008中所有快捷键
转载自:http://itfocus.diandian.com/post/2011-09-16/5091994 微软开发环境的可视化界面做的很全面,几乎所有的操作都可以通过可视化界面完成,但是你是否在 ...
- ASP.NET MVC 学习笔记之面向切面编程与过滤器
AOP(面向切面)是一种架构思想,用于把公共的逻辑放到一个单独的地方,这样就不用每个地方都写重复的代码了.比如程序中发生异常,不用每个地方都try…catch 只要在Golbal的Applicatio ...
- 实现一个EventEmitter类,这个类包含以下方法: on/ once/fire/off
实现一个EventEmitter类,这个类包含以下方法: on(监听事件,该事件可以被触发多次)- once(也是监听事件,但只能被触发一次)- fire(触发指定的事件)- off(移除指定事件的某 ...
- 停止node进程
运行vue-cli项目的时候经常出现端口号占用,npm run dev报错的信息, 此时可通过任务管理器粗暴的杀死node进程,也可以通过cmd检测占用某个端口的程序,进而杀死该进程,步骤如下: 1. ...
- JS window对象 Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本。
Navigator对象 Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本. 对象属性: 查看浏览器的名称和版本,代码如下: <script type=" ...
- mysql几个常见错误记录
select时找不到表:大小写问题 show variables like '%lower_case_table_names%'; MySQL表名大小写敏感导致的问题 使用help_topic时的se ...