社区讨论
已AC,但有的地方没太明白,请大佬指点一下
P2519[HAOI2011] problem a参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjabfwi
- 此快照首次捕获于
- 2025/11/03 23:18 4 个月前
- 此快照最后确认于
- 2025/11/03 23:18 4 个月前
这是一份20pts代码:
CPP#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,wc=0,ans=0,num,L,f[N],b[N];
struct node{int l,r,v;}s[N],a[N];
bool cmp(node u,node v){return u.r<v.r;}
void add(int x,int y){
while(x<=L)b[x]=max(b[x],y),x+=x&-x;
}
int query(int x){
int ret=0;
while(x)ret=max(ret,b[x]),x-=x&-x;
return ret;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a,b;scanf("%d%d",&a,&b);
if(b+1>n-a)continue;
s[++num].l=b+1,s[num].r=n-a;
}sort(s+1,s+num+1,cmp);
//for(int i=1;i<=num;i++)cout<<s[i].l<<' '<<s[i].r<<endl;
for(int i=1;i<=num;i++){
if(s[i].l==s[i-1].l&&s[i].r==s[i-1].r){
if(a[L].v<s[i].r-s[i].l+1)a[L].v++;
}else a[++L].l=s[i].l,a[L].r=s[i].r,a[L].v=1;
}sort(a+1,a+L+1,cmp);
//for(int i=1;i<=L;i++)cout<<a[i].l<<' '<<a[i].r<<endl;
for(int i=1;i<=L;i++){
//cout<<i<<":\n";
int ll=1,rr=i;
while(ll<rr){
int mid=(ll+rr)>>1;
if(a[mid].r<a[i].l)ll=mid+1;
else rr=mid;
}ll--;//cout<<ll<<endl;
f[i]=query(ll)+a[i].v;
ans=max(ans,f[i]);add(i,f[i]);
}printf("%d",n-ans);
}
然后我把那个改成下面这样:
CPPbool cmp(node u,node v){
if(u.r==v.r)return u.l<v.l;
return u.r<v.r;
}
就AC了,请问这是为什么?
回复
共 1 条回复,欢迎继续交流。
正在加载回复...