結果

問題 No.691 E869120 and Constructing Array 5
ユーザー e869120e869120
提出日時 2018-05-17 21:27:25
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 2,130 bytes
コンパイル時間 2,100 ms
コンパイル使用メモリ 92,100 KB
実行使用メモリ 12,316 KB
最終ジャッジ日時 2023-09-10 22:39:40
合計ジャッジ時間 7,745 ms
ジャッジサーバーID
(参考情報)
judge13 / judge12
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 TLE -
testcase_02 TLE -
testcase_03 TLE -
testcase_04 TLE -
testcase_05 TLE -
testcase_06 TLE -
testcase_07 TLE -
testcase_08 TLE -
testcase_09 TLE -
testcase_10 TLE -
testcase_11 TLE -
testcase_12 TLE -
testcase_13 TLE -
testcase_14 TLE -
testcase_15 TLE -
testcase_16 TLE -
testcase_17 TLE -
testcase_18 TLE -
testcase_19 TLE -
testcase_20 TLE -
testcase_21 TLE -
testcase_22 TLE -
testcase_23 TLE -
testcase_24 TLE -
testcase_25 TLE -
testcase_26 TLE -
testcase_27 AC 9 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;

struct State {
	long double v; vector<int>t;
};
bool operator<(const State &a1, const State &a2) {
	if (a1.v < a2.v) return true;
	return false;
}

int Rand() {
	return (1 << 20)*(rand() % 1024) + (1 << 10)*(rand() % 1024) + (rand() % 1024);
}

vector<int>concatenate(vector<int>A1, vector<int>A2) {
	vector<int>I;
	for (int i = 0; i < A1.size(); i++) I.push_back(A1[i]);
	for (int i = 0; i < A2.size(); i++) I.push_back(A2[i]);
	return I;
}

vector<int>solve(long double T) {
	vector<State>F; int G1 = T / 8;
	while (F.size() <= 500) {
		int Y = Rand() % (G1*G1);
		long double I = (T / 8) - sqrtl(1.0L*Y);
		long double J = I*I; int K1 = J, K2 = K1 + 1;
		long double L1 = sqrtl(1.0L*Y) + sqrtl(1.0L*K1); if (abs(T / 8 - L1) <= 1.0e-4) { F.push_back(State{ L1, vector<int>{Y, K1} }); }
		long double L2 = sqrtl(1.0L*Y) + sqrtl(1.0L*K2); if (abs(T / 8 - L2) <= 1.0e-4) { F.push_back(State{ L2, vector<int>{Y, K2} }); }
	}
	sort(F.begin(), F.end()); long double EPS1 = T / 8, EPS = 1e-4;
	for (int i = 0; i < 3; i++) {
		vector<State>G; EPS1 *= 2.0L; EPS *= 0.01L;
		for (int j = 0; j < F.size(); j++) {
			long double R1 = (EPS1 - F[j].v);
			int pos1 = lower_bound(F.begin(), F.end(), State{ R1,vector<int>{} }) - F.begin();
			if (pos1 >= 1) {
				long double Y = F[pos1 - 1].v + F[j].v;
				if (abs(Y - EPS1) <= EPS) G.push_back(State{ Y,concatenate(F[pos1 - 1].t,F[j].t) });
			}
			if (pos1 < F.size()) {
				long double Y = F[pos1].v + F[j].v;
				if (abs(Y - EPS1) <= EPS) G.push_back(State{ Y,concatenate(F[pos1].t,F[j].t) });
			}
		}
		F = G;
	}
	if (F.size() == 0) return vector<int>{};
	return F[0].t;
}

int main() {
	srand((unsigned)time(NULL));
	int Q; cin >> Q;
	for (int i = 1; i <= Q; i++) {
		long double P; cin >> P;
		vector<int>Z;
		while (true) {
			Z = solve(P); if (Z.size() >= 1) break;
		}
		long double E = 0;
		cout << Z.size(); for (int j = 0; j < Z.size(); j++) { cout << " " << Z[j]; E += sqrtl(1.0L*Z[j]); }cout << endl;

		//printf("score = %.13Lf\n", abs(P - E));
	}
	return 0;
}
0