牛客小白月賽22 H 貨物種類- 掃描線+差分

題目鏈接:https://ac.nowcoder.com/acm/contest/4462/H
題目大意:在這裏插入圖片描述
思路:我們可以把每個倉庫當作一個時間點。把操作顏色離線保存。
ldrd 那麼對於一個操作就是拆分: 在時間點 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章