zoukankan      html  css  js  c++  java
  • 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; 
    } 
    

      

  • 相关阅读:
    redis 专题 (一)总纲和命令
    CentOS 7安装 .net core 环境
    IdentityServer4 学习笔记(一)客户端模式
    IdentityServer4 学习笔记(开篇)
    ASP.NET Core 自定义视图路径及主题切换
    ASP.NET 国密加密 SM2-SM4
    ASP.NET Framework 如何利用nuget打包,并发布到nuget平台
    ASP.NET Core 在windows服务器安装dotnet-hosting-2.2.6-win 时出现应用程序池停止问题的解决方案
    三分钟学会Redis在.NET Core中做缓存中间件
    ASP.NET CORE 2.2 因外键设置的双向导航对象序列化报 循环错误问题的解决
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/9821765.html
Copyright © 2011-2022 走看看