Solution

cookiebus 2023-04-15 8:57:10 2024-04-25 9:03:27 42 返回题目

把每个佣兵团勇士的攻击力排序,再把所有勇士的攻击力合起来排序,枚举第i个佣兵团的第j个勇士,其攻击力为,要想找到一个满足条件的勇士,其攻击力需大于,先从所有勇士中二分搜索得到第一个攻击力大于的勇士,那么这个勇士和后面的勇士都满足条件,但是要去掉同一个佣兵团的勇士,再在中二分搜索找到第一个攻击力大于的勇士,减掉即可

本题考察 二分,STL的运用,时间复杂度

#include <iostream>
#include <algorithm>
#include <climits>
#include <vector>
#include <cstdio>
#define int long long

using namespace std;
int t, n, k;
int sv[100010], v[1010][110], a[1010];
signed main() {
    cin >> t;
    while (t--) {
        int ans = 0, len = 0;
        scanf("%lld%lld", &n, &k);
        for (int i = 1; i <= n; ++i) {
            scanf("%lld", &a[i]);
            for (int j = 1; j <= a[i]; ++j) {
                scanf("%lld", &v[i][j]);
                sv[++len] = v[i][j];
            }
            sort(v[i] + 1, v[i] + 1 + a[i]);
        }
        sort(sv + 1, sv + 1 + len);
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= a[i]; ++j) {
                ans += len - (lower_bound(sv + 1, sv + 1 + len, k - v[i][j]) - sv) + 1;
                ans -= a[i] - (lower_bound(v[i] + 1, v[i] + 1 + a[i], k - v[i][j]) - v[i]) + 1;
            }
        }
        cout << ans / 2 << endl;
    }
    return 0;
} 
{{ vote && vote.total.up }}

共 2 条回复

cookiebus

@071maozihan 看到了看到了,用毛线段树啊,lower_bound 不香么

071maozihan

cookiebus,老毛用的线段树