块状链表题*1

poj 2887

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>
#define N 1000010
#define M 2005
using namespace std;

class ListTable{
    public:
    char ch[N];
    int sum[N];
    int num;
    int n,m;
    struct ListBlock{
        int size;
        char data[M];
        void push_back(char c){
            size++;
            data[size]=c;
        }
        void insert(int pos,char c){
            for(int i=size+1;i>pos;i--)
                data[i]=data[i-1];
            data[pos]=c;
            size ++;
        }
        char getData(int pos){
            return data[pos];
        }
    };
    ListBlock block[M];
    void maintain(){
        for(int i=1;i<=num;i++)
            sum[i]=sum[i-1]+block[i].size;
    }
    void init(){
        num=sqrt((n+m)*1.0)+1;
        for(int i=0;i<n;i++)
            block[i/num+1].push_back(ch[i]);
        maintain();
    }
    char query(int pos,int number){
        return block[number].getData(pos);
    }
    void insert(int pos,int number,char c){
        block[number].insert(pos,c);
    }
    char Query(int pos){
        int p=lower_bound(sum+1,sum+1+num,pos)-sum;
        return query(pos-sum[p-1],p);
    }
    void Insert(char c,int pos){
        int p=lower_bound(sum+1,sum+1+num,pos)-sum;
        insert(pos-sum[p-1] ,p,c);
        maintain();
    }
}f;

int main(){
    scanf("%s",f.ch);
    f.n=strlen(f.ch);
    scanf("%d",&f.m);
    f.init();
    char s[3];
    char c[3];
    int p;
    for(int i=0;i<f.m;i++){
        scanf("%s",s);
        if(s[0]=='Q'){
            scanf("%d",&p);
            printf("%c\n",f.Query(p));
        }
        else{
            scanf("%s%d",c,&p);
            f.Insert(c[0],p);
        }
    }
    return 0;
}
时间: 2024-10-20 14:24:25

块状链表题*1的相关文章

经典算法题每日演练——第二十五题 块状链表

原文:经典算法题每日演练--第二十五题 块状链表 在数据结构的世界里,我们会认识各种各样的数据结构,每一种数据结构都能解决相应领域的问题,每一种数据结构都像 是降龙十八掌中的某一掌,掌掌毙命... 当然每个数据结构,有他的优点,必然就有它的缺点,那么如何创造一种数据结构 来将某两种数据结构进行扬长避短,那就非常完美了.这样的数据结构也有很多,比如:双端队列,还有就是今天讲的 块状链表, 我们都知道 数组 具有 O(1)的查询时间,O(N)的删除,O(N)的插入... 链表 具有 O(N)的查询时

c++之路——块状链表(教主的魔法)

F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ建立在Linux平台下,而许多题的数据在Windows下制作,请注意输入.输出语句及数据类型及范围,避免无谓的RE出现. 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 711  Solved: 309[Submit][Stat

poj 2887 块状链表

块状链表第一题,懒得写成链表形式的,所以写成了静态链表. 思想还是很简单的,就是进行分块查找和插入,和建立索引有点像,复杂度是根号的,实现起来比较容易,由于这个题插入操作不多,所以没有写split函数, 因为没有删除操作,所以也没有写union函数,随后有空再补上吧. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namesp

【HDU4391】【块状链表】Paint The Wall

Problem Description As a amateur artist, Xenocide loves painting the wall. The wall can be considered as a line consisting of n nodes. Each node has its own color. Xenocide spends all day in front of the wall. Sometimes, he paints some consecutive no

poj 2828 块状链表

这个题是真正可以体现出块状链表的优点.数组定位快但是插入慢,而链表插入快却定位慢.块状链表正是结合了数组和链表的优点将定位和插入的复杂度变成了sqrt(n). 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 750; 7 int b[N][N]; 8 int sz[N]; 9 int next[N]; 10 in

【BZOJ3295】【块状链表+树状数组】动态逆序对

Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数. Input 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数.以下n行每行包含一个1到n之间的正整数,即初始排列.以下m行每行一个正整数,依次为每次删除的元素. Output 输出包含m行,依次为删除每个元素之前,逆序对的个数. Sample Input 5 4 1 5 3

【块状链表】【权值分块】bzoj3065 带插入区间K小值

显然是块状链表的经典题.但是经典做法的复杂度是O(n*sqrt(n)*log(n)*sqrt(log(n)))的,出题人明确说了会卡掉. 于是我们考虑每个块内记录前n个块的权值分块. 查询的时候差分什么的,复杂度就是O(n*sqrt(n))的了. 插入的时候为了防止块过大,要考虑裂块(细节较多). 感谢bzoj提供O2,我的STL块链才能通过(list+vector). #include<cstdio> #include<list> #include<vector> #

【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y): l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).r = max ( ((x+lastans) mod N)+1 , ((y+last

【POJ2887】【块状链表】Big String

Description You are given a string and supposed to do some string manipulations. Input The first line of the input contains the initial string. You can assume that it is non-empty and its length does not exceed 1,000,000. The second line contains the