size(l,r)表示区间l,r权值的种类数,让你求min{size(l,r)/(r-l+1)}(1<=l<=r<=n)。

last[r]表示a[r]上一次出现的位置,

就是二分验证mid的时候,先把线段树的每个位置i置成mid*i,然后再枚举右端点r,对[last[r]+1,r]作区间+1,然后check此时的前缀最小值是否小于等于mid*(r+1)即可。

据说这个是“01分数规划”?哪位dalao求解释一下……(我 01分数规划 只做过 最优比率生成树……)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
const double EPS = 0.0000001;
int T;
int n,a[60010],last[60010],now[60010];
double minv[60010<<2];
double delta[60010<<2];
void pushdown(int rt)
{if(delta[rt]){delta[rt<<1]+=delta[rt];delta[rt<<1|1]+=delta[rt];minv[rt<<1]+=delta[rt];minv[rt<<1|1]+=delta[rt];delta[rt]=0;}
}
void update(int ql,int qr,double v,int rt,int l,int r)
{if(ql<=l&&r<=qr){delta[rt]+=v;minv[rt]+=v;return;}pushdown(rt);int m=(l+r)>>1;if(ql<=m) update(ql,qr,v,lson);if(m<qr) update(ql,qr,v,rson);minv[rt]=min(minv[rt<<1],minv[rt<<1|1]);
}
double query(int ql,int qr,int rt,int l,int r)
{if(ql<=l&&r<=qr)return minv[rt];pushdown(rt);int m=(l+r)>>1;double res=2147483647.0;if(ql<=m) res=min(res,query(ql,qr,lson));if(m<qr) res=min(res,query(ql,qr,rson));return res;
}
bool check(double ratio){memset(minv,0,sizeof(minv));memset(delta,0,sizeof(delta));for(int i=1;i<=n;++i){update(i,i,ratio*(double)i,1,1,n);}for(int i=1;i<=n;++i){update(last[i]+1,i,1.0,1,1,n);if(query(1,i,1,1,n)-ratio*(double)(i+1)<EPS){return 1;}}return 0;
}
int main(){scanf("%d",&T);for(;T;--T){memset(now,0,sizeof(now));scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d",&a[i]);}for(int i=1;i<=n;++i){last[i]=now[a[i]];now[a[i]]=i;}double l=0.0,r=1.0;while(r-l>EPS){double mid=(l+r)*0.5;if(check(mid)){r=mid;}else{l=mid+EPS;}}printf("%.10lf\n",l);}return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/7281988.html

【二分】【线段树】hdu6070 Dirt Ratio相关推荐

  1. 线段树分裂与合并 ----- P2824 [HEOI2016/TJOI2016]排序 [线段树分裂合并 OR 01序列排序+二分线段树]

    题目链接 题目大意: 对一个序列,每次按照升序或者降序排序序列某一段,问你最后的序列是什么? 解法1:二分+线段树 首先我们知道对一个01序列进行排序是很快的!我们只要知道里面有多少个1和多少个0,那 ...

  2. HDU - 6070 Dirt Ratio (二分 + 线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题目大意:给定一个序列a,对于任何一个区间 [l,r],它的"Dirt Ratio&q ...

  3. Codeforces Round #686 (Div. 3) F. Array Partition(二分+线段树)

    题意:一段区间,让你分割成三段,第一段取max,第二段取min,第三段取max.问你怎么分割这个区间. 题解: 三个区间我们可以用两个点将一段区间分成三段区间. 二分:我们首先找这个题有关的单调性,我 ...

  4. BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)

    题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...

  5. E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)

    E. Sign on Fence 给定一个长度为nnn的数组aaa,1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai​≤109,有mmm次询问,每次给定l,r,kl, r, kl, ...

  6. Codeforces Round #686 (Div. 3) F. Array Partition 二分 + 线段树

    传送门 文章目录 题意: 思路: 题意: 化简一下题意就是求满足max(1,x)=min(x+1,y)=max(y+1,n)max(1,x)=min(x+1,y)=max(y+1,n)max(1,x) ...

  7. [HEOI2016TJOI2016]排序(二分+线段树)

    problem 洛谷链接 solution 在一个丝毫没有单调性的问题中很难想到将其转化为二分. 二分最后在第 ppp 位置上的值 xxx. 然后将所有 ≥x\ge x≥x 的赋为 111,所有 &l ...

  8. P5163-WD与地图【tarjan,整体二分,线段树合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P5163 题目大意 给出nnn个点mmm条有向边,点有权值,要求支持操作 删除一条边 修改一个点的权值 求一个点所在 ...

  9. [XSY3382] 专家系统(二分+线段树)

    XSY3382 二分ccc,问题变成能否用一个长ccc宽ccc的矩形框住至少kkk个点. 二维数点问题考虑用扫描线解决.将所有点按照xxx从小到大排序. 枚举一段xxx坐标相差不超过ccc的点(双指针 ...

最新文章

  1. Vue引入百度地图,如何去掉左下角的版权logo百度等信息?
  2. 别人以为搞AI的高大上,我却觉得自己是个骗子
  3. ECMA Script 6新特性之解构赋值
  4. 算法/数据工程师必备技能
  5. Web布局连载——两栏固定布局(五)
  6. E. Company(Codeforces Round #520 (Div. 2))
  7. CSS的三种基础选择器,面试必问
  8. python google drive api_使用google-drive-api python获取文件的链接
  9. 未检测到其他显示器_同维工控机显示器显示器没反应维修技术精湛
  10. R学习笔记-安装R和RStudio,注意RStudio的版本需要与操作系统版本匹配
  11. nodejs+socket.io用nginx反向代理提示400 Bad Request及ws://…无法连接的解决方法
  12. 阿里云技术天团空降CSDN独家在线峰会,揭秘核心竞争力
  13. easypoi list中的map导出_java导出excel(easypoi)
  14. win10计算机桌面路径,win10桌面路径是什么?如何修改win10桌面文件路径?
  15. Altium Designer 详细入门教程-原理图绘画-AD2016
  16. 并行强化学习算法:A2C/A3C
  17. 实战干货 | 这位成功转型机器学习的老炮,想把他多年的经验分享给你
  18. ffmpeg视频添加meta信息
  19. [交换最小值和最大值] 本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。 注意:题目保证最大和最小值都是唯一的。
  20. android graphics2d,Graphics2D的drawString之不带颜色的字体

热门文章

  1. mysql 关键字搜索 排名_mysql 的 查找 与 排序
  2. toad可以连接mysql吗_配置Toad链接远程Oracle数据库
  3. 1333和1600能双通道吗_波音797何时到来?会成为A321XLR的竞争对手吗?
  4. 12.整数转罗马数字-LeetCode
  5. java dubbo swagger_Dubbo 的 Swagger 服务文档 swagger-dubbo
  6. linux fpga 开发环境,- Vivado+Zedboard之Linux开发环境搭建
  7. 运算放大器基本公式_跨阻放大器稳定性
  8. aix服务器设备型号,IBM产品系列和AIX系统版本
  9. 南丁格尔邮票图片大全_【鉴赏】武夷山普通纪念币鉴赏(高清图片)
  10. c++ 怎么配置头文件路径_OpenGL环境配置