两者只有cmp函数不同。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int n,a[MAXN],b[MAXN],f[MAXN],tot1,tot2;
struct data{
int l,r,val;
}c[MAXN],d[MAXN];
vector<int>k[MAXN];
bool cmp1(data x,data y){
//return x.r<y.r||(x.r==x.r&&x.l<y.l);//这是TLE的写法
if(x.r!=y.r) return x.r<y.r;
return x.l<y.l;//这是AC的写法
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
for(int i=1;i<=n;i++){
if(a[i]+b[i]>=n)
continue;
c[++tot1].l=a[i]+1,c[tot1].r=n-b[i];
}
//cout<<tot1<<endl;
sort(c+1,c+tot1+1,cmp1);
for(int i=1;i<=tot1;i++){
if(c[i].l==c[i-1].l&&c[i].r==c[i-1].r){
if(d[tot2].val<d[tot2].r-d[tot2].l+1)d[tot2].val++;
}
else{
d[++tot2].l=c[i].l,d[tot2].r=c[i].r,d[tot2].val=1;
k[d[tot2].r].push_back(tot2);
}
}
//cout<<tot2<<endl;
//for(int i=1;i<=tot2;i++)
//cout<<d[i].l<<' '<<d[i].r<<' '<<d[i].val<<endl;
for(int i=1;i<=n;i++){
f[i]=f[i-1];
if(k[i].size())
for(int j=0;j<k[i].size();j++)
f[i]=max(f[i],f[d[k[i][j]].l-1]+d[k[i][j]].val);
}
cout<<n-f[n];
return 0;
}
请问是哪里有问题?