首页 > 其他分享 >ybt1678 独木桥

ybt1678 独木桥

时间:2025-01-04 16:23:12浏览次数:1  
标签:独木桥 int 孩子 位置 ybt1678 mid maxn

1678:独木桥

时间限制: 1500 ms 内存限制: 131072 KB

【题目描述】

Alice和Bob是好朋友,有一天他们带了\(n\)个孩子过独木桥。

为了方便,我们将问题抽象如下:

将独木桥看成一个长度无限长的实数轴,将每个孩子看作数轴上的一个实数点。数轴从左到右坐标不断增大。

孩子的位置用相对于数轴原点的点的坐标来表示。初始时\(n\)个点在\(n\)个互不相同的整点上。

每个点有一个初始朝向(从左向右或从右向左)。任何时刻所有的点都会以每秒1单位长度的速度匀速向所朝的方向移动。当某一时刻两个点同时移动到了同一个位置上,它们会立即改变自己的朝向(从左向右变成从右向左,反之亦然),然后继续移动。

有\(q\)次询问,每次询问给定\(k_i\)与\(t_i\),询问在\(t_i\)秒后,孩子\(k_i\)目前的位置。

Bob无法同时关注这么多的孩子,请你帮帮他。

【输入】

第一行一个整数\(n\)表示孩子数,孩子从\(0\)开始编号。

第二行\(n\)个整数\(p_i\),表示孩子们的初始位置。

第三行\(n\)个整数\(d_i\),表示孩子们的初始朝向。\(d_i=0\)则初始向左,\(d_i=1\)则初始向右。

第四行一个整数\(q\)表示询问数。

接下来\(q\)行每行两个正整数\(k_i\),\(t_i\)表示一个询问,询问在\(t_i\)秒后,孩子\(k_i\)(按输入顺序)目前的位置。

【输出】

\(q\)行每行一个整数表示答案。

【输入样例】

5
1 3 5 8 9
1 1 1 0 0
3
3 2
0 7 
1 5

【输出样例】

7
1
4

【数据规模及约定】

对于20%的数据,\(n,p_i,t_i≤10\)

另有10%的数据,\(d_i\)均相同。

另有20%的数据,\(q≤10\)。

另有15%的数据,\(t_i≤100\)。

另有20%的数据,\(n≤1000\)。

对于100%的数据,$1≤n,q≤2×10^5 ,0≤k_i<n,0≤p_i,t_i≤10^9,d_i ∈ { 0,1 } $。


首先要明的一件事,孩子不是会交位置的,也就是排序是不会变的。而会交换方向意味着直接计算位置后排序就可以得到对应次序的孩子的位置。

每次提问都排序是不现实的。而孩子分为两类,向左和向右。如果两类分开,他们不会相互碰撞,且相对位置不变,这样我们可以二分位置,在位置的基础上二分两类孩子的序号,从而判断该位置左侧有几人,就可以得出答案。

认清问题的本质是这个题的重点!

注意,孩子序号从0开始,所以最后查询时要+1


#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
struct node
{
	int no,pos,fx;
}ch[maxn];
int n,q;
int xh[maxn];
int xz[maxn],xy[maxn],xzjs,xyjs;
bool cmp(node a,node b)
{
	return a.pos<b.pos;
}
int tjxz(long long pos,int t)
{
	int l=0,r=xzjs-1,ans=-1;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(xz[mid]-t<=pos)l=mid+1,ans=mid;
		else r=mid-1;
	}
	return ans+1;
}
int tjxy(long long pos,int t)
{
	int l=0,r=xyjs-1,ans=-1;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(xy[mid]+t<=pos)l=mid+1,ans=mid;
		else r=mid-1;
	}
	return ans+1;
}
bool pd(long long pos,int k,int t)
{
	if(tjxz(pos,t)+tjxy(pos,t)>=k)return 1;
	else return 0;
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;++i)
	{
		scanf("%d",&ch[i].pos);
		ch[i].no=i;
	}
	for(int i=0;i<n;++i)scanf("%d",&ch[i].fx);
	sort(ch,ch+n,cmp);
	for(int i=0;i<n;++i)
	{
		xh[ch[i].no]=i;
		if(ch[i].fx==1)xy[xyjs++]=ch[i].pos;
		else xz[xzjs++]=ch[i].pos;
	}
	scanf("%d",&q);
	while(q--)
	{
		int k,t;
		scanf("%d%d",&k,&t);
		k=xh[k];
		long long l=-1e9-1,r=2e9+2,ans;
		while(l<=r)
		{
			long long mid=(l+r)>>1;
			if(pd(mid,k+1,t))ans=mid,r=mid-1;
			else l=mid+1;
		}
		printf("%lld\n",ans);
	}
	return 0;
}

标签:独木桥,int,孩子,位置,ybt1678,mid,maxn
From: https://www.cnblogs.com/gryzy/p/18652044

相关文章

  • 题解:P1007 独木桥
    独木桥-洛谷https://www.luogu.com.cn/problem/P1007思路:输入部分:首先读取独木桥的长度 L 和初始留在桥上的士兵数目 N。然后通过循环读取每个士兵的初始坐标并存储在 soldiers 数组中。计算最小时间和最大时间:对于每个士兵,通过 min(soldiers[i],L+1-soldie......
  • 题解 P1007 独木桥
    link题意\(N\)个人在长度为\(L\)独木桥上走动,桥上的坐标为\(1,2,\cdots,L\),你不知道他们的方向。他们的速度都为\(1\)。当两个人相遇时,他们就分别转身,继续行走。(转身不花费时间)当某人来到\(0\)或\(L+1\)的位置,他就离开了独木桥。给定\(N\)、\(L\)和\(......
  • 打卡信奥刷题(276)用Scratch图形化工具信奥P1007[普及组/提高] 独木桥
    独木桥题目背景战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳......
  • 2024-01-06:用go语言,在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧 在
    2024-01-06:用go语言,在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧在桥上有一些石子,青蛙很讨厌踩在这些石子上由于桥的长度和青蛙一次跳过的距离都是正整数我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0...L其中L是桥的长度,坐标为0的点表示桥的起点,坐......
  • 1-独木桥(C)
    少推一个性质……题目描述Alice和Bob是好朋友,有一天他们带了�n 个孩子过独木桥。为了方便,我们将问题抽象如下:将独木桥看成一个长度无限长的实数轴,将每个孩子看作数轴上的一个实数点。数轴从左到右坐标不断增大。孩子的位置用相对于数轴原点的点的坐标来表示。初始时�n 个......
  • 独木桥
    题目背景战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳\(1\)个人通过。假如有\(......
  • Luogu P1007 独木桥
    题目描述link思路找到独木桥的中间位置,最少时间考虑在端点左侧的,向左走,在端点右侧的向右走.最多时间考虑在端点左侧的向右走,在端点右侧的向左走.最少时间即为最优情况下最多的时间,最多时间即为最差情况下的最多时间Code#include<cstdio>#include<algorithm>......
  • P1007 独木桥
    题目背景战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳\(1\)个人通过。假如有\(......
  • 洛谷 P1007 独木桥
    题目背景战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳 11 个人通过。假如有 2......
  • 独木桥
    题目背景战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏......