POJ 1631 Bridging signals
2016-03-23 19:16
316 查看
事实上就是求最长上升子序列的长度。用nlogn的写法。我用了线段树。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=40000+10; int dp[maxn]; int a[maxn]; int T,n,ans,f; struct SegTree { int MAX; }s[4*maxn]; void pushUp(int rt) { s[rt].MAX=max(s[2*rt].MAX,s[2*rt+1].MAX); } void build(int l,int r,int rt) { s[rt].MAX=0; if(l==r) return; int m=(l+r)/2; build(l,m,2*rt); build(m+1,r,2*rt+1); } void update(int pos,int val,int l,int r,int rt) { if(l==r) { s[rt].MAX=val; return; } int m=(l+r)/2; if(pos<=m) update(pos,val,l,m,2*rt); else update(pos,val,m+1,r,2*rt+1); pushUp(rt); } void quary(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) { f=max(f,s[rt].MAX); return; } int m=(l+r)/2; if(L<=m) quary(L,R,l,m,2*rt); if(R>m) quary(L,R,m+1,r,2*rt+1); } int main() { // freopen("test.in","r",stdin); // freopen("test.out","w",stdout); scanf("%d",&T); while(T--) { scanf("%d",&n); ans=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,n,1); for(int i=1;i<=n;i++) { f=0; if(a[i]==1) f=0; else quary(1,a[i]-1,1,n,1); dp[i]=f+1; update(a[i],dp[i],1,n,1); ans=max(ans,dp[i]); } printf("%d\n",ans); } return 0; }
相关文章推荐
- SpringMVC的注解和依赖注入(IOC)
- zabbix安装及简单配置
- Android仿微信带清除功能的输入框ClearEditText的实现
- zabbix安装及简单配置
- 获取主框架、子框架、文档、视图的指针
- 编译android源码apk是否生成odex方法
- 线程池的配置和监控
- maven 使用
- 相邻元素差的绝对值都是1,在这样的数组中找目标元素
- 不在意别人的看法,让自己强大
- MFC 鼠标点击到窗口上可以移动
- eclipse locgat自动消失
- 无法更新android sdk的问题解决
- java十八节-File找文件目录
- ubuntu下安装navicat oracle
- 【bzoj1010】【HNOI2008】【玩具装箱toy】【斜率优化】
- UVALive 7483 Air Conditioned Minions
- 约瑟夫初级源码
- longest continuous subsequence of 0s
- Unix环境高级编程---信号