(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

目录

题意:传送门

 原题目描述在最下面。

 求\(sum/len\)最小值。\(sum\)是一段区间内不同数字的个数,\(len\)是这段区间的长度。

思路:

 首先预处理出每个数上一次出现的位置\(pre[i]\)和最后一次出现的位置\(lst[i]\)。这个操作在静态求区间内不同数的个数和动态求区间内不同数的个数都有用到。

法一:

 二分答案\(mid\)。枚举序列,每加入一个数就在\(pre[i]-i\)区间加一,因为在以\(i\)为右端点的所有区间内,这么区间多了一个新数字。

 对于\(sum/len\leq mid\; \rightarrow sum - len * mid \leq 0\)。我们已经处理了\(sum\),对于\(len*mid\),就在解决每次插入一个数后,在\(1-i\)区间减去\(k\)。最后查询区间最小值,如果小于\(0\)则此\(mid\)符合还可以更小。

 因为我们每加入一个数后,查询的是以\(i\)为右端点的区间最小值,所以很自然的就要\(1-i\)每次减去\(k\)。这样才符合上述表达式。感觉画个图更好理解。



法二:

 化简表达式为:$sum(L,R)+Lmid \leq Rmid $

 \(sum\)的更新和上面一样,但是左边多了一项\(l*mid\)。

 怎么办呢?解决方法就是在线段树的每个端点处的值初始化为\(l*mid\)(\(l\)是到\(1\)的距离)。

 然后每此更新完后查询区间最小值\(mmin\),如果\(mmin\leq i*mid\)则此\(mid\)符合还可以更小

AC代码:

#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define mme(a,b) memset((a),(b),sizeof((a)))
using namespace std;
const int N = 1e5+7;
int n;
int lst[N],pre[N],ar[N];
double sum[N<<2],lazy[N<<2];
void push_up(int rt){
sum[rt]=min(sum[lson],sum[rson]);
}
void push_down(int rt){
if(lazy[rt]){
lazy[lson]+=lazy[rt];
lazy[rson]+=lazy[rt];
sum[lson]+=lazy[rt];
sum[rson]+=lazy[rt];
lazy[rt]=0;
}
}
void update(int L,int R,int l,int r,double c,int rt){
if(L<=l&&r<=R){
sum[rt] += c;
lazy[rt] += c;
return;
}
push_down(rt);
int mid = (l+r)>>1;
if(L<=mid) update(L,R,l,mid,c,lson);
if(R>mid) update(L,R,mid+1,r,c,rson);
push_up(rt);
}
double query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
push_down(rt);
int mid = (l+r)>>1;
double sum=n;
if(L<=mid) sum = min(sum, query(L,R,l,mid,lson));
if(R>mid) sum = min(sum, query(L,R,mid+1,r,rson));
push_up(rt);
return sum;
}
/*
1
5
1 2 1 2 3
sum/len最小值
sum/len <= mid
sum - len*mid <= 0
sum 区间不同数字的个数
len 区间长度
*/
bool ok(double e){
mme(sum,0);mme(lazy,0);
for(int i=1;i<=n;++i){
update(pre[i]+1,i,1,n,1,1);
update(1,i,1,n,-e,1);
if(query(1,i,1,n,1)<=0)return 1;
}
return false;
}
int main(){
int tim;
scanf("%d",&tim);
while(tim--){
scanf("%d",&n);
mme(lst,0);mme(pre,0);
for(int i=1;i<=n;++i){
scanf("%d",&ar[i]);
pre[i]=lst[ar[i]];
lst[ar[i]]=i;
}
double l=0,r=1,mid;
for(int i=0;i<20;++i){
mid=(l+r)/2;
if(ok(mid))r=mid;
else l=mid;
}
printf("%.5f\n", r);
}
return 0;
}

####原题目描述:
![这里写图片描述](https://img-blog.csdn.net/20180808090410937?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTk5MDY3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

HDU-6070 Dirt Ratio(二分+线段树+分数规划)的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)

    题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...

  2. HDU 6070 Dirt Ratio(线段树)

    Dirt Ratio Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Tot ...

  3. hdu6070 Dirt Ratio 二分+线段树

    /** 题目:hdu6070 Dirt Ratio 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意:给定n个数,求1.0*x/y最小是多少.x ...

  4. HDU 6070 - Dirt Ratio | 2017 Multi-University Training Contest 4

    比赛时会错题意+不知道怎么线段树维护分数- - 思路来自题解 /* HDU 6070 - Dirt Ratio [ 二分,线段树 ] | 2017 Multi-University Training ...

  5. K-th occurrence HDU - 6704 (后缀数组+二分线段树+主席树)

    大意: 给定串s, q个询问(l,r,k), 求子串s[l,r]的第kk次出现位置. 这是一篇很好的题解: https://blog.csdn.net/sdauguanweihong/article/ ...

  6. HDU 6070 Dirt Ratio(分数规划+线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 找出一个区间,使得(区间内不同数的个数/区间长度)的值最小,并输出该值. 思路: 因为是要求$\f ...

  7. hdu 6070 Dirt Ratio 线段树+二分

    Dirt Ratio Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Spe ...

  8. hdu 6070 Dirt Ratio

    题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6070 (2017 Multi-University Training Contest - Team ...

  9. [WC2010]重建计划(长链剖分+线段树+分数规划)

    看到平均值一眼分数规划,二分答案mid,边权变为w[i]-mid,看是否有长度在[L,R]的正权路径.设f[i][j]表示以i为根向下j步最长路径,用长链剖分可以优化到O(1),查询答案线段树即可,复 ...

随机推荐

  1. jQuery与Vue的区别、从jQuery到Vue框架优点总结

    一.两者的区别 1.数据与视图分离 2.数据驱动视图 二.从jQuery到Vue框架的总结 1.数据与视图分离,解耦 2.数据驱动视图,只关心数据,DOM操作已经被框架封装

  2. Openfire调整成自己的IM部署到LInux系统上

    部署自己的IM到Linux系统下:需要生成相关jar包再部署 1.在myeclipse上把openfire源代码加在加载进来,做相应调整后,运行测试没问题 2.  编译admin-jsp.jar(所有 ...

  3. CSS:CSS 提示工具(Tooltip)

    ylbtech-CSS:CSS 提示工具(Tooltip) 1.返回顶部 1. CSS 提示工具(Tooltip) 本文我们为大家介绍如何使用 HTML 与 CSS 来创建提示工具. 提示工具在鼠标移 ...

  4. Appium 工作原理

    Appium - automation for mobile apps   一.Appium架构介绍 官网:www.appium.io 由SauceLab公司主持.并在Google的GATC2013会 ...

  5. 您应升级到 MySQL 5.5.0 或更高版本。 phpmyadmin

    最近又折腾LAMP了.从官方下载的phpmyadmin在部署的时候发现 “您应升级到 MySQL 5.5.0 或更高版本”.原因是我安装的mysql数据库版本过低. 解决思路: 1.升级mysql版本 ...

  6. URAL 1748 The Most Complex Number

    题目链接:https://vjudge.net/problem/11177 题目大意: 求小于等于 n 的最大反素数. 分析: n <= 10^18,而前20个素数的乘积早超过10^18,因此可 ...

  7. 依赖Anaconda环境安装TensorFlow库,避免采坑

    TensorFlow™ 简介: TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示 ...

  8. Django框架(五)—— 虚拟环境搭建

    目录 Django虚拟环境搭建 Django虚拟环境搭建 一.为什么要用虚拟环境 公司以前开发的项目是在Django1.5的基础上开发的,先要需要基于Django2.0开发一套项目.这样不能卸载原有版 ...

  9. nginx新增简单下载站点

    配置nginx server { autoindex on;# 显示目录 autoindex_exact_size on;# 显示文件大小 autoindex_localtime on;# 显示文件时 ...

  10. 37-Ubuntu-用户管理-02-查看用户信息

    查看用户信息 序号 命令 作用 01 id 用户名 查看用户UID和GID信息 02 cat -n /etc/passwd 查看用户详细信息,参数-n显示行号 03 cat -n /etc/group ...