您的位置:首页 > 其它

poj 1631 LIS nlogn

2016-07-07 20:10 459 查看
点击打开链接

#include <iostream>
#include <algorithm>
using namespace std;
const int M=41000;
const int inf=1<<30;
int n,a[M],dp[M]; // dp[i] 以i结尾的 LIS长度

//no two signals cross.
// 等价于 i<j a[i]<a[j] 才不会Cross
// finds the maximum number of signals which may be connected on the silicon surface without crossing each other
// 即求序列中的LIS
int g[M]; // g[i] LIS长度为i 的最小结尾 x

int fun(int x)
{
int f=1,l=n,mid,pos;
while(f<l)
{
mid=(f+l)/2;
if(g[mid]<x)
{
f=mid+1;
pos=f;

}
else
{
l=mid;
pos=l;

}
}
return pos;

}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
g[i]=inf; //
}
int ans=1;
cin>>a[1];
g[1]=a[1];

for(int i=2;i<=n;i++)
{
cin>>a[i];
int k=fun(a[i]); // 找到第一个大于a[i] g[k] : 所以以a[i]结尾的LIS长度为 k-1+1 (a[i]添加在以g[k-1]的LIS之后)
ans=max(ans,k);
g[k]=a[i]; //更新

}
cout<<ans<<endl;
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: