Skip to content

Commit 2334b07

Browse files
committed
QOJ: 补题:第十届中国大学生程序设计竞赛总决赛
1 parent a9721ba commit 2334b07

4 files changed

Lines changed: 358 additions & 0 deletions

File tree

QOJ/11106.cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/**
2+
* @file 11106.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-05-11
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
15+
#define maxn 500005
16+
#define maxlgn 22
17+
18+
int64_t a[maxn], val[maxlgn][maxn], mxVal[maxlgn][maxn], gl[maxn], gr[maxn];
19+
int nxt[maxlgn][maxn], lg[maxn];
20+
bool cl[maxn], cr[maxn];
21+
22+
void solve(void) {
23+
int n, q;
24+
cin >> n >> q;
25+
for (int i = 1; i <= n; i++) cin >> a[i];
26+
27+
int64_t sum = 0;
28+
gl[0] = 0;
29+
for (int i = 1; i <= n; i++) {
30+
if ((sum += a[i]) < 0) sum = 0;
31+
gl[i] = max(gl[i - 1], sum);
32+
}
33+
gr[n + 1] = sum = 0;
34+
for (int i = n; i; i--) {
35+
if ((sum += a[i]) < 0) sum = 0;
36+
gr[i] = max(gr[i + 1], sum);
37+
}
38+
39+
a[0] = 0;
40+
for (int i = 1; i <= n; i++) a[i] += a[i - 1];
41+
42+
for (int i = 0; i <= n; i++) mxVal[0][i] = a[i];
43+
for (int t = 1; t < maxlgn; t++)
44+
for (int i = 0; i + (1 << t) - 1 <= n; i++) mxVal[t][i] = max(mxVal[t - 1][i], mxVal[t - 1][i + (1 << (t - 1))]);
45+
46+
auto getMxVal = [&](int l, int r) {
47+
int t = lg[r - l + 1];
48+
return max(mxVal[t][l], mxVal[t][r - (1 << t) + 1]);
49+
};
50+
51+
int64_t cur = a[0];
52+
cl[1] = false;
53+
for (int i = 2; i <= n; i++) cur = min(cur, a[i - 2]), cl[i] = (a[i - 1] - cur >= 0);
54+
cur = a[n];
55+
cr[n] = false;
56+
for (int i = n - 1; i; i--) cur = max(cur, a[i + 1]), cr[i] = (cur - a[i] >= 0);
57+
58+
stack<int> S;
59+
S.push(n + 1);
60+
a[n + 1] = -1e18;
61+
nxt[0][n + 1] = n + 1;
62+
for (int i = n; i >= 0; i--) {
63+
while (a[S.top()] > a[i]) S.pop();
64+
nxt[0][i] = S.top(), val[0][i] = getMxVal(i, S.top() - 1);
65+
S.push(i);
66+
}
67+
for (int t = 1; t < maxlgn; t++)
68+
for (int i = 0; i <= n + 1; i++) {
69+
int j = nxt[t - 1][i];
70+
nxt[t][i] = nxt[t - 1][j], val[t][i] = max(val[t - 1][i], val[t - 1][j] + a[i] - a[j]);
71+
}
72+
73+
while (q--) {
74+
int l, r;
75+
cin >> l >> r;
76+
int64_t xxans = max({(int64_t)0, gl[l - 1], gr[r + 1]});
77+
if (cl[l] || cr[r]) {
78+
cout << -1 << endl;
79+
continue;
80+
}
81+
int p = l - 1;
82+
if (nxt[0][p] > r) {
83+
int64_t ans = max((int64_t)0, getMxVal(l - 1, r - 1) + 1 - a[r]);
84+
cout << ans + max((int64_t)0, xxans - (ans + a[r] - a[l - 1]) + 1) << endl;
85+
continue;
86+
}
87+
p = nxt[0][p];
88+
int64_t delt = a[l - 1] - a[p] + 1, curMxVal = a[l - 1];
89+
if (l < p) curMxVal = max(curMxVal, getMxVal(l, p - 1));
90+
for (int t = maxlgn - 1; ~t; t--)
91+
if (nxt[t][p] <= r) {
92+
curMxVal = max(curMxVal, delt + val[t][p]);
93+
delt += a[p] - a[nxt[t][p]];
94+
p = nxt[t][p];
95+
}
96+
if (p < r) curMxVal = max(curMxVal, delt + getMxVal(p, r - 1));
97+
int64_t ans = delt + max((int64_t)0, curMxVal + 1 - (a[r] + delt));
98+
cout << ans + max((int64_t)0, xxans - (ans + a[r] - a[l - 1]) + 1) << endl;
99+
}
100+
101+
return;
102+
}
103+
104+
int main() {
105+
ios::sync_with_stdio(false), cin.tie(nullptr);
106+
107+
for (int i = 2; i < maxn; i++) lg[i] = lg[i >> 1] + 1;
108+
109+
int _ = 1;
110+
cin >> _;
111+
while (_--) solve();
112+
113+
return 0;
114+
}

QOJ/11111.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/**
2+
* @file 11111.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-05-11
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
15+
#define maxn 200005
16+
#define mod 1'000'000'007
17+
18+
int64_t a[maxn], add[maxn], mul[maxn];
19+
int64_t f[maxn];
20+
21+
void solve(void) {
22+
int n;
23+
cin >> n;
24+
int64_t x = 1;
25+
for (int i = 1; i <= n; i++) cin >> a[i], x = min((__int128_t)1e18, (__int128_t)x * a[i]);
26+
if (x == 1e18) {
27+
int l = 1, r = n;
28+
int64_t ans = 0;
29+
while (a[l] == 1) l++, ans++;
30+
while (a[r] == 1) r--, ans++;
31+
int64_t mul = 1;
32+
for (int i = l; i <= r; i++) mul = mul * a[i] % mod;
33+
cout << (ans + mul) % mod << endl;
34+
return;
35+
}
36+
int m = 0;
37+
for (int l = 1, r; l <= n; l = r + 1) {
38+
r = l;
39+
if (a[l] > 1) {
40+
m++;
41+
add[m] = mul[m] = a[l];
42+
continue;
43+
}
44+
while (r + 1 <= n && a[r + 1] == 1) r++;
45+
m++;
46+
add[m] = r - l + 1, mul[m] = 1;
47+
}
48+
f[0] = 0;
49+
for (int i = 1; i <= m; i++) {
50+
int64_t curMul = mul[i], curAdd = add[i];
51+
f[i] = 0;
52+
for (int j = i - 1; j >= 0; j--) {
53+
f[i] = max(f[i], f[j] + max(curMul, curAdd));
54+
curMul *= mul[j], curAdd += add[j];
55+
}
56+
}
57+
cout << f[m] % mod << endl;
58+
return;
59+
}
60+
61+
int main() {
62+
ios::sync_with_stdio(false), cin.tie(nullptr);
63+
64+
int _ = 1;
65+
cin >> _;
66+
while (_--) solve();
67+
68+
return 0;
69+
}

QOJ/11112.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/**
2+
* @file 11112.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-05-12
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define endl '\n'
14+
mt19937_64 rnd(time(nullptr));
15+
void solve(void) {
16+
int n, k, m;
17+
cin >> n >> k >> m;
18+
set<string> hap;
19+
string s;
20+
auto dfs = [&](auto self, int p, int num) -> void {
21+
if (p == n) {
22+
hap.insert(s);
23+
return;
24+
}
25+
if (num < k) {
26+
s += '1';
27+
self(self, p + 1, num + 1);
28+
s.pop_back();
29+
}
30+
if (num + (n - p - 1) >= k) {
31+
s += '0';
32+
self(self, p + 1, num);
33+
s.pop_back();
34+
}
35+
};
36+
dfs(dfs, 0, 0);
37+
set<string> hp1, hp2;
38+
auto check = [&](string s) -> bool {
39+
auto iz = s;
40+
sort(iz.begin(), iz.end());
41+
for (int i = 0; i < n; i++) {
42+
if (iz == s) return false;
43+
s = s.substr(1) + s[0];
44+
}
45+
return true;
46+
};
47+
for (auto it : hap) {
48+
if (check(it))
49+
hp1.insert(it);
50+
else
51+
hp2.insert(it);
52+
}
53+
cout << (m * k + n - 1) / n << '\n';
54+
vector<string> ans;
55+
while (m >= n && !hp1.empty()) {
56+
auto it = *hp1.begin();
57+
while (hp1.count(it)) {
58+
hp1.erase(it);
59+
ans.push_back(it);
60+
m--;
61+
it = it.substr(1) + it[0];
62+
}
63+
}
64+
int p = 0;
65+
vector<bool> vis(n, false);
66+
while (m--) {
67+
while (vis[p]) p++;
68+
vis[p] = true;
69+
string s(n, '0');
70+
for (int t = 0; t < k; t++) s[p] = '1', p = (p + 1) % n;
71+
ans.push_back(s);
72+
}
73+
for (auto &s : ans) cout << s << endl;
74+
return;
75+
}
76+
77+
int main() {
78+
ios::sync_with_stdio(false), cin.tie(nullptr);
79+
80+
int _ = 1;
81+
cin >> _;
82+
while (_--) solve();
83+
84+
return 0;
85+
}

QOJ/11116.cpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/**
2+
* @file 11116.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-05-11
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#define maxn 100005
14+
15+
using pii = pair<int, int>;
16+
using tiii = tuple<int, int, int>;
17+
18+
int query(int x, int y) {
19+
if (x == y) return 0;
20+
cout << "? " << x + 1 << ' ' << y + 1 << endl;
21+
int ret;
22+
cin >> ret;
23+
return ret;
24+
}
25+
26+
vector<tiii> graph;
27+
28+
void solve(const vector<int>& node, const vector<int>& dist) {
29+
if (node.size() == 1) return;
30+
if (node.size() == 2) return graph.emplace_back(node[0], node[1], dist[1]), void();
31+
32+
int n = node.size(), p = 0;
33+
for (int i = 0; i < n; i++)
34+
if (dist[i] > dist[p]) p = i;
35+
36+
vector<int> pdist;
37+
pdist.push_back(dist[p]);
38+
for (int i = 1; i < n; i++) pdist.push_back(query(node[p], node[i]));
39+
40+
vector<pii> chain;
41+
for (int i = 0; i < n; i++)
42+
if (dist[i] + pdist[i] == dist[p]) chain.emplace_back(dist[i], node[i]);
43+
sort(chain.begin(), chain.end());
44+
45+
for (int i = 1; i < (int)chain.size(); i++)
46+
graph.emplace_back(chain[i - 1].second, chain[i].second, chain[i].first - chain[i - 1].first);
47+
48+
vector<vector<int>> cnode(chain.size()), cdist(chain.size());
49+
for (int i = 0; i < n; i++) {
50+
int w = (dist[i] + pdist[i] - dist[p]) / 2, d = dist[i] - w,
51+
x = lower_bound(chain.begin(), chain.end(), pii{d, 0}) - chain.begin();
52+
cnode[x].push_back(node[i]), cdist[x].push_back(w);
53+
}
54+
55+
for (int i = 0; i < (int)chain.size(); i++) {
56+
for (int j = 0; j < (int)cnode[i].size(); j++)
57+
if (cnode[i][j] == chain[i].second) swap(cnode[i][j], cnode[i][0]), swap(cdist[i][j], cdist[i][0]);
58+
solve(cnode[i], cdist[i]);
59+
}
60+
61+
return;
62+
}
63+
64+
void solve(void) {
65+
int n;
66+
cin >> n;
67+
68+
graph.clear();
69+
70+
vector<int> dist, nodes;
71+
for (int i = 0; i < n; i++) nodes.push_back(i), dist.push_back(query(0, i));
72+
73+
solve(nodes, dist);
74+
75+
cout << "!";
76+
for (auto [x, y, w] : graph) cout << ' ' << x + 1 << ' ' << y + 1 << ' ' << w;
77+
cout << endl;
78+
79+
return;
80+
}
81+
82+
int main() {
83+
ios::sync_with_stdio(false), cin.tie(nullptr);
84+
85+
int _ = 1;
86+
cin >> _;
87+
while (_--) solve();
88+
89+
return 0;
90+
}

0 commit comments

Comments
 (0)