看了很久也没看出来哪里出错了,调了很久。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;
}