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

目录

题意:传送门

 原题目描述在最下面。

 求\(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. magento开发 -- 修改当前用户的客户组

    $customer = Mage::getSingleton('customer/session')->getCustomer(); $customer->setData( 'group_ ...

  2. bootstrapTable 分页插件

    前端: @{ ViewBag.Title = "BootstrapTable 入门"; Layout = null; } <!-- 引入bootstrap样式 --> ...

  3. onethink中的用户登录session签名

    用户登录签名问题,即防止伪造登录session,增加一个用户登录数组的加密签名 onethink的登录控制,先调用UC表中(UC表也是存储在网站或本地的数据库中的),确认登录信息.如果UC表登录成功, ...

  4. kubernetes Pod的升级与回滚

    一:Deployment的升级 1.通过kubectl set image命令为Deployment设置新的镜像名称kubectl set image deployment/nginx-deploym ...

  5. (转)Vmware vSphere 5.0系列教程 vSphere网络原理及vSwitch简介 及一个host两个网卡说明

    转:http://andygao.blog.51cto.com/323260/817518/ 在一个物理网络拓扑中,通常都是路由器-交换机-PC机的连接,不同的服务器和PC机,通过交换机的连接而相互连 ...

  6. 在一台机上搭建多个MYSQL并设置主从

    安装 cd /usr/local/src/ -linux2.-x86_64.tar.gz -linux2.-x86_64 /usr/local/mysql grep mysql /etc/passwd ...

  7. Xen的体系结构

    1. BIOS的虚拟化 xen的启动过程,与x86系统一样,首先要进入保护模式,然后安装中断处理程序. xen的中断处理程序可以分为几种,有的是直接分发给正在运行的操作系统,有的是分发给安装了硬件驱动 ...

  8. LaTex 插入图像,以及应用表格

    插入图像 参考:http://www.ctex.org/documents/latex/graphics/ 1: \includegraphics[width=20mm]{head.png} 应用表格 ...

  9. flex 布局,flex-grow 宽度未等比放大问题解决办法

    本文转载自:https://blog.csdn.net/sinat_41695090/article/details/79215893 先粘贴上一段代码,flex总体布局 <body> & ...

  10. http over git server

    编译安装git 参考 <CentOS7编译安装git> 安装httpd yum install httpd -y 安装gitweb yum install gitweb -y 创建项目根目 ...