hihocoder-1852-数值的F值
Posted zhang-yd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ", sum ); } return 0; }
以上是关于hihocoder-1852-数值的F值的主要内容,如果未能解决你的问题,请参考以下文章