T1 总结

赛时总结

若至题。一眼顶针

题目思路

上数据结构 map

题目代码

T2 总结

赛时总结

贪心策略错误,难度排序排成了满意度排序

题目思路

贪,按照难度排序

题目代码

1
2
3
4
5
6
7
8
9
10
11
sort(con + 1, con + c + 1);
sort(pro + 1, pro + p + 1);
ll ans = 0;
ll mx = 0, j = 0;
for(int i = 1; i <= p; i++) {
while(con[j + 1].first <= pro[i].first && j <= c) {
mx = max(mx, con[++j].second);
}
ans += max(0LL, mx - pro[i].second);
}
printf("%lld", ans);

T3 总结

赛时总结

水题,典中典。

题目思路

不难发现横竖无关,单独处理后合并答案

题目代码

T4 总结

赛时总结

完全没有思路,部分分拿满

题目思路

对于绝对值考虑分解,情况分为左边,右边以及未选择。

枚举所有位置,动态维护左边右边以及未选集合,不断用未选集合更新左边,每向右跳动一个考虑右边是否会变成左边。模拟即可

题目代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
for(int i = 1; i <= k; i++) {
B.insert(*C.begin());
sumB += C.begin()->first;
C.erase(C.begin());
}
ll ans = 1e18, pos = 0;
for(int i = 1; i <= n; i++) {
while(!A.empty() && !C.empty() && A.rbegin()->first + i > C.begin()->first - i) {
sumA -= A.rbegin()->first;
A.erase(*A.rbegin());
sumB += C.begin()->first;
B.insert(*C.begin());
C.erase(C.begin());
}
ll now = sumA + sumB + (ll)A.size() * i - (ll)B.size() * i;
// cout << now << endl;
if(now < ans) {
ans = now, pos = i;
}
if(B.count(make_pair(a[i] + i, i))) {
A.insert(make_pair(a[i] - i, i));
sumA += a[i] - i;
B.erase(make_pair(a[i] + i, i));
sumB -= a[i] + i;
}
if(C.count(make_pair(a[i] + i, i))) {
C.erase(make_pair(a[i] + i, i));
}
}
printf("%lld %lld", pos, ans);