题目链接:https://ac.nowcoder.com/acm/contest/4462/H
题目大意:
思路:我们可以把每个仓库当作一个时间点。把操作颜色离线保存。
那么对于一个操作就是拆分:在时间点l添加颜色d。在r去掉颜色d
按时间线扫描一下就可以 了。对于操作先添加后输出。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
vector<int> T[100005], S[100005];
struct node{
int l, r, d;
}q[100005];
int vis[100005];
int main(){
int n, m;scanf("%d%d", &n, &m);
for(int i=1; i<=m; i++){
scanf("%d%d%d", &q[i].l, &q[i].r, &q[i].d);
}
sort(q+1, q+m+1, [](node &a, node &b){return a.d<b.d;});
int tot=0;
for(int i=1; i<=m; i++){
if(q[i].d!=q[i-1].d){
tot++;
}
T[q[i].l].push_back(tot);
S[q[i].r].push_back(tot);
}
int ans=0, mx=0, k=0;
for(int i=1; i<=n; i++){
for(int j=0; j<T[i].size(); j++){
if(!vis[T[i][j]]){
ans++;
}
vis[T[i][j]]++;
}
if(ans>mx){
mx=ans; k=i;
}
for(int j=0; j<S[i].size(); j++){
if(vis[S[i][j]]==1){
ans--;
}
vis[S[i][j]]--;
}
}
printf("%d\n", k);
return 0;
}