Codeforces Round #772 (Div. 2)
A
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int T, n, m;
void solve()
{
scanf("%d", &n);
int res = 0;
for (int i = 1; i <= n; i ++ ) {
int x;
scanf("%d", &x);
res |= x;
}
printf("%d\n", res);
}
int main() {
scanf("%d", &T);
while (T -- ) solve();
return 0;
}
B
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5 + 10;
int T, n;
int a[N];
void solve()
{
scanf("%d", &n);
int res = 0, maxx = 0;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 2; i < n; i ++ ) {
if (a[i] > a[i - 1] && a[i] > a[i + 1]) {
for (int j = i; j <= min(n, i + 2); j ++ )
a[i + 1] = max(a[i + 1], a[j]);
res ++;
}
}
printf("%d\n", res);
for (int i = 1; i <= n; i ++ ) printf("%d ", a[i]);
printf("\n");
}
int main() {
scanf("%d", &T);
while (T -- ) solve();
return 0;
}
C
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int T, n;
int a[N];
struct node {
int x, y, z;
};
void solve()
{
scanf("%lld", &n);
bool flag = 1;
for (int i = 1; i <= n; i ++ ) scanf("%lld", &a[i]);
vector<int> v;
vector<node> ans;
for (int i = 2; i <= n; i ++ )
if (a[i] < a[i - 1])
flag = 0;
if (flag) {
printf("0\n");
return ;
}
int maxx = max(a[n], a[n - 1]);
if (maxx < 0) {
printf("-1\n");
return;
}
v.push_back(a[n]);
v.push_back(a[n - 1]);
v.push_back(a[n - 1] - a[n]);
ans.push_back({n - 2, n - 1, n});
for (int i = n - 3; i >= 1; i -- ) {
v.push_back(v.back() - maxx);
if (maxx == a[n]) ans.push_back({i, i + 1, n});
else ans.push_back({i, i + 1, n - 1});
}
reverse(v.begin(), v.end());
flag = 1;
for (int i = 1; i < n; i ++ ) {
if (v[i] < v[i - 1])
flag = 0;
}
if (!flag) {
printf("-1\n");
return;
}
printf("%lld\n", (int)ans.size());
for (auto [x, y, z] : ans)
cout << x << " " << y << " " << z << endl;
}
signed main() {
scanf("%lld", &T);
while (T -- ) solve();
return 0;
}
D
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5 + 10, MOD = 1e9 + 7;
int T, n, p;
int a[N], f[N];
int main() {
scanf("%d%d", &n, &p);
f[0] = 1;
for (int i = 1; i <= p; i ++ ) {
f[i] = f[i - 1];
if (i > 1) f[i] = (f[i] + f[i - 2]) % MOD;
}
for (int i = 1; i <= p; i ++)
f[i] = (f[i] + f[i - 1]) % MOD;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
sort(a + 1, a + 1 + n);
set<int> s;
LL res = 0;
for (int i = 1; i <= n; i ++ ) {
bool flag = true;
int m = a[i];
while (m) {
if (s.count(m)) {
flag = false;
break;
}
if (m % 2 == 1) m /= 2;
else if (m % 4 == 0) m /= 4;
else break;
}
if (!flag) continue;
s.insert(a[i]);
int b = __lg(a[i]) + 1;
if (b <= p) res = (res + f[p - b]) % MOD;
}
printf("%lld\n", res);
return 0;
}
E
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5 + 10, M= N * 2;
int n, m;
int h[N], op[N], e[M], ne[M], idx;
int a[N], b[N], d[N], q[N], col[N], topo[N];
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
bool dfs(int u, int c)
{
col[u] = c;
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
if (col[j] == -1) {
if (!dfs(j, c ^ 1))
return false;
}
else if (col[j] == c) return false;
}
return true;
}
bool toposort()
{
memset(h, -1, sizeof h);
memset(e, 0, sizeof e);
memset(ne, 0, sizeof ne);
idx = 0;
for (int i = 1; i <= m; i ++ ) {
if (col[a[i]] == 1) swap(a[i], b[i]);
if (op[i] == 1) {
add(a[i], b[i]), d[b[i]] ++;
//cout << a[i] << " -> " << b[i] << endl;
}
else {
add(b[i], a[i]), d[a[i]] ++;
//cout << b[i] << " -> " << a[i] << endl;
}
}
//for (int i = 1; i <= 4; i ++ ) cout << d[i] << endl;
int hh = 0, tt = -1;
for (int i = 1; i <= n; i ++ )
if (d[i] == 0) q[++ tt] = i;
int pos = 0;
while (hh <= tt) {
int t = q[hh ++ ];
topo[t] = pos ++;
for (int i = h[t]; i != -1; i = ne[i]) {
int j = e[i];
if (-- d[j] == 0)
q[ ++ tt] = j;
}
}
return tt == n - 1;
}
int main() {
scanf("%d%d", &n, &m);
memset(h, -1, sizeof h);
memset(col, -1, sizeof col);
for (int i = 1; i <= m; i ++ ) {
scanf("%d%d%d", &op[i], &a[i], &b[i]);
add(a[i], b[i]), add(b[i], a[i]);
}
for (int i = 1; i <= n; i ++ ) {
if (col[i] == -1) {
if (!dfs(i, 0)) {
printf("NO\n");
return 0;
}
}
}
if (!toposort()) printf("NO\n");
else {
printf("YES\n");
for (int i = 1; i <= n; i ++ )
cout << (col[i] == 0 ? "L " : "R ") << topo[i] << endl;
}
return 0;
}