Skip to content

Commit 7dde6bd

Browse files
committed
2025“钉耙编程”中国大学生算法设计暑期联赛(8)
1 parent 72e53cd commit 7dde6bd

12 files changed

Lines changed: 502 additions & 2 deletions

File tree

.vscode/extensions.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"ms-python.python",
1010
"ms-vscode.hexeditor",
1111
"mutantdino.resourcemonitor",
12+
"pdconsec.vscode-print",
1213
"pkief.material-icon-theme",
1314
"usernamehw.errorlens",
1415
"vadimcn.vscode-lldb",

.vscode/settings.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
],
55
"cph.general.autoShowJudge": false,
66
"cph.general.firstTime": false,
7-
"cph.general.hideStderrorWhenCompiledOK": false,
87
"cph.general.timeOut": 8000,
9-
"cph.language.cpp.Args": "-std=c++23 -Wall -Wextra -O2 -Wl,--stack=512000000 -DLOCAL",
8+
"cph.language.cpp.Args": "-Wall -Wextra -O2 -DLOCAL",
109
"doxdocgen.file.versionTag": "",
1110
"doxdocgen.generic.authorEmail": "i@macesuted.moe",
1211
"doxdocgen.generic.authorName": "Macesuted",

HDOJ/1179-1003.cpp

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/**
2+
* @file 1179-1003.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-08-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+
using tiii = tuple<int, int, int>;
16+
using tiiii = tuple<int, int, int, int>;
17+
18+
class SegmentTree {
19+
private:
20+
struct Seg {
21+
int vl, l, r, vr;
22+
23+
Seg(void) { vl = vr = 0, l = 0, r = 1e6 + 1; }
24+
};
25+
26+
vector<array<Seg, 2>> a;
27+
vector<int> cnt;
28+
const int n = 1e6;
29+
30+
void merge(int &rl, int &rr, int ll, int lr) const {
31+
if (ll > rr) return rl = rr, void();
32+
if (lr < rl) return rr = rl, void();
33+
return rl = max(ll, rl), rr = min(lr, rr), void();
34+
}
35+
36+
Seg merge(const array<Seg, 2> &lp, const Seg &rp) const {
37+
Seg ans = rp;
38+
39+
int t = 0;
40+
if (ans.vl) {
41+
t = 1;
42+
int l = lp[1].vr, r = ans.vl;
43+
if (l > r) swap(l, r);
44+
merge(ans.l, ans.r, l, r);
45+
}
46+
47+
merge(ans.l, ans.r, lp[t].l, lp[t].r);
48+
ans.vl = lp[t].vl;
49+
50+
return ans;
51+
}
52+
53+
void pushUp(int p) {
54+
cnt[p] = cnt[p << 1] + cnt[p << 1 | 1];
55+
if (!cnt[p << 1]) return a[p] = a[p << 1 | 1], void();
56+
if (!cnt[p << 1 | 1]) return a[p] = a[p << 1], void();
57+
58+
a[p][0] = merge(a[p << 1], a[p << 1 | 1][0]);
59+
a[p][1] = merge(a[p << 1], a[p << 1 | 1][1]);
60+
61+
return;
62+
}
63+
64+
void build(int p, int l, int r) {
65+
if (l == r) return a[p][0] = a[p][1] = Seg(), cnt[p] = 0, void();
66+
int mid = (l + r) >> 1;
67+
build(p << 1, l, mid), build(p << 1 | 1, mid + 1, r);
68+
return pushUp(p);
69+
}
70+
71+
void insert(int p, int l, int r, int qp, int v) {
72+
if (l == r) return a[p][0].vl = v, a[p][1].vr = v, cnt[p] = 1, void();
73+
int mid = (l + r) >> 1;
74+
qp <= mid ? insert(p << 1, l, mid, qp, v) : insert(p << 1 | 1, mid + 1, r, qp, v);
75+
return pushUp(p);
76+
}
77+
void erase(int p, int l, int r, int qp) {
78+
if (l == r) return a[p][0] = a[p][1] = Seg(), cnt[p] = 0, void();
79+
int mid = (l + r) >> 1;
80+
qp <= mid ? erase(p << 1, l, mid, qp) : erase(p << 1 | 1, mid + 1, r, qp);
81+
return pushUp(p);
82+
}
83+
84+
public:
85+
SegmentTree(void) { a.resize(n << 2), cnt.resize(n << 2); }
86+
void build(void) { return build(1, 1, n); }
87+
void insert(int p, int v) { return insert(1, 1, n, p, v); }
88+
void erase(int p) { return erase(1, 1, n, p); }
89+
int query(void) {
90+
Seg ans = a[1][0];
91+
assert(ans.vl);
92+
merge(ans.l, ans.r, ans.vl, ans.vl);
93+
assert(ans.l == ans.r);
94+
return ans.l;
95+
}
96+
};
97+
98+
#define maxn 1000005
99+
#define maxv 1000005
100+
101+
int p[maxn], a[maxn];
102+
int id[maxv];
103+
104+
void solve(void) {
105+
int n, m;
106+
cin >> n >> m;
107+
108+
SegmentTree SGT;
109+
SGT.build();
110+
111+
for (int i = 1; i <= n; i++) cin >> p[i];
112+
for (int i = 1; i <= n; i++) cin >> a[i], id[a[i]] = i, SGT.insert(p[i], a[i]);
113+
114+
while (m--) {
115+
int op;
116+
cin >> op;
117+
if (op == 1) {
118+
int x;
119+
cin >> x;
120+
SGT.erase(p[x]);
121+
cin >> p[x];
122+
SGT.insert(p[x], a[x]);
123+
} else
124+
cout << id[SGT.query()] << endl;
125+
}
126+
}
127+
128+
int main() {
129+
ios::sync_with_stdio(false), cin.tie(nullptr);
130+
131+
int _ = 1;
132+
cin >> _;
133+
while (_--) solve();
134+
135+
return 0;
136+
}

HDOJ/1179-1005.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/**
2+
* @file 1179-1005.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-08-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+
17+
int64_t pre[maxn], dis[maxn], dep[maxn];
18+
int fa[maxn], id[maxn];
19+
20+
void solve(void) {
21+
int q;
22+
cin >> q;
23+
24+
vector<int> path;
25+
path.push_back(1), path.push_back(2);
26+
pre[0] = 0, cin >> pre[1];
27+
dis[1] = dis[2] = 0;
28+
dep[1] = dep[2] = 0;
29+
fa[1] = 1, fa[2] = 2;
30+
id[1] = 0, id[2] = 1;
31+
32+
int n = 2, m = 2, l = 0, r = m - 1;
33+
while (q--) {
34+
int op;
35+
cin >> op;
36+
if (op == 1) {
37+
cin >> pre[m], pre[m] += pre[m - 1];
38+
path.push_back(++n);
39+
dis[n] = 0;
40+
dep[n] = 0;
41+
fa[n] = n;
42+
r = id[n] = m++;
43+
} else if (op == 2) {
44+
int x;
45+
cin >> x >> dis[++n];
46+
dis[n] += dis[x];
47+
int f = fa[n] = fa[x];
48+
dep[f] = max(dep[f], dis[n]);
49+
if (dep[f] == pre[id[f]]) l = max(l, id[f]);
50+
if (dep[f] == pre[m - 1] - pre[id[f]]) r = min(r, id[f]);
51+
} else
52+
cout << pre[r] - pre[l] << endl;
53+
}
54+
55+
return;
56+
}
57+
58+
int main() {
59+
ios::sync_with_stdio(false), cin.tie(nullptr);
60+
61+
int _ = 1;
62+
cin >> _;
63+
while (_--) solve();
64+
65+
return 0;
66+
}

HDOJ/1179-1006.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/**
2+
* @file 1179-1006.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-08-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+
class SegmentTree {
16+
private:
17+
vector<array<array<int64_t, 4>, 4>> a;
18+
int n;
19+
20+
void pushUp(int p, int l, int r) {
21+
int mid = (l + r) >> 1;
22+
for (int i = 0; i < 4; i++)
23+
for (int j = 0; j < 4; j++) a[p][i][j] = 0;
24+
for (int ll = 0; ll < 4; ll++)
25+
for (int lr = 0; lr < 4; lr++)
26+
for (int rl = 0; rl < 4 - lr; rl++)
27+
for (int rr = 0; rr < 4; rr++) {
28+
int pl = ll, pr = rr;
29+
if (ll == mid - l + 1) pl += rl;
30+
if (rr == r - mid) pr += lr;
31+
if (pl < 4 && pr < 4) a[p][pl][pr] = max(a[p][pl][pr], a[p << 1][ll][lr] + a[p << 1 | 1][rl][rr]);
32+
}
33+
return;
34+
}
35+
36+
void build(int p, int l, int r, int v[]) {
37+
if (l == r) {
38+
for (int i = 0; i < 4; i++)
39+
for (int j = 0; j < 4; j++) a[p][i][j] = 0;
40+
a[p][1][1] = v[l];
41+
return;
42+
}
43+
int mid = (l + r) >> 1;
44+
build(p << 1, l, mid, v), build(p << 1 | 1, mid + 1, r, v);
45+
return pushUp(p, l, r);
46+
}
47+
void update(int p, int l, int r, int qp, int v) {
48+
if (l == r) return a[p][1][1] = v, void();
49+
int mid = (l + r) >> 1;
50+
qp <= mid ? update(p << 1, l, mid, qp, v) : update(p << 1 | 1, mid + 1, r, qp, v);
51+
return pushUp(p, l, r);
52+
}
53+
54+
public:
55+
void resize(int _n) { return a.resize((n = _n) << 2); }
56+
void build(int a[]) { return build(1, 1, n, a); }
57+
void update(int p, int v) { return update(1, 1, n, p, v); }
58+
int64_t query(void) {
59+
int64_t ans = 0;
60+
for (int i = 0; i < 4; i++)
61+
for (int j = 0; j < 4 - i; j++) ans = max(ans, a[1][i][j]);
62+
return ans;
63+
}
64+
};
65+
66+
#define maxn 200005
67+
68+
int a[maxn];
69+
70+
void solve(void) {
71+
int n, q;
72+
cin >> n >> q;
73+
for (int i = 1; i <= n; i++) cin >> a[i];
74+
75+
SegmentTree SGT;
76+
SGT.resize(n), SGT.build(a);
77+
78+
cout << SGT.query() << endl;
79+
80+
while (q--) {
81+
int p, v;
82+
cin >> p >> v;
83+
SGT.update(p, v);
84+
cout << SGT.query() << endl;
85+
}
86+
}
87+
88+
int main() {
89+
ios::sync_with_stdio(false), cin.tie(nullptr);
90+
91+
int _ = 1;
92+
cin >> _;
93+
while (_--) solve();
94+
95+
return 0;
96+
}

0 commit comments

Comments
 (0)