博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019牛客暑期多校训练营(第三场)- LRU management
阅读量:4952 次
发布时间:2019-06-11

本文共 3023 字,大约阅读时间需要 10 分钟。

模拟 + 双向链表 + map

根据提议模拟一个双向链表,用map映射下节点的地址就好啦。

有点卡时间,cin取消同步还是一直T,改成scanf才过。

#include 
#define INF 0x3f3f3f3f#define full(a, b) memset(a, b, sizeof a)#define FAST_IO ios::sync_with_stdio(false)using namespace std;typedef long long LL;inline int lowbit(int x){ return x & (-x); }inline int read(){ int ret = 0, w = 0; char ch = 0; while(!isdigit(ch)){ w |= ch == '-', ch = getchar(); } while(isdigit(ch)){ ret = (ret << 3) + (ret << 1) + (ch ^ 48); ch = getchar(); } return w ? -ret : ret;}inline int lcm(int a, int b){ return a / __gcd(a, b) * b; }template
inline A fpow(A x, B p, C lyd){ A ans = 1; for(; p; p >>= 1, x = 1LL * x * x % lyd)if(p & 1)ans = 1LL * x * ans % lyd; return ans;}int _, q, m, opt, v, size;char str[20];struct Node{ LL index; int val; Node *prev, *next; Node(){} Node(LL index, int val, Node *prev, Node *next): index(index), val(val), prev(prev), next(next){}}*head, *tail;unordered_map
um;inline void initialize(){ um.clear(); size = 0; head = new Node(); tail = new Node(); head->next = tail; tail->prev = head;}inline void insert(Node *p, int val, LL index){ auto *cur = new Node(index, val, p->prev, p); um[index] = cur; p->prev = cur; cur->prev->next = cur;}inline void remove(Node *p){ p->prev->next = p->next; p->next->prev = p->prev; um.erase(p->index); delete p;}inline void calc(Node *p){ p->prev->next = p->next; p->next->prev = p->prev; p->prev = tail->prev, p->next = tail; p->prev->next = p, tail->prev = p;}int main(){ //FAST_IO, cin.tie(0); for(scanf("%d", &_); _; _ --){ scanf("%d%d", &q, &m); initialize(); while(q --){ scanf("%d%s%d", &opt, str, &v); int t = strlen(str); LL index = atoll(str) + 100000000000LL * t; if(opt == 0){ if(um.find(index) == um.end()){ insert(tail, v, index); size ++; if(size > m) remove(head->next), size --; printf("%d\n", v); } else{ auto *addr = um[index]; printf("%d\n", addr->val); calc(addr); } } else{ if(um.find(index) == um.end()){ printf("Invalid\n"); } else{ auto *addr = um[index]; if(v == -1 && addr->prev != head){ printf("%d\n", addr->prev->val); } else if(v == 0){ printf("%d\n", addr->val); } else if(v == 1 && addr->next != tail){ printf("%d\n", addr->next->val); } else printf("Invalid\n"); } } } } return 0;}

转载于:https://www.cnblogs.com/onionQAQ/p/11249426.html

你可能感兴趣的文章
linux系统安装nginx
查看>>
FZU 1894 志愿者选拔【单调队列】【monotone decreasing queue】
查看>>
Mac下Android studio 之NDK配置教程(一)
查看>>
Java随机验证吗
查看>>
C++简易
查看>>
VS 2010项目中添加lib库 【转】http://blog.csdn.net/w174504744/article/details/7368169
查看>>
IIS下PHP的ISAPI和FastCGI比较
查看>>
Masonry中的mas_makeConstraints方法
查看>>
百度、高德地图数据源是哪里?
查看>>
第二章 Vue快速入门--10-11 跑马灯效果制作
查看>>
将BUG管理工具(禅道)部署到服务器(测试服务器、云服务器)
查看>>
php并发编程相关扩展
查看>>
文件显示cat
查看>>
vs密匙
查看>>
20159313《网络攻击与防范》第四周学习总结
查看>>
python--random
查看>>
【WPF】学习笔记(二)——依旧是一个电子签名板
查看>>
张飞的流水帐日记【分享】
查看>>
单片机成长之路(51基础篇) - 016 常见总线类型
查看>>
数据结构——Currency System in Geraldion
查看>>