暑假多校赛的一道题,印象深刻,今天终于补了,现在感觉也不是特别难,题意是很经典的那种问题,就是给你一个数列,问一个区间不同的个数比区间的长度的值,在这个数列里的最小值。之前搜过区间不同数的个数的查询问题,发现了一个叫主席数的东西。(不会)那么这道题应该是更难了一点,求不同数的个数还要比上区间的长度,求一个最小值。这个时候看到这种分数很容易想到分数规划,这道题就可以列个式子。x/ (r-l+1) <= mid; x(不同数的个数)肯定是要求的,转化成x-(r-l+1)mid <=0;即求这个式子的最小值,(mid是可以利用的定值),区间内不同数的个数这个问题,其实用神奇的线段树就可以解决了,还可以把式子转化为x + l*mid<= (r+1)*mid;不转化也可以做,线段树维护区间内 x+l*mid最小值,差不多就可以做出来了。总是是道不错的题。
时间复杂度 n log log n
#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
using namespace std;
typedef long long ll;
const int maxn =60150+7;
int a[maxn];
int pre[maxn];
int lazy[maxn<<2];
double sum[maxn<<2];
int n;
void pushdown (int i){if(lazy[i]){int s= lazy[i];lazy[i*2]+= s;lazy[i*2+1]+=s;sum[i*2]+= s;sum[i*2+1]+= s;lazy[i]= 0;}return;
}
void build(int l,int r,int i,double mid1){lazy[i]= 0;if(l==r){sum[i]=mid1*l;return;}int mid= (l+r)/2;build(l,mid,i*2,mid1);build(mid+1,r,i*2+1,mid1);sum[i]= min(sum[i*2],sum[i*2+1]);return;
}
void update (int l,int r,int L,int R,int v,int i){int mid=(l+r)/2;if (L<=l &&R>=r){lazy[i]+=v;sum[i]+=v;return;}pushdown(i);if (L<=mid) update (l,mid,L,R,v,i*2);if (R>mid) update(mid+1, r, L, R, v, i*2+1);sum[i]=min (sum[i*2],sum[i*2+1]);return;
}double query (int l,int r,int L,int R,int i){if(L<=l && R>=r){return sum[i];}int mid=(l+r)/2;pushdown(i);double ans=0x3f3f3f3f;if(L<=mid) ans= min (ans,query(l,mid,L,R,i*2));if (R>mid) ans =min (ans,query(mid+1,r,L,R,i*2+1) );return ans;
}double judge(double mid){build(1,n,1,mid);int i;memset(pre,0,sizeof (pre));for(i=1;i<=n;i++){update(1,n,pre[a[i]]+1,i,1,1);double x =  query(1,n,1,i,1);if (x<= (i+1)*mid) return 1;pre[a[i]] = i;}return 0;
}int main()
{int t;int i;scanf ("%d",&t);while (t--){memset (pre,0,sizeof(pre));scanf("%d",&n);for (i=1;i<=n;i++){scanf ("%d",&a[i]);}double l=0,r=1;double ans;for (i=0;i<=20;i++){double mid=(l+r)/2;if(judge(mid))r=mid,ans=mid;else l= mid;}printf("%.10f\n",ans);}return 0;
}

HDU 6070 Dirt Ratio相关推荐

  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. 【二分】【线段树】hdu6070 Dirt Ratio

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

  4. hdu 2489 Minimal Ratio Tree

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

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

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

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

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

  7. 2019 CCSU GOLD!!!

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

  8. 2019.9.17最小生成树知识点回顾

    POJ 1797 Heavy Transportation(最大生成树-Prim) 最大生成树,方法模仿最小生成树,每次选最大边进行操作,即可. HDU 5723 Abandoned country( ...

  9. 杭电OJ分类题目(4)-Graph

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...

最新文章

  1. [YTU]_2738 指针练习--变量交换
  2. LeetCode 45跳跃游戏46全排列
  3. 与你同行,才能无障碍
  4. MCMS 基于SpringBoot 2架构
  5. 【gateway系列】一步步带你学习gateway路由规则实践
  6. 七年前的电脑可以用python_1年前的小五都用 Python 来做什么?
  7. Android网络库的比较:OkHTTP,Retrofit和Volley [关闭]
  8. mysql不能备份_mysql不能备份
  9. C语言断言assert详解
  10. 基于Cocos2d-x实现的畜不及防鬼畜音乐节奏游戏
  11. 抖音壁纸表情包小程序源码,可对接流量主
  12. Java开发之路—Java反射机制
  13. layui select 选中改变字体颜色 正常为绿色,不正常为红色
  14. 如何取消excel密码_办公软件操作技巧020:如何给excel工作表设置密码
  15. 从Arduino IDE安装到成功控制LED灯光的开发过程|阿里云远程控制灯光案例|Arduino编译缺少python27.dll问题|玉念聿辉
  16. 【听】怪诞行为学,可预测的非理性
  17. autojs用签名校验保护app
  18. 用 vs 2017创建 windows 服务
  19. python 写入excel数字格式,怎么在Python中写入Excel的格式
  20. java gitblit_GitBlit安装与使用

热门文章

  1. 小说排行榜案例(表格标签)
  2. 用友企业空间 - http://upesn.com
  3. (通俗易懂)极大元,极小元,最大元,最小元,上界,下界,上确界,下确界
  4. 008-我的博友不锈钢钥匙扣上的随身金属外壳可启动U盘-20190413
  5. 魅族手机怎么把计算机放到桌面,魅族手机怎么与电脑互传文件 如何访问电脑文件...
  6. 信号强度诊断(系统架构)
  7. 【转】Python实现量化选股
  8. 太牛了!华为天才少年稚晖君又自制硬萌机器人,代码开源了
  9. allennlp与pytorch版本匹配
  10. 保密管理专业是学计算机的吗,计算机保密管理学习学习制度.docx