Codeforces训练记录
Codeforces Round #693 (Div. 3)
A - Cards for Friends
#include#include #include #include #include using namespace std; typedef long long ll; int T, w, h, n; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d%d%d", &w, &h, &n); int res = 1; while (0 == w % 2) { res *= 2; w /= 2; } while (0 == h % 2) { res *= 2; h /= 2; } if (res >= n) printf("YES\n"); else printf("NO\n"); } return 0; }
B - Fair Division
#include#include #include #include #include using namespace std; typedef long long ll; int T, n; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); int a = 0, b = 0; for (int i = 1; i <= n; i++) { int x; scanf("%d", &x); if (1 == x) a += 1; else b += 1; } if (0 == b % 2 && 0 == a % 2) printf("YES\n"); else if (0 == b % 2 && 1 == a % 2) printf("NO\n"); else if (1 == b % 2) { if (0 != a && 0 == a % 2) printf("YES\n"); else printf("NO\n"); } } return 0; }
C - Long Jumps
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 200010; int T, n, a[N], dp[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); dp[i] = 0; } for (int i = 1; i <= n; i++) { if (i + a[i] > n) continue; dp[i + a[i]] = max(dp[i + a[i]], dp[i] + a[i]); } int res = 0; for (int i = 1; i <= n; i++) res = max(res, dp[i] + a[i]); printf("%d\n", res); } return 0; }
D - Even-Odd Game
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 200010; int T, n; ll a[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); sort(a + 1, a + n + 1); reverse(a + 1, a + n + 1); ll ra = 0, rb = 0; for (int i = 1; i <= n; i++) { if (1 == i % 2 && 0 == a[i] % 2) ra += a[i]; if (0 == i % 2 && 1 == a[i] % 2) rb += a[i]; } if (ra > rb) printf("Alice\n"); else if (ra == rb) printf("Tie\n"); else printf("Bob\n"); } return 0; }
E - Correct Placement
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 400010; const int INF = 0x3f3f3f3f; struct node { int w, h, id; node() { } node(int _w, int _h, int _id) : w(_w), h(_h), id(_id) { } }; int T, n, res[N]; node a[N]; vector v; bool cmp(node a, node b) { if (a.h != b.h) return a.h < b.h; return a.w < b.w; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { v.clear(); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d%d", &a[i].h, &a[i].w); a[i].id = i; v.push_back(node(a[i].h, a[i].w, i)); v.push_back(node(a[i].w, a[i].h, i)); } sort(a + 1, a + n + 1, cmp); sort(v.begin(), v.end(), cmp); int p = -1, imin = INF, np = -1; for (int i = 1; i <= n; i++) { while (p + 1 < v.size() && v[p + 1].h < a[i].h) { p += 1; if (v[p].w < imin) { imin = v[p].w; np = v[p].id; } } if (imin < a[i].w) res[a[i].id] = np; else res[a[i].id] = -1; } for (int i = 1; i <= n; i++) { printf("%d", res[i]); printf(i == n ? "\n" : " "); } } return 0; }
F - New Year's Puzzle
#include#include #include #include #include #include
Codeforces Round #667 (Div. 3)
A - Yet Another Two Integers Problem
#include#include #include #include #include #include
B - Minimum Product
#include#include #include #include #include #include
C - Yet Another Array Restoration
#include#include #include #include #include #include
D - Decrease the Sum of Digits
#include#include #include #include #include #include
E - Two Platforms
#include#include #include #include #include #include
Codeforces Round #694 (Div. 2)
A - Strange Partition
#include#include #include #include #include #include #include
B - Strange List
#include#include #include #include #include #include #include
C - Strange Birthday Party
#include#include #include #include #include #include #include
D - Strange Definition
#include#include #include #include #include #include #include
F - Strange Housing
#include#include #include #include #include #include #include
Codeforces Round #690 (Div. 3)
A - Favorite Sequence
#include#include #include #include using namespace std; const int N = 310; int T, n, a[N], res[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); int l = 1, r = n; for (int i = 1; i <= n; i++) { if (i & 1) res[i] = a[l++]; else res[i] = a[r--]; } for (int i = 1; i <= n; i++) { printf("%d", res[i]); printf(i == n ? "\n" : " "); } } return 0; }
B - Last Year's Substring
#include#include #include #include using namespace std; const int N = 210; int T, n; char s[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d%s", &n, s + 1); int len = strlen(s + 1), ok = 0; if ('2' == s[1] && '0' == s[2] && '2' == s[3] && '0' == s[4]) ok = 1; if ('2' == s[1] && '0' == s[2] && '2' == s[3] && '0' == s[n]) ok = 1; if ('2' == s[1] && '0' == s[2] && '2' == s[n - 1] && '0' == s[n]) ok = 1; if ('2' == s[1] && '0' == s[n - 2] && '2' == s[n - 1] && '0' == s[n]) ok = 1; if ('2' == s[n - 3] && '0' == s[n - 2] && '2' == s[n - 1] && '0' == s[n]) ok = 1; printf(1 == ok ? "YES\n" : "NO\n"); } return 0; }
C - Unique Number
#include#include #include #include #include #include #include
D - Add to Neighbour and Remove
#include#include #include #include #include #include #include
E1 - Close Tuples (easy version)
#include#include #include #include #include #include #include
E2 - Close Tuples (hard version)
#include#include #include #include #include #include #include
F - The Treasure of The Segments
#include#include #include #include #include #include #include
Good Bye 2020
A - Bovine Dilemma
#include#include #include #include #include #include #include
B - Last minute enhancements
#include#include #include #include #include #include #include
C - Canine poetry
#include#include #include #include #include #include #include
D - 13th Labour of Heracles
#include#include #include #include #include #include #include
E - Apollo versus Pan
#include#include #include #include #include #include #include
F - Euclid's nightmare
#include#include #include #include #include #include #include
Codeforces Round #634 (Div. 3)
A - Candies and Two Sisters
#include#include #include #include #include #include #include
B - Construct the String
#include#include #include #include #include #include #include
C - Two Teams Composing
#include#include #include #include #include #include #include
D - Anti-Sudoku
#include#include #include #include #include #include #include
E1 - Three Blocks Palindrome (easy version)
#include#include #include #include #include #include #include
E2 - Three Blocks Palindrome (hard version)
#include#include #include #include #include #include #include
Educational Codeforces Round 101 (Rated for Div. 2)
A - Regular Bracket Sequence
#include#include #include #include #include #include #include
B - Red and Blue
#include#include #include #include #include #include #include
C - Building a Fence
#include#include #include #include #include #include #include
D - Ceil Divisions
#include#include #include #include #include #include #include #include
E - A Bit Similar
#include#include #include #include #include #include #include #include
Codeforces Round #686 (Div. 3)
A - Special Permutation
#include#include #include #include using namespace std; int T, n; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); if (n & 1) { for (int i = 1; i <= n - 3; i += 2) printf("%d %d ", i + 1, i); printf("%d %d %d\n", n - 1, n, n - 2); } else { for (int i = 1; i <= n; i += 2) { printf("%d %d", i + 1, i); if (i + 1 == n) printf("\n"); else printf(" "); } } } return 0; }
B - Unique Bid Auction
#include#include #include #include using namespace std; const int N = 200010; int T, n, res, now, c[N], val[N]; int main() { scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) c[i] = 0; for (int i = 1; i <= n; i++) { scanf("%d", &val[i]); c[val[i]]++; } res = -1; now = 0x3f3f3f3f; for (int i = 1; i <= n; i++) { if (1 != c[val[i]]) continue; if (val[i] < now) { now = val[i]; res = i; } } printf("%d\n", res); } return 0; }
C - Sequence Transformation
#include#include #include #include #include #include #include #include
D - Number into Sequence
#include#include #include #include #include #include #include #include
E - Number of Simple Paths
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 200010; struct Edge { int to, nex; }; int T, n, cnt, tot; int head[N], deg[N], vis[N], num[N]; Edge edge[2 * N]; queue<int> q; void init() { cnt = tot = 0; for (int i = 1; i <= n; i++) head[i] = vis[i] = deg[i] = 0; while (!q.empty()) q.pop(); } void add_edge(int u, int v) { edge[++cnt].to = v; edge[cnt].nex = head[u]; head[u] = cnt; } int dfs(int u, int fa) { int res = 0; for (int i = head[u]; 0 != i; i = edge[i].nex) { int v = edge[i].to; if (0 == vis[v] || v == fa) continue; res = res + dfs(v, u) + 1; } return res; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); init(); for (int i = 1; i <= n; i++) { int u, v; scanf("%d%d", &u, &v); add_edge(u, v); add_edge(v, u); deg[u] += 1; deg[v] += 1; } for (int i = 1; i <= n; i++) { if (1 != deg[i]) continue; q.push(i); } while (!q.empty()) { int u = q.front(); q.pop(); vis[u] = 1; for (int i = head[u]; 0 != i; i = edge[i].nex) { int v = edge[i].to; deg[v] -= 1; if (1 == deg[v]) q.push(v); } } for (int i = 1; i <= n; i++) { if (vis[i]) continue; num[++tot] = dfs(i, -1); } ll res = 1ll * tot * (tot - 1); for (int i = 1; i <= tot; i++) { res = res + 2 * (n - tot) - num[i]; res = res + 1ll * num[i] * (num[i] - 1) / 2; res = res + 1ll * num[i] * (n - tot - num[i]); } printf("%lld\n", res); } return 0; }
Codeforces Round #627 (Div. 3)
A - Yet Another Tetris Problem
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 110; int T, n, a[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); int imax = 0, f = 1; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); imax = max(imax, a[i]); } for (int i = 1; i <= n; i++) { if (0 == (imax - a[i]) % 2) continue; f = 0; break; } if (f) printf("YES\n"); else printf("NO\n"); } return 0; }
B - Yet Another Palindrome Problem
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 5010; const int INF = 0x3f3f3f3f; int T, n, a[N], imin[N], imax[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) { imin[i] = INF; imax[i] = 0; } for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); imin[a[i]] = min(imin[a[i]], i); imax[a[i]] = max(imax[a[i]], i); } int f = 0; for (int i = 1; i <= n; i++) { if (imax[a[i]] - imin[a[i]] >= 2) { f = 1; break; } } printf(f ? "YES\n" : "NO\n"); } return 0; }
C - Frog Jumps
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 200010; const int INF = 0x3f3f3f3f; int T, lr[N]; char s[N]; bool check(int mid, int n) { int pos = 0; while (pos + mid < n + 1) { if (lr[pos + mid] <= pos) return false; pos = lr[pos + mid]; } return true; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%s", s + 1); int now = -INF, len = strlen(s + 1); for (int i = 1; i <= len; i++) { if ('R' == s[i]) now = i; lr[i] = now; } int l = 1, r = len + 1; while (r > l) { int mid = (l + r) / 2; if (check(mid, len)) r = mid; else l = mid + 1; } printf("%d\n", l); } return 0; }
D - Pair of Topics
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 400010; const int INF = 0x3f3f3f3f; int n, a[N], b[N], c[N]; vector<int> alls; int get_id(int x) { return lower_bound(alls.begin(), alls.end(), x) - alls.begin() + 1; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) scanf("%d", &b[i]); for (int i = 1; i <= n; i++) { alls.push_back(b[i] - a[i]); alls.push_back(a[i] - b[i] - 1); } sort(alls.begin(), alls.end()); alls.erase(unique(alls.begin(), alls.end()), alls.end());; for (int i = 1; i <= n; i++) c[get_id(b[i] - a[i])] += 1; for (int i = 1; i <= alls.size(); i++) c[i] += c[i - 1]; ll res = 0; for (int i = 1; i <= n; i++) { res += c[get_id(a[i] - b[i] - 1)]; if (a[i] > b[i]) res -= 1; } printf("%lld\n", res / 2); return 0; }
E - Sleeping Schedule
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 2010; const int INF = 0x3f3f3f3f; int n, h, l, r, sum[N], a[N], dp[N][N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d%d%d%d", &n, &h, &l, &r); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); sum[i] = sum[i - 1] + a[i]; } for (int i = 1; i <= n; i++) { for (int k = 0; k <= i; k++) { int now = (sum[i] - k) % h; if (now >= l && now <= r) now = 1; else now = 0; if (0 != k) dp[i][k] = max(dp[i][k], dp[i - 1][k - 1] + now); if (i >= k + 1) dp[i][k] = max(dp[i][k], dp[i - 1][k] + now); } } int res = 0; for (int i = 0; i <= n; i++) res = max(res, dp[n][i]); printf("%d\n", res); return 0; }
Codeforces Round #676 (Div. 2)
A - XORwice
#include#include #include #include #include #include using namespace std; typedef long long ll; int T, a, b; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d%d", &a, &b); int res = 0; for (int i = 31; i >= 0; i--) { int ta = (1 << i) & a, tb = (1 << i) & b; if (ta == tb) continue; res = res + (1 << i); } printf("%d\n", res); } return 0; }
B - Putting Bricks in the Wall
#include#include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 210; int T, n; char s[N][N]; vector v; bool check(char a, char b) { v.clear(); if (s[1][2] != a) v.push_back( { 1, 2 } ); if (s[2][1] != a) v.push_back( { 2, 1 } ); if (s[n][n - 1] != b) v.push_back( { n, n - 1 } ); if (s[n - 1][n] != b) v.push_back( { n - 1, n } ); if (v.size() <= 2) { printf("%d\n", v.size()); for (int i = 0; i < v.size(); i++) printf("%d %d\n", v[i].first, v[i].second); return true; } return false; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%s", s[i] + 1); if (!check('0', '1')) check('1', '0'); } return 0; }
C - Palindromifier
#include#include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 100010; char s[N]; int len; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%s", s + 1); int len = strlen(s + 1); printf("3\n"); printf("R %d\n", len - 1); printf("L %d\n", len); printf("L 2\n"); }
D - Hexagons
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 100010; int T; ll x, y, c1, c2, c3, c4, c5, c6; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%lld%lld", &x, &y); scanf("%lld%lld%lld%lld%lld%lld", &c1, &c2, &c3, &c4, &c5, &c6); if (x >= 0 && y >= 0) { ll res = x * c6 + y * c2; res = min(res, c1 * min(x, y) + c6 * (x - min(x, y)) + c2 * (y - min(x, y))); if (x <= y) res = min(res, y * c1 + c3 * (y - x)); else res = min(res, x * c1 + c5 * (x - y)); printf("%lld\n", res); continue; } else if (x <= 0 && y <= 0) { x = -x; y = -y; ll res = x * c3 + y * c5; res = min(res, c4 * min(x, y) + c3 * (x - min(x, y)) + c5 * (y - min(x, y))); if (x >= y) res = min(res, c4 * x + c2 * (x - y)); else res = min(res, c4 * y + c6 * (y - x)); printf("%lld\n", res); continue; } else if (x >= 0 && y <= 0) { y = -y; ll res = min(c6 * (x + y) + c4 * y, c5 * (x + y) + c1 * x); res = min(res, c6 * x + c5 * y); printf("%lld\n", res); continue; } else { x = -x; ll res = min(c3 * (x + y) + c1 * y, c2 * (x + y) + c4 * x); res = min(res, c3 * x + c2 * y); printf("%lld\n", res); continue; } } return 0; }
Codeforces Round #605 (Div. 3)
A - Three Friends
#include#include #include #include #include #include #include <set> using namespace std; typedef long long ll; const int N = 100010; const int INF = 0x3f3f3f3f; int T, a, b, c; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d%d%d", &a, &b, &c); int imin = min(a, min(b, c)), imax = max(a, max(b, c)); if (imin != imax) imax -= 1; if (imin != imax) imin += 1; printf("%d\n", 2 * (imax - imin)); } return 0; }
B - Snow Walking Robot
#include#include #include #include #include #include #include <set> using namespace std; typedef long long ll; const int N = 100010; const int INF = 0x3f3f3f3f; int T; char s[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%s", s + 1); int l = 0, r = 0, u = 0, d = 0, len = strlen(s + 1); for (int i = 1; i <= len; i++) { if ('D' == s[i]) d += 1; if ('R' == s[i]) r += 1; if ('L' == s[i]) l += 1; if ('U' == s[i]) u += 1; } int a = min(l, r), b = min(u, d); if (0 == a && 0 == b) printf("0\n\n"); else if (0 == a && 0 != b) printf("2\nUD\n"); else if (0 != a && 0 == b) printf("2\nLR\n"); else { printf("%d\n", 2 * (a + b)); for (int i = 1; i <= a; i++) printf("L"); for (int i = 1; i <= b; i++) printf("U"); for (int i = 1; i <= a; i++) printf("R"); for (int i = 1; i <= b; i++) printf("D"); printf("\n"); } } return 0; }
C - Yet Another Broken Keyboard
#include#include #include #include #include #include #include <set> using namespace std; typedef long long ll; const int N = 200010; const int INF = 0x3f3f3f3f; int n, k; char s[N]; set<char> st; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d%d%s", &n, &k, s + 1); for (int i = 1; i <= k; i++) { getchar(); char ch; scanf("%c", &ch); st.insert(ch); } ll res = 0, cnt = 0; for (int i = 1; i <= n; i++) { if (!st.count(s[i])) { res += cnt * (cnt + 1) / 2; cnt = 0; } else cnt += 1; } res += cnt * (cnt + 1) / 2; printf("%lld\n", res); return 0; }
D - Remove One Element
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 200010; const int INF = 0x3f3f3f3f; int n, a[N], dp[N][2]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); a[n + 1] = INF; for (int i = 1; i <= n; i++) { if (a[i] > a[i - 1]) dp[i][0] = dp[i - 1][0] + 1; else dp[i][0] = 1; } for (int i = n; i >= 1; i--) { if (a[i] < a[i + 1]) dp[i][1] = dp[i + 1][1] + 1; else dp[i][1] = 1; } int res = 0; for (int i = 1; i <= n; i++) { res = max(res, dp[i][0]); if (a[i + 1] > a[i - 1]) res = max(res, dp[i - 1][0] + dp[i + 1][1]); } printf("%d\n", res); return 0; }
E - Nearest Opposite Parity
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 1000010; const int INF = 0x3f3f3f3f; struct Edge { int to, nex; }; struct node { int s, w; node(int _s, int _w) : s(_s), w(_w) { } friend bool operator < (node a, node b) { return a.w > b.w; } }; int n, cnt; int a[N], head[N], d[N], res[N]; Edge edge[2 * N]; void init() { cnt = 0; for (int i = 1; i <= n + 2; i++) head[i] = 0; } void add_edge(int u, int v) { edge[++cnt].to = v; edge[cnt].nex = head[u]; head[u] = cnt; } void dijkstra(int s) { priority_queue q; for (int i = 1; i <= n + 2; i++) d[i] = INF; d[s] = 0; q.push(node(s, 0)); while (!q.empty()) { node nd = q.top(); int u = nd.s, w = nd.w; q.pop(); if (w != d[u]) continue; for (int i = head[u]; 0 != i; i = edge[i].nex) { int v = edge[i].to; if (d[u] + 1 < d[v]) { d[v] = d[u] + 1; q.push(node(v, d[v])); } } } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &n); init(); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) { if (0 == a[i] % 2) add_edge(n + 1, i); else add_edge(n + 2, i); if (i + a[i] <= n) add_edge(i + a[i], i); if (i - a[i] >= 1) add_edge(i - a[i], i); } dijkstra(n + 1); for (int i = 1; i <= n; i++) { if (0 == a[i] % 2) continue; res[i] = (INF == d[i] ? -1 : d[i] - 1); } dijkstra(n + 2); for (int i = 1; i <= n; i++) { if (1 == a[i] % 2) continue; res[i] = (INF == d[i] ? -1 : d[i] - 1); } for (int i = 1; i <= n; i++) { printf("%d", res[i]); printf(i == n ? "\n" : " "); } return 0; }
1463D - Pairs
#include#include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 1000010; int T, n, vis[N], a[N], b[N]; int check(int mid) { for (int i = 1; i <= mid; i++) if (a[i] > b[n - mid + i]) return 1; for (int i = mid + 1; i <= n; i++) if (a[i] < b[i - mid]) return 2; return 0; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= 2 * n; i++) vis[i] = 0; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); vis[a[i]] = 1; } int cnt = 0; for (int i = 1; i <= 2 * n; i++) { if (vis[i]) continue; b[++cnt] = i; } int l = 0, r = n, resl = 0, resr = 0; while (r > l) { int mid = (l + r) / 2; if (2 != check(mid)) r = mid; else l = mid + 1; } resl = l; l = 0, r = n; while (r > l) { int mid = (l + r + 1) / 2; if (1 != check(mid)) l = mid; else r = mid - 1; } resr = l; printf("%d\n", resr - resl + 1); } return 0; }
1463C - Busy Robot
#include#include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 1000010; const ll INF = 1000000000000000000; struct node { ll t; int x; node() { } node(ll _t, int _x) : t(_t), x(_x) { } }; int T, n; node a[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%lld%d", &a[i].t, &a[i].x); a[n + 1] = node(INF, 0); int now = 0, ist = 0, to = 0, res = 0; ll stt = 0; for (int i = 1; i <= n; i++) { if (1 == ist && a[i].t - stt >= abs(now - to)) { ist = 0; now = to; } if (1 == ist) { if (a[i].x >= min(now, to) && a[i].x <= max(now, to)) { ll tt = stt + abs(now - a[i].x); if (tt >= a[i].t && tt <= a[i + 1].t) res += 1; } continue; } ist = 1; stt = a[i].t; to = a[i].x; if (a[i + 1].t - a[i].t >= abs(now - to)) res += 1; } printf("%d\n", res); } return 0; }
1453C - Triangles
#include#include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 2010; int T, n; int minr[N], maxr[N], minc[N], maxc[N]; char s[N][N]; vector<int> res; void solve(int x) { int iminr = N, imaxr = -N, iminc = N, imaxc = -N; for (int i = 1; i <= n; i++) { minr[i] = minc[i] = N; maxr[i] = maxc[i] = -N; } for (int i = 1; i <= n; i++) { for (int k = 1; k <= n; k++) { if (x != s[i][k] - '0') continue; minr[i] = min(minr[i], k); maxr[i] = max(maxr[i], k); minc[k] = min(minc[k], i); maxc[k] = max(maxc[k], i); iminr = min(iminr, i); imaxr = max(imaxr, i); iminc = min(iminc, k); imaxc = max(imaxc, k); } } int imax = 0; for (int i = 1; i <= n; i++) { for (int k = 1; k <= n; k++) { if (x != s[i][k] - '0') continue; imax = max(imax, max(maxr[i] - k, k - minr[i]) * max(i - 1, n - i)); imax = max(imax, max(i - minc[k], maxc[k] - i) * max(k - 1, n - k)); imax = max(imax, max(i - iminr, imaxr - i) * max(k - 1, n - k)); imax = max(imax, max(imaxc - k, k - iminc) * max(i - 1, n - i)); } } res.push_back(imax); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); res.clear(); for (int i = 1; i <= n; i++) scanf("%s", s[i] + 1); for (int i = 0; i <= 9; i++) solve(i); for (int i = 0; i <= 9; i++) { printf("%d", res[i]); printf(i == 9 ? "\n" : " "); } } return 0; }
1453D - Checkpoints
#include#include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 2010; int T, a[N]; vector<int> res; ll n; void push(int x) { res.push_back(1); if (1 == x) return; for (int i = 1; i <= x - 2; i++) res.push_back(0); res.push_back(1); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { res.clear(); int cnt = 0; scanf("%lld", &n); if (1 == n % 2) { printf("-1\n"); continue; } while (n) { a[++cnt] = n % 2; n /= 2; } for (int i = 1; i <= cnt; i++) { if (0 == a[i]) continue; push(i - 1); } printf("%d\n", res.size()); for (int i = 0; i < res.size(); i++) { printf("%d", res[i]); printf(i == res.size() - 1 ? "\n" : " "); } } return 0; }
1451D - Circle Game
#include#include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; int T, d, k; int binary(int x) { int l = 0, r = d + 1; while (r > l) { int mid = (l + r) / 2; if (1ll * x * x + 1ll * mid * mid <= 1ll * d * d) l = mid + 1; else r = mid; } return l; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d%d", &d, &k); int now = 0, f = 1, imax = 0; while (f) { int h = binary(now); imax = max(imax, now / k + (h + k - 1) / k); if (1 == f && now > d) f = 0; now += k; } printf(imax % 2 ? "Utkarsh\n" : "Ashish\n"); } return 0; }
1450D - Rating Compression
#include#include #include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 300010; const int INF = 0x3f3f3f3f; struct node { int l, r, imin; }; int T, n, a[N], res[N]; node tr[4 * N]; void build(int k, int l, int r) { tr[k].l = l; tr[k].r = r; if (l == r) { tr[k].imin = a[l]; return; } int mid = (l + r) / 2; build(2 * k, l, mid); build(2 * k + 1, mid + 1, r); tr[k].imin = min(tr[2 * k].imin, tr[2 * k + 1].imin); } int ask(int k, int a, int b) { if (tr[k].l >= a && tr[k].r <= b) return tr[k].imin; int mid = (tr[k].l + tr[k].r) / 2, res = INF; if (a <= mid) res = min(res, ask(2 * k, a, b)); if (b > mid) res = min(res, ask(2 * k + 1, a, b)); return res; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) res[i] = 0; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); build(1, 1, n); int l = 1, r = n, now = 1; for (int i = n; i >= 1; i--) { if (now == ask(1, l, r)) res[i] = 1; else { res[i] = 0; break; } if (a[l] == now) l += 1; else if (a[r] == now) r -= 1; else break; now += 1; } int f = 1; sort(a + 1, a + n + 1); for (int i = 1; i <= n; i++) { if (a[i] == a[i - 1] + 1) continue; f = 0; break; } res[1] = f; for (int i = 1; i <= n; i++) printf("%d", res[i]); printf("\n"); } return 0; }
1446B - Catching Cheaters
#include#include #include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 5010; int n, m, dp[N][N]; char a[N], b[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d%d%s%s", &n, &m, a + 1, b + 1); for (int i = 1; i <= n; i++) { for (int k = 1; k <= m; k++) { if (a[i] == b[k]) dp[i][k] = dp[i - 1][k - 1] + 2; else dp[i][k] = max(0, max(dp[i - 1][k], dp[i][k - 1]) - 1); } } int imax = 0; for (int i = 1; i <= n; i++) { for (int k = 1; k <= m; k++) { imax = max(imax, dp[i][k]); } } printf("%d\n", imax); return 0; }
1444B - Divide and Sum
#include#include #include #include #include #include #include using namespace std; typedef long long ll; typedef pair<int, int> pii; const int N = 300010; const ll mod = 998244353; int n; ll a[N], fac[N], inv[N]; ll C(int n, int m) { return fac[n] * inv[m] % mod * inv[n - m] % mod; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &n); fac[0] = 1; for (int i = 1; i <= 2 * n; i++) fac[i] = 1ll * fac[i - 1] * i % mod; inv[1] = 1; for (int i = 2; i <= 2 * n; i++) inv[i] = (mod - mod / i) * inv[mod % i] % mod; inv[0] = 1; for (int i = 1; i <= 2 * n; i++) inv[i] = inv[i] * inv[i - 1] % mod; for (int i = 1; i <= 2 * n; i++) scanf("%lld", &a[i]); sort(a + 1, a + 2 * n + 1); ll sum = 0; for (int i = 1; i <= 2 * n; i++) { if (i <= n) sum -= a[i]; else sum += a[i]; } printf("%lld\n", sum % mod * C(2 * n, n) % mod); return 0; }
1442B - Identify the Operations
#include#include #include #include using namespace std; const int N = 200010; const int INF = 0x3f3f3f3f; const int mod = 998244353; struct node { int l, r, imax, imin; }; int T, n, k; int a[N], b[N], p[N], l[N], r[N]; node tr[4 * N]; void build(int k, int l, int r) { tr[k].l = l; tr[k].r = r; tr[k].imax = 0; tr[k].imin = n + 1; if (l == r) return; int mid = (l + r) / 2; build(2 * k, l, mid); build(2 * k + 1, mid + 1, r); } void update(int k, int x, int y) { if (tr[k].l == tr[k].r) { tr[k].imax = tr[k].imin = y; return; } int mid = (tr[k].l + tr[k].r) / 2; if (x <= mid) update(2 * k, x, y); else update(2 * k + 1, x, y); tr[k].imax = max(tr[2 * k].imax, tr[2 * k + 1].imax); tr[k].imin = min(tr[2 * k].imin, tr[2 * k + 1].imin); } int ask_max(int k, int a, int b) { if (tr[k].l >= a && tr[k].r <= b) return tr[k].imax; int mid = (tr[k].l + tr[k].r) / 2, imax = 0;; if (a <= mid) imax = max(imax, ask_max(2 * k, a, b)); if (b > mid) imax = max(imax, ask_max(2 * k + 1, a, b)); return imax; } int ask_min(int k, int a, int b) { if (tr[k].l >= a && tr[k].r <= b) return tr[k].imin; int mid = (tr[k].l + tr[k].r) / 2, imin = n + 1; if (a <= mid) imin = min(imin, ask_min(2 * k, a, b)); if (b > mid) imin = min(imin, ask_min(2 * k + 1, a, b)); return imin; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) p[i] = l[i] = r[i] = 0; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= k; i++) { scanf("%d", &b[k]); p[b[k]] = i; } build(1, 1, k); for (int i = 1; i <= n; i++) { if (0 == p[a[i]]) continue; int t = ask_max(1, p[a[i]] + 1, k); l[p[a[i]]] = i - t - 1; update(1, p[a[i]], i); } build(1, 1, k); for (int i = n; i >= 1; i--) { if (0 == p[a[i]]) continue; int t = ask_min(1, p[a[i]] + 1, k); r[p[a[i]]] = t - i - 1; update(1, p[a[i]], i); } int res = 1; for (int i = 1; i <= k; i++) { if (0 == l[i] && 0 == r[i]) res = 0; if (0 != l[i] && 0 != r[i]) res = res * 2 % mod; } printf("%d\n", res); } return 0; }
1442A - Extreme Subtraction
#include#include #include #include using namespace std; const int N = 30010; typedef long long ll; int T, n; ll a[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); ll sum = 0; for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); if (a[i] - a[i - 1] < 0) sum = sum + a[i - 1] - a[i]; } if (a[1] >= sum) printf("YES\n"); else printf("NO\n"); } return 0; }
1437C - Chef Monocarp
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 700; const int M = 90010; const int INF = 0x3f3f3f3f; struct Edge { int to, nex, w, c; }; int T, n, s, t, cnt, mf, mc; int dis[N], pre[N], lst[N], f[N]; int head[N], inq[N], ti[N]; Edge edge[2 * M]; queue<int> q; void init() { cnt = -1; mc = mf = 0; memset(head, -1, sizeof(head)); } void add_edge(int u, int v, int w, int c) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].c = c; edge[cnt].nex = head[u]; head[u] = cnt; } int spfa(int s, int t) { memset(dis, INF, sizeof(dis)); memset(f, INF, sizeof(f)); memset(inq, 0, sizeof(inq)); while (!q.empty()) q.pop(); q.push(s); inq[s] = 1, dis[s] = 0, pre[t] = -1; while (!q.empty()) { int u = q.front(); q.pop(); inq[u] = 0; for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w, c = edge[i].c; if (0 == w || dis[v] <= dis[u] + c) continue; dis[v] = dis[u] + c; pre[v] = u; lst[v] = i; f[v] = min(f[u], w); if (1 == inq[v]) continue; inq[v] = 1; q.push(v); } } if (-1 == pre[t]) return 0; return 1; } void mcmf() { while (spfa(s, t)) { mf += f[t]; mc += f[t] * dis[t]; int now = t; while (now != s) { edge[lst[now]].w -= f[t]; edge[lst[now] ^ 1].w += f[t]; now = pre[now]; } } } void insert(int u, int v, int w, int c) { add_edge(u, v, w, c); add_edge(v, u, 0, -c); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { init(); scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &ti[i]); s = 3 * n + 1; t = 3 * n + 2; for (int i = 1; i <= 2 * n; i++) insert(3 * n + 1, i, 1, 0); for (int i = 2 * n + 1; i <= 3 * n; i++) insert(i, 3 * n + 2, 1, 0); for (int i = 1; i <= 2 * n; i++) { for (int k = 2 * n + 1; k <= 3 * n; k++) { insert(i, k, 1, abs(i - ti[k - 2 * n])); } } mcmf(); printf("%d\n", mc); } return 0; }
1430D - String Deletion
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 200010; int T, n, vis[N]; char s[N]; vector<int> v; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { v.clear(); scanf("%d%s", &n, s + 1); for (int i = 0; i <= n; i++) vis[i] = 0; int cnt = 1, len = strlen(s + 1); for (int i = 2; i <= len; i++) { if (s[i] == s[i - 1]) cnt += 1; else { v.push_back(cnt); cnt = 1; } } v.push_back(cnt); int res = 0, l = 0; for (int i = 0; i < v.size(); i++) { if (v[i] >= 2) res += 1; else { while (l < v.size() && (vis[l] || 1 == v[l])) l += 1; if (v.size() == l) { res = res + (v.size() - i + 1) / 2; break; } else { v[l] -= 1; res += 1; } } vis[i] = 1; } printf("%d\n", res); } return 0; }
1422C - Bargain
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 200010; const ll mod = 1000000007; int T; ll dp[N]; char s[N]; ll power(ll a, ll n) { ll res = 1; while (n) { if (n & 1) res = res * a % mod; a = a * a % mod; n >>= 1; } return res; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%s", s + 1); int len = strlen(s + 1); for (int i = 1; i <= len; i++) dp[i] = (dp[i - 1] + 1ll * i * power(10, i - 1) % mod) % mod; ll res = 0; for (int i = 1; i <= len; i++) { ll t = 1ll * i * (i - 1) / 2; res = (res + power(10, len - i) * (s[i] - '0') % mod * t % mod); res = (res + dp[len - i] * (s[i] - '0') % mod) % mod; } printf("%lld\n", res); return 0; }
1426E - Rock, Paper, Scissors
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 10; const int M = 100; const int INF = 0x3f3f3f3f; struct Edge { int to, nex, w, c; }; int n, s, t, cnt; int mf, mc, dis[N], f[N], a[N], b[N]; int pre[N], lst[N], head[N], inq[N]; Edge edge[2 * M]; queue<int> q; void init() { cnt = -1; memset(head, -1, sizeof(head)); } void add_edge(int u, int v, ll w, ll c) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].c = c; edge[cnt].nex = head[u]; head[u] = cnt; } int spfa(int s, int t) { memset(dis, INF, sizeof(dis)); memset(f, INF, sizeof(f)); memset(inq, 0, sizeof(inq)); while (!q.empty()) q.pop(); q.push(s); inq[s] = 1, dis[s] = 0, pre[t] = -1; while (!q.empty()) { int u = q.front(); q.pop(); inq[u] = 0; for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w, c = edge[i].c; if (0 == w || dis[v] <= dis[u] + c) continue; dis[v] = dis[u] + c; pre[v] = u; lst[v] = i; f[v] = min(f[u], w); if (1 == inq[v]) continue; inq[v] = 1; q.push(v); } } if (-1 == pre[t]) return 0; return 1; } void mcmf() { mc = mf = 0; while (spfa(s, t)) { mf += f[t]; mc += f[t] * dis[t]; int now = t; while (now != s) { edge[lst[now]].w -= f[t]; edge[lst[now] ^ 1].w += f[t]; now = pre[now]; } } } void insert(int u, int v, int w, int c) { add_edge(u, v, w, c); add_edge(v, u, 0, -c); } void solve(int f) { init(); for (int i = 1; i <= 3; i++) insert(s, i, a[i], 0); for (int i = 1; i <= 3; i++) insert(i + 3, t, b[i], 0); for (int i = 1; i <= 3; i++) { for (int k = 1; k <= 3; k++) { if (1 == i && 2 == k) insert(i, 3 + k, min(a[i], b[k]), f); else if (2 == i && 3 == k) insert(i, 3 + k, min(a[i], b[k]), f); else if (3 == i && 1 == k) insert(i, 3 + k, min(a[i], b[k]), f); else insert(i, 3 + k, min(a[i], b[k]), 0); } } mcmf(); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &n); for (int i = 1; i <= 3; i++) scanf("%d", &a[i]); for (int i = 1; i <= 3; i++) scanf("%d", &b[i]); s = 7; t = 8; solve(1); printf("%d ", mc); solve(-1); printf("%d\n", -mc); return 0; }
1436D - Bandit in a City
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 200010; struct Edge { int to, nex; }; int n, cnt, head[N], deg[N]; Edge edge[2 * N]; ll sum[N], sz[N], a[N]; void add_edge(int u, int v) { edge[++cnt].to = v; edge[cnt].nex = head[u]; head[u] = cnt; } void dfs(int u, int fa) { sum[u] = a[u]; for (int i = head[u]; 0 != i; i = edge[i].nex) { int v = edge[i].to; if (v == fa) continue; dfs(v, u); sum[u] += sum[v]; sz[u] += sz[v]; } } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &n); for (int i = 2; i <= n; i++) { int t; scanf("%d", &t); add_edge(t, i); deg[t] += 1; } for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); for (int i = 1; i <= n; i++) { if (0 != deg[i]) continue; sz[i] = 1; sum[i] = a[i]; } dfs(1, -1); ll res = 0; for (int i = 1; i <= n; i++) res = max(res, (sum[i] + sz[i] - 1) / sz[i]); printf("%lld\n", res); return 0; }
1430E - String Reversal
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 200010; int n; ll sum[N]; char s[N]; queue<int> q[26]; int lowbit(int x) { return x & (-x); } void update(int x, ll num) { while (x <= n) { sum[x] += num; x += lowbit(x); } } ll ask(int x) { ll res = 0; while (x) { res += sum[x]; x -= lowbit(x); } return res; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d%s", &n, s + 1); for (int i = 1; i <= n; i++) q[s[i] - 'a'].push(i); reverse(s + 1, s + n + 1); ll res = 0; for (int i = 1; i <= n; i++) { int t = q[s[i] - 'a'].front(); q[s[i] - 'a'].pop(); res = res + ask(n) - ask(t); update(t, 1); } printf("%lld\n", res); return 0; }
1400B - RPG Protagonist
#include#include #include #include using namespace std; typedef long long ll; int T; ll p, f, cnts, cntw, s, w; ll solve(ll p, ll f, ll cnts, ll cntw, ll s, ll w, ll as) { ll res = as, aw = min(cntw, p / w); res += aw; cntw -= aw; if (s > w) { swap(s, w); swap(cnts, cntw); } ll bs = min(cnts, f / s); res += bs; f -= s * bs; ll bw = min(cntw, f / w); res += bw; f -= w * bw; return res; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%lld%lld%lld%lld%lld%lld", &p, &f, &cnts, &cntw, &s, &w); ll res = 0; for (ll i = 0; i <= cnts; i++) { if (i * s > p) continue; res = max(res, solve(p - i * s, f, cnts - i, cntw, s, w, i)); } printf("%lld\n", res); } return 0; }
1396B - Stoned Game
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 110; int T, n, a[N]; priority_queue<int> q; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { while (!q.empty()) q.pop(); scanf("%d", &n); int sum = 0, imax = 0; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); sum += a[i]; q.push(a[i]); } int now = 1, lst = 0; while (!q.empty()) { int t = q.top(); q.pop(); if (2 * t > sum) break; if (lst > 0) q.push(lst); sum -= 1; lst = t - 1; now = 1 - now; } if (now) printf("T\n"); else printf("HL\n"); } return 0; }
1368D - AND, OR and square sum
#include#include #include #include #include using namespace std; typedef long long ll; const int N = 200010; const ll INF = 1000000000000000000; int n, id, c[30]; ll a[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); for (int k = 20; k >= 0; k--) if ((a[i] >> k) & 1) c[k] += 1; } for (int i = 1; i <= n; i++) a[i] = 0; for (int i = 20; i >= 0; i--) { for (int k = 1; k <= c[i]; k++) a[k] += (1ll << i); } ll res = 0; for (int i = 1; i <= n; i++) res = res + a[i] * a[i]; printf("%lld\n", res); return 0; }
1359C - Mixing Water
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 200010; const ll INF = 0x3f3f3f3f; const double eps = 1e-5; int T; ll h, c, t; double f(ll x, ll y) { double s = 1.0 * (h * x + c * y) / (x + y); return fabs(1.0 * t - s); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%lld%lld%lld", &h, &c, &t); if (h + c >= 2 * t) { printf("2\n"); continue; } ll l = 0, r = INF; while (r > l) { ll lmid = l + (r - l) / 3; ll rmid = r - (r - l) / 3; if (f(lmid + 1, lmid) <= f(rmid + 1, rmid)) r = rmid - 1; else l = lmid + 1; } printf("%lld\n", 2 * l + 1); } return 0; }
1340B - Nastya and Scoreboard
#include#include #include #include #include #include using namespace std; typedef long long ll; const int N = 2010; int n, k, f, ok[N][N], res[N]; char s[N][10]; char t[20][10] = { "1110111", "0010010", "1011101", "1011011", "0111010", "1101011", "1101111", "1010010", "1111111", "1111011" }; void dfs(int now, int k) { if (f || k < 0) return; if (now == n + 1) { if (0 != k) return; for (int i = 1; i <= n; i++) printf("%d", res[i]); printf("\n"); f = 1; return; } if (0 == ok[now][k]) return; for (int i = 9; i >= 0; i--) { int yes = 1, cnt = 0; for (int j = 0; j < 7; j++) { if (t[i][j] == s[now][j]) continue; if ('0' == t[i][j] && '1' == s[now][j]) { yes = 0; break; } else cnt += 1; } if (0 == yes) continue; res[now] = i; dfs(now + 1, k - cnt); } if (!f) ok[now][k] = 0; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) scanf("%s", s[i]); for (int i = 0; i <= max(n, k); i++) for (int j = 0; j <= max(n, k); j++) ok[i][j] = 1; dfs(1, k); if (!f) printf("-1\n"); return 0; }
1423B - Valuable Paper
#include#include #include #include #include using namespace std; const int N = 20010; const int M = 200010; const int INF = 0x3f3f3f3f; struct Edge { int to, nex, w; }; Edge edge[2 * M]; int n, m, s, t, cnt; int d[N], cur[N], head[N]; int ui[M], vi[M], di[M]; queue<int> q; void init() { cnt = -1; s = 2 * n + 1; t = 2 * n + 2; for (int i = 1; i <= 2 * n + 2; i++) head[i] = -1; } void add_edge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].w = w; edge[cnt].nex = head[u]; head[u] = cnt; } int dfs(int u, int dist) { if (u == t) return dist; for (int &i = cur[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && d[v] == d[u] + 1) { int di = dfs(v, min(dist, w)); if (di > 0) { edge[i].w -= di; edge[i ^ 1].w += di; return di; } } } return 0; } int bfs() { while (!q.empty()) q.pop(); memset(d, 0, sizeof(d)); d[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; -1 != i; i = edge[i].nex) { int v = edge[i].to, w = edge[i].w; if (w > 0 && 0 == d[v]) { d[v] = d[u] + 1; q.push(v); } } } if (d[t] > 0) return 1; return 0; } int dinic() { int res = 0; while (bfs()) { for (int i = 1; i <= t; i++) cur[i] = head[i]; while (int d = dfs(s, INF)) res += d; } return res; } void insert(int u, int v, int w) { add_edge(u, v, w); add_edge(v, u, 0); } bool check(int mid) { init(); for (int i = 1; i <= n; i++) { insert(2 * n + 1, i, 1); insert(n + i, 2 * n + 2, 1); } for (int i = 1; i <= m; i++) { if (di[i] > mid) continue; insert(ui[i], vi[i] + n, 1); } if (dinic() == n) return true; return false; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) scanf("%d%d%d", &ui[i], &vi[i], &di[i]); int l = 0, r = INF; while (r > l) { int mid = (l + r) / 2; if (check(mid)) r = mid; else l = mid + 1; } printf("%d\n", l == INF ? -1 : l); return 0; }
1392D - Omkar and Bed Wars
#include#include #include #include #include #include using namespace std; const int N = 200010; int T, n; char s[N]; vector<int> v; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { v.clear(); scanf("%d%s", &n, s + 1); int cnt = 1; for (int i = 2; i <= n; i++) { if (s[i] == s[i - 1]) cnt += 1; else { v.push_back(cnt); cnt = 1; } } v.push_back(cnt); if (v.size() > 1 && s[1] == s[n]) { int sz = v.size(); v[sz - 1] += v[0]; v[0] = 0; } if (1 == v.size()) printf("%d\n", (v[0] + 2) / 3); else { int res = 0; for (int i = 0; i < v.size(); i++) res += v[i] / 3; printf("%d\n", res); } } return 0; }
1333C - Eugene and an array
#include#include #include #include #include #include #include #include
Codeforces Round #697 (Div. 3)
A - Odd Divisor
#include#include #include #include #include #include #include #include
B - New Year's Number
#include#include #include #include #include #include #include #include
C - Ball in Berland
#include#include #include #include #include #include #include #include
D - Cleaning the Phone
#include#include #include #include #include #include #include #include
E - Advertising Agency
#include#include #include #include using namespace std; typedef long long ll; const int N = 10010; const ll mod = 1000000007; int T, n, k, a[N]; ll fac[N], inv[N]; void init() { fac[0] = 1; for (int i = 1; i < N; i++) fac[i] = 1ll * fac[i - 1] * i % mod; inv[1] = 1; for (int i = 2; i < N; i++) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod; inv[0] = 1; for (int i = 1; i < N; i++) inv[i] = 1ll * inv[i] * inv[i - 1] % mod; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); init(); scanf("%d", &T); while (T--) { scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); sort(a + 1, a + n + 1); reverse(a + 1, a + n + 1); int cnt = 0, num = 0; for (int i = 1; i <= n; i++) { if (a[i] == a[k]) cnt += 1; if (a[i] == a[k] && i <= k) num += 1; } ll res = fac[cnt] * inv[num] % mod * inv[cnt - num] % mod; printf("%lld\n", res); } return 0; }
F - Unusual Matrix
#include#include #include #include using namespace std; typedef long long ll; const int N = 1010; const ll mod = 1000000007; int T, n; char a[N][N], b[N][N]; bool check() { for (int i = 1; i <= n; i++) { if (a[1][i] == b[1][i]) continue; for (int k = 1; k <= n; k++) { if (a[k][i] == '1') a[k][i] = '0'; else a[k][i] = '1'; } } for (int i = 2; i <= n; i++) { int f = 1; if (a[i][1] != b[i][1]) f = 0; for (int k = 2; k <= n; k++) { if (1 == f && a[i][k] != b[i][k]) return false; if (0 == f && a[i][k] == b[i][k]) return false; } } return true; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%s", a[i] + 1); for (int i = 1; i <= n; i++) scanf("%s", b[i] + 1); if (check()) printf("YES\n"); else printf("NO\n"); } return 0; }
G - Strange Beauty
#include#include #include #include using namespace std; typedef long long ll; const int N = 200010; const ll mod = 1000000007; int T, n, a[N], c[N], dp[N]; int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { for (int i = 1; i < N; i++) c[i] = dp[i] = 0; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); c[a[i]] += 1; } for (int i = 1; i < N; i++) { dp[i] += c[i]; for (int k = 2 * i; k < N; k += i) dp[k] = max(dp[k], dp[i]); } int res = 0; for (int i = 1; i < N; i++) res = max(res, dp[i]); printf("%d\n", n - res); } return 0; }