差分数组+结构体排序
链接:https://ac.nowcoder.com/acm/contest/4462/H
来源:牛客网
某电商平台有n个仓库,编号从1到n。
当购进某种货物的时候,商家会把货物分散的放在编号相邻的几个仓库中。
我们暂时不考虑售出,你是否能知道,当所有货物购买完毕,存放货物种类最多的仓库编号为多少?
输入描述:
在第一行中给出两个正整数n,m,1≤n,m≤1e5,分别代表仓库的数目和进货的次数。
接下来 m 行,每行三个正整数l,r,d,1≤l,r≤n,1≤d≤1e9。编号在l和r之间的仓库收进编号为d的货物。
输出描述:
在一行中输出存放货物种类最多的仓库编号,若满足条件的仓库不止一个,则输出编号最小的那个。
示例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; }