独木桥(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. thymeleaf获取当前时间并格式化输出

    有时候会需要在模板中直接打印时间的需求,如果输出一个时间还需要在java类中去获取model的话,那未免也太麻烦了,以下为thymeleaf在模板中直接获取时间戳并格式化输的代码 获取时间戳 < ...

  2. Windows8.1任务栏取消oneDrive图标

    Windows8.1任务栏会有oneDrive图标,用不着,想取消,方法如下:

  3. 在 Java 8 中避免 Null 检查

    如何预防 Java 中著名的 NullPointerException 异常?这是每个 Java 初学者迟早会问到的关键问题之一.而且中级和高级程序员也在时时刻刻规避这个错误.其是迄今为止 Java ...

  4. POJ 2406 Power String

    算出next数组. 对于任何一个循环字串,len-next[len]必为最小循环节长度 若len%(len-next[len])==0 即为循环字串,n=len/(len-next[len]) 否则输 ...

  5. nginx 如何配置来获取用户真实IP

  6. (转)Windows 支持 DirectX 和 OpenGL,为什么大多数 PC 游戏还是 DirectX 开发?

    事实上在早年OpenGL即使在游戏领域也是对DirectX压倒性的优势.John Carmack曾嘲讽DirectX是"horribly broken" 的API.直到Direct ...

  7. codeforces 258D DP

    D. Little Elephant and Broken Sorting time limit per test 2 seconds memory limit per test 256 megaby ...

  8. 动态规划:HDU1248-钱币兑换问题

    解题心得: (青蛙跳台阶:有n阶台阶,青蛙可以一次跳一阶也可以一次跳两阶,问总共有多好中跳法) 1.之前把这个问题的思路弄错了,以为是递推,就像青蛙跳台阶,用斐波那契求解.但是用斐波那契肯定会超范围. ...

  9. Git-Git初始化

    创建版本库及第一次提交 通过如下操作来查看一下您的Git版本. $ git --version git version 1.7.4 在开始 Git 之旅之前,我们需要设置一下 Git 的配置变量,这是 ...

  10. 求 1 到 n 的所有数的约数和

    求 1 到 n 的所有数的约数和 暴力方法就是枚举每个数,算出他的约数和即可,这样有点慢. 另一种思路,枚举约数,判断他是谁的约数,并记录(即他的倍数有多少个),在乘以他自己. n/i求的是n以内,i ...