题意
- 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;
}