after_contest 挂了一个点,求
查看原帖
after_contest 挂了一个点,求
704275
无名之雾楼主2024/7/2 15:14
// LUOGU_RID: 163694721
#pragma GCC target("avx")
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include <bits/stdc++.h>
using namespace std; 
const int N=2e5+5,V=1e9;
int n,a[N],f[N],g[N],ans,tmp;
struct Seg{
    int rt,a[N<<5],cnt,ls[N<<5],rs[N<<5];
    void init(){
        memset(a,0,sizeof a); 
		memset(ls,0,sizeof ls);
        memset(rs,0,sizeof rs); 
		rt=cnt=0;
    }
    void mdf(int &x,int l,int r,int k,int v){
        if(!x)x=++cnt; 
		a[x]=max(a[x],v); 
		if(l==r)return;
        int m=(l+r)>>1; 
        if(k<=m)mdf(ls[x],l,m,k,v); 
		else mdf(rs[x],m+1,r,k,v);
        a[x]=max(a[ls[x]],a[rs[x]]);
    }
    int qry(int x,int l,int r,int ql,int qr) {
        if (ql>qr)return 0;
        if (ql<=l&&r<=qr)return a[x];
        int m=(l+r)>>1,ans=0;
        if(ql<=m)ans=qry(ls[x],l,m,ql,qr);
        if(qr>m)ans=max(ans,qry(rs[x],m+1,r,ql,qr));
        return ans;
    }
}tr;
struct CMT{
    int rt[N],a[N<<5],cnt,ls[N<<5],rs[N<<5];
    void mdf(int &x,int y,int l,int r,int k,int v) {
        x=++cnt;
		a[x]=max(a[x], v); 
		if(l==r)return;
        int m=l+r>>1;
        if(k<=m)rs[x]=rs[y],mdf(ls[x],ls[y],l,m,k,v);
        else ls[x]=ls[y],mdf(rs[x],rs[y],m+1,r,k,v);
    }
    int qry(int x,int l,int r,int ql,int qr){
        if(ql>qr)return -V; 
		if(ql<=l&&r<=qr)return a[x];
        int m=l+r>>1,ans=0;
        if(ql<=m)ans=qry(ls[x],l,m,ql,qr);
        if(qr>m)ans=max(ans,qry(rs[x],m+1,r,ql,qr));
        return ans;
    }
}tt;
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
signed main() {
    n=read();
	for(int i=1;i<=n;i++)a[i]=read();
    for (int i=1;i<=n;i++)
        f[i]=tr.qry(tr.rt,1,V,1,a[i]-1)+1,
        tr.mdf(tr.rt,1,V,a[i],f[i]),ans=max(ans,f[i]);
    tr.init();
    for(int i=n;i>=1;i--){
        g[i]=tr.qry(tr.rt,1,V,a[i]+1,V)+1,
        tr.mdf(tr.rt,1,V,a[i],g[i]);
        if(i!=1)tmp=max(tmp,g[i]);
    }
    for (int i=n;i>=1;i--)tt.mdf(tt.rt[i],tt.rt[i+1],1,V,a[i],g[i]);
    for (int i=1;i<n;i++){
        ans=max(ans,f[i]+1+tt.qry(tt.rt[i+2],1,V,a[i]+2,V));
    }
    cout<<max(ans,tmp+1);
    return 0;
}
2024/7/2 15:14
加载中...