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]求和
反正都是原题,下一篇吧。