社区讨论

线段树 95分 WA on #19 求调

P11187配对序列参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m27hdtrw
此快照首次捕获于
2024/10/13 19:07
去年
此快照最后确认于
2024/10/13 19:07
去年
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

const int maxn=2e6+5;
#define ls id<<1
#define rs id<<1|1
int n,lt[maxn],rt[maxn],f,ans;
int a[maxn],tr[maxn],lz[maxn],u[maxn];
void pushup(int id){
	tr[id]=max(tr[ls],tr[rs]);
}
void addtag(int id,int x){
	tr[id]=x;
	lz[id]=x;
}
void pushdown(int id){
	if(lz[id]) addtag(ls,lz[id]);
	if(lz[id]) addtag(rs,lz[id]);
	lz[id]=0;
}
void build(int l,int r,int id){
	lt[id]=l,rt[id]=r;
	if(l==r) return ;
	int mid=l+r>>1;
	build(l,mid,ls);
	build(mid+1,r,rs);
}
void add(int id,int l,int r,int x){
	if(l<=lt[id] && rt[id]<=r){
		addtag(id,x);
		return ;
	}
	int mid=lt[id]+rt[id]>>1;
	pushdown(id);
	if(l<=mid) add(ls,l,r,x);
	if(r>mid) add(rs,l,r,x);
	pushup(id);
}
int query(int id,int l,int r){
	if(l<=lt[id] && rt[id]<=r) return tr[id];
	int mid=lt[id]+rt[id]>>1;
	pushdown(id);
	int ret=0;
	if(l<=mid) ret=max(ret,query(ls,l,r));
	if(r>mid) ret=max(ret,query(rs,l,r));
	return ret;
}
int main(){
	cin >> n;
	for(int i=1;i<=n;i++) cin >> a[i];
	build(1,5e5,1);
	memset(u,-1,sizeof(u));
	for(int i=1;i<=n;i++){
		int x=a[i];
		f=u[x]+1;
		add(1,x,x,max(query(1,x,x),f));
		u[x]=max(query(1,1,x-1),query(1,x+1,5e5))+1;
		ans=max(ans,f);
	}
	cout << ans << "\n";
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...