[R19E]区间和
[R1C]区间求和 的进阶版
一个数出现的奇数次的次数等于将其分成多个段。偶数次序的段的长度乘以奇数次序的段的长度就是 这个数出现奇数次的段的数目。
一个区间[x,A,B,x,C,D] ,x出现的索引集合就是[1,4],为了计算方便,首位添加0,末尾添加n+1,索引集合就是[0,1,4,7]
区间就是[0,1)长度为1 [1,4)长度为3 [4,7)长度为3。
最后的结果就是(1+3)*3=12;
实际上x出现的奇数次的区间如下
x
xA
xAB
ABx
ABxC
ABxCD
Bx
BxC
BxCD
x
xCD
Xc
次数正是12。详细具体的推导 最后看代码源老师以后出的视频题解吧
// 113. [R19E]区间和.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
[R19E]区间和
原题地址:https://bs.daimayuan.top/p/113
题目描述
给定一个整数序列 a,f(l,r) 定义为 al, al+1, ..., ar 中只出现奇数次的数字的和。
(sum(i=1 to n) sum(j=i to n) f(i,j)) mod 998244353
输入格式
第一行包含一个整数 n,表示序列 a 的长度。
第二行包含 n 个整数 a1,a2,...,an。
输出格式
输出一个整数,表示答案。
样例输入
3
1 2 1
样例输出
12
样例解释
区间 [1,1]:只包含 1,故 f(1,1) = 1。
区间 [1,2]:1 出现 1 次,2 出现 1 次,故 f(1,2) = 3。
区间 [1,3]:1 出现 2 次,2 出现 1 次,故 f(1,3) = 2。
区间 [2,2]:只包含 2,故 f(2,2) = 2。
区间 [2,3]:1 出现 1 次,2 出现 1 次,故 f(2,3) = 3。
区间 [3,3]:只包含 1,故 f(3,3) = 1。
故总和为 1+3+2+2+3+1 = 12。
样例输入
10
6 7 999 90 999 6 6 999 7 7
样例输出
32766
数据范围与提示
对于 40% 的数据,1 <= n <= 1000,1 <= ai <= 10^6。
对于 60% 的数据,1 <= n <= 10^4,1 <= ai <= 10^6。
对于 100% 的数据,1 <= n <= 510^5,1 <= ai <= 10^9。
*/
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
const long long MOD = 998244353;
unordered_map<long long, vector<int>> pos;
const int N = 500010;
int a[N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
pos[a[i]].push_back(i);
}
long long ans = 0;
for (auto& pr : pos) {
auto& v = pr.second;
vector<int> idx;
idx.push_back(0);
for (int x : v) idx.push_back(x);
idx.push_back(n + 1);
int m = idx.size() - 1;
long long cnt[2] = { 0,0 };
for (int i = 0; i < m; i++) {
cnt[i % 2] += idx[i + 1] - idx[i];
}
ans = (ans + (pr.first % MOD) * (cnt[0] % MOD) % MOD * (cnt[1] % MOD) % MOD) % MOD;
}
cout << ans << endl;
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
浙公网安备 33010602011771号