QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#558929#8946. 一眼丁真skip200420 1516ms4024kbC++203.1kb2024-09-11 19:19:562024-09-11 19:19:57

Judging History

你现在查看的是最新测评结果

  • [2024-09-11 19:19:57]
  • 评测
  • 测评结果:20
  • 用时:1516ms
  • 内存:4024kb
  • [2024-09-11 19:19:56]
  • 提交

answer

#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
namespace rgs = std::ranges;
using std::cin, std::cout;
using ll = long long;
using u64 = unsigned long long;
using db = double;
using cp = std::complex<db>;
const db pi = std::acos(-1), sqrt_pi = std::sqrt(pi);
db dot(const cp & x, const cp & y) {
	return x.real() * y.real() + x.imag() * y.imag();
}
db det(const cp & x, const cp & y) {
	return x.real() * y.imag() - x.imag() * y.real();
}
db dist(const cp & a, const cp & b, const cp & x) {
	if(dot(a - b, x - b) <= 0) return abs(x - b);
	if(dot(b - a, x - a) <= 0) return abs(x - a);
	return fabs(det(a - x, b - x) / abs(a - b));
}
db logdiff(db l, db r) {
	static constexpr db vv = log(0.554);
	db vr = - r * r - log(fabs(r)) + vv;
	db vl = - l * l - log(fabs(l)) + vv;
	return std::max(vl, vr) + log(1 - exp(-fabs(vr - vl)));
}
std::pair<db, db> findmax(db a, db c, auto f) {
	auto g = [&](db l, db r) {
		return l + (r - l) * (std::numbers::phi_v<db> - 1);
	};
	db b = g(a, c), bv = f(b);
	for(int i = 0;i < 20;++i) {
		db x = g(a, b), xv = f(x);
		if(xv > bv) { // change here if findmin
			c = b, b = x, bv = xv;
		} else {
			a = c, c = x;
		}
	}
	return {b, bv};
} // log1.618 (2) ≈ 1.44
void solve() {
	int N, n;
	cin >> N >> n;
	std::vector<cp> a(N);
	cp aver = 0;
	for(int i = 0;i < N;++i) {
		db u, v;
		cin >> u >> v;
		a[i] = cp(u, v);
		aver += a[i];
	}
	aver /= N;
	for(int i = 0;i < N;++i) {
		a[i] -= aver;
	}
	double P = -1. / 0; int ans = -1;
	for(int i = std::max(3, n - 5);i <= n;++i) {
		db l = 0, r = 2 * pi / i;
		std::vector<cp> B(i);
		for(int j = 0;j < i;++j)
			B[j] = std::polar(1., r * j);
		auto eval = [&](db ang) {
			cp rotate = std::polar(1., ang);
			static constexpr db sig = 0.01, div = 2 * sig * sig;
			db logsum = 0;
			for(int j = 0;j < N;++j) {
				cp o = a[j] * rotate;
				std::vector<db> s(i);
				for(int k = 0;k < i;++k) {
					cp u = B[k], v = B[k == i - 1 ? 0 : k + 1];
					cp t = (v - u) / r;
					u -= o;
					// \int 1/sqrt(2 pi)/sigma e^{-|u + t x|^2/2/sigma^2}
					db A = norm(t) / div, B = 2 * dot(u, t) / div, C = norm(u) / div;
					db sqrt_a = std::sqrt(A);
					// db prod = sqrt_pi / 2 / sqrt_a * exp(B * B / (4 * A) - C);
					db lprod = log(sqrt_pi / 2 / sqrt_a) + (B * B / (4 * A) - C);
					db e0 = (2 * A * r + B) / 2 / sqrt_a;
					db e1 = (2 * A * 0 + B) / 2 / sqrt_a;
					db delta = std::erf(e0) - std::erf(e1);
					if(delta >= 1e-6) {
						s[k] = log(delta) + lprod;
					} else {
						s[k] = logdiff(e0, e1) + lprod;
					}
				}
				db sum = 0;
				iter_swap(s.begin(), max_element(s.begin(), s.end()));
				for(db v : s) sum += exp(v - s[0]);
				logsum += s[0] + log(sum);
				logsum -= log(sig * sqrt(2 * pi)); 
			}
			return logsum;
		};


		auto [p0, max] = findmax(l, r, eval);

		if(max > P) {
			P = max;
			ans = i;
		}
	}
	cout << ans << '\n';
}
int main() {
#ifdef zqj

	freopen("1.in", "r", stdin);
#endif 
	std::ios::sync_with_stdio(false), cin.tie(0);
	int T; cin >> T;
	for(int i = 0;i < T;++i) {
		solve();
	}
}

Details

Tip: Click on the bar to expand more detailed information

Pretests


Final Tests

Test #1:

score: 10
Accepted
time: 1508ms
memory: 4024kb

input:

200
1000 4
-1.65882 -0.468078
-0.559879 0.302541
-1.67025 -0.452322
-0.54312 -1.40252
0.116365 -0.958391
-1.57137 -0.386501
-1.20353 -0.13415
0.123479 -0.934878
-0.597084 -1.41011
-1.69629 -0.489381
-0.0114821 -1.03665
-0.546439 -1.39593
-0.573469 -1.41618
-1.06124 -1.4763
-1.52521 -0.371347
-1.4609...

output:

4
4
3
4
4
3
3
4
4
3
4
4
4
3
4
4
3
4
4
4
4
3
4
3
4
3
3
3
4
3
3
3
3
3
3
3
3
3
4
3
3
4
3
4
3
3
3
3
4
3
3
3
3
4
3
4
3
3
4
4
3
4
3
4
3
4
4
3
3
3
4
3
3
3
4
4
3
3
3
3
4
4
3
3
3
4
3
3
3
3
4
3
4
3
3
3
4
3
3
4
3
3
4
3
4
4
3
3
4
4
3
4
3
4
4
4
3
4
3
4
3
3
3
3
4
3
4
3
3
3
3
3
3
3
4
4
4
3
4
4
3
4
4
4
4
3
3
3
3
3
...

result:

ok #(wrong) = 0, #(correct) = 200

Test #2:

score: 10
Accepted
time: 1516ms
memory: 4000kb

input:

200
1000 4
0.22827 0.536959
-0.743134 0.215561
-0.0821736 -0.804273
0.470104 -0.194576
0.819679 0.553173
0.212657 0.515942
-0.379762 -0.349824
0.140334 -0.864474
-0.033494 0.513621
0.673108 0.243877
0.716308 0.318053
-0.108843 -0.719375
0.102132 -0.924612
0.0141018 -0.921927
0.710421 0.53719
-0.4572...

output:

3
4
3
4
3
3
3
3
4
3
4
4
4
4
4
4
4
3
4
4
3
3
3
4
4
4
4
4
3
3
3
4
4
4
4
4
3
3
3
4
4
4
3
3
4
4
3
4
3
4
3
4
3
3
4
4
3
3
3
4
4
3
4
4
4
4
3
3
3
3
3
3
4
4
3
4
4
4
4
4
3
3
3
4
3
4
3
3
3
3
3
3
3
3
4
4
4
4
4
3
3
3
3
4
3
4
4
3
3
3
4
4
3
4
3
3
4
3
4
3
4
3
4
4
3
4
4
4
3
3
3
3
3
4
4
3
4
4
3
4
4
4
4
4
3
4
3
3
4
3
...

result:

ok #(wrong) = 0, #(correct) = 200

Test #3:

score: 0
Time Limit Exceeded

input:

200
1000 10
0.171063 0.768938
0.339764 0.873943
1.15161 0.672578
0.805594 0.765797
1.15695 0.666805
1.26595 -0.695135
1.20927 0.578729
-0.356686 -0.292753
0.940372 -0.919379
-0.269337 -0.62435
-0.0757841 0.550908
1.52432 0.00176461
-0.366525 0.00974288
0.524328 0.851771
1.37215 0.224858
0.655827 -0....

output:


result:


Test #4:

score: 0
Time Limit Exceeded

input:

200
1000 10
-0.83557 -0.43386
-0.900052 0.302486
0.843787 0.446154
-0.0854311 -0.918758
0.501433 0.844022
-0.955344 -0.173521
0.516729 0.8388
-0.917289 0.0698801
-0.925852 0.0681056
-0.848415 0.471305
0.098655 0.922883
0.958545 0.273256
0.67931 0.611085
-0.951816 -0.0694206
-0.245102 0.947475
0.9397...

output:


result:


Test #5:

score: 0
Time Limit Exceeded

input:

200
1000 20
1.10645 1.72762
0.00828014 0.0575131
-0.300448 0.537454
0.138879 1.67906
0.73884 1.83804
-0.331532 1.01263
1.57294 1.17098
1.61097 0.722726
0.267742 1.7481
0.805786 -0.115483
1.63489 0.918378
0.358705 -0.0984941
-0.303133 1.14962
1.59952 1.0805
-0.22276 1.35792
1.06748 1.74928
1.48122 1....

output:


result:


Test #6:

score: 0
Time Limit Exceeded

input:

200
1000 20
0.306231 0.947555
-0.470695 -0.867584
0.0798229 -0.979712
0.972425 -0.18076
0.205552 0.977367
0.503871 -0.843521
0.931879 -0.34759
-0.528287 -0.821234
0.384399 0.889843
0.0427201 -0.995252
0.911209 0.407903
-0.925169 0.281163
1.01054 0.00777535
0.829844 0.506267
0.145597 -0.98502
-0.2980...

output:


result:


Test #7:

score: 0
Time Limit Exceeded

input:

200
1000 25
-0.150207 0.698438
0.0893216 1.09445
1.69859 -0.01418
0.00876932 1.00054
-0.0563829 0.902229
0.736602 1.41841
-0.147213 0.274848
-0.182403 0.345741
1.63542 -0.149404
1.80616 0.580086
1.56376 -0.247799
0.32449 1.26092
0.627195 1.41568
-0.0382449 -0.105866
0.129226 1.13973
0.0847462 -0.261...

output:


result:


Test #8:

score: 0
Time Limit Exceeded

input:

200
1000 25
0.964683 -0.212993
0.98252 -0.136339
-0.168828 -0.971035
0.865174 -0.484339
0.571258 -0.82591
-0.797776 -0.589278
-0.307998 -0.948622
-0.80831 0.593024
-0.659663 0.745975
0.923635 -0.380449
0.996853 -0.0380425
0.679349 0.732259
-0.0225609 1.00911
0.717309 -0.710159
-0.425272 -0.901905
0....

output:


result:


Test #9:

score: 0
Time Limit Exceeded

input:

200
1000 30
-0.823086 -1.0434
0.105428 -0.15483
-0.502513 -0.953264
0.0771079 -0.121858
-1.23449 0.876862
-0.0812511 -0.664993
-0.241982 0.678029
-0.622296 0.896641
-1.20049 0.882673
-1.88268 -0.190726
0.0489134 -0.354098
0.0159866 -0.415372
-0.167045 -0.751293
-0.0637444 -0.612609
0.0696068 -0.3288...

output:


result:


Test #10:

score: 0
Time Limit Exceeded

input:

200
1000 30
-0.922656 0.353773
0.603763 -0.788179
-0.461439 0.857645
-0.991954 -0.0838754
-0.144937 0.982998
0.605566 -0.771346
0.0629471 0.988433
0.995332 -0.0164629
-0.878948 0.473977
-0.852896 0.501311
0.840425 0.516425
0.440577 0.898323
-0.515795 0.861164
0.116181 -1.00427
-0.477573 -0.879226
0....

output:


result: