独木桥(bridge)
独木桥(bridge)
题目描述
Alice和Bob是好朋友,这天他们带了n个孩子一起走独木桥。
独木桥宽度很窄,不允许两个或两个以上的人并肩行走,所有人必须要前后一个接一个地通行。
Bob给所有的孩子蒙上了眼,并将他们放在桥中不同的位置上,孩子们初始的朝向不一定相同。Bob吹响哨声后这些孩子们会按照初始的朝向开始移动,当两个孩子移动到同一点时由于桥太窄他们无法穿过彼此,因此他们会同时转身改变朝向,并接着朝新方向移动。
为了安全起见,在某个时刻Alice会询问Bob某个孩子现在所处的位置。
更具体的,我们可以将问题抽象如下:
· 将独木桥看作一个长度无限长的实数轴,将每个孩子看作数轴上的一个实数点。数轴从左到右坐标不断增大。
· 孩子的位置用相对于数轴原点的点的坐标来表示。初始时n个点在n个互不相同的整点上。
· 每个点有一个初始朝向(从左向右或从右向左)。任何时刻所有的点都会以每秒1单位长度的速度匀速向所朝的方向移动。当某个时刻两个点同时移动到了同一个位置上,它们会立即改变自己的朝向(从左向右变成从右向左,反之亦然),然后继续移动。
·有qq次询问,每次询问给定kiki与titi,询问在titi秒后,孩子kiki目前的位置。
Bob无法同时关注这么多的孩子,请你帮帮他。
输入
第一行一个整数nn表示孩子数,孩子从00开始编号。
第二行nn个整数pipi,表示孩子们的初始位置。
第三行nn个整数didi,表示孩子们的初始朝向。di=0di=0则初始向左,di=1di=1则初始向右。
第四行一个整数qq 表示询问数。
接下来qq行每行两个整数ki,tiki,ti表示一个询问,询问在titi秒
后,孩子kiki (按输入顺序)目前的位置。
【数据范围】
20%的数据:n,pi,ti≤10n,pi,ti≤10
另有20%的数据:di均相同
另有20%的数据:q≤10q≤10
另有15%的数据:ti≤100ti≤100
另有15%的数据:n≤1000n≤1000
1OO%的数据:1≤n,q≤2∗1051≤n,q≤2∗105, 0≤ki<n0≤ki<n, 0≤pi,ti≤1090≤pi,ti≤109,di∈0,1di∈0,1
solution
首先可以发现,各个蚂蚁之间的相对位置不变
也就是说,如果k开始时排在rk_k.那么询问是也是询问rk_k的位置
我很弱只会暴力排序的做法
可以二分答案,然后再对朝左的和朝右的分别二分个数
小绿O(nlog^2n)
orzboen 2.5k分讨实现O(nlogn)
orzjarden 2.5k线段树上分讨实现O(nlogn)
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 200005
#define inf 2e9
#define ll long long
using namespace std;
int n,rk,t,dy[maxn],t1,t2;
struct node{
int pl,d,id;
}s[maxn],a[maxn],b[maxn];
int pd(ll k){
int l=0,r=t1,sum=0;
while(l<r){
int mid=l+r+1>>1;
if(a[mid].pl-t<=k)l=mid;
else r=mid-1;
}
sum=sum+l;
l=0,r=t2;
while(l<r){
int mid=l+r+1>>1;
if(b[mid].pl+t<=k)l=mid;
else r=mid-1;
}
sum=sum+l;
//cout<<k<<' '<<sum<<endl;
return sum;
}
bool cmp(node a,node b){
return a.pl<b.pl;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&s[i].pl);
s[i].id=i;
}
for(int i=1;i<=n;i++)scanf("%d",&s[i].d);
sort(s+1,s+n+1,cmp);
for(int i=1;i<=n;i++){
dy[s[i].id]=i;
if(s[i].d==0)a[++t1]=s[i];
else b[++t2]=s[i];
}
int Q;cin>>Q;
for(int i=1;i<=Q;i++){
scanf("%d%d",&rk,&t);rk++;
rk=dy[rk];
ll l=-inf,r=inf;
while(l<r){
ll mid=l+r>>1;
if(pd(mid)<rk)l=mid+1;
else r=mid;
}
printf("%lld\n",l);
}
return 0;
}
独木桥(bridge)的更多相关文章
- 【csp模拟赛3】bridge.cpp--矩阵加速递推
题目描述 穿越了森林,前方有一座独木桥,连接着过往和未来(连接着上一题和下一题...). 这座桥无限长. 小 Q 在独木桥上彷徨了.他知道,他只剩下了 N 秒的时间,每一秒的时间里,他会向 左或向右移 ...
- PHP设计模式(八)桥接模式(Bridge For PHP)
一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 二.案例 1.模拟毛笔(转) 需求:现在需要准备三种粗细(大中小),并且有五种颜色的比 如果使用蜡 ...
- Configure a bridge interface over a VLAN tagged bonded interface
SOLUTION VERIFIED February 5 2014 KB340153 Environment Red Hat Enterprise Linux 6 (All Versions) Red ...
- Create a bridge using a tagged vlan (8021.q) interface
SOLUTION VERIFIED April 27 2013 KB26727 Environment Red Hat Enterprise Linux 5 Red Hat Enterprise Li ...
- Configure bridge on a team interface using NetworkManager in RHEL 7
SOLUTION IN PROGRESS February 29 2016 KB2181361 environment Red Hat Enterprise Linux 7 Teaming,Bridg ...
- 理解 neutron(15):Neutron linux-bridge-agent 创建 linux bridge 的简要过程
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- KVM 虚拟机联网方式:NAT 和 Bridge
KVM 客户机网络连接有两种方式: 用户网络(User Networking):让虚拟机访问主机.互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整.NA ...
- 桥接模式/bridge模式/对象结构型
意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...
- The network bridge on device VMnet0 is not running
The network bridge on device VMnet0 is not running. The virtual machine will not be able to communic ...
随机推荐
- 两级宏&&字符串化宏
如果你想字符串化宏参数扩展的结果,你必须使用两个级别的宏. #define xstr(s) str(s) #define str(s) #s #define foo 4 str (foo) ==> ...
- 关于微信小程序 textarea组件在fixed定位的模块中随页面移动问题
具体的情况: 在模拟器中没问题,可是在真机下就出现以下问题, <textarea />在一个view盒子中,view盒子是固定定位,页面滑动时候,固定定位的盒子会定在屏幕的相对位置,但 ...
- oracle数据库删除表时遇见需要解锁问题
今天在进行数据清空时,不注意把表锁住了,记录一下解锁过程. 第一步执行 select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked ...
- String&StringBuffer&StringBuilder区别
String String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式: (1)直接赋值(例中,String str = &q ...
- Fight Against Traffic -简单dijkstra算法使用
题目链接 http://codeforces.com/contest/954/problem/D 题目大意 n m s t 分别为点的个数, 边的个数,以及两个特殊的点 要求s与t间的距离在新增一条边 ...
- 十二、MySQL 查询数据
MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MyS ...
- DevOps - 监控告警 - Zabbix
官网3.4版本中文文档 Zabbix documentation in Chinese [Zabbix Documentation 3.4] https://www.zabbix.com/docume ...
- 【php】session_start 报 no such file
如果是yum安装修改php-fpm.conf 里面的 session.save_path 如果是编译的,修改php.ini 的session.save_path (此条未测试)
- Python知识点进阶——细节问题
int()强制转换浮点数 在int()的强制转换浮点数时候,不管是正数还是负数,只取整数部分. 注意:这里不是向上或者向下取整,也不是四舍五入. 无限递归 递归是为了将问题简化为更小规模的同类型问题, ...
- 数据分析处理库Pandas——索引
显示DataFrame结构中的指定列 使用iloc索引 指定一行的信息 指定多行信息 备注:第[1,5)行信息. 指定行和列 备注:第[0,5)行中第[1,3)列信息. 使用loc索引 指定行信息 备 ...