美团codem 数列互质 - 莫队
题目描述
给出一个长度为 nnn 的数列 a1,a2,a3,...,an{ a_1 , a_2 , a_3 , ... , a_n }a1,a2,a3,...,an,以及 mmm 组询问 (li,ri,ki)( l_i , r_i , k_i)(li,ri,ki),求区间 [li,ri][ l_i , r_i ][li,ri] 中有多少数在该区间中的出现次数与 kik_iki 互质。
输入格式
第一行,两个正整数 n,mn , mn,m。
第二行,nnn 个正整数 aia_iai 描述这个数列。
接下来 mmm 行,每行三个正整数 li,ri,kil_i , r_i , k_ili,ri,ki,描述一次询问。
输出格式
输出 mmm 行,即每次询问的答案。
样例
样例输入
10 5
1 1 1 1 1 2 2 2 2 2
4 7 2
4 7 3
4 8 2
4 8 3
3 8 3
样例输出
0
2
1
1
0
数据范围与提示
- 1≤n,m≤5×1041\le n,m\le 5\times 10^41≤n,m≤5×104
- 1≤ai≤n1\le a_i\le n1≤ai≤n
- 1≤li≤ri≤n1\le l_i\le r_i\le n1≤li≤ri≤n
- 1≤ki≤n1\le k_i\le n1≤ki≤n
思路分析 : 莫队基本题目,暴力维护的区间的元素有区间内不同元素的出现次数,同时再记录一下出现不同的次数有多少次,记录一下某个区间不同次数的种类,类似链表
复杂度 :某个区间不同元素的次数种类最多有 根号n 种,总的复杂度就是 n*sqrt(n)*log(n)
写的时候有个地方写错了,就是分块的排序的地方... 一直TLE
代码示例 :
using namespace std;
#define ll long long
const int maxn = 5e4+5;
const int mod = 1e9+7;
const double eps = 1e-9;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f; inline int read()
{
int ret=0,c,f=1;
for(c=getchar(); !(isdigit(c)||c=='-'); c=getchar());
if(c=='-') f=-1,c=getchar();
for(; isdigit(c); c=getchar()) ret=ret*10+c-'0';
if(f<0) ret=-ret;
return ret;
} int n, m;
struct node
{
int zu;
int l, r, k, id; bool operator< (const node &v)const{
if (zu == v.zu) return r < v.r;
return l < v.l;
}
}a[maxn];
int pre[maxn], cnt[maxn];
int num[maxn], time2[maxn<<2];
int all;
bool pt[maxn<<2];
int ans[maxn]; int gcd(int a, int b){
return b==0?a:gcd(b, a%b);
} inline void remove(int x){
cnt[x]--;
num[cnt[x]]++, num[cnt[x]+1]--;
time2[all++] = cnt[x];
} inline void add(int x){
cnt[x]++;
num[cnt[x]]++, num[cnt[x]-1]--;
time2[all++] = cnt[x];
} int main() {
int l, r, k; cin >> n >> m;
int unit = sqrt(n);
for(int i = 1; i <= n; i++) pre[i] = read();
for(int i = 1; i <= m; i++){
l = read(), r = read(), k = read();
//scanf("%d%d%d", &l, &r, &k);
int f = (l-1)/unit+1;
a[i] = {f, l, r, k, i};
}
sort(a+1, a+1+m); l = a[1].l, r = a[1].l-1;
all = 1; int sum = 0;
for(int i = 1; i <= m; i++){
while(l < a[i].l) remove(pre[l++]);
while(r > a[i].r) remove(pre[r--]);
while(l > a[i].l) add(pre[--l]);
while(r < a[i].r) add(pre[++r]);
k = 1; sum = 0;
for(int j = 1; j < all; j++){
if (!pt[time2[j]] && num[time2[j]] > 0){
if (gcd(time2[j], a[i].k) == 1) {
sum += num[time2[j]];
}
time2[k++] = time2[j];
pt[time2[j]] = true;
}
}
all = k;
ans[a[i].id] = sum;
for(int j = 1; j < k; j++) pt[time2[j]] = false;
}
for(int i = 1; i <= m; i++) printf("%d\n", ans[i]);
return 0;
}
美团codem 数列互质 - 莫队的更多相关文章
- #6164. 「美团 CodeM 初赛 Round A」数列互质-莫队
#6164. 「美团 CodeM 初赛 Round A」数列互质 思路 : 对这个题来言,莫队可以 n*根号n 离线处理出各个数出现个的次数 ,同时可以得到每个次数出现的次数 , 但是还要处理有多少 ...
- [美团 CodeM 初赛 Round A]数列互质
题目大意: 给出一个长度为n的数列a1,a2,a3,...,an,以及m组询问(li,ri,ki),求区间[li,ri]中有多少数在该区间中的出现次数与ki互质. 思路: 莫队. f[i]记录数字i出 ...
- Loj #6164. 「美团 CodeM 初赛 Round A」数列互质
link : https://loj.ac/problem/6164 莫队傻题,直接容斥做. #include<bits/stdc++.h> #define maxn 100005 #de ...
- 洛谷P3901 数列找不同 [莫队]
题目传送门 题目描述 现有数列 A_1,A_2,\cdots,A_NA1,A2,⋯,AN ,Q 个询问 (L_i,R_i)(Li,Ri) , A_{Li} ,A_{Li+1},\cdots, ...
- luogu 数列找不同-莫队
https://www.luogu.org/problemnew/show/P3901 了解过莫队的人应该都清楚,莫队是一个优化的暴力,可以在相对暴力比较优的时间中,求出一段序列内的某些性质(例:数字 ...
- wannafly 练习赛10 E 数列查找(莫队+分块分块分块......)
链接:https://www.nowcoder.net/acm/contest/58/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...
- 洛谷P3901 数列找不同(莫队水题)
重温下手感,判断区间是否全是不同的数字有两种做法,一个长度为len的区间不同的数字,参见HH的项链,一种是区间众数,参见蒲公英,是水题没错了.明天搞数据库,然后继续自己的gre和训练计划 #inclu ...
- 「美团 CodeM 初赛 Round A」试题泛做
最长树链 树形DP.我们发现gcd是多少其实并不重要,只要不是1就好了,此外只要有一个公共的质数就好了.计f[i][j]表示i子树内含有j因子的最长链是多少.因为一个数的不同的质因子个数是log级别的 ...
- 【莫队】【P3901】 数列找不同
Description 现在有一个长度为\(~n~\)的数列\(~A_1~,~A_2~\dots~A_n~\),\(~Q~\)个询问\(~[l_i~,~r_i]~\),每次询问区间内是否有元素相同 I ...
随机推荐
- THINKPHP框架的优秀开源系统推荐
THINKPHP框架的优秀开源系统推荐 众所周知,国内众多优秀的开源框架,ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性.并且拥有众多的原创功能 ...
- P1101 走迷宫一
题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...
- JavaScript DOM查询,原生js实现元素子节点的获取
在网页网页开发中,经常会需要获取某个网页元素的子元素,然后对其进行事件绑定.或样式修改等行为.这些操作对于jquery来说很容易,但是对于原生js会稍微麻烦一些,这里将介绍四种方法获取元素的子元素(本 ...
- fetch是什么?写一个fetch请求
fetch是web提供的一个可以获取异步资源的api,目前还没有被所有浏览器支持,它提供的api返回的是Promise对象,所以你在了解这个api前首先得了解Promise的用法. 参考链接:http ...
- redisUtil
package com.cinc.ecmp.utils; import org.springframework.beans.factory.annotation.Autowired; import o ...
- 2018-2-13-win10-uwp-图标制作器
title author date CreateTime categories win10 uwp 图标制作器 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17 ...
- onload事件属性,JQ中的load,ready方法
onload事件属性,JQ中的load,ready方法 前言 页面中的很多操作,需要我们在所需资源下载完成后,才可以进行操作,而资源没有及时下载,我们进行操作的话,是会报错.因此我们需要熟练掌握哪些事 ...
- sublimeText 3使用教程
工欲善利其事必先利其器,sublime作为一款轻量.便捷的编译工具,集成了很多插件,功能强大,深受大家的喜爱.掌握好sublime的具体用法,必会为你的工作带来极大的便利!好了,闲话不多说了,下面开始 ...
- 选择合适的最短路--hdu3499
[题目链接](http://acm.hdu.edu.cn/showproblem.php?pid=3499) 刚看见题目,哦?不就是个最短路么,来,跑一下dijkstra记录最长路除个二就完事了 ,但 ...
- 为什么使用kotlin可以节省开发时间
前言:.kotlin是一门语言,光靠一篇文章要入门不太现实,所以这篇文章重点讲的是kotlin相对于java的一些特性和这些特性带来的好处. 一.简单介绍 Kotlin 是一种在 Java 虚拟机上运 ...