Loj_6282

这个题目涉及到了块的重构,这里使用了\(\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的更多相关文章

  1. LOJ6277~6285 数列分块入门

    Portals 分块需注意的问题 数组大小应为,因为最后一个块可能会超出的范围. 当操作的区间在一个块内时,要特判成暴力修改. 要清楚什么时候应该+tag[t] 数列分块入门 1 给出一个长为的数列, ...

  2. 数列分块入门九题(三):LOJ6283~6285

    Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...

  3. 数列分块入门九题(二):LOJ6280~6282

    Preface 个人感觉这中间的三题是最水的没有之一 数列分块入门 4--区间加法,区间求和 这个也是很多数据结构完爆的题目线段树入门题,但是练分块我们就要写吗 修改还是与之前类似,只不过我们要维护每 ...

  4. 数列分块入门九题(一):LOJ6277~6279

    Preface 分块,一个神奇的暴力算法.可以把很多\(O(n^2)\)的数据结构题的暴力优化到常数极小的\(O(n\sqrt n)\).当一些毒瘤题无法用线段树,主席树,平衡树,树状数组...... ...

  5. LOJ6285 数列分块入门9(分块)

    昨天对着代码看了一晚上 然后今天终于在loj上过了 数列分块入门9题撒花★,°:.☆( ̄▽ ̄)/$:.°★ . 然后相当玄学 块的大小调成\(\sqrt{n}\)会TLE,改成150就过了 啧 然后就 ...

  6. LOJ 6277:数列分块入门 1(分块入门)

    #6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ...

  7. LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)

    #6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给 ...

  8. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

    #6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  9. LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)

    #6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

随机推荐

  1. gRPC的简单Go例子

    gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发 ...

  2. HDU-2046 骨牌铺方格【递推】

    http://acm.hdu.edu.cn/showproblem.php?pid=2046 和前面的一样,a[i] = a[i-1] + a[i-2] #include<iostream> ...

  3. K:大数加法

    相关介绍:  在java中,整数是有最大上限的.所谓大数是指超过整数最大上限的数,例如18 452 543 389 943 209 789 324 233和8 123 534 323 432 323 ...

  4. Java数组声明与拷贝的几种方式

    Java数组声明的三种方式 第一种(声明并初始化):          数据类型[] 数组名={值,值,...};          例:int[] a = {1,2,3,4,5,6,7,8};    ...

  5. python中字符串格式化%与.format

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  6. Postman-Tests模块测试方法记录

    用Postman的时候大多数测试结果是可以用Tests模块的测试方法来代替人工检查的,测试方法本质上是JavaScript代码,我们可以通过运行测试用例(测试脚本是在发送请求之后并且从服务器接收到响应 ...

  7. 关于js的两个函数

    注:这两个函数结合其他主要实现异步的默认checkbox选中和其他选中,从php页面穿过来已经选中的值,用jQuery 回绑:关键点在于$.each(),遍历,再用$.attr() 回绑:第二步关键点 ...

  8. KaTeX.js

    KaTeX.js 官网:https://khan.github.io/KaTeX/

  9. D3.js 入门教程

    最近需要用到d3, 记录下d3的教程 网上搜了几个关于d3的教程 D3.js 入门教程      http://wiki.jikexueyuan.com/project/d3wiki/author.h ...

  10. 注解@Slf4j

    介绍 常见的Slf4j日志打印有两种方式,分别为传统方式和注解方式. 1.传统方式 示例: package com.example.demo.controller; import org.slf4j. ...