美团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 ...
随机推荐
- [转]java常用正则表达式
只能输入数字:"^[0-9]*$". 只能输入n位的数字:"^\d{n}$". 只能输入至少n位的数字:"^\d{n,}$". 只能输 ...
- Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)
传送门 题意: 给你一个只包含 '(' 和 ')' 的长度为 n 字符序列s: 给出一个操作:将第 i 个位置的字符反转('(' ')' 互换): 问有多少位置反转后,可以使得字符串 s 变为&quo ...
- 【codeforces 766C】Mahmoud and a Message
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- java UDP传输
①:只要是网络传输,必须有socket . ②:数据一定要封装到数据包中,数据包中包括目的地址.端口.数据等信息. 直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对 ...
- js实现小数点四舍五入
js实现小数点四舍五入 其实这个问题,在之前的面试中被提问到了,由于笔者平时都是用原生的toFixed()的方法来保留小数点,所以当时并没有回答出来这个问题,呜呜呜~.~
- ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(2)之创建项目
我们在创建项目的时候一定要遵循层次和命名的原则,同时也要有统一的规范,无论是多人项目还是单人项目,能够让人看着一目了然并赏析悦目,做一个有追求的程序员. 例如IA.WebApp是视图控制器层(表现层) ...
- ZR7.26
7.26 A 并查集维护,时间复杂度我写的貌似不大对,先鸽一鸽 B 敦爷:\(w\)是这个区间的最大值当且仅当他是这个区间内最大的 我们发现结合昨天课件内的并查集 发现我们每次不断合并的本质是把所有\ ...
- 判断移动端还是PC端
window.onload=function(){ var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUserAge ...
- 特殊字符,如Emoji表情Base64存储到数据库
有些特殊字符,如Emoji,存储到oracle数据库就会变成乱码,解决方案就是Base64转码后存储到数据库,取出后再解码传输,经过验证是可以的. 编码存储,接收参数转json再.ToString() ...
- CentOS 7防火墙
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤. 1.关闭firewall: systemctl stop firewalld.service #停止f ...