- qinkaiwen 的博客
题解:CF1575L Longest Array Deconstruction
- @ 2026-7-22 15:50:19
做题时间:2026.7.22 题目难度:2100 | 题目链接 | 洛谷链接
很简单但是没想到,遗憾看题解。
这题像一个查询 LIS 的题目。很容易将这题的删除转化成一个提取上升子序列。
令提取出来的子序列为 ,然后我就得到一个推论:
然后我发现会出现相邻两个数之差过大(即无法通过删除数使这两个数都到对应的位置)等类似的问题,于是想了一会没想到看题解去了。
题解告诉我还有一个推论:
好了,那就是二维偏序了,树状数组秒了。
惜败惜败。
#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;
}