#include<bits/stdc++.h>
const int N = 2e5 + 10;
int ri() {
char c = getchar(); int x = 0, f = 1; for(;c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
for(;c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) - '0' + c; return x * f;
}
struct Data {
double x; int e;
}g[N], f[N];
Data operator + (Data a, Data b) {
if(a.e < b.e)
std::swap(a, b);
int d = a.e - b.e; double l = b.x;
if(d > 100) l = 0;
else {
for(;d--;)
l /= 10;
}
a.x += l;
if(fabs(a.x) > 10) a.x /= 10, ++a.e;
return a;
}
void operator += (Data &a, Data b) {a = a + b;}
void operator -= (Data &a, Data b) {
b.x = -b.x;
a = a + b;
}
int a[N], b[N], psa[N], psb[N], n, must;
int main() {
n = ri();
for(int i = 1;i <= n; ++i)
a[i] = ri(), psa[a[i]] = i;
for(int i = 1;i <= n; ++i)
b[i] = ri(), psb[b[i]] = i;
int l = 0, r = 0;
f[1].x = g[1].x = 1;
f[2].x = g[2].x = -1;
for(int j = 1, i;j <= n; ++j) {
f[j] += f[j - 1]; g[j] += g[j - 1];
if(j == n) break;
l = std::max(l, psb[a[psa[b[j]] + 1]]);
for(r = std::max(r, j + 2);r <= n; ++r)
if(psa[b[r]] < psa[b[r - 1]])
break;
--r;
if(l <= r) {
f[l] += f[j]; f[r + 1] -= f[j];
g[l] += f[j] + g[j]; g[r + 1] -= f[j] + g[j];
}
}
int d = g[n].e - f[n].e; double x = g[n].x / f[n].x;
for(;d--;)
x *= 10;
printf("%.3lf\n", x);
return 0;
}
[NOI2013] 树的计数
最新推荐文章于 2024-07-30 20:50:32 发布