La 4976 Defense lines
阿新 • • 發佈:2018-02-22
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