牛客挑战赛46 D
2024-10-19 03:17:02
题目链接:
查询有多少\([l,r]\)区间满足每个数出现\(k\)的倍数次
即为\(1\)到\(r\)与\(1\)到\(l-1\)每个数相减的次数为\(k\)的倍数次
可以使用哈希维护
记录每个数出现的次数为\(cnt[x]\),哈希值为\(hash[x]\)
那么前缀哈希和即为\(\sum_{x} cnt[x]*hash[x]\)(\(cnt\)注意要模\(k\))
当我们循环到i时候,更新哈希值,查询得到的哈希值在之前map[hash]出现的次数
(\([l,r]\)区间的哈希值为0)
就可以得到以\(i\)结尾的符合条件区间的个数,从而得到答案
#include <bits/stdc++.h>
#define LL long long
#define ull unsigned long long
using namespace std;
const int N = 1e6 + 101;
int n, k;
int a[N];
ull hash[N], cnt[N], now;
map<ull,int>mp;
ull rnd() { return (ull)rand() * (ull) rand() * (ull) rand(); }
signed main()
{
srand(time(0));
scanf("%d%d",&n,&k);
for(int i = 1;i <= n; i++) hash[i] = rnd();
for(int i = 1;i <= n; i++) scanf("%d",&a[i]);
mp[0] ++;LL ans = 0;
for(int i = 1;i <= n; i++)
{
int x = a[i];
now -= cnt[x] * hash[x];
cnt[x] = (cnt[x] + 1) % k;
now += cnt[x] * hash[x];
ans += mp[now];
mp[now] ++;
}
cout << ans << endl;
}
最新文章
- ThinkPHP框架下的表单验证
- 前端 动态表单提交(post、put)
- C#_数据转换 实用方法
- 用javascript去掉字符串空格的办法
- [转]Java 内部类笔记
- LR:Code - 60990,Code - 10343 问题解决
- 处理div 在IE6 IE7 IE8 下不居中的问题
- LINUX打开文件
- 基于python的Splash基本使用和负载均衡配置
- classmethod 和 staticmethod
- 小程序movable-area置于顶层遮盖下方元素无法操作的解决方案
- FastDFS的单点部署
- java之map的基本介绍
- springboot报错Whitelabel Error Page
- Nginx反向代理及简单负载均衡配置
- stm8 io口重映射
- 分析jvm线程堆栈
- 解决Eclipse异常关闭后重启报 org.eclipse.swt.SWTException: Invalid thread access 的问题
- 一:Bootstrap-css样式
- 817C. Really Big Numbers 二分
热门文章
- 讲武德,你们要的高性能日志工具 Log4j2,来了
- mysql学习——数据表基本操作1
- 如何使用iMindMap制作更专业的时间计划
- 解决-Chrome插件安装时程序包无效:";CRX_HEADER_INVALID";
- 牛客练习赛69 火柴排队 题解(dp)
- 配置Nginx 扩展实现图片剪裁
- [BUGCASE]CI框架的post方法对url做了防xss攻击的处理引发的文件编码错误
- Spring Boot 2.4发布了,但Spring Cloud用户不推荐着急升级
- 从docker介绍及其简介
- Flink实战(102):配置(一)管理配置