| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
线段树表示无鸭梨!!!!#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int const M = 40043;
int a[M];
struct node {
int left,right ,val ;
}tree[M<<2];
void build(int l ,int r,int i){
tree[i].left = l;
tree[i].right = r;
tree[i].val = 0;
if(l== r) return ;
int mid = (l+r ) >>1 ;
build (l,mid,i<<1);
build (mid +1,r,(i<<1)+1);
}
void update(int l,int r,int i,int key){
if(tree[i].left == l&& tree[i].right ==r ){
tree [i].val = key;
return ;
}
int mid = (tree[i].left+tree[i].right) >>1;
if(r<=mid ) update(l,r,i<<1,key);
else if(l>mid) update(l,r,(i<<1)+1,key);
else update(l,mid,i<<1,key),update(mid+1,r,(i<<1)+1,key);
tree[i].val = max(tree[i<<1].val,tree[(i<<1)+1].val);
}
int query(int l ,int r,int i){
if(tree[i].left == l && tree[i].right==r) {
return tree[i].val;
}
int mid = (tree[i].left+tree[i].right) >>1;
if(r<=mid) return query(l,r,i<<1);
else if(l>mid) return query(l,r,(i<<1)+1);
else
return max(query(l,mid,i<<1),query(mid+1,r,(i<<1)+1));
}
int dp [M];
int main(){
int t ;
cin>>t ;
while(t--){
int n,p=-12;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),a[i]++,
p = max(p,a[i]);
build(1,p,1);
for(int i=1;i<=n;++i){
if(i>1){
update(a[i-1],a[i-1],1,dp[i-1]);
}
dp[i] = query(1,a[i]-1,1)+1;
}
int u =-9;
for(int i=1;i<=n;i++){
u = max(u,dp[i]);
}
printf("%d\n",u);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator