1. 程式人生 > >La 4976 Defense lines

La 4976 Defense lines

algo long img cpp style -i 一個 ring truct

技術分享圖片

藍書紫書上都有的一道題。。。這裏就懶得說題解了。

但是我竟然WA了6次!為什麽呢???

一開始沒看見連續子序列。。。。。

後來插入的時候忘判斷了是不是比前驅大。。。。

所以我們只需要維護一個權值遞增(這個set已經幫你維護好了)並且長度遞增(這個需要插入的時候判斷)的set就好了、。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<set>
#include<algorithm>
#define ll long long
#define maxn 200005
using namespace std;
struct node{
	int num,len;
	bool operator <(const node &U)const{
		return num==U.num?len<U.len:num<U.num;
	}
};
set<node> s;
set<node> ::iterator it;
int f[maxn],n,m,ky,ans;
int qz[maxn],hz[maxn];
int num[maxn],a[maxn],T;

inline void init(){
	s.clear(),ans=0;
}

inline void ins(int x,int y){
	node now=(node){x,y};
	
	it=s.lower_bound((node){x,0});
	while(it->len<=y){
		s.erase(it);
		it=s.lower_bound((node){x,0});
	}
	s.insert(now);
}

inline void solve(){
	s.insert((node){0,0});
	s.insert((node){1<<30,1<<30});
	
	qz[1]=1;
	for(int i=2;i<=n;i++) qz[i]=(a[i]>a[i-1]?qz[i-1]:0)+1;
	hz[n]=1;
	for(int i=n-1;i;i--) hz[i]=(a[i]<a[i+1]?hz[i+1]:0)+1;
	
	for(int i=1;i<=n;i++){
		it=s.lower_bound((node){a[i],0});
		node now=*(--it);	
		ans=max(ans,hz[i]+now.len);
		
		if(qz[i]>it->len) ins(a[i],qz[i]);
	}
}

int main(){
	scanf("%d",&T);
	while(T--){
		init();
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d",a+i),num[i]=a[i];
		sort(num+1,num+n+1);
		ky=unique(num+1,num+n+1)-num-1;
		for(int i=1;i<=n;i++) a[i]=lower_bound(num+1,num+ky+1,a[i])-num;
		
		solve();
		printf("%d\n",ans);
	}
	
	return 0;
} 

  

La 4976 Defense lines