Codeforces Round #266 (Div. 2)
質問リンク
A: どちらが大きいかを単純に判断します
B: x を sqrt(n) に列挙し、y を直接計算して判断できます 以上です
C : 最初に合計が 3 の倍数であるかどうかを判断し、次にプレフィックスと出現位置、および合計 / 3 の数値に対応するサフィックスの合計を前処理し、最初から最後までスキャンして、現在のものと次のものを結合します
D : まず、配列が線分を追加する方法を表すように差分を前処理します。次に、-1 があるたびに、前の 1 と照合し、その数を乗算します。 0、前の + 1 の一致と照合できます
E: ユニオン ルックアップを使用して、各クエリを開始点から + まで 2 つの部分に分割します。dfs の後にクエリが 2 回一致した場合、出力は YES、それ以外の場合は、はいいえ
コード:
#include <cstdio>#include <cstring>int n, m, a, b;int solve() { if (b >= m * a) return a * n; int yu = n % m; int ans = n / m * b; if (yu * a < b) return ans + yu * a; return ans + b;}int main() { scanf("%d%d%d%d", &n, &m, &a, &b); printf("%d\n", solve()); return 0;}
#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;typedef long long ll;ll n, a, b;int main() { scanf("%lld%lld%lld", &n, &a, &b); n = n * 6; ll ans = 1e18, x, y; if (a * b >= n) { x = a; y = b; ans = a * b; } else { int flag = 0; if (a > b) { flag = 1; swap(a, b); } for (int i = 1; i < 1000000 && i < n; i++) { ll r = n / i + (n % i != 0); ll l = i; if (l > r) swap(l, r); if (l < a || r < b) continue; if (i * r < ans) { ans = i * r; x = i; y = r; } } if (flag) swap(x, y); } printf("%lld\n%lld %lld\n", ans, x, y); return 0;}
#include <cstdio>#include <cstring>const int N = 500005;typedef long long ll;int n;ll a[N], pres[N], prec[N], sufs[N], sufc[N];int main() { scanf("%d", &n); ll sum = 0; for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); sum += a[i]; } if (sum % 3) printf("0\n"); else { sum /= 3; for (int i = 1; i <= n; i++) { pres[i] = pres[i - 1] + a[i]; if (pres[i] == sum) prec[i] = 1; } for (int i = n; i >= 1; i--) { sufs[i] = sufs[i + 1] + a[i]; sufc[i] = sufc[i + 1]; if (sufs[i] == sum) sufc[i]++; } ll ans = 0; for (int i = 1; i <= n; i++) ans += prec[i] * sufc[i + 2]; printf("%lld\n", ans); } return 0;}
れーれー