Step 0 题前闲话
初看这道题,还认为这题是一道贼难的图论题,正解是模拟。
Step 1 解题方法
首先先将所有连线上的权值加起来,时间复杂度 ,在处理时用一个
数组
来记录是否为省会城市。
代码如下:
Step 2 删除权值
一共有 3 种情况需要扣除权值(设省会城市为 ,权值为
,总权值为
):
1. 若 且未读入
为省会,
。
2. 若 不为省会城市,
。
3. 若 且
不为省会城市,
。
代码如下:
if (x == n && !f[1])
ans -= a[x] * a[1];
else if (!f[x + 1])
ans -= a[x] * a[x + 1];
if (x == 1 && !f[n])
ans -= a[x] * a[n];
else if (!f[x - 1])
ans -= a[x] * a[x - 1];
Step 3 AC code
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 1e5 + 5;
long long n, k, a[Maxn], x, s, ans;
bool f[Maxn];
void check(){
if (x == n && !f[1])
ans -= a[x] * a[1];
else if (!f[x + 1])
ans -= a[x] * a[x + 1];
if (x == 1 && !f[n])
ans -= a[x] * a[n];
else if (!f[x - 1])
ans -= a[x] * a[x - 1];
}
int main()
{
scanf("%lld%lld",&n,&k);
for (int i = 1; i <= n; i ++) {
scanf("%lld",&a[i]);
s += a[i], ans += a[i] * a[i - 1];
}
ans += a[1] * a[n];
while (k--) {
scanf("%lld",&x);
f[x] = 1,s -= a[x],ans += a[x] * s;
check();
}
printf("%lld",ans);
return 0;
}