[BZOJ3236]:[Ahoi2013]作业(莫队+分块)

题目传送门


题目描述

    此时已是凌晨两点,刚刚做了$Codeforces$的小$A$掏出了英语试卷。英语作业其实不算多,一个小时刚好可以做完。然后是一个小时可与做完的数学作业,接下来是分别都是一个小时可以做完的化学,物理,语文……小$A$压力巨大。
    这时小$A$碰到了一道非常恶心的数学题,给定了一个长度为$n$的数列和若干个询问,每个询问是关于数列的区间$[l,r]$(表示数列的第$1$个数到第$r$个数),首先你要统计该区间内大于等于$a$,小于等于$b$的书的个数,其次是所有大于等于$a$,小于等于$b$的,且在该区间中出现过的数值的个数。
    小$A$望着那数万的数据规模几乎绝望,只能向大神您求救,请您帮帮他吧。


输入格式

 第一行两个数$n,m$,接下来$n$个数(这些数都大于等于$1$小于等于$n$),表示给定数列。
 接下来$m$行,每行四个整数$l,r,a,b$:$l,r$表示询问的区间,$a,b$表示询问的数值的范围。


输出格式

 输出$m$行,分别对应每个询问,输出两个数,分别为在l到r这段区间中大小在$[a,b]$中的数的个数,以及大于等于$a$,小于等于$b$的,且在该区间中出现过的数值的个数(具体可以参考样例)。


样例

样例输入

3 4
1 2 2
1 2 1 3
1 2 1 1
1 3 1 3
2 3 2 3

样例输出

2 2
1 1
3 2
2 1


数据范围与提示

$n=100,000$,$m=1,000,000$


题解

为了防止你们数错0,我专门在百万位和十万位之间加了“,”。

但是$n$却只有$100,000$,那么我们可以考虑莫队,至于统计答案,分块就好了。

不过正解好像是用权值线段树或者是树状数组,但是分块常数较小,跑得不比线段书慢。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec
{
	int l;
	int r;
	int a;
	int b;
	int id;
	int p;
}q[1000001];
int n,m;
int t,tt;
int a[1000001];
int lx[1000001],rx[1000001];
int cnt[1000001],pos[1000001],k[1000001],change[1000001];
int ans1[1000001],ans2[1000001];
bool cmp(rec a,rec b){return a.p==b.p?a.r<b.r:a.p<b.p;}//莫队
void get_answer(int l,int r,int id)//分块找答案
{
	if(pos[l]==pos[r]) 
	{
		for(int i=l;i<=r;i++)
		{
        	ans1[id]+=cnt[i];
        	if(cnt[i])ans2[id]++;
        }
        return;
	}
	if(pos[l])
		for(int i=l;i<=rx[pos[l]];i++)
		{
        	ans1[id]+=cnt[i];
        	if(cnt[i])ans2[id]++;
        }
	if(pos[r])
		for(int i=lx[pos[r]];i<=r;i++)
		{
        	ans1[id]+=cnt[i];
        	if(cnt[i])ans2[id]++;
        }
	if(pos[l]&&pos[r])
		for(int i=pos[l]+1;i<pos[r];i++){ans1[id]+=k[i];ans2[id]+=change[i];}
	if(pos[l]&&!pos[r]) 
	for(int i=pos[l]+1;i<=tt;i++){ans1[id]+=k[i];ans2[id]+=change[i];}
}
int main()
{
	scanf("%d%d",&n,&m);
	t=sqrt(n);
	tt=n/t;
	if(n%t)tt++;
	for(int i=1;i<=tt;i++)
	{
		lx[i]=(i-1)*t+1;
		rx[i]=i*t;
	}
	rx[tt]=n;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d%d",&q[i].l,&q[i].r,&q[i].a,&q[i].b);
		q[i].id=i;
		q[i].p=(q[i].l-1)/t+1;
		pos[i]=(i-1)/t+1;
	}
	sort(q+1,q+m+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=m;i++)
	{
		while(l<q[i].l)
		{
			cnt[a[l]]--;
			k[pos[a[l]]]--;
			if(!cnt[a[l]])change[pos[a[l]]]--;
			l++;
		}
		while(l>q[i].l)
		{
			l--;
			if(!cnt[a[l]])change[pos[a[l]]]++;
			cnt[a[l]]++;
			k[pos[a[l]]]++;
		}
		while(r<q[i].r)
		{
			r++;
			if(!cnt[a[r]])change[pos[a[r]]]++;
			cnt[a[r]]++;
			k[pos[a[r]]]++;
		}
		while(r>q[i].r)
		{
			cnt[a[r]]--;
			k[pos[a[r]]]--;
			if(!cnt[a[r]])change[pos[a[r]]]--;
			r--;
		}
		get_answer(q[i].a,q[i].b,q[i].id);
	}
	for(int i=1;i<=m;i++)
		printf("%d %d\n",ans1[i],ans2[i]);
	return 0;
}

rp++

转载于:https://www.cnblogs.com/wzc521/p/11241882.html

ros入门(八)---TF坐标转换 TF(TransForm),就是坐标转换,包括了位置和姿态两个方面的变换。 阅读详情

相关推荐

手把手教你配置UFS的PSA状态机:WRITE/UNMAP命令实战与LBA映射避雷

本文详细解析了UFS PSA状态机的配置流程,重点探讨了在Pre-soldering状态下WRITE命令的原子性操作原则与单次写入LBA的重要性。通过实战代码示例,指导开发者如何正确初始化PSA环境、切换状态机,并深入剖析了使用UNMAP命令清理LBA映射时的常见陷阱与避雷指南,确保量产数据安全与良率。

weixin_29213525的博客 419

BZOJ3236: [Ahoi2013]作业 莫队+分块

3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MB Submit: 1272  Solved: 490 [Submit][Status][Discuss] Description Input Output Sample Input 3 4 1 2 2 1

Oakley 540

从零到一:手把手教你用Python+LangChain搭建企业级RAG知识库(附避坑指南)

本文为开发者提供了一份详尽的实战指南,手把手教你使用Python和LangChain框架从零构建企业级RAG知识库。内容涵盖环境搭建、文档处理、向量化检索、提示工程及生产部署等核心环节,并重点分享了文档分割、检索优化等关键避坑经验,旨在帮助读者打造稳定、高效且易于维护的智能知识中枢。

weixin_29058331的博客 398

BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 莫队+树状数组: 先考虑每次询问没有权值区间限制的情况,将询问离线排序,用一个数组记录答案,莫队即可。 但现在...

weixin_34204057的博客 189

常见的电容有哪些

电容在电路板中非常常见,类别纷繁复杂,本文化繁为简,主要介绍下常见电容。

qq_40170041的博客 768

第8章 Stata主成分分析与因子分析

在进行数据统计分析时,还往往会遇见变量特别多的情况,而且很多时候这些变量之间还存在着很强的相关关系或者说变量之间存在着很强的信息重叠,如果我们直接对数据进行分析,一方面会带来工作量的无畏的加大,另一方面还会出现一些模型应用的错误,于是主成分分析与因子分析应运而生。这两种分析方法的基本思想都是在不损失大量信息的前提下,利用较少的独立变量来替代原来的变量进行进一步的分析。 8.1主成分分析 基本思想是将众多的初始变量整合成少数几个互相无关的主成分变量,而这些新变量尽可能地包含...

qq_45112156的博客 5万+

BZOJ3236:[AHOI2013]作业(莫队,分块)

Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 1 3 2 2 1 HINT N=100000,M=1000000 Solution 首先有一个比较显然的做法就是用莫队加树...

weixin_34255055的博客 126

解决VMware与Hyper-V/Device Guard冲突的实用指南

本文详细解析了VMware与Hyper-V/Device Guard冲突的根源,并提供了三种实用的解决方案:彻底关闭相关功能、通过启动配置实现选择性引导,以及使用VMware Workstation Pro的Hyper-V兼容模式。指南包含清晰的诊断步骤、操作命令和避坑建议,帮助用户根据自身需求灵活选择,实现虚拟化环境的稳定运行或高效共存。

weixin_29306317的博客 684

bzoj 3236: [Ahoi2013]作业 (莫队+分块)

3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MB Submit: 1547  Solved: 635 [Submit][Status][Discuss] Description Input Output Sample Input 3 4 1 2 2 1 2 1 3

clover_hxy的博客 1191

第十四节《OpenCascade集成Qt》

将 OpenCascade 与 Qt 集成是开发图形界面应用的常见需求。通过将 OpenCascade 的几何建模与 Qt 的图形用户界面(GUI)功能结合,可以创建强大而灵活的 CAD 或建模工具。OpenCascade 提供了与 Qt 的集成接口,允许你在 Qt 应用程序中嵌入 OpenCascade 的视图,执行几何操作,并与用户进行交互。以下是 OpenCascade 与 Qt 集成的详细步骤:首先,确保已安装 OpenCascade 和 Qt。你可以从 OpenCascade 官方网站或通过包管理

yumeiguo的博客 597

层层剖析,让你彻底搞懂Self-Attention、MultiHead-Attention和Masked-Attention的机制和原理

本文内容 本文基于李宏毅老师对 Self-Attention 的讲解,进行理解和补充,并结合Pytorch代码,最终目的是使得自己和各位读者更好的理解Self-Attention 李宏毅Self-Attention链接: https://www.youtube.com/watch?v=hYdO9CscNes PPT链接见视频下方 通过本文的阅读,你可以获得以下知识: 什么是Self-Attention,为什么要用Self-Attention? Self-Attention是如何做的? Self-Atten

iioSnail的博客 2万+

[BZOJ3236][Ahoi2013]作业(莫队+分块)

题目描述传送门题解和Gty的二逼妹子序列那道题是一样的,只不过多加了一问而已 对权值分块,然后将区间离线之后莫队,每一次修改O(1)O(1),查询O(n√)O(\sqrt n)代码#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std;

zyf2000 699

TEA-Tiny Encryption算法在FPGA的实现

在FPGA原型中,我们定义了一个TEA_FPGA模块,该模块包含一个输入数据端口(plain)、一个输入密钥端口(key)和一个输出数据端口(cipher)。在模块中,我们通过32轮的循环处理来实现TEA算法的加密过程,并将最终结果存储在cipher变量中。由于FPGA硬件的高速性能,这种基于HDL的TEA算法实现可以在短时间内完成大量的数据加密处理,从而提高加密效率和性能。总之,在FPGA中实现TEA算法可以大大提高加密效率和性能,通过使用硬件描述语言HDL来实现可以更高效、更快速地完成数据加密操作。

BitSlinger的博客 272

【洛谷4396/BZOJ3236】[AHOI2013]作业(莫队+分块/树状数组/线段树)

题目: 洛谷4396 BZOJ3236(权限) 这题似乎BZOJ上数据强一些? 分析: 这题真的是……一言难尽 发现题面里没说权值的范围,怕出锅就写了离散化。后来经过面向数据编程(以及膜神犇代码)知道最大权值1e51e51e5(下文用MMM表示最大权值。注意如果没有这个限制,把所有数的权值和询问中提到的权值一起离散化后MMM也可以达到n+2m=2.1e6n+2m=2.1e6n+2m=2.1e6),...

Inspector_Javert 213

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Bzoj 3236: [Ahoi2013]作业 莫队,分块

3236: [Ahoi2013]作业 Time Limit:100 SecMemory Limit:512 MBSubmit:1113Solved:428[Submit][Status][Discuss] Description Input Output Sample Input 3 4 1 2 2 1 2 ...

weixin_33973609的博客 120

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

bzoj3236 [Ahoi2013]作业(莫队+分块)

对查询莫队处理,查询区间和分块处理。 复杂度O((n+m)n−√)O((n+m)\sqrt n) 如果用莫队+BIT的话,复杂度是O(nn−√logn)O(n\sqrt nlogn) 其实也是树套树裸题?O(nlog2n)O(nlog^2n)

Icefox的博客 300

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[BZOJ 3236] [Ahoi2013] 作业 && [BZOJ 3809] 【莫队(+分块)】

题目链接: BZOJ - 3236 BZOJ - 3809 算法一:莫队 首先,单纯的莫队算法是很好想的,就是用普通的第一关键字为 l 所在块,第二关键字为 r 的莫队。 这样每次端点移动添加或删除一个数字,用树状数组维护所求的信息就是很容易的。由于这里有 logn复杂度,所以这样移动端点的复杂度还是挺高的。 于是 BZOJ-3236 的时限 100s,我的代码跑了 98s,险过...

weixin_30478757的博客 61

BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块

BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题。 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数。 为了方便,我们规定妹子们的美丽度全都在[1,n]中。 给定一个长度...

279

莫队+分块+树状数组 【Ahoi2013】 作业 bzoj3236

题目大意: 给定一个长度为n的序列,m个询问,询问一段区间内大于等于a小于等于b的数的个数和数值的个数。 n=1e5,m=1e6题目分析: 看到大于等于a小于等于b这个条件,我们可以想到用树状数组来维护区间内比每个数字小的数的个数(数值同理,判断一下就好惹),每次修改都是logn的,并且可以发现,在原有的序列中新加入或减去一个数字,只需要一次修改,也就符合了莫队算法需要的知道[l,r]的答案,

Todobe 466

BZOJ3236: [Ahoi2013]作业(权值分块+莫队)

传送门 听说一堆莫队+树状数组过的。。正解不应该是O(nn√)O(n\sqrt{n})? 莫队配合权值分块有奇效。。#include<bits/stdc++.h> using namespace std; inline int read(){ char ch=getchar();int i=0,f=1; while(!isdigit(ch)){if(ch=='-')f=-1;ch

DZYO的博客 357

BZOJ 3236[AHOI2013]作业

题面: 3236: [Ahoi2013]作业 Time Limit:100 SecMemory Limit:512 MBSubmit:1704Solved:685[Submit][Status][Discuss] Description Input Output Sample Input 3 4...

weixin_30819163的博客 119

bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)

题目传送门:洛谷P4396。 题意简述: 给定一个长度为\(n\)的数列。有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不同的数的个数。 题解: 第一问可以用主席树维护,但是第二问呢? 考虑离线处理询问,用莫队算法。 问题转化为加入一个数,删除一个数,统计数值在一个区间中的数的个数。 离散化后可以...

weixin_30824479的博客 117

Bzoj3236: [Ahoi2013]作业

Bzoj3236: [Ahoi2013]作业 刚学完莫队,不过这题用莫队的复杂度算起来好高啊,居然能过…… 像求逆序对一样用两个树状数组维护区间中每个数值出现的个数,以及每个数是否出现,前者用来求答案1,后者用来求答案2。 在区间伸缩时加入删除最后更新答案即可。 这次压行压的有点厉害,和DeepinC有的一拼了…… 1 #include<algorithm> ...

weixin_30451709的博客 123
上一篇: 从你的全世界路过—一群程序员的稻城亚丁游记
下一篇: 【BZOJ3529】[SDOI2014] 数表(莫比乌斯反演)
badiu_30394251
博客等级 码龄11年 124粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值