hdu 6070 Dirt Ratio 线段树+二分
Dirt Ratio
Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Special Judge

Picture from MyICPC
Little Q is a coach, he is now staring at the submission list of a team. You can assume all the problems occurred in the list was solved by the team during the contest. Little Q calculated the team's low ''Dirt Ratio'', felt very angry. He wants to have a talk with them. To make the problem more serious, he wants to choose a continuous subsequence of the list, and then calculate the ''Dirt Ratio'' just based on that subsequence.
Please write a program to find such subsequence having the lowest ''Dirt Ratio''.
In each test case, there is an integer n(1≤n≤60000) in the first line, denoting the length of the submission list.
In the next line, there are n positive integers a1,a2,...,an(1≤ai≤n), denoting the problem ID of each submission.
5
1 2 1 2 3
For every problem, you can assume its final submission is accepted.
官方题解:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<stdlib.h>
#include<time.h>
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pi (4*atan(1.0))
#define bug(x) cout<<"bug"<<x<<endl;
#define eps 1e-4 const int N=6e4+,M=1e6+,inf=;
const LL INF=1e18+,mod=;
struct is
{
double minn[N<<];
int lazy[N<<];
void pushdown(int pos)
{
if(lazy[pos])
{
minn[pos<<]+=lazy[pos];
minn[pos<<|]+=lazy[pos];
lazy[pos<<|]+=lazy[pos];
lazy[pos<<]+=lazy[pos];
lazy[pos]=;
}
}
void build(int l,int r,int pos,double m)
{
lazy[pos]=;
if(l==r)
{
minn[pos]=m*l;
return;
}
int mid=(l+r)>>;
build(l,mid,pos<<,m);
build(mid+,r,pos<<|,m);
minn[pos]=min(minn[pos<<],minn[pos<<|]);
}
void update(int L,int R,int z,int l,int r,int pos)
{
if(L<=l&&r<=R)
{
minn[pos]+=z;
lazy[pos]+=z;
return;
}
pushdown(pos);
int mid=(l+r)>>;
if(L<=mid)update(L,R,z,l,mid,pos<<);
if(R>mid) update(L,R,z,mid+,r,pos<<|);
minn[pos]=min(minn[pos<<],minn[pos<<|]);
}
double query(int L,int R,int l,int r,int pos)
{
if(L<=l&&r<=R)return minn[pos];
pushdown(pos);
int mid=(l+r)>>;
double ans=;
if(L<=mid)ans=min(ans,query(L,R,l,mid,pos<<));
if(R>mid)ans=min(ans,query(L,R,mid+,r,pos<<|));
return ans;
}
}tree;
int n,pre[N],a[N];
int check(double x)
{
tree.build(,n,,x);
memset(pre,,sizeof(pre));
for(int i=;i<=n;i++)
{
tree.update(pre[a[i]]+,i,,,n,);
double p=tree.query(,i,,n,);
//cout<<i<<" "<<x<<" "<<p<<" "<<x*(i+1)<<endl;
if(p<=x*(i+))return ;
pre[a[i]]=i;
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
double s=;
double e=,ans=-;
while(e-s>=eps)
{
double mid=(s+e)/;
if(check(mid))
{
ans=mid;
e=mid;
}
else s=mid;
}
printf("%f\n",ans);
}
return ;
}
hdu 6070 Dirt Ratio 线段树+二分的更多相关文章
- HDU 6070 - Dirt Ratio | 2017 Multi-University Training Contest 4
比赛时会错题意+不知道怎么线段树维护分数- - 思路来自题解 /* HDU 6070 - Dirt Ratio [ 二分,线段树 ] | 2017 Multi-University Training ...
- HDU 6070 Dirt Ratio(分数规划+线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 找出一个区间,使得(区间内不同数的个数/区间长度)的值最小,并输出该值. 思路: 因为是要求$\f ...
- 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
题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6070 (2017 Multi-University Training Contest - Team ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- HDU 5700 区间交 线段树暴力
枚举左端点,然后在线段树内,更新所有左边界小于当前点的区间的右端点,然后查线段树二分查第k大就好 #include <cstdio> #include <cstring> #i ...
随机推荐
- Installing Android Studio
To set up Android Studio on Windows: Launch the .exe file you just downloaded. Follow the setup wiza ...
- sparkStreaming插入mysql 必须考虑到实时更新老的key
原先使用批次提交更新 但数据库无变化,不得不一条一条的插入 公司数据量不大 还未做数据量大的测试 但实时更新是可以的 关键sql : insert into area_user_amt (date, ...
- MMU工作原理(转)
源: MMU工作原理
- jsoi r2d1t3的50分
#include<bits/stdc++.h> using namespace std; int n,r,x,y; double ans; double dis(int x,int y){ ...
- Python3 实现 JS 中 RSA 加密的 NoPadding 模式
前因后果之哗啦啦废话连篇: 这几天本人在 Python 做某网站登陆的时候,发现其登陆时用户名和密码被加密了 F12 仔细看了一下,发现是调用了一个 js 的 rsa 加密库,页面 dom 中有 rs ...
- amoeba_mysql 读写分离
环境 amoeba需要java环境,配置:略. MySQL主从配置:略. 基本架构 MySQL主:192.168.31.140 MySQL从:192.168.31.150 MySQL代理:192.16 ...
- Docker学习笔记之了解 Docker 的核心组成
0x00 概述 在掌握 Docker 的一些背景知识后,我们还不得不花费一节的篇幅来简单介绍有关 Docker 核心的一些知识.当然,大家不要觉得有“核心”这类的词,我们就要在这一节中深入 Docke ...
- 【题解】bzoj 4478 [Jsoi2013]侦探jyy
原题传送门 弱智搜索题 我们就枚举每个点,先判断它是否必须发生,如果没有必须发生,开始搜索它的祖先,如果祖先中有必须发生的,那么它就必须发生,如果祖先中没有必须发生的,那么搜索所有入度为0的点(除了它 ...
- Java快捷键与搜狗输入法快键的冲突
搜狗五笔,简繁体转换快捷键 ctrl+shift+F Java编辑器 格式化 Ctrl+Shift+F 搜狗输入法 搜狗词典 Ctrl+/ Java编辑器 取消注释 Ctrl+/ Java编辑器 注释 ...
- Android - Resource 之 Menu 小结
定义一个application的菜单,由MenuInflater召唤. 位置: res/menu/filename.xml 类型:指向Menu resource 文法: <?xml versio ...