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);
}


原文地址:https://www.cnblogs.com/suika/p/10092972.html