Codeforces Round #264 (Div. 2)
質問リンク
A: 特別な判定がちょうど良い状況に注意してください。残りはレコードの最大値を 1 つずつ判断するだけです
B: スキャンします。一度それを実行し、足りない場合はお金で埋めて、余剰エネルギーを記録します
C: 主対角線と補助対角線を処理し、黒と白の正方形の最大のもののみを選択します
D: DAG に変換します。最長経路問題、それぞれの数字を記録する 各シーケンスの位置で、数字を置くことができる場合、各シーケンスの数字は最後の数字の後ろにある必要があります
E: 苦労して奇跡を起こし、ツリーを前処理し、その後、毎回クエリを実行します。現在の位置から一致するものを見つけるだけです。一致するものがない場合は、-1
コード:
A:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n, s;int main() { scanf("%d%d", &n, &s); int x, y; int flag = 1; int ans = 0; for (int i = 0; i < n; i++) { scanf("%d%d", &x, &y); if (x == s) { if (y == 0) { ans = max(ans, y); flag = 0; } } else if (x < s) { ans = max(ans, (100 - y) % 100); flag = 0; } } if (flag) printf("-1\n"); else printf("%d\n", ans); return 0;}
#include <cstdio>#include <cstring>const int N = 100005;typedef long long ll;int n;ll h[N];int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%lld", &h[i]); ll now = 0; ll ans = 0; for (int i = 1; i <= n; i++) { if (h[i] > h[i - 1]) { ll need = h[i] - h[i - 1]; if (now >= need) { now -= need; } else { ans += need - now; now = 0; } } else { now += h[i - 1] - h[i]; } } printf("%lld\n", ans); return 0;}
rree
rree
rree