Skip to content

Commit d98ed10

Browse files
committed
Google Code Jam 2020 Round 3 (Rank: 240, Score: 12/100)
1 parent 7651e9a commit d98ed10

File tree

2 files changed

+223
-0
lines changed

2 files changed

+223
-0
lines changed

gcj/2020_3/naming.cpp

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
const int N = 66;
6+
7+
string val[N][N];
8+
9+
int dp[N][N];
10+
pair<int, int> pre[N][N];
11+
char a[N], b[N];
12+
13+
void solve() {
14+
scanf("%s %s", a, b);
15+
int na = strlen(a), nb = strlen(b);
16+
for (int i = 0; i <= na; ++i) {
17+
for (int j = 0; j <= nb; ++j) {
18+
dp[i][j] = na + nb;
19+
val[i][j] = "";
20+
}
21+
}
22+
dp[0][0] = 0;
23+
for (int i = 0; i <= na; ++i) {
24+
for (int j = 0; j <= nb; ++j) {
25+
if (i + 1 <= na && dp[i+1][j] > dp[i][j] + 1) { // delete
26+
dp[i+1][j] = dp[i][j] + 1;
27+
val[i+1][j] = val[i][j];
28+
pre[i+1][j] = {i, j};
29+
}
30+
if (j + 1 <= nb && dp[i][j+1] > dp[i][j] + 1) { // insert
31+
dp[i][j+1] = dp[i][j] + 1;
32+
val[i][j+1] = val[i][j];
33+
val[i][j+1].push_back(b[j]);
34+
pre[i][j+1] = {i, j};
35+
}
36+
if (i+1 <= na && j+1 <= nb) {
37+
int cost = (a[i] != b[j]);
38+
if (dp[i+1][j+1] > dp[i][j] + cost) {
39+
dp[i+1][j+1] = dp[i][j] + cost;
40+
val[i+1][j+1] = val[i][j];
41+
val[i+1][j+1].push_back(b[j]);
42+
pre[i+1][j+1] = {i, j};
43+
}
44+
}
45+
}
46+
}
47+
int d = dp[na][nb];
48+
string ans = a;
49+
int x = na, y = nb;
50+
while (d/2 != dp[x][y] && (x || y)) {
51+
pair<int, int> p = pre[x][y];
52+
x = p.first;
53+
y = p.second;
54+
}
55+
ans = val[x][y] + string(a + x);
56+
printf("%s\n", ans.c_str());
57+
}
58+
59+
int main() {
60+
#ifdef LOCAL
61+
time_t starttime = clock();
62+
#endif
63+
int tt;
64+
scanf("%d", &tt);
65+
for (int tc = 1; tc <= tt; tc++) {
66+
printf("Case #%d: ", tc);
67+
solve();
68+
#ifdef LOCAL
69+
cerr << "~ TC#" << tc << " done! execution time: " <<
70+
(double)(clock()-starttime) / CLOCKS_PER_SEC << " s" << endl;
71+
#endif
72+
}
73+
return 0;
74+
}
+149
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
// Status: unfinished and I think the idea is wrong
2+
3+
#include <bits/stdc++.h>
4+
5+
using namespace std;
6+
7+
8+
template<typename A>
9+
ostream& operator<<(ostream& os, vector<A> v) {
10+
os << "{";
11+
for (size_t i = 0; i < v.size(); ++i) {
12+
if (i)
13+
os << ", ";
14+
os << v[i];
15+
}
16+
return os << "}";
17+
}
18+
19+
template<typename A, typename B>
20+
ostream& operator<<(ostream& os, pair<A, B> p) {
21+
return os << "(" << p.first << ", " << p.second << ")";
22+
}
23+
24+
template<typename A, typename B, typename C>
25+
ostream& operator<<(ostream& os, tuple<A, B, C> t) {
26+
return os << "(" << get<0>(t) << ", " << get<1>(t) << ", " << get<2>(t) << ")";
27+
}
28+
29+
template<typename A, typename B, typename C, typename D>
30+
ostream& operator<<(ostream& os, tuple<A, B, C, D> t) {
31+
return os << "(" << get<0>(t) << ", " << get<1>(t) << ", " << get<2>(t) << ", " << get<3>(t) << ")";
32+
}
33+
34+
template <size_t N>
35+
ostream& operator<<(ostream& os, bitset<N> b) {
36+
for (size_t i = 0; i < N; ++i) {
37+
os << static_cast<char>('0' + b[i]);
38+
}
39+
return os;
40+
}
41+
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:" << (__VA_ARGS__) << endl
42+
43+
44+
long long gcd(long long a, long long b) {
45+
return a ? gcd(b % a, a) : b;
46+
}
47+
48+
void solve() {
49+
int n, d;
50+
scanf("%d %d", &n, &d);
51+
vector<int> x(n), y(n);
52+
vector<int> p(n), q(n);
53+
for (int i = 0; i < n; ++i) {
54+
scanf("%d %d", &x[i], &y[i]);
55+
p[i] = x[i] + y[i];
56+
q[i] = x[i] - y[i];
57+
}
58+
vector<int> add = p, sub = q;
59+
vector<int> vp, vq;
60+
for (int i = 0; i < n; ++i) {
61+
add.emplace_back(p[i] + d);
62+
add.emplace_back(p[i] - d);
63+
sub.emplace_back(q[i] + d);
64+
sub.emplace_back(q[i] - d);
65+
}
66+
auto make_distinct = [](vector<int> & v) {
67+
sort(v.begin(), v.end());
68+
v.erase(unique(v.begin(), v.end()), v.end());
69+
};
70+
make_distinct(vp);
71+
make_distinct(vq);
72+
while (true) {
73+
bool ok = true;
74+
for (int i = 0; i < n; ++i) {
75+
for (int dp : vp) {
76+
add.emplace_back(p[i] + dp);
77+
}
78+
for (int dq : vq) {
79+
sub.emplace_back(q[i] + dq);
80+
}
81+
}
82+
}
83+
make_distinct(add);
84+
make_distinct(sub);
85+
vector<vector<pair<int, int>>> dir(add.size() * sub.size());
86+
int tot = (int)add.size() * sub.size();
87+
vector<pair<int, int>> sz(tot);
88+
long long up = 0, down = 0;
89+
for (int i = 0; i + 1 < (int)add.size(); ++i) {
90+
for (int j = 0; j + 1 < (int)sub.size(); ++j) {
91+
int id = i * (int)sub.size() + j;
92+
int pp = add[i] + add[i+1];
93+
int qq = sub[j] + sub[j+1];
94+
sz[id] = {add[i+1] - add[i], sub[j+1] - sub[j]};
95+
for (int k = 0; k < n; ++k) {
96+
if (max(abs(2 * p[k] - pp), abs(2 * q[k] - qq)) <= 2 * d)
97+
dir[id].emplace_back(4 * x[k] - (pp + qq), 4 * y[k] - (pp - qq));
98+
}
99+
if (dir[id].size() > 0) {
100+
down += 1LL * (add[i+1] - add[i]) * (sub[j+1] - sub[j]);
101+
// sort(dir[id].begin(), dir[id].end());
102+
cerr << id << " " << pp << " " << qq << " " << sz[id] << " " << dir[id] << endl;
103+
}
104+
}
105+
}
106+
vector<bool> dup(tot, false);
107+
for (int i = 0; i < tot; ++i) {
108+
if (dir[i].empty()) continue;
109+
for (int j = i+1; j < tot; ++j) {
110+
if (dir[j].empty()) continue;
111+
if (dir[i] == dir[j]) {
112+
dup[i] = dup[j] = true;
113+
}
114+
}
115+
}
116+
117+
for (int i = 0; i + 1 < (int)add.size(); ++i) {
118+
for (int j = 0; j + 1 < (int)sub.size(); ++j) {
119+
int id = i * (int)sub.size() + j;
120+
if (dir[id].empty()) continue;
121+
if (!dup[id]) continue;
122+
up += 1LL * (add[i+1] - add[i]) * (sub[j+1] - sub[j]);
123+
}
124+
}
125+
if (down == 0)
126+
down = 1;
127+
cerr << up << " " << down << endl;
128+
long long g = gcd(up, down);
129+
up /= g;
130+
down /= g;
131+
printf("%lld %lld\n", up, down);
132+
}
133+
134+
int main() {
135+
#ifdef LOCAL
136+
time_t starttime = clock();
137+
#endif
138+
int tt;
139+
scanf("%d", &tt);
140+
for (int tc = 1; tc <= tt; tc++) {
141+
printf("Case #%d: ", tc);
142+
solve();
143+
#ifdef LOCAL
144+
cerr << "~ TC#" << tc << " done! execution time: " <<
145+
(double)(clock()-starttime) / CLOCKS_PER_SEC << " s" << endl;
146+
#endif
147+
}
148+
return 0;
149+
}

0 commit comments

Comments
 (0)