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 基础:数组
一.数组声明: int[] x; int x[]; 在Java中一般使用前者,机把int[]看做一个类型,C++中只能后者 二.数组初始化: 直接提供值: int[] x = {1, 3, 4}; i ...
- ES6学习笔记(七)-对象扩展
可直接访问有道云笔记分享链接查看es6所有学习笔记 http://note.youdao.com/noteshare?id=b24b739560e864d40ffaab4af790f885
- Vue组件通讯
Vue最常用的组件通讯有三种:父->子组件通讯.子->父组件通讯,兄弟组件通讯.(template用的pug模板语法) 1.父->子组件通讯 父->子组件通讯,是通过props ...
- Java设计模式—状态模式
状态模式又是一个比较难的设计模式 定义如下: 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类. 个人理解:通俗的讲,状态模式就是状态的改变引起了行为的改变,但是,我们只能看到行为的 ...
- 很赞的一个教程: React.js 小书
很赞, React.js 小书 http://huziketang.com/books/react/ 推荐阅读入门, 照着来一遍,能会个七七八八, 更多的还需要多写 import Re ...
- Python爬虫教程-10-UserAgent和常见浏览器UA值
Python爬虫教程-10-UserAgent和常见浏览器UA值 有时候使用爬虫会被网站封了IP,所以需要去模拟浏览器,隐藏用户身份, UserAgent 包含浏览器信息,用户身份,设备系统信息 Us ...
- 线性表接口的实现_Java
线性表是其组成元素间具有线性关系的一种线性结构,对线性表的基本操作主要有插入.删除.查找.替换等,这些操作可以在线性表的任何位置进行.线性表可以采用顺序存储结构和链式存储结构表示. 本接口的类属于da ...
- qss 对子控件的设置样式 使用setProperty --Qt 之 QSS(动态属性)
https://blog.csdn.net/liang19890820/article/details/51693956 学习了 代码: 当鼠标划过控件时,设置样式 void CustomLabelW ...
- 一个java内存泄漏的排查案例
这是个比较典型的java内存使用问题,定位过程也比较直接,但对新人还是有点参考价值的,所以就纪录了一下. 下面介绍一下在不了解系统代码的情况下,如何一步步分析和定位到具体代码的排查过程 (以便新人参考 ...
- axure rp8.1 注册码
授权人:University of Science and Technology of China (CLASSROOM)授权密钥:DTXRAnPn1P65Rt0xB4eTQ+4bF5IUF0gu0X ...