2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 D-序列【莫队算法】
2017-12-24 18:50
483 查看
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
读入一个长度为n的整数数列a1,a2,…,an,以及一个整数K。
q组询问。
每组询问包含一个二元组(l, r), 其中1≤l≤r≤ n,
求所有满足以下条件的二元组(l2, r2)的数目:
1: 1≤l≤l2≤r2≤r≤n,
2:
![](https://img-blog.csdn.net/20171224184909707?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSXJpc2hfTW9vbnNoaW5l/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
是k的倍数。
输入描述:
第一行一个整数T,表示有T组数据。
对于每组数据,
第一行输入3个整数, n, q, k,
接下来一行输入n个整数,a1,a2,…,an,
接下来q行,每行输入2个整数 l, r
输出描述:
对于每一个询问,输出满足条件的二元组(l2,r2)的数目。
示例1
输入
1
5 2 4
4 1 4 8 8
2 2
2 4
输出
0
3
说明
当(l, r)为(2, 4)时,
有
(l2,r2)=(3,4),a3+a4=12,是4的倍数
(l2,r2)=(3,3),a3=4,是4的倍数
(l2,r2)=(4,4),a4=8,是4的倍数
备注:
1≤ n,q ≤5×104,
1≤ l ≤ r ≤n,
1≤ ai, k ≤109,
保证∑n ≤6×104,∑q ≤6×104
分析:莫队算法,注意预处理和add与del。
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
读入一个长度为n的整数数列a1,a2,…,an,以及一个整数K。
q组询问。
每组询问包含一个二元组(l, r), 其中1≤l≤r≤ n,
求所有满足以下条件的二元组(l2, r2)的数目:
1: 1≤l≤l2≤r2≤r≤n,
2:
是k的倍数。
输入描述:
第一行一个整数T,表示有T组数据。
对于每组数据,
第一行输入3个整数, n, q, k,
接下来一行输入n个整数,a1,a2,…,an,
接下来q行,每行输入2个整数 l, r
输出描述:
对于每一个询问,输出满足条件的二元组(l2,r2)的数目。
示例1
输入
1
5 2 4
4 1 4 8 8
2 2
2 4
输出
0
3
说明
当(l, r)为(2, 4)时,
有
(l2,r2)=(3,4),a3+a4=12,是4的倍数
(l2,r2)=(3,3),a3=4,是4的倍数
(l2,r2)=(4,4),a4=8,是4的倍数
备注:
1≤ n,q ≤5×104,
1≤ l ≤ r ≤n,
1≤ ai, k ≤109,
保证∑n ≤6×104,∑q ≤6×104
分析:莫队算法,注意预处理和add与del。
#include<iostream> #include<cstring> #include<cmath> #include<map> #include<cstdio> #include<algorithm> #define ll long long int using namespace std; const int maxn = 5e4 + 5; ll ans[maxn], cnt[maxn]; ll Ans = 0; int n, m, k, tot; int L = 1, R = 0; int Hash[maxn],a[maxn]; int pos[maxn]; struct node { int l, r, id; }Q[maxn]; bool cmp(node a, node b) { if (pos[a.l] == pos[b.l]) return a.r < b.r; return pos[a.l] < pos[b.l]; } void add(int x) { Ans += cnt[a[x]]; cnt[a[x]]++; } void del(int x) { cnt[a[x]]--; Ans -= cnt[a[x]]; } int get_id(int x) { int pos = lower_bound(Hash + 1, Hash + 1 + tot, x)-Hash; return pos; } void solve() { memset(cnt, 0, sizeof cnt); scanf("%d%d%d", &n, &m, &k); int sz = ceil(sqrt(1.0*n)); tot = 0, a[0] = 0; Hash[++tot] = a[0]; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); a[i] = (a[i - 1] + a[i]) % k; Hash[++tot] = a[i]; pos[i] = (i - 1) / sz; } sort(Hash + 1, Hash + 1 + tot); tot = unique(Hash + 1, Hash + tot + 1)-Hash - 1; for (int i = 0; i <= n; i++) { a[i] = get_id(a[i]); } for (int i = 1; i <= m; i++) { scanf("%d%d", &Q[i].l, &Q[i].r); Q[i].id = i; } L = 1, R = 0, Ans = 0; sort(Q + 1, Q + 1 + m, cmp); for (int i = 1; i <= m; i++) { int id = Q[i].id; while (R < Q[i].r) { add(++R); } while (L > Q[i].l) { add(--L); } while (R > Q[i].r) { del(R--); } while (L < Q[i].l) { del(L++); } ans[id] = Ans + cnt[a[Q[i].l - 1]]; } for (int i = 1; i <= m; i++) { printf("%lld\n", ans[i]); } } int main() { int T; scanf("%d", &T); while (T--) { solve(); } return 0; }
相关文章推荐
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 D-序列【莫队算法】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 M 栗酱的麻烦【枚举】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 B 栗酱的文明2【度数排序】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 E 栗酱的数列【差分+KMP】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 F 栗酱的不等式【二分】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 G 取数游戏2【区间DP】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 H 小周的曲射炮【公式推导||分类二分】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 I 栗酱和仙剑【模拟】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 J 栗酱和火柴【water】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 K qwb的骚扰【分类讨论】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 G-取数游戏(区间dp)
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 L qwb与电阻【dfs】
- 2017年浙江工业大学大学生程序设计迎新赛决赛—网络同步赛 E-栗酱的数列(KMP)
- 【2017年浙江工业大学大学生程序设计迎新赛决赛】D 序列 【离散化+分块+莫队】
- 【2017年浙江工业大学大学生程序设计迎新赛决赛】 F 栗酱的不等式【二分枚举】
- 【2017年浙江工业大学大学生程序设计迎新赛决赛】G 取数游戏二【DP or 记忆化DFS】
- 【2017年浙江工业大学大学生程序设计迎新赛决赛】E 栗酱的数列【思维转化+KMP】
- 2017年浙江工业大学大学生程序设计迎新赛决赛 F-栗酱的不等式 [KMP]
- 2017年浙江工业大学大学生程序设计迎新赛决赛 F 栗酱的不等式