Skip to content

Commit 06bee87

Browse files
committed
misc
1 parent bc15c12 commit 06bee87

File tree

3 files changed

+111
-16
lines changed

3 files changed

+111
-16
lines changed

contest/2021-spring/守卫城堡.cc

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#define FOR(i, a, b) for (remove_cv<remove_reference<decltype(b)>::type>::type i = (a); i < (b); i++)
2+
#define REP(i, n) FOR(i, 0, n)
3+
4+
namespace {
5+
const int N = 10000, V = 4*N+3;
6+
struct Edge {int v, c, next; } e[N*12*2];
7+
// src is sink-1
8+
int head[V], allo, sink, h[V+2], nh[V+3];
9+
10+
void insert(int u, int v, int c) {
11+
e[allo] = Edge{v, c, head[u]}; head[u] = allo++;
12+
e[allo] = Edge{u, 0, head[v]}; head[v] = allo++;
13+
}
14+
15+
int augment(int u, int d, int sink) {
16+
if (u == sink) return d;
17+
int old = d, minh = sink;
18+
for (int i = head[u]; ~i; i = e[i].next)
19+
if (e[i].c > 0) {
20+
int v = e[i].v;
21+
if (h[v]+1 == h[u]) {
22+
int dd = augment(v, min(d, e[i].c), sink);
23+
e[i].c -= dd;
24+
e[i^1].c += dd;
25+
if (!(d -= dd) || h[sink-1] > sink) break;
26+
}
27+
minh = min(minh, h[v]);
28+
}
29+
if (d == old) {
30+
if (!--nh[h[u]]) h[sink-1] = sink+1;
31+
nh[h[u] = minh+1]++;
32+
}
33+
return old-d;
34+
}
35+
}
36+
37+
class Solution {
38+
public:
39+
int guardCastle(vector<string>& grid) {
40+
int n = grid[0].size(), p = 4*n, src = p+1;
41+
sink = src+1;
42+
fill_n(head, sink+1, -1);
43+
allo = 0;
44+
45+
REP(i, 2) REP(j, n) {
46+
int v = (2*j+i)*2;
47+
if (grid[i][j] == '.')
48+
insert(v, v+1, 1);
49+
else if (grid[i][j] != '#')
50+
insert(v, v+1, INT_MAX);
51+
52+
if (grid[i][j] == 'C')
53+
insert(src, v, INT_MAX);
54+
else if (grid[i][j] == 'S')
55+
insert(v, sink, INT_MAX);
56+
else if (grid[i][j] == 'P') {
57+
insert(p, v, INT_MAX);
58+
insert(v+1, p, INT_MAX);
59+
}
60+
61+
REP(d, 4) {
62+
const int dx[] = {-1,0,1,0}, dy[] = {0,1,0,-1};
63+
unsigned i1 = i+dx[d], j1 = j+dy[d];
64+
if (i1 < 2 && j1 < n)
65+
insert(v+1, (2*j1+i1)*2, INT_MAX);
66+
}
67+
}
68+
69+
int flow = 0;
70+
fill_n(h, sink+1, 0);
71+
fill_n(nh, sink+2, 0);
72+
while (h[src] <= sink) {
73+
flow += augment(src, INT_MAX, sink);
74+
if (flow >= 2*n) return -1;
75+
}
76+
return flow;
77+
}
78+
};
Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,27 @@
11
// Longest Increasing Path in a Matrix
2-
#define REP(i, n) for (int i = 0; i < (n); i++)
2+
#define FOR(i, a, b) for (remove_cv<remove_reference<decltype(b)>::type>::type i = (a); i < (b); i++)
3+
#define REP(i, n) FOR(i, 0, n)
34

45
class Solution {
5-
int m, n;
66
vector<vector<int>> a, dp;
77
int dfs(int i, int j) {
88
if (dp[i][j]) return dp[i][j];
99
int s = 0;
10-
if (i && a[i][j] < a[i-1][j]) s = max(s, dfs(i-1, j));
11-
if (i+1 < m && a[i][j] < a[i+1][j]) s = max(s, dfs(i+1, j));
12-
if (j && a[i][j] < a[i][j-1]) s = max(s, dfs(i, j-1));
13-
if (j+1 < n && a[i][j] < a[i][j+1]) s = max(s, dfs(i, j+1));
10+
REP(d, 4) {
11+
unsigned i1 = i+((int []){-1,0,1,0})[d], j1 = j+((int []){0,1,0,-1})[d];
12+
if (i1 < a.size() && j1 < a[0].size() && a[i][j] < a[i1][j1])
13+
s = max(s, dfs(i1, j1));
14+
}
1415
return dp[i][j] = s+1;
1516
}
1617
public:
1718
int longestIncreasingPath(vector<vector<int>>& a) {
18-
m = a.size();
19-
if (! m) return 0;
20-
n = a[0].size();
21-
dp.resize(m);
22-
REP(i, m)
23-
dp[i].assign(n, 0);
19+
dp.assign(a.size(), vector(a[0].size(), 0));
2420
this->a = a;
2521
int s = 0;
26-
REP(i, m)
27-
REP(j, n)
28-
if (! dp[i][j])
29-
s = max(s, dfs(i, j));
22+
REP(i, a.size())
23+
REP(j, a[0].size())
24+
s = max(s, dfs(i, j));
3025
return s;
3126
}
3227
};

shopping-offer.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Shopping Offers
2+
// memoization
3+
class Solution {
4+
map<vector<int>, int> memo;
5+
public:
6+
int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
7+
auto r = memo.try_emplace(needs);
8+
if (!r.second)
9+
return r.first->second;
10+
int ans = inner_product(needs.begin(), needs.end(), price.begin(), 0);
11+
for (auto &s: special) {
12+
vector<int> needs1 = needs;
13+
int i = 0;
14+
for (; i < needs.size(); i++)
15+
if ((needs1[i] -= s[i]) < 0)
16+
break;
17+
if (i == needs.size())
18+
ans = min(ans, s[i] + shoppingOffers(price, special, needs1));
19+
}
20+
return r.first->second = ans;
21+
}
22+
};

0 commit comments

Comments
 (0)