50pts求调
查看原帖
50pts求调
252401
xxx听取AC声一片楼主2024/1/25 21:52

rt,剩下5个点超时

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int a,c,b,num;
}q[100005],q0[100005];
int dp[100005],n,m,maxx;
inline bool cmpa(node x,node y)
{
	return x.a<y.a; 
}
inline bool cmpb(node x,node y)
{
	return x.b<y.b;
}
int t[100005];
inline int lowbit(int x){return x&-x;}
inline void add(int x,int y)
{
	for(int i=x;i<=maxx;i+=lowbit(x))
		if(y!=0) t[i]=max(t[i],y);
		else t[i]=0;
}
inline int getmax(int x)
{
	int maxx=-1;
	for(int i=x;i>=1;i-=lowbit(i))
		maxx=max(maxx,t[i]);
	return maxx;
}
inline void cdq(int l,int r)
{
	if(l>=r) return;
	int mid=l+r>>1;
	cdq(l,mid);
	sort(q+l,q+mid+1,cmpa);
	sort(q+mid+1,q+r+1,cmpb);
	for(int i=l,j=mid+1;j<=r;j++)
	{
		while(i<=mid && q[i].a<=q[j].b)
			add(q[i].c,dp[q[i].num]),i++;
		dp[q[j].num]=max(dp[q[j].num],getmax(q[j].a)+1); 
	}
	for(int i=l;i<=mid;i++)
		add(q[i].c,0);
	for(int i=l;i<=r;i++)
		q[i]=q0[i];
	cdq(mid+1,r);
}
signed main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&q[i].a);
		q[i].b=q[i].c=q[i].a;
		q[i].num=i;
		maxx=max(maxx,q[i].a);
	}
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		q[x].b=min(q[x].b,y);
		q[x].c=max(q[x].c,y);
		maxx=max(maxx,y);
	}
	for(int i=1;i<=n;i++)
		dp[i]=1,q0[i]=q[i];
	cdq(1,n);
	int ans=-1;
	for(int i=1;i<=n;i++)
		ans=max(ans,dp[i]);
	printf("%d",ans);
	return 0;
} 
2024/1/25 21:52
加载中...