7.1 测试

7.1 测试

混氏新子 蒟蒻

前情提要

题目链接

成绩表

选手总分dominoqueuearrayhzq
完*400100100100100
方**400100100100100
李**400100100100100
许**39110010010091
袁**37010070100100
黄嘉玮3091001001009
葛**3071001007037
何*2908010100100
杜钊瑞2881001007018
余柏翰2861001005036
陈鑫281100010081
贺彦博254901010054
朱**2471001001037
张芮嘉228100010028
石**20710007037
黄**20010001000
沈**139100101019
张一田1191001009

第二题爆零了啊啊啊啊啊啊啊啊啊啊啊,悲,没进前十

题解

T1

太简单了,直接上代码,希望你不要用 dp。

code
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
31
32
33
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n;
ll u, d;
ll x, y;
bool flag;
int main() {
freopen("domino.in", "r", stdin);
freopen("domino.out", "w", stdout);
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%lld%lld", &x, &y);
u += x;
d += y;
if (x % 2 != y % 2) flag = 1;
}
if ((u & 1) ^ (d & 1)) {
puts("-1");
return 0;
}
if (u % 2 == 0 && d % 2 == 0) {
puts("0");
return 0;
}
if (flag) {
puts("1");
} else {
puts("-1");
}
return 0;
}

T2

爆零了,考虑时间的时候把男生和女生分离了,在考虑女生的时候没有考虑男生。
正解很简单,如果一个女生恰好在前一个女生后就是前一个女生时间 +1 ,不然的话就是前面男生的个数。

code
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
31
#include <bits/stdc++.h>
#define N 1000010
using namespace std;
int tot;
int n;
char s[N];
int len, ans;
int main() {
freopen("queue.in", "r", stdin);
freopen("queue.out", "w", stdout);
scanf("%s", s);
len = strlen(s);
{
int i = 0;
while (len && s[len - 1] == 'M') --len;
while (i < len && s[i] == 'F') ++i;
if (i == len || !len) {
puts("0");
return 0;
}
}
for (int i = 0; i < len; ++i) {
if (s[i] == 'M') ++tot;
else {
ans = max(ans + 1, tot);
}
}
printf("%d", ans);
return 0;
}

T3

离线操作 yyds ,就算在线也可以用个 vector 直接二分。

code
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
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>
#define N 100010
using namespace std;
int n, m;
int ans[N], a[N];
vector <pair <int, int> > q[N];
struct que {
int opt, a, b;
}op[N];
int main() {
freopen("array.in", "r", stdin);
freopen("array.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%d", a + i);
for (int i = 1; i <= m; ++i) {
scanf("%d%d%d", &op[i].opt, &op[i].a, &op[i].b);
if (op[i].opt) {
q[op[i].b].emplace_back(make_pair(i, op[i].a));
}
}
for (auto &i : q[0]) {
ans[i.first] = a[i.second];
}
for (int i = 1; i <= m; ++i) {
if (!op[i].opt) {
a[op[i].a] = op[i].b;
}
for (auto &j : q[i]) {
ans[j.first] = a[j.second];
}
}
for (int i = 1; i <= m; ++i) {
if (op[i].opt) {
printf("%d\n", ans[i]);
}
}
return 0;
}

T4

我当时的方法就是用暴力,然后特殊性质再用 tarjan 就搞定。

我暴力 81 pts,或许能更高。

正解也是用 tarjan,的那不是很懂。

还有一种正解就是先求一棵最小生成树,加一条边构成环。如果能加进去的话必定等于除了这条边的最大值才行,然后这些边都要改成不确定。改加的边容易,那环上的其它最大值的边呢?我们考虑所有边的值都相等,那么当然用树上边差分就行了。那有多个值呢?我能否一个点存多个值的情况最后再查找自己边值的情况呢?于是就要用线段树合并了。由于空间限制,要动态开点。

但是不会写动态开点线段树,再见。

后记

还有很大的进步空间。

  • 标题: 7.1 测试
  • 作者: 混氏新子
  • 创建于 : 2023-07-02 20:08:59
  • 更新于 : 2023-09-24 19:12:23
  • 链接: https://blog.huasushis.cn/2023/7.1 测试/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
此页目录
7.1 测试