1 条题解

  • 1
    @ 2025-5-6 20:25:46

    差分,因为区间的范围很大(2302^{30}),但实际的点数很少,因此要离散化一下,将所有的区间的端点存到一个数组里,去重排序一下,这样v[0]v[0]~v[n]v[n]nn个点就离散化到了从00~nnnn个位置,因为排好序了,也不会出现交叉(大的离散化到小的,小的离散化到大的),每次对区间LL~RR,只需要二分查找到两个端点在数组中的下标llrr,然后给差分数组d[l]++,d[r+1]d[l]++,d[r+ 1]--即可。

    但事实上,不用这么麻烦,这题的难度远比原估计的要低,其实只需要用一个mapmap代替差分数组。观察可以发现,人数最多的那一段一定包含某一个区间的端点,所以只需要在mapmap上做差分,然后遍历所有的区间端点即可。

    时间复杂度:O(nlogn)O(nlogn)

    也可达到:O(n)O(n)

    ACcode1

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #define endl '\n'
    using namespace std;
    typedef pair<int, int> PII;
    int main(){
    	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    	int n;
    	cin >> n;
    	vector<PII> a(n);
    	vector<int> v;
    	for(int i = 0; i < n; i++){
    		int l, r;
    		cin >> l >> r;
    		a[i] = {l, r};
    		v.push_back(l), v.push_back(r);
    	}
    	sort(v.begin(), v.end());
    	v.erase(unique(v.begin(), v.end()), v.end());
    	vector<int> d(v.size() + 2, 0);
    	for(int i = 0; i < n; i++){
    		int l = lower_bound(v.begin(), v.end(), a[i].first) - v.begin();
    		int r = lower_bound(v.begin(), v.end(), a[i].second) - v.begin();
    		d[l]++, d[r + 1]--;
    	}
    	int res = d[0];
        for(int i = 1; i < v.size(); i++){
            d[i] += d[i - 1];
            res = max(res, d[i]);
        }
        cout << res << endl;
        return 0;
    }
    

    ACcode2

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <map>
    #define endl '\n'
    using namespace std;
    
    int main(){
        ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        int n;
        cin >> n;
        map<int, int> d;
        for(int i = 0; i < n; i++){
            int l, r;
            cin >> l >> r;
            d[l]++;
            d[r + 1]--;    
        }
        int sum = 0, res = 0;
        for (auto [_, b] : d){
            sum += b;
            res = max(res, sum);
        }
        cout << res << endl;
        return 0;
    }
    
    
    • 1

    信息

    ID
    2276
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    149
    已通过
    14
    上传者