方法:小根堆模拟(外加特殊排序方式)
#include<bits/stdc++.h>
using namespace std;
int n,m,t,p[100001];
vector<int>op[100001];//op[t]:第t时刻所有外卖的信息
bool join[100001];
map<int,bool>vis;
struct fake{//对于所有数据都会变动的堆来说,只能用fake函数解决了
int id;
bool operator<(const fake&b)const{return p[id]>p[b.id];}
};
priority_queue<fake>q;
int main(){
cin>>n>>m>>t;
for(int i=1;i<=m;i++){
int t_,id;
cin>>t_>>id;
op[t_].push_back(id);
}
for(int i=1;i<=t;i++){
vis.clear();
for(int x:op[i]){
if(vis.find(x)==vis.end()){vis[x]=1;p[x]++;}
p[x]+=2;
if(!join[x]&&p[x]>5){
join[x]=1;
q.push({x});
}
}
for(int j=1;j<=n;j++)if(p[j])p[j]--;
while(!q.empty()&&p[q.top().id]<=3){join[q.top().id]=0;q.pop();}
cout<<q.size()<<":\n";
for(int j=1;j<=n;j++)cout<<p[j]<<' ';
cout<<endl;
}
// for(int j=1;j<=n;j++)if(p[j])p[j]--;
while(!q.empty()&&p[q.top().id]<=3){join[q.top().id]=0;q.pop();}
cout<<q.size();
return 0;
}