hihocoder-1852-数值的F值
hihocoder-1852-数值的F值
#1852 : 数组的F值
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
我们定义一个数组A = [A1, A2, ... AN]的F值F(A)是:
将A从小到大排序得到数组B = [B1, B2, ... BN],F(A) = (B2 - B1)2 + (B3 - B2)2 + ... + (BN - BN-1)2
现在给定一个长度为N的数组A,然后依次对A进行M项操作。每项操作是以下2种之一:
INS X:插入一个值为X的元素
DEL X:删除所有值为X的元素
请你计算每次操作之后的F(A)
输入
第一行包含两个整数N和M。
第二行包含N个整数A1, A2, ... AN。
以下M行每行一个操作。
对于50%的数据,1 ≤ N, M ≤ 1000
对于100%的数据,1 ≤ N, M ≤ 100000 1 ≤ X, Ai ≤ 100000
输出
对于每一项操作输出操作之后的F(A),每个一行。
- 样例输入
-
5 3 1 2 4 5 6 INS 3 INS 4 DEL 4
- 样例输出
-
5 5 7
题解:
利用 set 来装载数据,因为 set 内部的实现是 binary search tree,
针对插入的元素,可以找前一个值和后一个值进行操作。
#include <cstdio>
#include <iostream>
#include <set>
using namespace std;
const int MAXN = 100000 + 10;
int n,m, num[MAXN], val_map[MAXN];
int cmp(const void *a, const void *b)
{
return (*(int *)a - *(int *)b);
}
int main(){
scanf("%d %d", &n, &m);
set<int> t;
for(int i=0; i<n; ++i)
{
scanf("%d", &num[i]);
t.insert(num[i]);
}
qsort(num, n, sizeof(int), cmp);
long long sum = 0;
for(int i=1; i<n; ++i)
{
sum += 1LL * (num[i] - num[i-1])*(num[i] - num[i-1]);
}
int x;
char ch[5];
for(int i=0; i<m; ++i)
{
scanf("%s %d", ch, &x);
if(ch[0] == 'I')
{
if(t.find(x) == t.end()){
t.insert(x);
set<int>::iterator x_id = t.find(x);
set<int>::iterator xe_id = x_id; xe_id++;
set<int>::iterator xb_id = x_id; xb_id--;
if(x_id == t.begin() && xe_id != t.end())
{
sum += 1LL * ((*xe_id) - (*x_id)) * ((*xe_id) - (*x_id));
}else if(x_id != t.begin()){
sum += 1LL * ((*x_id) - (*xb_id))*((*x_id) - (*xb_id));
if(xe_id != t.end())
{
sum += 1LL * ((*xe_id) - (*x_id)) * ((*xe_id) - (*x_id));
sum -= 1LL * ((*xb_id) - (*xe_id))*((*xb_id) - (*xe_id));
}
}
}
}else{
if(t.find(x) != t.end()){
set<int>::iterator x_id = t.find(x);
set<int>::iterator xe_id = x_id; xe_id++;
set<int>::iterator xb_id = x_id; xb_id--;
if(x_id != t.begin()){
sum -= ((*x_id) - (*xb_id))*((*x_id) - (*xb_id));
}
if(xe_id != t.end())
{
sum -= ((*x_id) - (*xe_id))*((*x_id) - (*xe_id));
}
if(x_id != t.begin() && xe_id != t.end())
{
sum += ((*xb_id) - (*xe_id))*((*xb_id) - (*xe_id));
}
t.erase(x);
}
}
printf("%lld\n", sum );
}
return 0;
}

浙公网安备 33010602011771号