题目传送门(内部题53)


输入格式

第二行$2$个整数表示$n,m$。
接下来$m$行每行两个整数,描述一个点对$(x_i,y_i)$。


输出格式

一个整数,表示最短距离。


样例

样例输入:

6 2
1 5
2 6

样例输出:

1


数据范围与提示

样例解释:

最优方案是在$2$号节点和$5$号节点之间建边。

数据范围:

对于前$30\%$的数据:
$n,m\leqslant 500$
对于前$60\%$的数据:
$n,m\leqslant 2,000$
对于所有数据:
$1\leqslant n,m\leqslant 100,000$
$1\leqslant x_i\leqslant y_i\leqslant n$


题解

发现答案是满足单调性的,假设答案为$d$,那么比$d$小的一定都不行,比$d$大的一定都行。

所以我们考虑二分答案,如何$judge$呢?

正解我不会,于是我打的暴力,枚举端点和点对,然后疯狂简枝,下面列举一下剪枝:

  $\alpha.$二分范围,所有点对取$\max$即可。

  $\beta.$在枚举点队的时候,已经满足的不用考虑,所以我们每一次先扫一边,将还没有满足的点对提取出来。

  $\gamma.$如果不满足的点对的右端点的最小值比左端点的小,那么也一定不行,直接$return\ 0$即可。

这三个剪枝一个也不能少。

时间复杂度:$\Theta(n^2\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m;
  4. int l[100001],r[100001],len[100001];
  5. int que[100001];
  6. bool judge(int x)
  7. {
  8. int minn=n,maxn=0,rmin=n,lft,rht;
  9. que[0]=0;
  10. for(int i=1;i<=m;i++)
  11. if(x<len[i])
  12. {
  13. que[++que[0]]=i;
  14. rmin=rmin<r[i]?rmin:r[i];
  15. maxn=maxn>l[i]?maxn:l[i];
  16. minn=minn<l[i]?minn:l[i];
  17. }
  18. if(!que[0])return 1;
  19. if(rmin<=maxn)return 0;
  20. for(int i=minn;i<=maxn;i++)
  21. {
  22. lft=0;
  23. rht=n;
  24. for(int j=1;j<=que[0];j++)
  25. {
  26. if(r[que[j]]>i)
  27. {
  28. int flag=x-abs(l[que[j]]-i);
  29. lft=max(lft,r[que[j]]-flag);
  30. rht=min(rht,r[que[j]]+flag);
  31. if(lft>rht)goto nxt;
  32. continue;
  33. }
  34. goto nxt;
  35. }
  36. return 1;
  37. nxt:;
  38. }
  39. return 0;
  40. }
  41. int main()
  42. {
  43. scanf("%d%d",&n,&m);
  44. int lft=0,rht=0;
  45. for(int i=1;i<=m;i++)
  46. {
  47. scanf("%d%d",&l[i],&r[i]);
  48. len[i]=r[i]-l[i];
  49. rht=rht>len[i]?rht:len[i];
  50. }
  51. while(lft<rht)
  52. {
  53. int mid=(lft+rht)>>1;
  54. if(judge(mid))rht=mid;
  55. else lft=mid+1;
  56. }
  57. printf("%d",lft);
  58. return 0;
  59. }

rp++

[杂题]:B/b(二分答案)的更多相关文章

  1. BZOJ_4590_[Shoi2015]自动刷题机_二分答案

    BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...

  2. BZOJ4590 SHOI2015自动刷题机(二分答案)

    二分答案,分别往尽量小的和尽量大的二分即可. #include<iostream> #include<cstdio> #include<cmath> #includ ...

  3. Codeforces Round #402 (Div. 2) D题 【字符串二分答案+暴力】

    D. String Game Little Nastya has a hobby, she likes to remove some letters from word, to obtain anot ...

  4. 【bzoj2653】【middle】【主席树+二分答案】

    Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...

  5. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  6. 二分答案:Poweroj2461-入门基础之二分答案(二分法的应用)

    传送门:点击打开链接 入门基础之二分答案 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 179 Accepted: 33 Page V ...

  7. HDU 5884 Sort(二分答案+计算WPL的技巧)

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. LuoguP2115 [USACO14MAR]破坏Sabotage【二分答案】By cellur925

    本来是想找一道生成树的题做的...结果被洛咕的标签骗到了这题...结果是二分答案与生成树一点mao关系都没有.... 题目大意:给你一个序列,请你删去某一个$l~r$区间的值($2<=i< ...

  9. [杂题]:C/c(二分答案)

    题目传送门(内部题54) 输入格式 第一行一个整数表示$n$.第二行$n$个整数表示初始序列.(这行原题没有,是我加的)接下来$2n$行每行两个整数,分别表示$X_i,Y_i$.数据保证至少存在一种方 ...

随机推荐

  1. SparkSQL架构

    Spark SQL运行架构 Spark SQL由Core.Catalyst.Hive和Hive-Thriftserver组成 core:负责处理数据的输入/输出,从不同的数据源获取数据(如RDD.Pa ...

  2. GitLab 安装,配置及维护

    参考: GitLab 官方文档 docker-gitlab,通过 docker-compose 快速安装 GitLab rake,是 Rails 的工具,类似 ruby 中常用的的 make.通过 R ...

  3. 如何根据字典值的大小,对字典中的项排序---Python数据结构与算法相关问题与解决技巧

    实际案例: 某班英语成绩以字典形式存储为: { 'LiLei' : 90, 'Jim' : 88, 'Lucy': 92 } 如何根据成绩高低,计算学生排名 -- 根据分数,进行排名,并且把排名信息添 ...

  4. 结合process进程,实现进程之间的通讯Queue,稍微复杂的运用

    #在父进程中创建两个子进程,一个往Queue写数据,一个从Queue里读数据 from multiprocessing import Queue,Process import time,random ...

  5. php难不难?

    php难不难?多久能学会? 我认为php难不难学和php多久学会是一个共性问题,所以我们首先来总结下有那么几种情况. 好的情况: 1.不排除有的人有天赋.智商高脑仁大.上手很快,这个和脑仁中的Z字回形 ...

  6. phpcms批量更新内容页只更新一点就返回问题

    phpcms批量更新内容页只更新一点就返回问题 给caches目录增加写入权限

  7. c#批量插入

    一.创建一个用来测试的数据库和表 USE [Test] GO /****** Object: Table [dbo].[student] Script Date: 2019/4/11 15:38:59 ...

  8. Linux忘记密码怎么办

    重启 Linux 系统主机并出现引导界面时,按下键盘上的 e 键进入内核编辑界面 在 linux16 参数这行的最后面追加"rd.break"参数,然后按下 Ctrl + X 组合 ...

  9. U33405 纽约 (二分)

    [题目描述] 牧民 Azone 需要多次往返于两个草场之间运输家当.为了顺利转场,Azone 决定花费 w元津巴布韦币,购买一辆载重为 w 的汽车.共有 n 件家具需要搬运,每件家具的重量为 wi​  ...

  10. NGUI的滚动条的制作(scroll bar script)

    一,我们添加一个sprite,添加一个box collider,然后添加一个scroll bar script,我们来看看scroll bar script的属性 看到background和forgr ...