题目
There are n dormitories in Berland State University, they are numbered with integers from 1 to n. Each dormitory consists of rooms, there are ai rooms in i-th dormitory. The rooms in i-th dormitory are numbered from 1 to ai.
A postman delivers letters. Sometimes there is no specific dormitory and room number in it on an envelope. Instead of it only a room number among all rooms of all n dormitories is written on an envelope. In this case, assume that all the rooms are numbered from 1 to a1+a2+⋯+an and the rooms of the first dormitory go first, the rooms of the second dormitory go after them and so on.
For example, in case n=2, a1=3 and a2=5 an envelope can have any integer from 1 to 8 written on it. If the number 7 is written on an envelope, it means that the letter should be delivered to the room number 4 of the second dormitory.
For each of m letters by the room number among all n dormitories, determine the particular dormitory and the room number in a dormitory where this letter should be delivered.
题意
大概就是一共有n片区域供学生居住,每一位学生都有自己的序号。
学生需要找到自己所属的区域,找到自己的房间。
比如一共有两片区域,第一个区域有3个房间,第二个区域有4个房间。
学生6会住在2号区域的第3个房间。
思路
求前缀和,对于每个学生在前缀和数组中二分查找第一个大于等于他的序号的位置,这样就确定区域,然后再确定在哪个位置。
看代码,伊丽莎白!
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+100;
ll a[maxn];
ll b[maxn];
int main()
{
ll n,m;
cin>>n>>m;
for(ll i=0;i<n;i++)
cin>>a[i];
for(ll i=0;i<m;i++)
cin>>b[i];
for(ll i=1;i<n;i++)
a[i]+=a[i-1];
for(ll i=0;i<m;i++)
{
ll pos=lower_bound(a,a+n,b[i])-a;//二分查找函数,不会问百度
cout<<pos+1<<' ';
if(a[pos]==b[i])
cout<<a[pos]-a[pos-1]<<endl;
else
cout<<b[i]-a[pos-1]<<endl;
}
}
很多时候我们不喜欢别人,
是因为
他们身上有我们所厌恶的自身缺点。
——「少年谢尔顿」