Logo Wy Online Judge

WyOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#99#7. 「WyOJ Round 1」归 · 星穗垂野Pigsyy1007365ms549028kbC++234.2kb2025-04-16 18:40:192025-04-18 20:48:41

answer

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

template <class S>
struct persistent {
	#define add emplace_back
	struct Node {
		int ls, rs;
		S info;
		Node() {}
		Node(int a, int b, S c): ls(a), rs(b), info(c) {}
	};
	std::vector<Node> tr;
	std::vector<int> root;
	int version, n;
	persistent() {
		version = 0, n = 1 << 30;
		tr.add(0, 0, 1ll << 60), root.add(0);
	}
	persistent(int n): persistent(vector<S>(n, 1ll << 60)) {}
	persistent(vector<S> t) { init(t); }
	void clear() {
		vector<Node>().swap(tr), vector<int>().swap(root);
		assert(tr.empty()), assert(root.empty());
		init(vector<S>(n, 1ll << 60));
	}
	void init(vector<S> t) {
		version = 0, n = t.size(), tr.add();
		auto build = [&](auto rec, int l, int r) -> int {
			tr.add(0, 0, 1ll << 60); int u = tr.size() - 1;
			if (l == r) return tr[u].info = t[l], u;
			int mid = l + r >> 1;
			tr[u].ls = rec(rec, l, mid), tr[u].rs = rec(rec, mid + 1, r);
			tr[u].info = tr[tr[u].ls].info + tr[tr[u].rs].info;
			return u;
		};
		root.add(build(build, 0, n - 1));
	}
	void set(int x, S t, bool ok = true) {
		auto modify = [&](auto rec, int u, int l, int r) -> int {
			tr.add(tr[u]); int v = tr.size() - 1;
			if (l == r) return tr[v].info = t, v;
			int mid = l + r >> 1;
			if (mid >= x) tr[v].ls = rec(rec, tr[u].ls, l, mid);
			else tr[v].rs = rec(rec, tr[u].rs, mid + 1, r);
			tr[v].info = tr[tr[v].ls].info + tr[tr[v].rs].info;
			return v;
		};
		if (ok) root.add(modify(modify, root[version ++], 0, n - 1));
		else root[version] = modify(modify, root[version], 0, n - 1);
	}
	S operator[] (pair<int, int> seg) {
		int L = seg.first, R = seg.second;
		auto query = [&](auto rec, int u, int l, int r) -> S {
			if (l >= L && r <= R) return tr[u].info;
			int mid = l + r >> 1;
			if (mid >= L && mid < R)
				return rec(rec, tr[u].ls, l, mid) + rec(rec, tr[u].rs, mid + 1, r);
			else if (mid >= L) return rec(rec, tr[u].ls, l, mid);
			else return rec(rec, tr[u].rs, mid + 1, r);
		};
		return query(query, root[version], 0, n - 1);
	}
	S operator[] (int x) {
		auto query = [&](auto rec, int u, int l, int r) -> S {
			if (l == r) return tr[u].info;
			int mid = l + r >> 1;
			if (mid >= x) return rec(rec, tr[u].ls, l, mid);
			else return rec(rec, tr[u].rs, mid + 1, r);
		};
		return query(query, root[version], 0, n - 1);
	}
	void unroll(int ver) {
		// assert(ver <= version);
		root.add(root[ver]), version ++;
	}
	#undef add
};

const i64 inf = 1ll << 60;
struct S {
	i64 v;
	S(): v(inf) {}
	S(i64 _v): v(_v) {}
	S operator+ (S T) { return min(v, T.v); }
};

const int maxn = 100005, maxlog = 17;

int n, C;
int a[maxn], b[maxn], c[maxn];
int ver[maxn], st[maxn][maxlog];

int GCD(int l, int r) {
	int k = __lg(r - l + 1);
	return __gcd(st[l][k], st[r - (1 << k) + 1][k]);
}

int main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int T;
	cin >> T;

	while (T -- ) {
		cin >> n >> C;
		for (int i = 1; i <= n; i ++)
			cin >> a[i], st[i][0] = a[i];
		for (int i = 1; i <= n; i ++)
			cin >> b[i], b[i] += b[i - 1];

		for (int j = 1; j <= __lg(n); j ++)
			for (int i = 1; i + (1 << j) - 1 <= n; i ++)
				st[i][j] = __gcd(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);

		persistent<S> dp(n + 1);
		dp.set(0, 0), ver[0] = dp.version;
		for (int i = 1; i <= n; i ++) {
			int cur = a[i], lim = i - 1;
			std::vector<int> sep = {i};
			while (1) {
				int lo = 1, ro = lim; lim = -1;
				while (lo <= ro) {
					int mid = lo + ro >> 1;
					if (GCD(mid, i) != cur) lo = mid + 1, lim = mid - 1;
					else ro = mid - 1;
				}
				if (lim == -1) break;
				sep.push_back(lim + 1), cur = GCD(lim + 1, i);
			}
			sep.push_back(0);
			assert(sep.size() <= maxlog + 1);
			for (int j = 0; j + 1 < sep.size(); j ++) {
				int v = GCD(sep[j], i), p = min(i - v + 1, sep[j]);
				if (p > sep[j + 1]) {
					int t = dp.version;
					dp.unroll(ver[p - 1]);
					i64 w = dp[{0, v}].v;
					dp.unroll(t);
					dp.set(i - p + 1, min(w + (i64)v * (b[i] - b[p - 1]) + C, dp[i - p + 1].v));
				}
			}
			ver[i] = dp.version;
		}

		// if (dp[{1, n}].v >= 1e16) cout << -1 << endl;
		cout << dp[{1, n}].v << endl;
	}


	return 0;
}

这程序好像有点Bug,我给组数据试试?

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 27ms
memory: 5500kb

input:

1000
10 -759451753
8 10 5 7 5 10 6 10 2 1
5 6 5 4 9 8 5 4 1 3
10 -953033990
4 10 10 8 8 2 1 7 4 1
0 ...

output:

-2278355214
-2859101918
-21349075
-1203387136
-1290642033
-851981042
-648655823
-1699966984
-1493814...

result:

ok 1000 numbers

Test #2:

score: 10
Accepted
time: 384ms
memory: 79232kb

input:

5
94253 6998801
88374 94432 21568 79110 3746 94223 86214 12083 54743 1622 16110 18595 18994 3665 547...

output:

6999125
764376403
718240695
1381649585
885156744

result:

ok 5 number(s): "6999125 764376403 718240695 1381649585 885156744"

Test #3:

score: 10
Accepted
time: 3ms
memory: 5652kb

input:

5
120 -848255662
53358 95098 92852 36846 80052 83050 44071 22632 50005 52339 7339 38495 66618 6337 5...

output:

-11025209476
-3953017107
-5975377615
-2466586019
-5823678268

result:

ok 5 number(s): "-11025209476 -3953017107 -5975377615 -2466586019 -5823678268"

Test #4:

score: 10
Accepted
time: 6ms
memory: 5600kb

input:

5
100 -964452256
94167 36596 60051 82090 55625 56197 94589 29844 14929 68497 81714 90264 66283 96767...

output:

-7714370390
-19569375783
-554464800
-1059581333
-6827008162

result:

ok 5 number(s): "-7714370390 -19569375783 -554464800 -1059581333 -6827008162"

Test #5:

score: 10
Accepted
time: 19ms
memory: 7240kb

input:

5
984 -715414516
65632 15191 55392 53178 88695 20308 44882 16528 12986 81169 76880 2239 81264 13866 ...

output:

-72952473687
-64021627506
-700730085
-994178012
-1624804963

result:

ok 5 number(s): "-72952473687 -64021627506 -700730085 -994178012 -1624804963"

Test #6:

score: 10
Accepted
time: 1286ms
memory: 547236kb

input:

5
83593 -175988991
46605 26358 5204 30137 41225 11710 75224 14130 56433 62524 29873 59483 22318 2619...

output:

-1656361289384
-4920133073293
-1028097824
-2809116480
-22668175189

result:

ok 5 number(s): "-1656361289384 -4920133073293 ...097824 -2809116480 -22668175189"

Test #7:

score: 10
Accepted
time: 1505ms
memory: 547508kb

input:

5
96302 -451340376
2672 47391 49737 61648 38099 10679 28316 91168 97182 40556 20560 89630 45931 9187...

output:

-4877361987440
-9327808595024
-261498007
97842263
-37427524204

result:

ok 5 number(s): "-4877361987440 -9327808595024 -261498007 97842263 -37427524204"

Test #8:

score: 10
Accepted
time: 1458ms
memory: 549028kb

input:

5
82075 -915749780
41503 94470 21657 60519 10090 65640 80911 29436 63096 68715 79609 87499 26240 606...

output:

-8500967499879
-2162204721519
-803472133
-6968294203
-60694304098

result:

ok 5 number(s): "-8500967499879 -2162204721519 ...472133 -6968294203 -60694304098"

Test #9:

score: 10
Accepted
time: 1373ms
memory: 547424kb

input:

5
86206 -158351237
12910 53574 97622 75378 61116 40492 87106 60678 72614 2146 43673 15147 23123 7469...

output:

-1508037508585
-4714642449519
-3202809425
-6778545312
-12974512083

result:

ok 5 number(s): "-1508037508585 -4714642449519 ...809425 -6778545312 -12974512083"

Test #10:

score: 10
Accepted
time: 1304ms
memory: 548920kb

input:

5
87683 -236086252
88768 76878 54808 98282 70961 83599 48353 34381 40413 95288 24241 74500 52966 994...

output:

-2319782085288
-10990638538852
-1651187059
-12428157994
-22719490815

result:

ok 5 number(s): "-2319782085288 -10990638538852...87059 -12428157994 -22719490815"

Extra Test:

score: 0
Extra Test Passed