C - Maximize! CodeForces - 939E (三分

题目来源:

https://vjudge.net/contest/293215#problem/C

http://codeforces.com/problemset/problem/939/E

You are given a multiset S consisting of positive integers (initially empty). There are two kind of queries:

  1. Add a positive integer to S, the newly added integer is not less than any number in it.
  2. Find a subset s of the set S such that the value is maximum possible. Here max(s) means maximum value of elements in s,  — the average value of numbers in s. Output this maximum possible value of .

Input

The first line contains a single integer Q (1 ≤ Q ≤ 5·105) — the number of queries.

Each of the next Q lines contains a description of query. For queries of type 1 two integers 1 and x are given, where x (1 ≤ x ≤ 109) is a number that you should add to S. It's guaranteed that x is not less than any number in S. For queries of type 2, a single integer 2 is given.

It's guaranteed that the first query has type 1, i. e. S is not empty when a query of type 2 comes.

Output

Output the answer for each query of the second type in the order these queries are given in input. Each number should be printed in separate line.

Your answer is considered correct, if each of your answers has absolute or relative error not greater than 10 - 6.

Formally, let your answer be a, and the jury's answer be b. Your answer is considered correct if .

Examples

Input

6
1 3
2
1 4
2
1 8
2

Output

0.0000000000
0.5000000000
3.0000000000

Input

4
1 1
1 4
1 5
2

Output

2.0000000000

题意:

第一行是一个Q,表示Q个操作。

操作有两种:

操作一:在集合S中添加元素x,保证x不小于S中任何一个元素(保证S递增)

操作二:查询,s为S子集,求函数max(s)-mean(s)的最大值,max(s)表示s中元素的最大值,mean(s)表示s中所有元素的平均数。对于每次操作二,输出对应函数最大值,误差小于10e-6

n为S元素个数,由于S递增,要使max(s)-mean(s)最大,只需要取S中的最后一个元素和S中前m(m<=n-1)个元素即可,而且由1到m函数max(s)-mean(s)的值先增加后减小

思路:三分最值+前缀和

三分原理:

lmid和rmid是l到r的两个三等分点,如果lmid大于rmid,那么最大值max一定在l与rmid之间,如果lmid小于rmid那么最大值max一定在lmid与r之间。

三分讲解具体参考:https://blog.youkuaiyun.com/forever_dreams/article/details/81093369

比赛的时候就想到是三分,但是不会实现,看见大佬们都没ac所以直接放弃了尝试,,,其实贼简单,没人做大概是题目没读懂吧(翻译好评Orz

参考代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define pi pair<int,int>
#define Mp make_pair
const int inf = 0x3f3f3f3f;
const int N = 5e5+10;
#define ll long long
using namespace std;

ll a[N],sum[N],n,len;
double fun(int x)
{
    return (double)a[len]-((sum[x]+a[len])/(double)(x+1));
}
int main()
{
    ll x,l,r,lmid,rmid;
    double maxx;
    sum[0]=0;
    len=0;
    scanf("%lld",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%lld",&x);
        if(x==1)
        {
            len++;
            scanf("%lld",&a[len]);
            sum[len]=sum[len-1]+a[len];
        }
        else
        {
            r=len-1;
            l=1;
            while(r-l>2)
            {
                lmid=l+(r-l)/3;
                rmid=r-(r-l)/3;
                if(fun(lmid)>fun(rmid))
                    r=rmid;
                else if(fun(lmid)<fun(rmid))
                    l=lmid;
                else
                {
                    l=lmid;
                    r=rmid;
                }
            }
            maxx=0;
            for(int j=l; j<=r; j++)
                maxx=max(maxx,fun(j));
            printf("%.8lf\n",maxx);
        }
    }
    return 0;
}

 

### 实现 `main-maximize` 功能 在 Vue3 中实现 `main-maximize` 功能可以通过自定义逻辑来完成,因为标准库并没有直接提供名为 `main-maximize` 的功能。然而,基于提供的参考资料,可以推断出此需求可能是指最大化某个可拖拽和可调整大小的组件。 为了达到这一目的,通常会结合第三方库如 `vue-drag-resize` 来处理窗口的最大化行为。下面是一个具体的例子展示如何集成并扩展该插件的功能以支持最大化的特性: #### 安装依赖包 首先安装所需的 npm 包: ```bash npm install vue-draggable-resizable --save ``` #### 创建组件模板 接着,在单文件组件中引入必要的模块,并编写相应的 HTML 结构: ```html <template> <div class="container"> <!-- 使用 maximize 属性控制是否允许双击最大化 --> <vueDraggableResizable :maximize="isMaximized" @resizing="handleResize" @resizestop="handleResizeStop" @dragging="handleDragging" @dblclick="toggleMaximize"> <!-- 组件内部的内容 --> </vueDraggableResizable> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; // 导入 vue-draggable-resizable 插件 import VueDraggableResizable from 'vue-draggable-resizable'; const isMaximized = ref(false); function toggleMaximize() { isMaximized.value = !isMaximized.value; } function handleResize(newWidth, newHeight) { console.log(`Resized to ${newWidth}x${newHeight}`); } function handleResizeStop(x, y, width, height) { console.log('Stopped resizing'); } function handleDragging(x, y){ console.log(`Moved to (${x}, ${y})`); } </script> <style scoped> .container { position: relative; /* 设置容器样式 */ } </style> ``` 上述代码片段展示了怎样通过监听特定事件(例如双击)切换组件的状态,进而触发最大化的视觉效果[^1]。当用户双击组件时,它会在正常状态与全屏显示之间转换;同时提供了回调函数用于响应尺寸变化和其他交互动作。 #### 配置全局注册 (如果需要) 如果你希望在整个应用程序范围内使用这个组件而不需要每次都单独导入的话,可以在项目的入口处进行全局注册: ```javascript import { createApp } from 'vue' import App from './App.vue' import VueDraggableResizable from 'vue-draggable-resizable' createApp(App).component('vueDraggableResizable', VueDraggableResizable).mount('#app') ``` 这样就完成了基本的最大化功能开发流程。当然实际应用中还需要考虑更多细节比如边界条件判断、动画过渡等优化措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuoyanli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值