求助,10分,除了#10,WA
查看原帖
求助,10分,除了#10,WA
1098596
WhiteNight__楼主2025/1/21 16:39

看了很久也没看出来哪里出错了,调了很久。CDQ。

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int inf = 2e9+7;
const int N = 2e5+750 , V = 1e5+150;

int n , m , a[N] , ans(0);

int node[V+50];

int Lowbit (int x)
{
	return x & (-x);
}

void Clear_Bit (int pos)
{
	for(int i = pos ; i <= V-1 ; i += Lowbit (i))
	{
		node[pos] = 0;
	}
}

void Insert_Bit (int pos , int val)
{
	for(int i = pos ; i <= V-1 ; i += Lowbit (i))
	{
		node[i] = max (node[i] , val);
	}
}

int Max_Bit (int pos)
{
	int res(0);
	for(int i = pos ; i ; i -= Lowbit (i))
	{
		res = max (res , node[i]);
	}
	return res;
}

struct Pair_Point {
	int pos , val , max , min , res;
	
	Pair_Point (int pos = 0 , int v = 0 , int maxs = -inf , int mins = inf , int res = 0):
		pos(pos) , val(v) , max(maxs) , min(mins) , res(res) {}
};

typedef Pair_Point Point;

Point e[N];

bool Cmp_1 (Point x , Point y) // max
{
	if(x.max != y.max) return x.max < y.max;
	if(x.min != y.min) return x.min < y.min;
	return x.val < y.val;
}

bool Cmp_2 (Point x , Point y) // val
{
	if(x.val != y.val) return x.val < y.val;
	if(x.max != y.max) return x.max < y.max;
	return x.min < y.min;
}

bool Cmp_3 (Point x , Point y) // pos
{
	return x.pos < y.pos;
}

void Cdq (int l , int r)
{
	if(l == r) 
	{
		e[l].res = max (e[l].res , 1);
		return;
	}
	int mid = (l+r)/2;
	
	Cdq (l , mid);
	
	sort (e+l , e+mid+1 , Cmp_1);
	sort (e+mid+1 , e+r+1 , Cmp_2);
	
	int nl = l , nr = mid+1;
	
	while (nr <= r)
	{
		while (nl <= mid && e[nl].max <= e[nr].val)
		{
			Insert_Bit (e[nl].val , e[nl].res);
			++ nl;
		}
		e[nr].res = max (e[nr].res , Max_Bit (e[nr].min) + 1);
		++ nr;
	}
	
	for(int i = l ; i <= mid ; i ++) Clear_Bit (e[i].val);
	
	sort (e+l , e+r+1 , Cmp_3);
	
	Cdq (mid+1 , r);
}

signed main()
{
	memset (node , 0 , sizeof node);
	scanf("%d%d",&n,&m);
	for(int i = 1 ; i <= n ; i ++){
		scanf("%d",&a[i]);
		e[i].pos = i;
		e[i].val = e[i].max = e[i].min = a[i];
		e[i].res = 1;
	}
	for(int i = 1 ; i <= m ; i ++)
	{
		int x , y;
		scanf("%d%d",&x,&y);
		e[x].max = max (e[x].max , y);
		e[x].min = min (e[x].min , y);
	}
	
	sort (e+1 , e+1+n , Cmp_3);
	
	Cdq (1 , n);
	
	for(int i = 1 ; i <= n ; i ++) ans = max (ans , e[i].res);
	
	printf("%d\n",ans);
	
	return 0;
}
2025/1/21 16:39
加载中...