目前没写思路,有空再说
A. Min Or Sum
思路
签到
#include <bits/stdc++.h>
using namespace std;
int num[40];
int main() {
int t;
scanf("%d", &t);
while (t -- ) {
for (int i = 0; i < 30; i ++ ) num[i] = 0;
int n;
scanf("%d", &n);
int ans = 0;
for (int i = 1; i <= n; i ++ ) {
int a;
scanf("%d", &a);
ans |= a;
}
cout << ans << endl;
}
return 0;
}
B. Avoid Local Maximums
思路
签到
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
int main() {
int t;
scanf("%d", &t);
while (t -- ) {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d", a + i);
int cnt = 0;
for (int i = 2; i < n; i ++ ) {
if (a[i] > a[i - 1] && a[i] > a[i + 1]) {
if (i + 2 <= n) a[i + 1] = max(a[i], a[i + 2]);
else a[i + 1] = a[i];
cnt ++;
}
}
printf("%d\n", cnt);
for (int i = 1; i <= n; i ++ )
printf("%d ", a[i]);
puts("");
}
return 0;
}
C. Differential Sorting
思路
思维
优化版
#include <bits/stdc++.h>
using namespace std;
int a[N];
int main() {
int t;
scanf("%d", &t);
while (t -- ) {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d", a + i);
bool ok = 1;
for (int i = 1; i < n; i ++ )
if (a[i] > a[i + 1]) {
ok = 0;
break;
}
if (ok) {
puts("0");
continue;
}
if (a[n - 1] <= a[n] && a[n] >= 0) {
printf("%d\n", n - 2);
for (int i = 1; i <= n - 2; i ++ )
printf("%d %d %d\n", i, n - 1, n);
} else puts("-1");
}
return 0;
}
比赛奇葩思路
#include <bits/stdc++.h>
using namespace std;
#define FI first
#define SE second
#define PB push_back
typedef pair<int, int> PII;
const int N = 2e5 + 10;
int a[N];
PII sum_mx[N], sum_mn[N];
struct Node {
int x, y, z;
};
int main() {
int t;
scanf("%d", &t);
while (t -- ) {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d", a + i);
if (a[n] < a[n - 1]) {
printf("-1\n");
continue;
}
sum_mn[n].FI = 1e9 + 10;
sum_mx[n].FI = -1e9 - 10, sum_mx[n - 1].FI = -1e9 - 10;
for (int i = n - 1; i; i -- ) {
if (a[i + 1] <= sum_mn[i + 1].FI) {
sum_mn[i] = {a[i + 1], i + 1};
} else {
sum_mn[i] = sum_mn[i + 1];
}
if (i == n - 1) continue;
if (a[i + 2] >= sum_mx[i + 2].FI) {
sum_mx[i] = {a[i + 2], i + 2};
} else {
sum_mx[i] = sum_mx[i + 2];
}
}
vector<Node> res;
int pos = -1;
for (int i = n - 2; i; i -- ) {
if (sum_mn[i].FI - sum_mx[i].FI <= a[i + 1]) {
pos = i;
break;
}
}
for (int i = 1; i <= pos; i ++ ) {
res.PB({i, sum_mn[pos].SE, sum_mx[pos].SE});
a[i] = sum_mn[pos].FI - sum_mx[pos].FI;
}
bool ok = 1;
for (int i = 2; i <= n; i ++ )
if (a[i] < a[i - 1]) {
ok = 0;
break;
}
if (!ok) {
printf("-1\n");
continue;
}
printf("%d\n", res.size());
for (int i = 0; i < res.size(); i ++ )
printf("%d %d %d\n", res[i].x, res[i].y, res[i].z);
}
return 0;
}
D. Infinite Set
思路
d p dp dp
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int dp[N];
int a[N];
int num[N];
int n, p;
int main() {
scanf("%d%d", &n, &p);
for (int i = 1; i <= n; i ++ )
scanf("%d", a + i);
sort(a + 1, a + n + 1);
set<int> st;
for (int i = 1; i <= n; i ++ ) {
if (p <= 30 && a[i] >= (1 << p)) break;
int tmp = a[i];
bool ok = 1;
while ((tmp % 2 == 1 || tmp % 4 == 0) && tmp) {
if (tmp % 2 == 1) tmp /= 2;
else tmp /= 4;
if (st.count(tmp)) {
ok = 0;
break;
}
}
if (ok) st.insert(a[i]);
}
for (auto t : st) {
int tmp = t;
int cnt = 0;
while (tmp) {
tmp >>= 1;
cnt ++;
}
num[cnt - 1] ++;
}
dp[0] = num[0];
dp[1] = num[1] + dp[0];
for (int i = 2; i < p; i ++ )
dp[i] = ((dp[i - 1] + dp[i - 2]) % mod + num[i]) % mod;
int ans = 0;
for (int i = 0; i < p; i ++ )
ans = (ans + dp[i]) % mod;
cout << ans << endl;
return 0;
}
E. Cars
思路
二分图 + t o p s o r t topsort topsort
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
struct Node{
int op;
int u, v;
}edg[N];
int d[N];
int e[N * 2], ne[N * 2], h[N], idx;
int q[N];
int a[N];
int ans[N];
int n, m;
int hh = 0, tt = -1;
bool ok = 1;
void dfs(int u, int f) {
a[u] = f;
for (int i = h[u]; ~i; i = ne[i]) {
int j = e[i];
if (a[j] != 0) {
if (a[j] + f != 0) ok = 0;
} else dfs(j, 0 - f);
}
}
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void topsort() {
for (int i = 1; i <= n; i ++ )
if (!d[i]) q[++ tt] = i;
while (hh <= tt) {
int tmp = q[hh ++ ];
for (int i = h[tmp]; ~i; i = ne[i]) {
int j = e[i];
if (-- d[j] == 0) q[++ tt] = j;
}
}
}
int main() {
memset(h, -1, sizeof h);
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i ++ ) {
int op, u, v;
scanf("%d%d%d", &op, &u, &v);
edg[i] = {op, u, v};
add(u, v), add(v, u);
}
for (int i = 1; i <= n; i ++ )
if (!a[i]) dfs(i, 1);
if (!ok) {
puts("NO");
return 0;
}
idx = 0;
memset(h, -1, sizeof h);
for (int i = 1; i <= m; i ++ ) {
int op = edg[i].op, u = edg[i].u, v = edg[i].v;
if (op == 1) {
if (a[u] == 1) {
add(u, v);
d[v] ++;
} else {
add(v, u);
d[u] ++;
}
} else {
if (a[u] == 1) {
add(v, u);
d[u] ++;
} else {
add(u, v);
d[v] ++;
}
}
}
topsort();
if (tt != n - 1) {
puts("NO");
return 0;
}
puts("YES");
for (int i = 0; i < n; i ++ )
ans[q[i]] = i;
for (int i = 1; i <= n; i ++ ) {
if (a[i] == 1) printf("L ");
else printf("R ");
printf("%d\n", ans[i]);
}
return 0;
}