不知道公然发练习赛的题目会不会被教练萨了(汗
但是蒟蒻调了不下5个小时啦求大家帮帮忙吧 qwq
题面(有些 katex/中文字体 实在懒得修了):
【问题描述】
有两列小火车对向行驶,每列有n个⻋厢,每个车厢有⼀个颜⾊。分别为 a1∼an、b1∼bn,a1、b1 为车头。两辆⻋对向经过过程中某时刻,如出现2个同⾊⻋厢在同⼀位置,则这两个车厢就会同时消失,然后火车的前半截会向车尾⽅向倒退1个⻋厢。如同时有多个同色车厢对准,这些⻋厢会同时消失,其他⻋厢都向各⾃⻋尾⽅向靠拢,如靠拢后如⼜出现同⾊对准的情况则同样操作。
求最后两列⻋交错驶过以后,总共还剩下⼏节⻋厢。
【输入格式】
第 1 行 1 个正整数 n
第 2 行 n 个正整数 a1∼an
第 3 行 n 个正整数 b1∼bn
【输出格式】
一行⼀个整数表示答案。
【样例】
输入:
6
3 1 3 2 1 3
2 1 4 2 3 1
输出:
4
本人做的是 n≤100 的暴力,真正的数据范围是 n≤105,ai≤106。
求各位大佬帮忙调一下代码,中间那段注释的代码可以用来输出两列火车的状态。
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int a[N], b[N];
int main()
{
int n; scanf("%d", &n);
for (int i = n; i >= 1; i--) scanf("%d", &a[i]);
for (int i = n + 1; i <= n * 2; i++) scanf("%d", &b[i]);
int ha = n, ta = 1, hb = n + 1, tb = n * 2;
for (int i = 1; ta <= tb; i++)
{
ha++, ta++, hb--, tb--;
for (int j = ha; j >= ta; j--) a[j] = a[j - 1];
for (int j = hb; j <= tb; j++) b[j] = b[j + 1];
a[ta - 1] = b[tb + 1] = 0;
int flag = 1;
while (flag && ta <= tb)
{
flag = 0;
// for (int j = 1; j < ta; j++) printf(" ");
// for (int j = ta; j <= ha; j++) printf("%d ", a[j]);
// printf("\n");
// for (int j = 1; j < hb; j++) printf(" ");
// for (int j = hb; j <= tb; j++) printf("%d ", b[j]);
// printf("\n\n");
for (int j = max(hb, ta); j <= min(ha, tb); j++)
if (a[j] == b[j]) flag = 1, a[j] = b[j] = 0;
if (!a[ta]) ta++; if (!b[tb]) tb--;
int lena = ha - ta + 1, lenb = tb - hb + 1;
for (int j = ha; j > ta; j--)
if (!a[j])
{
for (int k = j; k <= ha; k++) a[k] = a[k + 1];
lena--;
}
for (int j = hb; j < tb; j++)
if (!b[j])
{
for (int k = j; k >= hb; k--) b[k] = b[k - 1];
lenb--;
}
ha = ta + lena - 1, hb = tb - lenb + 1;
}
} printf("%d\n", (ha - ta + 1) * 2);
return 0;
}/*
6
3 1 3 2 1 3
2 1 4 2 3 1
*/