为什么这样写一定要加特判
查看原帖
为什么这样写一定要加特判
594318
chenzhiyv楼主2024/7/8 15:25

这份代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=5e5+100;
int n,m,sum[MAXN*8],lazy[MAXN*8],a[MAXN*8],num;
struct node{
	int l,r,len;
}t[MAXN*16];
bool cmp(node a,node b)
{
	return a.len<b.len;
}
void pushdown(int rt)
{
	if(lazy[rt])
	{
		lazy[rt<<1]+=lazy[rt];
		lazy[rt<<1|1]+=lazy[rt];
		sum[rt<<1]+=lazy[rt];
		sum[rt<<1|1]+=lazy[rt];
		lazy[rt]=0;
		return;
	}
}
void update(int l,int r,int rt,int nowl,int nowr,int c)
{
	if(nowl>r||l>nowr) 
		return;
	if(nowl<=l && nowr>=r)
	{
		sum[rt]+=c;
		lazy[rt]+=c;
		return ;
	}
	int mid=(l+r)>>1;
	pushdown(rt);
	if(nowl<=mid) 
		update(l,mid,rt<<1,nowl,nowr,c);
	if(nowr>mid) 
		update(mid+1,r,rt<<1|1,nowl,nowr,c);
	sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
signed main()
{
//	freopen("P1712_17.in","w",stdin);	
	int x,y;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld",&x,&y);
		a[i*2]=x;
		a[i*2+1]=y;
		t[i].l=x;
		t[i].r=y;
		t[i].len=y-x;
	}
	sort(a+1,a+n*2+2);
	num=unique(a+1,a+n*2+1)-a-1;
	sort(t+1,t+n+1,cmp);
	int minn=1e9,maxx=0;
	for(int i=1;i<=n;i++)
	{
		t[i].l=lower_bound(a+1,a+1+num,t[i].l)-a;
		t[i].r=lower_bound(a+1,a+1+num,t[i].r)-a;
		minn=min(minn,t[i].l);
		maxx=max(maxx,t[i].r);
	}
	int head=0,tail=0;
	int ans=2100000000;
	while(tail<n)
	{
		while(sum[1]<m && tail<=n)
		{
			tail++;
			update(minn,maxx,1,t[tail].l,t[tail].r,1);
		}
		if(sum[1]<m) 
			break;
		while(sum[1]>=m && tail>=head)
		{
			head++;
			update(minn,maxx,1,t[head].l,t[head].r,-1);
		}
		ans=min(ans,t[tail].len-t[head].len);
	}
	if(ans==2100000000) 
		ans=-1;
	printf("%lld",ans);
	return 0;
}

和这份代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=5e5+100;
int n,m,sum[MAXN*8],lazy[MAXN*8],a[MAXN*8],num;
struct node{
	int l,r,len;
}t[MAXN*16];
bool cmp(node a,node b)
{
	return a.len<b.len;
}
void pushdown(int rt)
{
	if(lazy[rt])
	{
		lazy[rt<<1]+=lazy[rt];
		lazy[rt<<1|1]+=lazy[rt];
		sum[rt<<1]+=lazy[rt];
		sum[rt<<1|1]+=lazy[rt];
		lazy[rt]=0;
		return;
	}
}
void update(int l,int r,int rt,int nowl,int nowr,int c)
{
	//
	if(nowl<=l && nowr>=r)
	{
		sum[rt]+=c;
		lazy[rt]+=c;
		return ;
	}
	int mid=(l+r)>>1;
	pushdown(rt);
	if(nowl<=mid) 
		update(l,mid,rt<<1,nowl,nowr,c);
	if(nowr>mid) 
		update(mid+1,r,rt<<1|1,nowl,nowr,c);
	sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
signed main()
{
//	freopen("P1712_17.in","w",stdin);	
	int x,y;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld",&x,&y);
		a[i*2]=x;
		a[i*2+1]=y;
		t[i].l=x;
		t[i].r=y;
		t[i].len=y-x;
	}
	sort(a+1,a+n*2+2);
	num=unique(a+1,a+n*2+1)-a-1;
	sort(t+1,t+n+1,cmp);
	int minn=1e9,maxx=0;
	for(int i=1;i<=n;i++)
	{
		t[i].l=lower_bound(a+1,a+1+num,t[i].l)-a;
		t[i].r=lower_bound(a+1,a+1+num,t[i].r)-a;
		minn=min(minn,t[i].l);
		maxx=max(maxx,t[i].r);
	}
	int head=0,tail=0;
	int ans=2100000000;
	while(tail<n)
	{
		while(sum[1]<m && tail<=n)
		{
			tail++;
			update(minn,maxx,1,t[tail].l,t[tail].r,1);
		}
		if(sum[1]<m) 
			break;
		while(sum[1]>=m && tail>=head)
		{
			head++;
			update(minn,maxx,1,t[head].l,t[head].r,-1);
		}
		ans=min(ans,t[tail].len-t[head].len);
	}
	if(ans==2100000000) 
		ans=-1;
	printf("%lld",ans);
	return 0;
}

唯一的区别在于在第一份在查询(query)函数里加了 if(nowl>r||l>nowr) return; 这句话,但第一份AC,第二份在第十七个点RE,见这个(95) 和这个(100)

这是什么原因,为什么在普通的模板里不用加这句话

2024/7/8 15:25
加载中...