独木桥(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)的更多相关文章

  1. 【csp模拟赛3】bridge.cpp--矩阵加速递推

    题目描述 穿越了森林,前方有一座独木桥,连接着过往和未来(连接着上一题和下一题...). 这座桥无限长. 小 Q 在独木桥上彷徨了.他知道,他只剩下了 N 秒的时间,每一秒的时间里,他会向 左或向右移 ...

  2. PHP设计模式(八)桥接模式(Bridge For PHP)

    一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 二.案例 1.模拟毛笔(转) 需求:现在需要准备三种粗细(大中小),并且有五种颜色的比 如果使用蜡 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 理解 neutron(15):Neutron linux-bridge-agent 创建 linux bridge 的简要过程

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  7. KVM 虚拟机联网方式:NAT 和 Bridge

    KVM 客户机网络连接有两种方式: 用户网络(User Networking):让虚拟机访问主机.互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整.NA ...

  8. 桥接模式/bridge模式/对象结构型

    意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...

  9. 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 ...

随机推荐

  1. pytho线程信号量

    pytho线程信号量 import threading,time def going(num,sleep_time): semaphore.acquire()#启动允许执行 print("g ...

  2. runtime消息转发机制

    Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制.而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库.它是 Objective- ...

  3. c++引用与指针的区别

    c++引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. 指针的权威定义: In a declaration T D where ...

  4. 爬虫学习(三)——get请求参数解析

    get请求:        用户输入搜索的内容,发送请求,将请求的内容保存起来.        get请求的本质是在地址栏中输入参数进行的一种请求方式. 解析参数使用urllib.parse impo ...

  5. 16.1-Jenkins持续集成01—Jenkins服务搭建和部署

    分类: Linux架构篇   一.介绍Jenkins 1.Jenkins概念 Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何 ...

  6. file_get_contents函数

    今天迁移一个SDK项目到新的机子上,发现项目无法跑起来,报500错误,通过分析,发现原来是file_get_contents函数再作怪,代码如下 public function __construct ...

  7. python3.7 装饰器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...

  8. Python学习笔记(六)测试开发之接口开发

    Python的接口开发要使用到flask.Flask(__name__) 下面是一个简单的接口实例程序及访问效果: import flaskserver = flask.Flask(__name__) ...

  9. Python3爬取人人网(校内网)个人照片及朋友照片,并一键下载到本地~~~附源代码

    题记: 11月14日早晨8点,人人网发布公告,宣布人人公司将人人网社交平台业务相关资产以2000万美元的现金加4000万美元的股票对价出售予北京多牛传媒,自此,人人公司将专注于境内的二手车业务和在美国 ...

  10. poj 3045 叠罗汉问题 贪心算法

    题意:将n头牛叠起来,每头牛的力气 s体重 w  倒下的风险是身上的牛的体重的和减去s 求最稳的罗汉倒下去风险的最大值 思路: 将s+w最大的放在下面,从上往下看 解决问题的代码: #include& ...