You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.2 KiB

Sever the Skyline

题目描述

「被废弃的城市」中心有一台「不知所谓的机器」。机器顶端天线上的灯泡隐隐约约地散发着光芒。

云浅发现灯泡每次闪烁后发出的颜色有一定的规律。

具体来说,灯泡每次闪烁后的颜色可以用 n 个二元组 (a_1,b_1),(a_2,b_2),\cdots,(a_n,b_n) 来表示。机器会对每个 i=1,2,3,\cdots,n 闪烁 a_i 次,并且这 a_i 次闪烁发出的颜色都为 b_i

现在云浅想知道,机器第 m 次闪烁后,发出的颜色是什么。

输入格式

第一行两个正整数 n,m

第二行 n 个正整数 a_1,\cdots,a_n

第三行 n 个正整数 b_1,\cdots,b_n

输出格式

输出一行一个正整数表示答案。

数据范围

对于 100\% 的数据,1\le n\le 10^5,1\le m,a_i,b_i\le 10^9,m\le \sum a_i

测试点编号 n a_i 其他
1\sim 3 \le 100 \le 100
4\sim 5 \le 1000 \le 1000
6\sim 8 \le 10^5 \le 10^5 m\le 10^6
9\sim 10 \le 10^5 \le 10^9

题解

找到最小的满足 a_1+a_2+\cdots+a_k\ge mk,输出 b_k 即可。

复杂度 O(n)

参考代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
    int x = 0, f = 1;
    char c = getchar();
    for (; (c < '0' || c > '9'); c = getchar()) {
        if (c == '-') {
            f = -1;
        }
    }
    for (; (c >= '0'&& c <= '9'); c = getchar()) {
        x = x * 10 + (c& 15);
    }
    return x * f;
}
int n, m;
const int MN = 1e5 + 5;
int a[MN], b[MN];
signed main(void) {
    freopen("city.in", "r", stdin);
    freopen("city.out", "w", stdout);
    n = read();
    m = read();
    int x = 0;
    for (int i = 1; i <= n; i++) {
        a[i] = read();
    }
    for (int i = 1; i <= n; i++) {
        b[i] = read();
    }
    for (int i = 1; i <= n; i++) {
        x += a[i];
        if (x >= m) {
            cout << b[i] << endl;
            return 0;
        }
    }
    return 0;
}