【题解】洛谷:P4396 [AHOI2013] 作业(值域分块)

news/2024/11/18 14:21:08/文章来源:https://www.cnblogs.com/sadlin/p/18552504

P4396 [AHOI2013] 作业

值域分块入门题,其实和值域线段树一样道理,就是在值域上分块。

发现有两个限制:数列区间和值域区间,但是发现第二问很像求区间不同的数的个数,直接莫队,但是我们还要对值域分块,我们维护值域块的某个数的出现次数以及块内总和,然后查询时就是普通的分块区间和做法。

#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pir pair<int,int>
#define re register
const int inf=1e9;
const int N=4e5+10;
const int mod=1e9+7;
using namespace std;int n,m;
int a[N];int v;struct ss{int l,r,a,b,id;
}q[N];int len,lenv;
int of[N],ofv[N];int sum[N];//值域上单个数 
int sumv[N];//值域块内个数
int summ[N];//值域块内不重复个数 void del(int x){sum[a[x]]--;sumv[ofv[a[x]]]--;if(sum[a[x]]<=0){summ[ofv[a[x]]]--;} 
}void add(int x){sum[a[x]]++;sumv[ofv[a[x]]]++;if(sum[a[x]]<=1){summ[ofv[a[x]]]++;} 
}int ans1[N],ans2[N];int getans1(int a,int b){int ans=0;b=min(b,v);if(a>v){return 0;}if(ofv[a]==ofv[b]){for(int i=a;i<=b;i++){ans+=sum[i];}return ans;}for(int i=ofv[a]+1;i<=ofv[b]-1;i++){ans+=sumv[i];}for(int i=a;ofv[i]==ofv[a]&&a<=v;i++){ans+=sum[i];}for(int i=b;ofv[i]==ofv[b]&&b>=0;i--){ans+=sum[i];}return ans;
}int getans2(int a,int b){//不同个数 int ans=0;b=min(b,v);if(a>v){return 0;}if(ofv[a]==ofv[b]){for(int i=a;i<=b;i++){ans+=(bool) sum[i];}return ans;}for(int i=ofv[a]+1;i<=ofv[b]-1;i++){ans+=summ[i];}for(int i=a;ofv[i]==ofv[a]&&a<=v;i++){ans+=(bool)sum[i];}for(int i=b;ofv[i]==ofv[b]&&b>=0;i--){ans+=(bool)sum[i];}return ans;
}bool cmp(ss g,ss h){return (of[g.l]^of[h.l])?of[g.l]<of[h.l]:((of[g.l]&1)?g.r<h.r:g.r>h.r);
}signed main(){ios::sync_with_stdio(false);cin.tie(nullptr); cin>>n>>m;len=1.0*n/sqrt(m)+1;for(int i=1;i<=n;i++){cin>>a[i];v=max(v,a[i]);of[i]=(i-1)/len+1;}for(int i=1;i<=m;i++){cin>>q[i].l>>q[i].r>>q[i].a>>q[i].b;q[i].id=i;}lenv=1.0*sqrt(v)+1;for(int i=1;i<=v;i++){ofv[i]=(i-1)/lenv+1;}int l=1,r=0;sort(q+1,q+1+m,cmp);for(int i=1;i<=m;i++){int ql=q[i].l,qr=q[i].r;while(l<ql) del(l++);while(l>ql)	add(--l);while(r<qr) add(++r);while(r>qr)	del(r--);ans1[q[i].id]=getans1(q[i].a,q[i].b);ans2[q[i].id]=getans2(q[i].a,q[i].b);}for(int i=1;i<=m;i++){cout<<ans1[i]<<" "<<ans2[i]<<"\n";}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

京准电钟:NTP网络时间服务器是什么?功能是什么?

京准电钟:NTP网络时间服务器是什么?功能是什么?京准电钟:NTP网络时间服务器是什么?功能是什么? 京准电钟:NTP网络时间服务器是什么?功能是什么? 京准电钟官微——ahjzsz HR-901GB系列ntp网络时间服务器是一款专为国产信创设计的高精度北斗卫星授时设备,其核心功能是为…

从零开始学机器学习——聚类可视化RV

教程名称:使用 C# 入门深度学习 作者:痴者工良 地址: https://torch.whuanle.cn 目录* 微积分极限 导数求导公式 乘除求导例题 复合函数求导的链式法则 Sigmoid 函数的导数 求最小值问题微分 积分 偏导数多元函数定义域 多元函数的值:veee加速器 多元函数的极限 偏导数 全微…

cmu15545笔记-查询执行(Query Excution)Eu

目录* 执行模型Iterator Model Materialization Model Vectoriazation Model 对比数据访问方式:豆荚加速器Sequential Scan Index Scan Multi-Index ScanHalloween Problem 表达式求值执行模型 执行模型(Processing Model)定义了数据库系统如何执行一个查询计划。 Iterator M…

100 款支持 .NET 多版本的强大 WPF 控件库

前言 推荐一款集成了超过100款控件的流行 XAML 控件库,同时提供了一系列常用的 .NET 帮助类-CookPopularUI。它可以简化开发流程,让我们能够更加专注于核心业务逻辑的实现。 让我们一起学习如何使用 CookPopularUI,并详细了解其提供的丰富控件内容。 项目介绍 CookPopularUI…

广东电子MES系统SMT生产管理软件系统特点

电子mes系统SMT(表面贴装技术)生产管理软件系统的特点可以归纳如下: 实时性与准确性:SMT MES系统能够实时监控生产过程中的各个环节,确保生产过程的顺利进行。系统对生产过程中的数据进行准确采集和处理,保证了数据的真实性和可靠性。集成性与灵活性:SMT MES系统可以实现…

Avalonia使用

准备工作VS2022专业版 注意:如果需要嵌入主窗体中,那么那么一定要创建控件视图,我使用窗体视图嵌入失败了。 创建好这运行测试,必须运行成功。 (当前第一集 创建项目 下一集 创建登录窗体)

PowerQuery 工具2

PowerQuery 工具2 引用数据的两种常用方式方式1 由外部链接创建数据透视表 具体操作请参考PowerQuery 工具1 - 一只小小小飞猪 - 博客园,这里需要注意,如果给的数据源不存在不规范的类型,请直接跳过修改过程,直接在首页——关闭并上载至优点: 适用于原数据所在文件夹路径不…

Electron框架使用vue开发跨平台桌面工具应用-后台日志发送到前台和执行导入ZIP

一、后台日志发送到前台首先在preload.js里面注册回调因为需要主窗口给vue页面发送,需要把窗口管理起来,不能直接写在backgroud.js里面。需要暴露出来所以编写了windowManager.js// windowManager.js let mainWindow = null;// 设置 mainWindow export function setMainWindo…

强化学习理论-第5课-蒙特卡洛方法

之前的章节都是基于model base,这节是model free的方法。 1. model-base to model-free:2. 计算\(q_{\pi k}:\)3. MC base algorithm:step 1和model base是不一样的,后面的步骤是一样的。4. MC exploring starts算法:

Charles抓取不到浏览器请求(macOS)解决方案

一.Charles charles抓包工具,通常使用默认的端口号: http:8888 https:8443 在安装好Charles后,默认情况下http代理服务器运行在8888端口,https服务器运行在8443端口 二.解决方案: 1.先把证书安装上下载证书后,打开macOS-【钥匙串访问】,选择证书,右键【显示简介】--【…

打工人提效必备!4款好用的Win电脑效率工具

今天来给大家分享 4 款我换了 5 台电脑都一定会安装的效率神器软件,每一款都能让你的办公、学习效率大幅提升! 1、Everything 这是一款文件搜索神器!相信大家都有过在电脑里找文件找得焦头烂额的经历吧?Everything 就能完美解决这个问题。 它的搜索速度超快,几乎是秒出结果…