做题时间:2026.7.22 题目难度:2100 | 题目链接 | 洛谷链接

很简单但是没想到,遗憾看题解。

这题像一个查询 LIS 的题目。很容易将这题的删除转化成一个提取上升子序列。

令提取出来的子序列为 bb,然后我就得到一个推论:

x<y,bx<by\forall x < y,b_x < b_y

然后我发现会出现相邻两个数之差过大(即无法通过删除数使这两个数都到对应的位置)等类似的问题,于是想了一会没想到看题解去了。

题解告诉我还有一个推论:

x<y,xbx<yby\forall x<y,x-b_x<y-b_y

好了,那就是二维偏序了,树状数组秒了。

惜败惜败。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct BIT
{
	int c[N],n;
	void add(int x,int k){for(;x<=n;x+=x&-x)c[x]=max(c[x],k);}
	int get(int x){int ans=0;for(;x;x-=x&-x)ans=max(ans,c[x]);return ans;}
}tr;
struct node{int x,y;}p[N];
signed main()
{
	int n;cin>>n;tr.n=n+1;
	for(int i=1;i<=n;i++)cin>>p[i].x,p[i].y=i-p[i].x;
	sort(p+1,p+n+1,[](node n1,node n2){return n1.x!=n2.x?n1.x<n2.x:n1.y>n2.y;});
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(p[i].y<0)continue;
		int x=tr.get(p[i].y+1)+1;
		ans=max(ans,x);
		tr.add(p[i].y+1,x);
	}
	cout<<ans;
	return 0;
}