这份代码
#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)
这是什么原因,为什么在普通的模板里不用加这句话