Problem:
Score : 1300 points

Problem Statement

You are playing a game and your goal is to maximize your expected gain.
At the beginning of the game, a pawn is put, uniformly at random, at a position p\in\{1,2,\dots, N\}. The N positions are arranged on a circle (so that 1 is between N and 2).

The game consists of turns. At each turn you can either end the game, and get A_p dollars (where p is the current position of the pawn), or pay B_p dollar to keep playing.
If you decide to keep playing, the pawn is randomly moved to one of the two adjacent positions p-1, p+1 (with the identifications 0 = N and N+1=1).

What is the expected gain of an optimal strategy?

Note: The "expected gain of an optimal strategy" shall be defined as the supremum of the expected gain among all strategies such that the game ends in a finite number of turns.

Constraints

2 \le N \le 200,000

0 \le A_p \le 10^{12} for any p = 1,\ldots, N

0 \le B_p \le 100 for any p = 1, \ldots, N

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 \cdots A_N
B_1 B_2 \cdots B_N

Output

Print a single real number, the expected gain of an optimal strategy.
Your answer will be considered correct if its relative or absolute error does not exceed 10^{-10}.

Sample Input 1

5
4 2 6 3 5
1 1 1 1 1

Sample Output 1

4.700000000000

Sample Input 2

4
100 0 100 0
0 100 0 100

Sample Output 2

50.000000000000

Sample Input 3

14
4839 5400 6231 5800 6001 5200 6350 7133 7986 8012 7537 7013 6477 5912
34 54 61 32 52 61 21 43 65 12 45 21 1 4

Sample Output 3

7047.142857142857

Sample Input 4

10
470606482521 533212137322 116718867454 746976621474 457112271419 815899162072 641324977314 88281100571 9231169966 455007126951
26 83 30 59 100 88 84 91 54 61

Sample Output 4

815899161079.400024414062

Solution in C++ (Clang 10.0.0) (judge verdict: Wrong Answer)

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
inline char nc() {
	return getchar();
	static char buf[100000],*l=buf,*r=buf;
	return l==r&&(r=(l=buf)+fread(buf,1,100000,stdin),l==r)?EOF:*l++;
}
template<class T> void read(T &x) {
	x=0; int f=1,ch=nc();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=nc();}
	while(ch>='0'&&ch<='9'){x=x*10-'0'+ch;ch=nc();}
	x*=f; 
}
typedef long long ll;
const double eps=1e-13;
const int maxn=200000+5;
int n; double a[maxn],b[maxn];
int sta[maxn],top;
inline bool invalid(int u,int v,int w) {
	return (a[v]-a[u])/(v-u)<(a[w]-a[v])/(w-v)+eps; 
}
void rebuild() {
	static double A[maxn],B[maxn];
	memcpy(A,a,sizeof(A)),memcpy(B,b,sizeof(B));
	int k=max_element(A+1,A+n+1)-A;
	for(int i=1;i<=n;++i) {
		a[i]=A[k],b[i]=B[k];
		k=k==n?1:k+1;
	}
	a[++n]=a[1],b[n]=b[1];
}
void init() {
	for(int i=1;i<=n;++i) b[i]*=2;
	// (c[x+1]-c[x])-(c[x]-c[x-1])
	for(int i=1;i<=n;++i) b[i]+=b[i-1];
	// (c[x+1]-c[x])-c[1]
	for(int i=1;i<=n;++i) b[i]+=b[i-1];
	// c[x+1]-(n+1)c[1]
	double t=-b[n]/double(n+1);
	for(int i=n;i>1;--i) b[i]=b[i-1]+i*t;
	b[1]=t;
	for(int i=1;i<=n;++i) a[i]-=b[i];
}
double sol() {
	rebuild();
	init();
//	for(int i=1;i<=n;++i) debug("%.3lf ",a[i]); debug("\n");
//	for(int i=1;i<=n;++i) debug("%.3lf ",b[i]); debug("\n");
	for(int i=1;i<=n;++i) {
		while(top>1&&invalid(sta[top-1],sta[top],i)) --top;
		sta[++top]=i;
	}
	double an=(a[sta[1]]+a[sta[top]])/2;
	for(int i=1;i<top;++i) {
		an+=(a[sta[i]]+a[sta[i+1]])*(sta[i+1]-sta[i])/2;
	}
	an-=a[n];
	for(int i=1;i<n;++i) an+=b[i];
//	debug("%.12lf\n",an); 
	return an/(n-1);
}
int main() {
	read(n);
	for(int i=1;i<=n;++i) read(a[i]);
	for(int i=1;i<=n;++i) read(b[i]);
	printf("%.12lf\n",sol());
	return 0;
}