51Nod1785 数据流中的算法

Posted sz-wcc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于51Nod1785 数据流中的算法的主要内容,如果未能解决你的问题,请参考以下文章

51Nod - 1786 数据流中的算法 - 众数

51NOD数据流中的算法

51Nod 算法马拉松12 Rikka with sequences

51nod 1277 字符串中的最大值(KMP算法)

51nod算法马拉松15

51nod算法马拉松28-a