真的是很短的代码段。。。
rt。Dark Forest
O(1) 交换两个数计算答案出问题了。我眼花了看不出来锅。
int calc(int x, int y) { // 计算交换 x, y 后的权值
int nans = ans;
nans -= p[get(x)] * a[p[get(x - 1)]] * a[p[get(x)]] * a[p[get(x + 1)]];
nans -= p[get(x - 1)] * a[p[get(x - 2)]] * a[p[get(x - 1)]] * a[p[get(x)]];
nans -= p[get(x + 1)] * a[p[get(x)]] * a[p[get(x + 1)]] * a[p[get(x + 2)]];
nans -= p[get(y)] * a[p[get(y - 1)]] * a[p[get(y)]] * a[p[get(y + 1)]];
nans -= p[get(y - 1)] * a[p[get(y - 2)]] * a[p[get(y - 1)]] * a[p[get(y)]];
nans -= p[get(y + 1)] * a[p[get(y)]] * a[p[get(y + 1)]] * a[p[get(y + 2)]];
swap(p[x], p[y]);
nans += p[get(x)] * a[p[get(x - 1)]] * a[p[get(x)]] * a[p[get(x + 1)]];
nans += p[get(x - 1)] * a[p[get(x - 2)]] * a[p[get(x - 1)]] * a[p[get(x)]];
nans += p[get(x + 1)] * a[p[get(x)]] * a[p[get(x + 1)]] * a[p[get(x + 2)]];
nans += p[get(y)] * a[p[get(y - 1)]] * a[p[get(y)]] * a[p[get(y + 1)]];
nans += p[get(y - 1)] * a[p[get(y - 2)]] * a[p[get(y - 1)]] * a[p[get(y)]];
nans += p[get(y + 1)] * a[p[get(y)]] * a[p[get(y + 1)]] * a[p[get(y + 2)]];
swap(p[x], p[y]);
res = max(res, nans);
return nans;
}