【洛谷P2801】教主的魔法【分块】【二分】

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件) 本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。 阅读详情

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P2801
给出一串数列,有两个操作:

  • M   x   y   z : M\ x\ y\ z: M x y z:将位置在 x x x到 y y y之间的数全部加上 z z z
  • A   x   y   z : A\ x\ y\ z: A x y z:查询位置在 x x x到 y y y之间有多少个数不小于 z z z

思路:

30分做法:

暴力。

100分做法:

考虑用分块。
对于每次修改操作,如果修改的位置都在一个区间,那么就暴力修改。
如果不在同一个区间,那么就将中间的区间 a d d add add数组全部加上 z z z,其余两边暴力。
修改很简单吧。
那么对于查询操作,如果查询的位置在同一个区间,暴力。
如果不在同一个区间,可以想到,如果这个区间是单调递增的,那么就可以用二分查找,找到第一个比 z z z小的,那么后面的全部比 z z z大(或等于)。
那么就在每次修改之后维护另一个数组 a [ i ] a[i] a[i],保证每一个块在 a a a数组中都是单调递增的。就可以了。


代码:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#define N 1000100
using namespace std;

int tall[N],pos[N],a[N],L[N],R[N],add[N];
int n,m,t;
char c;

void reset(int x)  //重构a数组
{
    for (int i=L[x];i<=R[x];i++)
     a[i]=tall[i];
    sort(a+L[x],a+R[x]+1);
}

int sum(int l,int r,int z)  //暴力求个数
{
    int ans=0;
    for (int i=l;i<=r;i++)
     if (tall[i]>=z) ans++;
    return ans;
}

int find(int l,int r,int z)  //二分求个数
{
    int mid,p=r;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(a[mid]<z) l=mid+1;
         else r=mid-1;
    }
    return p-l+1;
}

int ask(int l,int r,int z)
{
    int q=pos[l],p=pos[r];
    if (q==p) return sum(l,r,z-add[q]);  //每次z要减去add[这个块],因为这个块整体增加了add[i],所以查找时要减去add[i]
    int ans=0;
    for (int i=q+1;i<p;i++)
     ans+=find(L[i],R[i],z-add[i]);
    return ans+sum(l,R[q],z-add[q])+sum(L[p],r,z-add[p]);
}

void change(int l,int r,int z)
{
    int q=pos[l],p=pos[r];
    if (q==p)
    {
        for (int i=l;i<=r;i++) tall[i]+=z;
        reset(q);
        return;
    }
    for (int i=l;i<=R[q];i++) tall[i]+=z;
    for (int i=L[p];i<=r;i++) tall[i]+=z;
    reset(q);
    reset(p);  //重构
    for (int i=q+1;i<p;i++)
     add[i]+=z;
}

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%d",&tall[i]);
    t=(int)sqrt(n);
    for (int i=1;i<=t;i++)
    {
        L[i]=R[i-1]+1;
        R[i]=i*t;
    }
    if (R[t]<n)
    {
        t++;
        L[t]=R[t-1]+1;
        R[t]=n;
    }
    for (int i=1;i<=t;i++)
    {
        for (int j=L[i];j<=R[i];j++)
      	 pos[j]=i;
        reset(i);
    } 
    int x,y,z;
    while (m--)
    {
        cin>>c;
        scanf("%d%d%d",&x,&y,&z);
        if (c=='A') printf("%d\n",ask(x,y,z));
         else change(x,y,z);
    }
    return 0;
}
CVE-2021-22205 GITLAB 未授权 RCE 漏洞 简介 GitLab是由GitLab Inc.开发的一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,可通过Web界面访问公开或私人项目。由于GitLab存在未授权的端点,导致该漏洞在无需进行身份验证的情况下即可进行利用。 漏洞利用 上工具 python3 poc import sys import requests from bs4 import BeautifulSoup requests.packages.urllib3.disable_warnings() def . 阅读详情

相关推荐

LPDDR5X内存技术解析:性能提升与优化策略

内存技术在现代计算系统中扮演着核心角色,其性能直接影响整体系统效率。LPDDR5X作为JEDEC最新标准,通过提升数据传输率至8533Mbps、优化能效比15%以上,并扩展突发长度至32字节,显著提升了移动设备的处理能力。这些改进特别适用于5G通信、AI加速(如昇腾芯片)及8K视频处理等高带宽需求场景。技术原理上,LPDDR5X引入了动态电压频率调整(DVFS)和可编程突发长度等创新机制,有效降低了实际应用中的延迟。在工程实践中,合理的PCB布局和信号完整性验证是确保高速稳定运行的关键。随着AI和8K应用的

weixin_29190169的博客 397

P2801 教主的魔法 题解

时,单次操作的时间复杂度最优。所在的块的起点,终点,大小。说:利用均值不等式可知,当。所以,总时间复杂度为。

Yuananshan的博客 1617

COMSOL新手必看:锂电池仿真从入门到精通的5个实战案例(附模型文件)

本文为COMSOL新手提供锂电池仿真的5个实战案例,涵盖锂枝晶生长模拟、电池热失控预警、SOC估计等效电路模型、电池组液冷系统热管理及SOH衰退模型构建。通过详细步骤和参数设置,帮助用户快速掌握锂电池仿真技术,提升新能源研发效率。附模型文件可直接应用。

wdx01234567的博客 260

洛谷OJ:P2801 教主的魔法(分块)

思路:虽然n很大,但是查询次数Q有限,只有3000,左右,因此我们可以用分块算法解决该题,通过vector将每一块变成一个有序的块,在每次更新操作,直接暴力更新即可。 #include<set> #include<queue> #include<vector> #include<string> #include<math.h> #include<stdio.h> #include<string.h> #inclu...

信仰.的博客 453

Unreal浅做一个MetaBall

Raymaching其实就是实时场景的一种渲染方法。主要原理网上有很多详细介绍。简单来说就是,以摄像机为原点,发射很多条射线,而每一条射线以步长为单位向前采样,同时以采样点和最近的物体像素的距离为半径进行一个球形检测。检测到摄像机和场景像素在当前射线方向的距离差小于某个值,就表示射线到达物体表面,然后画这个像素。

xzljj的博客 334

schrodinger 薛定谔

链接: https://pan.baidu.com/s/1Duh4GsoytIklvZp7TdHpWg 密码: wmr1 Linux系统版 进入 Schrodinger_Suites_2021-2_Linux-x86_64 sudo ./INSTALL 中间按默认的来即可,也可以自己调整安装目录。安装目录一定要记住。 安装完,把patcher 拷贝到安装目录 sudo ./patcher 点击Patch即可。 启动程序,进入安装目录 ./maestro ...

周迪新的博客 1万+

P2801 教主的魔法 —— 分块+sort+暴力

​​​​​​​​​​​​P2801 教主的魔法 写分块的时候一定要注意什么时候用l, r 什么时候用bel[x],bel[y],一不注意就容易出错 // Decline is inevitable, // Romance will last forever. #include <bits/stdc++.h> using namespace std; #define mst(a, x) memset(a, x, sizeof(a)) #define INF 0x3f3f3f3f //#d

Strezia的博客 232

从原理到调试:手把手教你用Matlab解码互补格雷码与相移码(附数据与常见错误排查)

本文详细介绍了如何使用Matlab解码互补格雷码与相移码,涵盖从原理到调试的全过程。通过实际案例和代码示例,帮助读者掌握结构光三维重建中的相位解包裹技术,并提供了常见错误排查与优化建议,提升解码效率与准确性。

weixin_29090917的博客 219

[洛谷p2801]教主的魔法

题目链接: 传送门 题目分析: 很裸的分块题,最开始在原数组上排序WA掉了,还因此调了很久23333 (不过为什么这样一个全是bug的程序交上去会有90分啊 WOJ上甚至还能玄学A过) 大块打标记,小块暴力改,每次改了小块之后把小块所在的整个大块复制到另外一个数组里排序,询问时用二分找比C更大的第一个即可 代码: #include<bits/stdc++.h> #define MAX...

weixin_30852419的博客 158

避开这5个坑!Tushare数据获取与清洗的常见问题解决方案

本文详细解析了使用Tushare进行金融数据分析时常见的5大问题,包括Token失效、数据缺失、频率限制等,并提供了Python实战解决方案。通过智能填充策略、队列化管理和分层存储设计,帮助开发者高效获取和清洗金融数据,提升量化分析效率。特别适合金融数据分析师和Python开发者参考。

f9g0h的博客 419

利用Skipper跨层追踪技术高效定位LVS Short问题

本文详细介绍了如何利用Skipper跨层追踪技术高效定位LVS Short问题。通过解析Skipper的跨层trace net原理和实战操作步骤,帮助芯片设计工程师快速识别版图中的短路问题,显著提升验证效率。文章还提供了处理大规模设计的高级技巧和常见问题排查方法。

weixin_29239661的博客 509

【洛谷 2801】教主的魔法

算法标签:分块

forever_dreams的博客 411

PCIe-Orders set Blocks之symbol对齐

有序集的使用场合很多,如在链路link阶段,进入polling后,便开始有序集的发送。一个 Ordered Set Block 包含一个同步头,后跟一个有序集。多通道链路的所有 Lane 必须同时传输相同的有序集,而且有序集的第一个符号定义了有序集的类型。但在PCIE中,8GT/s及以上的速率,采用的是128b/130b编码。128-bit是想要传输的payload,实际会传输130-bit,多出来的2-bit就是sync header。Block有两种,通过Sync header区分:10b:表示data

weixin_44700185的博客 813

洛谷P2801教主的魔法(分块+二分)

洛谷P2801 分块: ——块数,平方根复杂化 ——边界,min(k*block,n) 二分: 边界,最后的取值 #include&amp;amp;amp;amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;amp;amp;amp;gt; #define maxn 1000010 using namespace std; int n,m,block,num; int a[maxn],b[maxn],ls[maxn],rs[maxn],pos[

weixin_43342048的博客 233

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Luogu P2801 教主的魔法 题解

注意 Python 的输入输出效率。

vday8cV50的博客 186

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

(分块)洛谷 P2801 教主的魔法 题解

之前学过 莫队 算法,其运用了分块思想;但是我居然是第一次写纯种的分块题目。

m0_60506105的博客 999

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

洛谷 P2801 教主的魔法【分块】

题目描述 教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1、2、……、N。 每个人的身高一开始都是不超过1000的正整数。教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W。(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身...

独钓门前月 506

洛谷2801教主的魔法(分块)

刚学习了分块,写篇题解庆祝一下qwq 分块的核心思想是:把一段连续的区间分成若干块,这样当你询问的区间跨过了一块,原本 O ( n ) 的复杂度会降为 O ( 1 ) 或 O ( log ) ,其他零散的部分就暴力,这样就降低了一次询问的复杂度,于是就可以舒服的切掉线段树不能做的题了qwq 分块的建立代码: void build(){//b=belong , le=length , k=块 ...

weixin_30485291的博客 133

洛谷P2801 教主的魔法 分块

题目:https://www.luogu.org/problem/show?pid=2801题意:题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1、2、……、N。每个人的身高一开始都是不超过1000的正整数。教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整

弱智就要多努力 725

洛谷P2801 教主的魔法

首先,如果我要求一段区间的和,这个区间中顶多有sqrt(n)块,零碎的值不超过2*sqrt(n),总时间复杂度sqrt(n),但问题是,修改操作的时间复杂度毫无疑问是O(n),因为不仅是块要改,所有值也要改,否则他们做零散值时值就不正确了。需优化时间复杂度,只需建立一个专门表示每一个块里的所有值加了多少的数组,如果你学过线段树,就知道他叫lazytag,每一个值得真实值,就是它本身加他所属的快对应的lazytag。另外,本人的分块是细节最好写的一种,不用复杂的运算,具体见代码。平时少抄袭,棕名两行泪。

lmn985的博客 469

【洛谷】P2801 教主的魔法

题目地址: https://www.luogu.com.cn/problem/P2801 题目描述: 教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是NNN个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1,2,…,N1, 2, \ldots, N1,2,…,N。每个人的身高一开始都是不超过100010001000100010001000的正整数。教主的魔法每次可以把闭区间[L,R][L, R][L,R](1≤L≤R≤N1≤L≤R≤N1≤L≤R≤N)内的英雄

数学、算法爱好者的博客 470

#分块+二分# [luogu P2801] 教主的魔法

Title P2801 教主的魔法 Solution 注意lower_bound求的是大于等于,upper_bound求的是大于 之前还是比较纳闷有什么题目是分块做的了但是线段树做不了的,发现这道题目可以练一下分块 似乎洛谷上线段树的做法的都是可以被卡掉的。 但是听说: 线段树+分治似乎可以做。 可以重构(排序)每一个区间,以至于单调递增 这样的话,在询问的时候,可以二分处理。 时间复杂度O(q(nlog⁡n))O(q\sqrt{(n\log n)} )O(q(nlogn)​) Code #inc

Nowed 396

【luogu P2801】 教主的魔法

传送门:https://www.luogu.org/problemnew/show/P2801 这道题刚看到的时候感觉就是线段树的两种操作嘛,维护一棵线段树就好了。然并卵我忘记线段树怎么写了。然后就想到打暴力水过数据点,就花了十来分钟打暴力,搞过了样例。但是。。。。最后得了0分,其他巨佬同样写了暴力拿到了100分(果然是我太菜了)。 后来改题的时候看了眼题解,说是要用分块(早已遗忘了分...

weixin_30611509的博客 128

【分块】洛谷P2801 教主的魔法

分块水题

Ajwallet 431

[洛谷P2801]教主的魔法

题目传送门 一道分块的好题。 这题分块后,对于两种操作: ·让区间[l,r]+=w; ·查询区间[l,r]>=c的数的个数 分块后,我们将每一块中的数排序,这样每一块中的查询可以通过二分完成。 对于区间的修改,如果覆盖了整块,通过标签的修改满足题意;如果只是块中的一部分,暴力修改原数组再重新排序维护。 第一个复杂度为$O(\sqrt{n})$,第二个为$O(\sqrt{n}lo...

weixin_34124651的博客 82

洛谷-P2801 教主的魔法 分块

题目 题目链接 题意 修改:将一个区间内所有的数+C。 查询:查询一个区间内&gt;C的数字有多少个。 题解 很经典的分快算法题目。 将数列分块以后,对块内的元素进行排序。 当我们要做修改操作的时候:遇到要修改的完整的块的时候,我们给它在addmark数组的相应的位置+C,标记为我对整个区间做了一个修改操作,有点类似于带lazy标记的线段树的操作。当要修改的部分区间不是...

SUNSET 266
上一篇: 【洛谷P1063】能量项链【区间DP】
下一篇: 【HDU4632】Palindrome subsequence【区间DP】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值