原理

在随机数据下,把原序列分成 \(\sqrt n\) 个块,维护每个块的前缀后缀最大值,那么,在随机询问下,对于在一个块中的询问,暴力查询。

复杂度

概率 $ n ^ {-\frac{1}{2}}$ ,复杂度 \(O(\sqrt n)\) ,均摊 \(O(1)\) 。

对于在不同块中的询问,对连续块询问以及散块前缀后缀最大值查询。

如何查询连续块

再用一遍上面的方法,对于块内最大值构成的序列二次分块,照相同办法处理,而这一次的连续块可以直接 \(O(\sqrt n )\) 暴力处理。

复杂度

随机数据下:

建表 : \(O(n)\)

查询 : \(O(1)\)

单点修改 :\(O(\sqrt n)\) (单点修改只需重建一个大小为 \(O(\sqrt n)\) 的表和一个块内前缀后缀最大值即可,而表可以暴力重建,块也只用扫一遍)

代码 (由乃救爷爷)

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int maxn = 5e3 + 10;
const int warma = 5e3;
const int maxw = 70;
const int Warma = 62;
int lg[maxn];
int cntsum,n,q,cnt;
int pre[maxw][maxw],suf[maxw][maxw];
int bye[maxw][maxw];
int maxans[maxw][maxw];
int seed,sumcnt=0;
namespace GenHelper
{
unsigned z1,z2,z3,z4,b;
unsigned rand_()
{
b=((z1<<6)^z1)>>13;
z1=((z1&4294967294U)<<18)^b;
b=((z2<<2)^z2)>>27;
z2=((z2&4294967288U)<<2)^b;
b=((z3<<13)^z3)>>21;
z3=((z3&4294967280U)<<7)^b;
b=((z4<<3)^z4)>>12;
z4=((z4&4294967168U)<<13)^b;
return (z1^z2^z3^z4);
}
}
void srand(unsigned x)
{using namespace GenHelper;
z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51;}
int read()
{
using namespace GenHelper;
int a=rand_()&32767;
int b=rand_()&32767;
return a*32768+b;
}
class chunking{
public:
int b[maxn];
int pre[maxn];
int suf[maxn];
inline void maintain();
inline int ask(int l,int r);
int length;
int anser;
}block[maxn];
inline void handle(){
int res1=1,res2=1;
for(int i=1;i<=cntsum;i++){
if(res1>Warma) res1=1,res2++;
bye[res1][res2]=block[i].anser;
res1++;
}
cnt=res2;
for(int i=1;i<=cnt;i++){
pre[1][i]=bye[1][i];
for(int j=2;j<=Warma;j++){
pre[j][i]=max(pre[j-1][i],bye[j][i]);
}
suf[Warma][i]=bye[Warma][i];
for(int j=Warma-1;j>=1;j--){
suf[j][i]=max(suf[j+1][i],bye[j][i]);
}
}
for(int i=1;i<=cnt;i++){
maxans[i][i]=0;
for(int j=1;j<=Warma;j++){
maxans[i][i]=max(maxans[i][i],bye[j][i]);
}
}
for(int i=1;i<=cnt;i++){
for(int j=i+1;j<=cnt;j++){
maxans[i][j]=max(maxans[i][j-1],maxans[j][j]);
}
}
}
inline int question(int l,int r){
int lc = l/Warma+1;
l%=Warma;
if(l==0) l=Warma,lc--;
int rc= r/Warma+1;
r%=Warma;
if(r==0) r=Warma,rc--;
if(lc==rc){
int res=0;
for(int i=l;i<=r;i++){
res=max(res,bye[i][lc]);
}
return res;
}
if(lc==rc+1){
return max(suf[l][lc],pre[r][rc]);
}
else
{
int res = maxans[lc+1][rc-1];
res=max(res,max(suf[l][lc],pre[r][rc]));
return res;
}
}
inline void chunking::maintain(){
anser=0;
pre[1]=b[1];
anser=max(anser,b[1]);
for(int i=2;i<=length;i++) pre[i]=max(pre[i-1],b[i]),anser=max(anser,b[i]);
suf[length]=b[length];
for(int i=length-1;i>=1;i--) suf[i]=max(suf[i+1],b[i]);
}
inline int chunking::ask(int l,int r){
int res=0;
for(int i=l;i<=r;i++) res=max(res,b[i]);
return res;
}
inline int query(int l,int r){
int lc=l/warma+1;
l%=warma;
if(l==0) lc--,l+=warma;
int rc=r/warma+1;
r%=warma;
if(r==0) rc--,r+=warma;
if(lc==rc){
return block[lc].ask(l,r);
}
if(lc+1==rc){
return max(block[lc].suf[l],block[rc].pre[r]);
}
else
{
int res=question(lc+1,rc-1);
res=max(res,max(block[lc].suf[l],block[rc].pre[r]));
return res;
}
}
inline void change(int x,int val){
int xc=x/warma+1;
x%=warma;
if(x==0) xc--,x+=warma;
block[xc].b[x]=val;
for(int i=xc;i<=xc;i++) block[i].maintain();
handle();
}
inline void inti(){
for(int i=1;i<=maxn-10;i++){
lg[i]=log2(i);
}
cin>>n>>q>>seed;
srand(seed);
//seed=read();
int res1=1,res2=1;
for(int i=1;i<=n;i++){
if(res1>warma) block[res2].length=res1-1,res1-=warma,res2++;
block[res2].b[res1]=read();
//cout<<chifan()<<' ';
res1++;
}
block[res2].length=res1-1;
cntsum=res2;
for(int i=1;i<=cntsum;i++) block[i].maintain();
handle();
}
int anser;
signed main(){
//freopen("5.in","r",stdin);
//freopen("5.out","w",stdout);
inti();
while(q--){
int op;
op = 1;
if(op==1){
int l,r;
l=read()%n+1;
r=read()%n+1;
if(l>r) swap(l,r);
//cout<<query(l,r)<<'\n';
anser+=query(l,r);
}
if(op==2){
int x,val;
x=read();
val=read();
change(x,val);
}
}
cout<<anser;
}

随机数据下 Sqrt Tree 的平替实现的更多相关文章

  1. [ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest)

    [ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest) 决策树 决策树算法以树状结构表示数据分类的结果.每个决策点实现一个具有离散输出的测试函数,记为分支 ...

  2. 一个比较全面的java随机数据生成工具包

    最近,由于一个项目的原因需要使用一些随机数据做测试,于是写了一个随机数据生成工具,ExtraRanom.可以看成是Java官方Random类的扩展,主要用于主要用于测试程序.生成密码.设计抽奖程序等情 ...

  3. 大数据下的数据分析平台架构zz

    转自http://www.cnblogs.com/end/archive/2012/02/05/2339152.html 随着互联网.移动互联网和物联网的发展,谁也无法否认,我们已经切实地迎来了一个海 ...

  4. 随机数据生成与对拍【c++版,良心讲解】

    10.7更新:见最下面 离NOIP2018没剩多长时间了,我突然发现我连对拍还不会,于是赶紧到网上找资料,找了半天发现了一个特别妙的程序,用c++写的! 不过先讲讲随机数据生成吧. 很简单,就是写一个 ...

  5. 不平衡数据下的机器学习方法简介 imbalanced time series classification

    imbalanced time series classification http://www.vipzhuanli.com/pat/books/201510229367.5/2.html?page ...

  6. .NET使用Bogus生成大量随机数据

    .NET如何生成大量随机数据 在演示Demo.数据库脱敏.性能测试中,有时需要生成大量随机数据.Bogus就是.NET中优秀的高性能.合理.支持多语言的随机数据生成库. Bogus的Github链接: ...

  7. python中faker模块:产生随机数据的模块

    #pip install faker #产生各种随机数据的模块 想要运用更多的随机数据,可以百度查找下

  8. 使用vs2010生成SQL Server 随机数据

    前几天做测试数据,偶然发现vs2010中有一个生成随机数据的功能,记录下来,方便以后使用,确实非常的好用灵活快捷. 为了简单扼要的说明,下面我用一个实例来说明如何快捷使用: 在VS2010创建数据库项 ...

  9. 【阿里云产品公测】大数据下精确快速搜索OpenSearch

    [阿里云产品公测]大数据下精确快速搜索OpenSearch 作者:阿里云用户小柒2012 相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能.传统的sql查询只能使用like ...

  10. MySQL查询随机数据的4种方法和性能对比

    从MySQL随机选取数据也是我们最常用的一种发发,其最简单的办法就是使用”ORDER BY RAND()”,本文介绍了包括ORDER BY RAND()的4种获取随机数据的方法,并分析了各自的优缺点. ...

随机推荐

  1. golang 常用操作

    golang 获取切片 slice 第一个 最后一个 元素 复合数据类型切片通常用作Go中索引数据的口语结构. 该类型[]intSlice是具有类型为integer的元素的切片. len函数用于获取切 ...

  2. 解决 pip 安装时的 SSL/TLS 问题

    在使用pip安装Python软件包时,有时会遇到与 SSL/TLS 相关的问题.一种常见情况是在使用VPN时出现以下错误信息 ValueError: check_hostname requires s ...

  3. vue2下拉框组件使用技巧

    1.ant design 下拉框组件--单选 <span style="font-size: 14px;">污水厂</span> <a-select ...

  4. TCP协议分析工具TcpEngine V1.2.0使用教程

    概述 目前主流的网络数据分析工具主要有两类,一类是http协议分析工具,如fiddler,这类工具擅长对字符串类型协议分析:另一类是原始网络数据包的监听分析,如Wireshark,这类工具擅长分析网络 ...

  5. lodash已死?Radash库方法介绍及源码解析 —— 异步方法篇

    写在前面 tips:点赞 + 收藏 = 学会! 我们前面已经介绍了 radash 的相关信息和所有 Array 相关方法,详情可前往主页查看. 本篇我们继续介绍radash中异步相关的方法. 所有方法 ...

  6. kafka集群(zookeeper)

    部署环境准备 kafka集群部署 ip地址 主机名 安装软件 10.0.0.131 mcwkafka01 zookeeper.kafka 10.0.0.132 mcwkafka02 zookeeper ...

  7. linux基础之awk命令详解

    一 awk主要是用来对指定对文本或者命令的输出逐行处理和分析的,下面来简单的看一下awk用法,方便以后需要使用的时候在回头看 1.1   基础的用法 [root@wxm ~]# cat test 1 ...

  8. 在Windows上运行Rainbond,10分钟快速安装

    前言 Windows 桌面运行 Rainbond,Windows 开发者的新选择. 经过适配Mac以后,Windows的适配也是成为了近期的小目标,经过不断地测试,不断地研究.最后也是达成了完美运行的 ...

  9. MDK5常见问题

    (1)MDK5下载时未找到对应的芯片 解决方式:需要下载pack包. 官方链接:https://www.keil.com/dd2/pack/ 其它链接:https://blog.csdn.net/ni ...

  10. 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项

    为什么会突然想到写这么一个大杂烩的博文呢,必须要从笔者几年前的一次面试说起 当时的我年轻气盛,在简历上放了自己的博客地址,而面试官应该是翻了我的博客,好几道面试题都是围绕着我的博文来提问 其中一个问题 ...