20pts。造不出样例,跪求好心人Debug!
查看原帖
20pts。造不出样例,跪求好心人Debug!
992529
upto_300楼主2023/9/3 14:08

方法:小根堆模拟(外加特殊排序方式)

#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;
}
2023/9/3 14:08
加载中...