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; 
} 

  

猜你喜欢

转载自www.cnblogs.com/zhang-yd/p/9821765.html
今日推荐