还是太菜了,竟然 lower_bound 定义搞歪了
这道题,。。偷懒了,感觉就是构建个二叉搜索树,不断地插入新的节点,找到绝对值最近的两个,比较一下绝对值差谁小就把谁加入结果就好了。。
感觉可以手搓一个平衡树,但是感觉手搓太累了,,还有想投机一下看看set能不能过,结果。。过了。。
开始交了一发以为不能投机,后来发现不是超时,,
以下是 AC代码。。。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
#define ll long long int
inline int read()
{
register int s=0,w=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
int n;
set<int>v;
set<int>::iterator it;
int main()
{
n=read();int t;
v.insert(0x3f3f3f3f);
v.insert(-0x3f3f3f3f);//注意有负数
ll sum=0;
for(int i=1;i<=n;i++)
{
t=read();
if(v.size()==2)
{
sum += t;
v.insert(t);
}
else
{
it = v.lower_bound(t);
if(*it == t)continue;
ll ls = abs(t-*it);
it--;
ll rs = abs(t-*it);
sum += min(rs, ls);
v.insert(t);
}
}
printf("%lld\n",sum);
return 0;
}