Codeforces round #264 (Div. 2)
Question Link
A: Pay attention to the situation where the specific sentence is correct. Others can judge the maximum value of the record one by one.
B: scan it again. If you don't have enough money to fill it out, record the excess energy.
C: process the diagonal lines of the primary and secondary nodes. Then, you can select only one of the largest ones for the blacklist.
D: The longest path to the Dag. Each number records the position in each sequence. If a number can be placed, so it must be that the numbers in each sequence are behind the last digit.
E
Code:
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;}
B:
#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;}
C:
#include <cstdio>#include <cstring>const int N = 2005;typedef long long ll;int n;ll g[N][N], zhu[N + N], fu[N + N];int main() {scanf("%d", &n);for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)scanf("%lld", &g[i][j]);for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {zhu[i - j + n] += g[i][j];fu[i + j] += g[i][j];}}ll b = -1, w = -1;int bx, by, wx, wy;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {ll sum = zhu[i - j + n] + fu[i + j] - g[i][j];if ((i + j) % 2 == 0) {if (b < sum) {b = sum;bx = i + 1;by = j + 1;}}else {if (w < sum) {w = sum;wx = i + 1;wy = j + 1;}}}}printf("%lld\n", b + w);printf("%d %d %d %d\n", bx, by, wx, wy);return 0;}
D:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 1005;struct Num {int v[10], la;} num[N];bool cmp(Num a, Num b) {return a.la < b.la;}int n, k, dp[N][N];bool judge(int i, int j) {for (int x = 0; x < k; x++) {if (num[i].v[x] < num[j].v[x]) return false;}return true;}int main() {scanf("%d%d", &n, &k);for (int i = 0; i < k; i++) {int tmp;for (int j = 1; j <= n; j++) {scanf("%d", &tmp);num[tmp].v[i] = j;}}for (int i = 0; i <= n; i++) {int maxv = 0;for (int j = 0; j < k; j++) {maxv = max(maxv, num[i].v[j]);}num[i].la = maxv;}sort(num, num + n + 1, cmp);/*for (int i = 0; i <= n; i++) {for (int j = 0; j < k; j++) {printf("%d ", num[i].v[j]);}printf("\n");}*/for (int i = 1; i <= n; i++) {for (int j = 0; j < i; j++) {dp[i][j] = max(dp[i][j], dp[i - 1][j]);if (judge(i, j)) {dp[i][i] = max(dp[i][i], dp[i][j] + 1);}}}int ans = 0;for (int i = 0; i <= n; i++)ans = max(ans, dp[n][i]);printf("%d\n", ans);return 0;}
E:
#include <cstdio>#include <cstring>#include <vector>using namespace std;const int N = 100005;int n, q, val[N], f[N];vector<int> g[N];void dfs(int u, int fa) {f[u] = fa;for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (v == fa) continue;dfs(v, u);}}int gcd(int a, int b) {while (b) {int tmp = a % b;a = b;b = tmp;}return a;}int query(int u) {int v = val[u];u = f[u];while (u) {if (gcd(val[u], v) > 1) return u;u = f[u];}return -1;}int main() {scanf("%d%d", &n, &q);for (int i = 1; i <= n; i++)scanf("%d", &val[i]);int u, v;for (int i = 1; i < n; i++) {scanf("%d%d", &u, &v);g[u].push_back(v);g[v].push_back(u);}dfs(1, 0);int tp, a, b;while (q--) {scanf("%d%d", &tp, &a);if (tp == 1) {printf("%d\n", query(a));} else {scanf("%d", &b);val[a] = b;}}return 0;}
Codeforces round #264 (Div. 2)