我就很好奇,为什么会有二分这种操作。。非常好奇,
鬼能看出来他最后那个数字是递减的啊= =;然后迷之超时。
然后看了一下lower_bound()的用法,这个序列是递减的,而一般lower_bound()查找的都是从小到大排序好的序列,所以只需要在最后面加一个greater<int>()就可以了。像这样:
lower_bound(a,a+n,greater<int>())-a; 头文件#include<functional>
#include<bits/stdc++.h>
using namespace std;
const int N=200005;
vector<int>mp[N];
int a[N];
template<class T>
inline bool scan(T &ret)
{
char c;
int sgn;
if(c=getchar(),c==EOF) return 0;
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9')ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
int main()
{
int n;
scan(n);
int o=0;
int i,j;
for(i=0;i<=n-1;i++)
{
int x;
scan(x);
if(i==0)
{
a[o]=x;
mp[o].push_back(x);
o++;
}
else
{
int index=lower_bound(a,a+o,x,greater<int>())-a;
//printf("index = %d,,o = %d\n",index,o);
if(index==o)
{
a[o]=x;
mp[o].push_back(x);
o++;
}
else
{
a[index]=x;
mp[index].push_back(x);
}
}
}
int len;
for(i=0; i<=o-1; i++)
{
len=(int)mp[i].size()-1;
for(j=0; j<=len; j++)
{
printf("%d ",mp[i][j]);
}
printf("\n");
}
return 0;
}