题解:
先根据天数快排,
然后线段树+离散化(不开Map见祖宗),
如果是第一次ANS++,
否则若该奶牛不再是第一或成为第一则ANS++,
再否则的话,如果第一的个数(线段树处理)变化则ANS++.
CODE如下
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
int n,m,ans,cnt,c[1000005],lmax,lnum,nb[30000005],mx[30000005],x,past;
map<int,int>to;
struct node
{
int num,sum,d;
}a[1000005];
bool cmp(node a,node b)
{
return a.d<b.d;
}
void change(int l,int r,int x,int k)
{
if(l==r)
{
mx[k]=c[x];
nb[k]=1;
}
else
{
int mid=(l+r)/2;
if(x<=mid)change(l,mid,x,k*2);
else change(mid+1,r,x,k*2+1);
if(mx[k*2]==mx[k*2+1])
{
mx[k]=mx[k*2];nb[k]=nb[k*2]+nb[k*2+1];
}
if(mx[k*2]>mx[k*2+1])
{
mx[k]=mx[k*2];nb[k]=nb[k*2];
}
if(mx[k*2]<mx[k*2+1])
{
mx[k]=mx[k*2+1];nb[k]=nb[k*2+1];
}
}
}
int main()
{
freopen("measurement.in","r",stdin);
freopen("measurement.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i].d,&a[i].num,&a[i].sum);
}
for(int i=1;i<=30000005;i++)mx[i]=-1000000000;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(to[a[i].num]==0)to[a[i].num]=++cnt;
}
for(int i=1;i<=n;i++)
{
x=to[a[i].num];
past=c[x];
c[x]+=a[i].sum;
change(1,cnt,x,1);
if(i>1)
{
if((c[x]==mx[1]&&past!=lmax)||(c[x]!=mx[1]&&past==lmax))
{
ans++;
}
else
{
if(lnum!=nb[1])
{
ans++;
}
}
}
else ans++;
lmax=mx[1];
lnum=nb[1];
}
printf("%d",ans);
}