[均摊复杂度线段树]Codeforces 438D. The Child and Sequence

【学习笔记】吉司机线段树 本文同步在洛谷博客上进行发表。 这是一篇刚开始学习线段树的小白都能看懂的良心学习笔记! 前置知识:含有懒标记的线段树(没别的了)。 总述 什么是吉司机线段树? 就是维护区间最值和区间历史最值的线段树,它的名字来源于吉如一老师,他在 201620162016 年发表了一篇集训队论文。 不过为啥这位老师被称为吉司机我也不知道…… 废话不多说,马上进入正题吧。 正题 例题:Luogu 6242 读完题我们发现,一般线段树题目只需要用到一个数组,而这道题用了两个,多出来了个 BBB 数组,是不是要拆成两棵树? 通过 阅读详情

首先一个数模一个小于它的数,肯定会变成原来的一半

那么用均摊复杂度线段树的套路,记一下区间最大值,区间取模时,如果区间最大值小于模数,那么不会改变数列,直接退出,否则暴力递归。

每个点最多变化log次,复杂度应该就是 O(nlog2n)

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

const int N=100010;

int n,m,a[N];
ll sum[N<<2],mx[N<<2];

inline void Up(int g){
  sum[g]=sum[g<<1]+sum[g<<1|1];
  mx[g]=max(mx[g<<1],mx[g<<1|1]);
}

void Build(int g,int l,int r){
  if(l==r) return sum[g]=mx[g]=a[l],void();
  int mid=l+r>>1;
  Build(g<<1,l,mid); Build(g<<1|1,mid+1,r);
  Up(g);
}

ll Query(int g,int L,int R,int l,int r){
  if(l==L && r==R) return sum[g];
  int mid=L+R>>1;
  if(r<=mid) return Query(g<<1,L,mid,l,r);
  else if(l>mid) return Query(g<<1|1,mid+1,R,l,r);
  else return Query(g<<1,L,mid,l,mid)+Query(g<<1|1,mid+1,R,mid+1,r);
}

void Modify(int g,int L,int R,int l,int r,int x){
  if(mx[g]<x) return ;
  if(L==R) return sum[g]%=x,mx[g]%=x,void();
  int mid=L+R>>1;
  if(r<=mid) Modify(g<<1,L,mid,l,r,x);
  else if(l>mid) Modify(g<<1|1,mid+1,R,l,r,x);
  else Modify(g<<1,L,mid,l,mid,x),Modify(g<<1|1,mid+1,R,mid+1,r,x);
  Up(g);
}

void Changes(int g,int l,int r,int x,int y){
  if(l==r) return sum[g]=mx[g]=y,void();
  int mid=l+r>>1;
  if(x<=mid) Changes(g<<1,l,mid,x,y);
  else Changes(g<<1|1,mid+1,r,x,y);
  Up(g);
}

int main(){
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
  Build(1,1,n);
  for(int i=1;i<=m;i++){
    int opt,l,r,x,k;
    scanf("%d",&opt);
    if(opt==1){
      scanf("%d%d",&l,&r);
      printf("%lld\n",Query(1,1,n,l,r));
    }
    else if(opt==2){
      scanf("%d%d%d",&l,&r,&x);
      Modify(1,1,n,l,r,x);
    }
    else{
      scanf("%d%d",&k,&x);
      Changes(1,1,n,k,x);
    }
    //for(int j=1;j<=n;j++) printf("%lld ",Query(1,1,n,j,j)); putchar('\n');
  }
  return 0;
}
Segmentree beats!---吉如一线段树学习笔记 jry老师太牛了!! 本文为学习吉如一老师 Segmenttree beats 一文后有感而发qwq I 给定一个长度为n的数列A,接下来有m次操作: • 区间[l,r][l,r][l,r]中的所有数变成min(Ai,x)min(Ai,x)min(Ai,x) • 询问区间[l,r][l,r][l,r]中所有数的和 记录区间最大值和次大值,如果小于次大值就暴力递归即可 证明: 会发现我们每次花费O(log⁡n)O(\log n)O(logn)的时间使得两个数变得相同,因此总复杂度就是O(mlog⁡n+nlog 阅读详情

相关推荐

势能线段树(均摊分析)

对于每个区间维护区间内的 最大值MaxMaxMax 和 最小值MinMinMin,对于整除操作,如果有Max−⌊Maxd⌋=Min−⌊Mind⌋Max-\lfloor\frac{Max}{d}\rfloor = Min − \lfloor\frac{Min}{d}\rfloorMax−⌊dMax​⌋=Min−⌊dMin​⌋,就转化为区间减。否则直接向下递归。 考虑何时满足Max−⌊Maxd⌋=Min−⌊Mind⌋Max-\lfloor\frac{Max}{d}\rfloor = Min − \lfloor\

Edward The Bunny 的博客 1273

线段树维护势能类 / 均摊类问题:CF403E

在一个点在其dfn序加入另一个点,维护区间另一个点dfn序的最大和最小值。场上想对于一棵树的某个子树把所有向外边全部删掉。对于这类操作均摊的问题,都可以考虑用线段树维护。变成dfn序一个在子树区间,一个不在的问题。易发现这个问题可以用线段树维护。如果不在询问区间里,直接递归。

zhangtingxiqwq的博客 158

吉司机线段树(segment tree beats!)

sdoir1考挂,本来都要退役了。。。结果还是进了二轮末尾。。。打算混个D类去养老; 最近有点颓,需要写些东西和学些新东西止一下颓势,就先把这几星期前学的神奇线段树写了吧。。。 吉司机线段树主要是用来解决序列区间上满足部分满足一定性质的修改操作的,比方说把区间中小于x的数改成x,大于x的数改成x,甚至是区间取并和区间取或(实际上也就是区间中的每个数的每一位进行类似小于x改成x那种操作) 这玩...

santongding 9221

[均摊复杂度线段树] Codeforces #438D. The Child and Sequence

水~~~#include<cstdio> #include<algorithm> using namespace std; const int maxn=200005; typedef unsigned long long uLL; struct node{ node* ch[2]; uLL sum,_max; node(uLL t1=0,uLL t2=0,node

Lynstery's blog 445

吉如一线段树:区间最值和历史最值

线段树

2301_78527293的博客 1322

国家队论文——线段树

国家队论文——线段树,比较难 国家队论文——线段树 国家队论文——线段树,比较难 国家队论文——线段树

Codeforces 438 D. The Child and Sequence (线段树

题意: 三种操作 1.区间求和 3.区间取模 2.单点更新 题解: 直接单点更新暴力维护, 取模的均摊复杂度为O(nlogn)O(nlogn)O(nlogn) #include &amp;lt;bits/stdc++.h&amp;gt; using namespace std; #define ll long long #define pb push_back #define...

Yishui_lovely 297

线段树课件

线段树

[均摊 平衡树 || 线段树] Codeforces 438D #250 (Div. 1) D. The Child and Sequence

传说中的cf250 china场 题意就是区间取模 区间求和 单点修改 每个数被取模了 肯定会减小一半 一个数最多只要log次就能不动 把相同的数缩成一段 每一段最多被修改O(log n) 次 每一次修改会增加O(1) 段 用平衡树维护 复杂度是 nlog2n 的 对应的势能函数是每一段的log值的和 总势能是(n+m)logn 每次操作log复杂度 能够降1 那么就是两个lo

雯舞 626

线段树.pdf

线段树、树状数组算法入门 加 poj解题报告 pdf文档

吉如一几何板子

2018 world final 金牌 吉老师几何板子 struct point{ db x,y; point operator + (const point &k1;) const{return (point){k1.x+x,k1.y+y};} point operator - (const point &k1;) const{return (point){x-k1.x,y-k1.y};} point operator * (db k1) const{return (point){x*k1,y*k1};} point operator / (db k1) const{return (point){x/k1,y/k1};} int operator == (const point &k1;) const{return cmp(x,k1.x)==0&&cmp;(y,k1.y)==0;} point turn(db k1){return (point){x*cos(k1)-y*sin(k1),x*sin(k1)+y*cos(k1)};} point turn90(){return (point){-y,x};} bool operator < (const point k1) const{ int a=cmp(x,k1.x); if (a==-1) return 1; else if (a==1) return 0; else return cmp(y,k1.y)==-1; } db abs(){return sqrt(x*x+y*y);} db abs2(){return x*x+y*y;} db dis(point k1){return ((*this)-k1).abs();} point unit(){db w=abs(); return (point){x/w,y/w};} void scan(){double k1,k2; scanf("%lf%lf",&k1;,&k2;); x=k1; y=k2;} void print(){printf("%.11lf %.11lf\n",x,y);} db getw(){return atan2(y,x);} point getdel(){if (sign(x)==-1||(sign(x)==0&&sign;(y)==-1)) return (*this)*(-1); else return (*this);} int getP() const{return sign(y)==1||(sign(y)==0&&sign;(x)==-1);} };

Codeforces1042D——线段树|树状数组|分治+尺取

题目链接:https://vjudge.net/contest/357503#problem/D 题目大意: 给你一个由n个整数组成的数组a,请你计算二元组(l,r)的个数,其中(l,r)满足条件 Input 第一行两个整数n和t (1 ≤ n≤ 200,000 ,|t|≤ 2e14 ) 第二行为一个序列:a1,a2...an,注意可能有负数和零 Output 二...

mumei的博客 595

CodeForces_1348EF – Phoenix and Memory 贪心+线段树找区间最小值

这题如果没有输出2个解就很简单。 是个之前做过的类型: 把所有限制按R排序, 然后每次取出R最小的,然后从其L开始选,尽量选能选的中最小的。 这样选如果能选完,就说明有解。 贪心正确性显然:R大的至少可以选则R做为点来用。所以按R升序遍历,每次优先选左边的,能让后边的可选的更多。 用set维护可选的数即可。 这题加了个输出2个方案。 我们考虑最简单的情况:即确定一个序列后,是否有2个位置,posi,posj,使得i,j可以交换。 显然必须满足    Lj<=posi<posj<Ri 我们枚举i,只需要找到任意一个j满足上式,就可以交换i,j然后输出。 我们可以先把所有的Lj存到以 posj为区

吉如一线段树

例题 #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define N 550010 #define ll long long #define INF 0x3f3f3f3f struct tree{ int l,r; int mx;//区...

Fooooooo的博客 972

YOLOv11 Neck架构演进 - 从FPN/PAN到C2f/SPPF的融合策略实战剖析

本文深入剖析YOLOv11 Neck架构的演进历程,从FPN/PAN到C2f/SPPF的融合策略,详细解析了多尺度目标检测中的特征融合技术。通过实战案例展示了YOLOv11在无人机航拍等场景中的性能提升,特别是小目标检测AP值提升15%的显著效果,为计算机视觉开发者提供了宝贵的架构优化经验。

weixin_30500105的博客 431

东华大学oj系统 39 最大乘积

39 最大乘积 作者: Turbo时间限制: 1S章节: 深度优先搜索 问题描述 : 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入说明 : 第一行一个数表示数据组数   每组输入数据共2行:   第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,   第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。 输出说明 : 每组数据输出1行,为最大的乘积。 输入范例 : 1 5 5 1 2 3 4 2 输出范例 : 48 注:难

weixin_50336369的博客 526

【吉如一线段树】JZOJ6270. 【省赛模拟8.10】序列

Description ai,n<=2e5 Solution 考虑按照答案分类,假如ddd的倍数为a[1],a[2],..a[k−1],a[k]a[1],a[2],..a[k-1],a[k]a[1],a[2],..a[k−1],a[k],那么区间被1…(a[k-1]-1),(a[2]+1)…n,(a[1]+1)…(a[n]-1)这三个区间包含的区间的答案至少为d,也就是要维护区间取MAX...

Deep_Thinking的博客 1650

手把手教你用STM32标准库写一个能OTA升级的Bootloader(附完整代码)

本文详细介绍了如何使用STM32标准库开发支持OTA无线升级的Bootloader系统,包括Flash分区规划、Bootloader核心实现、无线升级流程及安全校验机制。通过实战代码示例,帮助开发者快速掌握STM32固件升级技术,提升物联网设备的远程维护能力。

weixin_30181209的博客 262

【线段树+均摊思想】UOJ #228 基础数据结构练习题

题面在这里 首先吐槽一下这个题目的名字【大雾 题目意思很简单,但是需要思考的地方很多 主要问题在于如何实现区间开根号 试想:两个不同的数x,y开若干次根号后,必然会趋向于一致: 330 227 →\rightarrow 18 15 →\rightarrow 4 4 那么,在进行若干次操作2后,就有可能得到一段连续的相同值 于是,对于一段相同的序列,区间开根号就等价于区间加 对于不能

linkfqy 1564

避开这些坑,你的Python爬虫才能稳定爬取IEEE Xplore(含反爬策略与MongoDB存储实战)

本文详细介绍了如何构建稳定的Python爬虫系统以爬取IEEE Xplore学术论文,包括反爬策略、MongoDB存储优化和断点续传机制。通过动态等待时间算法、请求头指纹管理和会话保持策略,有效应对IEEE的反爬机制。同时,优化MongoDB数据结构和索引,提升存储效率。最后,强调法律合规与伦理考量,确保爬虫合法合规运行。

weixin_29031057的博客 1095

手把手教你用PLECS仿真BUCK数字电源(含DSP代码实现)

本文详细介绍了如何利用PLECS仿真软件与Visual Studio 2022搭建高保真数字电源开发环境,手把手指导从BUCK电路建模、编写硬件感知的C控制算法到参数调优的全过程。重点阐述了通过DLL接口实现软件在环仿真,模拟DSP的ADC/PWM时序,并将验证后的代码无缝迁移至TI C2000系列DSP,构建从仿真到固件的完整数字电源开发闭环,显著提升开发效率与一次成功率。

oo7890的博客 395

CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)

题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1 x y1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间没有连边,则增加连边;如果 (x,y)(x,y)(x,y) 之间存在连边,则删除连边 2 x y2 \ x \ y2 x y:询问点 xxx 和点 yyy 之间是否联通 询问需要强制在线 题目分析:关于强制在线实现连边与加边

Falcon的博客 589

CMap数据库实战:从基因表达谱到药物重定位的可视化分析

本文详细介绍了如何利用CMap数据库进行药物重定位的可视化分析。通过实战演示,从差异基因列表准备、CMap查询参数设置,到结果筛选与高级可视化(如热图与OncoPrint风格图),系统讲解了从数据到洞察的全流程,并提供了关键的解读与验证指南,帮助研究者高效挖掘老药新用的潜力。

mango的博客 587
上一篇: [线段树模拟Treap]Codechef COT5 .Count on a Treap
下一篇: [杂题 简单复杂度分析]HDU5762. Teacher Bo
LowestJN
博客等级 码龄10年 76粉丝 422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值