https://ac.nowcoder.com/acm/contest/883/J

根据这个数据结构的特点,也就是计算机组成原理里面学过的cache的LRU管理算法,每次访问都会在cache中查询一页,查询成功则调用该页的值并将该页移动到删除队列的尾部。否则直接加载该页在删除队列的尾部,当队列满时弹出队首。另一种操作是查询到某页后调用其、或其前一页、或其后一页,失败均返回Invalid。

那么一个可以删除中间元素的队列,明显用链表实现,而且要其前一页、后一页,那就双向链表。因为链表的瓶颈在于查询,而这道题的特点可以使用其他数据结构加速查询的过程。这里都是短的字符串,可以用unordermap或者trie来维护“字符串对应的链表节点”。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn = 500010;
  5. const int maxm = 5000010;
  6. const int FAIL = -100;
  7. struct ListNode;
  8. struct TrieNode {
  9. TrieNode *ch[10];
  10. ListNode *lid;
  11. };
  12. struct Trie {
  13. TrieNode tn[maxm], *root;
  14. int top;
  15. inline void Init() {
  16. top = 0;
  17. root = NewNode();
  18. }
  19. inline TrieNode *NewNode() {
  20. for(int i=0;i<10;++i)
  21. tn[top].ch[i]=nullptr;
  22. tn[top].lid = nullptr;
  23. return &tn[top++];
  24. }
  25. inline TrieNode *Insert(char *s, ListNode *lid) {
  26. TrieNode *cur = root;
  27. int len=strlen(s);
  28. for(int i = 0; i < len; ++i) {
  29. int c = s[i] - '0';
  30. if(!cur->ch[c])
  31. cur->ch[c] = NewNode();
  32. cur = cur->ch[c];
  33. }
  34. cur->lid = lid;
  35. return cur;
  36. }
  37. inline TrieNode *Query(char *s) {
  38. TrieNode *cur = root;
  39. int len=strlen(s);
  40. for(int i = 0; i < len; ++i) {
  41. int c = s[i] - '0';
  42. if(!cur->ch[c])
  43. return nullptr;
  44. cur = cur->ch[c];
  45. }
  46. return cur;
  47. }
  48. } T;
  49. struct ListNode {
  50. ListNode *prev, *next;
  51. int val;
  52. TrieNode *tid;
  53. };
  54. struct List {
  55. ListNode ln[maxm];
  56. ListNode *head, *tail;
  57. int top, size;
  58. void Init() {
  59. //head,tail都是虚拟节点
  60. top = 0, size = 0;
  61. head = NewNode(-1, nullptr, nullptr, &ln[1]);
  62. tail = NewNode(-1, nullptr, &ln[0], nullptr);
  63. }
  64. ListNode *NewNode(int val, TrieNode *tid, ListNode *prev, ListNode *next) {
  65. ln[top].val = val;
  66. ln[top].tid = tid;
  67. ln[top].prev = prev;
  68. ln[top].next = next;
  69. return &ln[top++];
  70. }
  71. void Append(int val, TrieNode * tid) {
  72. Insert(val, tid, tail->prev);
  73. }
  74. void Insert(int val, TrieNode *tid, ListNode *pn) {
  75. //在pn后面插入
  76. ListNode *newNode = NewNode(val, tid, pn, pn->next);
  77. pn->next->prev = newNode;
  78. pn->next = newNode;
  79. ++size;
  80. }
  81. void Delete(ListNode *pn) {
  82. //删除pn
  83. pn->prev->next = pn->next;
  84. pn->next->prev = pn->prev;
  85. --size;
  86. }
  87. } L;
  88. int M;
  89. char s[105];
  90. inline int OP0(int _val) {
  91. TrieNode *x = T.Query(s);
  92. int val;
  93. if(!x||!x->lid) {
  94. val = _val;
  95. if(L.size == M) {
  96. L.head->next->tid->lid = nullptr;
  97. L.Delete(L.head->next);
  98. }
  99. L.Append(val, nullptr);
  100. L.tail->prev->tid = T.Insert(s, L.tail->prev);
  101. } else {
  102. ListNode *y = x->lid;
  103. val = y->val;
  104. L.Delete(y);
  105. L.Append(val, x);
  106. x->lid = L.tail->prev;
  107. }
  108. return val;
  109. }
  110. inline int OP1(int _val) {
  111. TrieNode *x = T.Query(s);
  112. if(!x)
  113. return FAIL;
  114. ListNode *y = x->lid;
  115. if(!y)
  116. return FAIL;
  117. if(_val > 0) {
  118. y = y->next;
  119. if(y == L.tail)
  120. return FAIL;
  121. return y->val;
  122. }
  123. if(_val < 0) {
  124. y = y->prev;
  125. if(y == L.head)
  126. return FAIL;
  127. return y->val;
  128. }
  129. return y->val;
  130. }
  131. int main() {
  132. #ifdef local
  133. freopen("a.txt", "r", stdin);
  134. #endif // Yinku
  135. int t, q, op, v;
  136. scanf("%d", &t);
  137. while(t--) {
  138. T.Init();
  139. L.Init();
  140. scanf("%d%d", &q, &M);
  141. for(int i = 0; i < q; ++i) {
  142. scanf("%d%s%d", &op, s, &v);
  143. if(!op)
  144. printf("%d\n", OP0(v));
  145. else {
  146. int ans = OP1(v);
  147. if(ans == FAIL)
  148. puts("Invalid");
  149. else
  150. printf("%d\n", ans);
  151. }
  152. }
  153. }
  154. return 0;
  155. }

2019牛客暑期多校训练营(第三场) - J - LRU management - 模拟的更多相关文章

  1. 2019牛客暑期多校训练营(第三场)H题目

    题意:给你一个N×N的矩阵,求最大的子矩阵 满足子矩阵中最大值和最小值之差小于等于m. 思路:这题是求满足条件的最大子矩阵,毫无疑问要遍历所有矩阵,并判断矩阵是某满足这个条件,那么我们大致只要解决两个 ...

  2. 2019牛客暑期多校训练营(第三场)- F Planting Trees

    题目链接:https://ac.nowcoder.com/acm/contest/883/F 题意:给定n×n的矩阵,求最大子矩阵使得子矩阵中最大值和最小值的差值<=M. 思路:先看数据大小,注 ...

  3. 2019牛客暑期多校训练营(第三场) F.Planting Trees(单调队列)

    题意:给你一个n*n的高度矩阵 要你找到里面最大的矩阵且最大的高度差不能超过m 思路:我们首先枚举上下右边界,然后我们可以用单调队列维护一个最左的边界 然后计算最大值 时间复杂度为O(n*n*n) # ...

  4. 2019牛客暑期多校训练营(第六场)J Upgrading Technology

    传送门 题意: 就是给你n个技能,每个技能最高升到m级,每升一级就是耗费Cij钱,这个Cij可能是负的,如果所有技能都升到或者说超过j等级,就会获得Dj钱,这个Dj也有可能是负值,让你求你最多得到多少 ...

  5. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  6. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  7. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  8. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  9. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  10. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

随机推荐

  1. 【BZOJ1563】诗人小G(决策单调性DP)

    题意:给定N,L,P,求f[N] sum[i]递增,L<=3e6,P<=10 思路:四边形不等式的证明见https://www.byvoid.com/zhs/blog/noi-2009-p ...

  2. 洛谷P1199 三国游戏——题解

    题目传送 显然,在这样的数据范围下搜索是没希望的了.好好分析一下,发现小涵时不可能拿到与一个武将最默契的另一个武将了.所以考虑一下默契值次大的一对武将. 显然,对每一个武将来说,小涵是可以拿到默契值次 ...

  3. 纯CSS写的各种小三角和小箭头

    头朝下的小三角 width:0; height:0; border:50px solid transparent; //所有border都是透明的, border-top-color:black; / ...

  4. 3D Computer Grapihcs Using OpenGL - 04 First Triangle

    本节将绘制一个三角形 先看最终代码: MyGlWindow.cpp: #include <gl\glew.h> #include "MyGlWindow.h" void ...

  5. SQLSTATE[HY000] [2002] No such file or directory

    正常的解决办法.. 只需将laravel配置文件中的host 127.0.0.1改成localhost就可以: 'mysql' => array(            'driver'    ...

  6. 图论&线性基(?)(8.12)

    边没有负权,最短路最多只有n条边 很暴力的思想: 先跑一遍最短路,找出最短路上的边,枚举每条边,翻倍,放进原图再跑一遍.取最大值 好熟悉啊 分层建图,建k层 每层内部是原图 若原图中u到v有连边,则由 ...

  7. After laptop installed fedora23

    en_US.UTF-8和 zh_CN.UTF-8 en和zh是语言, US和CN是分地区. 两者的编码UTF-8都差不多.只是用语言环境来表示时间, 数字, 温度等的不同 自定义程序快捷键: 在选中条 ...

  8. nacos 使用 servlet 异步处理客户端配置长轮询

    config 客户端 ClientWorker#ClientWorker 构造方法中启动定时任务 ClientWorker.LongPollingRunnable 长轮询的任务,在 run 方法的结尾 ...

  9. redis集群安装多端口多实例部署

    目标(本文达成的结果,配对关系可能会变): 先在131上进行操作 1.下载redis http://download.redis.io/releases/redis-5.0.2.tar.gz 2.解压 ...

  10. laravel 设置自定义 Validator

    转自:https://learnku.com/docs/laravel/5.4/validation/1234#custom-validation-rules 自定义验证规则 Laravel 提供了许 ...