NKOJ P2419 【单调队列】集合的第N大元素

来源:互联网 发布:网易云音乐推荐算法 编辑:程序博客网 时间:2024/05/21 22:11

题目导引:http://oi.nks.edu.cn/zh/Problem/Details/2419

问题描述

有一个集合满足下面的关系:
1)1属于该集合;
2)如果x属于该集合,则2x+1和3x+1也属于该集合;
3)集合中再无其它的元素。
请你求出集合的前n小的元素。

输入格式

一个整数N(N<=200000)

输出格式

一行,N个不同的整数,由小到大排列,用空格间隔

样例输入

5

样例输出

1 3 4 7 9










建两个队列,分别存放2*m+1与3*m+1的元素,注意维护单调递增

对于第i小元素,讲两个队列的队首元素取出进行讨论,输出较小的那个元素,

一直到第n小的数

#include <stdio.h>#define ll long long#define maxn 200000+5int n,x=1;ll a[maxn],b[maxn];int main(){int ha,hb,ta,tb;scanf("%d",&n);ha=hb=ta=tb=1;for(int i=1;i<=n;i++){printf("%d ",x);a[ta++]=x*2+1;b[tb++]=x*3+1;if(a[ha]==b[hb]){x=a[ha];++ha;++hb;}    else if(a[ha]<b[hb]) x=a[ha++];        else x=b[hb++];}return 0;}



原创粉丝点击