【HDU 5818多校】Joint Stacks
用两个栈模拟,并保存每个点的时间戳。每次合并的时候记录合并时的时间戳mcnt和此时的topa和topb记做ta、tb。
每次pop的时候,如果栈的top的时间戳大于mcnt,则普通地pop,否则就在两个栈ta和tb下面找时间戳最大且还没pop掉的。然后用bj[时间戳]来标记已经pop了。
#include <cstdio> #include <cstring> #define N 100005 using namespace std; struct node{ int id,v; }a[N],b[N]; int bj[N],n,topa,topb,cnt,ele,ta,tb,mcnt,cas; char op[50],st; void popc(){ while(bj[a[ta].id])ta--; while(bj[b[tb].id])tb--; if(a[ta].id>b[tb].id){ printf("%d\n",a[ta].v); bj[a[ta].id]=1; }else { printf("%d\n",b[tb].v); bj[b[tb].id]=1; } } int main() { while(scanf("%d",&n),n){ printf("Case #%d:\n",++cas); topa=topb=cnt=mcnt=0; memset(bj,0,sizeof bj); for(int i=1;i<=n;i++){ scanf("%s %c",op,&st); if(op[1]=='u'){ scanf("%d",&ele); if(st=='A') a[++topa]=(node){++cnt,ele}; else b[++topb]=(node){++cnt,ele}; }else if(op[1]=='o'){ if(st=='A'){ if(a[topa].id>mcnt){ printf("%d\n",a[topa].v); bj[a[topa].id]=1; topa--; } else popc(); }else{ if(b[topb].id>mcnt){ printf("%d\n",b[topb].v); bj[b[topb].id]=1; topb--; } else popc(); } }else if(op[1]=='e'){ scanf(" %c",&st); mcnt=cnt; ta=topa; tb=topb; } } } return 0; }
wa了好几发,结果原因是 “if(a[topa].id>mcnt)”写的是>=,为什么等于不可以呢,因为popc函数里没有top--,这样下一次top的值可能已经pop掉了。那如果在popc里面top--呢,也不行,因为pop栈a的ta时,可能在pop栈b,这样to pa--的话就错了。这题用优先队列也很方便。
#include <cstdio> #include <queue> #define prq priority_queue #define pii pair<int,int> #define mp(a,b) make_pair(a,b) #define cl(a) while(!a.empty())a.pop(); using namespace std; prq<pii> a,b,c; int n,cas; void pop(prq<pii> &q){ if(!q.empty()){ printf("%d\n",q.top().second); q.pop(); }else{ printf("%d\n",c.top().second); c.pop(); } } void push(prq<pii> &q){ while(!q.empty()){ c.push(q.top()); q.pop(); } } int main() { while(scanf("%d",&n),n){ printf("Case #%d:\n",++cas); cl(a);cl(b);cl(c); int cnt=0; while(n--){ char op[10],st; scanf("%s %c",op,&st); if(op[1]=='u'){ int x; scanf("%d",&x); if(st=='A') a.push(mp(++cnt,x)); else b.push(mp(++cnt,x)); }else if(op[1]=='o'){ if(st=='A') pop(a); else pop(b); }else{ scanf(" %c",&st); push(a);push(b); } } } }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· Tinyfox 发生重大改版
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· 小米CR6606,CR6608,CR6609 启用SSH和刷入OpenWRT 23.05.5
· 近期最值得关注的AI技术报告与Agent综述!