题目链接:https://ac.nowcoder.com/acm/contest/4462/H
题目大意:
思路:我们可以把每个仓库当作一个时间点。把操作颜色离线保存。
l d r d 那么对于一个操作就是拆分: 在时间点 l 添加颜色d。在r去掉颜色d ldrd
按时间线扫描一下就可以 了。对于操作先添加后输出。

#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;
}