zoukankan      html  css  js  c++  java
  • [LOJ] 分块九题 6

    单点插入,单点查询。

    优化了的链表。

    链表老写错,干脆用vector,也不算慢。

    注意链表退化的问题,及时(比如操作根号n次)就重新建块,实测速度可以提高一倍,这还是数据随机的情况,若涉及大量同一位置插入,会让分块大大退化。

    build没必要写两个。

    //Stay foolish,stay hungry,stay young,stay simple
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<cctype>
    #include<vector>
    #define vit vector<int>::iterator
    using namespace std;
    
    const int MAXN=500005;
    
    inline int read_d(){
        int ret=0,f=1;char c;
        while(c=getchar(),!isdigit(c)) f=c=='-'?-1:1;
        while(isdigit(c)){
            ret=ret*10+c-'0';
            c=getchar();
        }
        return ret*f;
    }
    
    int n;
    int block,num;
    vector<int> lis[1000];
    int a[MAXN];
    
    void build(int pos){
        block=sqrt(n);
        num=n/block;
        if(n%block) num++;
        for(int i=1;i<=num;i++){
            for(vit it=lis[i].begin();it!=lis[i].end();it++)
                a[++pos]=*it;
            lis[i].clear();
        }
        for(int i=1;i<=num;i++)
            for(int j=(i-1)*block+1;j<=i*block&&j<=n;j++)
                lis[i].push_back(a[j]);     
    } 
    
    int query(int x){
        int pos=1,siz=0;
        while(siz+lis[pos].size()<x) siz+=lis[pos++].size();
        return lis[pos][x-siz-1];
    }
    
    int tim;
    void updata(int x,int w){
        int pos=1,siz=0;tim++;n++;
        while(siz+lis[pos].size()<x) siz+=lis[pos++].size();
        lis[pos].insert(lis[pos].begin()+x-siz-1,w); 
        if(tim>block) build(0),tim=0;
    }
    
    int main(){
        n=read_d();
        for(int i=1;i<=n;i++) a[i]=read_d();
        build(n);
        int T=n;
        for(int i=1;i<=T;i++){
            int q=read_d(),x=read_d(),y=read_d(),z=read_d();
            if(q==0) updata(x,y);
            else printf("%d
    ",query(y));
        }
        return 0;
    }
    

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247435.html

  • 相关阅读:
    Nginx调试入门
    Nginx自动安装脚本
    Centos7.3自动化脚本安装MySQL5.7
    复制多行内容到文本
    Windows常用命令
    C++笔试题
    loadrunner和QTP视频教程汇总
    mysql-connector-java-5.1.22下载
    struts学习笔记
    Hibernate原理
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247435.html
Copyright © 2011-2022 走看看