题目描述

给出一个长度为 nnn 的数列 a1,a2,a3,...,an{ a_1 , a_2 , a_3 , ... , a_n }a​1​​,a​2​​,a​3​​,...,a​n​​,以及 mmm 组询问 (li,ri,ki)( l_i , r_i , k_i)(l​i​​,r​i​​,k​i​​),求区间 [li,ri][ l_i , r_i ][l​i​​,r​i​​] 中有多少数在该区间中的出现次数与 kik_ik​i​​ 互质。

输入格式

第一行,两个正整数 n,mn , mn,m。

第二行,nnn 个正整数 aia_ia​i​​ 描述这个数列。

接下来 mmm 行,每行三个正整数 li,ri,kil_i , r_i , k_il​i​​,r​i​​,k​i​​,描述一次询问。

输出格式

输出 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×10​4​​
  • 1≤ai≤n1\le a_i\le n1≤a​i​​≤n
  • 1≤li≤ri≤n1\le l_i\le r_i\le n1≤l​i​​≤r​i​​≤n
  • 1≤ki≤n1\le k_i\le n1≤k​i​​≤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 数列互质 - 莫队的更多相关文章

  1. #6164. 「美团 CodeM 初赛 Round A」数列互质-莫队

    #6164. 「美团 CodeM 初赛 Round A」数列互质 思路 : 对这个题来言,莫队可以 n*根号n 离线处理出各个数出现个的次数 ,同时可以得到每个次数出现的次数 , 但是还要处理有多少 ...

  2. [美团 CodeM 初赛 Round A]数列互质

    题目大意: 给出一个长度为n的数列a1,a2,a3,...,an,以及m组询问(li,ri,ki),求区间[li,ri]中有多少数在该区间中的出现次数与ki互质. 思路: 莫队. f[i]记录数字i出 ...

  3. Loj #6164. 「美团 CodeM 初赛 Round A」数列互质

    link : https://loj.ac/problem/6164 莫队傻题,直接容斥做. #include<bits/stdc++.h> #define maxn 100005 #de ...

  4. 洛谷P3901 数列找不同 [莫队]

    题目传送门 题目描述 现有数列 A_1,A_2,\cdots,A_NA1​,A2​,⋯,AN​ ,Q 个询问 (L_i,R_i)(Li​,Ri​) , A_{Li} ,A_{Li+1},\cdots, ...

  5. luogu 数列找不同-莫队

    https://www.luogu.org/problemnew/show/P3901 了解过莫队的人应该都清楚,莫队是一个优化的暴力,可以在相对暴力比较优的时间中,求出一段序列内的某些性质(例:数字 ...

  6. wannafly 练习赛10 E 数列查找(莫队+分块分块分块......)

    链接:https://www.nowcoder.net/acm/contest/58/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...

  7. 洛谷P3901 数列找不同(莫队水题)

    重温下手感,判断区间是否全是不同的数字有两种做法,一个长度为len的区间不同的数字,参见HH的项链,一种是区间众数,参见蒲公英,是水题没错了.明天搞数据库,然后继续自己的gre和训练计划 #inclu ...

  8. 「美团 CodeM 初赛 Round A」试题泛做

    最长树链 树形DP.我们发现gcd是多少其实并不重要,只要不是1就好了,此外只要有一个公共的质数就好了.计f[i][j]表示i子树内含有j因子的最长链是多少.因为一个数的不同的质因子个数是log级别的 ...

  9. 【莫队】【P3901】 数列找不同

    Description 现在有一个长度为\(~n~\)的数列\(~A_1~,~A_2~\dots~A_n~\),\(~Q~\)个询问\(~[l_i~,~r_i]~\),每次询问区间内是否有元素相同 I ...

随机推荐

  1. CSS 伸缩布局

    转载于:https://blog.csdn.net/weixin_41342585/article/details/80140513 1. flex-direction:设置伸缩容器中成员的排列方式 ...

  2. HTML常用布局

    一般的局部布局无非采用如下的技术: 1)div + ul(ol)-li:用于分类导航或菜单等场合     2)div + dl-dt-dd:用于图文混编场合     3)table-tr-td:用于图 ...

  3. ppk on javascript 笔记(六)--BOM

    浏览器对象模型(Browser Object Model)是语言核心和DOM之间的一个过渡层,这个过渡层特指Javascript的客户端实现,它的主要任务是管理浏览器窗口并使得它们可以彼此通信.win ...

  4. vue-learning:29 - component - 组件三大API之三:slot

    组件三大API之三: slot <slot>标签 v-slot指令 普通插槽 有默认值的插槽 具名插槽 作用域插槽 v-slot是Vue 2.6.0引入的一个新语法指令,目的是统一之前sl ...

  5. GitHub上传项目到远程库

    写文章 GitHub上传项目到远程库     GitHub上传项目到远程库 今天把想把文件托管到GitHub仓库,但是执行一系列的命令以后,刷新GitHub网站还是没有任何更新.后来终于找到原因,原来 ...

  6. asp.net core 3.0 JObject The collection type 'Newtonsoft.Json.Linq.JObject' is not supported

    在asp.net core 3.0 中,如果直接在Controller中返回 Jobject 类型,会抛出如下错误: The collection type 'Newtonsoft.Json.Linq ...

  7. com.netflix.discovery.DiscoveryClient : Completed shut down of DiscoveryClient

    启动报错:com.netflix.discovery.DiscoveryClient    : Completed shut down of DiscoveryClient 解决方案: 添加web主件 ...

  8. SNOI2019

    题解: t1: 想了一会才会.. 以为是啥最小表示法之类的..然后这个我又不会 其实只要考虑一下a[i],a[i+1]之间的大小关系就行了 t2: 好像和题解不太一样.. 我的做法比较麻烦.. 枚举A ...

  9. keil中使用_at_绝对地址定位问题

    最近在做51单片机的时候,看到程序中某头文件有这样一段: 其中,_at_的作用就是将变量限定存放在指定的RAM空间.比如在这个单片机头文件中,就是将变量P00F,P01F分别存到Addr(0x8000 ...

  10. JMeter Webservice API测试计划

    Web Services Web服务被定义为旨在通过网络支持两台机器之间交互的软件系统.它被设计为具有以通常在Web服务描述语言(WSDL)中指定的机器可处理格式描述的接口. 通常,“HTTP”是最常 ...