技巧题---Single boy
Description
Today is Christmas day. There are n single boys standing in a line. They are numbered form 1 to n from left to right. The i-th single boy has ai single strength. They are singing single boy Christmas song! Single boy,single boy, single all the way, having party together and turning into gay! Hey!
A group of single boys is non-empty contiguous segment of the line. The size of a group is the number of single boys in that group. The single strength of a group is the minimum single strength of the single boy in that group.
Now we want to know for each x such that 1<=x<=n the maximum single strength among all groups of size x.
Input
The first line of input contains T(<=30), the test cases.
For each test case, the first line is a integer n(1 <= n <= 2*10^5), the number of single boys.
The second line contains n integers [1,10^9] separated by space, the single strength of each single boy.
Output
Print n integers in one line. For each x from 1 to n, print the maximum strength among all groups of size x.
Sample Input
1
10
1 2 9 3 8 2 2 10 19 6
Sample Output
19 10 6 2 2 2 2 2 2 1
题意:n个数,(1<=k<=n),在n个数中连续的k个数为一个区间长度,一共有n-k+1个区间,
每个区间选出区间中的最小值min[j](1<=j<=n-k+1),然后在n-k+1个区间中选出最大的
min[j],得到max[i](1<=i<=k),然后按k=1~n顺序输出max[i].
由于数据太大,暴力模拟寻找太慢不能实现,所以我们想到的是求 以num[i]为最小值
的区间长度,然后选择区间长度相等Max(num[i]),开始我用了暴力寻找区间,由于数据
太大,TLE了,后来学习别人方法,用栈求得区间长度,我们把以num[i]为最小值的区间
的左右边界求出来,右边界-左边界就是区间长度;
用栈求区间左右边界:先求左边界后求右边界,开始将下标0入栈,我们的数组是从1
开始的,然后比较以栈顶元素为下标的值是否大于等于当前值,是的话出栈,直到比当前
值小,当前值的左边界就等于当前下标-栈顶元素+1,最后每次都要把当前下标入栈,
求右边界完全一样。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
const int maxn=;
struct ac
{
int num;
int l,r;
}d[maxn];
int ans[maxn];
stack<int>sta;
int main()
{
int t,n,Top,dn;
scanf("%d",&t);
while(t--)
{
int flag=;
scanf("%d",&n);
d[].num=;///以0 ,n+1为下标的值为0.
d[n+].num=; sta.push();///压入0下标
for(int i=; i<=n; i++)
{
scanf("%d",&d[i].num);
while(!sta.empty())///求左边界
{
Top=sta.top();
if(d[Top].num>=d[i].num)///比较当前值与以栈顶元素为下标的值
sta.pop();
else
break;
}
Top=sta.top();
d[i].l=Top+;///左边界
sta.push(i);///每次压入当前下标
}
while(!sta.empty())
sta.pop(); sta.push(n+);///求右边界,压入下标n+1
for(int i=n; i>=; i--)
{
while(!sta.empty())
{
Top=sta.top();
if(d[Top].num>=d[i].num)
sta.pop();
else
break;
}
Top=sta.top();
d[i].r=Top-;
sta.push(i);
}
while(!sta.empty())
sta.pop();
memset(ans,,sizeof(ans));
for(int i=; i<=n; i++)///求ans,每次都更新 以区间长度为dn的最大值
{
dn=d[i].r-d[i].l+;
ans[dn]=max(ans[dn],d[i].num);
}
for(int i=n-;i>=;i--)///有些区间长度是找不到,那么用比他区间长度大的更新其值
{
if(ans[i]<ans[i+])
ans[i]=ans[i+];
} printf("%d",ans[]);
for(int i=; i<=n; i++)
printf(" %d",ans[i]);
printf("\n");
}
return ;
}
样例值 1 2 9 3 8 2 2 10 19 6
以该值为最
小值的区间长度 10 9 1 3 1 9 9 2 1 3
区间长度为 10有1 ,max[10]=1;
区间长度为 9 有2,2,2,max[9]=2;
区间长度为 4-8 都没有,即为0,那么以区间为长度为9的更新max[4-8]=2;
区间长度为 3有 3,6, max[3]=6;
区间长度为 2有 10, max[2]=10;
区间长度为 1有 9,8,19,max[1]=19;
为什么以区间更大的修改,以为区间越大,数值越小,区间小的的最大值不可能大于
区间大的最大值
技巧题---Single boy的更多相关文章
- Gym 101102J---Divisible Numbers(反推技巧题)
题目链接 http://codeforces.com/gym/101102/problem/J Description standard input/output You are given an a ...
- OCP 认证考试报名费技巧题库051052053解析合格线
本人于2017年4月22日通过参加OCP考试,第一次参加,一天之内考了三门,三门一次性通过,052 - 95% ,053 - 86% ,051 - 100% 一.关于考试考试报名费: 052:158$ ...
- LeetCode算法题-Single Number(Java实现)
这是悦乐书的第175次更新,第177篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第34题(顺位题号是136).给定一个非空的整数数组,除了一个元素外,每个元素都会出现两 ...
- 【LOJ6043】「雅礼集训 2017 Day7」蛐蛐国的修墙方案(搜索技巧题)
点此看题面 大致题意: 给你一个长度为\(n\)的排列\(p\),要求构造一个合法的括号序列,使得如果第\(i\)个位置是左括号,则第\(p_i\)个位置一定是右括号. 暴搜 很容易想出一个暴搜. 即 ...
- POJ 2229 Sumsets(技巧题, 背包变形)
discuss 看到有人讲完全背包可以过, 假如我自己做的话, 也只能想到完全背包了 思路: 1. 当 n 为奇数时, f[n] = f[n-1], 因为只需在所有的序列前添加一个 1 即可, 所有的 ...
- 【动态规划技巧题】POJ2229-Sumsets
[题目大意] 把一个数n分成2的指数幂相加的形式,问有几种情况. [思路] 如果当前i为奇数,则必定有至少一个1,可以看作i-1的情形再加上一个1.即f[i]=f[i-1]. 如果当前i为偶数,假设没 ...
- FZU 1922——非主流——————【技巧题】
非主流 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status P ...
- HDU 5288——OO’s Sequence——————【技巧题】
OO’s Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- nyoj 1205——简单问题——————【技巧题】
简单问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给你一个n*m的矩阵,其中的元素每一行从左到右按递增顺序排序,每一列从上到下按递增顺序排序,然后给你一些数x ...
随机推荐
- ubuntu-15.10-server-i386.iso 安装 Oracle 11gR2 数据库
注意: ld的版本为 2.25.1,gcc版本为gcc-5 特点: 需要重新安装老版本的 libaio1_0.3.109-2ubuntu?_i386.deb.默认的libaio库有问题,和其默认lib ...
- MT写的对URL操作的两个方法
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- RESTFUL接口
原文地址:http://kb.cnblogs.com/page/512047/ 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者 ...
- 11款样式新颖的 jQuery/CSS3 网页菜单
今天为大家准备了11款样式风格挺不错的jQuery/CSS3网页菜单,主要包括面包屑菜单.下拉菜单.Tab菜单等,喜欢的朋友赶紧收藏,一起来看看这些菜单. 1.jQuery / CSS3多功能下拉菜单 ...
- AD10长方形通孔焊盘的画法
1.点击工具栏中[放置焊盘]按钮 2.按键盘Tab键弹出[焊盘]对话框 3.设置[空洞信息]相关尺寸(根据自己所需实际设置) 这里左边的单选按钮选择“槽”,通孔尺寸输入20mil,长度为80mil,旋 ...
- MFC中混合使用Duilib制作界面
因为公司项目最近入了MFC的这个大坑,用MFC做UI做了一段时间,感觉不是很方便,开发效率有点慢. 看了c++里面做界面的类库,感觉Duilib比较符合做界面的需求,而且很多大公司也在使用Duilib ...
- 国内的maven镜像
阿里云 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>ht ...
- delphi7的新生,参与分布式应用开发,调用RESTful API,Json的应用
前言: 1.公司delphi7开发的传统软件还活得好好的,但是大家都知道delphi早已经日落西山了,现在成了后进.追随者.细细算了已经6.7不用了.新的delphixe7呢,没有时间成本去适应和研究 ...
- 再说 c++11 内存模型
可见性与乱序 在说到内存模型相关的东西时,我们常常会说到两个名词:乱序与可见性,且两者经常交错着使用,容易给人错觉仿佛是两个不同的东西,其实不是这样,他们只是从不同的角度来描述一个事情,本质是相同的. ...
- java---Swing界面开发总结
一.java的图形界面 1.awt java.awt jdk1.4之前推出的图形界面,用c/c++编写,跨平台性不好 2.swing javax.swing jdk1.4时推出的图形界面,跨平 ...