社区讨论
85pts求条awa
P1712[NOI2016] 区间参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhj28iyq
- 此快照首次捕获于
- 2025/11/03 19:32 4 个月前
- 此快照最后确认于
- 2025/11/03 19:32 4 个月前
wa了后三个点
CPP#include<bits/stdc++.h>
using namespace std;
const long long N=11451419;
long long n,m,lsh[N],ans=1e18+10;
struct node{
long long l,r;
}a[N];
struct Node{
long long l,r,mx,tag;
}t[1145141];
bool cmp(node x,node y)
{
return x.r-x.l<y.r-y.l;
}
void pushdown(long long p)
{
if(t[p].tag)
{
t[p*2].mx+=t[p].tag;
t[p*2+1].mx+=t[p].tag;
t[p*2].tag+=t[p].tag;
t[p*2+1].tag+=t[p].tag;
t[p].tag=0;
}
}
void build(long long p,long long l,long long r)
{
t[p].l=l;
t[p].r=r;
if(l==r)
{
t[p].mx=0;
return;
}
long long mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
void modify(long long p,long long l,long long r,long long v)
{
//cout<<p<<" "<<l<<" "<<r<<"\n";
if(l<=t[p].l&&r>=t[p].r)
{
t[p].mx+=v;
t[p].tag+=v;
return;
}
pushdown(p);
long long mid=(t[p].l+t[p].r)/2;
if(l<=mid)
{
modify(p*2,l,r,v);
}
if(r>mid)
{
modify(p*2+1,l,r,v);
}
t[p].mx=max(t[p*2].mx,t[p*2+1].mx);
return;
}
long long query(long long l,long long r,long long p)
{
//if(l==0&&r==0)return 0;
if(l<=t[p].l&&r>=t[p].r)
{
return t[p].mx;
}
pushdown(p);
long long mid=(t[p].l+t[p].r)/2,cnt=0;
if(l<=mid)
{
cnt=max(cnt,query(l,r,p*2));
}
if(r>=mid+1)
{
cnt=max(cnt,query(l,r,p*2+1));
}
return cnt;
}
int main()
{
//freopen("P1712_1.in","r",stdin);
cin>>n>>m;
for(long long i=1;i<=n;i++)
{
cin>>a[i].l>>a[i].r;
lsh[(i-1)*2+1]=a[i].l,lsh[(i-1)*2+2]=a[i].r;
}
sort(a+1,a+1+n,cmp);
sort(lsh+1,lsh+n*2+1);
long long o=unique(lsh+1,lsh+1+n*2)-lsh-1;
for(long long i=1;i<=n;i++)
{
a[i].l=lower_bound(lsh+1,lsh+o+1,a[i].l)-lsh;
a[i].r=lower_bound(lsh+1,lsh+o+1,a[i].r)-lsh;
}
build(1,1,o);
long long i=0,j=0;
while(i<=o)
{
while(j<n&&query(1,o,1)<m)
{
modify(1,a[j+1].l,a[j+1].r,1);
j++;
}
if(query(1,o,1)<m)break;
while(i<=j&&query(1,o,1)>=m)
{
modify(1,a[i+1].l,a[i+1].r,-1);
i++;
}
modify(1,a[i].l,a[i].r,1);
if(query(0,o,1)==m)
{
ans=min(ans,lsh[a[j].r]-lsh[a[j].l]-(lsh[a[i].r]-lsh[a[i].l]));
}
modify(1,a[i].l,a[i].r,-1);
}
if(ans==1e18+10)
{
cout<<-1;
}
else
{
cout<<ans;
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...