描述
题解
首先发一下官方题解吧:
按照官方题解写的代码发现自己一直在第 21 组数据 TLE ,很明显,这组数据是后来加上去专门卡数据的。
于是发现自己的代码中忽略了一个部分是暴力的思维,在查找左右两侧可选的村民时,我用了两个循环,这显然是不行的,所以我需要使用链表的思维,这样查找的复杂度就是 O(1) 了,也就顺利的 AC 了。
代码
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
int n;
ll m[MAXN];
int l[MAXN], r[MAXN];
set<pair<ll, int> > spli;
void del(int x)
{
spli.erase(make_pair(m[x], x));
r[l[x]] = r[x];
l[r[x]] = l[x];
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
scanf("%lld", &m[i]);
spli.insert(make_pair(m[i], i));
l[(i + 1) % n] = i;
r[i] = (i + 1) % n;
}
int cnt = n / 3;
ll ans = 0;
for (int i = 0, j; i < cnt; i++)
{
j = spli.rbegin()->second;
ll a = m[l[j]], b = m[j], c = m[r[j]];
ans += b;
del(l[j]);
del(r[j]);
spli.erase(make_pair(m[j], j));
m[j] = a + c - b;
spli.insert(make_pair(m[j], j));
}
cout << ans << endl;
return 0;
}