P11335题解
科技:
set
思路:
考虑可以用一只手,先按按钮
发现二式成立时一式显然成立。将绝对值拆开,得:
那么原问题等价于将原序列拆成尽量少的子序列,使得每个子序列中的元素都二位偏序地上升。
设
当我们枚举到
否则,找到所有满足
考虑正确性:不难发现我们只关心子序列个数以及它们末尾项的
于是我们可以用一个 set 维护所有子序列的末尾项,以便插入、删除、查前驱这些操作,时间复杂度单
代码:
#include <bits/stdc++.h>
#define pii pair <int,int>
#define fi first
#define se second
#define mkp make_pair
using namespace std;
const int N = 5e5 + 5;
int n,m,a[N],t[N];
pii p[N];
set <int> s;
set <int> :: iterator it;
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++) scanf("%d",&t[i]);
for(int i = 1;i <= m;i++) scanf("%d",&a[i]);
for(int i = 1;i <= m;i++) p[i] = mkp(a[i] + t[i],t[i] - a[i]);
sort(p + 1,p + m + 1);
for(int i = 1;i <= m;i++)
{
if(!s.empty() && (*s.begin()) <= p[i].se)
{
it = s.upper_bound(p[i].se),it--;
s.erase(it);
}
s.insert(p[i].se);
}
printf("%d\n",(int)s.size());
return 0;
}