题目链接:https://ac.nowcoder.com/acm/contest/4462/H
这道题目我理解了做法之后,只想说出题人牛逼
题解为什么要去重,然后新排序;题解的真正意思;都值得去思考
(我感觉这道题目也没用多少差分数组呀,感觉就是样子像差分数组)
思路我都注释在代码里了
#include<iostream>
#include<cstdio>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct node
{
int l;
int r;
int d;
}a[110000];
int n,m;
int d; //记录种类数
int des[110000]; //记录种类
int res[110000]; //记录当前i种类的数目
vector<int> L[110000]; //记录在i点处开始的种类
vector<int> R[110000]; //记录在i点处结束的种类
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].d);
des[++d]=a[i].d;
}
//因为种类数量范围为10^9,数组无法保存这么大的,所有要进行去重,然后重新从1编号
//unique函数,返回去重后的最后一位的下一个坐标(覆盖式)
sort(des+1,des+1+d);
d=unique(des+1,des+1+d)-des-1;
for(int i=1;i<=m;i++)
{
a[i].d=lower_bound(des+1,des+1+d,a[i].d)-des;
L[a[i].l].push_back(a[i].d);
R[a[i].r].push_back(a[i].d);
}
int ans=0,pos=0; //记录最大种类数
int now=0; //记录当前种类数
for(int i=1;i<=n;i++)
{
//下面for循环也可以写为 for(int j:L[i]) 指遍历整个L[i]vector数组
int len=L[i].size();
for(int j=0;j<len;j++)
{
if(!res[L[i][j]]) //如果当前种类目前还没有,则种类数加一
now++;
res[L[i][j]]++;
}
if(now>ans)
{
ans=now;
pos=i;
}
len=R[i].size();
for(int j=0;j<len;j++) //这一步对当前i无影响,是为了i++做准备的
{
res[R[i][j]]--;
if(!res[R[i][j]]) //如果在i处结束时,某一种类的数量为0,那么总体种类数要减一
now--;
}
}
cout<<pos<<endl;
return 0;
}