SP3267 DQUERY - D-query(莫队算法,区间不同数)

2024-04-16 01:48

本文主要是介绍SP3267 DQUERY - D-query(莫队算法,区间不同数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意: 询问区间有多少个不同的数。

思路:
莫队裸题。
十分神奇的算法,我觉得关键就是离线排序,但是左端点的判据是第几块(分块),右端点的判据是大小。就这么一点点小改动,大大减小了复杂度ORZ。

#pragma GCC optimize(2)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>using namespace std;const int maxn = 1e6 + 7;
int n,m,t,a[maxn],pos[maxn],L[maxn],R[maxn];
int ans[maxn],cnt[maxn],now;struct Node
{int l,r,id;
}nodes[maxn];int cmp(Node x,Node y)
{return pos[x.l] == pos[y.l] ? x.r < y.r : pos[x.l] < pos[y.l];
}void init()
{t = sqrt(n*1.0);for(int i = 1;i <= t;i++){L[i] = t * (i - 1) + 1;R[i] = t * i;}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;}}
}void add(int x)
{if(cnt[a[x]] == 0)++now;++cnt[a[x]];
}void del(int x)
{--cnt[a[x]];if(cnt[a[x]] == 0)--now;}int main()
{scanf("%d",&n);for(int i = 1;i <= n;i++)scanf("%d",&a[i]);init();scanf("%d",&m);for(int i = 1;i <= m;i++){scanf("%d %d",&nodes[i].l,&nodes[i].r);nodes[i].id = i;}sort(nodes + 1,nodes + 1 + m,cmp);int l = 1,r = 0;//l代表1~l-1都没有,r代表r+1~n都没有for(int i = 1;i <= m;i++){while(l < nodes[i].l)del(l++);while(l > nodes[i].l)add(--l);while(r < nodes[i].r)add(++r);while(r > nodes[i].r)del(r--);ans[nodes[i].id] = now;}for(int i = 1;i <= m;i++)printf("%d\n",ans[i]);return 0;
}

这篇关于SP3267 DQUERY - D-query(莫队算法,区间不同数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907508

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第