【BZOJ】3922: Karin的弹幕
题意
给定一个长度为\(n(1 \le n \le 70000)\)序列,\(m(1 \le m \le 70000)\)次操作:1. 对一段下标是等差数列的子序列求最大值;2. 单点修改。
分析
如果公差很大,那么速度是很快的。所以我们考虑阈值。
题解
设阈值\(k\)表示如果询问的公差小于等于\(k\)则用线段树求,否则暴力。
则我们对阈值每一个公差\(i(1 \le i \le k)\)建\(i\)棵线段树。
复杂度\(O(kn + m(\frac{n}{k} + log n))\)
#include <bits/stdc++.h>
using namespace std;
const int N=70005, MXD=10, oo=(~0u>>1)+1;
int a[N], D, sz[MXD+1][MXD+1], b[N];
struct node *null;
struct node {
node *c[2];
int mx;
node() {
c[0]=c[1]=0;
mx=oo;
}
void up() {
mx=max(c[0]->mx, c[1]->mx);
}
}Po[10000005], *iT=Po, *root[MXD+1][MXD+1];
node *newnode() {
return iT++;
}
node* build(int l, int r) {
node *x=newnode();
if(l==r) {
x->mx=b[l];
return x;
}
int mid=(l+r)>>1;
x->c[0]=build(l, mid);
x->c[1]=build(mid+1, r);
x->up();
return x;
}
int query(int L, int R, int l, int r, node *x) {
if(L<=l && r<=R) {
return x->mx;
}
int mid=(l+r)>>1, ret=oo;
if(L<=mid) {
ret=query(L, R, l, mid, x->c[0]);
}
if(mid<R) {
ret=max(ret, query(L, R, mid+1, r, x->c[1]));
}
return ret;
}
void update(int p, int go, int l, int r, node *x) {
if(l==r) {
x->mx+=go;
return;
}
int mid=(l+r)>>1;
if(p<=mid) {
update(p, go, l, mid, x->c[0]);
}
else {
update(p, go, mid+1, r, x->c[1]);
}
x->up();
}
void init(int n) {
D=min(MXD, n);
for(int d=1; d<=D; ++d) {
for(int i=1; i<=d; ++i) {
int &s=sz[d][i];
for(int j=i; j<=n; j+=d) {
b[++s]=a[j];
}
root[d][i]=build(1, s);
}
}
}
int query(int x, int d, int n) {
if(d>D) {
int mx=oo;
for(int i=x; i<=n; i+=d) {
mx=max(mx, a[i]);
}
return mx;
}
int begin=(x-1)%d+1, pos=(x-1)/d+1, len=sz[d][begin];
return query(pos, len, 1, len, root[d][begin]);
}
void update(int x, int y) {
a[x]+=y;
for(int d=1; d<=D; ++d) {
int begin=(x-1)%d+1, pos=(x-1)/d+1, len=sz[d][begin];
update(pos, y, 1, len, root[d][begin]);
}
}
int main() {
int n, m;
scanf("%d", &n);
for(int i=1; i<=n; ++i) {
scanf("%d", &a[i]);
}
init(n);
scanf("%d", &m);
while(m--) {
int op, x, y;
scanf("%d%d%d", &op, &x, &y);
if(op) {
printf("%d\n", query(x, y, n));
}
else {
update(x, y);
}
}
return 0;
}
【BZOJ】3922: Karin的弹幕的更多相关文章
- BZOJ 3922 - Karin的弹幕
Karin的弹幕 Problem's Link ---------------------------------------------------------------------------- ...
- BZOJ3922 Karin的弹幕 【线段树】
题目链接 BZOJ3922 题解 考虑暴力,修改\(O(1)\),查询\(O(\frac{n}{d})\) 考虑线段树,如果对每种差值建一棵线段树,修改\(O(nlogn)\),查询\(O(logn) ...
- 【线段树】bzoj3922 Karin的弹幕
设置一个值K. d<=K:建立多组线段树:d>K:暴力. 最优时间复杂度的伪计算: O(n*K*logn(建树)+m*logn(询问类型1)+m*n/K(询问类型2)+m*K*logn(修 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- 又一枚精彩的弹幕效果jQuery实现
精彩的弹幕效果分享给大家,具有一定的参考价值,感兴趣的朋友可以尝试制作弹幕,具体内容如下 简易弹幕效果:将发布的内容随机显示在弹幕右侧,逐渐左移最后消失. 涉及知识点:val().random ...
随机推荐
- js实现文本框中内容的放大显示
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- mysql优化记录
老板反应项目的反应越来越慢,叫优化一下,顺便学习总结一下mysql优化. 不同引擎的优化,myisam读的效果好,写的效率差,使用场景 非事务型应用只读类应用空间类应用 Innodb的特性,innod ...
- SSH Junit4测试
package test; import static org.junit.Assert.*; import java.util.List; import org.hibernate.SessionF ...
- [Java] Java执行Shell命令
Methods ProcessBuilder.start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 子类的一个实例,该实例可用来 ...
- C#深入浅出 继承(六)
这个标题写出来好长时间了,都没写内容,今天无论如何都得写完它,昨天写了一段,尼玛,电脑突然死机,重启之后啥都没了. 继承嘛,有人觉得很简单,但是里面还是有内容可以讲的,因为面向对象也就这么点内容,封装 ...
- VS2008 Debug与Release的本质区别(转)
如何设置:工具栏“生成”→“配置管理器”→“活动解决方案配置” 对于VS2008的初次使用者来说,常会遇到的编译问题时,Debug版本运行正常,但在Release版本则不稳定或无法运行.以下是对Deb ...
- GDI+ 笔记
1.GDI+模板 #include<windows.h> #include<GdiPlus.h> #include <time.h> #include <ma ...
- PAT mooc DataStructure 4-2 SetCollection
数据结构习题集-4-2 集合的运用 1.题目: We have a network of computers and a list of bi-directional connections. Eac ...
- 微信公众平台可通过UnionID机制在多公众号间帐号互通
微信公众平台越来越注重开发者的反馈信息了,这不,微信开放平台提供了UnionID机制,通过获取用户基本信息接口,开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个公众号,可使用以下办法通 ...
- 新一代记事本“Notepad++”个性化设置备份
Notepad++是一套非常有特色的自由软件的纯文字编辑器(许可证:GPL),有完整的中文化接口及支援多国语言撰写的功能(UTF8 技术).它的功能比 Windows 中的 Notepad(记事簿)强 ...