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 题目描述 给出 ...
随机推荐
- C++11:实用特性
今天逛cplusplus.com发现C++还真多了不少方便使用的特性,先了解些最常用的 初始化列表 vector<,,,}); vector<pair<int, int> &g ...
- BZOJ1258 [CQOI2007]三角形
Description 画一个等边三角形,把三边的中点连接起来,得到四个三角形,把它们称为T1,T2,T3,T4,如图1.把前三个三角形也这样划分,得到12个更小的三角形:T11,T12,T13,T1 ...
- java中的>>>和>>>=
“>>>”运算符所作的是无符号的位移处理,它不会将所处理的值的最高位视为正负符号,所以作位移处理时,会直接在空出的高位填入0.当我们要作位移的原始值并非代表数值时(例如:表示颜色图素 ...
- angular开发中的两大问题
一.在我们的angular开发中,会请求数据但轮播图等...在请求过数据后他的事件和方法将不再执行: 看我们的解决方案一: app.controller("text",functi ...
- mybatis 关联表心得
1,例如订单表与用户表的关联,一个订单对应一个用户,这是一对一关联: 用代码实现是这样: A(用resultType去实现的话,如下) 1,使用到继承, OrderUser extend Order{ ...
- [算法练习]ZigZag Conversion
题目说明: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows ...
- json 对象里面含有 =的解决办法
今天通过restful 调用接口的时候,遇到这样的问题,通过接口返回的数据如下: { "code": 0, "message": "成功", ...
- INSERT 语句总结
一.基本语句 1.向指定的列中插入值(在插入批量数据时方式2优于方式1) <!--插入一条值--> INSERT INTO t1(field1,field2) VALUE(v001,v00 ...
- js实现查找字符串出现最多的字符和次数
代码如下: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...
- 【Oracle】等待事件详细内容
一.等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不 ...