Loj_6282. 数列分块入门 6
这个题目涉及到了块的重构,这里使用了\(\sqrt{n}\)次插入便重构的方法
讲重复的操作提出来做了函数
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
const int maxn=101000;
const int inf=0x7fffffff;
struct Point
{
    int l;
    int r;
    int val;
};
struct Square
{
    int begin;
    int size;
};
Point base[maxn<<1];
Square squ[maxn>>2];
int tail,size,belong[maxn<<1];
int n,sum;
void input()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&base[i].val);
        base[i].l=i-1;
        base[i].r=i+1;
    }
    base[0].r=1;base[0].l=n;//0号位置是开头
    base[n].r=inf;//inf是链表结束标志
    sum=n+1;tail=n;//加一
    return ;
}//输入
void init()
{
    size=floor(sqrt(sum));
    int now=size,Belong=0;
    for(int i=0;i!=inf;i=base[i].r)
    {
        ++now;
        if(now==size+1)//达到了块的个数
        {
            now=1,++Belong;//下一个块
            squ[Belong].begin=i;
            squ[Belong].size=0;
        }
        belong[i]=Belong;
        ++squ[Belong].size;
    }
    return ;
}
void insert(int l,int r,int val)//在l,r中插入val
{
    ++squ[belong[l]].size;
    base[++tail].val=val;
    base[tail].l=l;
    base[tail].r=r;
    base[l].r=tail;
    base[r].l=tail;
    belong[tail]=belong[l];//从属于前一个块
    return ;
}
int contain(int &pos)//返回从左往右数第pos个元素在哪一个块里,然后利用引用,讲pos变为在块中的第几个元素
{
    int res=1;
    while(pos>squ[res].size)    pos-=squ[res++].size;
    return res;
}
int position(int K,int pos)//第k个块的第pos个元素
{
    int res=squ[K].begin,i=1;
    while(i<pos)
    {
        res=base[res].r;
        i++;
    }
    return res;//返回标号
}
void Insert(int pos,int val)
{
    int from=contain(pos);
    int which=position(from,pos);
    insert(base[which].l,which,val);
    return ;
}
void Ask(int pos)
{
    int from=contain(pos);
    int which=position(from,pos);
    printf("%d\n",base[which].val);
    return ;
}
void solve()
{
    int a,b,c,d,T=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        if(a==0)    Insert(b+1,c),++T,++sum;
        else    Ask(c+1);
        if(T==size) init(),T=0;
    }
    return ;
}
int main()
{
    input();
    init();
    solve();
}
Loj_6282. 数列分块入门 6的更多相关文章
- LOJ6277~6285 数列分块入门
		Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列, ... 
- 数列分块入门九题(三):LOJ6283~6285
		Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ... 
- 数列分块入门九题(二):LOJ6280~6282
		Preface 个人感觉这中间的三题是最水的没有之一 数列分块入门 4--区间加法,区间求和 这个也是很多数据结构完爆的题目线段树入门题,但是练分块我们就要写吗 修改还是与之前类似,只不过我们要维护每 ... 
- 数列分块入门九题(一):LOJ6277~6279
		Preface 分块,一个神奇的暴力算法.可以把很多\(O(n^2)\)的数据结构题的暴力优化到常数极小的\(O(n\sqrt n)\).当一些毒瘤题无法用线段树,主席树,平衡树,树状数组...... ... 
- LOJ6285 数列分块入门9(分块)
		昨天对着代码看了一晚上 然后今天终于在loj上过了 数列分块入门9题撒花★,°:.☆( ̄▽ ̄)/$:.°★ . 然后相当玄学 块的大小调成\(\sqrt{n}\)会TLE,改成150就过了 啧 然后就 ... 
- LOJ 6277:数列分块入门 1(分块入门)
		#6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ... 
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
		#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ... 
- LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
		#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ... 
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
		#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ... 
随机推荐
- Java 时区转换(UTC+8 到 UTC 等等)
			前言:需要做时区转换,知道北京为UTC+8,东京为UTC+9,世界标准时间为UTC,所以下面的代码是只需要知道时区是+8还是+9还是0就可以了,不需要使用"CTT". " ... 
- redux实现原理
			redux基本概念 基本概念 1.store 用来保存数据的地方,使用createStore来生成数据 store = createStore(fn) 2.state,通过拷贝store中的数据得到 ... 
- javascript变量的引用类型值
			JavaScript变量可以用来保存俩种类型的值:基本类型和引用类型值 前言 JS变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自一下5种基本数据类型:Underfined.Nu ... 
- php 在字符串指定位置插入新字符
			因为项目用到DataTable表格加载后台数据,要连表查询虚拟机选中的策略状态,所以想到先把策略表内容取出来,组成一个'<select><option value="1&q ... 
- Jmeter入门(一)————线程组配置
			线程组相当于有多个用户,同时去执行相同的一批次任务.每个线程之间都是隔离的,互不影响的.一个线程的执行过程中,操作的变量,不会影响其他线程的变量值. Delay Thread creation unt ... 
- Azure 虚拟机上的 SQL Server 常见问题
			本主题提供有关运行 Azure 虚拟机中的 SQL Server 时出现的一些最常见问题的解答. 如果本文未解决你的 Azure 问题,请访问 MSDN 和 CSDN 上的 Azure 论坛. 你可以 ... 
- java 通过调用存储过程获取结果集
			一般在java中,数据查询是通过Statement, PreparedStatement获取结果集,今天向大家介绍通过CallableStatement调用存储过程,从而获取结果集. 本 ... 
- Angular5中提取公共组件之radio list
			上一篇说到了Checkbox List的公共组件提取,现在说一下Radio List的公共组件提取. Radio List组件提取起来很方便,不想Checkbox那么复杂. radio-list.co ... 
- 配置Sharepoint之后。外网无法访问的问题
			Sharepoint配置完成了,projectserver也已经配置完毕.突然遇到一个情况就是外网访问不了,这可麻烦了,费了半天事访问不了等于0啊.没办法,研究吧.在群里问了大神,终于解决了.现将解决 ... 
- 【Leetcode】【Hard】Copy List with Random Pointer
			A linked list is given such that each node contains an additional random pointer which could point t ... 
