zoukankan      html  css  js  c++  java
  • F

    F - Absolute Minima


    Time Limit: 2 sec / Memory Limit: 1024 MB

    Score : 600600 points

    Problem Statement

    There is a function f(x)f(x), which is initially a constant function f(x)=0f(x)=0.

    We will ask you to process QQ queries in order. There are two kinds of queries, update queries and evaluation queries, as follows:

    • An update query 1 a b: Given two integers aa and bb, let g(x)=f(x)+|x−a|+bg(x)=f(x)+|x−a|+b and replace f(x)f(x) with g(x)g(x).
    • An evaluation query 2: Print xx that minimizes f(x)f(x), and the minimum value of f(x)f(x). If there are multiple such values of xx, choose the minimum such value.

    We can show that the values to be output in an evaluation query are always integers, so we ask you to print those values as integers without decimal points.

    Constraints

    • All values in input are integers.
    • 1≤Q≤2×1051≤Q≤2×105
    • −109≤a,b≤109−109≤a,b≤109
    • The first query is an update query.

    Input

    Input is given from Standard Input in the following format:

    QQ
    Query1Query1
    ::
    QueryQQueryQ
    

    See Sample Input 1 for an example.

    Output

    For each evaluation query, print a line containing the response, in the order in which the queries are given.

    The response to each evaluation query should be the minimum value of xx that minimizes f(x)f(x), and the minimum value of f(x)f(x), in this order, with space in between.


    Sample Input 1 Copy

    Copy

    4
    1 4 2
    2
    1 1 -8
    2
    

    Sample Output 1 Copy

    Copy

    4 2
    1 -3
    

    In the first evaluation query, f(x)=|x−4|+2f(x)=|x−4|+2, which attains the minimum value of 22 at x=4x=4.

    In the second evaluation query, f(x)=|x−1|+|x−4|−6f(x)=|x−1|+|x−4|−6, which attains the minimum value of −3−3 when 1≤x≤41≤x≤4. Among the multiple values of xx that minimize f(x)f(x), we ask you to print the minimum, that is, 11.


    Sample Input 2 Copy

    Copy

    4
    1 -1000000000 1000000000
    1 -1000000000 1000000000
    1 -1000000000 1000000000
    2
    

    Sample Output 2 Copy

    Copy

    -1000000000 3000000000

    本质上是和东北赛一样的中位数经典应用

    只是本题更多的考察是关于中位数的维护

    1e5次添加 查询

    那么我们使用两个优先队列

    一个表示数组的前半部分另一个就表示数组的后半部分

    那么我们就可以通过两个优先队列的转移来维护中位数

    代码

    #include<bits/stdc++.h>
    using namespace std;
    priority_queue<long long,vector<long long>,greater<long long> >q2;//后半部分
    priority_queue<long long,vector<long long>,less<long long> >q1;//前半部分
    long long sum1,sum2;//qian hou
    int main()
    {
        long long sum1=0,sum2=0;
        long long num=0;
        int op;
        int q;
        scanf("%d",&q);
        while(q--)
        {
            scanf("%d",&op);
            if(op==1)
            {
                long long temp1,temp2;
                scanf("%lld%lld",&temp1,&temp2);
                num+=temp2;
                if(!q1.size()||temp1<q1.top()) q1.push(temp1),sum1+=temp1;
                else q2.push(temp1),sum2+=temp1;
                //维持均匀
                while(q1.size()<q2.size())
                {
                    //cout<<"*";
                    long long temp;
                    temp=q2.top();
                    q2.pop();
                    q1.push(temp);
                    sum2-=temp;
                    sum1+=temp;
                }
                while(q1.size()-1>q2.size())
                {
                    //cout<<"2";
                    long long temp;
                    temp=q1.top();
                    q1.pop();
                    q2.push(temp);
                    sum1-=temp;
                    sum2+=temp;
                }
            }
            else
            {
                long long sum=q1.size()+q2.size();
                long long ans;
                if(q1.size()&&q2.size())
                ans=1LL*q1.top()*q1.size()-sum1+sum2-q1.top()*q2.size()+num;
                else if(q1.size())
                {
                    ans=num;
                }
    //            cout<<num<<" ";
    //            cout<<sum1<<" "<<sum2<<q1.size()<<" "<<q2.size()<<endl;
                printf("%lld %lld
    ",q1.top(),ans);
            }
        }
    }
    
  • 相关阅读:
    反射
    注解
    file
    exception(异常)
    MySQL问题
    maven 中 遇到的问题
    Java读取文本数字
    人民币-欧元预测(ARIMA算法)代码
    云平台项目--学习经验--jsrender前端渲染模板
    云平台项目--学习经验--BootstrapValidate表单验证插件
  • 原文地址:https://www.cnblogs.com/caowenbo/p/11852262.html
Copyright © 2011-2022 走看看