设置一个值K。

d<=K:建立多组线段树;d>K:暴力。

最优时间复杂度的伪计算:

O(n*K*logn(建树)+m*logn(询问类型1)+m*n/K(询问类型2)+m*K*logn(修改))。

求此函数最小值,易得,当K=sqrt(m/logn)时,

时间复杂度:O(m*sqrt(m*logn))。

空间复杂度:O(n*sqrt(m/logn))。

当然,这个计算显然不完全合理,而且,由于使用STL的vector的原因,导致实际建树要慢得多,因此K取得小一些更加合适(跑几组数据自己看看就行了)。如果不稍微小一点是卡不进内存和时间的哦。

#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
#define INF 2147483647
int n,x0,d,a[70001],lim,m;
bool op;
vector<int>b[70][70],maxv[70][70];
void buildtree(int x,int y,int rt,int l,int r)
{
if(l==r)
{
maxv[x][y][rt]=b[x][y][l];
return;
}
int m=l+r>>1;
buildtree(x,y,lson); buildtree(x,y,rson);
maxv[x][y][rt]=max(maxv[x][y][rt<<1],maxv[x][y][rt<<1|1]);
}
void update(int x,int y,int p,int v,int rt,int l,int r)
{
if(l==r) {maxv[x][y][rt]+=v; return;}
int m=l+r>>1;
if(p<=m) update(x,y,p,v,lson);
else update(x,y,p,v,rson);
maxv[x][y][rt]=max(maxv[x][y][rt<<1],maxv[x][y][rt<<1|1]);
}
int query(int x,int y,int ql,int qr,int rt,int l,int r)
{
if(ql<=l&&r<=qr) return maxv[x][y][rt];
int m=l+r>>1,res=-INF;
if(ql<=m) res=max(res,query(x,y,ql,qr,lson));
if(m<qr) res=max(res,query(x,y,ql,qr,rson));
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
scanf("%d",&m);
lim=(int)sqrt((double)m/(log((double)n)/log(2.0)))/14;
if(!lim) lim=1;
for(int i=1;i<=lim;++i)//枚举公差
for(int j=1;j<=lim;++j)//枚举首项
{
b[i][j].push_back(0);
for(int k=j;k<=n;k+=i) b[i][j].push_back(a[k]);
maxv[i][j].assign((b[i][j].size()-1)<<2|1,0);
buildtree(i,j,1,1,b[i][j].size()-1);
}
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&op,&x0,&d);
if(!op)
{
a[x0]+=d;
for(int j=1;j<=lim;++j)//枚举公差
{
int bel=x0%j;
if(!bel) bel=j;//计算首项
int pos=x0/j;
if(bel!=j) ++pos;//计算pos是该等差数列的第几项
update(j,bel,pos,d,1,1,b[j][bel].size()-1);
}
}
else
{
if(d>lim)
{
int res=-INF;
for(int j=x0;j<=n;j+=d) res=max(res,a[j]);
printf("%d\n",res);
}
else
{
int bel=x0%d;
if(!bel) bel=d;
int sta=x0/d;
if(bel!=d) ++sta;
printf("%d\n",query(d,bel,sta,b[d][bel].size()-1,1,1,b[d][bel].size()-1));
}
}
}
return 0;
}

【线段树】bzoj3922 Karin的弹幕的更多相关文章

  1. BZOJ3922 Karin的弹幕 【线段树】

    题目链接 BZOJ3922 题解 考虑暴力,修改\(O(1)\),查询\(O(\frac{n}{d})\) 考虑线段树,如果对每种差值建一棵线段树,修改\(O(nlogn)\),查询\(O(logn) ...

  2. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  5. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  8. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  9. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

随机推荐

  1. HttpClientUntils工具类的使用测试及注意事项(包括我改进的工具类和Controller端的注意事项【附 Json 工具类】)

    HttpClient工具类(我改过): package com.taotao.httpclient; import java.io.IOException; import java.net.URI; ...

  2. Hadoop NameNode元数据相关文件目录解析

    在<Hadoop NameNode元数据相关文件目录解析>文章中提到NameNode的$dfs.namenode.name.dir/current/文件夹的几个文件: 1 current/ ...

  3. Windows2008 – Task Scheduler – ‘Action “C:\Windows\SYSTEM32\cmd.exe” with return code 1’

    Remediation Edit Task Let us make the necessary changes, which is to specify the Start folder. Here ...

  4. 关于JAVA正则匹配空白字符的问题(全角空格与半角空格)

    今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示“\u3000” ,这是什么? 这是全角空格!!! 查了一下    \s    不支持全角 1.& ...

  5. Drupal7所见即所得模块CKEditor

    初学Drupal(7.26),刚好遇到一个需要用到CKEditor模块的项目,于是就摸索着把它给装上了. 图片上传出问题 回到Drupal7的管理页面后刚好发现了对于CKEditor的“状态报告”(错 ...

  6. [POJ2187][BZOJ1069]旋转卡壳

    旋转卡壳 到现在依然不确定要怎么读... 以最远点对问题为例,枚举凸包上的两个点是最简单的想法,时间复杂度O(n2) 我们想象用两条平行线卡着这个凸包,当其中一个向某个方向旋转的时候另一个显然也是朝同 ...

  7. MySQL 查询语句练习2

    创建表 /* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50719 Sour ...

  8. python学习笔记 IO 文件读写

    读写文件是最常见的IO操作.python内置了读写文件的函数. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统完成的,现代操作系统不允许普通的程序直接对磁盘进行操作,所以, 读写 ...

  9. Oracle 11g 安装环境配置脚本

    #!/bin/bash #Test in RHEL 5.5 for 11g c=`cat /etc/shadow | grep oracle | wc -l`if [ $c != 0 ]then  w ...

  10. servlet(1) - 手写第一个servlet程序 - 小易Java笔记

    声明:如tomcat的安装目录为D:\Java\tomcat6,下面要根据tomcat的安装目录而定 1. 建立程序的文件结构 ==>找到tomcat的安装目录,在webapps目录下新建一个名 ...