Submission #3080964


Source Code Expand

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct {
	int x;
	int y;
}pos;

pos *va, *vb;
int **E;

int ABS(int x){
	return x >= 0 ? x : -x;
}

int max(int a, int b){
	return a >= b ? a : b;
}

int qurt(int x){
	int a;
	for(a = 1; a * a < x; a++){}
	return a;
}

void put(int x, int y, int N, int **KG, int *is_used){
	int i, s, t, sum, now_max = -1, now_num = 0;
	for(i = 1; i <= N; i++){
		if(is_used[i] == 0){
			sum = 0;
			for(s = -1; s <= 1; s++){
				for(t = -1; t <= 1; t++){
					sum += E[i][KG[x + s][y + t]];
				}
			}
			if(sum > now_max){
				now_max = sum;
				now_num = i;
			}
		}
	}
	KG[x][y] = now_num;
	is_used[now_num] = 1;
}

int swap_1x1(int x1, int y1, int x2, int y2, int **KG){
	if(x1 == x2 && y1 == y2){
		return 0;
	}
	else{
		int s, t, now_sum = 0, next_sum = 0, tmp;
		for(s = -1; s <= 1; s++){
			for(t = -1; t <= 1; t++){
				now_sum += E[KG[x1][y1]][KG[x1 + s][y1 + t]];
				now_sum += E[KG[x2][y2]][KG[x2 + s][y2 + t]];
			}
		}
		tmp = KG[x1][y1];
		KG[x1][y1] = KG[x2][y2];
		KG[x2][y2] = tmp;
		for(s = -1; s <= 1; s++){
			for(t = -1; t <= 1; t++){
				next_sum += E[KG[x1][y1]][KG[x1 + s][y1 + t]];
				next_sum += E[KG[x2][y2]][KG[x2 + s][y2 + t]];
			}
		}
		if(now_sum > next_sum){
			tmp = KG[x1][y1];
			KG[x1][y1] = KG[x2][y2];
			KG[x2][y2] = tmp;
			return 0;
		}
		else{
			return next_sum - now_sum;
		}
	}
}

int P[24][4] = {{0, 1, 2, 3},
				{0, 1, 3, 2},
				{0, 2, 1, 3},
				{0, 2, 3, 1},
				{0, 3, 1, 2},
				{0, 3, 2, 1},
				{1, 0, 2, 3},
				{1, 0, 3, 2},
				{1, 2, 0, 3},
				{1, 2, 3, 0},
				{1, 3, 0, 2},
				{1, 3, 2, 0},
				{2, 0, 1, 3},
				{2, 0, 3, 1},
				{2, 1, 0, 3},
				{2, 1, 3, 0},
				{2, 3, 0, 1},
				{2, 3, 1, 0},
				{3, 0, 1, 2},
				{3, 0, 2, 1},
				{3, 1, 0, 2},
				{3, 1, 2, 0},
				{3, 2, 0, 1},
				{3, 2, 1, 0}};

int optimization_2x2(int x, int y, int **KG){
	int A[4][4], C[4], i, j, k, s, t;
	for(i = 0; i <= 1; i++){
		for(j = 0; j <= 1; j++){
			C[2 * i + j] = KG[x + i][y + j];
			KG[x + i][y + j] = 0;
		}
	}
	for(i = 0; i < 4; i++){
		for(j = 0; j < 4; j++){
			A[i][j] = 0;
		}
	}
	for(k = 0; k < 4; k++){
		for(i = 0; i <= 1; i++){
			for(j = 0; j <= 1; j++){
				for(s = -1; s <= 1; s++){
					for(t = -1; t <= 1; t++){
						A[k][2 * i + j] += E[C[k]][KG[x + i + s][y + j + t]];
					}
				}
			}
		}
	}
	int sum, first_sum, sum_max = -1, max_num;
	for(i = 0; i < 24; i++){
		sum = 0;
		for(j = 0; j < 4; j++){
			sum += A[P[i][j]][j];
		}
		if(sum > sum_max){
			if(i == 0){
				first_sum = sum;
			}
			sum_max = sum;
			max_num = i;
		}
	}
	for(i = 0; i <= 1; i++){
		for(j = 0; j <= 1; j++){
			KG[x + i][y + j] = C[P[max_num][2 * i + j]];
		}
	}
	return sum_max - first_sum;
}

int swap_2_to_2(int e1, int e2, int **KG){
	if(max(ABS(va[e1].x - va[e2].x), ABS(va[e1].y - va[e2].y)) <= 1
	 || max(ABS(va[e1].x - vb[e2].x), ABS(va[e1].y - vb[e2].y)) <= 1
	  || max(ABS(vb[e1].x - va[e2].x), ABS(vb[e1].y - va[e2].y)) <= 1
	   || max(ABS(vb[e1].x - vb[e2].x), ABS(vb[e1].y - vb[e2].y)) <= 1){
		return 0;
	}
	else{
		int i, j, s, t, now_sum = 0, next_sum = 0, tmp, res, sub_res = 0;
		sub_res += swap_1x1(va[e1].x, va[e1].y, vb[e1].x, vb[e1].y, KG);
		sub_res += swap_1x1(va[e2].x, va[e2].y, vb[e2].x, vb[e2].y, KG);
		for(s = -1; s <= 1; s++){
			for(t = -1; t <= 1; t++){
				now_sum += E[KG[va[e1].x][va[e1].y]][KG[va[e1].x + s][va[e1].y + t]];
				now_sum += E[KG[vb[e1].x][vb[e1].y]][KG[vb[e1].x + s][vb[e1].y + t]];
				now_sum += E[KG[va[e2].x][va[e2].y]][KG[va[e2].x + s][va[e2].y + t]];
				now_sum += E[KG[vb[e2].x][vb[e2].y]][KG[vb[e2].x + s][vb[e2].y + t]];
			}
		}
		tmp = KG[va[e1].x][va[e1].y];
		KG[va[e1].x][va[e1].y] = KG[va[e2].x][va[e2].y];
		KG[va[e2].x][va[e2].y] = tmp;
		tmp = KG[vb[e1].x][vb[e1].y];
		KG[vb[e1].x][vb[e1].y] = KG[vb[e2].x][vb[e2].y];
		KG[vb[e2].x][vb[e2].y] = tmp;
		res = swap_1x1(va[e1].x, va[e1].y, vb[e1].x, vb[e1].y, KG);
		res = swap_1x1(va[e2].x, va[e2].y, vb[e2].x, vb[e2].y, KG);
		for(s = -1; s <= 1; s++){
			for(t = -1; t <= 1; t++){
				next_sum += E[KG[va[e1].x][va[e1].y]][KG[va[e1].x + s][va[e1].y + t]];
				next_sum += E[KG[vb[e1].x][vb[e1].y]][KG[vb[e1].x + s][vb[e1].y + t]];
				next_sum += E[KG[va[e2].x][va[e2].y]][KG[va[e2].x + s][va[e2].y + t]];
				next_sum += E[KG[vb[e2].x][vb[e2].y]][KG[vb[e2].x + s][vb[e2].y + t]];
			}
		}
		if(now_sum > next_sum){
			tmp = KG[va[e1].x][va[e1].y];
			KG[va[e1].x][va[e1].y] = KG[va[e2].x][va[e2].y];
			KG[va[e2].x][va[e2].y] = tmp;
			tmp = KG[vb[e1].x][vb[e1].y];
			KG[vb[e1].x][vb[e1].y] = KG[vb[e2].x][vb[e2].y];
			KG[vb[e2].x][vb[e2].y] = tmp;
			res = swap_1x1(va[e1].x, va[e1].y, vb[e1].x, vb[e1].y, KG);
			res = swap_1x1(va[e2].x, va[e2].y, vb[e2].x, vb[e2].y, KG);
			return sub_res;
		}
		else{
			return next_sum - now_sum + sub_res;
		}
	}
}

/*
int swap_1x2_1x2(int x1, int y1, int x2, int y2, int **KG){
	if(x1 == x2 && ABS(y1 - y2) <= 2){
		return 0;
	}
	else{
		int i, j, s, t, now_sum = 0, next_sum = 0, tmp, res, sub_res = 0;
		sub_res += swap_1x1(x1, y1, x1, y1 + 1, KG);
		sub_res += swap_1x1(x2, y2, x2, y2 + 1, KG);
		for(s = -1; s <= 1; s++){
			for(t = -1; t <= 1; t++){
				now_sum += E[KG[x1][y1]][KG[x1 + s][y1 + t]];
				now_sum += E[KG[x1][y1 + 1]][KG[x1 + s][y1 + 1 + t]];
				now_sum += E[KG[x2][y2]][KG[x2 + s][y2 + t]];
				now_sum += E[KG[x2][y2 + 1]][KG[x2 + s][y2 + 1 + t]];
			}
		}
		tmp = KG[x1][y1];
		KG[x1][y1] = KG[x2][y2];
		KG[x2][y2] = tmp;
		tmp = KG[x1][y1 + 1];
		KG[x1][y1 + 1] = KG[x2][y2 + 1];
		KG[x2][y2 + 1] = tmp;
		res = swap_1x1(x1, y1, x1, y1 + 1, KG);
		res = swap_1x1(x2, y2, x2, y2 + 1, KG);
		for(s = -1; s <= 1; s++){
			for(t = -1; t <= 1; t++){
				next_sum += E[KG[x1][y1]][KG[x1 + s][y1 + t]];
				next_sum += E[KG[x1][y1 + 1]][KG[x1 + s][y1 + 1 + t]];
				next_sum += E[KG[x2][y2]][KG[x2 + s][y2 + t]];
				next_sum += E[KG[x2][y2 + 1]][KG[x2 + s][y2 + 1 + t]];
			}
		}
		if(now_sum > next_sum){
			tmp = KG[x1][y1];
			KG[x1][y1] = KG[x2][y2];
			KG[x2][y2] = tmp;
			tmp = KG[x1][y1 + 1];
			KG[x1][y1 + 1] = KG[x2][y2 + 1];
			KG[x2][y2 + 1] = tmp;
			res = swap_1x1(x1, y1, x1, y1 + 1, KG);
			res = swap_1x1(x2, y2, x2, y2 + 1, KG);
			return sub_res;
		}
		else{
			return next_sum - now_sum;
		}
	}
}
*/
/*
int swap_2x2(int x1, int y1, int x2, int y2, int **KG){
	if(ABS(x1 - x2) <= 2 && ABS(y1 - y2) <= 2){
		return 0;
	}
	else{
		int i, j, s, t, now_sum = 0, next_sum = 0, tmp, res;
		res = optimization_2x2(x1, y1, KG);
		res = optimization_2x2(x2, y2, KG);
		for(i = 0; i <= 1; i++){
			for(j = 0; j <= 1; j++){
				for(s = -1; s <= 1; s++){
					for(t = -1; t <= 1; t++){
						now_sum += E[KG[x1 + i][y1 + j]][KG[x1 + i + s][y1 + j + t]];
						now_sum += E[KG[x2 + i][y2 + j]][KG[x2 + i + s][y2 + j + t]];
					}
				}
			}
		}
		for(i = 0; i <= 1; i++){
			for(j = 0; j <= 1; j++){
				tmp = KG[x1 + i][y1 + j];
				KG[x1 + i][y1 + j] = KG[x2 + i][y2 + j];
				KG[x2 + i][y2 + j] = tmp;
			}
		}
		res = optimization_2x2(x1, y1, KG);
		res = optimization_2x2(x2, y2, KG);
		for(i = 0; i <= 1; i++){
			for(j = 0; j <= 1; j++){
				for(s = -1; s <= 1; s++){
					for(t = -1; t <= 1; t++){
						next_sum += E[KG[x1 + i][y1 + j]][KG[x1 + i + s][y1 + j + t]];
						next_sum += E[KG[x2 + i][y2 + j]][KG[x2 + i + s][y2 + j + t]];
					}
				}
			}
		}
		if(now_sum > next_sum){
			for(i = 0; i <= 1; i++){
				for(j = 0; j <= 1; j++){
					tmp = KG[x1 + i][y1 + j];
					KG[x1 + i][y1 + j] = KG[x2 + i][y2 + j];
					KG[x2 + i][y2 + j] = tmp;
				}
			}
			res = optimization_2x2(x1, y1, KG);
			res = optimization_2x2(x2, y2, KG);
			return 0;
		}
		else{
			return next_sum - now_sum;
		}
	}
}
*/

int score(int K, int **KG){
	int i, j, s, t, sum = 0;
	for(i = 1; i <= K; i++){
		for(j = 1; j <= K; j++){
			for(s = -1; s <= 1; s++){
				for(t = -1; t <= 1; t++){
					sum += E[KG[i][j]][KG[i + s][j + t]];
				}
			}
		}
	}
	return sum / 2;
}

int main(){
//	FILE *file1 = fopen("testcase.in", "r"), *file2 = fopen("result.out", "w");
	int N, M, u, v, w, i, j;
	scanf("%d%d", &N, &M);
	E = (int **)malloc(sizeof(int *) * (N + 1));
	for(i = 0; i <= N; i++){
		E[i] = (int *)malloc(sizeof(int) * (N + 1));
		for(j = 0; j <= N; j++){
			E[i][j] = 0;
		}
	}
	for(i = 0; i < M; i++){
		scanf("%d%d%d", &u, &v, &w);
		E[u][v] = w;
		E[v][u] = w;
	}
	int Vemb, Eemb;
	scanf("%d%d", &Vemb, &Eemb);
	int K = qurt(N), L = qurt(Vemb);
	int z1, z2;
	va = (pos *)malloc(sizeof(pos) * Eemb);
	vb = (pos *)malloc(sizeof(pos) * Eemb);
	for(i = 0, j = 0; i < Eemb; i++){
		scanf("%d%d", &z1, &z2);
		z1 += L - 1;
		z2 += L - 1;
		va[j].x = z1 / L;
		va[j].y = z1 % L + 1;
		vb[j].x = z2 / L;
		vb[j].y = z2 % L + 1;
		if(va[j].x <= K && va[j].y <= K && vb[j].x <= K && vb[j].y <= K){
			j++;
		}
	}
	Eemb = j;
/*	for(i = 0; i < Eemb; i++){
		printf("i = %d: (%d, %d) - (%d, %d)\n", i, va[i].x, va[i].y, vb[i].x, vb[i].y);
	}
*/
	int Repeat = 1000, r;
	int **is_used = (int **)malloc(sizeof(int *) * Repeat);
	int ***KG = (int ***)malloc(sizeof(int **) * Repeat);
	srand((unsigned)time(NULL));

/*	int rest, tmp, rand_num;
	int *rand_perm = (int *)malloc(sizeof(int) * (N + 1));
	for(i = 0; i <= N; i++){
		rand_perm[i] = i;
	}
*/	
	time_t c0 = time(NULL);
	for(r = 0; r < Repeat && time(NULL) - c0 < 10; r++){
		is_used[r] = (int *)malloc(sizeof(int) * (N + 1));
		for(i = 0; i <= N; i++){
			is_used[r][i] = 0;
		}

		KG[r] = (int **)malloc(sizeof(int *) * (K + 2));
		for(i = 0; i <= K + 1; i++){
			KG[r][i] = (int *)malloc(sizeof(int) * (K + 2));
			for(j = 0; j <= K + 1; j++){
				KG[r][i][j] = 0;
			}
		}

/*		for(i = 1, rest = N; i <= K; i++){
			for(j = 1; j <= K; j++){
				if(rest > 0){
					rand_num = rand() % rest + 1;
					KG[r][i][j] = rand_perm[rand_num];
					tmp = rand_perm[rand_num];
					rand_perm[rand_num] = rand_perm[rest];
					rand_perm[rest] = tmp;
					rest--;
				}
			}
		}
*/
		int first = rand() % N + 1;
		KG[r][1][1] = first;
		is_used[r][first] = 1;

/*		if(r % 2 == 0){
			for(i = 1; i <= K; i++){
				for(j = 1; j <= K; j++){
					if(!(i == 1 && j == 1)){
						put(i, j, N, KG[r], is_used[r]);
					}
				}
			}
		}
		else{
			for(i = 2; i <= K; i++){
				for(j = 1; j < i; j++){
					put(j, i, N, KG[r], is_used[r]);
				}
				for(j = i; j >= 1; j--){
					put(i, j, N, KG[r], is_used[r]);
				}
			}
		}
*/

		for(i = 2; i <= K; i++){
			for(j = 1; j < i; j++){
				put(j, i, N, KG[r], is_used[r]);
			}
			for(j = i; j >= 1; j--){
				put(i, j, N, KG[r], is_used[r]);
			}
		}

//		printf("(r, pre_score) = (%d, %d)\n", r, score(K, KG[r]));

		int x1, y1, x2, y2, e1, e2, swap_1x1_num, swap_2x2_num, optimization_2x2_num, swap_2_to_2_num;

		for(i = 0; i < 100; i++){
			swap_1x1_num = 0;
			for(x1 = 1; x1 <= K; x1++){
				for(y1 = 1; y1 <= K; y1++){
					for(x2 = 1; x2 <= K; x2++){
						for(y2 = 1; y2 <= K; y2++){
							swap_1x1_num += swap_1x1(x1, y1, x2, y2, KG[r]);
						}
					}
				}
			}
//			printf("(i, swap_1x1_num) = (%d, %d)\n", i, swap_1x1_num);
			optimization_2x2_num = 0;
			for(x1 = 1; x1 < K; x1++){
				for(y1 = 1; y1 < K; y1++){
					optimization_2x2_num += optimization_2x2(x1, y1, KG[r]);
				}
			}
//			printf("(i, optimization_2x2_num) = (%d, %d)\n", i, optimization_2x2_num);
			if(swap_1x1_num == 0 && optimization_2x2_num == 0){
				break;
			}
		}

/*		int border = 1;
		for(i = 0; i < 100; i++){
			swap_2_to_2_num = 0;
			for(e1 = 0; e1 < Eemb; e1++){
				for(e2 = 0; e2 < Eemb; e2++){
					if(E[KG[r][va[e1].x][va[e1].y]][KG[r][vb[e1].x][vb[e1].y]] >= border && E[KG[r][va[e2].x][va[e2].y]][KG[r][vb[e2].x][vb[e2].y]] >= border){
						swap_2_to_2_num += swap_2_to_2(e1, e2, KG[r]);
					}
				}
			}
			printf("(i, swap_2_to_2_num) = (%d, %d)\n", i, swap_2_to_2_num);
			if(swap_2_to_2_num == 0){
				break;
			}
		}
*/
/*		for(i = 0; i < 5; i++){
			swap_1x1_num = 0;
			for(x1 = 1; x1 <= K; x1++){
				for(y1 = 1; y1 <= K; y1++){
					for(x2 = 1; x2 <= K; x2++){
						for(y2 = 1; y2 <= K; y2++){
							swap_1x1_num += swap_1x1(x1, y1, x2, y2, KG[r]);
						}
					}
				}
			}
//			printf("(i, swap_1x1_num) = (%d, %d)\n", i, swap_1x1_num);
		}
*/
/*		for(i = 0; i < 5; i++){
			optimization_2x2_num = 0;
			for(x1 = 1; x1 < K; x1++){
				for(y1 = 1; y1 < K; y1++){
					optimization_2x2_num += optimization_2x2(x1, y1, KG[r]);
				}
			}
			printf("(i, optimization_2x2_num) = (%d, %d)\n", i, optimization_2x2_num);
		}
*/
	}

	Repeat = r;
//	printf("Repeat = %d\n", Repeat);

	int now_score, max_score = -1, max_num;
	for(r = 0; r < Repeat; r++){
		now_score = score(K, KG[r]);
//		printf("(r, score) = (%d, %d)\n", r, now_score);
		if(now_score > max_score){
			max_score = now_score;
			max_num = r;
		}
	}

	for(i = 1; i <= K; i++){
		for(j = 1; j <= K; j++){
			if(KG[max_num][i][j] > 0){
				printf("%d %d\n", KG[max_num][i][j], (i - 1) * L + (j - 1) + 1);
			}
		}
	}
	return 0;
}

Submission Info

Submission Time
Task A - Problem 2
User abc050
Language C (GCC 5.4.1)
Score 0
Code Size 13306 Byte
Status RE
Exec Time 99 ms
Memory 1152 KB

Compile Error

./Main.c: In function ‘main’:
./Main.c:327:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &N, &M);
  ^
./Main.c:336:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &u, &v, &w);
   ^
./Main.c:341:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &Vemb, &Eemb);
  ^
./Main.c:347:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &z1, &z2);
   ^

Judge Result

Set Name sample_00 sample_01 random_00 random_01 random_02 random_03 random_04 random_05 random_06 random_07 random_08 random_09 random_10 random_11 random_12 random_13 random_14 random_15 random_16 random_17 random_18 random_19 random_20 random_21 random_22 random_23 random_24 random_25 random_26 random_27
Score / Max Score 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000 0 / 1000000
Status
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
RE × 1
Set Name Test Cases
sample_00 00_sample_00
sample_01 00_sample_01
random_00 10_random_00
random_01 10_random_01
random_02 10_random_02
random_03 10_random_03
random_04 10_random_04
random_05 10_random_05
random_06 10_random_06
random_07 10_random_07
random_08 10_random_08
random_09 10_random_09
random_10 10_random_10
random_11 10_random_11
random_12 10_random_12
random_13 10_random_13
random_14 10_random_14
random_15 10_random_15
random_16 10_random_16
random_17 10_random_17
random_18 10_random_18
random_19 10_random_19
random_20 10_random_20
random_21 10_random_21
random_22 10_random_22
random_23 10_random_23
random_24 10_random_24
random_25 10_random_25
random_26 10_random_26
random_27 10_random_27
Case Name Status Exec Time Memory
00_sample_00 RE 96 ms 128 KB
00_sample_01 RE 95 ms 128 KB
10_random_00 RE 95 ms 128 KB
10_random_01 RE 95 ms 256 KB
10_random_02 RE 96 ms 128 KB
10_random_03 RE 97 ms 1024 KB
10_random_04 RE 96 ms 128 KB
10_random_05 RE 95 ms 128 KB
10_random_06 RE 97 ms 640 KB
10_random_07 RE 98 ms 768 KB
10_random_08 RE 96 ms 384 KB
10_random_09 RE 98 ms 384 KB
10_random_10 RE 99 ms 512 KB
10_random_11 RE 95 ms 128 KB
10_random_12 RE 96 ms 256 KB
10_random_13 RE 98 ms 512 KB
10_random_14 RE 98 ms 384 KB
10_random_15 RE 98 ms 896 KB
10_random_16 RE 95 ms 256 KB
10_random_17 RE 98 ms 1152 KB
10_random_18 RE 95 ms 128 KB
10_random_19 RE 96 ms 640 KB
10_random_20 RE 97 ms 256 KB
10_random_21 RE 97 ms 896 KB
10_random_22 RE 99 ms 1024 KB
10_random_23 RE 95 ms 256 KB
10_random_24 RE 96 ms 640 KB
10_random_25 RE 95 ms 256 KB
10_random_26 RE 97 ms 256 KB
10_random_27 RE 97 ms 384 KB