FZU 2136 取糖果

点击打开链接

题意:中文题....

思路:对于每个数,我们可以求出以当前这个点为最大值能够向左右两边扩展的范围,假设每个数的左边和右边扩展到l[i] , r[i]的位置。接下来我们只要枚举这n个数,然后枚举1~这个数的区间长度,并更新ans数组即可。这边为了控制时间复杂度我们可以采用线段树的成段更新

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

#define lson(x) (x<<1)
#define rson(x) (lson(x)|1)
#define mid(x,y) ((x+y)>>1)
const int INF = 0x3f3f3f3f;
const int MAXN = 100010;

struct Node{
    int left;
	int right;
	int mark;//延时标记
	int num;
};
Node node[4*MAXN];
int n , num[MAXN];
int l[MAXN] , r[MAXN];

// 向下更新
void push_down(int pos){
	if(node[pos].mark != INF){//如果可以继续往下更新
		node[lson(pos)].mark = min(node[lson(pos)].mark , node[pos].mark);
		node[rson(pos)].mark = min(node[rson(pos)].mark , node[pos].mark);

		node[lson(pos)].num = min(node[pos].mark , node[lson(pos)].num);
		node[rson(pos)].num = min(node[pos].mark , node[rson(pos)].num);
		node[pos].mark = INF;
	}
}

void build(int left , int right , int pos){
	node[pos].left = left;
	node[pos].right = right;
	node[pos].mark = INF;
	node[pos].num = INF;
	if(left == right){
		scanf("%d" , &num[left]);
		return;
	}
	int mid = mid(left , right);
	build(left , mid , lson(pos));
	build(mid+1 , right , rson(pos));
}

void update(int left , int right , int val , int pos){
	if(left <= node[pos].left && right >= node[pos].right){
		node[pos].mark = min(node[pos].mark , val);
		node[pos].num = min(node[pos].num , node[pos].mark);
		return;
	}
	push_down(pos);// 向下更新

	int mid = mid(node[pos].left , node[pos].right);
	if(right <= mid)
		update(left , right , val , lson(pos));
	else if(left > mid)
		update(left , right , val , rson(pos));
	else{
		update(left , mid , val , lson(pos));
		update(mid+1 , right , val , rson(pos));
	}
}

int query(int index , int pos){
    if(node[pos].left == node[pos].right)
		return node[pos].num;
	int mid = mid(node[pos].left , node[pos].right);
	push_down(pos);// 向下更新

	if(index <= mid)
		return query(index , lson(pos));
	else
		return query(index , rson(pos));
}

void solve(){
	// get left and right
	for(int i = 1 ; i <= n ; i++){
		int j;
		// get left
		for(j = i-1 ; j >= 1 ; j--)
			if(num[j] > num[i])
				break;
		l[i] = j+1;
		// get right
		for(j = i+1 ; j <= n ; j++)
			if(num[j] > num[i])
				break;
		r[i] = j-1;
	}
	// update
	for(int i = 1 ; i <= n ; i++)
		update(1 , r[i]-l[i]+1 , num[i] , 1);
	for(int i = 1 ; i <= n ; i++)
		printf("%d\n" , query(i , 1));
}

int main(){
    int cas;
	scanf("%d" , &cas);
	while(cas--){
		scanf("%d" , &n);
		build(1 , n , 1);
		solve();
	}
	return 0;
}
时间: 2024-09-17 03:44:58

FZU 2136 取糖果的相关文章

DOTA2万圣节模式:ROSHAN不给糖就捣乱

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   [科技讯]10月31日消息,明天就是万圣节了,DOTA2为了庆祝节日,特意推出了三个万圣节狂欢游戏模式.不给糖就捣乱,一直矗立在黑暗山洞内的ROSHAN这下也按捺不住,手提南瓜灯与英雄们一起欢乐的玩闹起来. 那么到底是怎样新颖的三个全新的游戏模式呢?下面就为大家一一介绍. 模式1:糖果乱战 和敌方队伍比赛谁收集的糖果数量更多; 从roshan处收集糖果并放到自己

雀巢薄荷糖被曝添加香精员工赤手分拣糖果

雀巢,这是个全球闻名的大品牌,除了生产咖啡与巧克力,还生产糖果等食品,在81个国家有400多家工厂.这样一家跨国公司,它的生产车间是什么样的,产品是如何生产出来的,车间里的工人是否严格遵守操作规范--带着种种疑问,近日记者走进雀巢糖果生产车间,揭开它的神秘面纱.员工未办健康证就上岗,进车间前不在洗手池洗手,在车间里边玩手机边聊天,还赤手抓糖果--记者还发现,雀巢生产出现双重标准,在英国等地宣布放弃添加剂,在中国却生产添加香精的薄荷糖. 卫生安全:赤手抓糖果,打火机随便放 问题一:健康证没办下来就

有你就有礼 “富可视糖果手机”就是要你甜!

硅谷网讯 提起糖果,大家会想到什么呢?是五颜六色的多彩世界,是香甜嫩口的回味无穷,还是青春荡漾的激情.其实,糖果带给我们的是一种乐趣,一份来源于内心的满足,更多的是让人感动的甜蜜幸福.这个夏天,富可视Infocus从糖果这种人见人爱的小东西里激发灵感,推出了富可视糖果手机.今天,富可视糖果手机正式在天猫首发上市,富可视http://www.aliyun.com/zixun/aggregation/36716.html">天猫旗舰店与富可视官方微博同步推出特惠活动,除了将市场价799元的糖果

糖果直播APP怎么开主播 糖果直播开主播方法介绍

糖果直播APP是一款聚集了众多美女主播的软件,如果你也想要做主播,那就需要了解一下开主播的相关操作哦!糖果直播APP怎么开主播?小编带来了糖果直播APP开主播方法介绍,别错过哦.  糖果直播APP开主播方法介绍: 操作是相当简单的,点击本页面的糖果直播下载安装,注册登录后,首先您可以点击中间的直播按钮:然后您可以给直播取个吸引人的标题,点击开始直播. 小伙伴们,以上就是全部的糖果直播APP开主播方法介绍了,知道了怎么操作之后想要尝试的玩家都可以去试试啦~

糖果直播APP开直播方法详解

给各位糖果直播软件的使用者们来详细的解析分享一下开直播的方法. 方法分享:     操作是相当简单的,点击本页面的糖果直播下载安装,注册登录后,首先您可以点击中间的直播按钮;然后您可以给直播取个吸引人的标题,点击开始直播. 好了,以上的信息就是小编给各位糖果直播的这一款软件的使用者们带来的详细的开直播的方法解析分享的全部内容了,各位看到这里的软件使用者们,小编相信你们现在那是非常的清楚开直播的方法了吧,那么各位朋友们就快去按照小编上面带来的方法自己去开直播吧.

糖果游戏带你赢大奖

期待已久的世界杯将在6月13日迎来第一场比赛,而同时免流量玩游戏的"糖果游戏中心"也正式上线于安卓终平台!在您等待球赛开始的同时,可以通过"糖果游戏"来免流量玩游戏吧.平台还为用户提供了好玩的猜球活动,在游戏的过程中,还可以参与世界杯竞猜,赢取1KG的金球.三星Note3等价值超过百万的大奖!让我们和身边的朋友们一起享受可以"免流量玩游戏"的世界杯吧! 在享受世界杯的同时,最大的烦恼就是倒时差看比赛.我们这时已经开始犯困或者和朋友喝的已经不省人事

记者卧底雀巢糖果生产车间:工人赤手抓糖果

( 8 ) ( 6 ) 雀巢,这是个全球闻名的大品牌,除了生产咖啡与巧克力,还生产糖果等食品,在81个国家有400多家工厂.这样一家跨国公司,它的生产车间是什么样的,产品是如何生产出来的,车间里的工人是否严格遵守操作规范--带着种种疑问,近日记者走进雀巢糖果生产车间,揭开它的神秘面纱.员工未办健康证就上岗,进车间前不在洗手池洗手,在车间里边玩手机边聊天,还赤手抓糖果--记者还发现,雀巢生产出现双重标准,在英国等地宣布放弃添加剂,在中国却生产添加香精的薄荷糖.更衣室吸烟赤手抓糖果卫生安全赤手抓糖果

php使用curl简单抓取远程url的方法

 这篇文章主要介绍了php使用curl简单抓取远程url的方法,涉及php操作curl的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php使用curl抓取远程url的方法.分享给大家供大家参考.具体如下: cURL是一个非常有用的php库,可以用来连接不通类型的服务器和协议,下面是一个最基本的范例用来抓取远程网页 ? 1 2 3 4 5 6 <?php $c = curl_init('http://www.w3mentor.com/robots.txt'); curl

PHP四舍五入精确小数位及取整

  (1)php保留三位小数并且四舍五入  代码如下   $num=0.0215489; echo sprintf("%.3f", $num); // 0.022 (2)php保留三位小数不四舍五入  代码如下   $num=0.0215489; echo substr(sprintf("%.4f", $num),0,-1); // 0.021 (3)php进一法取整数(这个在分页程序的页数程序里面会用到)  代码如下   echo ceil(4.3);    //