Description

?辆车在一条数轴上,车的编号为1到?。编号为?的车坐标为?[?],初始方 向为???[?](左或右),初始位置两两不同。每辆车每个时刻行走距离为1。两辆 车相碰时,会调转方向,继续行走,掉头不消耗时间。现在车子开始朝其方向行 驶,同一个坐标允许有多辆车。现在有?个询问,给出?, ?,询问过了?时刻后, 编号为?的车的坐标的绝对值。

Input Format

输入文件名为collision.in。 首先输入?, ?。 接下来?行,每行两个整数?[?], ???[?],若???[?] = 0,表示车子向左行走,若 ???[?] = 1,表示车子向右行走。 接下来?行,每行两个整数?, ?,询问时刻?时编号为?的车的坐标。

Output Format

输出文件名为collision.out。 对于每个询问,输出一个整数,代表编号为?的车的坐标。

Sample Input & Sample Output

【输入输出样例1】

collision.in    5 5 1 1 4 1 2 0 7 1 11 0 5 1 10 2 7 3 8 4 20

collision.out  5 3 1 8 12 27

【输入输出样例2】

collision.in

20 15 31116973 1 721410312 0 152891538 1 55434456 0 903968 1 34492580 0 97565125 0 78559065 1 191708700 0 335941230 0 526621966 1 25622049 38331852 977130985 662422758 171848754 220003868 5474029 533404717 11069472 1056101384 524968026 326917138168159348 1 457798506 1 160026937 1 76511872 1 247171016 1 48722268 0 159552820 0 701333640 0 434868520 1 143857480 13 821356724 11 132436670 1 20249229 11 504666 16 138701034 19 339607872 1 184664000 13 80827802 15

collision.out

625365533 5 668115287 6 93821572 7 175176488 5 438184710 1 71279702 12 237940668 420617936 689224277

Hint

【数据规模与约定】 对于30%的数据,max(?) ×? ≤ 107 另外有30%的数据,?, ? ≤ 1000 对于100%的数据,?, ? ≤ 100000,0 ≤ ?[?] ≤ 109 ,? ≤ 109 , ???[?] ∈ {0,1}

Solution

首先的士碰撞之后会掉头,
在这里我们可以理解为两辆车互换了编号,
然后继续前行。
那如何求出编号为x的最终位置呢?
这里可以用二分答案,
要用二分,我们需要单调。
因为在坐标轴上,从小到大,很显然是单调的。
如何验证答案,


如图,我们可以发现箭头变大了一辆车的rank是不会改变的,
因为大家的速度是一致的,不存在追及,而且相遇后会掉头,
所以它会一直在原来位置的前一辆车和后一辆车中间。
我们把车按照位置排一次序,
然后我们二分一个位置,使这个位置的rank与原来的相等;
询问这个位置的rank直接for循环一遍会超时,
所以我们继续二分,先按照方向和位置,把车分成A、B两组,
分别表示向右走和向左走的车的原始位置。
然后分别二分找出A中与B中比X小的车数量,两者相加就是X的rank,即可验证答案.

#include<cstdio>
#include<algorithm>
#define LL long longint n,q,tota,totb;
LL a[100005],b[100005];
struct node
{int pos,rank,num;
}nod[100005];bool cmp(node x,node y)
{return x.pos<y.pos;
}int Count(LL a[],int len,LL x)
{int res=0,l=1,r=len;while (l<=r){int mid=(l+r)>>1;if (a[mid]<=x) res=mid,l=mid+1;else r=mid-1;}return res;
}int main()
{scanf("%d%d",&n,&q);for (int i=1;i<=n;i++){int dir;scanf("%d%d",&nod[i].pos,&dir);nod[i].num=i;if (dir) a[++tota]=nod[i].pos;else b[++totb]=nod[i].pos;}std::sort(nod+1,nod+n+1,cmp);for (int i=1;i<=n;i++) nod[nod[i].num].rank=i;    std::sort(a+1,a+tota+1);std::sort(b+1,b+totb+1);for (int i=1;i<=q;i++){int tim,num,ans=0;scanf("%d%d",&tim,&num);num=nod[num].rank;LL l=std::min(a[1]+tim,b[1]-tim),r=std::max(a[tota]+tim,b[totb]-tim);while (l<=r){LL mid=(l+r)>>1;int count=Count(a,tota,mid-tim)+Count(b,totb,mid+tim);if (count>=num) ans=mid,r=mid-1;else l=mid+1;}printf("%d\n",abs(ans));}
}

转载于:https://www.cnblogs.com/Shawn7xc/p/7707449.html

【二分答案】【NOIP模拟10-21】的士碰撞相关推荐

  1. jzoj5920. 【NOIP2018模拟10.21】风筝(dp,最长上升子序列)

    5920. [NOIP2018模拟10.21]风筝 Description 当一阵风吹来,风筝飞上天空,为了你,而祈祷,而祝福,而感动-- Description oyiya 在 AK 了 IOI 之 ...

  2. [JZOJ NOIP2018模拟10.21]

    考试之前我刚刚领略到了特判的重要性,没想到T2的两个子任务还是写挂了,丢了20分 考试的感觉不行,一路打的都是暴力,正解的思路想到一半就断了推不下去 T1:逛公园 题目链接: https://jzoj ...

  3. NOIP模拟测试21「折纸·不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

  4. JZOJ-senior-5920. 【NOIP2018模拟10.21】风筝

    Time Limits: 4000 ms Memory Limits: 524288 KB Description 当一阵风吹来,风筝飞上天空,为了你,而祈祷,而祝福,而感动-- oyiya 在 AK ...

  5. 【NOIp模拟】【二分答案】电缆老板

    背景 某地区即将举行区域程序设计比赛,竞赛委员会已经成立并决定举行一次最公平的竞赛,他们决定利用星形拓扑结构来连接每个竞赛者的电脑-也即连接这些电脑到一个中心HUB上:为了达到真正的公平竞赛目的,竞赛 ...

  6. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  7. 【2018.10.18】noip模拟赛Day2 地球危机(2018年第九届蓝桥杯C/C++A组省赛 三体攻击)...

    题目描述 三体人将对地球发起攻击.为了抵御攻击,地球人派出了 $A × B × C$ 艘战舰,在太 空中排成一个 $A$ 层 $B$ 行 $C$ 列的立方体.其中,第 $i$ 层第 $j$ 行第 $k ...

  8. 【二分】【中等难度】noip模拟赛 聪哥的工资

    聪哥的工资 (money/money.in/money.out) 时限1000ms 内存256MB 题目描述 lwher: 了体验劳苦大众的生活,聪哥在暑假参加了打零工的活动,这个活动分为n个工作日, ...

  9. 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26

    背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...

  10. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

最新文章

  1. 2021年大数据常用语言Scala(八):基础语法学习 循环
  2. android imageview 的常用属性,android imageview scaletype属性
  3. 程序员大神用 React “复刻”实现了一个 Windows 11
  4. php控制器是啥,控制器的定义
  5. vue组件通信v兄弟组件通信eventbus遇到的问题(多次触发、第一次不触发)
  6. 理解ORACLE数据库字符集
  7. java timezone_Java TimeZone getDSTSavings()方法与示例
  8. 第8章-常用优先级和css3
  9. 计算机科学数学理论浅谈 (转载)
  10. 利用Excel进行成对(配对)T检验
  11. mysql 浮点类型和定点_mysql 中的浮点和定点类型
  12. Tomcat源码学习(9)-How Tomcat works(转)
  13. Ubuntu on Windows,在Windows上的Ubuntu
  14. java框架ssm面试题2016_Java面试-框架篇(SSM-SpringMVC)
  15. LINUX SHELL判断两个字串包含关系的办法
  16. macos server 恢复安装_Sinter:一款针对macOS的用户模式应用程序授权系统
  17. 批量生成hive建表语句
  18. redis.clients.jedis.exceptions.JedisDataException
  19. python循环剪刀石头布_Python中的剪刀石头布游戏
  20. 简单因式分解100道及答案_2014最新因式分解练习题100道

热门文章

  1. Vue- Markdown 使用大全
  2. java 降低jdk版本_jdk1.7降级到1.6 | 学步园
  3. Hive 存储格式入门
  4. POJ3281:Dining——题解
  5. PHP程序员面临的成长瓶颈
  6. Oracle教程之管理UNDO(九)--如何解决Oracle ORA-01555错误
  7. iphone iPhone开发中如何将制作图片放大缩小代码实现案例
  8. 有专用DHCP服务器的网络的简单配置
  9. 反射--笔记(第一篇)
  10. $PollardRho$ 算法及其优化详解