萌新调题自闭了,救救孩子吧,只过了最后一个点
查看原帖
萌新调题自闭了,救救孩子吧,只过了最后一个点
180924
FLAT_LCH楼主2022/1/31 14:56
#include <iostream> 
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;

struct node
{
	int minn,maxx,f,a;
}p[1000000];

int n,m,ans=1;

int aaa[1000000]={};
inline int lowbit(int a){return a&(-a);}
inline int getmax(int k){int ans=0;while(k>0){ans=max(ans,aaa[k]);k-=lowbit(k);}return ans;}
inline void add(int k,int s){while(k<=524288){aaa[k]=max(s,aaa[k]);k+=lowbit(k);}}
inline void clr(int k){while(k<=524288){aaa[k]=0;k+=lowbit(k);}}

inline bool cmp1(node x,node y){return x.maxx<y.maxx;}
inline bool cmp2(node x,node y){return x.a<y.a;}

inline int rd()
{
	int s=0;char x='x';
	while(x<'0'||x>'9')x=getchar();
	while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
	return s;
}

inline void readd()
{
	int aa,bb;
	n=rd();m=rd();
	for(int i=1;i<=n;i++)
	{
		p[i].a=rd();
		p[i].minn=p[i].a;
		p[i].maxx=p[i].a;
	}
	for(int i=1;i<=m;i++)
	{
		aa=rd();bb=rd();
		p[aa].maxx=max(p[aa].maxx,bb);
		p[aa].minn=min(p[aa].minn,bb);
	}
}

inline void working(int l,int r,int mid)
{
	//cout<<l<<' '<<r<<endl;
	//cout<<getmax(100000)<<endl;
	int j=l;
	for(int i=mid+1;i<=r;i++)
	{
		while(j<=mid&&p[j].maxx<=p[i].a)
		{
			add(p[j].a,p[j].f);
			j++;
		}
		p[i].f=max(p[i].f,getmax(p[i].minn)+1);
		//cout<<p[i].a<<' '<<p[i].f<<'#'<<endl;
		//ans=max(ans,p[i].f);
	}
	for(int i=l;i<j;i++)clr(p[i].a);
}

void cdq(int l,int r)
{
	//cout<<l<<' '<<r<<endl;
	if(l==r){p[l].f=max(p[l].f,1);return;}
	int mid=((l+r)/2);
	cdq(l,mid);
	sort(p+l,p+mid+1,cmp1);
	sort(p+mid+1,p+r+1,cmp2);
	working(l,r,mid);
	cdq(mid+1,r);
}

int main()
{
	readd();
	cdq(1,n);
	for(int i=1;i<=n;i++)ans=max(ans,p[i].f);
	printf("%d",ans);
	return 0;
}
2022/1/31 14:56
加载中...