概述
题目描述
自从Rabbit当上了图书馆的管理员,最让她头疼的便是把同学借过的书放回到指定位置。
假设图书馆的书架共有n层,从上到下分别为1~n层,其中第i层书架一共有
a
i
a_i
ai本书。
每一层的书籍从左往右分别编号为
1
1
1~
a
i
a_i
ai。
同时,每一本书的封面上有一个总编号,总编号由1到
a
1
+
a
2
+
.
.
.
+
a
n
a_1+a_2+...+a_n
a1+a2+...+an,编号顺序为第一层先编号,同一层中左侧的书籍先编号。
现在Rabbit手里有一堆书,她只知道它们的总编号,不堪重负的Rabbit想让你告诉她每一本书应该放在第几层第几号。
比如,
n
=
2
n=2
n=2,
a
1
=
4
a_1=4
a1=4,
a
2
=
6
a_2=6
a2=6,那么书籍总编号为1~10,如果有一本书总编号为8,那么它应该被放回到第2层第4号。
输入
输入数据第一行为T,表示数据组数。(1<=T<=10)
每组第一行为两个整数n,m,分别表示书架层数和需要被整理的书籍数量。(1<=n,m<=10^5)
接下来一行有n个整数
a
i
a_i
ai,表示每层书架的书籍数量。(
1
<
=
a
i
<
=
1
0
5
1<=a_i<=10^5
1<=ai<=105)
最后一行m个整数
b
i
b_i
bi,表示第i本书的总编号。(
1
<
=
b
i
<
=
a
1
+
a
2
+
.
.
.
+
a
n
1<=b_i<=a_1+a_2+...+a_n
1<=bi<=a1+a2+...+an)
输出
对于每组数据,输出m行,每行两个整数x,y,表示第i本书应该被放回到第x层第y号。
样例输入
1
2 2
4 6
3 8
样例输出
1 3
2 4
知识点
- 二分算法
注意情况
无
代码片段
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
long long int T,n,m,a[100005],b[100005],S=0,lo,d;
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>lo;
S+=lo;
a[i]=S;
b[i]=lo;
}
for(int i=0;i<m;i++)
{
cin>>d;
int L=0;
int R=n-1;
while(L<=R)
{
int mid=L+(R-L)/2;
if(mid==0&&d<=a[0])
{
cout<<1<<" "<<d<<endl;
break;
}
if(d>a[mid]&&d<=a[mid+1])
{
cout<<mid+2<<" ";
cout<<d-a[mid+1]+b[mid+1]<<endl;
break;
}
else if(d<=a[mid])
{
R=mid;
}
else if(d>a[mid+1])
{
L=mid+1;
}
}
}
S=0;
}
}
共同进步呀????
最后
以上就是快乐宝马为你收集整理的内蒙古大学IMCPC 2019 复现 问题 B: 图书管理员的全部内容,希望文章能够帮你解决内蒙古大学IMCPC 2019 复现 问题 B: 图书管理员所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复