多校4 Dirt Ratio(二分+线段树)

题意:

给出n个数,找一段区间使得区间内不同数字个数除以区间长度最小,求这个最小值,\(n<=60000,a_i<=n\)

题解:

二分答案mid,检验是否存在一个区间满足\(\frac{size(l,r)}{r-l+1}\leq mid ​\),也就是\(size(l,r)+mid\times l\leq mid\times (r+1)\)

从左往右枚举每个位置作\(r\),当rr变化为\(r+1\)时,对\(size\)的影响是一段区间加1,线段树维护区间最小值即可。

时间复杂度\(O(n\log n\log w)\)。

二分答案和枚举端点想到了,但是求最小值只会遍历,复杂度太高,没想到还能线段树维护,get新技能了。
从左往右枚举右端点,那么第\(i\)个数的贡献就是\(last[a[i]]+1到i\),第i个数都是有贡献的,然后就用线段树搞搞,这样就降了一维复杂度了。

#include<bits/stdc++.h>
#define LL long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ls (rt<<1)
#define rs (rt<<1|1)
using namespace std;
const int N = 6e4 + 10;
const double eps = 1e-6;
int read(){int x = 0;char c = getchar();while(c < '0' || c >'9') c = getchar();while(c >= '0' && c <= '9') x = x * 10 + c - 48 , c = getchar();return x;
}
int n;
int c[N],last[N],pre[N];
double s[N<<2],col[N<<2];
void pushup(int rt){s[rt] = min(s[ls],s[rs]);
}
void pushdown(int rt,int m){if(col[rt] > eps){col[ls] += col[rt];col[rs] += col[rt];s[ls] += col[rt];s[rs] += col[rt];col[rt] = 0;}
}
void update(int L,int R,double val,int l,int r,int rt){if(L <= l && R >= r){s[rt] += val;col[rt] += val;return ;}pushdown(rt,r - l + 1);int m = l + r >> 1;if(L <= m) update(L,R,val,lson);if(R > m) update(L,R,val,rson);pushup(rt);
}
double query(int L,int R,int l,int r,int rt){if(L <= l && R >= r){return s[rt];}pushdown(rt,r - l + 1);int m = l + r >> 1;double ans = 100000000;if(L <= m) ans = min(ans,query(L,R,lson));if(R > m) ans = min(ans,query(L,R,rson));return ans;
}
bool check(double mid){memset(s,0,sizeof(s));memset(col,0,sizeof(col));for(int i = 1;i <= n;i++){update(last[i]+1,i,1,1,n,1);update(i,i,mid * i,1,n,1);double res = query(1,i,1,n,1);// printf("%d %.6f\n",i,res);if(mid * (i + 1) - res > eps) return true;}return false;
}
int main(){int T;T = read();while(T--){n = read();memset(pre,0,sizeof(pre));for(int i = 1;i <= n;i++) {c[i] = read();last[i] = pre[c[i]];pre[c[i]] = i;}double l = 0,r = 1,ans = r;while(r - l > eps){double mid = (l + r) / 2;if(check(mid)) ans = min(ans,mid),r = mid;else l = mid;}printf("%.6lf\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/jiachinzhao/p/7284439.html

2017 多校4 Dirt Ratio相关推荐

  1. 2017 多校3 hdu 6061 RXD and functions

    2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...

  2. 2017 多校2 hdu 6053 TrickGCD

    2017 多校2 hdu 6053 TrickGCD 题目: You are given an array \(A\) , and Zhu wants to know there are how ma ...

  3. hdu6103[尺取法] 2017多校6

    /*hdu6103[尺取法] 2017多校6*/ #include <bits/stdc++.h> using namespace std; int T, m; char str[2000 ...

  4. 2017 多校4 Wavel Sequence

    2017 多校4 Wavel Sequence 题意: Formally, he defines a sequence \(a_1,a_2,...,a_n\) as ''wavel'' if and ...

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

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

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

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

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

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

  8. 2017多校第3场 HDU 6058 Kanade's sum 双链表,思维

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题外话:这场多校,真心感觉自己的无力,全队都发挥的很差,结束的时候排名掉到了90多,后期没做出字 ...

  9. HDU 6070 Dirt Ratio

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

  10. 2017 多校训练第二场 HDU 6047 Maximum Sequence(贪心+优先队列)

    Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

最新文章

  1. LA3971组装电脑
  2. 高级编程学习笔记day01(知识点篇)
  3. Argon-轻盈简洁好看的WordPress主题
  4. 优化 Hive ETL 任务(参数篇)
  5. 处理 git 合并冲突
  6. java基础语法(二)--单列模式
  7. 【POJ2559】Largest Rectangle in a Histogram(单调栈)
  8. layoutIfNeeded 就这样把我害惨
  9. linux纯终端下中文输入,Ubuntu 14.04 终端模式下中文输入 听歌
  10. LPC1788 nand驱动
  11. C# 合并Excel工作表
  12. IT运维外包甩不掉的包袱
  13. Codeforces_714_A
  14. 企业微信上传临时素材文件
  15. 显示器刷新率30hz_如何使您的120Hz或144Hz显示器使用其广告刷新率
  16. 初级C语言之【操作符】
  17. (小程序) 客户签名及签名后页面整体转图片后上传
  18. Ceres Solver从零开始手把手教学使用
  19. ad16怎么画弧线_在AD软件中如何实现圆弧走线?
  20. 2022年上半年计算机技术与软件专业技术资格(水平)考试陕西考区报名须知

热门文章

  1. 人脸识别门禁系统有哪些功能作用
  2. 学python的网课_python网课学习笔记--4
  3. Java项目:在线bbs论坛系统(java+SSM+JSP+bootstrap+jQuery+mysql)
  4. day15-医生的处方、道士的鬼符、程序员的正则表达式
  5. 购买成功订单详情html,订单成功页面功能实现
  6. 经度纬度地图搜索器_百度地图搜索经度纬度_地球经度纬度示意图
  7. 懵逼树上懵逼果:探索二分法搜索
  8. python实现批量图片格式转换
  9. maya中英文对比_[转载]maya中英文对照
  10. Keil5无法定位到函数、变量的定义