独木桥(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. innobackup 参数

    innobackupex [--compress] [--compress-threads=NUMBER-OF-THREADS] [--compress-chunk-size=CHUNK-SIZE] ...

  2. split 分割压缩文件

    1.普通tar压缩命令 tar -zcvf cm-11.tar.gz cm-11 //将cm-11文件夹压缩成cm-11.tar.gz 2.压缩后的文件太大,需要将cm-11.tar.gz分割成N个指 ...

  3. Python入门基础--变量与基本数据类型

    变量 什么是变量 变量就是变化的量,变就是变化,量用于衡量描述对象的状态 为什么要有变量 程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序 ...

  4. 解决Uva网站打开慢的问题

    https://blog.csdn.net/richenyunqi/article/details/80990535

  5. poj 2377 拉最长的线问题 kruskal算法

    题意:建光纤的时候,拉一条最长的线 思路:最大生成树 将图的n个顶点看成n个孤立的连通分支,并将所有的边按权从大到小排 边权递减的顺序,如果加入边的两个端点不在同一个根节点的话加入,并且要将其连通,否 ...

  6. 洛谷 P2205 [USACO13JAN]画栅栏

    这题其实没什么,但用到的算法都十分有用.做一个不恰当的比喻,这是一只必须用牛刀杀的鸡,但因为我这个蒟蒻杀不死牛,所以只能找只鸡来练练手. 题目描述 Farmer John 想出了一个给牛棚旁的长围墙涂 ...

  7. 网络流 EK算法模板。

    这篇博客讲得很好 #include<queue> #include<stdio.h> #include<string.h> using namespace std; ...

  8. UVA11825 Hacker's Crackdown 二进制集合+关于子集的动态规划

    题意:有N台服务器,全部服务器都直接运行着完全相同的N个任务.对于每台电脑,你都可以进行“一次”操作,使得某(自己选定)一种任务停止,且同时会使得其他和这台服务器直接相连的电脑上面相同的服务完全终止. ...

  9. Diycode开源项目 ImageActivity分析

    1.首先看一下效果 1.1做成了一个GIF 1.2.我用格式工厂有点问题,大小无法调到手机这样的大小,目前还没有解决方案. 1.3.网上有免费的MP4->GIF,参考一下这个网站吧. 1.4.讲 ...

  10. 15,scrapy中selenium的应用

    引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生如果直接用scrapy对其url发请求,是获取不到那部分动态加载出来的数据值,但是通过观察会发现,通过浏览器 ...