啊哈算法2-3纸牌游戏——小猫钓鱼

搬一下题目

维护两个队列(玩家手牌),一个栈(桌面的牌)

原题太简单稍微放大一下范围,数据都在1e5以内,没找到地方交

'''

include

using namespace std;

const int N = 1e5 + 10;

struct Node {
int l, r;
int q[N<<1];
}a,b;

int p[N<<1], top, book[N], n;

int main(){

scanf("%d", &n);
for(int i = 1; i <= n;++i) scanf("%d", &a.q[i]);
for(int i = 1; i <= n;++i) scanf("%d", &b.q[i]);
a.l = 1, a.r = n;
b.l = 1, b.r = n;

while(a.l <= a.r && b.l <= b.r){

if(book[a.q[a.l]]){
a.q[++a.r] = a.q[a.l];
while(top && a.q[a.l] != p[top]) a.q[++a.r] = p[top], book[p[top--]] = 0;
a.q[++a.r] = p[top], book[p[top--]] = 0;
}else{
p[++top] = a.q[a.l];
book[a.q[a.l]] = 1;
}
++a.l;
if(a.l > a.r) break;

if(book[b.q[b.l]]){
b.q[++b.r] = b.q[b.l];
while(top && b.q[b.l] != p[top]) b.q[++b.r] = p[top], book[p[top--]] = 0;
b.q[++b.r] = p[top], book[p[top--]] = 0;
}else{
p[++top] = b.q[b.l];
book[b.q[b.l]] = 1;
}
++b.l;
}
if(a.l > a.r && b.l > b.r) printf("0\n");
else if(b.l > b.r){
printf("1\n");
for(int i = a.l; i <= a.r; ++i) printf("%d ", a.q[i]);puts("");
for(int i = 1; i <= top; ++i) printf("%d ", p[i]);puts("");
}
else if(a.l > a.r){
printf("2\n");
for(int i = b.l; i <= b.r; ++i) printf("%d ", b.q[i]);puts("");
for(int i = 1; i <= top; ++i) printf("%d ", p[i]);puts("");
}else printf("ERROR\n");

return 0;
}
'''

posted @ 2026-07-23 17:24  爬爬w  阅读(1)  评论(0)    收藏  举报