FZUOJ 1894 志愿者选拔

FZUOJ 1894 志愿者选拔

从一个数字序列中不断的求当前序列的最大值。采用单调队列。维护一个单调递减的队列,注意删除的时候,比较当前的最大元素即当前的队列头的位置,如果这个位置大于要删除的位置,则不需要移动,否则就将队首指针移动。程序如下:

/*
ID : csuchenan
PROG : fzuoj 1894
LANG : C++
*/

#include<stdio.h>
#include<string.h>

#define MAXN 1000000
#define INF 1000000005

struct Node{
	int pos ;
	int vrp ;
}node[MAXN] ;

void work() ;
void insert_queue(int pos , int val) ;
void pop_node(int pos) ;

int m ;
char str[10] ;

int front ;
int rear  ;

int main(int argc , char * argv){
	
	int test ;
	scanf("%d" , &test) ;
	
	while(test --){
		work() ;
	}
	return 0 ;
}

void work(){
	
	char c  ;
	int val ;
	int i   ;
	int j   ;
	
	scanf("%s" , str) ;
	getchar() ;
	
	i = 1 ;
	j = 1 ;
	
	front = 1 ;
	rear = 0  ;
	node[0].vrp = INF ;
	
	while(1){
		c = getchar() ;
		
		if(c == 'C'){
			
			scanf("%s %d" , str , &val) ;
			
			insert_queue(i , val) ;
			i ++ ;
		}
		else if(c == 'G'){
			pop_node(j) ;
			j ++ ;
		}
		else if(c == 'Q'){
			
			if(front > rear){
				printf("-1") ;
			}
			else 
				printf("%d" , node[front].vrp) ;
			
			printf("\n") ;	
		}
		else{
			scanf("%s" , str) ;
			break ;
		}
		
		getchar() ;
	}
	
	return ; 
}

void insert_queue(int pos , int val){
	
	while(front <= rear && node[rear].vrp < val){
		rear -- ;
	}
	
	rear ++ ;
	node[rear].vrp = val ;
	node[rear].pos = pos ;
	
	return ;
}

void pop_node(int pos){
	
	if(pos >= node[front].pos){
		front ++ ;
	}
	return ;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值