HDU 6070 - Dirt Ratio | 2017 Multi-University Training Contest 4
比赛时会错题意+不知道怎么线段树维护分数- -
思路来自题解
/*
HDU 6070 - Dirt Ratio [ 二分,线段树 ] | 2017 Multi-University Training Contest 4
题意:
给出 a[N];
设 size(l,r)为区间(l,r)不同数字的个数,求 size(l,r)/(r-l+1) 的最小值
限制: N <= 6e5, a[i] <= 6e5
分析:
二分答案 mid
则判定条件为是否存在 size(l,r)/(r-l+1) <= mid
变换一下: size(l,r) + mid*l <= mid * (r+1)
将左式存入线段树中,枚举 r,对某段 l 进行更新(last[a[r]+1] 到 r),更新操作为值+1
再对每个 r 判断一下上式是否成立
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 6e4+5;
const double eps = 1e-5;
const double INF = 1e18;
namespace SegT {
double val[N];
double Min[N<<2]; int add[N<<2];
void up(int x) {
Min[x] = min(Min[x<<1], Min[x<<1|1]);
}
void down(int x) {
if (add[x]) {
add[x<<1] += add[x];
Min[x<<1] += add[x];
add[x<<1|1] += add[x];
Min[x<<1|1] += add[x];
add[x] = 0;
}
}
void build(int l, int r, int x) {
add[x] = 0;
if (l == r) {
Min[x] = val[l]; return;
}
int mid = (l+r) >> 1;
build(l, mid, x<<1);
build(mid+1, r, x<<1|1);
up(x);
}
void change(int L, int R, int num, int l, int r, int x) {
if (L <= l && r <= R) {
add[x] += num;
Min[x] += num;
return;
}
down(x);
int mid = (l+r) >> 1;
if (L <= mid) change(L, R, num, l, mid, x<<1);
if (mid < R) change(L, R, num, mid+1, r, x<<1|1);
up(x);
}
double query(int L, int R, int l, int r, int x) {
if (L <= l && r <= R) return Min[x];
down(x);
int mid = (l+r) >> 1;
double res = INF;
if (L <= mid) res = min(res, query(L, R, l, mid, x<<1));
if (R > mid) res = min(res, query(L, R, mid+1, r, x<<1|1));
return res;
}
}
int t, n, a[N];
int last[N];
bool solve(double mid)
{
for (int i = 1; i <= n; i++)
SegT::val[i] = i*mid;
SegT::build(1, n, 1);
memset(last, 0, sizeof(last));
for (int i = 1; i <= n; i++)
{
SegT::change(last[a[i]]+1, i, 1, 1, n, 1);
last[a[i]] = i;
double res = SegT::query(1, i, 1, n, 1);
if (res < (i+1)*mid - eps) return 1;
}
return 0;
}
double BinaryFind(double l, double r)
{
double mid;
while ((r-l) > eps) {
mid = (l+r) / 2;
if (solve(mid)) r = mid;
else l = mid;
}
return mid;
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
printf("%.9f\n", BinaryFind(0, 1));
}
}
HDU 6070 - Dirt Ratio | 2017 Multi-University Training Contest 4的更多相关文章
- hdu 6070 Dirt Ratio 线段树+二分
Dirt Ratio Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Spe ...
- hdu 6070 Dirt Ratio
题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6070 (2017 Multi-University Training Contest - Team ...
- 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)
题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...
- HDU 6070 Dirt Ratio(线段树)
Dirt Ratio Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Tot ...
- HDU 6070 Dirt Ratio(分数规划+线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 找出一个区间,使得(区间内不同数的个数/区间长度)的值最小,并输出该值. 思路: 因为是要求$\f ...
- HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9
/* HDU 6170 - Two strings [ DP ] | 2017 ZJUT Multi-University Training 9 题意: 定义*可以匹配任意长度,.可以匹配任意字符,问 ...
- hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)
Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)
OO's Sequence Time Limit: 4000/2000 MS (Jav ...
- hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)
CRB and Tree Time Limit: 8000/4000 MS (J ...
随机推荐
- Redis 常用命令学习一:通用的基本命令
1-链接,如果需要的 Redis 部署在远程机器上,可以通过以下命令链接,其中-h后面跟着主机名,-p后面跟端口名 redis-cli -h 233.2.2.4 -p 666 2-PING 命令用来测 ...
- Java各版本新特性总结
Java或者说JDK的更新一般分为两部分内容:Java语言.JVM(C.C++编写),但通常情况下都不会单独发布,因为新的语言特性需要特定的JVM支持才行.下面我总结了从古至今Java各版本的新 ...
- 汉诺塔递推HDU2064
题意: 移动木头盘不能a到c,必须a到b到c. 问你移动次数. 假设将n层塔从A经B挪到C需要f[n]步.那么具体的移动过程可以这样看:将上面n-1层从A经B挪到C需要f[n-1]步,再将第n层从A挪 ...
- composer在windows下安装并且设置全局变量
Composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. 1丶使用安 ...
- python爬取网页数据并存储到mysql数据库
#python 3.5 from urllib.request import urlopen from urllib.request import urlretrieve from bs4 impor ...
- 15.Ansible安装与配置简单版
Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用.安装软件.执行命令.配置和编排任务. 一.Ansible工作机制 从图中可 ...
- 第九章 ZYNQ-MIZ701 片上ADC的使用
9.0难度系数★☆☆☆☆☆☆ 9.1实验概述 这次借助zynq的内嵌的XADC来采集zynq内部的一些参数: •VCCINT:内部PL核心电压 •VCCAUX:辅助PL电压 •VREFP:XADC ...
- k8s组件通信或者创建pod生命周期
Kubernetes 多组件之间的通信原理: apiserver 负责 etcd 存储的所有操作,且只有 apiserver 才直接操作 etcd 集群 apiserver 对内(集群中的其他组件)和 ...
- 简单分析synchronized不会锁泄漏的原因
最近看到一句话:内部锁synchronized不会造成锁泄漏(Lock Leak). 锁泄漏是指一个线程获得某个锁以后,由于程序的错误.缺陷致使该锁一直没法被释放而导致其他线程一直无法获得该锁的现象. ...
- C# Math.Round()的银行家算法
可能很多人都跟我一样,都只知道Math.Round()是C#中用来做四舍五入,保留指定小数位的 但实际上它并不是真正的四舍五入,而是银行家算法的四舍六入五取偶 事实上这也是IEEE的规范,因此所有符合 ...