站外题求助
  • 板块题目总版
  • 楼主multiple_set
  • 当前回复10
  • 已保存回复12
  • 发布时间2024/4/28 13:02
  • 上次更新2024/4/28 18:44:46
查看原帖
站外题求助
1216364
multiple_set楼主2024/4/28 13:02

不知道公然发练习赛的题目会不会被教练萨了(汗

但是蒟蒻调了不下5个小时啦求大家帮帮忙吧 qwq

题面(有些 katex/中文字体 实在懒得修了):

【问题描述】

有两列小火车对向行驶,每列有n个⻋厢,每个车厢有⼀个颜⾊。分别为 a1∼ana_1\sim a_n、b1∼bnb_1\sim b_n,a1a_1、b1b_1 为车头。两辆⻋对向经过过程中某时刻,如出现2个同⾊⻋厢在同⼀位置,则这两个车厢就会同时消失,然后火车的前半截会向车尾⽅向倒退1个⻋厢。如同时有多个同色车厢对准,这些⻋厢会同时消失,其他⻋厢都向各⾃⻋尾⽅向靠拢,如靠拢后如⼜出现同⾊对准的情况则同样操作。

求最后两列⻋交错驶过以后,总共还剩下⼏节⻋厢。

【输入格式】

第 11 行 11 个正整数 nn
第 22 行 nn 个正整数 a1∼ana_1\sim a_n
第 33 行 nn 个正整数 b1∼bnb_1\sim b_n

【输出格式】

一行⼀个整数表示答案。

【样例】

输入:

6
3 1 3 2 1 3
2 1 4 2 3 1

输出:

4

本人做的是 n≤100n\le 100 的暴力,真正的数据范围是 n≤105n\le 10^5,ai≤106a_i\le 10^6。

求各位大佬帮忙调一下代码,中间那段注释的代码可以用来输出两列火车的状态。

#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
*/
2024/4/28 13:02
加载中...