题意

  • n个点,m次输入,每次输入左界,右界,存储的货物编号
  • 求存储的货物种类最多的点

思路

  • 因为一个点可能重复读入同一个货物,所以使用map并做前缀和
  • 开一个map统计每个点存入的货物和次数,全部读入完后,开第二个前缀和map
  • 遍历第一个map中的每一个点,对每一个点,将其中的货物存入前缀和map,如果计算到某一种货物的数量为0,就将这种货物从sum中erase掉,以保证sum的size始终为当前货物种类

AC代码

#include<bits/stdc++.h>
using namespace std;
map<int,int>mp[101010],num;
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        int l,r,d;
        scanf("%d%d%d",&l,&r,&d);
        mp[l][d]++;
        mp[r+1][d]--;
    }
    int ans=0,id=-1;
    for(int i=1;i<=n;i++){//遍历每一个点
        for(auto j:mp[i]){//遍历每一个点里面的所有货物
            num[j.first]+=j.second;//num为当前有的货物的前缀和,j.first为货物编号,j.second为货物存的次数
            if(num[j.first]==0)num.erase(j.first);        
        }
        if(num.size()>ans){
            ans=num.size();
            id=i;
        }
//         for(auto k:num)printf("%d %d\\",k.first,k.second);
//         printf("\n");
    }
    printf("%d",id);
    return 0;
}