TLE64分,翻烂了讨论区找不到解法,回复必关
查看原帖
TLE64分,翻烂了讨论区找不到解法,回复必关
958675
Linzijian2012楼主2023/11/5 12:01

记录

代码:

//P7915
#include <cstdio>
using namespace std;
const int N = 1000005;
int T, n, a[N], p1, p2, len;
char ans[N];
	/*
struct Function_print{
	int tab, step;
	void pt(){
		for (int i = 1; i <= tab; i++){
			for (int j = 1; j <= step; j++){
				printf(" ");
			}
		}
		return;
	}
	void push(int l1, int r1, int l2, int r2, int p){
		for (int i = 1; i <= tab; i++){
			for (int j = 1; j <= step; j++){
				printf(" ");
			}
		}
		printf("dfs(%d, %d, %d, %d, %d){\n", l1, r1, l2, r2, p);
		tab++;
		return;
	}
	void pop(bool res){
		for (int i = 1; i <= tab; i++){
			for (int j = 1; j <= step; j++){
				printf(" ");
			}
		}
		printf("return %d;\n", res);
		tab--;
		for (int i = 1; i <= tab; i++){
			for (int j = 1; j <= step; j++){
				printf(" ");
			}
		}
		printf("}\n");
		return;
	}
	void newstep(int ns){
		step = ns;
		return;
	}
	void clear(){
		tab = 0;
		return;
	}
}Dfs;
	*/
bool dfs(int l1, int r1, int l2, int r2, int p){
//	Dfs.push(l1, r1, l2, r2, p);
	if (l1 > r1 && l2 > r2){
//		Dfs.pt();
		for (int i = 1; i <= 2 * n; i++){
			printf("%c", ans[i]);
		}
		printf("\n");
//		Dfs.pop(true);
		return true;
	}
	if (a[l1] == a[r1] && l1 < r1){
		ans[p] = 'L';
		ans[2 * n - p + 1] = 'L';
//		Dfs.pt();printf("L L\n");
		if (dfs(l1 + 1, r1 - 1, l2, r2, p + 1)){
//			Dfs.pop(true);
			return true;
		}
	}
	if (a[l1] == a[l2] && l1 <= r1 && l2 <= r2){
		ans[p] = 'L';
		ans[2 * n - p + 1] = 'R';
//		Dfs.pt();printf("L R\n");
		if (dfs(l1 + 1, r1, l2 + 1, r2, p + 1)){
//			Dfs.pop(true);
			return true;
		}
	}
	if (a[r1] == a[r2] && l1 <= r1 && l2 <= r2){
		ans[p] = 'R';
		ans[2 * n - p + 1] = 'L';
//		Dfs.pt();printf("R L\n");
		if (dfs(l1, r1 - 1, l2, r2 - 1, p + 1)){
//			Dfs.pop(true);
			return true;
		}
	}
	if (a[l2] == a[r2] && l2 < r2){
		ans[p] = 'R';
		ans[2 * n - p + 1] = 'R';
//		Dfs.pt();printf("R R\n");
		if (dfs(l1, r1, l2 + 1, r2 - 1, p + 1)){
//			Dfs.pop(true);
			return true;
		}
	}
//	Dfs.pop(false);
	return false;
}
int main(){
//	freopen("input.in", "r", stdin);
	scanf("%d", &T);
	while (T--){
//		Dfs.clear();
//		Dfs.newstep(4);
		scanf("%d", &n);
		for (int i = 1; i <= 2 * n; i++){
			scanf("%d", &a[i]);
		}
		for (int i = 2; i <= 2 * n; i++){
			if (a[i] == a[1]){
				p1 = i;
				break;
			}
		}
		for (int i = 1; i < 2 * n; i++){
			if (a[i] == a[2 * n]){
				p2 = i;
				break;
			}
		}
		ans[1] = 'L';
		ans[2 * n] = 'L';
		if (!dfs(2, p1 - 1, p1 + 1, 2 * n, 2)){
			ans[1] = 'R';
			if (!dfs(1, p2 - 1, p2 + 1, 2 * n - 1, 2)){
				printf("-1\n");
			}
		}
		for (int i = 1; i <= 2 * n; i++){
			ans[i] = ' ';
		}
	}
	return 0;
}

解除注释可以显示dfs的递归过程。

第11个点的数据见剪切板

奆佬们,知道蒟蒻错哪了请@蒟蒻,不然蒟蒻可能看不到QAQ。

2023/11/5 12:01
加载中...