UVa 1451 (数形结合 单调栈) Average
题意:
给出一个01串,选一个长度至少为L的连续子串,使得串中数字的平均值最大。
分析:
能把这道题想到用数形结合,用斜率表示平均值,我觉得这个想法太“天马行空”了
首先预处理子串的前缀和sum,如果在坐标系中描出(i, sum[i])这些点的话。
所求的平均值就是两点间的斜率了,具体来说,在连续子串[a, b]中,有sum[b]-sum[a-1]个1,长度为b-a+1,所以平均值为(sum[b]-sum[a-1])/(b-a+1)
所以就把问题转化为:求两点横坐标之差至少为L-1,能得到的最大斜率。
这道题和HDU 5033很相似,当时第一次见到用单调栈的解法,仅仅是凭着自己的理解写的题解,现在看来写得也十分蛋疼。
还是紫书上讲得清楚透彻。
#include <iostream>
#include <cstdio>
using namespace std; const int maxn = + ;
char s[maxn];
int n, L, sum[maxn], p[maxn]; int cmp(int a1, int b1, int a2, int b2)
{ return (sum[b1]-sum[a1-]) * (b2-a2+) - (sum[b2]-sum[a2-]) * (b1-a1+); } int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &L); getchar();
for(int i = ; i <= n; ++i) s[i] = getchar();
for(int i = ; i <= n; ++i) sum[i] = sum[i-] + s[i] - ''; int i = , j = , ansL = , ansR = L;
for(int t = L; t <= n; ++t)
{//枚举连续子串的右端点
while(j - i > && cmp(p[j-], t-L, p[j-], t-L) >= ) j--;//删掉上凸点
p[j++] = t-L+; while(j - i > && cmp(p[i], t, p[i+], t) <= ) i++;//找到切点使斜率最大
int c = cmp(p[i], t, ansL, ansR);
if(c > || (c == && t - p[i] < ansR - ansL)) { ansL = p[i]; ansR = t; }
} printf("%d %d\n", ansL, ansR);
} return ;
}
代码君
UVa 1451 (数形结合 单调栈) Average的更多相关文章
- uva 1451 数形结合
思路:枚举点t,寻找满足条件的点t': 计sum[i]为前i项合,平均值即为sum[t]-sum[t'-1]/t-t'+1 设(Pi=(i,Si),表示点在s中的位置,那么就可以画出坐标图,问题就转化 ...
- [USACO2003][poj2018]Best Cow Fences(数形结合+单调队列维护)
http://poj.org/problem?id=2018 此乃神题……详见04年集训队论文周源的,看了这个对斜率优化dp的理解也会好些. 分析: 我们要求的是{S[j]-s[i-1]}/{j-(i ...
- cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈
/* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数 ...
- 【BZOJ3879】SvT 后缀数组+单调栈
[BZOJ3879]SvT Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干 ...
- UVA 1451 Average平均值 (数形结合,斜率优化)
摘要:数形结合,斜率优化,单调队列. 题意:求一个长度为n的01串的子串,子串长度至少为L,平均值应该尽量大,多个满足条件取长度最短,还有多个的话,取起点最靠左. 求出前缀和S[i],令点Pi表示(i ...
- 紫书 例题8-9 UVa 1451 (数形结合)
这道题用了数形结合, 真的牛逼, 完全想到不到还可以这么做 因为题目求的是平均值, 是总数除以个数, 这个时候就可以联系 到斜率, 也就是说转化为给你一堆点, 让你求两点之间的最大斜率 要做两个处理 ...
- UVA 1619/POJ2796 滑窗算法/维护一个单调栈
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 12409 Accepted: 3484 Case T ...
- 【UVA 1451】Average
题 题意 求长度为n的01串中1占总长(大于L)的比例最大的一个子串起点和终点. 分析 前缀和s[i]保存前i个数有几个1,[j+1,i] 这段区间1的比例就是(s[i]-s[j])/(i-j),于是 ...
- uva 1619 - Feel Good || poj 2796 单调栈
1619 - Feel Good Time limit: 3.000 seconds Bill is developing a new mathematical theory for human ...
随机推荐
- php删除html标签的三种解决方法
分享下PHP删除HTMl标签的三种方法. 方法1:直接取出想要取出的标记 <?php //取出br标记 function strip($str) { $str=str_replace(" ...
- web一次请求的流程
1.客户端(浏览器输入网址)请求 2.发送http协议到web服务器(nginx),检测请求类别,如果时纯静态页面,则返响应返回给客户端. 3.如果有动态脚本(php语法)启动fastcgi进程,用解 ...
- Custom Control
How to create custom control http://www.silverlightshow.net/items/Creating-a-Silverlight-Custom-Cont ...
- 巧用system函数个性化屏幕显示
函数名:system 功 能: 发出一个DOS命令 用 法: system("DOS命令"); (system函数需加头文件<stdlib.h&g ...
- Android中获取应用程序(包)的大小-----PackageManager的使用(二)
通过第一部分<<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>>的介绍,对PackageManager以及 AndroidMani ...
- excle,aspose.cells 公式字段值取不到 xmls转xml
问题: 一,单元格如果是公式的,读出值为0 aspose.cells 4.4.0.5版本 由于太低,读xmls后缀的excel文件时,发现如果此列是公式算出来的,值是获取不到的.获取到的值一直是0 二 ...
- 【ibatis】cachemodel、属性 及特殊配置
http://www.cnblogs.com/13590/archive/2013/03/01/2938126.html <?xml version="1.0" encodi ...
- 关于FileSystemWatcher监听文件创建
FileSystemWatcher中的Created事件不但可以监听用户创建的文件,当用户删除某个文件时,系统会在再监听的那个盘上的回收站创建一个文件,在回收站创建的文件也会触发Created事件,而 ...
- 从JAVA多线程理解到集群分布式和网络设计的浅析
对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些 ...
- 【BZOJ3262】 陌上花开
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...