• 51Nod1785 数据流中的算法


    Problem

    51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间、鼠标轨迹等特征计算用户对于网站的满意程度。

    现有的统计工具只能统计某一个窗口中,用户的满意程度的均值。夹克老爷想让你为统计工具添加一个新feature,即在统计均值的同时,计算窗口中满意程度的标准差和中位数(均值需要向下取整)。

    Solution

    方差转化为均值相减,均值维护,中位数multiset维护每次找。

    还有双堆维护中位数,QAQ。

    Code

    #include<stdio.h>
    #include<set>
    #define mem(ss) memset(ss,0,sizeof(ss))
    #define rep(d, s, t) for(int d=s;d<=t;d++)
    #define rev(d, s, t) for(int d=s;d>=t;d--)
    typedef long long ll;
    typedef long double ld;
    typedef double db;
    const ll mod = 998244353;
    const int N = 1e4 + 10;
    #define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    //using namespace std;
    int n,k;
    struct E{
        int a;
        int p;
    }e[1000020];
    int head=1,tail=0;
    int x,val;
    db ans;
    std::multiset<int>q;
    int sum=0,sum2=0;
    bool fg=false;
    int cnt;
    int main(){
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            if(x==1){
                scanf("%d",&val);
                e[++tail].a=val;
                e[tail].p=i;
                sum+=val;
                sum2+=val*val;
                q.insert(val);
                //cout<<*q.begin()<<endl;
                if(tail-head+1==k+1){
                    q.erase(q.lower_bound(e[head].a));
                    sum-=e[head].a;
                    sum2-=e[head].a*e[head].a;
                    head++;
                }
                cnt=tail-head+1;
            }
            else if(x==2){
                ans=sum/cnt;
                printf("%.2f
    ",ans);
            }
            else if(x==3){
                ans=sum2/(ld)cnt-(sum/(ld)cnt)*(sum/(ld)cnt);
                printf("%.2f
    ",ans);
            }
            else{
                auto tmp=q.begin();
                //cout<<"!!"<<*tmp<<endl;
                if(cnt%2){
                    for(int i=1;i<=cnt/2;i++){
                        tmp++;
                    }
                    printf("%.2f
    ",(db)*tmp);
                }
                else{
                    for(int i=1;i<=cnt/2-1;i++){
                        tmp++;
                    }
                    val=*tmp;
                    tmp++;
                    val+=*tmp;
                    printf("%.2f
    ",(db)val/2.0);
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    MySQL 之 创建千万数据测试
    MySQL中的各种引擎
    MySQL 之【约束】【数据库设计】
    MySQL 的增删改查
    SQL数据类型
    SQL 数据类型
    数据库
    摘要算法
    Python 标准库-json
    Python 标准库-sys
  • 原文地址:https://www.cnblogs.com/sz-wcc/p/11664025.html
Copyright © 2020-2023  润新知