题面翻译
如果一个数组的最小值和最大值相同,则称这个数组是Magical的。定义一个数组的子数组为一个数组中的连续的数组成的序列。给你一个数组,求这个数组中Magical的子数组有多少个。
题目描述
Valery is very interested in magic. Magic attracts him so much that he sees it everywhere. He explains any strange and weird phenomenon through intervention of supernatural forces. But who would have thought that even in a regular array of numbers Valera manages to see something beautiful and magical.
Valera absolutely accidentally got a piece of ancient parchment on which an array of numbers was written. He immediately thought that the numbers in this array were not random. As a result of extensive research Valera worked out a wonderful property that a magical array should have: an array is defined as magic if its minimum and maximum coincide.
He decided to share this outstanding discovery with you, but he asks you for help in return. Despite the tremendous intelligence and wit, Valera counts very badly and so you will have to complete his work. All you have to do is count the number of magical subarrays of the original array of numbers, written on the parchment. Subarray is defined as non-empty sequence of consecutive elements.
输入格式
The first line of the input data contains an integer �n ( 1<=�<=1051<=n<=105 ). The second line contains an array of original integers �1,�2,...,��a1,a2,...,an ( −109<=��<=109−109<=ai<=109 ).
输出格式
Print on the single line the answer to the problem: the amount of subarrays, which are magical.
Please do not use the %lld specificator to read or write 64-bit numbers in C++. It is recommended to use cin, cout streams (you can also use the %I64d specificator).
样例 #1
样例输入 #1
4
2 1 1 4
Copy
样例输出 #1
5
Copy
样例 #2
样例输入 #2
5
-2 -2 -2 0 1
Copy
样例输出 #2
8
Copy
提示
Notes to sample tests:
Magical subarrays are shown with pairs of indices [a;b] of the beginning and the end.
In the first sample: [1;1], [2;2], [3;3], [4;4], [2;3].
In the second sample: [1;1], [2;2], [3;3], [4;4], [5;5], [1;2], [2;3], [1;3].
题目思路:
等差数列求和的问题,求出有多少个首尾相同且中间也相同的序列,样例就是没有给这一个提示,没有表现出来,需要认真读题。
从头遍历,有不一样的直接求和,计数变量清1,否则计数加一。以及不开longlong见祖宗!!!
主要代码如下:
if(a[i]!=a[i+1])
{
ans+=cnt*(cnt+1)/2;
cnt=1;
}
else
{
cnt++;
}
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[111119];
int main()
{
ll n,ans=0,cnt=1;
cin >>n;
for (int i=1;i<=n;i++)
{
cin >>a[i];
}
for (int i=1;i<n;i++)
{
if(a[i]!=a[i+1])
{
ans+=cnt*(cnt+1)/2;
cnt=1;
}
else
{
cnt++;
}
}
ans+=cnt*(cnt+1)/2;
cout <<ans;
return 0;
}
return 0;
}
拜拜