社区讨论

已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);
}
然后我把那个cmpcmp改成下面这样:
CPP
bool cmp(node u,node v){
	if(u.r==v.r)return u.l<v.l;
	return u.r<v.r;
}
就AC了,请问这是为什么?

回复

1 条回复,欢迎继续交流。

正在加载回复...