Codeforces Gym 101158 C. Distribution Center

来源:互联网 发布:tensorflow 路径规划 编辑:程序博客网 时间:2024/06/05 10:39

题意

The factory of the Impractically Complicated Products Corporation has many manufacturing lines and the same number of corresponding storage rooms. The same number of conveyor lanes are laid out in parallel to transfer goods from manufacturing lines directly to the corresponding storage rooms. Now, they plan to install a number of robot arms here and there between pairs of adjacent conveyor lanes so that goods in one of the lanes can be picked up and released down on the other, and also in the opposite way. This should allow mixing up goods from different manufacturing lines to the storage rooms.
Depending on the positions of robot arms, the goods from each of the manufacturing lines can only be delivered to some of the storage rooms. Your task is to find the number of manufacturing lines from which goods can be transferred to each of the storage rooms, given the number of conveyor lanes and positions of robot arms.

解题思路

所有传送带为横向传输。将机器人按 x 坐标从小到大排序。线性处理,记录每条传送带在 x 位置前所能拿到货物的最左传送带编号和最右传送带编号,每次更新最小、最大值即可。

代码

#include<bits/stdc++.h>using namespace std;const int N = 200000 + 10;const int M = 100000 + 10;pair<int, int> p[M], l[N];bool cmp(pair<int, int> a, pair<int, int> b) {    return a.first < b.first;}int main(){    int n, m;    scanf("%d %d", &n, &m);    for(int i=1;i<=n;i++)        l[i].first = l[i].second = i;    for(int i=1;i<=m;i++)        scanf("%d %d", &p[i].first, &p[i].second);    sort(p+1, p+m+1, cmp);    for(int i=1, y;i<=m;i++)    {        y = p[i].second;        l[y].first = l[y+1].first = min(l[y].first, l[y+1].first);        l[y].second = l[y+1].second = max(l[y].second, l[y+1].second);    }    for(int i=1;i<=n;i++)        printf("%d%c", l[i].second-l[i].first+1, i==n?'\n':' ');}
原创粉丝点击