额...

首先,看到这道题,第一想法就是二分答案+线段树...

兴高采烈的认为我一定能AC,之后发现n是500000...

nlog^2=80%,亲测可过...

由于答案是求满足题意的最大长度-最小长度最小,那么我们可以考虑将区间按长度排序

之后,因为我们是需要最大最小,所以,我们必定选择在排完序的区间上取连续的一段是最优情况(起码不会比别的差)

因此,考虑双指针扫一下就可以了...

是不是很水?

由于懒得写离散化,一开始写的动态开点线段树,我*****什么鬼?mle?!256mb开不下!

loj+洛谷上95%,附上代码...

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
#define N 500005
#define lson l,m,tr[rt].ls
#define rson m+1,r,tr[rt].rs
#define PushUp(rt) tr[rt].maxx=max(tr[tr[rt].ls].maxx,tr[tr[rt].rs].maxx)
struct no
{
int ls,rs,maxx,add;
}tr[N*40];
int n,m,ans,cnt;
struct node
{
int l,r,len;
}a[N];
bool cmp(const node &a,const node &b)
{
return a.len<b.len;
}
void PushDown(int rt)
{
if(tr[rt].add)
{
if(!tr[rt].ls)tr[rt].ls=++cnt;
if(!tr[rt].rs)tr[rt].rs=++cnt;
tr[tr[rt].ls].maxx+=tr[rt].add;
tr[tr[rt].rs].maxx+=tr[rt].add;
tr[tr[rt].ls].add+=tr[rt].add;
tr[tr[rt].rs].add+=tr[rt].add;
tr[rt].add=0;
}
}
void Update(int L,int R,bool c,int l,int r,int &rt)
{
if(!rt)rt=++cnt;
if(L<=l&&r<=R)
{
tr[rt].maxx+=c?1:-1;
tr[rt].add+=c?1:-1;
return ;
}
PushDown(rt);
int m=(l+r)>>1;
if(m>=L)Update(L,R,c,lson);
if(m<R)Update(L,R,c,rson);
PushUp(rt);
}
int main()
{
ans=1<<30;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].len=a[i].r-a[i].l;
}
sort(a+1,a+n+1,cmp);
int l=1,r=0,rot=0;
while(r<n)
{
while(tr[rot].maxx<m&&r<n){r++;Update(a[r].l,a[r].r,1,0,1<<30,rot);}
if(tr[rot].maxx<m)break;
while(tr[rot].maxx>=m&&l<n){Update(a[l].l,a[l].r,0,0,1<<30,rot);l++;}
ans=min(a[r].len-a[l-1].len,ans);
}
printf("%d\n",ans==1<<30?-1:ans);
return 0;
}

  这显然就不能AC,那么我们可以考虑用一下离散化...

离散化后,线段树的空间复杂度从(nlog(1<<30))变成(nlog(n*2))之后,空间就降下来了...

附上AC代码...

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
#define N 500005
#define lson l,m,tr[rt].ls
#define rson m+1,r,tr[rt].rs
#define PushUp(rt) tr[rt].maxx=max(tr[tr[rt].ls].maxx,tr[tr[rt].rs].maxx)
struct no
{
int ls,rs,maxx,add;
}tr[N*10];
int p[N<<1];
int n,m,ans,cnt;
struct node
{
int l,r,len;
}a[N];
bool cmp(const node &a,const node &b)
{
return a.len<b.len;
}
void PushDown(int rt)
{
if(tr[rt].add)
{
if(!tr[rt].ls)tr[rt].ls=++cnt;
if(!tr[rt].rs)tr[rt].rs=++cnt;
tr[tr[rt].ls].maxx+=tr[rt].add;
tr[tr[rt].rs].maxx+=tr[rt].add;
tr[tr[rt].ls].add+=tr[rt].add;
tr[tr[rt].rs].add+=tr[rt].add;
tr[rt].add=0;
}
}
void Update(int L,int R,bool c,int l,int r,int &rt)
{
if(!rt)rt=++cnt;
if(L<=l&&r<=R)
{
tr[rt].maxx+=c?1:-1;
tr[rt].add+=c?1:-1;
return ;
}
PushDown(rt);
int m=(l+r)>>1;
if(m>=L)Update(L,R,c,lson);
if(m<R)Update(L,R,c,rson);
PushUp(rt);
}
int main()
{
ans=1<<30;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].len=a[i].r-a[i].l;
p[(i<<1)-1]=a[i].l;
p[i<<1]=a[i].r;
}
sort(p+1,p+n*2+1);
for(int i=1;i<=n;i++)
{
int x=lower_bound(p+1,p+n*2+1,a[i].l)-p;
a[i].l=x;
x=lower_bound(p+1,p+n*2+1,a[i].r)-p;
a[i].r=x;
}
sort(a+1,a+n+1,cmp);
int l=1,r=0,rot=0;
while(r<n)
{
while(tr[rot].maxx<m&&r<n){r++;Update(a[r].l,a[r].r,1,1,n*2,rot);}
if(tr[rot].maxx<m)break;
while(tr[rot].maxx>=m&&l<n){Update(a[l].l,a[l].r,0,1,n*2,rot);l++;}
ans=min(a[r].len-a[l-1].len,ans);
}
printf("%d\n",ans==1<<30?-1:ans);
return 0;
}

  离散化什么的,用lower_bound就好了,懒得写二分查找了...反正不会tle...

[Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086的更多相关文章

  1. 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化

    洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...

  2. BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...

  3. 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)

    题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...

  4. 洛谷P4459/loj#2511 [BJOI2018]双人猜数游戏(博弈论)

    题面 传送门(loj) 传送门(洛谷) 题解 所以博弈论的本质就是爆搜么-- 题解 //minamoto #include<bits/stdc++.h> #define R registe ...

  5. 洛谷P4458 /loj#2512.[BJOI2018]链上二次求和(线段树)

    题面 传送门(loj) 传送门(洛谷) 题解 我果然是人傻常数大的典型啊-- 题解在这儿 //minamoto #include<bits/stdc++.h> #define R regi ...

  6. 洛谷P4457/loj#2513 [BJOI2018]治疗之雨(高斯消元+概率期望)

    题面 传送门(loj) 传送门(洛谷) 题解 模拟赛的时候只想出了高斯消元然后死活不知道怎么继续--结果正解居然就是高斯消元卡常? 首先有个比较难受的地方是它一个回合可能不止扣一滴血--我们得算出\( ...

  7. BZOJ4653 & 洛谷1712 & UOJ222:[NOI2016]区间——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4653 https://www.luogu.org/problemnew/show/P1712 ht ...

  8. 【洛谷 P1712】 [NOI2016]区间 (线段树+尺取)

    题目链接 emmm看起来好像无从下手, \(l_i,r_i\)这么大,肯定是要离散化的. 然后我们是选\(m\)个区间,我们先对这些区间按长度排个序也不影响. 排序后,设我们取的\(m\)个区间的编号 ...

  9. 洛谷 P1712 [NOI2016]区间(线段树)

    传送门 考虑将所有的区间按长度排序 考虑怎么判断点被多少区间覆盖,这个可以离散化之后用一棵权值线段树来搞 然后维护两个指针$l,r$,当被覆盖次数最多的点的覆盖次数小于$m$时不断右移$r$,在覆盖次 ...

随机推荐

  1. JAVA全套学习视频

    链接: https://pan.baidu.com/s/1miE7kvQ 密码: jj8x

  2. JDK内置工具之一——JMap(java memory map)

    1.介绍 打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量). 可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本.使用方法 j ...

  3. SQL语言逻辑执行顺序

    SQL语言逻辑执行顺序 2012-12-18 16:18:13 分类: 数据库开发技术 查询的逻辑执行顺序 FROM < left_table> ON < join_conditio ...

  4. spring 配置多数据源(mysql读写分离)

    前段时间刚换了家新公司,然后看项目代码里用了数据库读写分离的架构,然后好奇扒了代码简单看了下,总体来说就是运用spring aop切面方式来实现的.看明白后就在自己的个人小项目里运用了下,测试OK,所 ...

  5. Java 故障安全异常处理

    异常处理代码必须保证其故障安全机制,其中一条重要的规则如下: 在try-catch-finally块抛出的最后一个异常将会在调用堆栈中传递. 所有早期异常将会消失. 如果从一个catch或finall ...

  6. Application "org.eclipse.ui.ide.workbench" could not be found in the registry.问题的解决

    今天升级Eclipse,升级完Restart,碰到启动不了让看日志,日志里主要错误信息即是Application "org.eclipse.ui.ide.workbench" co ...

  7. First Scala

    注意的两点: 1. Class or Objcect 在Scala把类和对象明确的分开了. Class相当于模板:Object是Class的实现. 2. main 要测试代码必须使用main def ...

  8. Mybatis批量更新数据库与批量插入数据库(以oracle为例)

    一.批量更新 1.普通写法(一条记录update一次,性能比较差,容易造成阻塞.不建议使用) <update id="updateBatch" parameterType=& ...

  9. margin-right没有效果的问题

    margin-right其实有效果的,只是在默认即标准流的情况的下显示不出来效果.如果脱离标准流呢?想到这个,就立马在css文件中加了一个:float:right;然后在测试的时候就能看到margin ...

  10. Maven项目管理工具

    Maven项目管理工具 白面郎君 Svn eclipse maven量级 1 Maven的简介 1.1 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目 ...