zoukankan      html  css  js  c++  java
  • BZOJ5442: [Ceoi2018]Global warming

    BZOJ5442: [Ceoi2018]Global warming

    https://lydsy.com/JudgeOnline/problem.php?id=5442

    分析:

    • 等价于后缀加(前缀减也可以转化成后缀加)。
    • (L_i)表示(i)这个位置被加了(x)与前面的(lis)(R_i)表示后缀加(x)后的(lis)

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
    #define N 400050
    int V[N],n,X,a[N],c[N],L[N],R[N],ln,f[N];
    void fix(int x,int v) {
    	for(;x<=ln;x+=x&(-x)) c[x]=max(c[x],v);
    }
    int inq(int x) {
    	int re=0;
    	for(;x;x-=x&(-x)) re=max(re,c[x]); return re;
    }
    void fix2(int x,int v) {
    	for(;x;x-=x&(-x)) c[x]=max(c[x],v);
    }
    int inq2(int x) {
    	int re=0;
    	for(;x<=ln;x+=x&(-x)) re=max(re,c[x]); return re;
    }
    int main() {
    	scanf("%d%d",&n,&X);
    	int i;
    	for(i=1;i<=n;i++) scanf("%d",&a[i]);
    	for(i=1;i<=n;i++) a[i+n]=a[i]+X;
    	ln=n<<1;
    	for(i=1;i<=ln;i++) V[i]=a[i];
    	sort(V+1,V+ln+1);
    	int cnt=unique(V+1,V+ln+1)-V-1;
    	for(i=1;i<=ln;i++) a[i]=lower_bound(V+1,V+cnt+1,a[i])-V;
    	for(i=1;i<=n;i++) {
    		L[i]=inq(a[i+n]-1)+1;
    		f[i]=inq(a[i]-1)+1;
    		fix(a[i],f[i]);
    	}
    	memset(c,0,sizeof(c));
    	for(i=n;i;i--) {
    		f[i]=inq2(a[i]+1)+1;
    		fix2(a[i],f[i]);
    	}
    	int ans=0;
    	for(i=1;i<=n;i++) ans=max(ans,L[i]+f[i]);
    	printf("%d
    ",ans-1);
    }
    
    
    
  • 相关阅读:
    XML 读取器和编写器从URL读取XML
    8月8号 星期五
    080808 晴
    080805
    雨景
    用photoshop批量修改照片(待修改)
    8月7日 晴
    五不
    Android 画渐变的背景
    iOS开发的一些基础知识
  • 原文地址:https://www.cnblogs.com/suika/p/10092972.html
Copyright © 2011-2022 走看看