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\n",ans);
        }
        else if(x==3){
            ans=sum2/(ld)cnt-(sum/(ld)cnt)*(sum/(ld)cnt);
            printf("%.2f\n",ans);
        }
        else{
            auto tmp=q.begin();
            //cout<<"!!"<<*tmp<<endl;
            if(cnt%2){
                for(int i=1;i<=cnt/2;i++){
                    tmp++;
                }
                printf("%.2f\n",(db)*tmp);
            }
            else{
                for(int i=1;i<=cnt/2-1;i++){
                    tmp++;
                }
                val=*tmp;
                tmp++;
                val+=*tmp;
                printf("%.2f\n",(db)val/2.0);
            }
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/sz-wcc/p/11664025.html

时间: 2024-10-23 20:57:27

51Nod1785 数据流中的算法的相关文章

51nod1785数据流中的算法

51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间.鼠标轨迹等特征计算用户对于网站的满意程度. 现有的统计工具只能统计某一个窗口中,用户的满意程度的均值.夹克老爷想让你为统计工具添加一个新feature,即在统计均值的同时,计算窗口中满意程度的标准差和中位数. Input 第一行是整数n与k,代表有n次操作,时间窗口大小为k.  (1 <= n <= 10^6, 1 <= k <= 100) 接下来的n行,每行代表一次操作.操作有“用户访问”.“查询均值

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

1786 数据流中的算法 - 众数 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 数据流统计功能上线后,为51nod提升用户体验做出了很大的贡献.但是新问题随之而来,夹克老爷还想知道在一个窗口内,访问次数最多用户(即窗口内的众数).如果有多个众数,取用户ID最小的一个.(窗口的意思是一个固定长度的区间!) (因为数据流是实时的.在线的,所以不允许使用离线算法^_^) Input 第一行为整数n, k.(1 <= n <= 5 * 10^6,1 <

【51nod 1785】数据流中的算法

Description 51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间.鼠标轨迹等特征计算用户对于网站的满意程度. 现有的统计工具只能统计某一个窗口中,用户的满意程度的均值.夹克老爷想让你为统计工具添加一个新feature,即在统计均值的同时,计算窗口中满意程度的标准差和中位数(均值需要向下取整). Input 第一行是整数n与k,代表有n次操作,时间窗口大小为k.  (1 <= n <= 10^6, 1 <= k <= 100) 接下来的n行,每行

【51NOD】数据流中的算法

[算法]数学 [题解] 1.平均数:累加前缀和.//听说要向下取整? 2.中位数:双堆法,大于中位数存入小顶堆,小于中位数存入大顶堆,保证小顶堆内数字数量≥大顶堆,奇数则取小堆顶,偶数则取两堆顶/2. 3.方差=(平方的均值)-(均值的平方),即对于a,b,c,s2=(a2+b2+c2)/3-((a+b+c)/3)2.

剑指offer63:数据流中的中位数

题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 本题最开始简单的理解为求中位数,使用的是快排的思想,当数据元素为奇数个时,求第n/2大的数,当元素个数为偶数时,先求n/2个数,然后对右边的求出一个最小值. 看了别人的做法,发现应该把这道题理解为一个在线算法题.关键是使用两个堆,最大化堆存储前n/2个数,最小化堆存储后n/2个数,当元素个数为偶数个

《剑指offer》:[64]数据流中的中位数

题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数据排序后中间两个数的平均值. 例如:1,2,3,4,5的中位数为:3.1,2,3,4的中位数为:(2+3)/2=3. 方案一:采用Partition来解决.在[29]中我们讲过,快速查找中的Partition函数是十分重要,是一个比较常用的算法.所以这里我们采用partion函数来解决.从字符流里读字符,插入到一个无需的数组中的复杂度为

64 - 数据流中的中位数 || STL 堆

题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 思路解析 数据是从数据流读出,因此数组的个数是再逐渐的增加.如何选用一个容器,能够存储数据,并能够给出中位数. 无序数组:插入O(1) partation操作找出中位数 O(n) 有序数组:插入O(n) 找出中位数O(1) 有序链表:插入O(n) 找出中位数O(1) 搜索二叉树:插入O(logn)~O(

剑指offer:数据流中的中位数

题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数. 思路分析: 思路一:最朴素的想法,用一个vector来存输入的数据流.在取中位数的函数中,每次对数据流进行一次排序,对于奇数长度的数据,直接取中间值,对于偶数长度的数据,取中间两个数的平均值.很显然,这个

《剑指offer》第四十一题:数据流中的中位数

// 面试题41:数据流中的中位数 // 题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么 // 中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值, // 那么中位数就是所有数值排序之后中间两个数的平均值. #include <cstdio> #include <algorithm> #include <vector> #include <functional> using namespace std; templ