块状链表

Posted Grary

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了块状链表相关的知识,希望对你有一定的参考价值。

块状链表作为一种集成了链表和分块的数据结构,

有着非常优秀的性质

查询和删除都是$O(\sqrt )$复杂度的

需要支持的操作

1.创建一个新节点

2.插入一个新节点

3.删除一个旧节点

4.向已知节点中加入新值

5.删除已知节点中某些值

6.合并某两个相邻的节点

7.把一个节点分离成两个


我们同样需要一个"缓存区"

用于存储初始数据和交换数据

这其中某些操作可以通过其他几种操作组合得来

例如分离两个节点可以删除这个节点,

同时将这个节点中的数据缓存到缓存区

然后创建新节点将缓存区内的数据读取到新节点

所以这个代码好难写……233333

#include<iostream>
#include<cstring>
#include<cstdio>
#define N 5555
using namespace std;

int data[N*N];

struct Block{
    int s[N],len;
};

class BlockList{
    struct Node{
        ListNode* nxt,pre;
        Block data;
    };
    Node* head,tail;
    int len;
    Block newBlock(int n){//Build and read the data from the cache to initialize the new block;
        Block now.len=n;
        for(int i=0;i<n;++i)
            now.s[i]=data[i];
    }
    Node* newnode(int n){//Build and initialize a new ListNode;
        Node* now=(Node*)malloc(sizeof(Node));
        now->nxt=now->pre=NULL;
        now->data=newBlock(n);
        return now;
    }
    BlockList(){//Initialize the BlockList;
        head=newnode(0);
        tail=newnode(0);
        head->nxt=tail;tail->pre=head;
    }
    bool LDTTA(int x){//Load the x‘th data to the cache;
        if(len<x)return false;
        Node* now=head;
        for(int i=0;i<x;++i)
            now=now->nxt;
        for(int i=0;i<now->data.len;++i)
            data[i]=now->data.s[i];
    }
    bool LDTTA(Node* root){//Load root‘ data to the cache;
        if(root==NULL)return false;
        for(int i=0;i<now->data.len;++i)
            data[i]=now->data.s[i];
    }
    bool InsertANode(Node* root,int n){//Insert a new n‘size Node after the Node* root;
        if(root==tail)return false;
        if(root==NULL)return false;
        Listnode* in=newnode(n);
        Listnode* tmp=root->nxt;
        in->nxt=tmp;in->pre=root;
        root->nxt=in;tmp->pre=in;
        len++;
        return true;
    }
    bool Delete(Node* root){//Detele the Node root and Load the date from the root to the cache;
        elem->pre->nxt=elem->nxt;
        elem->nxt->pre=elem->pre;
        if(elem==head)head=elem->nxt;
        if(elem==tail)tail=elem->pre;
        LDTTA(root);free(elem);
    }
};

以上是关于块状链表的主要内容,如果未能解决你的问题,请参考以下文章

Python数据结构与算法(附录)——块状链表的动态调整

块状链表

1507: [NOI2003]Editor(块状链表)

BZOJ-3337ORZJRY I 块状链表

LOJ.6282.数列分块入门6(块状链表/分块)

分块,莫队,BSGS,块状链表