Problem 2136 取糖果

Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

有N个袋子放成一排,每个袋子里有一定数量的糖果,lzs会随机选择连续的几个袋子,然后拿走这些袋子中包含最多糖果的袋子。现问你,在选择x个袋子的情况下,lzs最坏情况下,也就是最少会拿到多少个糖果?对于x取值为1到n都分别输出答案。

 Input

第一行一个整数T,表示有T组数据。

每组数据先输入一行一个整数N(1<=N<=100000),表示袋子数,接下来一行输入N个正整数,输入的第i个数表示第i个袋子所装的糖果数。

 Output

每组数据输出n行,第i行表示lzs随机取连续的i个袋子时的最坏情况下能拿到的糖果数。

 Sample Input

1 5 1 3 2 4 5

 Sample Output

1 3 3 4 5

参考  :  http://www.cnblogs.com/luotinghao/archive/2013/11/11/3418047.html

题意有点绕...大概就是对于一个d,取一段连续的d个数,然后从中选择最大的。现考虑所有长度为d的子段,问这些段数中最大的数中的最小的数是什么。对于d取值为1到n都要输出答案。
首先按从小到大的顺序排序, 依次删除, 删除前查看下,这个点的范围域, 即左右共删除了几个,

设 d = 删除的点数+本身为范围域, 假如d以前没更新过,  则连续取d的最坏值(暂时)为这个点的值
例如样例: 1 3 2 4 5
 
从小到大删除点, 先删除最小点, 以下标记黄色:
       1   3   2   4   5
左右都没删东西, d=1 所以连续取1个最坏值为1, 接下来删除2
   1   3   2   4   5
d=1 因为已经更新过, 更新为2的话肯定比原来的大了, 不是最坏值, 所以不更新, 再删除3
       1   3   2   4   5
d=3 所以连续取3个的最坏值为3, 再删除4
       1   3   2   4   5
d=4 所以连续取4个的最坏值为4, 最后删除5
   1   3   2   4   5
d=5 所以连续取5个的最坏值为5  
 
最后从后往前for一遍, 使连续d+1个的值大于等于连续d个的值
 
中间操作, 可以借助链表的结构
 
 
#include <iostream>
#include <stdio.h>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>
#include <map>
#include <stack>
#include <math.h>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long LL ;
const int Max_N = ;
int N ;
int ans[Max_N] ;
struct List{
int Left ;
int Right ;
}; struct Node{
int num ;
int id ;
friend bool operator < (const Node A ,const Node B){
return A.num < B.num ;
}
}; List lis[Max_N] ;
Node node[Max_N] ;
bool is_delete[Max_N] ; int find_Left(int id){
if(is_delete[id]==)
return id ;
else
return lis[id].Left = find_Left(lis[id].Left) ;
} int find_Right(int id){
if(is_delete[id]==)
return id ;
else
return lis[id].Right = find_Right(lis[id].Right) ;
} int main(){
int T ;
scanf("%d",&T) ;
while(T--){
scanf("%d",&N) ;
fill(is_delete,is_delete++N,) ;
fill(ans,ans++N ,-) ;
for(int i= ; i <= N ; i++){
scanf("%d",&node[i].num) ;
lis[i].Left = i- ;
lis[i].Right = i+ ;
node[i].id = i ;
}
sort(node+,node++N) ;
for(int i = ;i <= N ; i++){
int id = node[i].id ;
int L = find_Left(lis[id].Left) ;
int R = find_Right(lis[id].Right) ;
int continue_num = R-L- ;
if(ans[continue_num] == -)
ans[continue_num] = node[i].num ;
is_delete[id] = ;
}
for(int i= N- ; i >= ; i--){
if(ans[i] == - || ans[i]>ans[i+])
ans[i] = ans[i+] ;
}
for(int i = ; i <= N ; i++)
printf("%d\n",ans[i]) ;
}
return ;
}

FZU Problem 2136 取糖果的更多相关文章

  1. Problem 2136 取糖果---FUOJ (线段树+维护)

    http://acm.fzu.edu.cn/problem.php?pid=2136 题目大意: 给你n个袋子每个袋子里都装有糖果,然后呢你可以每次抽取一个连续的一个区间的袋子,然后带走里面最多糖果数 ...

  2. fzu 2136 取糖果 好几种方法解决。

    Problem 2136 取糖果 Accept: 39    Submit: 101 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem ...

  3. FZu Problem 2233 ~APTX4869 (并查集 + sort)

    题目链接: FZu Problem 2233 ~APTX4869 题目描述: 给一个n*n的矩阵,(i, j)表示第 i 种材料 和 第 j 种材料的影响值,这个矩阵代表这n个物品之间的影响值.当把这 ...

  4. FZu Problem 2236 第十四个目标 (线段树 + dp)

    题目链接: FZu  Problem 2236 第十四个目标 题目描述: 给出一个n个数的序列,问这个序列内严格递增序列有多少个?不要求连续 解题思路: 又遇到了用线段树来优化dp的题目,线段树节点里 ...

  5. 翻翻棋(找规律问题)(FZU Problem 2230)

    题目是这样的: FZU Problem 2230 象棋翻翻棋(暗棋)中双方在4*8的格子中交战,有时候最后会只剩下帅和将.根据暗棋的规则,棋子只能上下左右移动,且相同的级别下,主动移动到地方棋子方将吃 ...

  6. FZU Problem 2132 LQX的作业 (数学题)

    http://acm.fzu.edu.cn/problem.php?pid=2132 N个数已经排成非递减顺序,那么每次可以取 前m->n个在x前面.取前m个在x前面的概率是 C(n,m)*x^ ...

  7. fzu Problem 2148 Moon Game(几何 凸四多边形 叉积)

    题目:http://acm.fzu.edu.cn/problem.php?pid=2148 题意:给出n个点,判断可以组成多少个凸四边形. 思路: 因为n很小,所以直接暴力,判断是否为凸四边形的方法是 ...

  8. fzu Problem 2140 Forever 0.5(推理构造)

    题目:http://acm.fzu.edu.cn/problem.php?pid=2140 题意: 题目大意:给出n,要求找出n个点,满足: 1)任意两点间的距离不超过1: 2)每个点与(0,0)点的 ...

  9. Fzu Problem 2082 过路费 LCT,动态树

    题目:http://acm.fzu.edu.cn/problem.php?pid=2082 Problem 2082 过路费 Accept: 528    Submit: 1654Time Limit ...

随机推荐

  1. 【python】浅谈enumerate 函数

    enumerate 函数用于遍历序列中的元素以及它们的坐标: >>> for i,j in enumerate(('a','b','c')):  print i,j 0 a 1 b ...

  2. js 编号生成器

    编号生成器 前缀: 后缀: 位数: 连续数字 随机字符 范围: ~ 过滤字符: 多个使用,号分割 0123456789 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLM ...

  3. nova分析(10)—— nova-rootwrap

    一.nova-rootwrap的作用 部署玩过openstack的都应该知道,它会生成一个nova用户来管理所有服务.nova身份在linux中属于普通用户级别,避免了一些需要root身份运行的操作, ...

  4. JS使用百度地图API

    尚未整理: <script type="text/javascript"> var map = new BMap.Map("dituContent" ...

  5. Nginx做反向代理总是被系统kill

    公司使用Nginx做反向代理,以前都挺正常的,最近不知怎么回事总是无端被系统kill,而在nginx错误日志中也没有信息输出. 网上查了很多资料,也没什么靠谱的回答,唯一觉得有点关联的就是linux ...

  6. 【原】C# decimal字符串转成整数

    第一种方法: string na="1000.53"; int a=int.Parse(na.Substring(0,na.IndexOf('.')));//返回值a=1000 第 ...

  7. Mysql分区技术

    注:分区的语法可以看手册中有详细的写法和例子: show plugins; 此命令查看可有partition这个选项,有则mysql支持分区,没有的话,就可以升级一下mysql 实时监控一个命令执行情 ...

  8. JavaScript中对于闭包的理解

    1.什么是闭包? 闭包,官方对闭包的解释是:一个拥有很多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭包的特点: (1).作为一个函数变量的一个引用,当函 ...

  9. 【SQL Server】系统学习之三:逻辑查询处理阶段-六段式

    一.From阶段 针对连接说明: 1.笛卡尔积 2.on筛选器 插播:unknown=not unknuwn 缺失的值: 筛选器(on where having)把unknown当做FALSE处理,排 ...

  10. C# ASP.NET 开发指引简要

    推荐学习交流社区:博客园http://www.cnblogs.com/ 里面有很多技术.职业圈子等信息的分享,新手必逛社区. 电子书等资源下载:csdn下载 http://download.csdn. ...