Skip to content

Commit d64277b

Browse files
committed
ZJU Monthly March 2013 (1)
1 parent 823c6c6 commit d64277b

File tree

4 files changed

+294
-0
lines changed

4 files changed

+294
-0
lines changed

ZJU/3686.cpp

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// ZOJ Monthly March 2013
2+
// DFS sequence + segment tree
3+
4+
#include <cstdio>
5+
#include <algorithm>
6+
#include <cstring>
7+
#include <vector>
8+
9+
using namespace std;
10+
11+
const int N = 100011;
12+
13+
vector<int> g[N];
14+
int n;
15+
16+
int L[N<<2], R[N<<2], C[N<<2];
17+
bool f[N<<2];
18+
int be[N], en[N], stp;
19+
20+
void DFS (int u, int pre) {
21+
int i, j, k;
22+
be[u] = ++stp;
23+
k = g[u].size ();
24+
for (i = 0; i < k; ++i){
25+
j = g[u][i];
26+
if (j != pre) DFS (j, u);
27+
}
28+
en[u] = stp;
29+
}
30+
31+
void build (int u, int x, int y) {
32+
L[u] = x; R[u] = y; f[u] = false; C[u] = 0;
33+
if (x < y) {
34+
int mid = (x + y) / 2;
35+
build (u * 2, x, mid);
36+
build (u * 2 + 1, mid + 1, y);
37+
}
38+
}
39+
40+
void push_down (int u);
41+
42+
void ins (int u, int x, int y) {
43+
if (x <= L[u] && y >= R[u]) {
44+
f[u] = !f[u];
45+
C[u] = R[u] - L[u] + 1 - C[u];
46+
return;
47+
}
48+
int mid = (L[u] + R[u]) / 2;
49+
push_down (u);
50+
if (x <= mid)
51+
ins (u * 2, x, y);
52+
if (y > mid)
53+
ins (u * 2 + 1, x, y);
54+
C[u] = C[u*2] + C[u*2+1];
55+
}
56+
57+
void push_down (int u) {
58+
if (f[u]) {
59+
f[u] = false;
60+
ins (u * 2, L[u], R[u]);
61+
ins (u * 2 + 1, L[u], R[u]);
62+
}
63+
}
64+
65+
int q (int u, int x, int y) {
66+
if (x <= L[u] && y >= R[u])
67+
return C[u];
68+
69+
push_down (u);
70+
int mid = (L[u] + R[u]) / 2;
71+
int ans = 0;
72+
if (x <= mid)
73+
ans += q (u * 2, x, y);
74+
if (y > mid)
75+
ans += q (u * 2 + 1, x, y);
76+
return ans;
77+
}
78+
79+
int main () {
80+
int i, j, k, m;
81+
char ch;
82+
while (scanf ("%d%d", &n, &m) == 2) {
83+
for (i = 1; i <= n; ++i) g[i].clear ();
84+
for (i = 2; i <= n; ++i) {
85+
scanf ("%d", &j);
86+
g[j].push_back (i);
87+
g[i].push_back (j);
88+
}
89+
stp = 0;
90+
DFS (1, 0);
91+
build (1, 1, stp);
92+
for (; m; --m) {
93+
getchar ();
94+
scanf ("%c %d", &ch, &i);
95+
if (ch == 'o')
96+
ins (1, be[i], en[i]);
97+
else
98+
printf ("%d\n", q(1, be[i], en[i]));
99+
}
100+
printf ("\n");
101+
}
102+
return 0;
103+
}

ZJU/3689.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <cstdio>
2+
#include <algorithm>
3+
#include <cstring>
4+
#include <vector>
5+
6+
using namespace std;
7+
8+
const int T = 10011;
9+
const int N = 3011;
10+
11+
int d[T], n;
12+
struct node {
13+
int s, t;
14+
bool operator < (const node &e) const {
15+
return e.s * t < s * e.t;
16+
}
17+
}a[N];
18+
19+
int main () {
20+
int i, j, k, n, m;
21+
while (scanf ("%d%d", &n, &m) == 2) {
22+
for (i = 1; i <= n; ++i)
23+
scanf ("%d%d", &a[i].t, &a[i].s);
24+
sort (a + 1, a + n + 1);
25+
memset (d, 0, sizeof (d));
26+
for (i = 1; i <= n; ++i) {
27+
for (j = 0; j + a[i].t <= m; ++j)
28+
d[j] = max (d[j], d[j + a[i].t] + (j + a[i].t) * a[i].s);
29+
}
30+
printf ("%d\n", *max_element (d, d + m + 1));
31+
}
32+
return 0;
33+
}
34+

ZJU/3690.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// ZOJ Monthy March 2013.
2+
// DP & Matrix Power
3+
4+
#include <cstdio>
5+
#include <algorithm>
6+
#include <cstring>
7+
8+
using namespace std;
9+
10+
const int md = 1000000007;
11+
12+
// a[i] = (k - 1) * a[i-1] + k * b[i-1]
13+
// b[i] = (n - k) * (a[i - 1] + b[i - 1])
14+
// (a, b) = [k - 1 k; n-k n-k] * (a, b)
15+
16+
long long mem[2][2];
17+
18+
void mat_mul (long long a[][2], long long b[][2], long long c[][2]) {
19+
int i, j, k;
20+
memset (mem, 0, sizeof (mem));
21+
for (i = 0; i < 2; ++i)
22+
for (j = 0; j < 2; ++j) {
23+
mem[i][j] = 0;
24+
for (k = 0; k < 2; ++k)
25+
mem[i][j] = (mem[i][j] + b[i][k] * c[k][j]) % md;
26+
}
27+
memcpy (a, mem, sizeof(mem));
28+
}
29+
30+
void mat_pow (long long b[][2], int e) {
31+
long long ans[][2] = {{1,0}, {0,1}};
32+
while (e) {
33+
if (e & 1)
34+
mat_mul (ans, ans, b);
35+
mat_mul (b, b, b);
36+
e /= 2;
37+
}
38+
memcpy (b, ans, 4 * sizeof(long long));
39+
}
40+
41+
int main () {
42+
int i, j, k;
43+
int m, n;
44+
while (scanf ("%d%d%d", &m, &n, &k) == 3) {
45+
long long a[][2] = {{k-1,k},{n-k,n-k}};
46+
mat_pow (a, m);
47+
printf ("%Ld\n", (a[0][1] + a[1][1]) % md);
48+
}
49+
return 0;
50+
}

ZJU/3691.cpp

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// ZOJ Monthy March 2013.
2+
// Network Flow
3+
#include <cstdio>
4+
#include <cstring>
5+
#include <algorithm>
6+
#include <cmath>
7+
8+
using namespace std;
9+
10+
const int N = 511;
11+
const int M = 60000;
12+
const int INF = 10000010;
13+
14+
struct enode{
15+
int to, f, nxt;
16+
enode() : to(0), f(0), nxt(0) {}
17+
enode(int to1, int f1, int nxt1): to(to1), f(f1), nxt(nxt1) {}
18+
}e[M];
19+
20+
int eb[N], en;
21+
int curA[N], pre[N];
22+
int d[N], gap[N];
23+
int totN;
24+
25+
inline void adde(int x, int y, int c)
26+
{
27+
e[en] = enode(y, c, eb[x]); eb[x] = en++;
28+
e[en] = enode(x, 0, eb[y]); eb[y] = en++;
29+
}
30+
31+
int DDflow(int ss, int tt)
32+
{
33+
int i, j, k, ff, ee;
34+
int ans = 0;
35+
memset(d, 0, sizeof(d));
36+
memset(gap, 0, sizeof(gap));
37+
gap[0] = totN;
38+
39+
i = ss; ff = INF;
40+
while(d[ss] < totN){
41+
for(ee = curA[i]; ee != -1; ee = curA[i] = e[ee].nxt){
42+
j = e[ee].to;
43+
if(e[ee].f > 0 && d[i] == d[j] + 1){
44+
ff = min(ff, e[ee].f); pre[j] = ee;
45+
i = j; break;
46+
}
47+
} // Stop searching admissible arc
48+
if(ee == -1){ // If admissible arc NOT found
49+
int md = totN;
50+
for(ee = eb[i]; ee != -1; ee = e[ee].nxt) if(e[ee].f > 0)
51+
md = min(d[e[ee].to] + 1, md);
52+
if(--gap[d[i]] == 0) return ans; // Gap Heuristic
53+
gap[d[i] = md]++; curA[i] = eb[i]; // Relabel and Reset Current Arc
54+
if(i != ss) i = e[pre[i]^1].to; // Retreat
55+
} // Relabel and Retreat finished, keep searching for admissible arc
56+
if(i == tt){ // If admissible path found, then augment
57+
j = tt; ans += ff;
58+
while(j != ss){ e[pre[j]].f -= ff; e[pre[j]^1].f += ff; j = e[pre[j]^1].to;}
59+
i = ss; ff = INF;
60+
} // Augment successfully
61+
}
62+
return ans;
63+
}
64+
65+
int X[N], Y[N], Z[N], F[N], L[N];
66+
int dis[N*N], dmat[N][N];
67+
int n;
68+
69+
bool chk (int d, int anony) {
70+
int i, j;
71+
memset(eb, -1, sizeof(eb)); // DO NOT forget
72+
en = 0;
73+
int src = 0, des = 1, tot = 0;
74+
for(i = 1; i <= n; i++) {
75+
adde (src, i, F[i]); tot += F[i];
76+
adde (i, i + n, L[i]);
77+
if (dmat[i][1] <= d)
78+
adde (i + n, des, INF);
79+
80+
for (j = 1; j <= n; ++j)
81+
if (i != j && dmat[i][j] <= d)
82+
adde (i + n, j, INF);
83+
}
84+
totN = 2 * n + 1;
85+
memcpy(curA, eb, sizeof(eb)); // DO NOT forget
86+
return DDflow (src, des) != tot;
87+
}
88+
89+
int main()
90+
{
91+
int i, j;
92+
while (scanf ("%d", &n) == 1) {
93+
for (i = 1; i <= n; ++i)
94+
scanf ("%d%d%d%d%d", &X[i], &Y[i], &Z[i], &F[i], &L[i]);
95+
int cnt = 0;
96+
for (i = 1; i <= n; ++i)
97+
for (j = i + 1; j <= n; ++j)
98+
dis[cnt++] = dmat[i][j] = dmat[j][i] = (X[i] - X[j]) * (X[i] - X[j]) + (Y[i] - Y[j]) * (Y[i] - Y[j]) + (Z[i] - Z[j]) * (Z[i] - Z[j]);
99+
sort (dis, dis + cnt);
100+
cnt = unique (dis, dis + cnt) - dis;
101+
i = lower_bound(dis, dis+cnt, 0, chk) - dis;
102+
if (i == cnt) puts("-1");
103+
else printf ("%.7lf\n", sqrt(dis[i]));
104+
}
105+
return 0;
106+
}
107+

0 commit comments

Comments
 (0)