20联赛集训day7

rdx是真的牛逼

题面

A. [20联赛集训day7]稻草富翁

看一下转一轮后会不会增加数。

注意一下等于\(0\)的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <bits/stdc++.h>
using namespace std;

int a, b, c, d, e, f;
bool check() {
if (d == 0) return 0;
if (c == 0) return 1;
if (b == 0) return 0;
if (a == 0) return 1;
if (f == 0) return 0;
if (e == 0) return 1;
return b * 1ll * d * 1ll * f > a * 1ll * c * 1ll * e;
}

int main() {
int -;
for (scanf("%d", &-); -; ---) {
scanf("%d %d %d %d %d %d", &a, &b, &c, &d, &e, &f);
bool pd = check();
if (pd) puts("MEI");
else puts("FON");
}
return 0;
}

B. [20联赛集训day7]序列

区间加就差分,对操作也差分。

无非就是要知道某个操作做了多少次,倒着差分就可以了。

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
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 4, MOD = 1e9 + 7;
int n, q, a[N], b[N];

struct data {
int op, l, r;
} now[N];

int main() {
scanf("%d %d", &n, &q);
for (int i = 1; i <= q; i++) scanf("%d %d %d", &now[i].op, &now[i].l, &now[i].r);
b[q + 1] = 1;
for (int i = q; i >= 1; i--) {
b[i] = (b[i + 1] + b[i]) % MOD;
if (now[i].op == 1) {
a[now[i].l] = (a[now[i].l] + b[i]) % MOD;
a[now[i].r + 1] = ((a[now[i].r + 1] - b[i]) % MOD + MOD) % MOD;
} else {
b[now[i].r] = (b[now[i].r] + b[i]) % MOD;
b[now[i].l - 1] = ((b[now[i].l - 1] - b[i]) % MOD + MOD) % MOD;
}
}
for (int i = 1; i <= n; i++) {
a[i] = (a[i - 1] + a[i]) % MOD;
printf("%d ", a[i]);
}
return putchar('\n'), 0;
}

C. [20联赛集训day7]求和

反正都是原题,下一篇吧。