HDU 3308 LCIS(线段树)
模板题吧,忘了好多,终于A了...
#include <cstring> #include <cstdio> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; #define maxn 1000000 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 struct node { int lis,ris,smax,lnum,rnum; } p[4*maxn]; void pushup(int rt,int l,int r) { int m; m = (l + r) >>1; p[rt].smax = max(p[rt<<1].smax,p[rt<<1|1].smax); if(p[rt<<1].rnum < p[rt<<1|1].lnum) { p[rt].smax = max(p[rt].smax,p[rt<<1].ris+p[rt<<1|1].lis); if(p[rt<<1].lis == p[rt<<1].ris&&p[rt<<1].lis == m-l+1)//少写了个判断... p[rt].lis = p[rt<<1].lis + p[rt<<1|1].lis; else p[rt].lis = p[rt<<1].lis; if(p[rt<<1|1].lis == p[rt<<1|1].ris&&p[rt<<1|1].lis == r-m) p[rt].ris = p[rt<<1].ris + p[rt<<1|1].ris; else p[rt].ris = p[rt<<1|1].ris; } else { p[rt].lis = p[rt<<1].lis; p[rt].ris = p[rt<<1|1].ris; } p[rt].lnum = p[rt<<1].lnum; p[rt].rnum = p[rt<<1|1].rnum; } void build(int l,int r,int rt) { int m; if(l == r) { scanf("%d",&p[rt].lnum); p[rt].rnum = p[rt].lnum; p[rt].smax = 1; p[rt].ris = 1; p[rt].lis = 1; return ; } m = (l + r) >> 1; build(lson); build(rson); pushup(rt,l,r); } void update(int x,int sc,int l,int r,int rt) { int m; if(l == x&&r == x) { p[rt].lnum = sc; p[rt].rnum = sc; p[rt].smax = 1; p[rt].lis = 1; p[rt].ris = 1; return ; } m = (l + r)>>1; if(x <= m) update(x,sc,lson); else update(x,sc,rson); pushup(rt,l,r); } int query(int L,int R,int l,int r,int rt) { int m,ans,s1,s2; if(l >= L&&r <= R) { return p[rt].smax; } m = (l + r)>>1; if(L > m) return query(L,R,rson); if(R <= m) return query(L,R,lson); ans = max(query(L,R,lson),query(L,R,rson)); if(p[rt<<1].rnum < p[rt<<1|1].lnum) { s1 = min(m-L+1,p[rt<<1].ris); s2 = min(R-m,p[rt<<1|1].lis); ans = max(s1+s2,ans); } return ans; } int main() { int t,i,n,m,a,b; scanf("%d",&t); char str[10]; while(t--) { scanf("%d%d",&n,&m); build(0,n-1,1); for(i = 0; i < m; i ++) { scanf("%s%d%d",str,&a,&b); if(str[0] == 'Q') { printf("%d\n",query(a,b,0,n-1,1)); } else { update(a,b,0,n-1,1); } } } return 0; }