题解:P14078 [GESP202509 七级] 金币收集
Gilbert1206 · · 题解
题解:P14078 [GESP202509 七级] 金币收集
题目传送门
题外话
我用伪
思路
我们需要刚好在第
小提示:
- 当
x_i 相同时需要按照t_i 从小往大排序。不然x_i 相同时前面的p_i 会影响到后面的p_j 。 - 注意
t_i < x_i 的情况。 - 最长上升子序列需要用二分优化到可以实现
n \le 10^5 做法。
code
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct pp{
int a,b;
}a[230000];
int p[230000],f[230000];
int cmp(pp ap,pp bp){
if(ap.a==bp.a){
return ap.b<bp.b;
}
return ap.a<bp.a;
}//排序
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].a>>a[i].b;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
if(a[i].a>a[i].b){
p[i]=1e12;
}//注意时间小于坐标
else{
p[i]=a[i].b-a[i].a;
}
}
//最长上升子序列
f[1]=p[1];
int q=1;
if(p[1]==1e12){
f[1]=0;
q=0;
}
for(int i=2;i<=n;i++){
if(p[i]==1e12){
continue;
}
int l=1,r=q,ans=-1;
while(l<=r){
int mid=(l+r)/2;
if(f[mid]>p[i]){
r=mid-1;
ans=mid;
}
else{
l=mid+1;
}
}
if(ans==-1){
q++;
f[q]=p[i];
}
else{
f[ans]=p[i];
}
}
cout<<q;
return 0;
}