摘要:数形结合,斜率优化,单调队列。

题意:求一个长度为n的01串的子串,子串长度至少为L,平均值应该尽量大,多个满足条件取长度最短,还有多个的话,取起点最靠左。

求出前缀和S[i],令点Pi表示(i,S[i]),那么这个问题就转化成了求斜率最大的两点。画图分析可知,如果有上凸点,那么上凸点,一定不会是最优的,所以问题就变成了维护一个下凸的曲线。那么可以通过比较斜率来维护,而要求切点,在上一个切点之前的点不会得到更优的解。

假设在A点,即之前的切线之上,那么选切点以前的点,一定不是最优的,假设在B点,原来的切线之下,那么,怎么也得不到一个斜率比之前切线更大的线。

更具体得可以看这篇论文:浅谈数形结合思想在信息学竞赛中的应用

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+;
char s[maxn];
int sum[maxn],q[maxn]; #define seg(x1,x2) (sum[x2]-sum[x1-1])
inline int cmp_ave(int x1,int x2,int x3,int x4){
return seg(x1,x2)*(x4-x3+) - seg(x3,x4)*(x2-x1+);
} int main()
{
//freopen("in.txt","r",stdin);
int T; scanf("%d",&T);
while(T--){
int n,L;
scanf("%d%d%s",&n,&L,s+);
sum[] = ;
for(int i = ; i <= n; i++)
sum[i] = sum[i-] + s[i] - '';
int ansL = , ansR = L;
int i = ,j = ;
for(int t = L; t <= n; t++){
while(j-i> && cmp_ave(q[j-],t-L,q[j-],t-L) >= )j--;
q[j++] = t-L+;
while(j-i> && cmp_ave(q[i],t,q[i+],t) <= ) i++;
int c = cmp_ave(q[i],t,ansL,ansR);
if(c > || c == && t-q[i] < ansR - ansL){
ansL = q[i]; ansR = t;
}
}
printf("%d %d\n",ansL,ansR);
}
return ;
}

整理以下:以后遇到求(Pi-Pj)/(i-j)形的式子求最大值,就可以套用这个模版了。。。

UVA 1451 Average平均值 (数形结合,斜率优化)的更多相关文章

  1. UVA 1451 Average

    A DNA sequence consists of four letters, A, C, G, and T. The GC-ratio of a DNA sequence is the numbe ...

  2. UVa 1451 Average - 斜率优化

    A DNA sequence consists of four letters, A, C, G, and T. The GC-ratio of a DNA sequence is the numbe ...

  3. UVA - 1451 Average (斜率优化)

    题意:由01组成的长度为n的子串,AT由0表示,GC由1表示,求一段长度大于等于L且GC率最高的子串的起始终止坐标,若GC率相同,取长度较小,若长度相同,取起始坐标最小. 分析: 1.一个子串(i+1 ...

  4. 斜率优化dp(POJ1180 Uva1451)

    学这个斜率优化dp却找到这个真心容易出错的题目,其中要从n倒过来到1的确实没有想到,另外斜率优化dp的算法一开始看网上各种大牛博客自以为懂了,最后才发现是错了. 不过觉得看那些博客中都是用文字来描述, ...

  5. UVa 1451 (数形结合 单调栈) Average

    题意: 给出一个01串,选一个长度至少为L的连续子串,使得串中数字的平均值最大. 分析: 能把这道题想到用数形结合,用斜率表示平均值,我觉得这个想法太“天马行空”了 首先预处理子串的前缀和sum,如果 ...

  6. 紫书 例题8-9 UVa 1451 (数形结合)

    这道题用了数形结合, 真的牛逼, 完全想到不到还可以这么做 因为题目求的是平均值, 是总数除以个数, 这个时候就可以联系 到斜率, 也就是说转化为给你一堆点, 让你求两点之间的最大斜率 要做两个处理 ...

  7. UVa 1451 平均值

    https://vjudge.net/problem/UVA-1451 题意:给定长度为n的01串,选一个长度至少为L的连续子串,使得子串中数字的平均值最大. 思路:这题需要数形结合,真的是很灵活. ...

  8. 【UVA 1451】Average

    题 题意 求长度为n的01串中1占总长(大于L)的比例最大的一个子串起点和终点. 分析 前缀和s[i]保存前i个数有几个1,[j+1,i] 这段区间1的比例就是(s[i]-s[j])/(i-j),于是 ...

  9. HDU3045 Picnic Cows (斜率DP优化)(数形结合)

    转自PomeCat: "DP的斜率优化--对不必要的状态量进行抛弃,对不优的状态量进行搁置,使得在常数时间内找到最优解成为可能.斜率优化依靠的是数形结合的思想,通过将每个阶段和状态的答案反映 ...

随机推荐

  1. pandas基础(1)_Series和DataFrame

    1:pandas简介 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标 ...

  2. Unity DOTS 走马观花

    https://segmentfault.com/a/1190000019143037 本文还在不断完善,可能不会及时同步在 SegmentFault,源文章在我的博客中:萤火之森 - Unity D ...

  3. 51nod1112(xjb)

    題目鏈接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1112 題意:中文題誒- 思路:對於函數 f(x) = a + ...

  4. 2017-9-20 NOIP模拟赛

    A 约数之和 (count.pas/c/cpp)TL:1S ML:128MB[Description]我们用 D(x)表示正整数 x 的约数的个数.给定一个正整数 N,求 D(1)+D(2)+…+D( ...

  5. jzoj6004. 【PKUWC2019模拟2019.1.17】集合 (组合数学)

    题面 题解 这种题目就是要好好推倒 我们枚举最小的数是哪一个,那么答案就是\[Ans=\sum_{i=1}^nT^i{n-i\choose k-1}\] 因为有\[\sum_{i=p}^n{n-i\c ...

  6. Linux 添加硬盘并分区

    Linux 添加硬盘并分区 *********************** 1.fdisk /dev/sdb 2.m   //帮助 3.p   // p 列出分区表 4.q   //不保存退出: 5. ...

  7. Jmeter 的 vars 和 props 用法

    meter 的 JSR223 控件是 代替 BeanShell 的新一代脚本控件,支持多种脚本语言,尤其是其中的 Groovy,更是重点推荐使用的脚本语言,本文研究其中的 vars 和 props 两 ...

  8. 数组Array的相关操作。

    一 数组的对象(元素): 1. 数字, 2 .字符串 3 变量 4. 函数 .... 二 数组的创建 1 var arrayObj = new Array(); var a =new Array(si ...

  9. NET中并行开发优化

    NET中并行开发优化 让我们考虑一个简单的编程挑战:对大数组中的所有元素求和.现在可以通过使用并行性来轻松优化这一点,特别是对于具有数千或数百万个元素的巨大阵列,还有理由认为,并行处理时间应该与常规时 ...

  10. Spark Mllib里的本地矩阵概念、构成(图文详解)

    不多说,直接上干货! Local matrix:本地矩阵 数组Array(1,2,3,4,5,6)被重组成一个新的2行3列的矩阵. testMatrix.scala package zhouls.bi ...