差分数组+结构体排序

链接:https://ac.nowcoder.com/acm/contest/4462/H
来源:牛客网

某电商平台有n个仓库,编号从1到n。
当购进某种货物的时候,商家会把货物分散的放在编号相邻的几个仓库中。
我们暂时不考虑售出,你是否能知道,当所有货物购买完毕,存放货物种类最多的仓库编号为多少?

输入描述:

在第一行中给出两个正整数n,m,1≤n,m≤1e5,分别代表仓库的数目和进货的次数。
接下来 m 行,每行三个正整数l,r,d,1l,rn,1d1e9。编号在l和r之间的仓库收进编号为d的货物。

输出描述:

在一行中输出存放货物种类最多的仓库编号,若满足条件的仓库不止一个,则输出编号最小的那个。
示例1

输入

复制
5 5
1 1 1
3 3 1
2 5 2
5 5 1
4 5 1

输出

复制
3
注意看到是:种类数最多,就要先排个序,就讨论区间的关系了
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll; 
const int maxn=1e6+100;
struct node{
    ll l,r,w;
}a[maxn];
ll x[maxn];
ll sum[maxn];
bool cmp(node x,node y){
    if(x.w==y.w){
        return x.l<y.l; 
    }
    return x.w<y.w; 
}
int n,m;
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].w);
    }
    sort(a+1,a+m+1,cmp);
    x[a[1].l]++;
    x[a[1].r+1]--;
    int p=a[1].r; 
    for(int i=2;i<=m;i++){
        if(a[i].w!=a[i-1].w){
            x[a[i].l]++;
            x[a[i].r+1]--;
        }
        else{
            if(a[i].r<=p){
                continue;
            }
            else{
                if(a[i].l>p){
                    x[a[i].l]++;
                    x[a[i].r+1]--;
                }
                else{
                    x[p+1]++;
                    x[a[i].r+1]--;
                }
                
            }
            
        }
        p=a[i].r;
    }
    for(int i=1;i<=n;i++){
        sum[i]=sum[i-1]+x[i];
    }
    ll ma=0;
    int ans;
    for(int i=1;i<=n;i++){
        if(sum[i]>ma){
            ma=sum[i];
            ans=i;
        }
    }
    cout<<ans<<endl;
} 

 

 
posted @ 2021-01-11 18:21  lipu123  阅读(117)  评论(0编辑  收藏  举报