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 ...
随机推荐
- PHP后台开发小经验
js页面传参数 js的参数传输是关键,尤其是当一个页面的数据需要分步骤上传时. 同样的删除功能,不会操作批量删除时可以尝试单个删除,功能差不多,实现功能的方法也千千万,先做成它是第一位. 主页面很多条 ...
- 【Python】**kwargs和takes 1 positional argument but 2 were given
Python的函数定义中可以在参数里添加**kwargs——简单来说目的是允许添加不定参数名称的参数,并作为字典传递参数.但前提是——你必须提供参数名. 例如下述情况: class C(): def ...
- dev gridview 单元格值拖拽替换
public class GridViewDropCell { //dvginfo根据鼠标点击的x.y坐标获取该点的相关信息 private GridHitInfo downHitInfo; priv ...
- DSN 建立达梦7(DM)连接
(DSN)Data Source Name 数据源名称 “ODBC数据源管理器”提供了三种DSN,分别为用户DSN.系统DSN和文件DSN.其中: 用户DSN会把相应的配置信息保存在Wind ...
- Linux I2C核心、总线和设备驱动
目录 更新记录 一.Linux I2C 体系结构 1.1 Linux I2C 体系结构的组成部分 1.2 内核源码文件 1.3 重要的数据结构 二.Linux I2C 核心 2.1 流程 2.2 主要 ...
- 用python 打印出爱心
其实,如果程序员真的很浪漫,普通人不懂,科技兴旺,也许你是惊呆了!!!!! 今天,泰泰又给你带来了一个“程序员技术(浪漫)表现”教程.飞鲸水龙头有希望它能在这个七月前夜帮到你.如果使用成功,记得给泰泰 ...
- js页面内容只读,不可复制
// document.oncontextmenu=new Function("event.returnValue=false"); // document.onselectsta ...
- MongoDB——理论及使用命令详解 数据库
数据存储阶段 文件管理阶段(.txt .doc .xls) 优点: 1 使用简单,展现直观 2 可以长期保存数据 3 可存储数据量比较大 缺点: 1 查找不方便, 2 容易造成数据冗余, 3 格式不 ...
- 系统模块 sys 函数的调用
系统模块 sys 运行时系统相关的信息 sys模块的数据 数据 描述 sys.path 模块搜索路径 path[0] 是当前脚本程序的路径名,否则为 '' sys.modules 已加载模块的字典 s ...
- 【坑】在使用EL表达式时表达式无法获取数值
错误描述: 使用EL表达式 前台原样输出表达式而不输出值 错误环境: idea 2017.1.2 错误原因: jsp页面默认会忽略el表达式,需要设置为不忽略 解决方案 设置<%@ page i ...