B. Preparing for Merge Sort

来源:互联网 发布:java项目发布到服务器 编辑:程序博客网 时间:2024/05/22 11:16

题目大意:给定长度为n的序列,从首位开始输出递增序列,接着从剩余序列的首位开始输出递增序列,循环直到n个数输出结束。 (1 ≤ n ≤ 2·105)

题目思路:直接模拟n^2的复杂度,不行。这时借用到了二分检索。

补充:upper_bound(首位置,末位置,待查数x,cmp),假如cmp=greater<int>(),则表示在递减序列中,第一个小于x的位置。

代码:

#include<iostream>#include<cstring>#include<cstring>#include<vector>#include<cstdio>#include<algorithm>using namespace std;typedef vector<int> v;typedef vector<vector<int> > vv;int main(){int n,t;while(~scanf("%d",&n)){vv ans(n);v temp(n,-1);for(int i=0;i<n;i++){scanf("%d",&t);int k=int(upper_bound(temp.begin(),temp.end(),t,greater<int>())-temp.begin());ans[k].push_back(t);temp[k]=t;}for(int i=0;temp[i]!=-1&&i<n;i++){for(int j=0;j<ans[i].size()-1;j++){printf("%d ",ans[i][j]);}printf("%d\n",ans[i][ans[i].size()-1]);}}return 0;}



原创粉丝点击