51Nod-1380-夹克老爷的逢三抽一

来源:互联网 发布:la域名查询 编辑:程序博客网 时间:2024/04/30 00:30

ACM模版

描述

描述

题解

首先发一下官方题解吧:

描述

按照官方题解写的代码发现自己一直在第 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;}
原创粉丝点击