链接:https://ac.nowcoder.com/acm/contest/20960/1019
来源:牛客网

题目描述

某电商平台有n个仓库,编号从1到n。

当购进某种货物的时候,商家会把货物分散的放在编号相邻的几个仓库中。

我们暂时不考虑售出,你是否能知道,当所有货物购买完毕,存放货物种类最多的仓库编号为多少?

输入描述:

在第一行中给出两个正整数n,m,1≤n,m≤105n, m, 1\le n, m \le 10^5n,m,1≤n,m≤105,分别代表仓库的数目和进货的次数。

接下来 m 行,每行三个正整数l,r,d,1≤l,r≤n,1≤d≤109l,r,d,1 \le l,r \le n, 1 \le d \le 10^9l,r,d,1≤l,r≤n,1≤d≤109。编号在l和r之间的仓库收进编号为d的货物。

(包括l和r)

输出描述:

在一行中输出存放货物种类最多的仓库编号,若满足条件的仓库不止一个,则输出编号最小的那个。

示例1

输入

5 5 1 1 1 3 3 1 2 5 2 5 5 1 4 5 1

5 5
1 1 1
3 3 1
2 5 2
5 5 1
4 5 1

输出

3

本题的特殊点在于需要对种类进行一个计算,在这里采用一个map去存储不同种类所对应的个数。然后使用ans去记录当前仓库中货物种类的个数。这样间接实现了一个前缀和。然后在遍历仓库的过程中比较得到答案。

代码:

//使用差分的方式进行,在对某一范围使用差分的同时
//还需要通过一个map去记录货物编号对应的货物数量有几个
//之后可以以仓库为元素从小到大遍历每一个元素。如果有货物恰好为1就将结果加一
//并且还需要将map里面对应的货物加一。然后如果到需要删除的地方就删除货物并且如果货物被清零了就将结果减一。
//如此在遍历过程中就可以找到每一个仓库的情况。然后在遍历过程中取最大值。
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5;
vector<int> add[MAXN], del[MAXN];
map<int, int> mp;

int main() {
    int n, m, l, r, d;
    cin>>n>>m;
    for (int i=0;i<m;i++) {
        cin>>l>>r>>d;
        add[l].push_back(d);
        del[r+1].push_back(d);
    }
    int ans = 0, max_ans = INT_MIN;
    int maxk;
    for (int i=1;i<=n;i++) {
        for (int j=0;j<add[i].size();j++) {
            int temp = add[i][j];
            mp[temp]++;
            if (mp[temp]==1) {
                ans++;
            }
        }
        for (int j=0;j<del[i].size();j++) {
            int temp = del[i][j];
            mp[temp]--;
            if (mp[temp]==0) {
                ans--;
            }
        }
        if (max_ans<ans) {
            max_ans = ans;
            maxk = i;
        }
    }
    cout<<maxk;
    
}