比赛时会错题意+不知道怎么线段树维护分数- -

思路来自题解

/*
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的更多相关文章

  1. hdu 6070 Dirt Ratio 线段树+二分

    Dirt Ratio Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Spe ...

  2. hdu 6070 Dirt Ratio

    题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6070 (2017 Multi-University Training Contest - Team ...

  3. 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 ...

  4. HDU 6070 Dirt Ratio(线段树)

    Dirt Ratio Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Tot ...

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

    http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 找出一个区间,使得(区间内不同数的个数/区间长度)的值最小,并输出该值. 思路: 因为是要求$\f ...

  6. HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9

    /* HDU 6170 - Two strings [ DP ] | 2017 ZJUT Multi-University Training 9 题意: 定义*可以匹配任意长度,.可以匹配任意字符,问 ...

  7. 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 ...

  8. hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)

    OO's Sequence                                                          Time Limit: 4000/2000 MS (Jav ...

  9. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

随机推荐

  1. [转] zookeeper 本地启动多节点

    1. zoo.cfg配置文件如下: # The number of milliseconds of each tick tickTime=2000 # The number of ticks that ...

  2. tomcat单机多应用部署配合Nginx负载均衡

    一.Windows 配置tomcat . 安装两个tomcat服务器以上 . 配置环境变量 CATALINA_BASE:D:\servers\Tomcat8 CATALINA_HOME:D:\serv ...

  3. ffmpeg AVPacket结构体及其相关函数

    0. 简介 AVPacket结构体并不是很复杂, 但是在ffmpeg中用的非常多. 与其相关的函数也是比较多. AVPacket保存了解复用之后, 解码之前的数据, 和这些数据相关的一些附加信息. 对 ...

  4. Java打包

    打成jar包 如果你使用的是maven来管理项目,执行以下命令既可以 cd 项目跟目录(和pom.xml同级)mvn clean package## 或者执行下面的命令## 排除测试代码后进行打包mv ...

  5. C# 使用Emit实现动态AOP框架 (三)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  6. js摄像头

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  7. 网络编程之NIO

    传统的BIO(Blocking IO)的缺点: 1.基于阻塞式IO建立起来的,导致服务端一直阻塞等待着客户端发起请求,如果客户端不发起,服务端的的业务线程会一直存. 2.弹性伸缩能力差,线程数和客户端 ...

  8. 关于小程序去除view/navigator 点击后默认阴影效果

    hover:class  :定义容器在被触发时的样式 通常无用,但若不去除则影响用户体验: 为避免被覆盖,约定在wxss底部添加class,比如: <!-- wxml --> <na ...

  9. Spring Boot启动流程分析

    引言 早在15年的时候就开始用spring boot进行开发了,然而一直就只是用用,并没有深入去了解spring boot是以什么原理怎样工作的,说来也惭愧.今天让我们从spring boot启动开始 ...

  10. adb实操

    一.命令 adb connect IP:5555 adb disconnect IP:5555 adb remount adb install 安装包的绝对路径 二.获取logcat信息 1.制作文件 ...