(典题)线段计数 CF690 div3 F

Problem - F - Codeforces

题意:

(典题)线段计数 CF690 div3 F_第1张图片

(典题)线段计数 CF690 div3 F_第2张图片 

思路:

这题没什么性质可言,可以说就是纯纯的套路题

既然存在一条线段和其他所有线段相交,不知道是哪条线段,考虑枚举这条线段,然后计数没有交点的线段个数,取min

对于这个计数是个典,考虑将所有线段的端点扔进vec里,二分计算贡献即可

Code:

#include 

#define int long long

using i64 = long long;

constexpr int N = 2e5 + 10;
constexpr int M = 1e5 + 10;
constexpr int P = 2600;
constexpr i64 Inf = 1e18;
constexpr int mod = 1e9 + 7;
constexpr double eps = 1e-6;

int n;
int l[N], r[N];

void solve() {
    std::cin >> n;

    std::vector L, R;
    for (int i = 1; i <= n; i ++) {
        std::cin >> l[i] >> r[i];
        L.push_back(l[i]);
        R.push_back(r[i]);
    }

    std::sort(L.begin(), L.end());
    std::sort(R.begin(), R.end());

    int ans = 1e9;
    for (int i = 1; i <= n; i ++) {
        int res = 0;
        int pos1 = std::upper_bound(L.begin(), L.end(), r[i]) - L.begin() + 1;
        res += (n - pos1 + 1);
        int pos2 = std::lower_bound(R.begin(), R.end(), l[i]) - R.begin() + 1;
        res += pos2 - 1;
        ans = std::min(ans, res);
    }

    std::cout << ans << "\n";
}
signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int t = 1;
    std::cin >> t;

    while (t--) {
        solve();
    }
    
    return 0;
}

 

你可能感兴趣的:(DS,贪心,二分,算法)