原题地址
Alice got an array of length
n
as a birthday present once again! This is the third year in a row!
And what is more disappointing, it is overwhelmengly boring, filled entirely with zeros. Bob decided to apply some changes to the array to cheer up Alice.
Bob has chosen
m
changes of the following form. For some integer numbers
x
and
d
, he chooses an arbitrary position
i
(
1
≤
i
≤
n
) and for every
j
∈
[
1
,
n
]
adds
x
+
d
⋅
d
i
s
t
(
i
,
j
)
to the value of the
j
-th cell.
d
i
s
t
(
i
,
j
)
is the distance between positions
i
and
j
(i.e.
d
i
s
t
(
i
,
j
)
|
i
−
j
|
, where
|
x
|
is an absolute value of
x
).
For example, if Alice currently has an array
[
2
,
1
,
2
,
2
]
and Bob chooses position
3
for
x
−
1
and
d
2
then the array will become
[
2
−
1
+
2
⋅
2
,
1
−
1
+
2
⋅
1
,
2
−
1
+
2
⋅
0
,
2
−
1
+
2
⋅
1
]
=
[
5
,
2
,
1
,
3
]
. Note that Bob can’t choose position
i
outside of the array (that is, smaller than
1
or greater than
n
).
Alice will be the happiest when the elements of the array are as big as possible. Bob claimed that the arithmetic mean value of the elements will work fine as a metric.
What is the maximum arithmetic mean value Bob can achieve?
Input
The first line contains two integers
n
and
m
(
1
≤
n
,
m
≤
10
5
) — the number of elements of the array and the number of changes.
Each of the next
m
lines contains two integers
x
i
and
d
i
(
−
10
3
≤
x
i
,
d
i
≤
10
3
) — the parameters for the
i
-th change.
Output
Print the maximal average arithmetic mean of the elements Bob can achieve.
Your answer is considered correct if its absolute or relative error doesn’t exceed
10
−
6
.
Examples
inputCopy
2 3
-1 3
0 0
-1 -4
outputCopy
-2.500000000000000
inputCopy
3 2
0 2
5 0
outputCopy
7.000000000000000
排版问题就不管了)
刚开始感觉难以下手,不知道怎么处理,听完同学一说,才发现就是数学的推导:
每次都会给你 x,d 对序列每个数加上 x+d* dict( i,j ),这里的 i 是任意的;
求最后的算术平均值 max ;
化简一下:
对于这 n 个数的 sum= x*n+d*Σdict( i,j );
考虑 d 的正负问题:
①: d>=0;
那么就是 n*x+ d * ( 0+…n-1 )= n*x + d*n*(n-1)/2
②:d<0;
自然后面的越小越好;
(1)n为奇数:
中间位置为 ( n+1 )/2;
以中间位置为 i , 求和即可;
(2)n为偶数:
以 n/2 为基准,同理求和;
注: 建议使用 long long , 可能会爆 int 以及 精度问题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define maxn 200005
const int mod=1e9+7;
#define eps 1e-5
#define pi acos(-1.0)
ll quickpow(ll a,ll b)
{
ll ans=1;
while(b){
if(b&1){
ans=ans*a;
}
a=a*a;
b>>=1;
}
return ans;
}
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
//ios::sync_with_stdio(false);
ll n,m;
cin>>n>>m;
ll ans=0;
for(int i=0;i<m;i++){
ll x,d;
cin>>x>>d;
if(d>=0){
ans+=n*x+d*n*(n-1)/2;
}
else {
if(n%2){
ll t=(n+1)/2;
ans+=n*x+2*d*t*(t-1)/2;
}
else {
ll t=n/2;
ans+=n*x+n*n*d/4;
}
}
}
printf("%.7lf\n",ans*1.0/n);
return 0;
}