20241120 校内模拟赛 T3 题解
题目描述
给定一个数列 \(A\),数列的元素取值范围为 \([1,m]\)。
请计算有多少个非空子区间满足以下条件:该区间内每个元素的出现次数都相同(没有出现的元素视为出现 \(0\) 次)。
例如,当 \(m=3\) 时,\([1,2,3]\) 和 \([1,1,3,2,3,2]\) 是满足条件的区间,而 \([1,2,2,3]\) 和 \([1,1,3,3]\) 不满足条件。
请计算数列 \(A\) 的满足条件的非空子区间数量。
输入格式
包含多组测试数据,第一行一个正整数 \(T\) 代表数据组数。
每组数据两行,第一行两个整数 \(n,m\),代表序列长度和元素值域。
第二行 \(n\) 个整数,代表该序列,保证序列中的元素在 \([1,m]\) 之间。
输出格式
\(T\) 行,每行一个整数,代表对应组数数据的序列的满足条件的非空子区间个数。
样例
样例输入 1
1
6 3
1 2 3 1 2 3
样例输出 1
5
样例解释 1
有 \([1,3],[2,4],[3,5],[4,6],[1,6]\) 共 \(55\) 个。
样例输入 2
1
10 4
1 1 2 4 3 2 4 3 2 1
样例输出 2
3
样例解释 2
有 \([2,5],[1,8],[7,10]\) 共 \(33\) 个。
数据范围与提示
对于 \(100%\) 的数据, \(1≤T≤5,1≤n≤106,1≤m≤n\)。
| 测试点 | \(n\) | \(m\) |
|---|---|---|
| \(1\) | \(≤50\) | \(≤50\) |
| \(2\) | \(≤300\) | \(≤300\) |
| \(3\) | \(≤3000\) | \(≤3000\) |
| \(4\) | \(≤7000\) | \(≤7000\) |
| \(5,6,7\) | \(≤7 × 10^4\) | \(≤300\) |
| \(8\) | \(≤3×10^5\) | \(≤3×10^5\) |
| \(9,10\) | \(≤10^6\) | \(≤10^6\) |
解法说明
首先让我们考虑一下暴力的做法。记 \(f_{i,j}\) 为截至第 \(i\) 项数字 \(j\) 出现的次数,显然对于区间 \((l,r]\),当且仅当 \(\forall i,j \in [1,m],f_{r,i}-f_{l,i}=f_{r,j}-f_{l,j}\) 时,该区间合法。
接下来考虑优化。这事实上等价于对 \(f_i\) 和 \(f_j\) 求差分数组,当二者差分数组相同时,该区间合法。此时原问题转化为维护每个位置 \(f\) 的差分数组的集合,寻找匹配数。可以使用类似异或哈希的技巧,求出每个位置 \(f\) 的差分数组的哈希值,从而快速求出答案。如此复杂度已足够优秀,可以拿到满分。
但从上文的异或哈希角度出发,还能得到一个更简单的做法。用梅森旋转生成 \(m-1\) 个数,分别作为 \(A_1\) 到 \(A_{m-1}\) 的哈希值,记其和的相反数为 \(A_m\) 的哈希值。令 \(id_i\) 表示 \(i\) 的哈希值,记 \(f_i=\sum_{j=1}^i id_{A_j}\),当所有数出现次数相同时,其哈希值之和应为 \(0\)。即对于区间 \((l,r]\),当且仅当 \(f_l=f_r\) 时,该区间合法。故 \(f\) 中的相同元素的对数即为原问题的答案。
通过代码
#include<bits/stdc++.h>
#define int long long//记得开long long
#define ull unsigned long long
const int N=1e6+10;
namespace IO{
inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return x*f; }
inline void write(int x){ if(x>9) write(x/10); putchar(x%10+'0'); }
}using namespace IO;//快读快写
namespace code{
int n,m,ans,id[N];
ull a[N],sum;
std::mt19937_64 random(time(0));//用梅森旋转算法生成高质量的伪随机数序列
void solve(){
n=read(),m=read(),ans=0,sum=0;//多测不清空,亲人两行泪
for(int i=1;i<m;++i) id[i]=random(),sum+=id[i];//为第 1 到 m-1 项赋哈希值
id[m]=-sum;//第 m 项的哈希值为前 m-1 项的哈希值的和的相反数
for(int i=1;i<=n;++i) a[i]=a[i-1]+id[read()];//a[i] 表示第 1 到 i 项的哈希值的和
std::sort(a,a+n+1);//排序,方便计算
for(int i=1,cnt=1;i<=n;++i,++cnt,ans+=cnt-1) if(a[i]!=a[i-1]) cnt=0;//累加答案
write(ans),putchar('\n');
}
}
signed main(){
int T=read();
while(T--) code::solve();
return 0;
}
20241120 校内模拟赛 T3 题解的更多相关文章
- [校内模拟赛T3]火花灿灿_二分答案_组合数学_贪心
火花灿灿 题目: 数据范围: 题解: 这个题真的是个神仙题. 我们对于每块石头维护一个$01$串. 这个$01$串的长度是操作次数. 如果$01$串的当前位是$1$,表示这次操作中当前石子被划分到了贡 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- 【20170521校内模拟赛】热爱生活的小Z
学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...
- 20180520模拟赛T3——chess
[问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...
- 2020.3.23 模拟赛游记 & 题解
这次的模拟赛,实在是水. 数据水,\(\texttt{std}\) 水,出题人水,做题人也水.??? 游记就说一句: 水. T1 metro 弱智题. 人均 \(100pts\). #pragma G ...
- 体育成绩统计——20180801模拟赛T3
体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...
- lcez校内模拟赛: 小R与苹果派——题解
题目传送 首先对两个数组排序. 然后预处理出数组p[i]表示b[x]<a[i]的最大的x. 然后我们设f[i][k]表示对于前i个派,我单独选出来k组a[y]>b[y].(即此时有k组a& ...
- 20180711模拟赛T3——聚变
文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核 ...
- 20161005 NOIP 模拟赛 T3 解题报告
subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...
- 【20170920校内模拟赛】小Z爱学习
所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...
随机推荐
- 使用go+gin编写日志中间,实现自动化收集http访问信息,错误信息等,自动化生成日志文件
1.首先在logger包下 点击查看代码 package logger import ( "fmt" "io" "net/http" &qu ...
- 神经网络之卷积篇:详解池化层(Pooling layers)
详解池化层 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,来看一下. 先举一个池化层的例子,然后再讨论池化层的必要性.假如输入是一个4×4矩阵,用到的 ...
- c程序设计语言 by K&R(四)输入与输出
一.标准输入.输出 1. 简单的输入\输出机制 从标准输入中一次读取一个字符:int getchar(void) 将字符c送到标准输出中: int putchar(int) 2. 输入重定向 如果程序 ...
- Linux (Debian) 安装MySQL 后如何获取登录密码
树莓派安装MySQL后获取登录密码 树莓派基于Debian系统. 成功安装MySQL后 su root vim /etc/mysql/debian.cnf 其中 user 和 password 就是你 ...
- echarts的x轴显示不全的解决办法
echarts的x轴显示不全的解决办法 一.背景 当x轴类目较多时,label显示时会自动间隔显示,也就是会隐藏掉中间的label,如下图: 二.解决办法 通过设置 xAxis.axisLabel.i ...
- TextIn文档树引擎,助力RAG知识库问答检索召回能力提升
TextIn团队的文档解析测评工具Markdown Tester在Github发布后,我们陆续与大家探讨了目前业内对PDF解析工作的评判标准与我们各项测评指标的设计原理,包括段落.表格.公式.阅读 ...
- TFC-Pretraining: 基于时间频率一致性对时间序列进行自监督对比预训练《Self-Supervised Contrastive Pre-Training for Time Series via Time-Frequency Consistency》(时间序列、时序表征、时频一致性、对比学习、自监督学习)
2023年11月10日,今天看一篇论文,现在17:34,说实话,想摆烂休息,不想看,可还是要看,拴Q. 论文:Self-Supervised Contrastive Pre-Training for ...
- HTML – W3Schools 学习笔记
有用链接: HTML Attribute Reference (查看所有 Attributes) HTML Paragraphs Link to W3Schools <p> 里面 doub ...
- Java 动态编译工具 Janino 和 Liquor 差别
如果你只要 Java7 及以下的语法支持,建议 Janino.如果要你想更全的 Java8.Java11.Java17.Java21 等语法,可以选 Liquor. 1.它们相同的地方 提供的相似的能 ...
- linux操作系统和文件系统,命令(上)
Linux是一个类似于windows的操作系统 Linux操作系统的一种主要使用方式是通过终端软件:终端软件里只能使用键盘不能使用鼠标,在终端软件里通过输入命令完成各种任务 clear命令可以删除终端 ...