http://acm.hdu.edu.cn/showproblem.php?pid=6070

题目要求区间颜色数与区间长度的最小比

二分这个最小比值 但是怎么决定下一步是向左还是向右是关键

设区间颜色数为size(l,r) 那么我们就看是否存在这样一个区间满足size(l,r)/(r-l+1)<=m m是二分枚举的答案

这个式子化简得 size(l,r)+l*m<=(r+1)*m

然后从左向右枚举右端点r 线段树维护最小size(i,r)+i*m即可 (1<=i<=r)

动态查区间颜色数需要主席树 但是这里没有拿没搞得要求 具体怎么更新和cf834d一样

记录i左边的第一个颜色与i位置颜色相同的位置j 每次更新[j,i]这一段 其他右端点不是枚举值的区间内存的值肯定不对 但是这和我们需要维护的答案无关 因为我们只关心以右端点为当前枚举值的区间 所以不用主席树动态查询

#include <bits/stdc++.h>
using namespace std;
#define eps 1e-6
#define N 1000000000000000000.0struct node
{int l;int r;double val;int laz;
};node tree[240010];
int ary[60010],pre[60010],lef[60010];
int n;void pushup(int cur)
{tree[cur].val=min(tree[2*cur].val,tree[2*cur+1].val);
}void pushdown(int cur)
{if(tree[cur].laz!=0){tree[2*cur].val+=double(tree[cur].laz);tree[2*cur].laz+=tree[cur].laz;tree[2*cur+1].val+=double(tree[cur].laz);tree[2*cur+1].laz+=tree[cur].laz;tree[cur].laz=0;}
}void build(double val,int l,int r,int cur)
{double tmp;int m;tmp=l;tree[cur].l=l;tree[cur].r=r;tree[cur].val=0.0;tree[cur].laz=0;if(l==r){tree[cur].val=val*tmp;return;}m=(l+r)/2;build(val,l,m,2*cur);build(val,m+1,r,2*cur+1);pushup(cur);
}void update(int pl,int pr,int cur)
{if(pl<=tree[cur].l&&tree[cur].r<=pr){tree[cur].val+=1.0;tree[cur].laz++;return;}pushdown(cur);if(pl<=tree[2*cur].r) update(pl,pr,2*cur);if(pr>=tree[2*cur+1].l) update(pl,pr,2*cur+1);pushup(cur);
}double query(int pl,int pr,int cur)
{double res;if(pl<=tree[cur].l&&tree[cur].r<=pr){return tree[cur].val;}pushdown(cur);res=N;if(pl<=tree[2*cur].r) res=min(res,query(pl,pr,2*cur));if(pr>=tree[2*cur+1].l) res=min(res,query(pl,pr,2*cur+1));return res;
}double solve()
{double l,r,m,lim,res,ans;int i,flag;l=0.0,r=1.0,ans=0.0;while(l<r&&fabs(l-r)>eps)//while(l<r){m=(l+r)/2.0;build(m,1,n,1);//printf("***%.2f***\n",m);flag=0;for(i=1;i<=n;i++){update(lef[i],i,1);res=query(1,i,1);lim=m*double(i+1);//printf("*%.2f %.2f*\n",res,lim);if(res<lim||fabs(res-lim)<eps)//if(res<lim){flag=1;break;}}if(flag) r=m,ans=m;else l=m;}return ans;
}int main()
{int t,i;scanf("%d",&t);while(t--){scanf("%d",&n);memset(pre,0,sizeof(pre));for(i=1;i<=n;i++){scanf("%d",&ary[i]);lef[i]=pre[ary[i]]+1;pre[ary[i]]=i;}printf("%.10f\n",solve());}return 0;
}

Dirt Ratio HDU - 6070相关推荐

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

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

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

    http://acm.hdu.edu.cn/showproblem.php?pid=6070 题解 首先不难看出错误率是单调的,那么我们可以直接二分答案x,某个区间的错误率=区间数的种类cnt/区间长 ...

  3. HDU 6070 Dirt Ratio

    暑假多校赛的一道题,印象深刻,今天终于补了,现在感觉也不是特别难,题意是很经典的那种问题,就是给你一个数列,问一个区间不同的个数比区间的长度的值,在这个数列里的最小值.之前搜过区间不同数的个数的查询问 ...

  4. 【二分】【线段树】hdu6070 Dirt Ratio

    size(l,r)表示区间l,r权值的种类数,让你求min{size(l,r)/(r-l+1)}(1<=l<=r<=n). last[r]表示a[r]上一次出现的位置, 就是二分验证 ...

  5. 2017 Multi-University Training Contest - Team 4:1004. Dirt Ratio

    题意:给你n个数,其中每个区间的权值就是这个区间内不同数的个数除以区间长度,求最小的权值 令size(l, r)表示区间[l, r]内不同数的个数,那么就是要求min(size(l, r)/(r-l+ ...

  6. 2019 CCSU GOLD!!!

    线段树专场 更新结点,更新区间,区间求和(平均数)+ 树链剖分 51Nod 1199 Money out of Thin Air 更新结点,区间最值,结点查找,区间求和 51Nod 1364 最大字典 ...

  7. 有趣题目和认知合集(持续更新)

    写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...

  8. 2017 Multi-University Training Contest 4 solutions BY 陈松杨

    2017 Multi-University Training Contest 4 solutions BY 陈松杨 发表回复 1001. Big Integer 如果知道k-1k−1个数的个数c_1, ...

  9. hdu 2489 Minimal Ratio Tree

    https://vjudge.net/problem/HDU-2489 题意:求一个完全图的最优比率生成树,点的个数由题给出.最优比率生成树是边的权值之和与点的权值之和的比值最小的生成树. 思路:一开 ...

  10. hdu 2489 Minimal Ratio Tree (DFS枚举+MST)

    参考链接:http://blog.csdn.net/xingyeyongheng/article/details/9373271 http://www.cnblogs.com/chenxiwenruo ...

最新文章

  1. ElasticSearch_查询过滤排序
  2. do{}while(0) 作用
  3. iOS 自动引用计数和内存泄露
  4. Java Store_java之Properties集合中的方法store
  5. Java黑皮书课后题第5章:**5.37(十进制转二进制)编写程序,提示用户输入一个十进制整数,然后显示对应的二进制值(不要使用Integer.toBinaryString(int)方法)
  6. 解决Could not reserve enough space for object heap
  7. jbl调音软件_[马自达] 佛山马自达昂克赛拉改装美国JBL汽车音响
  8. 使用Supervisor监控代码的修改 - cmd安装激活篇
  9. python获取文件路径下的文件_python 获取文件下所有文件或目录os.walk()的实例
  10. 【Tyvj3500】【BZOJ1031】字符加密,后缀数组
  11. style文件的指定
  12. 两条平行导线同向电流_如何根据功率计算电流?老师傅说这么做很简单
  13. Asp.net(C#)年月日时分秒毫秒
  14. golang 微信小程序获取二维码scene参数报错 invalid scene rid: f05f96ab-5382f139-14b13d2f
  15. 惯量比多少合适_详解】伺服电机负载惯量比的合理取值汇总
  16. 梯度下降优化算法综述
  17. 华为手机解锁码计算工具_华为最新解bl解锁码读取工具
  18. 荣耀Magic 3Pro 充电架构分析
  19. 在单面打印机上使用WPS实现手工双面打印
  20. Android代号、版本、API版本号

热门文章

  1. 没想到,拼多多竟然想用AI种草莓给我吃
  2. MATLAB调用CPP代码
  3. 干货分享|Compare essay的写作方法
  4. 修改mysql数据库的长度_修改mysql数据库的长度
  5. 计算机辅助翻译技术包含,计算机辅助翻译方法技术
  6. sklearn实战之决策树
  7. Postman中文版 !!!!傻瓜教程
  8. 发生致命事故8个月后,优步被获准在匹兹堡恢复自动驾驶测试
  9. 教你用迅雷下载百度网盘的文件
  10. word 2010 脚注 尾注 尾注序号 连续尾注 尾注分隔符 删除