SCPC Week 5 Tutorial
Kavya’s Flip Flops
Original Problem Link: https://codeforces.com/contest/2209/problem/A
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
void solve() {
ll n, c, k;
cin >> n >> c >> k;
vector<ll> monsters(n);
for (int i = 0; i < n; i++) {
cin >> monsters[i];
}
sort(monsters.begin(), monsters.end());
for (int i = 0; i < n; i++) {
if (monsters[i] <= c) {
int flop = min(k, c - monsters[i]);
c += monsters[i] + flop;
k -= flop;
} else {
break;
}
}
cout << c << endl;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) solve();
}
Lasers
Original Problem Link: https://codeforces.com/contest/2148/problem/B
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
void solve() {
int n, m, x, y;
cin >> n >> m >> x >> y;
int temp;
for (int i = 0; i < n; i++) {
cin >> temp;
}
for (int i = 0; i < m; i++) {
cin >> temp;
}
cout << n + m << endl;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) solve();
}
SCPC.zip
Original Problem Link: https://codeforces.com/contest/2254/problem/B
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
void solve() {
int n;
cin >> n;
string s;
cin >> s;
int ans = 1;
int minus = 0;
for (int i = 1; i < n; i++) {
if (s[i] != s[i - 1])
ans += 1;
if (i < n - 1 and s[i] != s[i - 1] and s[i] != s[i + 1]) {
if (s[i - 1] == s[i + 1])
minus = 2;
else
minus = max(minus, 1);
}
}
cout << ans - minus << endl;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) solve();
}
Ryan and Arrays
Original Problem Link: https://codeforces.com/contest/1899/problem/C
Prefix Sum Solution:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
void solve() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int sum = nums[0];
int max_sum = nums[0];
int min_sum = min(0, nums[0]);
for (int i = 1; i < n; i++) {
if (abs(nums[i] % 2) == abs(nums[i - 1] % 2)) {
sum = 0;
min_sum = 0;
}
sum += nums[i];
max_sum = max(max_sum, sum - min_sum);
min_sum = min(min_sum, sum);
}
cout << max_sum << endl;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) solve();
}
Kadane’s Algorithm Solution:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
void solve() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int sum = nums[0];
int max_sum = nums[0];
for (int i = 1; i < n; i++) {
if (abs(nums[i] % 2) == abs(nums[i - 1] % 2))
sum = 0;
sum = max(nums[i], sum + nums[i]);
max_sum = max(max_sum, sum);
}
cout << max_sum << endl;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) solve();
}
Fair and Square
Original Codeforces Link: https://codeforces.com/contest/2241/problem/E
Straightforward Solution:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const int N = 1e6;
vector<int> adj[N];
int parent[N];
int visited[N];
ll subtree_size[N];
ll fill_size(int u) {
if (visited[u])
return 0;
else
visited[u] = true;
ll sum = 1;
for (auto v: adj[u]) {
if (visited[v]) continue;
parent[v] = u;
sum += fill_size(v);
}
subtree_size[u] = sum;
return sum;
}
void solve() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
adj[i].clear();
parent[i] = -1;
visited[i] = false;
subtree_size[i] = 0;
}
vector<ll> node_num(n);
for (int i = 0; i < n; i++) {
cin >> node_num[i];
}
int a, b;
for (int i = 0; i < n - 1; i++) {
cin >> a >> b;
adj[a - 1].push_back(b - 1);
adj[b - 1].push_back(a - 1);
}
fill_size(0);
ll sum = 0, pairs = 0, triplets = 0, total_sum = 0;
for (int i = 0; i < n; i++) {
if ((ll) sqrtl(node_num[i]) * (ll) sqrtl(node_num[i]) == node_num[i]) {
sum = subtree_size[0] - subtree_size[i];
pairs = 0, triplets = 0;
for (auto v : adj[i]) {
if (parent[i] == v) continue;
triplets += subtree_size[v] * pairs;
pairs += subtree_size[v] * sum;
sum += subtree_size[v];
}
total_sum += pairs + triplets;
}
}
cout << total_sum << endl;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) solve();
}
Simplified Solution:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const int N = 1e6;
vector<int> adj[N];
int visited[N];
ll node_num[N];
ll subtree_size[N];
ll total_sum;
ll dfs(int n, int u) {
if (visited[u])
return 0;
else
visited[u] = true;
subtree_size[u] = 1;
bool is_square = (ll) sqrt(node_num[u]) * (ll) sqrt(node_num[u]) == node_num[u];
ll sze = 0, sum = 0, pairs = 0, triplets = 0;
for (auto v: adj[u]) {
if (visited[v]) continue;
sze = dfs(n, v);
subtree_size[u] += sze;
if (is_square) {
triplets += sze * pairs;
pairs += sze * sum;
sum += sze;
}
}
if (is_square) {
triplets += (n - subtree_size[u]) * pairs;
pairs += (n - subtree_size[u]) * sum;
}
total_sum += pairs + triplets;
return subtree_size[u];
}
void solve() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
adj[i].clear();
visited[i] = false;
node_num[i] = 0;
subtree_size[i] = 0;
}
for (int i = 0; i < n; i++) {
cin >> node_num[i];
}
int a, b;
for (int i = 0; i < n - 1; i++) {
cin >> a >> b;
adj[a - 1].push_back(b - 1);
adj[b - 1].push_back(a - 1);
}
total_sum = 0;
dfs(n, 0);
cout << total_sum << endl;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) solve();
}