hdu 6070 Dirt Ratio(分数规划)

题目链接:hdu 6070 Dirt Ratio

题意:

给你n个数,让你找一段区间[l,r],使得[l,r]中不同的数的个数size/(r-l+1)最小。

题解:

Claris官方题解:

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 3 using namespace std;
 4
 5 const int N=6e4+7;
 6 int t,n,a[N],lazy[N*4],la[N];
 7 double T[N*4],eps=1e-4;
 8
 9 void build(double v,int l=1,int r=n,int rt=1)
10 {
11     lazy[rt]=0;
12     if(l==r){T[rt]=l*v;return;}
13     int mid=l+r>>1;
14     build(v,l,mid,rt<<1),build(v,mid+1,r,rt<<1|1);
15     T[rt]=min(T[rt<<1],T[rt<<1|1]);
16 }
17
18 void PD(int rt)
19 {
20     lazy[rt<<1]+=lazy[rt],lazy[rt<<1|1]+=lazy[rt];
21     T[rt<<1]+=lazy[rt],T[rt<<1|1]+=lazy[rt],lazy[rt]=0;
22 }
23
24 void update(int L,int R,int v,int l=1,int r=n,int rt=1)
25 {
26     if(L<=l&&r<=R){lazy[rt]+=v,T[rt]+=v;return;}
27     int mid=l+r>>1;
28     if(lazy[rt])PD(rt);
29     if(L<=mid)update(L,R,v,l,mid,rt<<1);
30     if(R>mid)update(L,R,v,mid+1,r,rt<<1|1);
31     T[rt]=min(T[rt<<1],T[rt<<1|1]);
32 }
33
34 double ask(int L,int R,int l=1,int r=n,int rt=1)
35 {
36     if(L<=l&&r<=R)return T[rt];
37     int mid=l+r>>1;
38     if(lazy[rt])PD(rt);double ans=1e12;
39     if(L<=mid)ans=min(ans,ask(L,R,l,mid,rt<<1));
40     if(R>mid)ans=min(ans,ask(L,R,mid+1,r,rt<<1|1));
41     return ans;
42 }
43
44 int check(double mid)
45 {
46     build(mid),memset(la,0,sizeof(la));
47     F(r,1,n)
48     {
49         update(la[a[r]]+1,r,1);
50         la[a[r]]=r;
51         if(ask(1,r)<=mid*(r+1))return 1;
52     }
53     return 0;
54 }
55
56 int main(){
57     scanf("%d",&t);
58     while(t--)
59     {
60         scanf("%d",&n);
61         F(i,1,n)scanf("%d",a+i);
62         double l=0,r=1,mid;
63         F(ic,1,15)
64         {
65             if(r-l<eps)break;
66             mid=(l+r)/2;
67             if(check(mid))r=mid;else l=mid;
68         }
69         printf("%f\n",mid);
70     }
71     return 0;
72 }

时间: 2024-10-13 01:02:10

hdu 6070 Dirt Ratio(分数规划)的相关文章

第四场 hdu 6070 Dirt Ratio (线段树+二分)

http://acm.hdu.edu.cn/showproblem.php?pid=6070 题目大意:给出的序列上的数代表颜色,求子序列中不同数字的个数X与子序列长度Y中,X/Y的最小值 解题思路:思路和官方给的想法一样 值得注意的是线段树的节点中储存的是 size(l,r)+mid×l ,在建树时 mid×l 作为树节点的初始值,然后不断更新当前颜色对于 前一个相同颜色的位置+1 到 当前位置 的节点值+1,然后询问 1 到 当前位置的最小值 是否小于mid*(i+1). 虽然最后要打印小数

HDU 6070 Dirt Ratio

队友已经写过一个代码了,用数组实现的线段树,自己再写了一个结构体的线段树,嗯,就是这样,线段树风格不一样而已. 题解:满足的关系:res=size(l--->r) /  (r-l+1) ,求得最小的结果.正面解题,因为不知道res,而这样做的枚举每一个区间会得到n2的复杂度,所以枚举每一个可能的答案,然后再找是否存在可以满足的这样解的区间,如果不存在,那就根据枚举的mid和siza(l--->r) /(r-l+1)的关系更改mid的值.这道题目是满足单调性的,所以可以二分答案去做. 参考代码:

hdu6070(分数规划/二分+线段树区间更新,区间最值)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 给出一个题目提交序列, 从中选出一个正确率最小的子串. 选中的子串中每个题目当且仅当最后一次提交是正确的. 思路: 分数规划 二分答案, 然后在 check 函数中查找是否存在某个区j间 [l, r] 使得 sum(l, r) / (r - l + 1) <= mid, 即 sum(l, r) + l * mid <= (r + 1) * mid. 可以用个线段树来维护 sum(l

[POJ 2728]Desert King(0-1分数规划/最优比率生成树)

Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his country to bring water to every village. Villages which are connected to his capital village will be

Desert King (poj 2728 最优比率生成树 0-1分数规划)

Language: Default Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 22113   Accepted: 6187 Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels

POJ 2728 Desert King (01分数规划)

Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:29775   Accepted: 8192 Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his count

【算法微解读】浅谈01分数规划

浅谈01分数规划 所谓01分数规划,看到这个名字,可能会想到01背包,其实长得差不多. 这个算法就是要求"性价比"最高的解.sum(v)/sum(w)最高的解. 定义 我们给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价.如果选取i,定义x[i]=1否则x[i]=0.每个物品只有选和不选的两种方案,求一个选择的方案使得R=sigma(a[i]x[i])/sigma(b[i]x[i]),也就是选择物品的总收益/总代价最大或者最小. 01分数规划问题主要包含以下几个问题:

算法xio讲堂#1--01分数规划

浅谈01分数规划 所谓01分数规划,看到这个名字,可能会想到01背包,其实长得差不多. 这个算法就是要求"性价比"最高的解.sum(v)/sum(w)最高的解. 定义 我们给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价.如果选取i,定义x[i]=1否则x[i]=0.每个物品只有选和不选的两种方案,求一个选择的方案使得R=sigma(a[i]x[i])/sigma(b[i]x[i]),也就是选择物品的总收益/总代价最大或者最小. 01分数规划问题主要包含以下几个问题:

Desert King(01分数规划问题)(最优斜率生成树)

Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:33847   Accepted: 9208 Description David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his count