BZOJ 3922 - Karin的弹幕
Karin的弹幕#
Problem's Link
#
----------------------------------------------------------------------------
Mean:
给定一个长度为n(1≤n≤70000)序列,有m(1≤m≤70000)次操作:
1. 对一段下标是等差数列的子序列求最大值;
2. 单点修改.
analyse:
如果公差很大,那么速度是很快的。所以我们考虑阈值.
Time complexity: O(N)
view code
/** * ----------------------------------------------------------------- * Copyright (c) 2016 crazyacking.All rights reserved. * ----------------------------------------------------------------- * Author: crazyacking * Date : 2016-02-15-13.19 */ #include <queue> #include <cstdio> #include <set> #include <string> #include <stack> #include <cmath> #include <climits> #include <map> #include <cstdlib> #include <iostream> #include <vector> #include <algorithm> #include <cstring> using namespace std; typedef long long(LL); typedef unsigned long long(ULL); const double eps(1e-8); 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; }
作者:北岛知寒
出处:https://www.cnblogs.com/crazyacking/p/4867957.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?