(hdu 5437)
优先队列模拟,共k个人,每个人有一个价值,m次进入,每次价值最大的进去,价值相同id小的先进去,a b前a个没进去的人进去b个,不够b个,都进去,m次操作后,剩下的都进去,最后输出查询的第i个进去的人的名字
需要注意的是,m是乱序给的,需要按照a进行排序
#include<bits/stdc++.h> using namespace std; const int maxn=150005; char name[maxn][205]; typedef pair<int,int> dl; dl pt[maxn],px[maxn]; int ans[maxn],T[maxn],k,m,Q,u,v; struct node{ int id,val; node(int a=0,int b=0):id(a),val(b){} bool operator < (const node& x)const{ if(x.val==val) return x.id<id; return x.val>val; } }; void input(){ scanf("%d%d%d",&k,&m,&Q); for(int i=1;i<=k;i++){ scanf("%s%d",name[i],&u); pt[i]=make_pair(i,u); } for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); px[i]=make_pair(u,v); } for(int i=0;i<Q;i++) scanf("%d",T+i); sort(px+1,px+1+m); } priority_queue<node> q; void solve(){ while(!q.empty())q.pop(); int cnt1=0,cnt2=0; for(int i=1;i<=m;i++){ while(cnt1<px[i].first){ cnt1++; q.push(node(pt[cnt1].first,pt[cnt1].second)); } int w=cnt2+px[i].second; while(cnt2<w&&!q.empty()){ ++cnt2; node tmp=q.top();q.pop(); ans[cnt2]=tmp.id; } } for(int i=cnt1+1;i<=k;i++) q.push(node(pt[i].first,pt[i].second)); while(!q.empty()){ ++cnt2; node tmp=q.top();q.pop(); ans[cnt2]=tmp.id; } bool ok=0; for(int i=0;i<Q;i++){ if(ok)putchar(' '); else ok=1; printf("%s",name[ans[T[i]]]); } puts(""); } int main(){ int t; scanf("%d",&t); while(t--){ input(); solve(); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· Java轻量级代码工程
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战