[AcWing 4480] 倒垃圾

image
image


点击查看代码
#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 2e5 + 10;

int n, m;
int x[N], t[N];
vector<int> a, b, c;

int findl(int x)
{
    int l = 0, r = m - 1;
    while (l < r) {
        int mid = l + r + 1 >> 1;
        if (b[mid] <= x)
            l = mid;
        else
            r = mid - 1;
    }
    return l;
}

int findr(int x)
{
    int l = 0, r = m - 1;
    while (l < r) {
        int mid = l + r >> 1;
        if (b[mid] >= x)
            r = mid;
        else
            l = mid + 1;
    }
    return l;
}

void solve()
{
    cin >> n >> m;
    for (int i = 0; i < n + m; i ++)
        cin >> x[i];
    for (int i = 0; i < n + m; i ++)
        cin >> t[i];
    for (int i = 0; i < n + m; i ++) {
        if (t[i] == 1) {
            b.push_back(x[i]);
            c.push_back(0);
        }
        else
            a.push_back(x[i]);
    }
    for (int i = 0; i < n; i ++) {
        int l = findl(a[i]), r = findr(a[i]);
        if (abs(b[l] - a[i]) <= abs(b[r] - a[i]))
            c[l] ++;
        else
            c[r] ++;
    }
    for (int i = 0; i < m; i ++)
        cout << c[i] << ' ';
    cout << endl;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    solve();

    return 0;
}

  1. a 数组来记录所有居民住所的坐标,b 数组来记录所有垃圾桶的坐标
    对于每一个 ai,用两次二分分别找到满足 bjai 的最大的 jbkai 的最小的 k,根据题意条件,如果 |bjai||bkai|,垃圾应当倒在 j,否则,垃圾应当倒在 k
posted @   wKingYu  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWing 4480] 倒垃圾』
点击右上角即可分享
微信分享提示