题目链接

Problem Description

In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the following way. First let's ignore all the problems the team didn't pass, assume the team passed X problems during the contest, and submitted Y times for these problems, then the ''Dirt Ratio'' is measured as XY. If the ''Dirt Ratio'' of a team is too low, the team tends to cause more penalty, which is not a good performance.

Picture from MyICPC

Little Q is a coach, he is now staring at the submission list of a team. You can assume all the problems occurred in the list was solved by the team during the contest. Little Q calculated the team's low ''Dirt Ratio'', felt very angry. He wants to have a talk with them. To make the problem more serious, he wants to choose a continuous subsequence of the list, and then calculate the ''Dirt Ratio'' just based on that subsequence.

Please write a program to find such subsequence having the lowest ''Dirt Ratio''.

Input

The first line of the input contains an integer T(1≤T≤15), denoting the number of test cases.

In each test case, there is an integer n(1≤n≤60000) in the first line, denoting the length of the submission list.

In the next line, there are n positive integers a1,a2,...,an(1≤ai≤n), denoting the problem ID of each submission.

Output

For each test case, print a single line containing a floating number, denoting the lowest ''Dirt Ratio''. The answer must be printed with an absolute error not greater than 10−4.

Sample Input

1

5

1 2 1 2 3

Sample Output

0.5000000000

题意:

在给出的数列里面寻找一段区间使得区间内不同数的个数/区间长度的比值最小,输出这个最小值。

分析:把可能的结果二分,然后用线段树求解

如果我们设sum为一个区间内不同数的个数,len为这个区间长度

我们先二分答案得到k,每次判断这个答案k是否是我们要找的答案。那么我们需要在序列中找一段区间使得它的sum/len<=k转换一下得到sum-lenk<=0,我们每次判断这个区间之内的这个条件是否成立。

现在问题就很好解决了,sum可以利用线段树解决:从左往右插入数字,设A[i]上一次出现的位置为pre[i],那么[pre[i]+1,i]这一段权值加1,sum[j]表示的是:区间[j,i]内不同数的个数,这样从左往右插入数字后,所有的区间都被枚举过了,那么还剩下len
k,这个只要每插入一个数A[i],就把[1,i]的权值都减去k即可。

#include<iostream>
#include<stdio.h>
using namespace std;
#define lchild left,mid,root<<1
#define rchild mid+1,right,root<<1|1
const int max_n=6e4+10;
int n,a[max_n],last[max_n],pre[max_n];///last[i]表示i这个值最后出现的位置,pre[i]表示i这个位置上的数值上次出现的位置
double sum[max_n << 2], add[max_n << 2];///sum表示的是一个区间之内的和,add起一个中间转换的作用
void push_down(int root)///向下更新左右子树的节点的值
{
sum[root<<1]+=add[root];
sum[root<<1|1]+=add[root];
add[root<<1]+=add[root];
add[root<<1|1]+=add[root];
add[root]=0;
} void push_up(int root)///根据左右子树向上更新根节点的值
{
sum[root]=min(sum[root<<1],sum[root<<1|1]);
} void build(int left,int right,int root)///建树时每个节点的sum和add都是0(包括最下层的叶子节点)
{
sum[root]=0;
add[root]=0;
if(left==right)
return ;
int mid=(left+right)>>1;
build(lchild);
build(rchild);
push_up(root);
} void update(int l,int r,double w,int left,int right,int root)
///[l,r]是需要更新的区间,[left,right]是每次二分的区间
{
if(l<=left&&r>=right)///在整个的区间之内
{
add[root]+=w;
sum[root]+=w;
return ;
} push_down(root);///向下更新 int mid=(left+right)>>1;
if(l<=mid) update(l,r,w,lchild);///更新左子树
if(r>mid) update(l,r,w,rchild);///更新右子树
push_up(root);///由左右子树向上更新
} double query(int l,int r,int left,int right,int root)
///[l,r]是需要更新的区间,[left,right]是每次二分的区间
{
if(l<=left&&r>=right) return sum[root];
push_down(root);
int mid=(left+right)>>1;
double ans=n;
if(l<=mid) ans=min(ans,query(l,r,lchild));
if(r>mid) ans=min(ans,query(l,r,rchild));
push_up(root);
return ans;
} bool Find(double m)
{
build(1,n,1);
for(int i=1; i<=n; i++)
{
update(pre[i]+1,i,1,1,n,1);
update(1,i,-m,1,n,1);
if(query(1,i,1,n,1)<=0) return 1;
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for (int i = 1; i <= n; i++)
last[i] = pre[i] = 0;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
pre[i]=last[a[i]];
last[a[i]]=i;
}
double le=0.0,ri=1.0;
for(int i=1; i<20; i++)
{
double mi=(le+ri)/2;
if(Find(mi)) ri=mi;
else
le=mi;
}
printf("%.9lf",ri);
}
return 0;
}

2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)

    题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...

  2. 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)

    题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...

  3. 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)

    题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...

  4. 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)

    题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...

  5. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  6. 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)

    题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...

  7. 2017ACM暑期多校联合训练 - Team 7 1009 HDU 6128 Inverse of sum (数学计算)

    题目链接 Problem Description There are n nonnegative integers a1-n which are less than p. HazelFan wants ...

  8. 2017ACM暑期多校联合训练 - Team 7 1002 HDU 6121 Build a tree (深搜+思维)

    题目链接 Problem Description HazelFan wants to build a rooted tree. The tree has n nodes labeled 0 to n− ...

  9. 2017ACM暑期多校联合训练 - Team 7 1010 HDU 6129 Just do it (找规律)

    题目链接 Problem Description There is a nonnegative integer sequence a1...n of length n. HazelFan wants ...

随机推荐

  1. 软工网络15团队作业4-DAY5

    每日例会 昨天的工作. 张陈东芳:界面排版优化 吴敏烽:界面排版优化 周汉麟:继续根据商品编号来获取商品资料方法调试 林振斌:继续输出最近浏览记录的方法调试 李智:界面排版优化 全体人员:界面优化,初 ...

  2. 软工网络15团队作业4-DAY3

    昨天的工作. 张陈东芳:数据库连接的检查 吴敏烽:商品实体类的检查 周汉麟:继续研究获取商品信息方法的方法和调试 林振斌:继续研究获取商品信息方法的方法和调试 李智:Cookies的检查 全体人员:优 ...

  3. vue-cli脚手架搭建

    我们使用vue-cli来搭建整个项目,vue-cli就是一个脚手架,步骤很简单,输入几个命令之后就会生成整个项目,里面包括了webpack.ESLint.babel很多配置等等,省了很多事 Vue+ ...

  4. ViewController 视图控制器的常用方法

    ViewController 视图控制器 ,是控制界面的控制器,通俗的来说,就是管理我们界面的大boss,视图控制器里面包含了视图,下面举个例子,让视图在两个视图上调转. 定义一个视图控制器: MyV ...

  5. Spring Cloud 架构 五大神兽的功能

    什么是微服务 微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调 ...

  6. daemon not running的解决办法

    有时候,当我们执行 adb devices 或者 adb start-server 的时候,会出现下面的情况: * daemon not running. starting it now on por ...

  7. 【Java】POI的HSSFRichTextString介绍

    在使用Apache的POI库生成EXCEL文件时,经常会遇到这样的情况:使用不同的格式格式化一个单元格中的内容,比如说:一个单元格的内容是“first, second”,现在要分别使用红色带删除线格式 ...

  8. C++解析(30):关于指针判别、构造异常和模板二义性的疑问

    0.目录 1.指针的判别 2.构造中的异常 2.1 如果构造函数中抛出异常会发生什么? 2.2 如果析构函数中抛出异常会发生什么? 3.令人迷惑的写法 3.1 模板中的二义性 3.2 函数异常声明 4 ...

  9. 浅谈FFT&NTT

    复数及单位根 复数的定义大概就是:\(i^2=-1\),其中\(i\)就是虚数单位. 那么,在复数意义下,对于方程: \[ x^n=1 \] 就必定有\(n\)个解,这\(n\)个解的分布一定是在复平 ...

  10. Zookeeper(二) zookeeper集群搭建 与使用

    一.zookeeper集群搭建 鉴于 zookeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop01,hadoop02,hadoop03    1. ...