萌新求助cdq分治,只过了最后一个点
查看原帖
萌新求助cdq分治,只过了最后一个点
105865
Jur_Cai楼主2022/1/26 08:50

RT,有没有 dalao 帮忙调一下或者给一组 hack /kel

#include<bits/stdc++.h>
#define lowbit(x) x&-x
#define N 100000
using namespace std;
int tree[100005],n,m;
inline void add(int x,int k) {
	for(; x<=N; x+=lowbit(x)) tree[x]=max(tree[x],k);
}
inline int query(int x) {
	int res=0;
	for(; x; x-=lowbit(x)) res=max(res,tree[x]);
	return res;
}
inline void clr(int x) {
	for(; x<=N; x+=lowbit(x)) tree[x]=0;
}
struct node {
	int x,mx,mn,id;
} a[100005];
inline bool cmp1(node u,node v) {
	return u.mx<v.mx;
}
inline bool cmp2(node u,node v) {
	return u.x<v.x;
}
inline bool cmp3(node u,node v) {
	return u.id<v.id;
}
int f[100005],ans;
void cdq(int l,int r) {
	if(l==r) {
		f[l]=max(f[l],1);
		ans=max(ans,f[l]);
		return ;
	}
	int mid=(l+r)>>1;
	cdq(l,mid);
	sort(a+l,a+mid+1,cmp1);
	sort(a+mid+1,a+r+1,cmp2);
	int j=l;
	for(int i=mid+1; i<=r; i++) {
		while(j<=mid&&a[j].mx<=a[i].x)
			add(a[j].x,f[j]),j++;
		f[i]=max(f[i],query(a[i].mn)+1);
		ans=max(ans,f[i]);
	}
	for(int i=l; i<=mid; i++) clr(a[i].x);
	sort(a+mid+1,a+r+1,cmp3);
	cdq(mid+1,r);
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) scanf("%d",&a[i].x),a[i].mx=a[i].mn=a[i].x,a[i].id=i;
	for(int i=1,x,y; i<=m; i++) {
		scanf("%d%d",&x,&y);
		a[x].mx=max(a[x].mx,y);
		a[x].mn=min(a[x].mn,y);
	}
	cdq(1,n);
	cout<<ans;
	return 0;
}
2022/1/26 08:50
加载中...