hdu6070

题意

给出 \(n\) 个数, \(\frac{x}{y}\) 表示某个区间不同数的个数除以区间的长度,求 \(\frac{x}{y}\) 最小值。

分析

设 \(size(l, r)\) 表示 \([l, r]\) 这个区间内不同数的个数,那么求得就是 \(\frac{size(l, r)}{r - l + 1}\) 的最小值。

二分答案 \(mid\) ,式子转化成 \(size(l, r) + mid \times l \leq mid \times (r + 1)\) 。

枚举右端点 \(r\),线段树存的是从 \(l\) 到 当前枚举到的 \(r\) 的 \(size(l, r) + mid \times l\) ,如果存在最小值满足小于等于 \(mid \times (r + 1)\) ,说明这个 \(mid\) 可以取到,更新 \(mid\) 。

新姿势:线段树内每个点的信息是动态的,和枚举到的 \(r\) 有关,通过区间更新就可以很方便的计算 \(size(l, r)\) 的值。

\(last[a[i]]\) 表示 \(a[i]\) 这个数上一次出现的位置,那么每次我们只需要区间更新 \([last[a[i]] + 1, i]\) 就好了。

code

  1. #include<bits/stdc++.h>
  2. #define lson l, m, rt << 1
  3. #define rson m + 1, r, rt << 1 | 1
  4. using namespace std;
  5. const int MAXN = 6e4 + 10;
  6. int a[MAXN];
  7. int last[MAXN];
  8. double s[MAXN << 2];
  9. double lazy[MAXN << 2];
  10. void pushDown(int rt) {
  11. if(lazy[rt] > 0) {
  12. s[rt << 1] += lazy[rt];
  13. s[rt << 1 | 1] += lazy[rt];
  14. lazy[rt << 1] += lazy[rt];
  15. lazy[rt << 1 | 1] += lazy[rt];
  16. lazy[rt] = 0;
  17. }
  18. }
  19. void pushUp(int rt) {
  20. s[rt] = min(s[rt << 1], s[rt << 1 | 1]);
  21. }
  22. void update(int L, int R, double c, int l, int r, int rt) {
  23. if(L <= l && r <= R) {
  24. lazy[rt] += c;
  25. s[rt] += c;
  26. return;
  27. }
  28. int m = (l + r) / 2;
  29. pushDown(rt);
  30. if(L <= m) update(L, R, c, lson);
  31. if(R > m) update(L, R, c, rson);
  32. pushUp(rt);
  33. }
  34. double query(int L, int R, int l, int r, int rt) {
  35. if(L <= l && r <= R) {
  36. return s[rt];
  37. }
  38. int m = (l + r) / 2;
  39. pushDown(rt);
  40. double res = 1e12;
  41. if(L <= m) res = query(L, R, lson);
  42. if(R > m) res = min(res, query(L, R, rson));
  43. pushUp(rt);
  44. return res;
  45. }
  46. int main() {
  47. int T;
  48. scanf("%d", &T);
  49. while(T--) {
  50. int n;
  51. scanf("%d", &n);
  52. for(int i = 1; i <= n; i++) {
  53. scanf("%d", &a[i]);
  54. }
  55. double l = 0, r = 1.0, mid;
  56. while(r - l > 1e-5) {
  57. mid = (l + r) / 2.0;
  58. memset(s, 0, sizeof s);
  59. memset(lazy, 0, sizeof lazy);
  60. memset(last, 0, sizeof last);
  61. int flg = 0;
  62. for(int i = 1; i <= n; i++) {
  63. update(last[a[i]] + 1, i, 1, 1, n, 1);
  64. update(i, i, mid * i, 1, n, 1);
  65. if(query(1, i, 1, n, 1) <= mid * (i + 1)) {
  66. flg = 1;
  67. break;
  68. }
  69. last[a[i]] = i;
  70. }
  71. if(flg) r = mid;
  72. else l = mid;
  73. }
  74. printf("%.6f\n", mid);
  75. }
  76. return 0;
  77. }

hdu6070的更多相关文章

  1. hdu6070 Dirt Ratio 二分+线段树

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

  2. 2017 Multi-University Training Contest - Team 4 hdu6070 Dirt Ratio

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6070 题面: Dirt Ratio Time Limit: 18000/9000 MS (Ja ...

  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. hdu6070(分数规划/二分+线段树区间更新,区间最值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 给出一个题目提交序列, 从中选出一个正确率最小的子串. 选中的子串中每个题目当且仅当最 ...

  5. HDU-6070 Dirt Ratio(二分+线段树+分数规划)

    目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门  原题目描述在最下面.  求\(sum/len\)最小值.\(sum\)是一段区间内不同数字的 ...

随机推荐

  1. [洛谷P1879][USACO06NOV]玉米田Corn Fields

    题目大意:有一个$n\times m$的矩阵,$(1 \leq m \leq 12; 1 \leq n \leq 12)$,想在其中的一些格子中种草,一些格子不能种草,且两块草地不相邻.问有多少种种植 ...

  2. 【NOIP模拟赛】Evensgn 的债务 乱搞

    biubiu~~~ 我们发现按照这道题的题意我们把一个个人的前后(欠钱,被欠钱)都缩一下,那么他对其他人没有影响,那么我们就可以依次缩完每个人,而且每个人最后的状态都是要买欠要么被欠,那么我们可以知道 ...

  3. 把java的class文件打成jar包的步骤

    现在我的文件夹的目录在: C:\Users\linsenq\Desktop\cglibjar 我要把位于这个目录下的所有文件夹以及这个文件夹下的.class文件打成jar包 第一步:用win+R 打开 ...

  4. linux 服务器下入侵之后的日志清理

    1.web日志的清理:access.log 和auth.log 位置在/var/log/下面. 2.系统日志存放在:/root/.bash_history

  5. Linux 下打包报错:enospc (no space left on device)

    昨天打了个包,早上发现很多页面js加载404,一查原来打包的min文件夹下是空的,打包出错了 Error code: enospc du -sh * rm -f 文件名称 rm -rf 目录名称 前端 ...

  6. 数据结构基础---Binary Search Tree

    /// Binary Search Tree - Implemenation in C++ /// Simple program to create a BST of integers and sea ...

  7. OOP第三次上机

    上机问题 T1 CSet 还是熟悉的CSet,只是多了个构造函数以及收缩空间. T2 SingleTon 单例问题. 用一个指针保存唯一的实例,用户无法在外部直接新建实例,只能使用外部接口(函数),函 ...

  8. 【洛谷 P4555】 [国家集训队]最长双回文串 (Manacher)

    题目链接 \(|S|<=10^5\),时间还是很宽松的. 允许我们使用线性/\(N\log N\)/甚至\(N \sqrt N\)的算法. 设\(l[i]\)表示以\(a[i]\)结尾的最长回文 ...

  9. js加载条

    <html xmlns="http://www.w3.org/1999/xhtml"><head>    <meta http-equiv=" ...

  10. CDN缓存(转载)

    CDN缓存那些事(转载) 原文地址:http://bbs.qcloud.com/forum.php?mod=viewthread&tid=3775 注:原文全文复制,仅仅作为自己下次学习备份, ...