Skip to content

Commit 2cef86b

Browse files
committed
Add solutions to Week of Code 16
1 parent 72f2870 commit 2cef86b

File tree

5 files changed

+333
-0
lines changed

5 files changed

+333
-0
lines changed

‎devu-and-lucky-numbers.cpp‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// devu-and-lucky-numbers.cpp
2+
// Devu and Lucky Numbers
3+
// Author: derekhh
4+
// Jul 7, 2015
5+
6+
#include <iostream>
7+
using namespace std;
8+
9+
const int MOD = 1000000007;
10+
const int MAXN = 100;
11+
int f[MAXN + 1][MAXN + 1][MAXN + 1], cnt[MAXN + 1][MAXN + 1][MAXN + 1];
12+
int pow10[301];
13+
14+
int main() {
15+
int x, y, z;
16+
cin >> x >> y >> z;
17+
pow10[0] = 1;
18+
for (int i = 1; i <= x + y + z; i++)
19+
pow10[i] = ((long long) pow10[i - 1] * 10) % MOD;
20+
f[0][0][0] = 0;
21+
cnt[0][0][0] = 1;
22+
int ans = 0;
23+
for (int i = 0; i <= x; i++) {
24+
for (int j = 0; j <= y; j++) {
25+
for (int k = 0; k <= z; k++) {
26+
if (i == 0 && j == 0 && k == 0) continue;
27+
if (i > 0) {
28+
cnt[i][j][k] = (cnt[i][j][k] + cnt[i - 1][j][k]) % MOD;
29+
f[i][j][k] = (f[i][j][k] + (long long) 4 * pow10[i + j + k - 1] * cnt[i - 1][j][k] + f[i - 1][j][k]) % MOD;
30+
}
31+
if (j > 0) {
32+
cnt[i][j][k] = (cnt[i][j][k] + cnt[i][j - 1][k]) % MOD;
33+
f[i][j][k] = (f[i][j][k] + (long long) 5 * pow10[i + j + k - 1] * cnt[i][j - 1][k] + f[i][j - 1][k]) % MOD;
34+
}
35+
if (k > 0) {
36+
cnt[i][j][k] = (cnt[i][j][k] + cnt[i][j][k - 1]) % MOD;
37+
f[i][j][k] = (f[i][j][k] + (long long) 6 * pow10[i + j + k - 1] * cnt[i][j][k - 1] + f[i][j][k - 1]) % MOD;
38+
}
39+
ans = (ans + f[i][j][k]) % MOD;
40+
}
41+
}
42+
}
43+
cout << ans << endl;
44+
return 0;
45+
}

‎sprinklers.cpp‎

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// sprinklers.cpp
2+
// Sprinklers
3+
// Week of Code 16
4+
// Author: derekhh
5+
// Jul 8, 2015
6+
7+
#include <cstdio>
8+
#include <cstring>
9+
#include <climits>
10+
#include <vector>
11+
#include <cmath>
12+
using namespace std;
13+
14+
const int MAXN = 10000;
15+
const int LOG_MAXN = 14;
16+
int pos[MAXN + 1], f[MAXN + 1][LOG_MAXN], logs[MAXN + 1];
17+
int n, bestval, bestq;
18+
vector<int> bestans;
19+
20+
void rmq_init() {
21+
for (int i = 1; i <= n; i++)
22+
f[i][0] = pos[i];
23+
for (int j = 1; (1 << j) <= n; j++) {
24+
for (int i = 1; i <= n; i++) {
25+
f[i][j] = f[i][j - 1];
26+
if (i + (1 << (j - 1)) <= n)
27+
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
28+
}
29+
}
30+
}
31+
32+
int main() {
33+
int j = 1;
34+
for (int i = 0; (1 << i) <= MAXN; i++)
35+
for (int k = 0; j <= MAXN && k < (1 << i); j++, k++)
36+
logs[j] = i;
37+
int t;
38+
scanf("%d", &t);
39+
while (t--) {
40+
int m, s, q;
41+
scanf("%d%d%d%d", &n, &m, &s, &q);
42+
memset(pos, 0, sizeof(pos));
43+
for (int i = 0; i < m; i++) {
44+
int val;
45+
scanf("%d", &val);
46+
pos[val] = val;
47+
}
48+
rmq_init();
49+
bestval = INT_MAX;
50+
vector<int> v;
51+
for (int i = 0; i < n; i++) {
52+
v.clear();
53+
int lb = 1;
54+
int ub = i + 1;
55+
int len = ub - lb + 1;
56+
int prev = max(f[lb][logs[len]], f[ub - (1 << logs[len]) + 1][logs[len]]);
57+
if (prev == 0) continue;
58+
v.push_back(prev);
59+
while (prev + i < n) {
60+
lb = prev + 1;
61+
ub = min(prev + 2 * i + 1, n);
62+
len = ub - lb + 1;
63+
int maxVal = max(f[lb][logs[len]], f[ub - (1 << logs[len]) + 1][logs[len]]);
64+
if (maxVal == 0) break;
65+
v.push_back(maxVal);
66+
prev = maxVal;
67+
}
68+
if (prev + i >= n) {
69+
int val = v.size() * s + q * i;
70+
if (val < bestval) {
71+
bestval = val;
72+
bestq = i;
73+
bestans = v;
74+
}
75+
}
76+
}
77+
printf("%d %d\n", (int) bestans.size(), bestq);
78+
for (int i = 0; i < bestans.size(); i++)
79+
printf("%d ", bestans[i]);
80+
printf("\n");
81+
}
82+
return 0;
83+
}

‎sum-of-absolutes.cpp‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// sum-of-absolutes.cpp
2+
// Sum of Absolutes
3+
// Author: derekhh
4+
// Jul 6, 2015
5+
6+
#include <iostream>
7+
using namespace std;
8+
9+
const int MAXN = 100000;
10+
int sum[MAXN + 1];
11+
12+
int main()
13+
{
14+
int n, q;
15+
cin >> n >> q;
16+
sum[0] = 0;
17+
for (int i = 1; i <= n; i++) {
18+
int val;
19+
cin >> val;
20+
sum[i] = sum[i - 1] + val;
21+
}
22+
while (q--) {
23+
int l, r;
24+
cin >> l >> r;
25+
int val = sum[r] - sum[l - 1];
26+
if (val % 2 == 0)
27+
cout << "Even" << endl;
28+
else
29+
cout << "Odd" << endl;
30+
}
31+
return 0;
32+
}

‎vim-war.cpp‎

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// vim-war.cpp
2+
// Vim War
3+
// Week of Code 16
4+
// Author: derekhh
5+
// Jul 9, 2015
6+
7+
#include <cstdio>
8+
#include <cstring>
9+
using namespace std;
10+
11+
const int MAXN = 100000;
12+
const int MAXM = 20;
13+
const int MOD = 1000000007;
14+
15+
int originalSkill[MAXN];
16+
int f[1 << MAXM][MAXM + 1];
17+
18+
int modexp(int a, int b) {
19+
long long res = 1 % MOD, val = a % MOD;
20+
while (b) {
21+
if (b & 1)
22+
res = (res * val) % MOD;
23+
val = (val * val) % MOD;
24+
b >>= 1;
25+
}
26+
return (int)res;
27+
}
28+
29+
int main() {
30+
int n, m;
31+
char str[MAXM + 1];
32+
scanf("%d %d\n", &n, &m);
33+
for (int i = 0; i < n; i++) {
34+
scanf("%s", str);
35+
int val = 0;
36+
for (int j = 0; j < m; j++)
37+
val = val * 2 + (str[j] - '0');
38+
originalSkill[i] = val;
39+
}
40+
int target = 0, newm = 0;
41+
scanf("%s", str);
42+
for (int i = 0; i < m; i++) {
43+
if (str[i] == '1') {
44+
target = target * 2 + 1;
45+
newm++;
46+
}
47+
}
48+
49+
for (int i = 0; i < n; i++) {
50+
int val = 0;
51+
bool flag = true;
52+
for (int j = m - 1; j >= 0; j--) {
53+
if (str[m - j - 1] == '1') {
54+
if (originalSkill[i] & (1 << j)) val = val * 2 + 1;
55+
else val *= 2;
56+
}
57+
else {
58+
if (originalSkill[i] & (1 << j)) {
59+
flag = false;
60+
break;
61+
}
62+
}
63+
}
64+
if (flag) f[val][newm]++;
65+
}
66+
67+
for (int j = newm; j > 0; j--) {
68+
for (int i = 0; i < (1 << newm); i++) {
69+
f[i][j - 1] += f[i][j];
70+
int val = (i & (1 << (j - 1)));
71+
if (val == 0) {
72+
f[i | (1 << (j - 1))][j - 1] += f[i][j];
73+
}
74+
}
75+
}
76+
77+
/*
78+
for (int i = 0; i < (1 << newm); i++) {
79+
printf("f[%d][0] = %d\n", i, f[i][0]);
80+
}
81+
*/
82+
83+
int ans = 0;
84+
for (int i = 0; i < (1 << newm); i++) {
85+
int cnt = 0;
86+
for (int j = 0; j < newm; j++) {
87+
if (i & (1 << j))
88+
cnt++;
89+
}
90+
int val = modexp(2, f[i][0]);
91+
if (cnt % 2 == newm % 2) ans = (ans + val) % MOD;
92+
else ans = (ans - val + MOD) % MOD;
93+
}
94+
if (target == 0)
95+
printf("%d\n", (ans - 1 + MOD) % MOD);
96+
else
97+
printf("%d\n", ans);
98+
return 0;
99+
}

‎white-falcon-and-xor.cpp‎

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// white-falcon-and-xor.cpp
2+
// White Falcon and XOR
3+
// Week of Code 16
4+
// Author: derekhh
5+
// Jul 10, 2015
6+
7+
#include <cstdio>
8+
#include <cstring>
9+
#include <cassert>
10+
#include <ctime>
11+
#include <map>
12+
#include <iostream>
13+
using namespace std;
14+
15+
const int MAXN = 8000;
16+
const int MAXM = 6;
17+
int a[MAXN], b[MAXN];
18+
int parent[1 << MAXM];
19+
int final;
20+
int lazy;
21+
int ans[MAXN];
22+
23+
int find(int x) {
24+
if (parent[x] != x)
25+
parent[x] = find(parent[x]);
26+
return parent[x];
27+
}
28+
29+
void Union(int a, int b) {
30+
int pa = find(a);
31+
int pb = find(b);
32+
if (pa != pb) parent[pa] = pb;
33+
}
34+
35+
int main() {
36+
int n, m;
37+
scanf("%d %d", &n, &m);
38+
for (int i = 0; i < n; i++)
39+
scanf("%d", &a[i]);
40+
for (int i = 0; i < n; i++) {
41+
scanf("%d", &b[i]);
42+
ans[i] = 0;
43+
}
44+
45+
for (int j = 0; j < n; j++) {
46+
lazy = 1;
47+
final = 0;
48+
for (int i = 0; i < (1 << MAXM); i++) {
49+
parent[i] = i;
50+
}
51+
for (int i = 0; j + i < n; i++) {
52+
int pa = find(a[j + i]);
53+
int pb = find(b[j + i]);
54+
final ^= a[j + i];
55+
if (pa != pb) {
56+
for (int k = 0; k < (1 << MAXM); k++) {
57+
Union(k, k ^ a[j + i] ^ b[j + i]);
58+
}
59+
}
60+
else {
61+
lazy = (lazy << 1) % m;
62+
}
63+
if (find(final) == find(0)) {
64+
ans[i] += lazy;
65+
if (ans[i] >= m) ans[i] -= m;
66+
}
67+
}
68+
}
69+
70+
for (int i = 0; i < n; i++) {
71+
cout << ans[i] << endl;
72+
}
73+
return 0;
74+
}

0 commit comments

Comments
 (0)