T1、石蹴り
\(ソル\) :
ちょうどプッシュ忘れることができるようになりますプッシュし、二つの異なる操作の後の回答に一点の貢献と考えることができます。
それとも、別々にカウント動作のランクを置くことができ、難しいことではありませんラインを見つけて、算術級数が(あまりにも列)であるために、最初に実行(ハング)(XING)ライン操作、メンテナンス、および第一項と寛容の各列に;
時間複雑\(O(M)\) 。
コードは以下の通りであります:
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include <cstdio>
#include <cstring>
#include <algorithm>
int in() {
int x = 0; char c = getchar(); bool f = 0;
while (c < '0' || c > '9')
f |= c == '-', c = getchar();
while (c >= '0' && c <= '9')
x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return f ? -x : x;
}
template<typename T>inline void chk1(T &_, T __) { _ = _ < __ ? _ : __; }
template<typename T>inline void chk2(T &_, T __) { _ = _ > __ ? _ : __; }
const int N = 1e6 + 5, Q = 1e5 + 5, mod = 1e9 + 7;
int n, m, q;
struct info {
int typ;
int x, k;
} a[Q];
int x[N], y[N];
inline void add(int &_, int __) {
_ += __;
if (_ >= mod) _ -= mod;
if (_ < 0) _ += mod;
}
int main() {
//freopen("in", "r", stdin);
freopen("game.in", "r", stdin);
freopen("game.out", "w", stdout);
n = in(), m = in(), q = in();
for (int i = 1; i <= q; ++i) {
char c = getchar();
while (c != 'R' && c != 'S')
c = getchar();
a[i] = (info){c == 'R', in(), in()};
}
int d = n;
for (int i = 1; i <= n; ++i)
x[i] = 1;
if (n & 1)
y[1] = 1ll * (1ll * (n - 1) / 2 * m + 1) % mod * n % mod;
else
y[1] = 1ll * (1ll * (n - 1) * m + 2) % mod * (n / 2) % mod;
for (int i = 1; i <= q; ++i)
if (a[i].typ) {
add(y[1], 1ll * (1 + 1ll * (a[i].x - 1) * m % mod) * x[a[i].x] % mod * (a[i].k - 1) % mod);
add(d, 1ll * (a[i].k - 1) * x[a[i].x] % mod);
x[a[i].x] = 1ll * x[a[i].x] * a[i].k % mod;
}
for (int i = 2; i <= m; ++i)
y[i] = y[i - 1], add(y[i], d);
for (int i = 1; i <= q; ++i)
if (!a[i].typ)
y[a[i].x] = 1ll * y[a[i].x] * a[i].k % mod;
for (int i = 1; i <= m; ++i)
add(y[0], y[i]);
printf("%d\n", y[0]);
return 0;
}
T2、石蹴り
\(ソル\) :
最初に到達する各ポイントを記録するためのセクションを見つけるために暴力の最適化サイクルを考える\(m個\)をどの位置カラム、修飾することができる間隔の間に変更され、最初の列を見つけ、
時間複雑\ (O((N-M +)を\ Q)\) 。
コード(クッション)
T3、美しいシーケンス
まずつぶやきました、