数列分块<2>

news2024/9/28 19:27:17

本期是数列分块入门<2>。该系列的所有题目来自hzwer在LOJ上提供的数列分块入门系列。

Blog:http://hzwer.com/8053.html                       sto   hzwer   orz          %%%            [转载]

好像上面的链接↑打不开,放一个转载:https://www.cnblogs.com/ve-2021/articles/9135559.html

------------------------------------------------------------------------------------------------------------------------

LOJ-P6279:

接着第二题的解法,其实只要把块内查询的二分稍作修改即可。

不过这题其实想表达:可以在块内维护其它结构使其更具有拓展性,比如放一个set,这样如果还有插入、删除元素的操作,会更加的方便。

#include <bits/stdc++.h>
using namespace std;
const int maxn=10000S;
int a[maxn],idx[maxn],tag[maxn],tot=1000;
set<int> st[10S];
void change(int l,int r,int c){
    for(int i=l;i<=min(idx[l]*tot,r);i++){
        st[idx[l]].erase(a[i]);
        a[i]+=c;
        st[idx[l]].insert(a[i]);
    }
    if(idx[l]!=idx[r]){
        for(int i=(idx[r]-1)*tot+1;i<=r;i++){
            st[idx[r]].erase(a[i]);
            a[i]+=c;
            st[idx[r]].insert(a[i]);
        }
    }
    for(int i=idx[l]+1;i<=idx[r]-1;i++)
        tag[i]+=c;
}
int query(int l,int r,int c){
    int ans=-1;
    for(int i=l;i<=min(idx[l]*tot,r);i++){
        int val=a[i]+tag[idx[l]];
        if(val<c)
			ans=max(val,ans);
    }
    if(idx[l]!=idx[r]){     
        for(int i=(idx[r]-1)*tot+1;i<=r;i++){
            int val=a[i]+tag[idx[r]];
            if(val<c)
				ans=max(val,ans);
        }
    }
    for(int i=idx[l]+1;i<=idx[r]-1;i++){
        int x=c-tag[i];
        set<int>::iterator itr=st[i].lower_bound(x);
        if(itr==st[i].begin())
			continue;
        --itr;
        ans=max(ans,*itr+tag[i]);
    }
    return ans;
}
int main(){
	int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    	cin>>a[i]; 
    for(int i=1;i<=n;i++){
        idx[i]=(i-1)/tot+1;
        st[idx[i]].insert(a[i]);
    }
    for(int i=1;i<=n;i++){
        int opt,l,r,c;
        cin>>opt>>l>>r>>c;
        if(opt==0)
			change(l,r,c);
        if(opt==1)
			cout<<query(l,r,c)<<endl;
    }
    return 0;
}

LOJ-P6280:

这题的询问变成了区间上的询问,不完整的块还是暴力;而要想快速统计完整块的答案,需要维护每个块的元素和,先要预处理一下。

考虑区间修改操作,不完整的块直接改,顺便更新块的元素和;完整的块类似之前标记的做法,直接根据块的元素和所加的值计算元素和的增量。

#include <bits/stdc++.h>
using namespace std;
int idx[50005],tot;
long long a[50005],tag[50005],sum[50005];
void change(int l,int r,int c){
    for(int i=l;i<=min(idx[l]*tot,r);i++){
        a[i]+=c;
		sum[idx[l]]+=c;
	}
    if(idx[l]!=idx[r]){
        for(int i=(idx[r]-1)*tot+1;i<=r;i++){
            a[i]+=c;
			sum[idx[r]]+=c;
		}
    }
    for(int i=idx[l]+1;i<=idx[r]-1;i++)
        tag[i]+=c;
}
long long query(int l,int r){
    long long ans=0;
    for(int i=l;i<=min(idx[l]*tot,r);i++)
        ans+=a[i]+tag[idx[l]];
    if(idx[l]!=idx[r]){
        for(int i=(idx[r]-1)*tot+1;i<=r;i++)
            ans+=a[i]+tag[idx[r]];
    }
    for(int i=idx[l]+1;i<=idx[r]-1;i++)
        ans+=sum[i]+tot*tag[i];
    return ans;
}
int main(){
	int n;
    cin>>n;
	tot=sqrt(n);
    for(int i=1;i<=n;i++)
		cin>>a[i];
    for(int i=1;i<=n;i++){
        idx[i]=(i-1)/tot+1;
        sum[idx[i]]+=a[i];
    }
    for(int i=1;i<=n;i++){
        int opt,l,r,c;
        cin>>opt>>l>>r>>c; 
        if(opt==O)
			change(l,r,c);
        if(opt==1)
            cout<<query(l,r)%(c+1)<<endl;
    }
    return 0;
}

LOJ-P6281:

稍作思考可以发现,开方操作比较棘手,主要是对于整块开方时,必须要知道每一个元素,才能知道他们开方后的和,也就是说,难以快速对一个块信息进行更新。

看来我们要另辟蹊径。不难发现,这题的修改就只有下取整开方,而一个数经过几次开方之后,它的值就会变成0或者1

如果每次区间开方只不涉及完整的块,意味着不超过2\sqrt{n}个元素,直接暴力即可。

如果涉及了一些完整的块,这些块经过几次操作以后就会都变成01,于是我们采取一种分块优化的暴力做法,只要每个整块暴力开方后,记录一下元素是否都变成了01,区间修改时跳过那些全为01的块即可。

这样每个元素至多被开方不超过4次,显然复杂度没有问题。

#include <bits/stdc++.h> 
using namespace std;
int a[50005],sum[50005],idx[50005],tot;
bool flag[50005];
void solve(int x){
    if(flag[x])
		return;
    flag[x]=1;
    sum[x]=0;
    for(int i=(x-1)*tot+1;i<=x*tot;i++){
        a[i]=sqrt(a[i]);
		sum[x]+=a[i];
        if(a[i]>1)
			flag[x]=0;
    }
}
void change(int l,int r,int c){
    for(int i=l;i<=min(idx[l]*tot,r);i++){
        sum[idx[l]]-=a[i];
        a[i]=sqrt(a[i]);
        sum[idx[l]]+=a[i];
    }
    if(idx[l]!=idx[r]){
        for(int i=(idx[r]-1)*tot+1;i<=r;i++){
            sum[idx[r]]-=a[i];
            a[i]=sqrt(a[i]);
            sum[idx[r]]+=a[i];
        }
    }
    for(int i=idx[l]+1;i<=idx[r]-1;i++)
        solve(i);
}
int query(int l,int r){
    int ans=0;
    for(int i=l;i<=min(idx[l]*tot,r);i++)
        ans+=a[i];
    if(idx[l]!=idx[r]){
        for(int i=(idx[r]-1)*tot+1;i<=r;i++)
            ans+=a[i];
    }
    for(int i=idx[l]+1;i<=idx[r]-1;i++)
        ans+=sum[i];
    return ans;
}
int main(){
	int n;
    cin>>n;
	tot=sqrt(n);
    for(int i=1;i<=n;i++)
		cin>>a[i];
    for(int i=1;i<=n;i++){
        idx[i]=(i-1)/tot+1;
        sum[idx[i]]+=a[i];
    }
    for(int i=1;i<=n;i++){
        int opt,l,r,c;
        cin>>opt>>l>>r>>c;
        if(opt==0)
			change(l,r,c);
        if(opt==l)
            cout<<query(l,r)<<endl;
    }
    return 0;
}

友情提醒:不要Ctrl C+Ctrl V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1919632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CUDA原子操作

代码 #include <cuda_runtime.h> #include <stdio.h>__global__ void atomicAddAndGet(int *result, int *valueToAdd) {// 原子加法int addedValue atomicAdd(result, *valueToAdd);// 通过原子操作后读取值&#xff0c;确保是加法后的值addedValue *valueToAd…

LabVIEW开发CAN总线多传感器液位检测系统

设计并实现了一个基于CAN总线和LabVIEW的多传感器液位检测系统。该系统利用STM32F107单片机进行模拟信号与数字信号的转换&#xff0c;通过TJA1050实现CAN总线通信&#xff0c;并使用USB-CAN分析仪连接PC。LabVIEW用于数据采集、人机交互界面的设计、数据分析和仪器标定。系统能…

前端必修技能:高手进阶核心知识分享 - 三万字帮你搞定CSS动画(形变动画、过渡动画、关键帧动画)

在CSS的世界里,存在着多种能体现动画效果的属性:CSS transform、CSS Transition 和 CSS Animation。让开始接触CSS的同学感到困惑。要搞清楚CSS的动画,我们就必须先把这几种属性做一下区别。 CSS transform 属性、CSS Transition 属性、 CSS Animation 属性的区别 CSS tra…

FL Studio21.5.3.21中文版破解安装包!音乐制作新神器,让创意无限飞扬!

&#x1f3b6; 音乐制作&#xff0c;轻松入门&#xff01;FL Studio21中文版本体验分享 嘿&#xff01;各位音乐小能手和创作小白们&#xff0c;今天我要给大家安利一个超酷炫的音乐制作软件——FL Studio21中文版&#xff01;&#x1f389; FL Studio21汉化版下载网盘链接: …

Python函数 之 模块和包---练习

题目 1 1.定义一个模块 toolls.py , 定义函数实现对两个数据进行加法操作的函数 add_2_num &#xff0c;并返回相加之和的结 果&#xff1b; 再定义一个实现对三个数据进行加法操作的函数 add_3_num &#xff0c;并返回相加之和的结果&#xff1b; 2.最后新定义一个代码文件 …

AutoMQ vs Kafka: 来自小红书的独立深度评测与对比

测试背景 当前小红书消息引擎团队与 AutoMQ 团队正在深度合作&#xff0c;共同推动社区建设&#xff0c;探索云原生消息引擎的前沿技术。本文基于 OpenMessaging 框架&#xff0c;对 AutoMQ 进行了全面测评。欢迎大家参与社区并分享测评体验。 01 测试结论 本文主要测评云…

JavaDS —— 单链表 与 LinkedList

顺序表和链表区别 ArrayList &#xff1a; 底层使用连续的空间&#xff0c;可以随机访问某下标的元素&#xff0c;时间复杂度为O&#xff08;1&#xff09; 但是在插入和删除操作的时候&#xff0c;需要将该位置的后序元素整体往前或者向后移动&#xff0c;时间复杂度为O&…

二分查找算法——部分OJ题详解

目录 关于二分查找算法 部分OJ题详解 704.二分查找 一&#xff0c;分析题目 二&#xff0c;细节处理 三&#xff0c;题目代码 四&#xff0c;*总结朴素模板 *34.在排序数组中查找元素的第一个和最后一个位置 一&#xff0c;查找左端点 二&#xff0c;处理左端点细…

ts实现将相同类型的数据通过排序放在一起

看下效果&#xff0c;可以将相同表名称的字段放在一起 排序适用于中英文、数字 // 排序 function sortByType(items: any) {// 先按照类型进行排序items.sort((a: any, b: any) > {if (a.label < b.label) return -1;if (a.label > b.label) return 1;return 0;});r…

【记录】LaTex|LaTex调整算法、公式、表格内的字体大小(10种内置字号)

文章目录 【记录】LaTex&#xff5c;LaTex调整算法、公式、表格内的字体大小&#xff08;10种内置字号&#xff09;省流版1 字体大小2 测试代码 详细版1 \tiny2 \scriptsize3 \footnotesize4 \small5 \normalsize6 \large7 \Large8 \LARGE9 \huge10 \Huge 【记录】LaTex&#x…

实验02 黑盒测试(组合测试、场景法)

1. 组合测试用例设计技术 指出等价类划分法和边界值分析法通常假设输入变量相互独立&#xff0c;但实际情况中变量间可能存在关联。全面测试&#xff1a;覆盖所有输入变量的所有可能组合&#xff0c;测试用例数量随输入变量的增加而指数增长。 全面测试需要对所有输入的各个取…

Geoserver源码解读六 插件

系列文章目录 Geoserver源码解读一 环境搭建 Geoserver源码解读二 主入口 Geoserver源码解读三 GeoServerBasePage Geoserver源码解读四 REST服务 Geoserver源码解读五 Catalog Geoserver源码解读六 插件&#xff08;怎么在开发模式下使用&#xff09; 目录 系列文章目…

ubuntu计划任务反弹

目录 实验环境 实验步骤 目标主机构造任务计划 构造语句 语句解释 kali开启监听 监听成功 问题 原因 实验环境 攻击者 操作系统&#xff1a;kali IP&#xff1a;192.168.244.141 目标主机 操作系统&#xff1a;ubuntu IP&#xff1a;192.168.244.151 实验步骤 目…

CSS 中的 ::before 和 ::after 伪元素

目录 一、CSS 伪元素 二、::before ::after 介绍 1、::before 2、::after 3、content 常用属性值 三、::before ::after 应用场景 1、设置统一字符 2、通过背景添加图片 3、添加装饰线 4、右侧展开箭头 5、对话框小三角 6、插入icon图标 一、CSS 伪元素 CSS伪元…

数据库使用SSL加密连接

简介 数据库开通SSL加密连接是确保数据传输过程中安全性的关键措施&#xff0c;它通过加密数据、验证服务器身份、保护敏感信息、维护数据完整性和可靠性&#xff0c;同时满足行业标准和法规要求&#xff0c;进而提升用户体验和信任度&#xff0c;为企业的数据安全和业务连续性…

做工和音质都堪称典范!悠律Ringbuds pro耳机动感低音享受

想要长时间佩戴舒适&#xff0c;又要听歌看电影音质好&#xff0c;还想户外运动时不影响听到环境声音&#xff0c;开放式毋容置疑是最好的选择&#xff0c;像我每天坐地铁上下班的时候都会习惯戴耳机&#xff0c;但以前戴入耳式耳机的时候经常会错过站点&#xff0c;耽误了不少…

TREK高压功率放大器维修trek高压电源609E-6

美国Trek维修产品包括&#xff1a;高压放大器、电源、静电电压表、高压功能发生器、放大器、静电测量仪、荷电板、信号放大器、高压电源、功率放大器、高压功能发生器、高压放大器、接触电压表、非接触式电压表、板载控制器、ESD和传感器、ESD电压表、带电板、电离器、表面电阻…

HashMap----源码解读

源码分析&#xff1a; public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable 在类的开头声明了几个常量&#xff0c;以下是较为重要的&#xff1a; /*** 定义初始容量大小为16*/ static final int DEFAULT_I…

【射频器件供应】 Marki Microwave

射频、微波和毫米波组件 裸片、表面贴装、连接器和波导 直流至Sub-THz Marki Microwave通过创建强大的性能突破性射频和微波组件产品组合&#xff0c;解决了业界最棘手的技术问题。Marki Microwave 成立于 1991 年&#xff0c;以开发业内最好的混频器为目标&#xff0c;如今已…

kaggle提交csv文件

使用colab完成实验后 将要提交的csv文件拖到kaggle网站自己加入的competition就行 如果kaggle网站无法注册&#xff0c;往往是人机验证问题&#xff1a; kaggle网站验证