2019牛客暑期多校训练营(第三场)- LRU management

模拟 + 双向链表 + map

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

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

#include <bits/stdc++.h>
#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 <typename A, typename B, typename C>
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<LL, Node*> 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;
}

猜你喜欢

转载自www.cnblogs.com/onionQAQ/p/11249426.html