From c06bb4b4788d55c023fefa5dc8854186c9e6cd81 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 19 Apr 2025 00:24:41 +0800 Subject: [PATCH 0001/1170] modify code --- .../Code01_SegmentTreeDivideAndConquer1.java | 58 +++-- src/class166/Code02_MinimumMexTree1.java | 51 ++-- src/class166/Code03_UniqueOccurrences1.java | 66 +++-- src/class166/Code04_GreatIntegration1.java | 227 ++++++++++++++++++ 4 files changed, 310 insertions(+), 92 deletions(-) create mode 100644 src/class166/Code04_GreatIntegration1.java diff --git a/src/class166/Code01_SegmentTreeDivideAndConquer1.java b/src/class166/Code01_SegmentTreeDivideAndConquer1.java index 7392dd07b..0b70276b4 100644 --- a/src/class166/Code01_SegmentTreeDivideAndConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideAndConquer1.java @@ -11,29 +11,27 @@ public class Code01_SegmentTreeDivideAndConquer1 { public static int MAXN = 100001; - public static int MAXM = 200001; public static int MAXT = 3000001; public static int n, m, k; - public static int[] x = new int[MAXM]; - public static int[] y = new int[MAXM]; - public static int[] father = new int[MAXN << 1]; public static int[] siz = new int[MAXN << 1]; public static int[][] rollback = new int[MAXN << 1][2]; public static int opsize; - public static int[] head = new int[MAXT]; + public static int[] head = new int[MAXN << 2]; public static int[] next = new int[MAXT]; - public static int[] to = new int[MAXT]; + public static int[] tox = new int[MAXT]; + public static int[] toy = new int[MAXT]; public static int cnt = 0; public static boolean[] ans = new boolean[MAXN]; - public static void addEdge(int u, int v) { - next[++cnt] = head[u]; - to[cnt] = v; - head[u] = cnt; + public static void addEdge(int i, int x, int y) { + next[++cnt] = head[i]; + tox[cnt] = x; + toy[cnt] = y; + head[i] = cnt; } public static int find(int i) { @@ -64,34 +62,34 @@ public static void undo() { siz[fx] -= siz[fy]; } - public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { + public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { if (jobl <= l && r <= jobr) { - addEdge(i, jobv); + addEdge(i, jobx, joby); } else { int mid = (l + r) / 2; if (jobl <= mid) { - add(jobl, jobr, jobv, l, mid, i << 1); + add(jobl, jobr, jobx, joby, l, mid, i << 1); } if (jobr > mid) { - add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); } } } public static void dfs(int l, int r, int i) { boolean check = true; - int u, v, fu, fv, unionCnt = 0; - for (int ei = head[i]; ei > 0; ei = next[ei]) { - u = x[to[ei]]; - v = y[to[ei]]; - fu = find(u); - fv = find(v); - if (fu == fv) { + int unionCnt = 0; + for (int ei = head[i], x, y, fx, fy; ei > 0; ei = next[ei]) { + x = tox[ei]; + y = toy[ei]; + fx = find(x); + fy = find(y); + if (fx == fy) { check = false; break; } else { - union(u, v + n); - union(v, u + n); + union(x, y + n); + union(y, x + n); unionCnt += 2; } } @@ -118,17 +116,17 @@ public static void main(String[] args) { n = io.nextInt(); m = io.nextInt(); k = io.nextInt(); - for (int i = 1, l, r; i <= m; i++) { - x[i] = io.nextInt(); - y[i] = io.nextInt(); - l = io.nextInt() + 1; - r = io.nextInt(); - add(l, r, i, 1, k, 1); - } for (int i = 1; i <= n * 2; i++) { father[i] = i; siz[i] = 1; } + for (int i = 1, x, y, l, r; i <= m; i++) { + x = io.nextInt(); + y = io.nextInt(); + l = io.nextInt(); + r = io.nextInt(); + add(l + 1, r, x, y, 1, k, 1); + } dfs(1, k, 1); for (int i = 1; i <= k; i++) { if (ans[i]) { diff --git a/src/class166/Code02_MinimumMexTree1.java b/src/class166/Code02_MinimumMexTree1.java index 942958275..bfe7bd89e 100644 --- a/src/class166/Code02_MinimumMexTree1.java +++ b/src/class166/Code02_MinimumMexTree1.java @@ -11,30 +11,28 @@ public class Code02_MinimumMexTree1 { public static int MAXN = 1000001; - public static int MAXM = 2000001; + public static int MAXV = 100001; public static int MAXT = 30000001; public static int n, m, v; - public static int[] x = new int[MAXM]; - public static int[] y = new int[MAXM]; - public static int[] w = new int[MAXM]; - public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[][] rollback = new int[MAXN][2]; public static int opsize; - public static int[] head = new int[MAXT]; + public static int[] head = new int[MAXV << 2]; public static int[] next = new int[MAXT]; - public static int[] to = new int[MAXT]; + public static int[] tox = new int[MAXT]; + public static int[] toy = new int[MAXT]; public static int cnt = 0; public static int part; - public static void addEdge(int u, int v) { - next[++cnt] = head[u]; - to[cnt] = v; - head[u] = cnt; + public static void addEdge(int i, int x, int y) { + next[++cnt] = head[i]; + tox[cnt] = x; + toy[cnt] = y; + head[i] = cnt; } public static int find(int i) { @@ -65,16 +63,16 @@ public static void undo() { siz[fx] -= siz[fy]; } - public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { + public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { if (jobl <= l && r <= jobr) { - addEdge(i, jobv); + addEdge(i, jobx, joby); } else { int mid = (l + r) >> 1; if (jobl <= mid) { - add(jobl, jobr, jobv, l, mid, i << 1); + add(jobl, jobr, jobx, joby, l, mid, i << 1); } if (jobr > mid) { - add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); } } } @@ -82,8 +80,8 @@ public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { public static int dfs(int l, int r, int i) { int unionCnt = 0; for (int ei = head[i], fx, fy; ei > 0; ei = next[ei]) { - fx = find(x[to[ei]]); - fy = find(y[to[ei]]); + fx = find(tox[ei]); + fy = find(toy[ei]); if (fx != fy) { union(fx, fy); part--; @@ -113,22 +111,19 @@ public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); m = io.nextInt(); - v = 0; - for (int i = 1; i <= m; i++) { - x[i] = io.nextInt(); - y[i] = io.nextInt(); - w[i] = io.nextInt(); - v = Math.max(v, w[i] + 1); - } + v = MAXV; for (int i = 1; i <= n; i++) { father[i] = i; siz[i] = 1; } - for (int i = 1; i <= m; i++) { - if (w[i] > 0) { - add(0, w[i] - 1, i, 0, v, 1); + for (int i = 1, x, y, w; i <= m; i++) { + x = io.nextInt(); + y = io.nextInt(); + w = io.nextInt(); + if (w > 0) { + add(0, w - 1, x, y, 0, v, 1); } - add(w[i] + 1, v, i, 0, v, 1); + add(w + 1, v, x, y, 0, v, 1); } part = n; io.writelnInt(dfs(0, v, 1)); diff --git a/src/class166/Code03_UniqueOccurrences1.java b/src/class166/Code03_UniqueOccurrences1.java index 44ee2ddbd..03c6e0b59 100644 --- a/src/class166/Code03_UniqueOccurrences1.java +++ b/src/class166/Code03_UniqueOccurrences1.java @@ -15,10 +15,6 @@ public class Code03_UniqueOccurrences1 { public static int MAXT = 10000001; public static int n, m; - public static int[] x = new int[MAXN]; - public static int[] y = new int[MAXN]; - public static int[] c = new int[MAXN]; - public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[][] rollback = new int[MAXN][2]; @@ -26,26 +22,30 @@ public class Code03_UniqueOccurrences1 { public static int[] headc = new int[MAXN]; public static int[] nextc = new int[MAXN]; - public static int[] toc = new int[MAXN]; + public static int[] xc = new int[MAXN]; + public static int[] yc = new int[MAXN]; public static int cntc = 0; - public static int[] heads = new int[MAXT]; + public static int[] heads = new int[MAXN << 2]; public static int[] nexts = new int[MAXT]; - public static int[] tos = new int[MAXT]; + public static int[] xs = new int[MAXT]; + public static int[] ys = new int[MAXT]; public static int cnts = 0; public static long ans = 0; - public static void addEdgeC(int u, int v) { - nextc[++cntc] = headc[u]; - toc[cntc] = v; - headc[u] = cntc; + public static void addEdgeC(int i, int x, int y) { + nextc[++cntc] = headc[i]; + xc[cntc] = x; + yc[cntc] = y; + headc[i] = cntc; } - public static void addEdgeS(int u, int v) { - nexts[++cnts] = heads[u]; - tos[cnts] = v; - heads[u] = cnts; + public static void addEdgeS(int i, int x, int y) { + nexts[++cnts] = heads[i]; + xs[cnts] = x; + ys[cnts] = y; + heads[i] = cnts; } public static int find(int i) { @@ -76,16 +76,16 @@ public static void undo() { siz[fx] -= siz[fy]; } - public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { + public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { if (jobl <= l && r <= jobr) { - addEdgeS(i, jobv); + addEdgeS(i, jobx, joby); } else { int mid = (l + r) >> 1; if (jobl <= mid) { - add(jobl, jobr, jobv, l, mid, i << 1); + add(jobl, jobr, jobx, joby, l, mid, i << 1); } if (jobr > mid) { - add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); } } } @@ -93,8 +93,8 @@ public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { public static void dfs(int l, int r, int i) { int unionCnt = 0; for (int ei = heads[i], fx, fy; ei > 0; ei = nexts[ei]) { - fx = find(x[tos[ei]]); - fy = find(y[tos[ei]]); + fx = find(xs[ei]); + fy = find(ys[ei]); if (fx != fy) { union(fx, fy); unionCnt++; @@ -102,8 +102,8 @@ public static void dfs(int l, int r, int i) { } if (l == r) { for (int ei = headc[l], fx, fy; ei > 0; ei = nextc[ei]) { - fx = find(x[toc[ei]]); - fy = find(y[toc[ei]]); + fx = find(xc[ei]); + fy = find(yc[ei]); ans += (long) siz[fx] * siz[fy]; } } else { @@ -119,18 +119,16 @@ public static void dfs(int l, int r, int i) { public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); - for (int i = 1; i < n; i++) { - x[i] = io.nextInt(); - y[i] = io.nextInt(); - c[i] = io.nextInt(); - } - for (int i = 1; i < n; i++) { - addEdgeC(c[i], i); - if (c[i] > 1) { - add(1, c[i] - 1, i, 1, n, 1); + for (int i = 1, x, y, c; i < n; i++) { + x = io.nextInt(); + y = io.nextInt(); + c = io.nextInt(); + addEdgeC(c, x, y); + if (c > 1) { + add(1, c - 1, x, y, 1, n, 1); } - if (c[i] < n) { - add(c[i] + 1, n, i, 1, n, 1); + if (c < n) { + add(c + 1, n, x, y, 1, n, 1); } } for (int i = 1; i <= n; i++) { diff --git a/src/class166/Code04_GreatIntegration1.java b/src/class166/Code04_GreatIntegration1.java new file mode 100644 index 000000000..b39750fa9 --- /dev/null +++ b/src/class166/Code04_GreatIntegration1.java @@ -0,0 +1,227 @@ +package class166; + +// 大融合,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4219 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code04_GreatIntegration1 { + + public static int MAXN = 100001; + public static int MAXT = 3000001; + public static int n, q; + + public static int[][] event = new int[MAXN][3]; + public static int[][] sorted = new int[MAXN][3]; + + public static int[] father = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[][] rollback = new int[MAXN][2]; + public static int opsize; + + public static int[] head = new int[MAXN << 2]; + public static int[] next = new int[MAXT]; + public static int[] tox = new int[MAXT]; + public static int[] toy = new int[MAXT]; + public static int cnt; + + public static long[] ans = new long[MAXN]; + + public static void addEdge(int i, int x, int y) { + next[++cnt] = head[i]; + tox[cnt] = x; + toy[cnt] = y; + head[i] = cnt; + } + + public static int find(int i) { + while (i != father[i]) { + i = father[i]; + } + return i; + } + + public static void union(int x, int y) { + int fx = find(x); + int fy = find(y); + if (siz[fx] < siz[fy]) { + int tmp = fx; + fx = fy; + fy = tmp; + } + father[fy] = fx; + siz[fx] += siz[fy]; + rollback[++opsize][0] = fx; + rollback[opsize][1] = fy; + } + + public static void undo() { + int fx = rollback[opsize][0]; + int fy = rollback[opsize--][1]; + father[fy] = fy; + siz[fx] -= siz[fy]; + } + + public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdge(i, jobx, joby); + } else { + int mid = (l + r) >> 1; + if (jobl <= mid) { + add(jobl, jobr, jobx, joby, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); + } + } + } + + public static void dfs(int l, int r, int i) { + int unionCnt = 0; + for (int ei = head[i], fx, fy; ei > 0; ei = next[ei]) { + fx = find(tox[ei]); + fy = find(toy[ei]); + if (fx != fy) { + union(fx, fy); + unionCnt++; + } + } + if (l == r) { + if (event[l][0] == 2) { + ans[l] = (long) siz[find(event[l][1])] * siz[find(event[l][2])]; + } + } else { + int mid = (l + r) >> 1; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); + } + for (int k = 1; k <= unionCnt; k++) { + undo(); + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + } + for (int i = 1; i <= q; i++) { + sorted[i][0] = i; + sorted[i][1] = event[i][1]; + sorted[i][2] = event[i][2]; + } + Arrays.sort(sorted, 1, q + 1, + (a, b) -> a[1] != b[1] ? a[1] - b[1] : (a[2] != b[2] ? a[2] - b[2] : a[0] - b[0])); + for (int l = 1, r = 1; l <= q; l = ++r) { + int t = sorted[l][0]; + int x = sorted[l][1]; + int y = sorted[l][2]; + while (r + 1 <= q && sorted[r + 1][1] == x && sorted[r + 1][2] == y) { + r++; + } + for (int i = l + 1; i <= r; i++) { + add(t, sorted[i][0] - 1, x, y, 1, q, 1); + t = sorted[i][0] + 1; + } + if (t <= q) { + add(t, q, x, y, 1, q, 1); + } + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + q = in.nextInt(); + char op; + int u, v; + for (int i = 1; i <= q; i++) { + op = in.nextChar(); + u = in.nextInt(); + v = in.nextInt(); + event[i][0] = op == 'A' ? 1 : 2; + event[i][1] = Math.min(u, v); + event[i][2] = Math.max(u, v); + } + prepare(); + dfs(1, q, 1); + for (int i = 1; i <= q; i++) { + if (event[i][0] == 2) { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} From 2f3948e80b661f238bf46719e51d86855cd28c94 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 19 Apr 2025 12:23:23 +0800 Subject: [PATCH 0002/1170] modify code --- .../Code01_SegmentTreeDivideAndConquer1.java | 2 +- src/class166/Code02_MinimumMexTree1.java | 2 +- src/class166/Code03_UniqueOccurrences1.java | 2 +- src/class166/Code04_GreatIntegration1.java | 4 +- src/class166/Code05_ConnectedGraph1.java | 263 ++++++++++++++++++ 5 files changed, 268 insertions(+), 5 deletions(-) create mode 100644 src/class166/Code05_ConnectedGraph1.java diff --git a/src/class166/Code01_SegmentTreeDivideAndConquer1.java b/src/class166/Code01_SegmentTreeDivideAndConquer1.java index 0b70276b4..98acb36c9 100644 --- a/src/class166/Code01_SegmentTreeDivideAndConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideAndConquer1.java @@ -17,7 +17,7 @@ public class Code01_SegmentTreeDivideAndConquer1 { public static int[] father = new int[MAXN << 1]; public static int[] siz = new int[MAXN << 1]; public static int[][] rollback = new int[MAXN << 1][2]; - public static int opsize; + public static int opsize = 0; public static int[] head = new int[MAXN << 2]; public static int[] next = new int[MAXT]; diff --git a/src/class166/Code02_MinimumMexTree1.java b/src/class166/Code02_MinimumMexTree1.java index bfe7bd89e..fa58c3e8e 100644 --- a/src/class166/Code02_MinimumMexTree1.java +++ b/src/class166/Code02_MinimumMexTree1.java @@ -18,7 +18,7 @@ public class Code02_MinimumMexTree1 { public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[][] rollback = new int[MAXN][2]; - public static int opsize; + public static int opsize = 0; public static int[] head = new int[MAXV << 2]; public static int[] next = new int[MAXT]; diff --git a/src/class166/Code03_UniqueOccurrences1.java b/src/class166/Code03_UniqueOccurrences1.java index 03c6e0b59..472e79ec9 100644 --- a/src/class166/Code03_UniqueOccurrences1.java +++ b/src/class166/Code03_UniqueOccurrences1.java @@ -18,7 +18,7 @@ public class Code03_UniqueOccurrences1 { public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[][] rollback = new int[MAXN][2]; - public static int opsize; + public static int opsize = 0; public static int[] headc = new int[MAXN]; public static int[] nextc = new int[MAXN]; diff --git a/src/class166/Code04_GreatIntegration1.java b/src/class166/Code04_GreatIntegration1.java index b39750fa9..4c8a07154 100644 --- a/src/class166/Code04_GreatIntegration1.java +++ b/src/class166/Code04_GreatIntegration1.java @@ -22,13 +22,13 @@ public class Code04_GreatIntegration1 { public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[][] rollback = new int[MAXN][2]; - public static int opsize; + public static int opsize = 0; public static int[] head = new int[MAXN << 2]; public static int[] next = new int[MAXT]; public static int[] tox = new int[MAXT]; public static int[] toy = new int[MAXT]; - public static int cnt; + public static int cnt = 0; public static long[] ans = new long[MAXN]; diff --git a/src/class166/Code05_ConnectedGraph1.java b/src/class166/Code05_ConnectedGraph1.java new file mode 100644 index 000000000..df24d1dd8 --- /dev/null +++ b/src/class166/Code05_ConnectedGraph1.java @@ -0,0 +1,263 @@ +package class166; + +// 连通图 +// 测试链接 : https://www.luogu.com.cn/problem/P5227 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; + +public class Code05_ConnectedGraph1 { + + public static int MAXN = 100001; + public static int MAXM = 200001; + public static int MAXE = 400001; + public static int MAXT = 10000001; + public static int n, m, k; + + public static int[] x = new int[MAXM]; + public static int[] y = new int[MAXM]; + + public static int[][] event = new int[MAXE][2]; + public static int ecnt = 0; + public static boolean[] visit = new boolean[MAXM]; + + public static int[] father = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[][] rollback = new int[MAXN][2]; + public static int opsize = 0; + + public static int[] head = new int[MAXN << 2]; + public static int[] next = new int[MAXT]; + public static int[] tox = new int[MAXT]; + public static int[] toy = new int[MAXT]; + public static int cnt = 0; + + public static boolean[] ans = new boolean[MAXN]; + + public static void addEdge(int i, int x, int y) { + next[++cnt] = head[i]; + tox[cnt] = x; + toy[cnt] = y; + head[i] = cnt; + } + + public static int find(int i) { + while (i != father[i]) { + i = father[i]; + } + return i; + } + + public static void union(int x, int y) { + int fx = find(x); + int fy = find(y); + if (siz[fx] < siz[fy]) { + int tmp = fx; + fx = fy; + fy = tmp; + } + father[fy] = fx; + siz[fx] += siz[fy]; + rollback[++opsize][0] = fx; + rollback[opsize][1] = fy; + } + + public static void undo() { + int fx = rollback[opsize][0]; + int fy = rollback[opsize--][1]; + father[fy] = fy; + siz[fx] -= siz[fy]; + } + + public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdge(i, jobx, joby); + } else { + int mid = (l + r) >> 1; + if (jobl <= mid) { + add(jobl, jobr, jobx, joby, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); + } + } + } + + public static void dfs(int l, int r, int i) { + boolean check = false; + int unionCnt = 0; + for (int ei = head[i], x, y, fx, fy; ei > 0; ei = next[ei]) { + x = tox[ei]; + y = toy[ei]; + fx = find(x); + fy = find(y); + if (fx != fy) { + union(fx, fy); + unionCnt++; + } + if (siz[find(fx)] == n) { + check = true; + break; + } + } + if (check) { + for (int j = l; j <= r; j++) { + ans[j] = true; + } + } else { + if (l == r) { + ans[l] = false; + } else { + int mid = (l + r) >> 1; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); + } + } + for (int j = 1; j <= unionCnt; j++) { + undo(); + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + } + Arrays.sort(event, 1, ecnt + 1, (a, b) -> a[0] != b[0] ? (a[0] - b[0]) : (a[1] - b[1])); + int eid, t; + for (int l = 1, r = 1; l <= ecnt; l = ++r) { + eid = event[l][0]; + visit[eid] = true; + while (r + 1 <= ecnt && event[r + 1][0] == eid) { + r++; + } + t = 1; + for (int i = l; i <= r; i++) { + if (t <= event[i][1] - 1) { + add(t, event[i][1] - 1, x[eid], y[eid], 1, k, 1); + } + t = event[i][1] + 1; + } + if (t <= k) { + add(t, k, x[eid], y[eid], 1, k, 1); + } + } + for (int i = 1; i <= m; i++) { + if (!visit[i]) { + add(1, k, x[i], y[i], 1, k, 1); + } + } + } + + public static void main(String[] args) { + FastIO io = new FastIO(System.in, System.out); + n = io.nextInt(); + m = io.nextInt(); + for (int i = 1; i <= m; i++) { + x[i] = io.nextInt(); + y[i] = io.nextInt(); + } + k = io.nextInt(); + for (int i = 1, s; i <= k; i++) { + s = io.nextInt(); + for (int j = 1; j <= s; j++) { + event[++ecnt][0] = io.nextInt(); + event[ecnt][1] = i; + } + } + prepare(); + dfs(1, k, 1); + for (int i = 1; i <= k; i++) { + if (ans[i]) { + io.write("Connected\n"); + } else { + io.write("Disconnected\n"); + } + } + io.flush(); + } + + // 读写工具类 + static class FastIO { + private final InputStream is; + private final OutputStream os; + private final byte[] inbuf = new byte[1 << 16]; + private int lenbuf = 0; + private int ptrbuf = 0; + private final StringBuilder outBuf = new StringBuilder(); + + public FastIO(InputStream is, OutputStream os) { + this.is = is; + this.os = os; + } + + private int readByte() { + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new RuntimeException(e); + } + if (lenbuf == -1) { + return -1; + } + } + return inbuf[ptrbuf++] & 0xff; + } + + private int skip() { + int b; + while ((b = readByte()) != -1) { + if (b > ' ') { + return b; + } + } + return -1; + } + + public int nextInt() { + int b = skip(); + if (b == -1) { + throw new RuntimeException("No more integers (EOF)"); + } + boolean negative = false; + if (b == '-') { + negative = true; + b = readByte(); + } + int val = 0; + while (b >= '0' && b <= '9') { + val = val * 10 + (b - '0'); + b = readByte(); + } + return negative ? -val : val; + } + + public void write(String s) { + outBuf.append(s); + } + + public void writeInt(int x) { + outBuf.append(x); + } + + public void writelnInt(int x) { + outBuf.append(x).append('\n'); + } + + public void flush() { + try { + os.write(outBuf.toString().getBytes()); + os.flush(); + outBuf.setLength(0); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + +} From d9895904b74966c37a946c4df011e02e8ebb3dbf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 20 Apr 2025 17:56:13 +0800 Subject: [PATCH 0003/1170] modify code --- src/class166/Code04_GreatIntegration1.java | 3 +- src/class166/Code05_ConnectedGraph1.java | 2 +- src/class166/Code06_Connectivity1.java | 245 +++++++++++++++++++++ src/class166/Code06_Connectivity2.java | 157 +++++++++++++ 4 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 src/class166/Code06_Connectivity1.java create mode 100644 src/class166/Code06_Connectivity2.java diff --git a/src/class166/Code04_GreatIntegration1.java b/src/class166/Code04_GreatIntegration1.java index 4c8a07154..050b8a6f3 100644 --- a/src/class166/Code04_GreatIntegration1.java +++ b/src/class166/Code04_GreatIntegration1.java @@ -115,8 +115,7 @@ public static void prepare() { sorted[i][1] = event[i][1]; sorted[i][2] = event[i][2]; } - Arrays.sort(sorted, 1, q + 1, - (a, b) -> a[1] != b[1] ? a[1] - b[1] : (a[2] != b[2] ? a[2] - b[2] : a[0] - b[0])); + Arrays.sort(sorted, 1, q + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[0] - b[0]); for (int l = 1, r = 1; l <= q; l = ++r) { int t = sorted[l][0]; int x = sorted[l][1]; diff --git a/src/class166/Code05_ConnectedGraph1.java b/src/class166/Code05_ConnectedGraph1.java index df24d1dd8..bcfa47abc 100644 --- a/src/class166/Code05_ConnectedGraph1.java +++ b/src/class166/Code05_ConnectedGraph1.java @@ -126,7 +126,7 @@ public static void prepare() { father[i] = i; siz[i] = 1; } - Arrays.sort(event, 1, ecnt + 1, (a, b) -> a[0] != b[0] ? (a[0] - b[0]) : (a[1] - b[1])); + Arrays.sort(event, 1, ecnt + 1, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]); int eid, t; for (int l = 1, r = 1; l <= ecnt; l = ++r) { eid = event[l][0]; diff --git a/src/class166/Code06_Connectivity1.java b/src/class166/Code06_Connectivity1.java new file mode 100644 index 000000000..8078b994f --- /dev/null +++ b/src/class166/Code06_Connectivity1.java @@ -0,0 +1,245 @@ +package class166; + +// 连通性离线处理,java版 +// 测试链接 : https://loj.ac/p/121 +// 提交以下的code,提交时请把类名改成"Main" +// 测试平台看似支持java语言,其实无法通过,内存过大跳警告,导致验证失败 +// 想通过用C++实现,本节课Code06_Connectivity2文件就是C++的实现 +// 逻辑完全一样,C++实现可以通过全部测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class Code06_Connectivity1 { + + public static int MAXN = 5001; + public static int MAXM = 500001; + public static int MAXT = 5000001; + public static int n, m; + + public static int[] op = new int[MAXM]; + public static int[] a = new int[MAXM]; + public static int[] b = new int[MAXM]; + + public static int[][] last = new int[MAXN][MAXN]; + + public static int[] father = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[][] rollback = new int[MAXN][2]; + public static int opsize = 0; + + public static int[] head = new int[MAXM << 2]; + public static int[] next = new int[MAXT]; + public static int[] tox = new int[MAXT]; + public static int[] toy = new int[MAXT]; + public static int cnt = 0; + + public static boolean[] ans = new boolean[MAXM]; + + public static void addEdge(int i, int x, int y) { + next[++cnt] = head[i]; + tox[cnt] = x; + toy[cnt] = y; + head[i] = cnt; + } + + public static int find(int i) { + while (i != father[i]) { + i = father[i]; + } + return i; + } + + public static void union(int x, int y) { + int fx = find(x); + int fy = find(y); + if (siz[fx] < siz[fy]) { + int tmp = fx; + fx = fy; + fy = tmp; + } + father[fy] = fx; + siz[fx] += siz[fy]; + rollback[++opsize][0] = fx; + rollback[opsize][1] = fy; + } + + public static void undo() { + int fx = rollback[opsize][0]; + int fy = rollback[opsize--][1]; + father[fy] = fy; + siz[fx] -= siz[fy]; + } + + public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdge(i, jobx, joby); + } else { + int mid = (l + r) >> 1; + if (jobl <= mid) { + add(jobl, jobr, jobx, joby, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); + } + } + } + + public static void dfs(int l, int r, int i) { + int unionCnt = 0; + for (int ei = head[i], x, y, fx, fy; ei > 0; ei = next[ei]) { + x = tox[ei]; + y = toy[ei]; + fx = find(x); + fy = find(y); + if (fx != fy) { + union(fx, fy); + unionCnt++; + } + } + if (l == r) { + if (op[l] == 2) { + ans[l] = find(a[l]) == find(b[l]); + } + } else { + int mid = (l + r) / 2; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); + } + for (int j = 1; j <= unionCnt; j++) { + undo(); + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + } + for (int i = 1, x, y; i <= m; i++) { + x = a[i]; + y = b[i]; + if (op[i] == 0) { + last[x][y] = i; + } else if (op[i] == 1) { + add(last[x][y], i - 1, x, y, 1, m, 1); + last[x][y] = 0; + } + } + for (int x = 1; x <= n; x++) { + for (int y = x + 1; y <= n; y++) { + if (last[x][y] != 0) { + add(last[x][y], m, x, y, 1, m, 1); + } + } + } + } + + public static void main(String[] args) { + FastIO io = new FastIO(System.in, System.out); + n = io.nextInt(); + m = io.nextInt(); + for (int i = 1, x, y, t; i <= m; i++) { + t = io.nextInt(); + x = io.nextInt(); + y = io.nextInt(); + op[i] = t; + a[i] = Math.min(x, y); + b[i] = Math.max(x, y); + } + prepare(); + dfs(1, m, 1); + for (int i = 1; i <= m; i++) { + if (op[i] == 2) { + if (ans[i]) { + io.write("Y\n"); + } else { + io.write("N\n"); + } + } + } + io.flush(); + } + + // 读写工具类 + static class FastIO { + private final InputStream is; + private final OutputStream os; + private final byte[] inbuf = new byte[1 << 16]; + private int lenbuf = 0; + private int ptrbuf = 0; + private final StringBuilder outBuf = new StringBuilder(); + + public FastIO(InputStream is, OutputStream os) { + this.is = is; + this.os = os; + } + + private int readByte() { + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new RuntimeException(e); + } + if (lenbuf == -1) { + return -1; + } + } + return inbuf[ptrbuf++] & 0xff; + } + + private int skip() { + int b; + while ((b = readByte()) != -1) { + if (b > ' ') { + return b; + } + } + return -1; + } + + public int nextInt() { + int b = skip(); + if (b == -1) { + throw new RuntimeException("No more integers (EOF)"); + } + boolean negative = false; + if (b == '-') { + negative = true; + b = readByte(); + } + int val = 0; + while (b >= '0' && b <= '9') { + val = val * 10 + (b - '0'); + b = readByte(); + } + return negative ? -val : val; + } + + public void write(String s) { + outBuf.append(s); + } + + public void writeInt(int x) { + outBuf.append(x); + } + + public void writelnInt(int x) { + outBuf.append(x).append('\n'); + } + + public void flush() { + try { + os.write(outBuf.toString().getBytes()); + os.flush(); + outBuf.setLength(0); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + +} diff --git a/src/class166/Code06_Connectivity2.java b/src/class166/Code06_Connectivity2.java new file mode 100644 index 000000000..d942698fa --- /dev/null +++ b/src/class166/Code06_Connectivity2.java @@ -0,0 +1,157 @@ +package class166; + +// 连通性离线处理,C++版 +// 测试链接 : https://loj.ac/p/121 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 5001; +//const int MAXM = 500001; +//const int MAXT = 5000001; +//int n, m; +// +//int op[MAXM]; +//int a[MAXM]; +//int b[MAXM]; +// +//int last[MAXN][MAXN]; +// +//int father[MAXN]; +//int siz[MAXN]; +//int rollback[MAXN][2]; +//int opsize = 0; +// +//int head[MAXM << 2]; +//int nxt[MAXT]; +//int tox[MAXT]; +//int toy[MAXT]; +//int cnt = 0; +// +//bool ans[MAXM]; +// +//void addEdge(int i, int x, int y) { +// nxt[++cnt] = head[i]; +// tox[cnt] = x; +// toy[cnt] = y; +// head[i] = cnt; +//} +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//void Union(int x, int y) { +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; +//} +// +//void undo() { +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +//} +// +//void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobx, joby, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i) { +// int unionCnt = 0; +// for (int ei = head[i], x, y, fx, fy; ei > 0; ei = nxt[ei]) { +// x = tox[ei]; +// y = toy[ei]; +// fx = find(x); +// fy = find(y); +// if (fx != fy) { +// Union(fx, fy); +// unionCnt++; +// } +// } +// if (l == r) { +// if (op[l] == 2) { +// ans[l] = find(a[l]) == find(b[l]); +// } +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// for (int j = 1; j <= unionCnt; j++) { +// undo(); +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// for (int i = 1, x, y; i <= m; i++) { +// x = a[i]; +// y = b[i]; +// if (op[i] == 0) { +// last[x][y] = i; +// } else if (op[i] == 1) { +// add(last[x][y], i - 1, x, y, 1, m, 1); +// last[x][y] = 0; +// } +// } +// for (int x = 1; x <= n; x++) { +// for (int y = x + 1; y <= n; y++) { +// if (last[x][y] != 0) { +// add(last[x][y], m, x, y, 1, m, 1); +// } +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, t, x, y; i <= m; i++) { +// cin >> t >> x >> y; +// op[i] = t; +// a[i] = min(x, y); +// b[i] = max(x, y); +// } +// prepare(); +// dfs(1, m, 1); +// for (int i = 1; i <= m; i++) { +// if (op[i] == 2) { +// if (ans[i]) { +// cout << "Y" << "\n"; +// } else { +// cout << "N" << "\n"; +// } +// } +// } +// return 0; +//} \ No newline at end of file From ad7bddc33414f94d09b390032e5d0ac4ff89d35a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 20 Apr 2025 18:02:34 +0800 Subject: [PATCH 0004/1170] modify code --- .../Code01_SegmentTreeDivideAndConquer1.java | 117 ++++++++++------- ... Code01_SegmentTreeDivideAndConquer2.java} | 2 +- ....java => Code02_CheckBipartiteGraph1.java} | 120 +++++++----------- ...Tree1.java => Code03_MinimumMexTree1.java} | 2 +- ...s1.java => Code04_UniqueOccurrences1.java} | 2 +- ...on1.java => Code05_GreatIntegration1.java} | 2 +- ...raph1.java => Code06_ConnectedGraph1.java} | 2 +- 7 files changed, 124 insertions(+), 123 deletions(-) rename src/class166/{Code06_Connectivity2.java => Code01_SegmentTreeDivideAndConquer2.java} (98%) rename src/class166/{Code06_Connectivity1.java => Code02_CheckBipartiteGraph1.java} (63%) rename src/class166/{Code02_MinimumMexTree1.java => Code03_MinimumMexTree1.java} (99%) rename src/class166/{Code03_UniqueOccurrences1.java => Code04_UniqueOccurrences1.java} (99%) rename src/class166/{Code04_GreatIntegration1.java => Code05_GreatIntegration1.java} (99%) rename src/class166/{Code05_ConnectedGraph1.java => Code06_ConnectedGraph1.java} (99%) diff --git a/src/class166/Code01_SegmentTreeDivideAndConquer1.java b/src/class166/Code01_SegmentTreeDivideAndConquer1.java index 98acb36c9..93edffa2e 100644 --- a/src/class166/Code01_SegmentTreeDivideAndConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideAndConquer1.java @@ -1,8 +1,12 @@ package class166; // 线段树分治模版题,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P5787 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 测试链接 : https://loj.ac/p/121 +// 提交以下的code,提交时请把类名改成"Main" +// 测试平台看似支持java语言,其实无法通过 +// 内存过大跳警告,导致验证失败,想通过用C++实现 +// 本节课Code01_SegmentTreeDivideAndConquer2文件就是C++的实现 +// 逻辑完全一样,C++实现可以通过全部测试用例 import java.io.IOException; import java.io.InputStream; @@ -10,22 +14,29 @@ public class Code01_SegmentTreeDivideAndConquer1 { - public static int MAXN = 100001; - public static int MAXT = 3000001; - public static int n, m, k; + public static int MAXN = 5001; + public static int MAXM = 500001; + public static int MAXT = 5000001; + public static int n, m; - public static int[] father = new int[MAXN << 1]; - public static int[] siz = new int[MAXN << 1]; - public static int[][] rollback = new int[MAXN << 1][2]; + public static int[] op = new int[MAXM]; + public static int[] a = new int[MAXM]; + public static int[] b = new int[MAXM]; + + public static int[][] last = new int[MAXN][MAXN]; + + public static int[] father = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[][] rollback = new int[MAXN][2]; public static int opsize = 0; - public static int[] head = new int[MAXN << 2]; + public static int[] head = new int[MAXM << 2]; public static int[] next = new int[MAXT]; public static int[] tox = new int[MAXT]; public static int[] toy = new int[MAXT]; public static int cnt = 0; - public static boolean[] ans = new boolean[MAXN]; + public static boolean[] ans = new boolean[MAXM]; public static void addEdge(int i, int x, int y) { next[++cnt] = head[i]; @@ -66,7 +77,7 @@ public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int if (jobl <= l && r <= jobr) { addEdge(i, jobx, joby); } else { - int mid = (l + r) / 2; + int mid = (l + r) >> 1; if (jobl <= mid) { add(jobl, jobr, jobx, joby, l, mid, i << 1); } @@ -77,62 +88,76 @@ public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int } public static void dfs(int l, int r, int i) { - boolean check = true; int unionCnt = 0; for (int ei = head[i], x, y, fx, fy; ei > 0; ei = next[ei]) { x = tox[ei]; y = toy[ei]; fx = find(x); fy = find(y); - if (fx == fy) { - check = false; - break; - } else { - union(x, y + n); - union(y, x + n); - unionCnt += 2; + if (fx != fy) { + union(fx, fy); + unionCnt++; } } - if (check) { - if (l == r) { - ans[l] = true; - } else { - int mid = (l + r) / 2; - dfs(l, mid, i << 1); - dfs(mid + 1, r, i << 1 | 1); + if (l == r) { + if (op[l] == 2) { + ans[l] = find(a[l]) == find(b[l]); } } else { - for (int k = l; k <= r; k++) { - ans[k] = false; - } + int mid = (l + r) / 2; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); } - for (int k = 1; k <= unionCnt; k++) { + for (int j = 1; j <= unionCnt; j++) { undo(); } } + public static void prepare() { + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + } + for (int i = 1, x, y; i <= m; i++) { + x = a[i]; + y = b[i]; + if (op[i] == 0) { + last[x][y] = i; + } else if (op[i] == 1) { + add(last[x][y], i - 1, x, y, 1, m, 1); + last[x][y] = 0; + } + } + for (int x = 1; x <= n; x++) { + for (int y = x + 1; y <= n; y++) { + if (last[x][y] != 0) { + add(last[x][y], m, x, y, 1, m, 1); + } + } + } + } + public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); m = io.nextInt(); - k = io.nextInt(); - for (int i = 1; i <= n * 2; i++) { - father[i] = i; - siz[i] = 1; - } - for (int i = 1, x, y, l, r; i <= m; i++) { + for (int i = 1, x, y, t; i <= m; i++) { + t = io.nextInt(); x = io.nextInt(); y = io.nextInt(); - l = io.nextInt(); - r = io.nextInt(); - add(l + 1, r, x, y, 1, k, 1); - } - dfs(1, k, 1); - for (int i = 1; i <= k; i++) { - if (ans[i]) { - io.write("Yes\n"); - } else { - io.write("No\n"); + op[i] = t; + a[i] = Math.min(x, y); + b[i] = Math.max(x, y); + } + prepare(); + dfs(1, m, 1); + for (int i = 1; i <= m; i++) { + if (op[i] == 2) { + if (ans[i]) { + io.write("Y\n"); + } else { + io.write("N\n"); + } } } io.flush(); diff --git a/src/class166/Code06_Connectivity2.java b/src/class166/Code01_SegmentTreeDivideAndConquer2.java similarity index 98% rename from src/class166/Code06_Connectivity2.java rename to src/class166/Code01_SegmentTreeDivideAndConquer2.java index d942698fa..4210b40fa 100644 --- a/src/class166/Code06_Connectivity2.java +++ b/src/class166/Code01_SegmentTreeDivideAndConquer2.java @@ -1,6 +1,6 @@ package class166; -// 连通性离线处理,C++版 +// 线段树分治模版题,C++版 // 测试链接 : https://loj.ac/p/121 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class166/Code06_Connectivity1.java b/src/class166/Code02_CheckBipartiteGraph1.java similarity index 63% rename from src/class166/Code06_Connectivity1.java rename to src/class166/Code02_CheckBipartiteGraph1.java index 8078b994f..37eae2735 100644 --- a/src/class166/Code06_Connectivity1.java +++ b/src/class166/Code02_CheckBipartiteGraph1.java @@ -1,41 +1,31 @@ package class166; -// 连通性离线处理,java版 -// 测试链接 : https://loj.ac/p/121 -// 提交以下的code,提交时请把类名改成"Main" -// 测试平台看似支持java语言,其实无法通过,内存过大跳警告,导致验证失败 -// 想通过用C++实现,本节课Code06_Connectivity2文件就是C++的实现 -// 逻辑完全一样,C++实现可以通过全部测试用例 +// 检查二分图,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5787 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -public class Code06_Connectivity1 { +public class Code02_CheckBipartiteGraph1 { - public static int MAXN = 5001; - public static int MAXM = 500001; - public static int MAXT = 5000001; - public static int n, m; + public static int MAXN = 100001; + public static int MAXT = 3000001; + public static int n, m, k; - public static int[] op = new int[MAXM]; - public static int[] a = new int[MAXM]; - public static int[] b = new int[MAXM]; - - public static int[][] last = new int[MAXN][MAXN]; - - public static int[] father = new int[MAXN]; - public static int[] siz = new int[MAXN]; - public static int[][] rollback = new int[MAXN][2]; + public static int[] father = new int[MAXN << 1]; + public static int[] siz = new int[MAXN << 1]; + public static int[][] rollback = new int[MAXN << 1][2]; public static int opsize = 0; - public static int[] head = new int[MAXM << 2]; + public static int[] head = new int[MAXN << 2]; public static int[] next = new int[MAXT]; public static int[] tox = new int[MAXT]; public static int[] toy = new int[MAXT]; public static int cnt = 0; - public static boolean[] ans = new boolean[MAXM]; + public static boolean[] ans = new boolean[MAXN]; public static void addEdge(int i, int x, int y) { next[++cnt] = head[i]; @@ -76,7 +66,7 @@ public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int if (jobl <= l && r <= jobr) { addEdge(i, jobx, joby); } else { - int mid = (l + r) >> 1; + int mid = (l + r) / 2; if (jobl <= mid) { add(jobl, jobr, jobx, joby, l, mid, i << 1); } @@ -87,52 +77,37 @@ public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int } public static void dfs(int l, int r, int i) { + boolean check = true; int unionCnt = 0; for (int ei = head[i], x, y, fx, fy; ei > 0; ei = next[ei]) { x = tox[ei]; y = toy[ei]; fx = find(x); fy = find(y); - if (fx != fy) { - union(fx, fy); - unionCnt++; + if (fx == fy) { + check = false; + break; + } else { + union(x, y + n); + union(y, x + n); + unionCnt += 2; } } - if (l == r) { - if (op[l] == 2) { - ans[l] = find(a[l]) == find(b[l]); + if (check) { + if (l == r) { + ans[l] = true; + } else { + int mid = (l + r) / 2; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); } } else { - int mid = (l + r) / 2; - dfs(l, mid, i << 1); - dfs(mid + 1, r, i << 1 | 1); - } - for (int j = 1; j <= unionCnt; j++) { - undo(); - } - } - - public static void prepare() { - for (int i = 1; i <= n; i++) { - father[i] = i; - siz[i] = 1; - } - for (int i = 1, x, y; i <= m; i++) { - x = a[i]; - y = b[i]; - if (op[i] == 0) { - last[x][y] = i; - } else if (op[i] == 1) { - add(last[x][y], i - 1, x, y, 1, m, 1); - last[x][y] = 0; + for (int k = l; k <= r; k++) { + ans[k] = false; } } - for (int x = 1; x <= n; x++) { - for (int y = x + 1; y <= n; y++) { - if (last[x][y] != 0) { - add(last[x][y], m, x, y, 1, m, 1); - } - } + for (int k = 1; k <= unionCnt; k++) { + undo(); } } @@ -140,23 +115,24 @@ public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); m = io.nextInt(); - for (int i = 1, x, y, t; i <= m; i++) { - t = io.nextInt(); + k = io.nextInt(); + for (int i = 1; i <= n * 2; i++) { + father[i] = i; + siz[i] = 1; + } + for (int i = 1, x, y, l, r; i <= m; i++) { x = io.nextInt(); y = io.nextInt(); - op[i] = t; - a[i] = Math.min(x, y); - b[i] = Math.max(x, y); - } - prepare(); - dfs(1, m, 1); - for (int i = 1; i <= m; i++) { - if (op[i] == 2) { - if (ans[i]) { - io.write("Y\n"); - } else { - io.write("N\n"); - } + l = io.nextInt(); + r = io.nextInt(); + add(l + 1, r, x, y, 1, k, 1); + } + dfs(1, k, 1); + for (int i = 1; i <= k; i++) { + if (ans[i]) { + io.write("Yes\n"); + } else { + io.write("No\n"); } } io.flush(); diff --git a/src/class166/Code02_MinimumMexTree1.java b/src/class166/Code03_MinimumMexTree1.java similarity index 99% rename from src/class166/Code02_MinimumMexTree1.java rename to src/class166/Code03_MinimumMexTree1.java index fa58c3e8e..a3bc7baff 100644 --- a/src/class166/Code02_MinimumMexTree1.java +++ b/src/class166/Code03_MinimumMexTree1.java @@ -8,7 +8,7 @@ import java.io.InputStream; import java.io.OutputStream; -public class Code02_MinimumMexTree1 { +public class Code03_MinimumMexTree1 { public static int MAXN = 1000001; public static int MAXV = 100001; diff --git a/src/class166/Code03_UniqueOccurrences1.java b/src/class166/Code04_UniqueOccurrences1.java similarity index 99% rename from src/class166/Code03_UniqueOccurrences1.java rename to src/class166/Code04_UniqueOccurrences1.java index 472e79ec9..076611cd3 100644 --- a/src/class166/Code03_UniqueOccurrences1.java +++ b/src/class166/Code04_UniqueOccurrences1.java @@ -9,7 +9,7 @@ import java.io.InputStream; import java.io.OutputStream; -public class Code03_UniqueOccurrences1 { +public class Code04_UniqueOccurrences1 { public static int MAXN = 500001; public static int MAXT = 10000001; diff --git a/src/class166/Code04_GreatIntegration1.java b/src/class166/Code05_GreatIntegration1.java similarity index 99% rename from src/class166/Code04_GreatIntegration1.java rename to src/class166/Code05_GreatIntegration1.java index 050b8a6f3..58f1c7444 100644 --- a/src/class166/Code04_GreatIntegration1.java +++ b/src/class166/Code05_GreatIntegration1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code04_GreatIntegration1 { +public class Code05_GreatIntegration1 { public static int MAXN = 100001; public static int MAXT = 3000001; diff --git a/src/class166/Code05_ConnectedGraph1.java b/src/class166/Code06_ConnectedGraph1.java similarity index 99% rename from src/class166/Code05_ConnectedGraph1.java rename to src/class166/Code06_ConnectedGraph1.java index bcfa47abc..701e5e094 100644 --- a/src/class166/Code05_ConnectedGraph1.java +++ b/src/class166/Code06_ConnectedGraph1.java @@ -9,7 +9,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code05_ConnectedGraph1 { +public class Code06_ConnectedGraph1 { public static int MAXN = 100001; public static int MAXM = 200001; From 7e1dd30fa7f1d4a0bdd4de8c99b696d772b814bb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 20 Apr 2025 18:17:24 +0800 Subject: [PATCH 0005/1170] modify code --- src/class166/Code07_PaintingEdges1.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/class166/Code07_PaintingEdges1.java diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java new file mode 100644 index 000000000..7444e2bad --- /dev/null +++ b/src/class166/Code07_PaintingEdges1.java @@ -0,0 +1,8 @@ +package class166; + +// 边的涂色 +// 测试链接 : https://www.luogu.com.cn/problem/CF576E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +public class Code07_PaintingEdges1 { + +} From 45c780aa3a1bd284c0e2792214b17e29b94d0784 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 20 Apr 2025 23:41:39 +0800 Subject: [PATCH 0006/1170] modify code --- ...Conquer1.java => Code01_SegmentTreeDivideConquer1.java} | 7 +++---- ...Conquer2.java => Code01_SegmentTreeDivideConquer2.java} | 0 2 files changed, 3 insertions(+), 4 deletions(-) rename src/class166/{Code01_SegmentTreeDivideAndConquer1.java => Code01_SegmentTreeDivideConquer1.java} (95%) rename src/class166/{Code01_SegmentTreeDivideAndConquer2.java => Code01_SegmentTreeDivideConquer2.java} (100%) diff --git a/src/class166/Code01_SegmentTreeDivideAndConquer1.java b/src/class166/Code01_SegmentTreeDivideConquer1.java similarity index 95% rename from src/class166/Code01_SegmentTreeDivideAndConquer1.java rename to src/class166/Code01_SegmentTreeDivideConquer1.java index 93edffa2e..32c414968 100644 --- a/src/class166/Code01_SegmentTreeDivideAndConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideConquer1.java @@ -3,16 +3,15 @@ // 线段树分治模版题,java版 // 测试链接 : https://loj.ac/p/121 // 提交以下的code,提交时请把类名改成"Main" -// 测试平台看似支持java语言,其实无法通过 -// 内存过大跳警告,导致验证失败,想通过用C++实现 -// 本节课Code01_SegmentTreeDivideAndConquer2文件就是C++的实现 +// 测试平台看似支持java语言,其实无法通过,内存过大报警,导致验证失败 +// 想通过用C++实现,就是Code01_SegmentTreeDivideConquer2文件 // 逻辑完全一样,C++实现可以通过全部测试用例 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -public class Code01_SegmentTreeDivideAndConquer1 { +public class Code01_SegmentTreeDivideConquer1 { public static int MAXN = 5001; public static int MAXM = 500001; diff --git a/src/class166/Code01_SegmentTreeDivideAndConquer2.java b/src/class166/Code01_SegmentTreeDivideConquer2.java similarity index 100% rename from src/class166/Code01_SegmentTreeDivideAndConquer2.java rename to src/class166/Code01_SegmentTreeDivideConquer2.java From 24824fdbf1899563ba75cd7fef0d5ebe0dc2e15a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 20 Apr 2025 23:47:21 +0800 Subject: [PATCH 0007/1170] modify code --- src/class166/Code06_ConnectedGraph1.java | 2 +- src/class166/Code07_PaintingEdges1.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class166/Code06_ConnectedGraph1.java b/src/class166/Code06_ConnectedGraph1.java index 701e5e094..4f1409c73 100644 --- a/src/class166/Code06_ConnectedGraph1.java +++ b/src/class166/Code06_ConnectedGraph1.java @@ -1,6 +1,6 @@ package class166; -// 连通图 +// 连通图,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5227 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java index 7444e2bad..112b088ac 100644 --- a/src/class166/Code07_PaintingEdges1.java +++ b/src/class166/Code07_PaintingEdges1.java @@ -1,6 +1,6 @@ package class166; -// 边的涂色 +// 边的涂色,java版 // 测试链接 : https://www.luogu.com.cn/problem/CF576E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 public class Code07_PaintingEdges1 { From bd24218884ab509cb0a0c4332ab9fb5d81106d0f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 21 Apr 2025 00:00:45 +0800 Subject: [PATCH 0008/1170] modify code --- .../Code01_SegmentTreeDivideConquer1.java | 35 ++++++++++--------- .../Code01_SegmentTreeDivideConquer2.java | 35 ++++++++++--------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/class166/Code01_SegmentTreeDivideConquer1.java b/src/class166/Code01_SegmentTreeDivideConquer1.java index 32c414968..162154c13 100644 --- a/src/class166/Code01_SegmentTreeDivideConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideConquer1.java @@ -18,10 +18,7 @@ public class Code01_SegmentTreeDivideConquer1 { public static int MAXT = 5000001; public static int n, m; - public static int[] op = new int[MAXM]; - public static int[] a = new int[MAXM]; - public static int[] b = new int[MAXM]; - + public static int[][] event = new int[MAXM][3]; public static int[][] last = new int[MAXN][MAXN]; public static int[] father = new int[MAXN]; @@ -99,8 +96,11 @@ public static void dfs(int l, int r, int i) { } } if (l == r) { - if (op[l] == 2) { - ans[l] = find(a[l]) == find(b[l]); + int op = event[l][0]; + int x = event[l][1]; + int y = event[l][2]; + if (op == 2) { + ans[l] = find(x) == find(y); } } else { int mid = (l + r) / 2; @@ -117,12 +117,13 @@ public static void prepare() { father[i] = i; siz[i] = 1; } - for (int i = 1, x, y; i <= m; i++) { - x = a[i]; - y = b[i]; - if (op[i] == 0) { + for (int i = 1, op, x, y; i <= m; i++) { + op = event[i][0]; + x = event[i][1]; + y = event[i][2]; + if (op == 0) { last[x][y] = i; - } else if (op[i] == 1) { + } else if (op == 1) { add(last[x][y], i - 1, x, y, 1, m, 1); last[x][y] = 0; } @@ -140,18 +141,18 @@ public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); m = io.nextInt(); - for (int i = 1, x, y, t; i <= m; i++) { - t = io.nextInt(); + for (int i = 1, op, x, y; i <= m; i++) { + op = io.nextInt(); x = io.nextInt(); y = io.nextInt(); - op[i] = t; - a[i] = Math.min(x, y); - b[i] = Math.max(x, y); + event[i][0] = op; + event[i][1] = Math.min(x, y); + event[i][2] = Math.max(x, y); } prepare(); dfs(1, m, 1); for (int i = 1; i <= m; i++) { - if (op[i] == 2) { + if (event[i][0] == 2) { if (ans[i]) { io.write("Y\n"); } else { diff --git a/src/class166/Code01_SegmentTreeDivideConquer2.java b/src/class166/Code01_SegmentTreeDivideConquer2.java index 4210b40fa..b555f675b 100644 --- a/src/class166/Code01_SegmentTreeDivideConquer2.java +++ b/src/class166/Code01_SegmentTreeDivideConquer2.java @@ -14,10 +14,7 @@ //const int MAXT = 5000001; //int n, m; // -//int op[MAXM]; -//int a[MAXM]; -//int b[MAXM]; -// +//int event[MAXM][3]; //int last[MAXN][MAXN]; // //int father[MAXN]; @@ -95,8 +92,11 @@ // } // } // if (l == r) { -// if (op[l] == 2) { -// ans[l] = find(a[l]) == find(b[l]); +// int op = event[l][0]; +// int x = event[l][1]; +// int y = event[l][2]; +// if (op == 2) { +// ans[l] = find(x) == find(y); // } // } else { // int mid = (l + r) >> 1; @@ -113,12 +113,13 @@ // father[i] = i; // siz[i] = 1; // } -// for (int i = 1, x, y; i <= m; i++) { -// x = a[i]; -// y = b[i]; -// if (op[i] == 0) { +// for (int i = 1, op, x, y; i <= m; i++) { +// op = event[i][0]; +// x = event[i][1]; +// y = event[i][2]; +// if (op == 0) { // last[x][y] = i; -// } else if (op[i] == 1) { +// } else if (op == 1) { // add(last[x][y], i - 1, x, y, 1, m, 1); // last[x][y] = 0; // } @@ -136,16 +137,16 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m; -// for (int i = 1, t, x, y; i <= m; i++) { -// cin >> t >> x >> y; -// op[i] = t; -// a[i] = min(x, y); -// b[i] = max(x, y); +// for (int i = 1, op, x, y; i <= m; i++) { +// cin >> op >> x >> y; +// event[i][0] = op; +// event[i][1] = min(x, y); +// event[i][2] = max(x, y); // } // prepare(); // dfs(1, m, 1); // for (int i = 1; i <= m; i++) { -// if (op[i] == 2) { +// if (event[i][0] == 2) { // if (ans[i]) { // cout << "Y" << "\n"; // } else { From 0bd1694f1fa3cd4d3cb138e040864f440a8c9ea9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 21 Apr 2025 21:32:49 +0800 Subject: [PATCH 0009/1170] modify code --- src/class166/Code07_PaintingEdges1.java | 242 ++++++++++++++++++++++++ src/class166/Code07_PaintingEdges2.java | 163 ++++++++++++++++ 2 files changed, 405 insertions(+) create mode 100644 src/class166/Code07_PaintingEdges2.java diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java index 112b088ac..f4ea844dd 100644 --- a/src/class166/Code07_PaintingEdges1.java +++ b/src/class166/Code07_PaintingEdges1.java @@ -2,7 +2,249 @@ // 边的涂色,java版 // 测试链接 : https://www.luogu.com.cn/problem/CF576E +// 测试链接 : https://codeforces.com/problemset/problem/576/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + public class Code07_PaintingEdges1 { + public static int MAXN = 500001; + public static int MAXK = 51; + public static int MAXT = 10000001; + public static int n, m, k, q; + + public static int[] u = new int[MAXN]; + public static int[] v = new int[MAXN]; + public static int[] e = new int[MAXN]; + public static int[] c = new int[MAXN]; + + public static int[] pos = new int[MAXN]; + + public static int[][] father = new int[MAXK][MAXN << 1]; + public static int[][] siz = new int[MAXK][MAXN << 1]; + public static int[][] rollback = new int[MAXN << 1][3]; + public static int opsize = 0; + + public static int[] head = new int[MAXN << 2]; + public static int[] next = new int[MAXT]; + public static int[] qid = new int[MAXT]; + public static int cnt = 0; + + public static boolean[] ans = new boolean[MAXN]; + + public static void addEdge(int i, int qi) { + next[++cnt] = head[i]; + qid[cnt] = qi; + head[i] = cnt; + } + + public static int find(int color, int i) { + while (i != father[color][i]) { + i = father[color][i]; + } + return i; + } + + public static void union(int color, int x, int y) { + int fx = find(color, x); + int fy = find(color, y); + if (siz[color][fx] < siz[color][fy]) { + int tmp = fx; + fx = fy; + fy = tmp; + } + father[color][fy] = fx; + siz[color][fx] += siz[color][fy]; + rollback[++opsize][0] = color; + rollback[opsize][1] = fx; + rollback[opsize][2] = fy; + } + + public static void undo() { + int color = rollback[opsize][0]; + int fx = rollback[opsize][1]; + int fy = rollback[opsize--][2]; + father[color][fy] = fy; + siz[color][fx] -= siz[color][fy]; + } + + public static void add(int jobl, int jobr, int jobq, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdge(i, jobq); + } else { + int mid = (l + r) >> 1; + if (jobl <= mid) { + add(jobl, jobr, jobq, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobq, mid + 1, r, i << 1 | 1); + } + } + } + + public static void dfs(int l, int r, int i) { + int unionCnt = 0; + for (int ei = head[i]; ei > 0; ei = next[ei]) { + int color = c[qid[ei]]; + int x = u[e[qid[ei]]], xn = x + n, fx = find(color, x), fxn = find(color, xn); + int y = v[e[qid[ei]]], yn = y + n, fy = find(color, y), fyn = find(color, yn); + if (fx != fyn) { + union(color, fx, fyn); + unionCnt++; + } + if (fy != fxn) { + union(color, fy, fxn); + unionCnt++; + } + } + if (l == r) { + if (find(c[l], u[e[l]]) == find(c[l], v[e[l]])) { + ans[l] = false; + c[l] = pos[e[l]]; + } else { + ans[l] = true; + pos[e[l]] = c[l]; + } + } else { + int mid = (l + r) >> 1; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); + } + for (int j = 1; j <= unionCnt; j++) { + undo(); + } + } + + public static void prepare() { + for (int color = 1; color <= k; color++) { + for (int i = 1; i <= n; i++) { + father[color][i] = i; + father[color][i + n] = i + n; + siz[color][i] = 1; + siz[color][i + n] = 1; + } + } + for (int i = 1; i <= m; i++) { + pos[i] = q + 1; + } + for (int i = q; i >= 1; i--) { + if (i + 1 <= pos[e[i]] - 1) { + add(i + 1, pos[e[i]] - 1, i, 1, q, 1); + } + pos[e[i]] = i; + } + for (int i = 1; i <= m; i++) { + pos[i] = 0; + } + } + + public static void main(String[] args) { + FastIO io = new FastIO(System.in, System.out); + n = io.nextInt(); + m = io.nextInt(); + k = io.nextInt(); + q = io.nextInt(); + for (int i = 1; i <= m; i++) { + u[i] = io.nextInt(); + v[i] = io.nextInt(); + } + for (int i = 1; i <= q; i++) { + e[i] = io.nextInt(); + c[i] = io.nextInt(); + } + prepare(); + dfs(1, q, 1); + for (int i = 1; i <= q; i++) { + if (ans[i]) { + io.write("YES\n"); + } else { + io.write("NO\n"); + } + } + io.flush(); + } + + // 读写工具类 + static class FastIO { + private final InputStream is; + private final OutputStream os; + private final byte[] inbuf = new byte[1 << 16]; + private int lenbuf = 0; + private int ptrbuf = 0; + private final StringBuilder outBuf = new StringBuilder(); + + public FastIO(InputStream is, OutputStream os) { + this.is = is; + this.os = os; + } + + private int readByte() { + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new RuntimeException(e); + } + if (lenbuf == -1) { + return -1; + } + } + return inbuf[ptrbuf++] & 0xff; + } + + private int skip() { + int b; + while ((b = readByte()) != -1) { + if (b > ' ') { + return b; + } + } + return -1; + } + + public int nextInt() { + int b = skip(); + if (b == -1) { + throw new RuntimeException("No more integers (EOF)"); + } + boolean negative = false; + if (b == '-') { + negative = true; + b = readByte(); + } + int val = 0; + while (b >= '0' && b <= '9') { + val = val * 10 + (b - '0'); + b = readByte(); + } + return negative ? -val : val; + } + + public void write(String s) { + outBuf.append(s); + } + + public void writeInt(int x) { + outBuf.append(x); + } + + public void writelnInt(int x) { + outBuf.append(x).append('\n'); + } + + public void flush() { + try { + os.write(outBuf.toString().getBytes()); + os.flush(); + outBuf.setLength(0); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } diff --git a/src/class166/Code07_PaintingEdges2.java b/src/class166/Code07_PaintingEdges2.java new file mode 100644 index 000000000..9483bebf5 --- /dev/null +++ b/src/class166/Code07_PaintingEdges2.java @@ -0,0 +1,163 @@ +package class166; + +// 边的涂色,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF576E +// 测试链接 : https://codeforces.com/problemset/problem/576/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 500001; +//const int MAXK = 51; +//const int MAXT = 10000001; +//int n, m, k, q; +// +//int u[MAXN]; +//int v[MAXN]; +//int e[MAXN]; +//int c[MAXN]; +// +//int pos[MAXN]; +// +//int father[MAXK][MAXN << 1]; +//int siz[MAXK][MAXN << 1]; +//int rollback[MAXN << 1][3]; +//int opsize = 0; +// +//int head[MAXN << 2]; +//int nxt[MAXT]; +//int qid[MAXT]; +//int cnt = 0; +// +//bool ans[MAXN]; +// +//void addEdge(int i, int qi) { +// nxt[++cnt] = head[i]; +// qid[cnt] = qi; +// head[i] = cnt; +//} +// +//int find(int color, int i) { +// while (i != father[color][i]) { +// i = father[color][i]; +// } +// return i; +//} +// +//void Union(int color, int x, int y) { +// int fx = find(color, x); +// int fy = find(color, y); +// if (siz[color][fx] < siz[color][fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[color][fy] = fx; +// siz[color][fx] += siz[color][fy]; +// rollback[++opsize][0] = color; +// rollback[opsize][1] = fx; +// rollback[opsize][2] = fy; +//} +// +//void undo() { +// int color = rollback[opsize][0]; +// int fx = rollback[opsize][1]; +// int fy = rollback[opsize--][2]; +// father[color][fy] = fy; +// siz[color][fx] -= siz[color][fy]; +//} +// +//void add(int jobl, int jobr, int jobq, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobq); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobq, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobq, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i) { +// int unionCnt = 0; +// for (int ei = head[i]; ei > 0; ei = nxt[ei]) { +// int color = c[qid[ei]]; +// int x = u[e[qid[ei]]], xn = x + n, fx = find(color, x), fxn = find(color, xn); +// int y = v[e[qid[ei]]], yn = y + n, fy = find(color, y), fyn = find(color, yn); +// if (fx != fyn) { +// Union(color, fx, fyn); +// unionCnt++; +// } +// if (fy != fxn) { +// Union(color, fy, fxn); +// unionCnt++; +// } +// } +// if (l == r) { +// if (find(c[l], u[e[l]]) == find(c[l], v[e[l]])) { +// ans[l] = false; +// c[l] = pos[e[l]]; +// } else { +// ans[l] = true; +// pos[e[l]] = c[l]; +// } +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// for (int j = 1; j <= unionCnt; j++) { +// undo(); +// } +//} +// +//void prepare() { +// for (int color = 1; color <= k; color++) { +// for (int i = 1; i <= n; i++) { +// father[color][i] = i; +// father[color][i + n] = i + n; +// siz[color][i] = 1; +// siz[color][i + n] = 1; +// } +// } +// for (int i = 1; i <= m; i++) { +// pos[i] = q + 1; +// } +// for (int i = q; i >= 1; i--) { +// if (i + 1 <= pos[e[i]] - 1) { +// add(i + 1, pos[e[i]] - 1, i, 1, q, 1); +// } +// pos[e[i]] = i; +// } +// for (int i = 1; i <= m; i++) { +// pos[i] = 0; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> k >> q; +// for (int i = 1; i <= m; i++) { +// cin >> u[i] >> v[i]; +// } +// for (int i = 1; i <= q; i++) { +// cin >> e[i] >> c[i]; +// } +// prepare(); +// dfs(1, q, 1); +// for (int i = 1; i <= q; i++) { +// if (ans[i]) { +// cout << "YES" << "\n"; +// } else { +// cout << "NO" << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 236f26bc3430c20fb17b0e1528d5b0758704c881 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 21 Apr 2025 22:04:42 +0800 Subject: [PATCH 0010/1170] modify code --- .../Code01_SegmentTreeDivideConquer1.java | 41 ++++++++--------- .../Code01_SegmentTreeDivideConquer2.java | 36 +++++++-------- src/class166/Code05_GreatIntegration1.java | 45 ++++++++++--------- src/class166/Code06_ConnectedGraph1.java | 14 +++--- 4 files changed, 67 insertions(+), 69 deletions(-) diff --git a/src/class166/Code01_SegmentTreeDivideConquer1.java b/src/class166/Code01_SegmentTreeDivideConquer1.java index 162154c13..e8deaac52 100644 --- a/src/class166/Code01_SegmentTreeDivideConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideConquer1.java @@ -2,10 +2,7 @@ // 线段树分治模版题,java版 // 测试链接 : https://loj.ac/p/121 -// 提交以下的code,提交时请把类名改成"Main" -// 测试平台看似支持java语言,其实无法通过,内存过大报警,导致验证失败 -// 想通过用C++实现,就是Code01_SegmentTreeDivideConquer2文件 -// 逻辑完全一样,C++实现可以通过全部测试用例 +// 提交以下的code,提交时类名改成"Main",多提交几次,可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; @@ -18,7 +15,10 @@ public class Code01_SegmentTreeDivideConquer1 { public static int MAXT = 5000001; public static int n, m; - public static int[][] event = new int[MAXM][3]; + public static int[] op = new int[MAXM]; + public static int[] u = new int[MAXM]; + public static int[] v = new int[MAXM]; + public static int[][] last = new int[MAXN][MAXN]; public static int[] father = new int[MAXN]; @@ -96,11 +96,8 @@ public static void dfs(int l, int r, int i) { } } if (l == r) { - int op = event[l][0]; - int x = event[l][1]; - int y = event[l][2]; - if (op == 2) { - ans[l] = find(x) == find(y); + if (op[l] == 2) { + ans[l] = find(u[l]) == find(v[l]); } } else { int mid = (l + r) / 2; @@ -117,13 +114,13 @@ public static void prepare() { father[i] = i; siz[i] = 1; } - for (int i = 1, op, x, y; i <= m; i++) { - op = event[i][0]; - x = event[i][1]; - y = event[i][2]; - if (op == 0) { + for (int i = 1, t, x, y; i <= m; i++) { + t = op[i]; + x = u[i]; + y = v[i]; + if (t == 0) { last[x][y] = i; - } else if (op == 1) { + } else if (t == 1) { add(last[x][y], i - 1, x, y, 1, m, 1); last[x][y] = 0; } @@ -141,18 +138,18 @@ public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); m = io.nextInt(); - for (int i = 1, op, x, y; i <= m; i++) { - op = io.nextInt(); + for (int i = 1, t, x, y; i <= m; i++) { + t = io.nextInt(); x = io.nextInt(); y = io.nextInt(); - event[i][0] = op; - event[i][1] = Math.min(x, y); - event[i][2] = Math.max(x, y); + op[i] = t; + u[i] = Math.min(x, y); + v[i] = Math.max(x, y); } prepare(); dfs(1, m, 1); for (int i = 1; i <= m; i++) { - if (event[i][0] == 2) { + if (op[i] == 2) { if (ans[i]) { io.write("Y\n"); } else { diff --git a/src/class166/Code01_SegmentTreeDivideConquer2.java b/src/class166/Code01_SegmentTreeDivideConquer2.java index b555f675b..04cff0615 100644 --- a/src/class166/Code01_SegmentTreeDivideConquer2.java +++ b/src/class166/Code01_SegmentTreeDivideConquer2.java @@ -14,7 +14,10 @@ //const int MAXT = 5000001; //int n, m; // -//int event[MAXM][3]; +//int op[MAXM]; +//int u[MAXM]; +//int v[MAXM]; +// //int last[MAXN][MAXN]; // //int father[MAXN]; @@ -92,11 +95,8 @@ // } // } // if (l == r) { -// int op = event[l][0]; -// int x = event[l][1]; -// int y = event[l][2]; -// if (op == 2) { -// ans[l] = find(x) == find(y); +// if (op[l] == 2) { +// ans[l] = find(u[l]) == find(v[l]); // } // } else { // int mid = (l + r) >> 1; @@ -113,13 +113,13 @@ // father[i] = i; // siz[i] = 1; // } -// for (int i = 1, op, x, y; i <= m; i++) { -// op = event[i][0]; -// x = event[i][1]; -// y = event[i][2]; -// if (op == 0) { +// for (int i = 1, t, x, y; i <= m; i++) { +// t = op[i]; +// x = u[i]; +// y = v[i]; +// if (t == 0) { // last[x][y] = i; -// } else if (op == 1) { +// } else if (t == 1) { // add(last[x][y], i - 1, x, y, 1, m, 1); // last[x][y] = 0; // } @@ -137,16 +137,16 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m; -// for (int i = 1, op, x, y; i <= m; i++) { -// cin >> op >> x >> y; -// event[i][0] = op; -// event[i][1] = min(x, y); -// event[i][2] = max(x, y); +// for (int i = 1, t, x, y; i <= m; i++) { +// cin >> t >> x >> y; +// op[i] = t; +// u[i] = min(x, y); +// v[i] = max(x, y); // } // prepare(); // dfs(1, m, 1); // for (int i = 1; i <= m; i++) { -// if (event[i][0] == 2) { +// if (op[i] == 2) { // if (ans[i]) { // cout << "Y" << "\n"; // } else { diff --git a/src/class166/Code05_GreatIntegration1.java b/src/class166/Code05_GreatIntegration1.java index 58f1c7444..fecf87f25 100644 --- a/src/class166/Code05_GreatIntegration1.java +++ b/src/class166/Code05_GreatIntegration1.java @@ -16,7 +16,10 @@ public class Code05_GreatIntegration1 { public static int MAXT = 3000001; public static int n, q; - public static int[][] event = new int[MAXN][3]; + public static int[] op = new int[MAXN]; + public static int[] u = new int[MAXN]; + public static int[] v = new int[MAXN]; + public static int[][] sorted = new int[MAXN][3]; public static int[] father = new int[MAXN]; @@ -92,8 +95,8 @@ public static void dfs(int l, int r, int i) { } } if (l == r) { - if (event[l][0] == 2) { - ans[l] = (long) siz[find(event[l][1])] * siz[find(event[l][2])]; + if (op[l] == 2) { + ans[l] = (long) siz[find(u[l])] * siz[find(v[l])]; } } else { int mid = (l + r) >> 1; @@ -111,21 +114,19 @@ public static void prepare() { siz[i] = 1; } for (int i = 1; i <= q; i++) { - sorted[i][0] = i; - sorted[i][1] = event[i][1]; - sorted[i][2] = event[i][2]; + sorted[i][0] = u[i]; + sorted[i][1] = v[i]; + sorted[i][2] = i; } - Arrays.sort(sorted, 1, q + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[0] - b[0]); + Arrays.sort(sorted, 1, q + 1, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]); for (int l = 1, r = 1; l <= q; l = ++r) { - int t = sorted[l][0]; - int x = sorted[l][1]; - int y = sorted[l][2]; - while (r + 1 <= q && sorted[r + 1][1] == x && sorted[r + 1][2] == y) { + int x = sorted[l][0], y = sorted[l][1], t = sorted[l][2]; + while (r + 1 <= q && sorted[r + 1][0] == x && sorted[r + 1][1] == y) { r++; } for (int i = l + 1; i <= r; i++) { - add(t, sorted[i][0] - 1, x, y, 1, q, 1); - t = sorted[i][0] + 1; + add(t, sorted[i][2] - 1, x, y, 1, q, 1); + t = sorted[i][2] + 1; } if (t <= q) { add(t, q, x, y, 1, q, 1); @@ -138,20 +139,20 @@ public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); q = in.nextInt(); - char op; - int u, v; + char t; + int x, y; for (int i = 1; i <= q; i++) { - op = in.nextChar(); - u = in.nextInt(); - v = in.nextInt(); - event[i][0] = op == 'A' ? 1 : 2; - event[i][1] = Math.min(u, v); - event[i][2] = Math.max(u, v); + t = in.nextChar(); + x = in.nextInt(); + y = in.nextInt(); + op[i] = t == 'A' ? 1 : 2; + u[i] = Math.min(x, y); + v[i] = Math.max(x, y); } prepare(); dfs(1, q, 1); for (int i = 1; i <= q; i++) { - if (event[i][0] == 2) { + if (op[i] == 2) { out.println(ans[i]); } } diff --git a/src/class166/Code06_ConnectedGraph1.java b/src/class166/Code06_ConnectedGraph1.java index 4f1409c73..53f39e061 100644 --- a/src/class166/Code06_ConnectedGraph1.java +++ b/src/class166/Code06_ConnectedGraph1.java @@ -17,8 +17,8 @@ public class Code06_ConnectedGraph1 { public static int MAXT = 10000001; public static int n, m, k; - public static int[] x = new int[MAXM]; - public static int[] y = new int[MAXM]; + public static int[] u = new int[MAXM]; + public static int[] v = new int[MAXM]; public static int[][] event = new int[MAXE][2]; public static int ecnt = 0; @@ -137,17 +137,17 @@ public static void prepare() { t = 1; for (int i = l; i <= r; i++) { if (t <= event[i][1] - 1) { - add(t, event[i][1] - 1, x[eid], y[eid], 1, k, 1); + add(t, event[i][1] - 1, u[eid], v[eid], 1, k, 1); } t = event[i][1] + 1; } if (t <= k) { - add(t, k, x[eid], y[eid], 1, k, 1); + add(t, k, u[eid], v[eid], 1, k, 1); } } for (int i = 1; i <= m; i++) { if (!visit[i]) { - add(1, k, x[i], y[i], 1, k, 1); + add(1, k, u[i], v[i], 1, k, 1); } } } @@ -157,8 +157,8 @@ public static void main(String[] args) { n = io.nextInt(); m = io.nextInt(); for (int i = 1; i <= m; i++) { - x[i] = io.nextInt(); - y[i] = io.nextInt(); + u[i] = io.nextInt(); + v[i] = io.nextInt(); } k = io.nextInt(); for (int i = 1, s; i <= k; i++) { From f02297918aad6cdece7e940a1a32388cf6d352ba Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 21 Apr 2025 22:30:26 +0800 Subject: [PATCH 0011/1170] modify code --- src/class166/Code02_CheckBipartiteGraph1.java | 7 +- src/class166/Code02_CheckBipartiteGraph2.java | 131 +++++++++++++++++ src/class166/Code03_MinimumMexTree2.java | 128 +++++++++++++++++ src/class166/Code04_UniqueOccurrences2.java | 135 ++++++++++++++++++ 4 files changed, 396 insertions(+), 5 deletions(-) create mode 100644 src/class166/Code02_CheckBipartiteGraph2.java create mode 100644 src/class166/Code03_MinimumMexTree2.java create mode 100644 src/class166/Code04_UniqueOccurrences2.java diff --git a/src/class166/Code02_CheckBipartiteGraph1.java b/src/class166/Code02_CheckBipartiteGraph1.java index 37eae2735..82d3c29e4 100644 --- a/src/class166/Code02_CheckBipartiteGraph1.java +++ b/src/class166/Code02_CheckBipartiteGraph1.java @@ -79,11 +79,8 @@ public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int public static void dfs(int l, int r, int i) { boolean check = true; int unionCnt = 0; - for (int ei = head[i], x, y, fx, fy; ei > 0; ei = next[ei]) { - x = tox[ei]; - y = toy[ei]; - fx = find(x); - fy = find(y); + for (int ei = head[i]; ei > 0; ei = next[ei]) { + int x = tox[ei], y = toy[ei], fx = find(x), fy = find(y); if (fx == fy) { check = false; break; diff --git a/src/class166/Code02_CheckBipartiteGraph2.java b/src/class166/Code02_CheckBipartiteGraph2.java new file mode 100644 index 000000000..31d1359dd --- /dev/null +++ b/src/class166/Code02_CheckBipartiteGraph2.java @@ -0,0 +1,131 @@ +package class166; + +// 检查二分图,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5787 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXT = 3000001; +//int n, m, k; +// +//int father[MAXN << 1]; +//int siz[MAXN << 1]; +//int rollback[MAXN << 1][2]; +//int opsize = 0; +// +//int head[MAXN << 2]; +//int nxt[MAXT]; +//int tox[MAXT]; +//int toy[MAXT]; +//int cnt = 0; +// +//bool ans[MAXN]; +// +//void addEdge(int i, int x, int y) { +// nxt[++cnt] = head[i]; +// tox[cnt] = x; +// toy[cnt] = y; +// head[i] = cnt; +//} +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//void Union(int x, int y) { +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; +//} +// +//void undo() { +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +//} +// +//void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobx, joby, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i) { +// bool check = true; +// int unionCnt = 0; +// for (int ei = head[i]; ei > 0; ei = nxt[ei]) { +// int x = tox[ei], y = toy[ei], fx = find(x), fy = find(y); +// if (fx == fy) { +// check = false; +// break; +// } else { +// Union(x, y + n); +// Union(y, x + n); +// unionCnt += 2; +// } +// } +// if (check) { +// if (l == r) { +// ans[l] = true; +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// } else { +// for (int k = l; k <= r; k++) { +// ans[k] = false; +// } +// } +// for (int k = 1; k <= unionCnt; k++) { +// undo(); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> k; +// for (int i = 1; i <= n * 2; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// for (int i = 1, x, y, l, r; i <= m; i++) { +// cin >> x >> y >> l >> r; +// add(l + 1, r, x, y, 1, k, 1); +// } +// dfs(1, k, 1); +// for (int i = 1; i <= k; i++) { +// if (ans[i]) { +// cout << "Yes" << "\n"; +// } else { +// cout << "No" << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class166/Code03_MinimumMexTree2.java b/src/class166/Code03_MinimumMexTree2.java new file mode 100644 index 000000000..7c771c5a8 --- /dev/null +++ b/src/class166/Code03_MinimumMexTree2.java @@ -0,0 +1,128 @@ +package class166; + +// 最小mex生成树,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5631 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1000001; +//const int MAXV = 100001; +//const int MAXT = 30000001; +// +//int n, m, v; +// +//int father[MAXN]; +//int siz[MAXN]; +//int rollback[MAXN][2]; +//int opsize = 0; +// +//int head[MAXV << 2]; +//int nxt[MAXT]; +//int tox[MAXT]; +//int toy[MAXT]; +//int cnt = 0; +// +//int part; +// +//void addEdge(int i, int x, int y) { +// nxt[++cnt] = head[i]; +// tox[cnt] = x; +// toy[cnt] = y; +// head[i] = cnt; +//} +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//void Union(int x, int y) { +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; +//} +// +//void undo() { +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +//} +// +//void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobx, joby, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//int dfs(int l, int r, int i) { +// int unionCnt = 0; +// for (int ei = head[i]; ei > 0; ei = nxt[ei]) { +// int fx = find(tox[ei]); +// int fy = find(toy[ei]); +// if (fx != fy) { +// Union(fx, fy); +// part--; +// unionCnt++; +// } +// } +// int ans = -1; +// if (l == r) { +// if (part == 1) { +// ans = l; +// } +// } else { +// int mid = (l + r) >> 1; +// ans = dfs(l, mid, i << 1); +// if (ans == -1) { +// ans = dfs(mid + 1, r, i << 1 | 1); +// } +// } +// for (int k = 1; k <= unionCnt; k++) { +// undo(); +// part++; +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// v = MAXV; +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// for (int i = 1; i <= m; i++) { +// int x, y, w; +// cin >> x >> y >> w; +// if (w > 0) add(0, w - 1, x, y, 0, v, 1); +// add(w + 1, v, x, y, 0, v, 1); +// } +// part = n; +// cout << dfs(0, v, 1) << '\n'; +// return 0; +//} \ No newline at end of file diff --git a/src/class166/Code04_UniqueOccurrences2.java b/src/class166/Code04_UniqueOccurrences2.java new file mode 100644 index 000000000..77514bb68 --- /dev/null +++ b/src/class166/Code04_UniqueOccurrences2.java @@ -0,0 +1,135 @@ +package class166; + +// 独特事件,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1681F +// 测试链接 : https://codeforces.com/problemset/problem/1681/F +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 500001; +//const int MAXT = 10000001; +//int n, m; +// +//int father[MAXN]; +//int siz[MAXN]; +//int rollback[MAXN][2]; +//int opsize = 0; +// +//int headc[MAXN]; +//int nxtc[MAXN]; +//int xc[MAXN]; +//int yc[MAXN]; +//int cntc = 0; +// +//int heads[MAXN << 2]; +//int nxts[MAXT]; +//int xs[MAXT]; +//int ys[MAXT]; +//int cnts = 0; +// +//long long ans = 0; +// +//void addEdgeC(int i, int x, int y) { +// nxtc[++cntc] = headc[i]; +// xc[cntc] = x; +// yc[cntc] = y; +// headc[i] = cntc; +//} +// +//void addEdgeS(int i, int x, int y) { +// nxts[++cnts] = heads[i]; +// xs[cnts] = x; +// ys[cnts] = y; +// heads[i] = cnts; +//} +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//void Union(int x, int y) { +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) swap(fx, fy); +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; +//} +// +//void undo() { +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +//} +// +//void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdgeS(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobx, joby, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i) { +// int unionCnt = 0; +// for (int ei = heads[i], fx, fy; ei > 0; ei = nxts[ei]) { +// fx = find(xs[ei]); +// fy = find(ys[ei]); +// if (fx != fy) { +// Union(fx, fy); +// unionCnt++; +// } +// } +// if (l == r) { +// for (int ei = headc[l], fx, fy; ei > 0; ei = nxtc[ei]) { +// fx = find(xc[ei]); +// fy = find(yc[ei]); +// ans += 1LL * siz[fx] * siz[fy]; +// } +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// for (int k = 1; k <= unionCnt; k++) { +// undo(); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, x, y, c; i < n; i++) { +// cin >> x >> y >> c; +// addEdgeC(c, x, y); +// if (c > 1) { +// add(1, c - 1, x, y, 1, n, 1); +// } +// if (c < n) { +// add(c + 1, n, x, y, 1, n, 1); +// } +// } +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// dfs(1, n, 1); +// cout << ans << '\n'; +// return 0; +//} \ No newline at end of file From af69d96aead230f27a641d3c25e705fa216659de Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 21 Apr 2025 22:54:24 +0800 Subject: [PATCH 0012/1170] modify code --- src/class166/Code05_GreatIntegration1.java | 18 +-- src/class166/Code05_GreatIntegration2.java | 168 +++++++++++++++++++++ 2 files changed, 177 insertions(+), 9 deletions(-) create mode 100644 src/class166/Code05_GreatIntegration2.java diff --git a/src/class166/Code05_GreatIntegration1.java b/src/class166/Code05_GreatIntegration1.java index fecf87f25..e05954a51 100644 --- a/src/class166/Code05_GreatIntegration1.java +++ b/src/class166/Code05_GreatIntegration1.java @@ -20,7 +20,7 @@ public class Code05_GreatIntegration1 { public static int[] u = new int[MAXN]; public static int[] v = new int[MAXN]; - public static int[][] sorted = new int[MAXN][3]; + public static int[][] event = new int[MAXN][3]; public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; @@ -114,19 +114,19 @@ public static void prepare() { siz[i] = 1; } for (int i = 1; i <= q; i++) { - sorted[i][0] = u[i]; - sorted[i][1] = v[i]; - sorted[i][2] = i; + event[i][0] = u[i]; + event[i][1] = v[i]; + event[i][2] = i; } - Arrays.sort(sorted, 1, q + 1, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]); + Arrays.sort(event, 1, q + 1, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]); for (int l = 1, r = 1; l <= q; l = ++r) { - int x = sorted[l][0], y = sorted[l][1], t = sorted[l][2]; - while (r + 1 <= q && sorted[r + 1][0] == x && sorted[r + 1][1] == y) { + int x = event[l][0], y = event[l][1], t = event[l][2]; + while (r + 1 <= q && event[r + 1][0] == x && event[r + 1][1] == y) { r++; } for (int i = l + 1; i <= r; i++) { - add(t, sorted[i][2] - 1, x, y, 1, q, 1); - t = sorted[i][2] + 1; + add(t, event[i][2] - 1, x, y, 1, q, 1); + t = event[i][2] + 1; } if (t <= q) { add(t, q, x, y, 1, q, 1); diff --git a/src/class166/Code05_GreatIntegration2.java b/src/class166/Code05_GreatIntegration2.java new file mode 100644 index 000000000..6c8e79d41 --- /dev/null +++ b/src/class166/Code05_GreatIntegration2.java @@ -0,0 +1,168 @@ +package class166; + +// 大融合,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4219 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Event { +// int x, y, t; +//}; +// +//bool EventCmp(Event a, Event b) { +// if (a.x != b.x) { +// return a.x < b.x; +// } else if (a.y != b.y) { +// return a.y < b.y; +// } else { +// return a.t < b.t; +// } +//} +// +//const int MAXN = 100001; +//const int MAXT = 3000001; +//int n, q; +// +//int op[MAXN]; +//int u[MAXN]; +//int v[MAXN]; +// +//Event event[MAXN]; +// +//int father[MAXN]; +//int siz[MAXN]; +//int rollback[MAXN][2]; +//int opsize = 0; +// +//int head[MAXN << 2]; +//int nxt[MAXT]; +//int tox[MAXT]; +//int toy[MAXT]; +//int cnt = 0; +// +//long long ans[MAXN]; +// +//void addEdge(int i, int x, int y) { +// nxt[++cnt] = head[i]; +// tox[cnt] = x; +// toy[cnt] = y; +// head[i] = cnt; +//} +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//void Union(int x, int y) { +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; +//} +// +//void undo() { +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +//} +// +//void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobx, joby, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i) { +// int unionCnt = 0; +// for (int ei = head[i], fx, fy; ei > 0; ei = nxt[ei]) { +// fx = find(tox[ei]); +// fy = find(toy[ei]); +// if (fx != fy) { +// Union(fx, fy); +// unionCnt++; +// } +// } +// if (l == r) { +// if (op[l] == 2) { +// ans[l] = 1LL * siz[find(u[l])] * siz[find(v[l])]; +// } +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// for (int k = 1; k <= unionCnt; k++) { +// undo(); +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// for (int i = 1; i <= q; i++) { +// event[i].x = u[i]; +// event[i].y = v[i]; +// event[i].t = i; +// } +// sort(event + 1, event + q + 1, EventCmp); +// for (int l = 1, r = 1; l <= q; l = ++r) { +// int x = event[l].x, y = event[l].y, t = event[l].t; +// while (r + 1 <= q && event[r + 1].x == x && event[r + 1].y == y) { +// r++; +// } +// for (int j = l + 1; j <= r; j++) { +// add(t, event[j].t - 1, x, y, 1, q, 1); +// t = event[j].t + 1; +// } +// if (t <= q) { +// add(t, q, x, y, 1, q, 1); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// char t; +// int x, y; +// for (int i = 1; i <= q; i++) { +// cin >> t >> x >> y; +// op[i] = (t == 'A') ? 1 : 2; +// u[i] = min(x, y); +// v[i] = max(x, y); +// } +// prepare(); +// dfs(1, q, 1); +// for (int i = 1; i <= q; i++) { +// if (op[i] == 2) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From ec04b2220ab4c46a1cb9a047b4fb231859e524a1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 21 Apr 2025 23:39:59 +0800 Subject: [PATCH 0013/1170] modify code --- .../Code01_SegmentTreeDivideConquer2.java | 1 + src/class166/Code02_CheckBipartiteGraph2.java | 134 ++++++------- src/class166/Code03_MinimumMexTree2.java | 138 ++++++------- src/class166/Code04_UniqueOccurrences2.java | 136 ++++++------- src/class166/Code05_GreatIntegration2.java | 150 +++++++------- src/class166/Code06_ConnectedGraph1.java | 7 +- src/class166/Code06_ConnectedGraph2.java | 187 ++++++++++++++++++ src/class166/Code07_PaintingEdges2.java | 6 +- 8 files changed, 475 insertions(+), 284 deletions(-) create mode 100644 src/class166/Code06_ConnectedGraph2.java diff --git a/src/class166/Code01_SegmentTreeDivideConquer2.java b/src/class166/Code01_SegmentTreeDivideConquer2.java index 04cff0615..073bdc8b8 100644 --- a/src/class166/Code01_SegmentTreeDivideConquer2.java +++ b/src/class166/Code01_SegmentTreeDivideConquer2.java @@ -12,6 +12,7 @@ //const int MAXN = 5001; //const int MAXM = 500001; //const int MAXT = 5000001; +// //int n, m; // //int op[MAXM]; diff --git a/src/class166/Code02_CheckBipartiteGraph2.java b/src/class166/Code02_CheckBipartiteGraph2.java index 31d1359dd..6c774b585 100644 --- a/src/class166/Code02_CheckBipartiteGraph2.java +++ b/src/class166/Code02_CheckBipartiteGraph2.java @@ -27,83 +27,83 @@ //bool ans[MAXN]; // //void addEdge(int i, int x, int y) { -// nxt[++cnt] = head[i]; -// tox[cnt] = x; -// toy[cnt] = y; -// head[i] = cnt; +// nxt[++cnt] = head[i]; +// tox[cnt] = x; +// toy[cnt] = y; +// head[i] = cnt; //} // //int find(int i) { -// while (i != father[i]) { +// while (i != father[i]) { // i = father[i]; // } -// return i; +// return i; //} // //void Union(int x, int y) { -// int fx = find(x); -// int fy = find(y); -// if (siz[fx] < siz[fy]) { -// int tmp = fx; -// fx = fy; -// fy = tmp; -// } -// father[fy] = fx; -// siz[fx] += siz[fy]; -// rollback[++opsize][0] = fx; -// rollback[opsize][1] = fy; +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; //} // //void undo() { -// int fx = rollback[opsize][0]; -// int fy = rollback[opsize--][1]; -// father[fy] = fy; -// siz[fx] -= siz[fy]; +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; //} // //void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { -// if (jobl <= l && r <= jobr) { -// addEdge(i, jobx, joby); -// } else { -// int mid = (l + r) >> 1; -// if (jobl <= mid) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { // add(jobl, jobr, jobx, joby, l, mid, i << 1); // } -// if (jobr > mid) { +// if (jobr > mid) { // add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); // } -// } +// } //} // //void dfs(int l, int r, int i) { -// bool check = true; -// int unionCnt = 0; -// for (int ei = head[i]; ei > 0; ei = nxt[ei]) { -// int x = tox[ei], y = toy[ei], fx = find(x), fy = find(y); -// if (fx == fy) { -// check = false; -// break; -// } else { -// Union(x, y + n); -// Union(y, x + n); -// unionCnt += 2; -// } -// } -// if (check) { -// if (l == r) { -// ans[l] = true; -// } else { -// int mid = (l + r) >> 1; -// dfs(l, mid, i << 1); -// dfs(mid + 1, r, i << 1 | 1); -// } -// } else { -// for (int k = l; k <= r; k++) { +// bool check = true; +// int unionCnt = 0; +// for (int ei = head[i]; ei > 0; ei = nxt[ei]) { +// int x = tox[ei], y = toy[ei], fx = find(x), fy = find(y); +// if (fx == fy) { +// check = false; +// break; +// } else { +// Union(x, y + n); +// Union(y, x + n); +// unionCnt += 2; +// } +// } +// if (check) { +// if (l == r) { +// ans[l] = true; +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// } else { +// for (int k = l; k <= r; k++) { // ans[k] = false; // } -// } -// for (int k = 1; k <= unionCnt; k++) { -// undo(); +// } +// for (int k = 1; k <= unionCnt; k++) { +// undo(); // } //} // @@ -111,21 +111,21 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m >> k; -// for (int i = 1; i <= n * 2; i++) { -// father[i] = i; -// siz[i] = 1; -// } -// for (int i = 1, x, y, l, r; i <= m; i++) { +// for (int i = 1; i <= n * 2; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// for (int i = 1, x, y, l, r; i <= m; i++) { // cin >> x >> y >> l >> r; -// add(l + 1, r, x, y, 1, k, 1); -// } -// dfs(1, k, 1); -// for (int i = 1; i <= k; i++) { -// if (ans[i]) { +// add(l + 1, r, x, y, 1, k, 1); +// } +// dfs(1, k, 1); +// for (int i = 1; i <= k; i++) { +// if (ans[i]) { // cout << "Yes" << "\n"; // } else { -// cout << "No" << "\n"; +// cout << "No" << "\n"; // } -// } -// return 0; +// } +// return 0; //} \ No newline at end of file diff --git a/src/class166/Code03_MinimumMexTree2.java b/src/class166/Code03_MinimumMexTree2.java index 7c771c5a8..bfc96fb96 100644 --- a/src/class166/Code03_MinimumMexTree2.java +++ b/src/class166/Code03_MinimumMexTree2.java @@ -29,100 +29,102 @@ //int part; // //void addEdge(int i, int x, int y) { -// nxt[++cnt] = head[i]; -// tox[cnt] = x; -// toy[cnt] = y; -// head[i] = cnt; +// nxt[++cnt] = head[i]; +// tox[cnt] = x; +// toy[cnt] = y; +// head[i] = cnt; //} // //int find(int i) { -// while (i != father[i]) { +// while (i != father[i]) { // i = father[i]; // } -// return i; +// return i; //} // //void Union(int x, int y) { -// int fx = find(x); -// int fy = find(y); -// if (siz[fx] < siz[fy]) { -// int tmp = fx; -// fx = fy; -// fy = tmp; -// } -// father[fy] = fx; -// siz[fx] += siz[fy]; -// rollback[++opsize][0] = fx; -// rollback[opsize][1] = fy; +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; //} // //void undo() { -// int fx = rollback[opsize][0]; -// int fy = rollback[opsize--][1]; -// father[fy] = fy; -// siz[fx] -= siz[fy]; +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; //} // //void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { -// if (jobl <= l && r <= jobr) { -// addEdge(i, jobx, joby); -// } else { -// int mid = (l + r) >> 1; -// if (jobl <= mid) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { // add(jobl, jobr, jobx, joby, l, mid, i << 1); // } -// if (jobr > mid) { +// if (jobr > mid) { // add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); // } -// } +// } //} // //int dfs(int l, int r, int i) { -// int unionCnt = 0; -// for (int ei = head[i]; ei > 0; ei = nxt[ei]) { -// int fx = find(tox[ei]); -// int fy = find(toy[ei]); -// if (fx != fy) { -// Union(fx, fy); -// part--; -// unionCnt++; -// } -// } -// int ans = -1; -// if (l == r) { -// if (part == 1) { +// int unionCnt = 0; +// for (int ei = head[i]; ei > 0; ei = nxt[ei]) { +// int fx = find(tox[ei]); +// int fy = find(toy[ei]); +// if (fx != fy) { +// Union(fx, fy); +// part--; +// unionCnt++; +// } +// } +// int ans = -1; +// if (l == r) { +// if (part == 1) { // ans = l; // } -// } else { -// int mid = (l + r) >> 1; -// ans = dfs(l, mid, i << 1); -// if (ans == -1) { +// } else { +// int mid = (l + r) >> 1; +// ans = dfs(l, mid, i << 1); +// if (ans == -1) { // ans = dfs(mid + 1, r, i << 1 | 1); // } -// } -// for (int k = 1; k <= unionCnt; k++) { -// undo(); -// part++; -// } -// return ans; +// } +// for (int k = 1; k <= unionCnt; k++) { +// undo(); +// part++; +// } +// return ans; //} // //int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n >> m; -// v = MAXV; -// for (int i = 1; i <= n; i++) { -// father[i] = i; -// siz[i] = 1; -// } -// for (int i = 1; i <= m; i++) { -// int x, y, w; -// cin >> x >> y >> w; -// if (w > 0) add(0, w - 1, x, y, 0, v, 1); -// add(w + 1, v, x, y, 0, v, 1); -// } -// part = n; -// cout << dfs(0, v, 1) << '\n'; -// return 0; +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// v = MAXV; +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// for (int i = 1; i <= m; i++) { +// int x, y, w; +// cin >> x >> y >> w; +// if (w > 0) { +// add(0, w - 1, x, y, 0, v, 1); +// } +// add(w + 1, v, x, y, 0, v, 1); +// } +// part = n; +// cout << dfs(0, v, 1) << '\n'; +// return 0; //} \ No newline at end of file diff --git a/src/class166/Code04_UniqueOccurrences2.java b/src/class166/Code04_UniqueOccurrences2.java index 77514bb68..aba2f9a0f 100644 --- a/src/class166/Code04_UniqueOccurrences2.java +++ b/src/class166/Code04_UniqueOccurrences2.java @@ -34,102 +34,106 @@ //long long ans = 0; // //void addEdgeC(int i, int x, int y) { -// nxtc[++cntc] = headc[i]; -// xc[cntc] = x; -// yc[cntc] = y; -// headc[i] = cntc; +// nxtc[++cntc] = headc[i]; +// xc[cntc] = x; +// yc[cntc] = y; +// headc[i] = cntc; //} // //void addEdgeS(int i, int x, int y) { -// nxts[++cnts] = heads[i]; -// xs[cnts] = x; -// ys[cnts] = y; -// heads[i] = cnts; +// nxts[++cnts] = heads[i]; +// xs[cnts] = x; +// ys[cnts] = y; +// heads[i] = cnts; //} // //int find(int i) { -// while (i != father[i]) { +// while (i != father[i]) { // i = father[i]; // } -// return i; +// return i; //} // //void Union(int x, int y) { -// int fx = find(x); -// int fy = find(y); -// if (siz[fx] < siz[fy]) swap(fx, fy); -// father[fy] = fx; -// siz[fx] += siz[fy]; -// rollback[++opsize][0] = fx; -// rollback[opsize][1] = fy; +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fx = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; //} // //void undo() { -// int fx = rollback[opsize][0]; -// int fy = rollback[opsize--][1]; -// father[fy] = fy; -// siz[fx] -= siz[fy]; +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; //} // //void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { -// if (jobl <= l && r <= jobr) { -// addEdgeS(i, jobx, joby); -// } else { -// int mid = (l + r) >> 1; -// if (jobl <= mid) { +// if (jobl <= l && r <= jobr) { +// addEdgeS(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { // add(jobl, jobr, jobx, joby, l, mid, i << 1); // } -// if (jobr > mid) { +// if (jobr > mid) { // add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); // } -// } +// } //} // //void dfs(int l, int r, int i) { -// int unionCnt = 0; -// for (int ei = heads[i], fx, fy; ei > 0; ei = nxts[ei]) { -// fx = find(xs[ei]); -// fy = find(ys[ei]); -// if (fx != fy) { -// Union(fx, fy); -// unionCnt++; -// } -// } -// if (l == r) { -// for (int ei = headc[l], fx, fy; ei > 0; ei = nxtc[ei]) { -// fx = find(xc[ei]); -// fy = find(yc[ei]); -// ans += 1LL * siz[fx] * siz[fy]; -// } -// } else { -// int mid = (l + r) >> 1; -// dfs(l, mid, i << 1); -// dfs(mid + 1, r, i << 1 | 1); -// } -// for (int k = 1; k <= unionCnt; k++) { -// undo(); +// int unionCnt = 0; +// for (int ei = heads[i], fx, fy; ei > 0; ei = nxts[ei]) { +// fx = find(xs[ei]); +// fy = find(ys[ei]); +// if (fx != fy) { +// Union(fx, fy); +// unionCnt++; +// } +// } +// if (l == r) { +// for (int ei = headc[l], fx, fy; ei > 0; ei = nxtc[ei]) { +// fx = find(xc[ei]); +// fy = find(yc[ei]); +// ans += 1LL * siz[fx] * siz[fy]; +// } +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// for (int k = 1; k <= unionCnt; k++) { +// undo(); // } //} // //int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n; -// for (int i = 1, x, y, c; i < n; i++) { -// cin >> x >> y >> c; -// addEdgeC(c, x, y); -// if (c > 1) { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, x, y, c; i < n; i++) { +// cin >> x >> y >> c; +// addEdgeC(c, x, y); +// if (c > 1) { // add(1, c - 1, x, y, 1, n, 1); // } -// if (c < n) { +// if (c < n) { // add(c + 1, n, x, y, 1, n, 1); // } -// } -// for (int i = 1; i <= n; i++) { -// father[i] = i; -// siz[i] = 1; -// } -// dfs(1, n, 1); -// cout << ans << '\n'; -// return 0; +// } +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// dfs(1, n, 1); +// cout << ans << '\n'; +// return 0; //} \ No newline at end of file diff --git a/src/class166/Code05_GreatIntegration2.java b/src/class166/Code05_GreatIntegration2.java index 6c8e79d41..3c9c60ea0 100644 --- a/src/class166/Code05_GreatIntegration2.java +++ b/src/class166/Code05_GreatIntegration2.java @@ -47,122 +47,122 @@ //long long ans[MAXN]; // //void addEdge(int i, int x, int y) { -// nxt[++cnt] = head[i]; -// tox[cnt] = x; -// toy[cnt] = y; -// head[i] = cnt; +// nxt[++cnt] = head[i]; +// tox[cnt] = x; +// toy[cnt] = y; +// head[i] = cnt; //} // //int find(int i) { -// while (i != father[i]) { +// while (i != father[i]) { // i = father[i]; // } -// return i; +// return i; //} // //void Union(int x, int y) { -// int fx = find(x); -// int fy = find(y); -// if (siz[fx] < siz[fy]) { +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { // int tmp = fx; // fx = fy; // fy = tmp; // } -// father[fy] = fx; -// siz[fx] += siz[fy]; -// rollback[++opsize][0] = fx; -// rollback[opsize][1] = fy; +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; //} // //void undo() { -// int fx = rollback[opsize][0]; -// int fy = rollback[opsize--][1]; -// father[fy] = fy; -// siz[fx] -= siz[fy]; +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; //} // //void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { -// if (jobl <= l && r <= jobr) { -// addEdge(i, jobx, joby); -// } else { -// int mid = (l + r) >> 1; -// if (jobl <= mid) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { // add(jobl, jobr, jobx, joby, l, mid, i << 1); // } -// if (jobr > mid) { +// if (jobr > mid) { // add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); // } -// } +// } //} // //void dfs(int l, int r, int i) { -// int unionCnt = 0; -// for (int ei = head[i], fx, fy; ei > 0; ei = nxt[ei]) { -// fx = find(tox[ei]); -// fy = find(toy[ei]); -// if (fx != fy) { -// Union(fx, fy); -// unionCnt++; -// } -// } -// if (l == r) { -// if (op[l] == 2) { -// ans[l] = 1LL * siz[find(u[l])] * siz[find(v[l])]; -// } -// } else { -// int mid = (l + r) >> 1; -// dfs(l, mid, i << 1); -// dfs(mid + 1, r, i << 1 | 1); -// } -// for (int k = 1; k <= unionCnt; k++) { -// undo(); +// int unionCnt = 0; +// for (int ei = head[i], fx, fy; ei > 0; ei = nxt[ei]) { +// fx = find(tox[ei]); +// fy = find(toy[ei]); +// if (fx != fy) { +// Union(fx, fy); +// unionCnt++; +// } +// } +// if (l == r) { +// if (op[l] == 2) { +// ans[l] = 1LL * siz[find(u[l])] * siz[find(v[l])]; +// } +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// for (int k = 1; k <= unionCnt; k++) { +// undo(); // } //} // //void prepare() { -// for (int i = 1; i <= n; i++) { -// father[i] = i; -// siz[i] = 1; -// } -// for (int i = 1; i <= q; i++) { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// for (int i = 1; i <= q; i++) { // event[i].x = u[i]; // event[i].y = v[i]; // event[i].t = i; -// } -// sort(event + 1, event + q + 1, EventCmp); -// for (int l = 1, r = 1; l <= q; l = ++r) { -// int x = event[l].x, y = event[l].y, t = event[l].t; -// while (r + 1 <= q && event[r + 1].x == x && event[r + 1].y == y) { +// } +// sort(event + 1, event + q + 1, EventCmp); +// for (int l = 1, r = 1; l <= q; l = ++r) { +// int x = event[l].x, y = event[l].y, t = event[l].t; +// while (r + 1 <= q && event[r + 1].x == x && event[r + 1].y == y) { // r++; // } -// for (int j = l + 1; j <= r; j++) { -// add(t, event[j].t - 1, x, y, 1, q, 1); -// t = event[j].t + 1; -// } -// if (t <= q) { +// for (int j = l + 1; j <= r; j++) { +// add(t, event[j].t - 1, x, y, 1, q, 1); +// t = event[j].t + 1; +// } +// if (t <= q) { // add(t, q, x, y, 1, q, 1); // } -// } +// } //} // //int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n >> q; +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; // char t; // int x, y; -// for (int i = 1; i <= q; i++) { -// cin >> t >> x >> y; -// op[i] = (t == 'A') ? 1 : 2; -// u[i] = min(x, y); -// v[i] = max(x, y); -// } -// prepare(); -// dfs(1, q, 1); -// for (int i = 1; i <= q; i++) { -// if (op[i] == 2) { +// for (int i = 1; i <= q; i++) { +// cin >> t >> x >> y; +// op[i] = (t == 'A') ? 1 : 2; +// u[i] = min(x, y); +// v[i] = max(x, y); +// } +// prepare(); +// dfs(1, q, 1); +// for (int i = 1; i <= q; i++) { +// if (op[i] == 2) { // cout << ans[i] << '\n'; // } -// } -// return 0; +// } +// return 0; //} \ No newline at end of file diff --git a/src/class166/Code06_ConnectedGraph1.java b/src/class166/Code06_ConnectedGraph1.java index 53f39e061..0a2166462 100644 --- a/src/class166/Code06_ConnectedGraph1.java +++ b/src/class166/Code06_ConnectedGraph1.java @@ -89,11 +89,8 @@ public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int public static void dfs(int l, int r, int i) { boolean check = false; int unionCnt = 0; - for (int ei = head[i], x, y, fx, fy; ei > 0; ei = next[ei]) { - x = tox[ei]; - y = toy[ei]; - fx = find(x); - fy = find(y); + for (int ei = head[i]; ei > 0; ei = next[ei]) { + int x = tox[ei], y = toy[ei], fx = find(x), fy = find(y); if (fx != fy) { union(fx, fy); unionCnt++; diff --git a/src/class166/Code06_ConnectedGraph2.java b/src/class166/Code06_ConnectedGraph2.java new file mode 100644 index 000000000..eeb421d37 --- /dev/null +++ b/src/class166/Code06_ConnectedGraph2.java @@ -0,0 +1,187 @@ +package class166; + +// 连通图,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5227 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Event { +// int ei, t; +//}; +// +//bool EventCmp(Event a, Event b) { +// if (a.ei != b.ei) { +// return a.ei < b.ei; +// } else { +// return a.t < b.t; +// } +//} +// +//const int MAXN = 100001; +//const int MAXM = 200001; +//const int MAXE = 400001; +//const int MAXT = 10000001; +// +//int n, m, k; +// +//int u[MAXM]; +//int v[MAXM]; +// +//Event event[MAXE]; +//int ecnt = 0; +//bool vis[MAXM]; +// +//int father[MAXN]; +//int siz[MAXN]; +//int rollback[MAXN][2]; +//int opsize = 0; +// +//int head[MAXN << 2]; +//int nxt[MAXT]; +//int tox[MAXT]; +//int toy[MAXT]; +//int cnt = 0; +// +//bool ans[MAXN]; +// +//void addEdge(int i, int x, int y) { +// nxt[++cnt] = head[i]; +// tox[cnt] = x; +// toy[cnt] = y; +// head[i] = cnt; +//} +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//void Union(int x, int y) { +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; +//} +// +//void undo() { +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +//} +// +//void add(int jobl, int jobr, int jobx, int joby, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobx, joby, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobx, joby, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i) { +// bool check = false; +// int unionCnt = 0; +// for (int ei = head[i]; ei > 0; ei = nxt[ei]) { +// int x = tox[ei], y = toy[ei], fx = find(x), fy = find(y); +// if (fx != fy) { +// Union(fx, fy); +// unionCnt++; +// } +// if (siz[find(fx)] == n) { +// check = true; +// break; +// } +// } +// if (check) { +// for (int j = l; j <= r; j++) { +// ans[j] = true; +// } +// } else { +// if (l == r) { +// ans[l] = false; +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// } +// for (int j = 1; j <= unionCnt; j++) { +// undo(); +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// sort(event + 1, event + ecnt + 1, EventCmp); +// for (int l = 1, r = 1, eid; l <= ecnt; l = ++r) { +// eid = event[l].ei; +// vis[eid] = true; +// while (r + 1 <= ecnt && event[r + 1].ei == eid) { +// r++; +// } +// int t = 1; +// for (int i = l; i <= r; i++) { +// if (t <= event[i].t - 1) { +// add(t, event[i].t - 1, u[eid], v[eid], 1, k, 1); +// } +// t = event[i].t + 1; +// } +// if (t <= k) { +// add(t, k, u[eid], v[eid], 1, k, 1); +// } +// } +// for (int i = 1; i <= m; i++) { +// if (!vis[i]) { +// add(1, k, u[i], v[i], 1, k, 1); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= m; i++) { +// cin >> u[i] >> v[i]; +// } +// cin >> k; +// for (int i = 1, s; i <= k; i++) { +// cin >> s; +// for (int j = 1; j <= s; j++) { +// cin >> event[++ecnt].ei; +// event[ecnt].t = i; +// } +// } +// prepare(); +// dfs(1, k, 1); +// for (int i = 1; i <= k; i++) { +// if (ans[i]) { +// cout << "Connected" << "\n"; +// } else { +// cout << "Disconnected" << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class166/Code07_PaintingEdges2.java b/src/class166/Code07_PaintingEdges2.java index 9483bebf5..f2fb575e0 100644 --- a/src/class166/Code07_PaintingEdges2.java +++ b/src/class166/Code07_PaintingEdges2.java @@ -91,11 +91,11 @@ // int x = u[e[qid[ei]]], xn = x + n, fx = find(color, x), fxn = find(color, xn); // int y = v[e[qid[ei]]], yn = y + n, fy = find(color, y), fyn = find(color, yn); // if (fx != fyn) { -// Union(color, fx, fyn); +// Union(color, fx, fyn); // unionCnt++; // } // if (fy != fxn) { -// Union(color, fy, fxn); +// Union(color, fy, fxn); // unionCnt++; // } // } @@ -113,7 +113,7 @@ // dfs(mid + 1, r, i << 1 | 1); // } // for (int j = 1; j <= unionCnt; j++) { -// undo(); +// undo(); // } //} // From d57f4732560589e12c3b4f79d3eeaf117e5e1553 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 22 Apr 2025 16:37:06 +0800 Subject: [PATCH 0014/1170] modify code --- src/class166/Code07_PaintingEdges1.java | 16 ++++++++-------- src/class166/Code07_PaintingEdges2.java | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java index f4ea844dd..1d4830ee3 100644 --- a/src/class166/Code07_PaintingEdges1.java +++ b/src/class166/Code07_PaintingEdges1.java @@ -21,7 +21,7 @@ public class Code07_PaintingEdges1 { public static int[] e = new int[MAXN]; public static int[] c = new int[MAXN]; - public static int[] pos = new int[MAXN]; + public static int[] help = new int[MAXN]; public static int[][] father = new int[MAXK][MAXN << 1]; public static int[][] siz = new int[MAXK][MAXN << 1]; @@ -103,10 +103,10 @@ public static void dfs(int l, int r, int i) { if (l == r) { if (find(c[l], u[e[l]]) == find(c[l], v[e[l]])) { ans[l] = false; - c[l] = pos[e[l]]; + c[l] = help[e[l]]; } else { ans[l] = true; - pos[e[l]] = c[l]; + help[e[l]] = c[l]; } } else { int mid = (l + r) >> 1; @@ -128,16 +128,16 @@ public static void prepare() { } } for (int i = 1; i <= m; i++) { - pos[i] = q + 1; + help[i] = q + 1; } for (int i = q; i >= 1; i--) { - if (i + 1 <= pos[e[i]] - 1) { - add(i + 1, pos[e[i]] - 1, i, 1, q, 1); + if (i + 1 <= help[e[i]] - 1) { + add(i + 1, help[e[i]] - 1, i, 1, q, 1); } - pos[e[i]] = i; + help[e[i]] = i; } for (int i = 1; i <= m; i++) { - pos[i] = 0; + help[i] = 0; } } diff --git a/src/class166/Code07_PaintingEdges2.java b/src/class166/Code07_PaintingEdges2.java index f2fb575e0..6ee448f2a 100644 --- a/src/class166/Code07_PaintingEdges2.java +++ b/src/class166/Code07_PaintingEdges2.java @@ -20,7 +20,7 @@ //int e[MAXN]; //int c[MAXN]; // -//int pos[MAXN]; +//int help[MAXN]; // //int father[MAXK][MAXN << 1]; //int siz[MAXK][MAXN << 1]; @@ -102,10 +102,10 @@ // if (l == r) { // if (find(c[l], u[e[l]]) == find(c[l], v[e[l]])) { // ans[l] = false; -// c[l] = pos[e[l]]; +// c[l] = help[e[l]]; // } else { // ans[l] = true; -// pos[e[l]] = c[l]; +// help[e[l]] = c[l]; // } // } else { // int mid = (l + r) >> 1; @@ -127,16 +127,16 @@ // } // } // for (int i = 1; i <= m; i++) { -// pos[i] = q + 1; +// help[i] = q + 1; // } // for (int i = q; i >= 1; i--) { -// if (i + 1 <= pos[e[i]] - 1) { -// add(i + 1, pos[e[i]] - 1, i, 1, q, 1); +// if (i + 1 <= help[e[i]] - 1) { +// add(i + 1, help[e[i]] - 1, i, 1, q, 1); // } -// pos[e[i]] = i; +// help[e[i]] = i; // } // for (int i = 1; i <= m; i++) { -// pos[i] = 0; +// help[i] = 0; // } //} // From bed9acc9f8e1796f73e0987cad9d6a659d8b91ca Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 22 Apr 2025 18:01:40 +0800 Subject: [PATCH 0015/1170] modify code --- src/class166/Code01_SegmentTreeDivideConquer1.java | 7 +++++++ src/class166/Code01_SegmentTreeDivideConquer2.java | 7 +++++++ src/class166/Code02_CheckBipartiteGraph1.java | 8 +++++++- src/class166/Code02_CheckBipartiteGraph2.java | 8 +++++++- src/class166/Code03_MinimumMexTree1.java | 6 ++++++ src/class166/Code03_MinimumMexTree2.java | 6 ++++++ src/class166/Code04_UniqueOccurrences1.java | 4 ++++ src/class166/Code04_UniqueOccurrences2.java | 4 ++++ src/class166/Code05_GreatIntegration1.java | 5 +++++ src/class166/Code05_GreatIntegration2.java | 5 +++++ src/class166/Code06_ConnectedGraph1.java | 14 +++++++++++--- src/class166/Code06_ConnectedGraph2.java | 14 +++++++++++--- src/class166/Code07_PaintingEdges1.java | 10 +++++++++- src/class166/Code07_PaintingEdges2.java | 10 +++++++++- 14 files changed, 98 insertions(+), 10 deletions(-) diff --git a/src/class166/Code01_SegmentTreeDivideConquer1.java b/src/class166/Code01_SegmentTreeDivideConquer1.java index e8deaac52..dc0ee630c 100644 --- a/src/class166/Code01_SegmentTreeDivideConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideConquer1.java @@ -1,6 +1,13 @@ package class166; // 线段树分治模版题,java版 +// 一共有n个节点,一共有m条操作,每条操作是如下三种类型中的一种 +// 操作 0 x y : 点x和点y之间一定没有边,现在增加一条边 +// 操作 1 x y : 点x和点y之间一定存在边,现在删除这条边 +// 操作 2 x y : 查询点x和点y是否联通 +// 1 <= n <= 5000 +// 1 <= m <= 500000 +// 不强制在线,可以离线处理 // 测试链接 : https://loj.ac/p/121 // 提交以下的code,提交时类名改成"Main",多提交几次,可以通过所有测试用例 diff --git a/src/class166/Code01_SegmentTreeDivideConquer2.java b/src/class166/Code01_SegmentTreeDivideConquer2.java index 073bdc8b8..914398566 100644 --- a/src/class166/Code01_SegmentTreeDivideConquer2.java +++ b/src/class166/Code01_SegmentTreeDivideConquer2.java @@ -1,6 +1,13 @@ package class166; // 线段树分治模版题,C++版 +// 一共有n个节点,一共有m条操作,每条操作是如下三种类型中的一种 +// 操作 0 x y : 点x和点y之间一定没有边,现在增加一条边 +// 操作 1 x y : 点x和点y之间一定存在边,现在删除这条边 +// 操作 2 x y : 查询点x和点y是否联通 +// 1 <= n <= 5000 +// 1 <= m <= 500000 +// 不强制在线,可以离线处理 // 测试链接 : https://loj.ac/p/121 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class166/Code02_CheckBipartiteGraph1.java b/src/class166/Code02_CheckBipartiteGraph1.java index 82d3c29e4..e16af6191 100644 --- a/src/class166/Code02_CheckBipartiteGraph1.java +++ b/src/class166/Code02_CheckBipartiteGraph1.java @@ -1,6 +1,12 @@ package class166; -// 检查二分图,java版 +// 判断二分图,java版 +// 一共有n个节点,时刻的范围0~k,一共有m条操作,每条操作含义如下 +// 操作 x y l r : 点x到点y之间连一条边,该边在l时刻出现,在r时刻消失 +// 分别打印1时刻以内、2时刻以内..k时刻以内,图是不是二分图 +// 注意i时刻以内是0~i-1时间段的意思 +// 1 <= n、k <= 10^5 1 <= m <= 2 * 10^5 +// 1 <= x、y <= n 0 <= l、r <= k // 测试链接 : https://www.luogu.com.cn/problem/P5787 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class166/Code02_CheckBipartiteGraph2.java b/src/class166/Code02_CheckBipartiteGraph2.java index 6c774b585..daa1460a7 100644 --- a/src/class166/Code02_CheckBipartiteGraph2.java +++ b/src/class166/Code02_CheckBipartiteGraph2.java @@ -1,6 +1,12 @@ package class166; -// 检查二分图,C++版 +// 判断二分图,C++版 +// 一共有n个节点,时刻的范围0~k,一共有m条操作,每条操作含义如下 +// 操作 x y l r : 点x到点y之间连一条边,该边在l时刻出现,在r时刻消失 +// 分别打印1时刻以内、2时刻以内..k时刻以内,图是不是二分图 +// 注意i时刻以内是0~i-1时间段的意思 +// 1 <= n、k <= 10^5 1 <= m <= 2 * 10^5 +// 1 <= x、y <= n 0 <= l、r <= k // 测试链接 : https://www.luogu.com.cn/problem/P5787 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class166/Code03_MinimumMexTree1.java b/src/class166/Code03_MinimumMexTree1.java index a3bc7baff..b64f603fe 100644 --- a/src/class166/Code03_MinimumMexTree1.java +++ b/src/class166/Code03_MinimumMexTree1.java @@ -1,6 +1,12 @@ package class166; // 最小mex生成树,java版 +// 给定n个点,m条边的无向连通图,边有边权 +// 自然数集合S的mex含义为:最小的、没有出现在S中的自然数 +// 现在你要求出一个这个图的生成树,使得其边权集合的mex尽可能小 +// 1 <= n <= 10^6 +// 1 <= m <= 2 * 10^6 +// 0 <= 边权 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5631 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class166/Code03_MinimumMexTree2.java b/src/class166/Code03_MinimumMexTree2.java index bfc96fb96..06a522729 100644 --- a/src/class166/Code03_MinimumMexTree2.java +++ b/src/class166/Code03_MinimumMexTree2.java @@ -1,6 +1,12 @@ package class166; // 最小mex生成树,C++版 +// 给定n个点,m条边的无向连通图,边有边权 +// 自然数集合S的mex含义为:最小的、没有出现在S中的自然数 +// 现在你要求出一个这个图的生成树,使得其边权集合的mex尽可能小 +// 1 <= n <= 10^6 +// 1 <= m <= 2 * 10^6 +// 0 <= 边权 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5631 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class166/Code04_UniqueOccurrences1.java b/src/class166/Code04_UniqueOccurrences1.java index 076611cd3..d33ac34a7 100644 --- a/src/class166/Code04_UniqueOccurrences1.java +++ b/src/class166/Code04_UniqueOccurrences1.java @@ -1,6 +1,10 @@ package class166; // 独特事件,java版 +// 一共有n个节点,n-1条无向边,边给定颜色值,所有节点连成一棵树 +// 定义f(u, v) : 点u到点v的简单路径上恰好出现一次的颜色的数量 +// 打印 ∑(u = 1..n) ∑(v = u + 1..n) f(u, v) 的结果 +// 1 <= 颜色值 <= n <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1681F // 测试链接 : https://codeforces.com/problemset/problem/1681/F // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class166/Code04_UniqueOccurrences2.java b/src/class166/Code04_UniqueOccurrences2.java index aba2f9a0f..604107900 100644 --- a/src/class166/Code04_UniqueOccurrences2.java +++ b/src/class166/Code04_UniqueOccurrences2.java @@ -1,6 +1,10 @@ package class166; // 独特事件,C++版 +// 一共有n个节点,n-1条无向边,边给定颜色值,所有节点连成一棵树 +// 定义f(u, v) : 点u到点v的简单路径上恰好出现一次的颜色的数量 +// 打印 ∑(u = 1..n) ∑(v = u + 1..n) f(u, v) 的结果 +// 1 <= 颜色值 <= n <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1681F // 测试链接 : https://codeforces.com/problemset/problem/1681/F // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class166/Code05_GreatIntegration1.java b/src/class166/Code05_GreatIntegration1.java index e05954a51..c9cf44d51 100644 --- a/src/class166/Code05_GreatIntegration1.java +++ b/src/class166/Code05_GreatIntegration1.java @@ -1,6 +1,11 @@ package class166; // 大融合,java版 +// 一共有n个点,一共有q条操作,每条操作是如下两种类型中的一种 +// 操作 A x y : 点x和点y之间连一条边,保证之前x和y是不联通的 +// 操作 Q x y : 打印点x和点y之间这条边的负载,保证x和y之间有一条边 +// 边负载定义为,假设去掉这条边之后,端点1联通区大小 * 端点2联通区大小 +// 1 <= n、q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4219 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class166/Code05_GreatIntegration2.java b/src/class166/Code05_GreatIntegration2.java index 3c9c60ea0..283ae2223 100644 --- a/src/class166/Code05_GreatIntegration2.java +++ b/src/class166/Code05_GreatIntegration2.java @@ -1,6 +1,11 @@ package class166; // 大融合,C++版 +// 一共有n个点,一共有q条操作,每条操作是如下两种类型中的一种 +// 操作 A x y : 点x和点y之间连一条边,保证之前x和y是不联通的 +// 操作 Q x y : 打印点x和点y之间这条边的负载,保证x和y之间有一条边 +// 边负载定义为,假设去掉这条边之后,端点1联通区大小 * 端点2联通区大小 +// 1 <= n、q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4219 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class166/Code06_ConnectedGraph1.java b/src/class166/Code06_ConnectedGraph1.java index 0a2166462..fe0282500 100644 --- a/src/class166/Code06_ConnectedGraph1.java +++ b/src/class166/Code06_ConnectedGraph1.java @@ -1,6 +1,14 @@ package class166; // 连通图,java版 +// 一共有n个点,给定m条边,所有点一定组成一个连通图 +// 一共有k条操作,每条操作格式如下 +// 操作 c ... : 操作涉及c条边,这些边的编号 ... 一共c个 +// 假设删掉这些边,打印整张图是否联通 +// 每条操作都是独立的,相互之间没有任何关系 +// 1 <= n、k <= 10^5 +// 1 <= m <= 2 * 10^5 +// 1 <= c <= 4 // 测试链接 : https://www.luogu.com.cn/problem/P5227 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -158,9 +166,9 @@ public static void main(String[] args) { v[i] = io.nextInt(); } k = io.nextInt(); - for (int i = 1, s; i <= k; i++) { - s = io.nextInt(); - for (int j = 1; j <= s; j++) { + for (int i = 1, c; i <= k; i++) { + c = io.nextInt(); + for (int j = 1; j <= c; j++) { event[++ecnt][0] = io.nextInt(); event[ecnt][1] = i; } diff --git a/src/class166/Code06_ConnectedGraph2.java b/src/class166/Code06_ConnectedGraph2.java index eeb421d37..2c5273cb9 100644 --- a/src/class166/Code06_ConnectedGraph2.java +++ b/src/class166/Code06_ConnectedGraph2.java @@ -1,6 +1,14 @@ package class166; // 连通图,C++版 +// 一共有n个点,给定m条边,所有点一定组成一个连通图 +// 一共有k条操作,每条操作格式如下 +// 操作 c ... : 操作涉及c条边,这些边的编号 ... 一共c个 +// 假设删掉这些边,打印整张图是否联通 +// 每条操作都是独立的,相互之间没有任何关系 +// 1 <= n、k <= 10^5 +// 1 <= m <= 2 * 10^5 +// 1 <= c <= 4 // 测试链接 : https://www.luogu.com.cn/problem/P5227 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -167,9 +175,9 @@ // cin >> u[i] >> v[i]; // } // cin >> k; -// for (int i = 1, s; i <= k; i++) { -// cin >> s; -// for (int j = 1; j <= s; j++) { +// for (int i = 1, c; i <= k; i++) { +// cin >> c; +// for (int j = 1; j <= c; j++) { // cin >> event[++ecnt].ei; // event[ecnt].t = i; // } diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java index 1d4830ee3..c281d23b6 100644 --- a/src/class166/Code07_PaintingEdges1.java +++ b/src/class166/Code07_PaintingEdges1.java @@ -1,6 +1,14 @@ package class166; -// 边的涂色,java版 +// 给边涂色,java版 +// 一共有n个点,给定m条无向边,一开始每条边无颜色,一共有k种颜色 +// 合法状态的定义为,仅保留染成k种颜色中的任何一种颜色的边,图都是一张二分图 +// 一共有q条操作,每条操作格式如下 +// 操作 e c : 第e条边,现在要涂成c颜色 +// 如果执行此操作之后,整张图还是合法状态,那么执行并打印"YES" +// 如果执行此操作之后,整张图不再是合法状态,那么不执行并打印"NO" +// 1 <= n、m、q <= 5 * 10^5 +// 1 <= k <= 50 // 测试链接 : https://www.luogu.com.cn/problem/CF576E // 测试链接 : https://codeforces.com/problemset/problem/576/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class166/Code07_PaintingEdges2.java b/src/class166/Code07_PaintingEdges2.java index 6ee448f2a..b6fc0dd7f 100644 --- a/src/class166/Code07_PaintingEdges2.java +++ b/src/class166/Code07_PaintingEdges2.java @@ -1,6 +1,14 @@ package class166; -// 边的涂色,C++版 +// 给边涂色,C++版 +// 一共有n个点,给定m条无向边,一开始每条边无颜色,一共有k种颜色 +// 合法状态的定义为,仅保留染成k种颜色中的任何一种颜色的边,图都是一张二分图 +// 一共有q条操作,每条操作格式如下 +// 操作 e c : 第e条边,现在要涂成c颜色 +// 如果执行此操作之后,整张图还是合法状态,那么执行并打印"YES" +// 如果执行此操作之后,整张图不再是合法状态,那么不执行并打印"NO" +// 1 <= n、m、q <= 5 * 10^5 +// 1 <= k <= 50 // 测试链接 : https://www.luogu.com.cn/problem/CF576E // 测试链接 : https://codeforces.com/problemset/problem/576/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 63d7c9aae5fd8bca5f06249a08dc19580fa3f2c1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 22 Apr 2025 19:18:28 +0800 Subject: [PATCH 0016/1170] modify code --- src/class166/Code07_PaintingEdges1.java | 3 +-- src/class166/Code07_PaintingEdges2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java index c281d23b6..dca4e555e 100644 --- a/src/class166/Code07_PaintingEdges1.java +++ b/src/class166/Code07_PaintingEdges1.java @@ -7,8 +7,7 @@ // 操作 e c : 第e条边,现在要涂成c颜色 // 如果执行此操作之后,整张图还是合法状态,那么执行并打印"YES" // 如果执行此操作之后,整张图不再是合法状态,那么不执行并打印"NO" -// 1 <= n、m、q <= 5 * 10^5 -// 1 <= k <= 50 +// 1 <= n、m、q <= 5 * 10^5 1 <= k <= 50 // 测试链接 : https://www.luogu.com.cn/problem/CF576E // 测试链接 : https://codeforces.com/problemset/problem/576/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class166/Code07_PaintingEdges2.java b/src/class166/Code07_PaintingEdges2.java index b6fc0dd7f..c0fc1931e 100644 --- a/src/class166/Code07_PaintingEdges2.java +++ b/src/class166/Code07_PaintingEdges2.java @@ -7,8 +7,7 @@ // 操作 e c : 第e条边,现在要涂成c颜色 // 如果执行此操作之后,整张图还是合法状态,那么执行并打印"YES" // 如果执行此操作之后,整张图不再是合法状态,那么不执行并打印"NO" -// 1 <= n、m、q <= 5 * 10^5 -// 1 <= k <= 50 +// 1 <= n、m、q <= 5 * 10^5 1 <= k <= 50 // 测试链接 : https://www.luogu.com.cn/problem/CF576E // 测试链接 : https://codeforces.com/problemset/problem/576/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 3c653908f964ce6ee201d77fb89ff79af44018c9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 23 Apr 2025 11:40:43 +0800 Subject: [PATCH 0017/1170] modify code --- src/class166/Code07_PaintingEdges1.java | 13 ++++++++++--- src/class166/Code07_PaintingEdges2.java | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java index dca4e555e..05b64b722 100644 --- a/src/class166/Code07_PaintingEdges1.java +++ b/src/class166/Code07_PaintingEdges1.java @@ -94,10 +94,17 @@ public static void add(int jobl, int jobr, int jobq, int l, int r, int i) { public static void dfs(int l, int r, int i) { int unionCnt = 0; + int color, x, y, xn, yn, fx, fy, fxn, fyn; for (int ei = head[i]; ei > 0; ei = next[ei]) { - int color = c[qid[ei]]; - int x = u[e[qid[ei]]], xn = x + n, fx = find(color, x), fxn = find(color, xn); - int y = v[e[qid[ei]]], yn = y + n, fy = find(color, y), fyn = find(color, yn); + color = c[qid[ei]]; + x = u[e[qid[ei]]]; + y = v[e[qid[ei]]]; + xn = x + n; + yn = y + n; + fx = find(color, x); + fy = find(color, y); + fxn = find(color, xn); + fyn = find(color, yn); if (fx != fyn) { union(color, fx, fyn); unionCnt++; diff --git a/src/class166/Code07_PaintingEdges2.java b/src/class166/Code07_PaintingEdges2.java index c0fc1931e..229c4a0a5 100644 --- a/src/class166/Code07_PaintingEdges2.java +++ b/src/class166/Code07_PaintingEdges2.java @@ -93,10 +93,17 @@ // //void dfs(int l, int r, int i) { // int unionCnt = 0; +// int color, x, y, xn, yn, fx, fy, fxn, fyn; // for (int ei = head[i]; ei > 0; ei = nxt[ei]) { -// int color = c[qid[ei]]; -// int x = u[e[qid[ei]]], xn = x + n, fx = find(color, x), fxn = find(color, xn); -// int y = v[e[qid[ei]]], yn = y + n, fy = find(color, y), fyn = find(color, yn); +// color = c[qid[ei]]; +// x = u[e[qid[ei]]]; +// y = v[e[qid[ei]]]; +// xn = x + n; +// yn = y + n; +// fx = find(color, x); +// fy = find(color, y); +// fxn = find(color, xn); +// fyn = find(color, yn); // if (fx != fyn) { // Union(color, fx, fyn); // unionCnt++; From c89aa20d3119d68062d9bd880a5a8e36c72ca082 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 23 Apr 2025 17:40:00 +0800 Subject: [PATCH 0018/1170] modify code --- src/class166/Code01_SegmentTreeDivideConquer1.java | 9 +++++++++ src/class166/Code03_MinimumMexTree1.java | 1 + src/class166/Code03_MinimumMexTree2.java | 1 + 3 files changed, 11 insertions(+) diff --git a/src/class166/Code01_SegmentTreeDivideConquer1.java b/src/class166/Code01_SegmentTreeDivideConquer1.java index dc0ee630c..eec51da17 100644 --- a/src/class166/Code01_SegmentTreeDivideConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideConquer1.java @@ -17,28 +17,37 @@ public class Code01_SegmentTreeDivideConquer1 { + // 点的数量最大值 public static int MAXN = 5001; + // 操作数量最大值 public static int MAXM = 500001; + // 任务数量最大值 public static int MAXT = 5000001; + public static int n, m; + // 操作类型op、端点u、端点v public static int[] op = new int[MAXM]; public static int[] u = new int[MAXM]; public static int[] v = new int[MAXM]; + // last[x][y] : 点x和点y的边,上次出现的时间点 public static int[][] last = new int[MAXN][MAXN]; + // 可撤销并查集 public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[][] rollback = new int[MAXN][2]; public static int opsize = 0; + // 线段树每个区间拥有哪些任务的列表,链式前向星表示 public static int[] head = new int[MAXM << 2]; public static int[] next = new int[MAXT]; public static int[] tox = new int[MAXT]; public static int[] toy = new int[MAXT]; public static int cnt = 0; + // ans[i]为第i条操作的答案,只有查询操作才有答案 public static boolean[] ans = new boolean[MAXM]; public static void addEdge(int i, int x, int y) { diff --git a/src/class166/Code03_MinimumMexTree1.java b/src/class166/Code03_MinimumMexTree1.java index b64f603fe..8ccfe76f7 100644 --- a/src/class166/Code03_MinimumMexTree1.java +++ b/src/class166/Code03_MinimumMexTree1.java @@ -4,6 +4,7 @@ // 给定n个点,m条边的无向连通图,边有边权 // 自然数集合S的mex含义为:最小的、没有出现在S中的自然数 // 现在你要求出一个这个图的生成树,使得其边权集合的mex尽可能小 +// 对本题来说,注意0是自然数 // 1 <= n <= 10^6 // 1 <= m <= 2 * 10^6 // 0 <= 边权 <= 10^5 diff --git a/src/class166/Code03_MinimumMexTree2.java b/src/class166/Code03_MinimumMexTree2.java index 06a522729..1bc400eed 100644 --- a/src/class166/Code03_MinimumMexTree2.java +++ b/src/class166/Code03_MinimumMexTree2.java @@ -4,6 +4,7 @@ // 给定n个点,m条边的无向连通图,边有边权 // 自然数集合S的mex含义为:最小的、没有出现在S中的自然数 // 现在你要求出一个这个图的生成树,使得其边权集合的mex尽可能小 +// 对本题来说,注意0是自然数 // 1 <= n <= 10^6 // 1 <= m <= 2 * 10^6 // 0 <= 边权 <= 10^5 From f6d6c9ba9dbee431216e23a3b1db685f0981be64 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 11:17:25 +0800 Subject: [PATCH 0019/1170] modify code --- src/class166/Code04_UniqueOccurrences1.java | 11 ++++++----- src/class166/Code04_UniqueOccurrences2.java | 13 +++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/class166/Code04_UniqueOccurrences1.java b/src/class166/Code04_UniqueOccurrences1.java index d33ac34a7..c61d42d39 100644 --- a/src/class166/Code04_UniqueOccurrences1.java +++ b/src/class166/Code04_UniqueOccurrences1.java @@ -17,7 +17,7 @@ public class Code04_UniqueOccurrences1 { public static int MAXN = 500001; public static int MAXT = 10000001; - public static int n, m; + public static int n, v; public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; @@ -123,23 +123,24 @@ public static void dfs(int l, int r, int i) { public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); + v = n; for (int i = 1, x, y, c; i < n; i++) { x = io.nextInt(); y = io.nextInt(); c = io.nextInt(); addEdgeC(c, x, y); if (c > 1) { - add(1, c - 1, x, y, 1, n, 1); + add(1, c - 1, x, y, 1, v, 1); } - if (c < n) { - add(c + 1, n, x, y, 1, n, 1); + if (c < v) { + add(c + 1, v, x, y, 1, v, 1); } } for (int i = 1; i <= n; i++) { father[i] = i; siz[i] = 1; } - dfs(1, n, 1); + dfs(1, v, 1); io.writelnLong(ans); io.flush(); } diff --git a/src/class166/Code04_UniqueOccurrences2.java b/src/class166/Code04_UniqueOccurrences2.java index 604107900..b92d28a42 100644 --- a/src/class166/Code04_UniqueOccurrences2.java +++ b/src/class166/Code04_UniqueOccurrences2.java @@ -16,7 +16,7 @@ // //const int MAXN = 500001; //const int MAXT = 10000001; -//int n, m; +//int n, v; // //int father[MAXN]; //int siz[MAXN]; @@ -64,7 +64,7 @@ // if (siz[fx] < siz[fy]) { // int tmp = fx; // fx = fy; -// fx = tmp; +// fy = tmp; // } // father[fy] = fx; // siz[fx] += siz[fy]; @@ -123,21 +123,22 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n; +// v = n; // for (int i = 1, x, y, c; i < n; i++) { // cin >> x >> y >> c; // addEdgeC(c, x, y); // if (c > 1) { -// add(1, c - 1, x, y, 1, n, 1); +// add(1, c - 1, x, y, 1, v, 1); // } -// if (c < n) { -// add(c + 1, n, x, y, 1, n, 1); +// if (c < v) { +// add(c + 1, v, x, y, 1, v, 1); // } // } // for (int i = 1; i <= n; i++) { // father[i] = i; // siz[i] = 1; // } -// dfs(1, n, 1); +// dfs(1, v, 1); // cout << ans << '\n'; // return 0; //} \ No newline at end of file From 85eb17c4a532fbde6dd9601807d6b48842475ab3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 12:07:14 +0800 Subject: [PATCH 0020/1170] modify code --- src/class166/Code04_UniqueOccurrences1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class166/Code04_UniqueOccurrences1.java b/src/class166/Code04_UniqueOccurrences1.java index c61d42d39..bbfc49a35 100644 --- a/src/class166/Code04_UniqueOccurrences1.java +++ b/src/class166/Code04_UniqueOccurrences1.java @@ -24,12 +24,14 @@ public class Code04_UniqueOccurrences1 { public static int[][] rollback = new int[MAXN][2]; public static int opsize = 0; + // 每种颜色的边的列表 public static int[] headc = new int[MAXN]; public static int[] nextc = new int[MAXN]; public static int[] xc = new int[MAXN]; public static int[] yc = new int[MAXN]; public static int cntc = 0; + // 线段树区间上的任务列表 public static int[] heads = new int[MAXN << 2]; public static int[] nexts = new int[MAXT]; public static int[] xs = new int[MAXT]; From f1876701df91eaa0624db5ca457f955cb40a46a5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 12:54:49 +0800 Subject: [PATCH 0021/1170] modify code --- src/class166/Code04_UniqueOccurrences1.java | 28 ++++++++++----------- src/class166/Code04_UniqueOccurrences2.java | 24 +++++++++--------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/class166/Code04_UniqueOccurrences1.java b/src/class166/Code04_UniqueOccurrences1.java index bbfc49a35..c54802836 100644 --- a/src/class166/Code04_UniqueOccurrences1.java +++ b/src/class166/Code04_UniqueOccurrences1.java @@ -24,19 +24,19 @@ public class Code04_UniqueOccurrences1 { public static int[][] rollback = new int[MAXN][2]; public static int opsize = 0; - // 每种颜色的边的列表 + // 每种颜色拥有哪些边的列表 public static int[] headc = new int[MAXN]; public static int[] nextc = new int[MAXN]; public static int[] xc = new int[MAXN]; public static int[] yc = new int[MAXN]; public static int cntc = 0; - // 线段树区间上的任务列表 - public static int[] heads = new int[MAXN << 2]; - public static int[] nexts = new int[MAXT]; - public static int[] xs = new int[MAXT]; - public static int[] ys = new int[MAXT]; - public static int cnts = 0; + // 颜色轴线段树的区间任务列表 + public static int[] headt = new int[MAXN << 2]; + public static int[] nextt = new int[MAXT]; + public static int[] xt = new int[MAXT]; + public static int[] yt = new int[MAXT]; + public static int cntt = 0; public static long ans = 0; @@ -48,10 +48,10 @@ public static void addEdgeC(int i, int x, int y) { } public static void addEdgeS(int i, int x, int y) { - nexts[++cnts] = heads[i]; - xs[cnts] = x; - ys[cnts] = y; - heads[i] = cnts; + nextt[++cntt] = headt[i]; + xt[cntt] = x; + yt[cntt] = y; + headt[i] = cntt; } public static int find(int i) { @@ -98,9 +98,9 @@ public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int public static void dfs(int l, int r, int i) { int unionCnt = 0; - for (int ei = heads[i], fx, fy; ei > 0; ei = nexts[ei]) { - fx = find(xs[ei]); - fy = find(ys[ei]); + for (int ei = headt[i], fx, fy; ei > 0; ei = nextt[ei]) { + fx = find(xt[ei]); + fy = find(yt[ei]); if (fx != fy) { union(fx, fy); unionCnt++; diff --git a/src/class166/Code04_UniqueOccurrences2.java b/src/class166/Code04_UniqueOccurrences2.java index b92d28a42..8f2d13544 100644 --- a/src/class166/Code04_UniqueOccurrences2.java +++ b/src/class166/Code04_UniqueOccurrences2.java @@ -29,11 +29,11 @@ //int yc[MAXN]; //int cntc = 0; // -//int heads[MAXN << 2]; -//int nxts[MAXT]; -//int xs[MAXT]; -//int ys[MAXT]; -//int cnts = 0; +//int headt[MAXN << 2]; +//int nxtt[MAXT]; +//int xt[MAXT]; +//int yt[MAXT]; +//int cntt = 0; // //long long ans = 0; // @@ -45,10 +45,10 @@ //} // //void addEdgeS(int i, int x, int y) { -// nxts[++cnts] = heads[i]; -// xs[cnts] = x; -// ys[cnts] = y; -// heads[i] = cnts; +// nxtt[++cntt] = headt[i]; +// xt[cntt] = x; +// yt[cntt] = y; +// headt[i] = cntt; //} // //int find(int i) { @@ -95,9 +95,9 @@ // //void dfs(int l, int r, int i) { // int unionCnt = 0; -// for (int ei = heads[i], fx, fy; ei > 0; ei = nxts[ei]) { -// fx = find(xs[ei]); -// fy = find(ys[ei]); +// for (int ei = headt[i], fx, fy; ei > 0; ei = nxtt[ei]) { +// fx = find(xt[ei]); +// fy = find(yt[ei]); // if (fx != fy) { // Union(fx, fy); // unionCnt++; From fd848bf42aee9f9ae01db5fb0c30dddeb8842983 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 13:03:42 +0800 Subject: [PATCH 0022/1170] modify code --- src/class166/Code04_UniqueOccurrences1.java | 10 +++------- src/class166/Code04_UniqueOccurrences2.java | 10 +++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/class166/Code04_UniqueOccurrences1.java b/src/class166/Code04_UniqueOccurrences1.java index c54802836..cb467154a 100644 --- a/src/class166/Code04_UniqueOccurrences1.java +++ b/src/class166/Code04_UniqueOccurrences1.java @@ -98,13 +98,9 @@ public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int public static void dfs(int l, int r, int i) { int unionCnt = 0; - for (int ei = headt[i], fx, fy; ei > 0; ei = nextt[ei]) { - fx = find(xt[ei]); - fy = find(yt[ei]); - if (fx != fy) { - union(fx, fy); - unionCnt++; - } + for (int ei = headt[i]; ei > 0; ei = nextt[ei]) { + union(xt[ei], yt[ei]); + unionCnt++; } if (l == r) { for (int ei = headc[l], fx, fy; ei > 0; ei = nextc[ei]) { diff --git a/src/class166/Code04_UniqueOccurrences2.java b/src/class166/Code04_UniqueOccurrences2.java index 8f2d13544..01b2df10a 100644 --- a/src/class166/Code04_UniqueOccurrences2.java +++ b/src/class166/Code04_UniqueOccurrences2.java @@ -95,13 +95,9 @@ // //void dfs(int l, int r, int i) { // int unionCnt = 0; -// for (int ei = headt[i], fx, fy; ei > 0; ei = nxtt[ei]) { -// fx = find(xt[ei]); -// fy = find(yt[ei]); -// if (fx != fy) { -// Union(fx, fy); -// unionCnt++; -// } +// for (int ei = headt[i]; ei > 0; ei = nxtt[ei]) { +// Union(xt[ei], yt[ei]); +// unionCnt++; // } // if (l == r) { // for (int ei = headc[l], fx, fy; ei > 0; ei = nxtc[ei]) { From 99ed67bae50ba4df7c17934441abad590993d572 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 13:25:26 +0800 Subject: [PATCH 0023/1170] modify code --- src/class166/Code05_GreatIntegration1.java | 3 ++- src/class166/Code05_GreatIntegration2.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class166/Code05_GreatIntegration1.java b/src/class166/Code05_GreatIntegration1.java index c9cf44d51..9fe4320c9 100644 --- a/src/class166/Code05_GreatIntegration1.java +++ b/src/class166/Code05_GreatIntegration1.java @@ -4,7 +4,7 @@ // 一共有n个点,一共有q条操作,每条操作是如下两种类型中的一种 // 操作 A x y : 点x和点y之间连一条边,保证之前x和y是不联通的 // 操作 Q x y : 打印点x和点y之间这条边的负载,保证x和y之间有一条边 -// 边负载定义为,假设去掉这条边之后,端点1联通区大小 * 端点2联通区大小 +// 边负载定义为,这条边两侧端点各自连通区大小的乘积 // 1 <= n、q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4219 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -25,6 +25,7 @@ public class Code05_GreatIntegration1 { public static int[] u = new int[MAXN]; public static int[] v = new int[MAXN]; + // 端点x、端点y、操作序号t public static int[][] event = new int[MAXN][3]; public static int[] father = new int[MAXN]; diff --git a/src/class166/Code05_GreatIntegration2.java b/src/class166/Code05_GreatIntegration2.java index 283ae2223..d4082f022 100644 --- a/src/class166/Code05_GreatIntegration2.java +++ b/src/class166/Code05_GreatIntegration2.java @@ -4,7 +4,7 @@ // 一共有n个点,一共有q条操作,每条操作是如下两种类型中的一种 // 操作 A x y : 点x和点y之间连一条边,保证之前x和y是不联通的 // 操作 Q x y : 打印点x和点y之间这条边的负载,保证x和y之间有一条边 -// 边负载定义为,假设去掉这条边之后,端点1联通区大小 * 端点2联通区大小 +// 边负载定义为,这条边两侧端点各自连通区大小的乘积 // 1 <= n、q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4219 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From b65c0d73f64491740f82b19fd1388d24d4eab1f3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 14:59:41 +0800 Subject: [PATCH 0024/1170] modify code --- src/class166/Code05_GreatIntegration1.java | 10 +++------- src/class166/Code05_GreatIntegration2.java | 10 +++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/class166/Code05_GreatIntegration1.java b/src/class166/Code05_GreatIntegration1.java index 9fe4320c9..63d561598 100644 --- a/src/class166/Code05_GreatIntegration1.java +++ b/src/class166/Code05_GreatIntegration1.java @@ -92,13 +92,9 @@ public static void add(int jobl, int jobr, int jobx, int joby, int l, int r, int public static void dfs(int l, int r, int i) { int unionCnt = 0; - for (int ei = head[i], fx, fy; ei > 0; ei = next[ei]) { - fx = find(tox[ei]); - fy = find(toy[ei]); - if (fx != fy) { - union(fx, fy); - unionCnt++; - } + for (int ei = head[i]; ei > 0; ei = next[ei]) { + union(tox[ei], toy[ei]); + unionCnt++; } if (l == r) { if (op[l] == 2) { diff --git a/src/class166/Code05_GreatIntegration2.java b/src/class166/Code05_GreatIntegration2.java index d4082f022..20c527718 100644 --- a/src/class166/Code05_GreatIntegration2.java +++ b/src/class166/Code05_GreatIntegration2.java @@ -102,13 +102,9 @@ // //void dfs(int l, int r, int i) { // int unionCnt = 0; -// for (int ei = head[i], fx, fy; ei > 0; ei = nxt[ei]) { -// fx = find(tox[ei]); -// fy = find(toy[ei]); -// if (fx != fy) { -// Union(fx, fy); -// unionCnt++; -// } +// for (int ei = head[i]; ei > 0; ei = nxt[ei]) { +// Union(tox[ei], toy[ei]); +// unionCnt++; // } // if (l == r) { // if (op[l] == 2) { From 0a1ef9d47fa8ae8b56356deb63992c3114de0688 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 15:19:49 +0800 Subject: [PATCH 0025/1170] modify code --- src/class166/Code06_ConnectedGraph1.java | 2 +- src/class166/Code06_ConnectedGraph2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class166/Code06_ConnectedGraph1.java b/src/class166/Code06_ConnectedGraph1.java index fe0282500..b420aa46d 100644 --- a/src/class166/Code06_ConnectedGraph1.java +++ b/src/class166/Code06_ConnectedGraph1.java @@ -1,7 +1,7 @@ package class166; // 连通图,java版 -// 一共有n个点,给定m条边,所有点一定组成一个连通图 +// 一共有n个点,给定m条边,所有点一开始就连通在一起了 // 一共有k条操作,每条操作格式如下 // 操作 c ... : 操作涉及c条边,这些边的编号 ... 一共c个 // 假设删掉这些边,打印整张图是否联通 diff --git a/src/class166/Code06_ConnectedGraph2.java b/src/class166/Code06_ConnectedGraph2.java index 2c5273cb9..baddb24a8 100644 --- a/src/class166/Code06_ConnectedGraph2.java +++ b/src/class166/Code06_ConnectedGraph2.java @@ -1,7 +1,7 @@ package class166; // 连通图,C++版 -// 一共有n个点,给定m条边,所有点一定组成一个连通图 +// 一共有n个点,给定m条边,所有点一开始就连通在一起了 // 一共有k条操作,每条操作格式如下 // 操作 c ... : 操作涉及c条边,这些边的编号 ... 一共c个 // 假设删掉这些边,打印整张图是否联通 From 378ed54e39106279afe8d868073835010eeeff16 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 15:41:28 +0800 Subject: [PATCH 0026/1170] modify code --- src/class166/Code07_PaintingEdges1.java | 20 +++++++++----------- src/class166/Code07_PaintingEdges2.java | 20 +++++++++----------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java index 05b64b722..3fc5e05da 100644 --- a/src/class166/Code07_PaintingEdges1.java +++ b/src/class166/Code07_PaintingEdges1.java @@ -27,8 +27,7 @@ public class Code07_PaintingEdges1 { public static int[] v = new int[MAXN]; public static int[] e = new int[MAXN]; public static int[] c = new int[MAXN]; - - public static int[] help = new int[MAXN]; + public static int[] post = new int[MAXN]; public static int[][] father = new int[MAXK][MAXN << 1]; public static int[][] siz = new int[MAXK][MAXN << 1]; @@ -40,6 +39,8 @@ public class Code07_PaintingEdges1 { public static int[] qid = new int[MAXT]; public static int cnt = 0; + public static int[] lastColor = new int[MAXN]; + public static boolean[] ans = new boolean[MAXN]; public static void addEdge(int i, int qi) { @@ -117,10 +118,10 @@ public static void dfs(int l, int r, int i) { if (l == r) { if (find(c[l], u[e[l]]) == find(c[l], v[e[l]])) { ans[l] = false; - c[l] = help[e[l]]; + c[l] = lastColor[e[l]]; } else { ans[l] = true; - help[e[l]] = c[l]; + lastColor[e[l]] = c[l]; } } else { int mid = (l + r) >> 1; @@ -142,16 +143,13 @@ public static void prepare() { } } for (int i = 1; i <= m; i++) { - help[i] = q + 1; + post[i] = q + 1; } for (int i = q; i >= 1; i--) { - if (i + 1 <= help[e[i]] - 1) { - add(i + 1, help[e[i]] - 1, i, 1, q, 1); + if (i + 1 <= post[e[i]] - 1) { + add(i + 1, post[e[i]] - 1, i, 1, q, 1); } - help[e[i]] = i; - } - for (int i = 1; i <= m; i++) { - help[i] = 0; + post[e[i]] = i; } } diff --git a/src/class166/Code07_PaintingEdges2.java b/src/class166/Code07_PaintingEdges2.java index 229c4a0a5..f14e9342f 100644 --- a/src/class166/Code07_PaintingEdges2.java +++ b/src/class166/Code07_PaintingEdges2.java @@ -26,8 +26,7 @@ //int v[MAXN]; //int e[MAXN]; //int c[MAXN]; -// -//int help[MAXN]; +//int post[MAXN]; // //int father[MAXK][MAXN << 1]; //int siz[MAXK][MAXN << 1]; @@ -39,6 +38,8 @@ //int qid[MAXT]; //int cnt = 0; // +//int lastColor[MAXN]; +// //bool ans[MAXN]; // //void addEdge(int i, int qi) { @@ -116,10 +117,10 @@ // if (l == r) { // if (find(c[l], u[e[l]]) == find(c[l], v[e[l]])) { // ans[l] = false; -// c[l] = help[e[l]]; +// c[l] = lastColor[e[l]]; // } else { // ans[l] = true; -// help[e[l]] = c[l]; +// lastColor[e[l]] = c[l]; // } // } else { // int mid = (l + r) >> 1; @@ -141,16 +142,13 @@ // } // } // for (int i = 1; i <= m; i++) { -// help[i] = q + 1; +// post[i] = q + 1; // } // for (int i = q; i >= 1; i--) { -// if (i + 1 <= help[e[i]] - 1) { -// add(i + 1, help[e[i]] - 1, i, 1, q, 1); +// if (i + 1 <= post[e[i]] - 1) { +// add(i + 1, post[e[i]] - 1, i, 1, q, 1); // } -// help[e[i]] = i; -// } -// for (int i = 1; i <= m; i++) { -// help[i] = 0; +// post[e[i]] = i; // } //} // From fab9d8082b7cb8e669bf9d28fb4eb623496a242e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 17:17:14 +0800 Subject: [PATCH 0027/1170] modify code --- src/class166/Code07_PaintingEdges1.java | 9 ++++++--- src/class166/Code07_PaintingEdges2.java | 7 ++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java index 3fc5e05da..41a22e0ee 100644 --- a/src/class166/Code07_PaintingEdges1.java +++ b/src/class166/Code07_PaintingEdges1.java @@ -25,6 +25,7 @@ public class Code07_PaintingEdges1 { public static int[] u = new int[MAXN]; public static int[] v = new int[MAXN]; + public static int[] e = new int[MAXN]; public static int[] c = new int[MAXN]; public static int[] post = new int[MAXN]; @@ -34,11 +35,13 @@ public class Code07_PaintingEdges1 { public static int[][] rollback = new int[MAXN << 1][3]; public static int opsize = 0; + // 时间轴线段树的区间上的任务列表 public static int[] head = new int[MAXN << 2]; public static int[] next = new int[MAXT]; public static int[] qid = new int[MAXT]; public static int cnt = 0; + // lastColor[i] : 第i号边上次成功涂上的颜色 public static int[] lastColor = new int[MAXN]; public static boolean[] ans = new boolean[MAXN]; @@ -143,11 +146,11 @@ public static void prepare() { } } for (int i = 1; i <= m; i++) { - post[i] = q + 1; + post[i] = q; } for (int i = q; i >= 1; i--) { - if (i + 1 <= post[e[i]] - 1) { - add(i + 1, post[e[i]] - 1, i, 1, q, 1); + if (i + 1 <= post[e[i]]) { + add(i + 1, post[e[i]], i, 1, q, 1); } post[e[i]] = i; } diff --git a/src/class166/Code07_PaintingEdges2.java b/src/class166/Code07_PaintingEdges2.java index f14e9342f..eba8fb20e 100644 --- a/src/class166/Code07_PaintingEdges2.java +++ b/src/class166/Code07_PaintingEdges2.java @@ -24,6 +24,7 @@ // //int u[MAXN]; //int v[MAXN]; +// //int e[MAXN]; //int c[MAXN]; //int post[MAXN]; @@ -142,11 +143,11 @@ // } // } // for (int i = 1; i <= m; i++) { -// post[i] = q + 1; +// post[i] = q; // } // for (int i = q; i >= 1; i--) { -// if (i + 1 <= post[e[i]] - 1) { -// add(i + 1, post[e[i]] - 1, i, 1, q, 1); +// if (i + 1 <= post[e[i]]) { +// add(i + 1, post[e[i]], i, 1, q, 1); // } // post[e[i]] = i; // } From 363cb7799130bf8ae8c26310e1146add05190dcf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Apr 2025 18:59:06 +0800 Subject: [PATCH 0028/1170] modify code --- ...1\345\210\206\346\262\273-\344\270\212.pptx" | Bin 0 -> 54093 bytes src/class166/Code07_PaintingEdges1.java | 1 + 2 files changed, 1 insertion(+) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243166\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\345\210\206\346\262\273-\344\270\212.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243166\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\345\210\206\346\262\273-\344\270\212.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243166\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\345\210\206\346\262\273-\344\270\212.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..2210c9654a931078bda58ae3bc38200c596fea5b GIT binary patch literal 54093 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%0D?^BAZ5f4 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 EKb7A9B>(^b literal 0 HcmV?d00001 diff --git a/src/class166/Code07_PaintingEdges1.java b/src/class166/Code07_PaintingEdges1.java index 41a22e0ee..5f4d48dd8 100644 --- a/src/class166/Code07_PaintingEdges1.java +++ b/src/class166/Code07_PaintingEdges1.java @@ -36,6 +36,7 @@ public class Code07_PaintingEdges1 { public static int opsize = 0; // 时间轴线段树的区间上的任务列表 + // 尤其注意qid的设置,课上进行了重点解释 public static int[] head = new int[MAXN << 2]; public static int[] next = new int[MAXT]; public static int[] qid = new int[MAXT]; From 84d943017ff4c109c4c62b1f1a9b72130903c120 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 27 Apr 2025 20:52:59 +0800 Subject: [PATCH 0029/1170] modify code --- src/class167/Code01_ShortestPathQueries1.java | 305 ++++++++++++++++++ src/class167/Code01_ShortestPathQueries2.java | 222 +++++++++++++ 2 files changed, 527 insertions(+) create mode 100644 src/class167/Code01_ShortestPathQueries1.java create mode 100644 src/class167/Code01_ShortestPathQueries2.java diff --git a/src/class167/Code01_ShortestPathQueries1.java b/src/class167/Code01_ShortestPathQueries1.java new file mode 100644 index 000000000..c40f0d0ab --- /dev/null +++ b/src/class167/Code01_ShortestPathQueries1.java @@ -0,0 +1,305 @@ +package class167; + +// 异或最短路,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF938G +// 测试链接 : https://codeforces.com/problemset/problem/938/G +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_ShortestPathQueries1 { + + public static int MAXN = 200001; + public static int MAXT = 5000001; + public static int LIMIT = 20; + public static int BIT = 29; + public static int n, m, q; + + // 端点x、端点y、时间点t、边权w + public static int[][] event = new int[MAXN << 1][4]; + public static int eventCnt; + + // 操作记录下来 + public static int[] op = new int[MAXN]; + public static int[] x = new int[MAXN]; + public static int[] y = new int[MAXN]; + public static int[] d = new int[MAXN]; + + // 异或空间线性基 + public static int[] basis = new int[BIT + 1]; + public static int[][] backup = new int[LIMIT][BIT + 1]; + + // 时间轴线段树上的区间任务列表 + public static int[] head = new int[MAXN << 2]; + public static int[] next = new int[MAXT]; + public static int[] tox = new int[MAXT]; + public static int[] toy = new int[MAXT]; + public static int[] tow = new int[MAXT]; + public static int cnt = 0; + + // 可撤销并查集 + 带权并查集 + public static int[] father = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] eor = new int[MAXN]; + public static int[][] rollback = new int[MAXN][2]; + public static int opsize = 0; + + // 查询操作的答案 + public static int[] ans = new int[MAXN]; + + // 当前数字插入线性基 + public static void insert(int num) { + for (int i = BIT; i >= 0; i--) { + if (num >> i == 1) { + if (basis[i] == 0) { + basis[i] = num; + return; + } + num ^= basis[i]; + } + } + } + + // 根据线性基,返回num能结合出的最小异或和 + public static int minEor(int num) { + for (int i = BIT; i >= 0; i--) { + num = Math.min(num, num ^ basis[i]); + } + return num; + } + + // a把b的内容拷贝过来,用于线性基的撤销 + public static void clone(int[] a, int[] b) { + for (int i = 0; i <= BIT; i++) { + a[i] = b[i]; + } + } + + // 可撤销并查集找集合代表点 + public static int find(int i) { + while (i != father[i]) { + i = father[i]; + } + return i; + } + + // 返回i到集合代表点的异或和 + public static int getEor(int i) { + int ans = 0; + while (i != father[i]) { + ans ^= eor[i]; + i = father[i]; + } + return ans; + } + + // 可撤销并查集的合并,增加a和b之间,权值为w的边 + // 集合合并的过程中,还要更新eor数组 + // 这种更新eor的方式,参考讲解156,带权并查集 + public static boolean union(int a, int b, int w) { + int eora = getEor(a); + int eorb = getEor(b); + int fa = find(a); + int fb = find(b); + w = eora ^ eorb ^ w; + if (fa == fb) { + insert(w); + return false; + } + if (siz[fa] < siz[fb]) { + int tmp = fa; + fa = fb; + fb = tmp; + } + father[fb] = fa; + siz[fa] += siz[fb]; + eor[fb] = w; + rollback[++opsize][0] = fa; + rollback[opsize][1] = fb; + return true; + } + + // 并查集的撤销操作 + public static void undo() { + int fa = rollback[opsize][0]; + int fb = rollback[opsize--][1]; + father[fb] = fb; + eor[fb] = 0; + siz[fa] -= siz[fb]; + } + + // 给某个线段树区间增加任务,点x到点y之间,增加权值为w的边 + public static void addEdge(int i, int x, int y, int w) { + next[++cnt] = head[i]; + tox[cnt] = x; + toy[cnt] = y; + tow[cnt] = w; + head[i] = cnt; + } + + public static void add(int jobl, int jobr, int jobx, int joby, int jobw, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdge(i, jobx, joby, jobw); + } else { + int mid = (l + r) >> 1; + if (jobl <= mid) { + add(jobl, jobr, jobx, joby, jobw, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobx, joby, jobw, mid + 1, r, i << 1 | 1); + } + } + } + + public static void dfs(int l, int r, int i, int deep) { + clone(backup[deep], basis); + int unionCnt = 0; + for (int e = head[i]; e > 0; e = next[e]) { + if (union(tox[e], toy[e], tow[e])) { + unionCnt++; + } + } + if (l == r) { + if (op[l] == 3) { + ans[l] = minEor(getEor(x[l]) ^ getEor(y[l])); + } + } else { + int mid = (l + r) >> 1; + dfs(l, mid, i << 1, deep + 1); + dfs(mid + 1, r, i << 1 | 1, deep + 1); + } + clone(basis, backup[deep]); + for (int k = 1; k <= unionCnt; k++) { + undo(); + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + } + Arrays.sort(event, 1, eventCnt + 1, + (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]); + for (int l = 1, r = 1; l <= eventCnt; l = ++r) { + int x = event[l][0]; + int y = event[l][1]; + while (r + 1 <= eventCnt && event[r + 1][0] == x && event[r + 1][1] == y) { + r++; + } + for (int i = l; i <= r; i += 2) { + int start = event[i][2]; + int end = i + 1 <= r ? (event[i + 1][2] - 1) : q; + int d = event[i][3]; + add(start, end, x, y, d, 0, q, 1); + } + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= m; i++) { + event[i][0] = in.nextInt(); + event[i][1] = in.nextInt(); + event[i][2] = 0; + event[i][3] = in.nextInt(); + } + eventCnt = m; + q = in.nextInt(); + for (int i = 1; i <= q; i++) { + op[i] = in.nextInt(); + x[i] = in.nextInt(); + y[i] = in.nextInt(); + if (op[i] == 1) { + d[i] = in.nextInt(); + } + if (op[i] != 3) { + event[++eventCnt][0] = x[i]; + event[eventCnt][1] = y[i]; + event[eventCnt][2] = i; + event[eventCnt][3] = d[i]; + } + } + prepare(); + dfs(0, q, 1, 0); + for (int i = 1; i <= q; i++) { + if (op[i] == 3) { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code01_ShortestPathQueries2.java new file mode 100644 index 000000000..21410f484 --- /dev/null +++ b/src/class167/Code01_ShortestPathQueries2.java @@ -0,0 +1,222 @@ +package class167; + +// 异或最短路,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF938G +// 测试链接 : https://codeforces.com/problemset/problem/938/G +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Event { +// int x, y, t, w; +//}; +// +//bool EventCmp(Event a, Event b) { +// if (a.x != b.x) { +// return a.x < b.x; +// } else if (a.y != b.y) { +// return a.y < b.y; +// } else { +// return a.t < b.t; +// } +//} +// +//const int MAXN = 200001; +//const int MAXT = 5000001; +//const int LIMIT = 20; +//const int BIT = 29; +//int n, m, q; +// +//Event event[MAXN << 1]; +//int eventCnt = 0; +// +//int op[MAXN]; +//int x[MAXN]; +//int y[MAXN]; +//int d[MAXN]; +// +//int basis[BIT + 1]; +//int backup[LIMIT][BIT + 1]; +// +//int head[MAXN << 2]; +//int nxt[MAXT]; +//int tox[MAXT]; +//int toy[MAXT]; +//int tow[MAXT]; +//int cnt = 0; +// +//int father[MAXN]; +//int siz[MAXN]; +//int eor[MAXN]; +//int rollbackArr[MAXN][2]; +//int opsize = 0; +// +//int ans[MAXN]; +// +//void insert(int num) { +// for (int i = BIT; i >= 0; --i) { +// if (num >> i == 1) { +// if (basis[i] == 0) { +// basis[i] = num; +// return; +// } +// num ^= basis[i]; +// } +// } +//} +// +//int minEor(int num) { +// for (int i = BIT; i >= 0; --i) { +// num = min(num, num ^ basis[i]); +// } +// return num; +//} +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//int getEor(int i) { +// int res = 0; +// while (i != father[i]) { +// res ^= eor[i]; +// i = father[i]; +// } +// return res; +//} +// +//bool Union(int a, int b, int w) { +// int eora = getEor(a); +// int eorb = getEor(b); +// int fa = find(a); +// int fb = find(b); +// w ^= eora ^ eorb; +// if (fa == fb) { +// insert(w); +// return false; +// } +// if (siz[fa] < siz[fb]) { +// int tmp = fa; +// fa = fb; +// fb = tmp; +// } +// father[fb] = fa; +// siz[fa] += siz[fb]; +// eor[fb] = w; +// rollbackArr[++opsize][0] = fa; +// rollbackArr[opsize][1] = fb; +// return true; +//} +// +//void undo() { +// int fa = rollbackArr[opsize][0]; +// int fb = rollbackArr[opsize--][1]; +// father[fb] = fb; +// eor[fb] = 0; +// siz[fa] -= siz[fb]; +//} +// +//void addEdge(int idx, int u, int v, int w) { +// nxt[++cnt] = head[idx]; +// tox[cnt] = u; +// toy[cnt] = v; +// tow[cnt] = w; +// head[idx] = cnt; +//} +// +//void add(int jobl, int jobr, int jobx, int joby, int jobw, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby, jobw); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobx, joby, jobw, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobx, joby, jobw, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i, int dep) { +// memcpy(backup[dep], basis, sizeof(backup[dep])); +// int unionCnt = 0; +// for (int e = head[i]; e; e = nxt[e]) { +// if (Union(tox[e], toy[e], tow[e])) { +// ++unionCnt; +// } +// } +// if (l == r) { +// if (op[l] == 3) { +// ans[l] = minEor(getEor(x[l]) ^ getEor(y[l])); +// } +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1, dep + 1); +// dfs(mid + 1, r, i << 1 | 1, dep + 1); +// } +// memcpy(basis, backup[dep], sizeof(basis)); +// for (int k = 1; k <= unionCnt; k++) { +// undo(); +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// sort(event + 1, event + eventCnt + 1, EventCmp); +// for (int l = 1, r = 1; l <= eventCnt; l = ++r) { +// int x = event[l].x; +// int y = event[l].y; +// while (r + 1 <= eventCnt && event[r + 1].x == x && event[r + 1].y == y) { +// ++r; +// } +// for (int i = l; i <= r; i += 2) { +// int start = event[i].t; +// int end = (i + 1 <= r) ? (event[i + 1].t - 1) : q; +// int w = event[i].w; +// add(start, end, x, y, w, 0, q, 1); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= m; i++) { +// cin >> event[i].x >> event[i].y >> event[i].w; +// event[i].t = 0; +// } +// eventCnt = m; +// cin >> q; +// for (int i = 1; i <= q; i++) { +// cin >> op[i] >> x[i] >> y[i]; +// if (op[i] == 1) { +// cin >> d[i]; +// } +// if (op[i] != 3) { +// ++eventCnt; +// event[eventCnt].x = x[i]; +// event[eventCnt].y = y[i]; +// event[eventCnt].t = i; +// event[eventCnt].w = d[i]; +// } +// } +// prepare(); +// dfs(0, q, 1, 0); +// for (int i = 1; i <= q; i++) { +// if (op[i] == 3) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From ef7181fbd97e743288a316380f3cb5487c3e8e4b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 27 Apr 2025 21:01:07 +0800 Subject: [PATCH 0030/1170] modify code --- src/class167/Code01_ShortestPathQueries2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code01_ShortestPathQueries2.java index 21410f484..26db33e0b 100644 --- a/src/class167/Code01_ShortestPathQueries2.java +++ b/src/class167/Code01_ShortestPathQueries2.java @@ -98,7 +98,7 @@ // int fb = find(b); // w ^= eora ^ eorb; // if (fa == fb) { -// insert(w); +// insert(w); // return false; // } // if (siz[fa] < siz[fb]) { From 21c52333f33f52336ab8aa23655dad65b1f04ffd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 27 Apr 2025 21:04:51 +0800 Subject: [PATCH 0031/1170] modify code --- src/class167/Code01_ShortestPathQueries2.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code01_ShortestPathQueries2.java index 26db33e0b..e90be7bff 100644 --- a/src/class167/Code01_ShortestPathQueries2.java +++ b/src/class167/Code01_ShortestPathQueries2.java @@ -149,7 +149,7 @@ // int unionCnt = 0; // for (int e = head[i]; e; e = nxt[e]) { // if (Union(tox[e], toy[e], tow[e])) { -// ++unionCnt; +// unionCnt++; // } // } // if (l == r) { @@ -177,7 +177,7 @@ // int x = event[l].x; // int y = event[l].y; // while (r + 1 <= eventCnt && event[r + 1].x == x && event[r + 1].y == y) { -// ++r; +// r++; // } // for (int i = l; i <= r; i += 2) { // int start = event[i].t; @@ -204,8 +204,7 @@ // cin >> d[i]; // } // if (op[i] != 3) { -// ++eventCnt; -// event[eventCnt].x = x[i]; +// event[++eventCnt].x = x[i]; // event[eventCnt].y = y[i]; // event[eventCnt].t = i; // event[eventCnt].w = d[i]; From fce75339769b4cb12d220909633281ed40ab0120 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 27 Apr 2025 21:08:32 +0800 Subject: [PATCH 0032/1170] modify code --- src/class167/Code01_ShortestPathQueries1.java | 11 ++++++----- src/class167/Code01_ShortestPathQueries2.java | 15 ++++++++------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/class167/Code01_ShortestPathQueries1.java b/src/class167/Code01_ShortestPathQueries1.java index c40f0d0ab..9b66dce70 100644 --- a/src/class167/Code01_ShortestPathQueries1.java +++ b/src/class167/Code01_ShortestPathQueries1.java @@ -185,16 +185,17 @@ public static void prepare() { } Arrays.sort(event, 1, eventCnt + 1, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]); + int x, y, start, end, d; for (int l = 1, r = 1; l <= eventCnt; l = ++r) { - int x = event[l][0]; - int y = event[l][1]; + x = event[l][0]; + y = event[l][1]; while (r + 1 <= eventCnt && event[r + 1][0] == x && event[r + 1][1] == y) { r++; } for (int i = l; i <= r; i += 2) { - int start = event[i][2]; - int end = i + 1 <= r ? (event[i + 1][2] - 1) : q; - int d = event[i][3]; + start = event[i][2]; + end = i + 1 <= r ? (event[i + 1][2] - 1) : q; + d = event[i][3]; add(start, end, x, y, d, 0, q, 1); } } diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code01_ShortestPathQueries2.java index e90be7bff..59ec766d6 100644 --- a/src/class167/Code01_ShortestPathQueries2.java +++ b/src/class167/Code01_ShortestPathQueries2.java @@ -96,7 +96,7 @@ // int eorb = getEor(b); // int fa = find(a); // int fb = find(b); -// w ^= eora ^ eorb; +// w = eora ^ eorb ^ w; // if (fa == fb) { // insert(w); // return false; @@ -173,17 +173,18 @@ // siz[i] = 1; // } // sort(event + 1, event + eventCnt + 1, EventCmp); +// int x, y, start, end, d; // for (int l = 1, r = 1; l <= eventCnt; l = ++r) { -// int x = event[l].x; -// int y = event[l].y; +// x = event[l].x; +// y = event[l].y; // while (r + 1 <= eventCnt && event[r + 1].x == x && event[r + 1].y == y) { // r++; // } // for (int i = l; i <= r; i += 2) { -// int start = event[i].t; -// int end = (i + 1 <= r) ? (event[i + 1].t - 1) : q; -// int w = event[i].w; -// add(start, end, x, y, w, 0, q, 1); +// start = event[i].t; +// end = (i + 1 <= r) ? (event[i + 1].t - 1) : q; +// d = event[i].w; +// add(start, end, x, y, d, 0, q, 1); // } // } //} From 921a05b21aa3adc6846fce333d0299120c8d5064 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 27 Apr 2025 21:11:35 +0800 Subject: [PATCH 0033/1170] modify code --- src/class167/Code01_ShortestPathQueries1.java | 14 +++++++------- src/class167/Code01_ShortestPathQueries2.java | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class167/Code01_ShortestPathQueries1.java b/src/class167/Code01_ShortestPathQueries1.java index 9b66dce70..a4f6cc5af 100644 --- a/src/class167/Code01_ShortestPathQueries1.java +++ b/src/class167/Code01_ShortestPathQueries1.java @@ -15,7 +15,7 @@ public class Code01_ShortestPathQueries1 { public static int MAXN = 200001; public static int MAXT = 5000001; - public static int LIMIT = 20; + public static int DEEP = 20; public static int BIT = 29; public static int n, m, q; @@ -31,7 +31,7 @@ public class Code01_ShortestPathQueries1 { // 异或空间线性基 public static int[] basis = new int[BIT + 1]; - public static int[][] backup = new int[LIMIT][BIT + 1]; + public static int[][] backup = new int[DEEP][BIT + 1]; // 时间轴线段树上的区间任务列表 public static int[] head = new int[MAXN << 2]; @@ -155,8 +155,8 @@ public static void add(int jobl, int jobr, int jobx, int joby, int jobw, int l, } } - public static void dfs(int l, int r, int i, int deep) { - clone(backup[deep], basis); + public static void dfs(int l, int r, int i, int dep) { + clone(backup[dep], basis); int unionCnt = 0; for (int e = head[i]; e > 0; e = next[e]) { if (union(tox[e], toy[e], tow[e])) { @@ -169,10 +169,10 @@ public static void dfs(int l, int r, int i, int deep) { } } else { int mid = (l + r) >> 1; - dfs(l, mid, i << 1, deep + 1); - dfs(mid + 1, r, i << 1 | 1, deep + 1); + dfs(l, mid, i << 1, dep + 1); + dfs(mid + 1, r, i << 1 | 1, dep + 1); } - clone(basis, backup[deep]); + clone(basis, backup[dep]); for (int k = 1; k <= unionCnt; k++) { undo(); } diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code01_ShortestPathQueries2.java index 59ec766d6..d5498ebc3 100644 --- a/src/class167/Code01_ShortestPathQueries2.java +++ b/src/class167/Code01_ShortestPathQueries2.java @@ -26,7 +26,7 @@ // //const int MAXN = 200001; //const int MAXT = 5000001; -//const int LIMIT = 20; +//const int DEEP = 20; //const int BIT = 29; //int n, m, q; // @@ -39,7 +39,7 @@ //int d[MAXN]; // //int basis[BIT + 1]; -//int backup[LIMIT][BIT + 1]; +//int backup[DEEP][BIT + 1]; // //int head[MAXN << 2]; //int nxt[MAXT]; From 05fb83d52e563a8c838536cec03028944feb1963 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 27 Apr 2025 21:13:38 +0800 Subject: [PATCH 0034/1170] modify code --- src/class167/Code01_ShortestPathQueries1.java | 2 +- src/class167/Code01_ShortestPathQueries2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class167/Code01_ShortestPathQueries1.java b/src/class167/Code01_ShortestPathQueries1.java index a4f6cc5af..c6de9a468 100644 --- a/src/class167/Code01_ShortestPathQueries1.java +++ b/src/class167/Code01_ShortestPathQueries1.java @@ -15,8 +15,8 @@ public class Code01_ShortestPathQueries1 { public static int MAXN = 200001; public static int MAXT = 5000001; - public static int DEEP = 20; public static int BIT = 29; + public static int DEEP = 20; public static int n, m, q; // 端点x、端点y、时间点t、边权w diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code01_ShortestPathQueries2.java index d5498ebc3..40825445f 100644 --- a/src/class167/Code01_ShortestPathQueries2.java +++ b/src/class167/Code01_ShortestPathQueries2.java @@ -26,8 +26,8 @@ // //const int MAXN = 200001; //const int MAXT = 5000001; -//const int DEEP = 20; //const int BIT = 29; +//const int DEEP = 20; //int n, m, q; // //Event event[MAXN << 1]; From f323a7faec282550ece7f8f192959fc7328762a7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 28 Apr 2025 11:37:56 +0800 Subject: [PATCH 0035/1170] modify code --- src/class167/Code01_ShortestPathQueries1.java | 4 ++-- src/class167/Code02_EightVerticalHorizontal1.java | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 src/class167/Code02_EightVerticalHorizontal1.java diff --git a/src/class167/Code01_ShortestPathQueries1.java b/src/class167/Code01_ShortestPathQueries1.java index c6de9a468..76d746aaa 100644 --- a/src/class167/Code01_ShortestPathQueries1.java +++ b/src/class167/Code01_ShortestPathQueries1.java @@ -51,7 +51,7 @@ public class Code01_ShortestPathQueries1 { // 查询操作的答案 public static int[] ans = new int[MAXN]; - // 当前数字插入线性基 + // num插入线性基 public static void insert(int num) { for (int i = BIT; i >= 0; i--) { if (num >> i == 1) { @@ -99,7 +99,7 @@ public static int getEor(int i) { // 可撤销并查集的合并,增加a和b之间,权值为w的边 // 集合合并的过程中,还要更新eor数组 - // 这种更新eor的方式,参考讲解156,带权并查集 + // 更新eor的方式,参考讲解156,带权并查集 public static boolean union(int a, int b, int w) { int eora = getEor(a); int eorb = getEor(b); diff --git a/src/class167/Code02_EightVerticalHorizontal1.java b/src/class167/Code02_EightVerticalHorizontal1.java new file mode 100644 index 000000000..06257d87e --- /dev/null +++ b/src/class167/Code02_EightVerticalHorizontal1.java @@ -0,0 +1,9 @@ +package class167; + +// 八纵八横 +// 测试链接 : https://www.luogu.com.cn/problem/P3733 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code02_EightVerticalHorizontal1 { + +} From 1a9a25b0729842e3afad4c8035f7b7b951e35a79 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 28 Apr 2025 11:47:28 +0800 Subject: [PATCH 0036/1170] modify code --- ...01_SmallSum.java => Code01_SmallSum1.java} | 4 +- src/class022/Code01_SmallSum2.java | 60 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) rename src/class022/{Code01_SmallSum.java => Code01_SmallSum1.java} (97%) create mode 100644 src/class022/Code01_SmallSum2.java diff --git a/src/class022/Code01_SmallSum.java b/src/class022/Code01_SmallSum1.java similarity index 97% rename from src/class022/Code01_SmallSum.java rename to src/class022/Code01_SmallSum1.java index f7a1d0ecc..0830a55b9 100644 --- a/src/class022/Code01_SmallSum.java +++ b/src/class022/Code01_SmallSum1.java @@ -1,6 +1,6 @@ package class022; -// 小和问题 +// 小和问题,java版 // 测试链接 : https://www.nowcoder.com/practice/edfe05a1d45c4ea89101d936cac32469 // 请同学们务必参考如下代码中关于输入、输出的处理 // 这是输入输出处理效率很高的写法 @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01_SmallSum { +public class Code01_SmallSum1 { public static int MAXN = 100001; diff --git a/src/class022/Code01_SmallSum2.java b/src/class022/Code01_SmallSum2.java new file mode 100644 index 000000000..66838103e --- /dev/null +++ b/src/class022/Code01_SmallSum2.java @@ -0,0 +1,60 @@ +package class022; + +// 小和问题,C++版 +// 测试链接 : https://www.nowcoder.com/practice/edfe05a1d45c4ea89101d936cac32469 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n; +// +//int arr[MAXN]; +//int help[MAXN]; +// +//long long merge(int l, int m, int r) { +// long long ans = 0; +// for (int j = m + 1, i = l, sum = 0; j <= r; j++) { +// while (i <= m && arr[i] <= arr[j]) { +// sum += arr[i++]; +// } +// ans += sum; +// } +// int i = l, a = l, b = m + 1; +// while (a <= m && b <= r) { +// help[i++] = (arr[a] <= arr[b] ? arr[a++] : arr[b++]); +// } +// while (a <= m) { +// help[i++] = arr[a++]; +// } +// while (b <= r) { +// help[i++] = arr[b++]; +// } +// for (i = l; i <= r; i++) { +// arr[i] = help[i]; +// } +// return ans; +//} +// +//long long smallSum(int l, int r) { +// if (l == r) { +// return 0; +// } +// int m = (l + r) >> 1; +// return smallSum(l, m) + smallSum(m + 1, r) + merge(l, m, r); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// while (cin >> n) { +// for (int i = 0; i < n; i++) { +// cin >> arr[i]; +// } +// cout << smallSum(0, n - 1) << '\n'; +// } +// return 0; +//} \ No newline at end of file From 2da4d66ea2fd202b5cd27a00cd52d5c51a5b314e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 28 Apr 2025 11:57:56 +0800 Subject: [PATCH 0037/1170] modify code --- src/class167/Code02_EightVerticalHorizontal1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class167/Code02_EightVerticalHorizontal1.java b/src/class167/Code02_EightVerticalHorizontal1.java index 06257d87e..bee657e1c 100644 --- a/src/class167/Code02_EightVerticalHorizontal1.java +++ b/src/class167/Code02_EightVerticalHorizontal1.java @@ -6,4 +6,4 @@ public class Code02_EightVerticalHorizontal1 { -} +} \ No newline at end of file From 2e1f5031ca748627185ab107244899727da8a833 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 29 Apr 2025 11:37:20 +0800 Subject: [PATCH 0038/1170] modify code --- src/class167/Code01_ShortestPathQueries1.java | 91 ++++++++++--------- src/class167/Code01_ShortestPathQueries2.java | 91 +++++++++++-------- .../Code02_EightVerticalHorizontal1.java | 9 -- 3 files changed, 99 insertions(+), 92 deletions(-) delete mode 100644 src/class167/Code02_EightVerticalHorizontal1.java diff --git a/src/class167/Code01_ShortestPathQueries1.java b/src/class167/Code01_ShortestPathQueries1.java index 76d746aaa..336855b0b 100644 --- a/src/class167/Code01_ShortestPathQueries1.java +++ b/src/class167/Code01_ShortestPathQueries1.java @@ -15,8 +15,7 @@ public class Code01_ShortestPathQueries1 { public static int MAXN = 200001; public static int MAXT = 5000001; - public static int BIT = 29; - public static int DEEP = 20; + public static int BIT = 30; public static int n, m, q; // 端点x、端点y、时间点t、边权w @@ -29,9 +28,10 @@ public class Code01_ShortestPathQueries1 { public static int[] y = new int[MAXN]; public static int[] d = new int[MAXN]; - // 异或空间线性基 - public static int[] basis = new int[BIT + 1]; - public static int[][] backup = new int[DEEP][BIT + 1]; + // 可撤销线性基 + public static int[] basis = new int[BIT]; + public static int[] inspos = new int[BIT]; + public static int basiz = 0; // 时间轴线段树上的区间任务列表 public static int[] head = new int[MAXN << 2]; @@ -53,10 +53,11 @@ public class Code01_ShortestPathQueries1 { // num插入线性基 public static void insert(int num) { - for (int i = BIT; i >= 0; i--) { + for (int i = BIT - 1; i >= 0; i--) { if (num >> i == 1) { if (basis[i] == 0) { basis[i] = num; + inspos[basiz++] = i; return; } num ^= basis[i]; @@ -66,16 +67,16 @@ public static void insert(int num) { // 根据线性基,返回num能结合出的最小异或和 public static int minEor(int num) { - for (int i = BIT; i >= 0; i--) { + for (int i = BIT - 1; i >= 0; i--) { num = Math.min(num, num ^ basis[i]); } return num; } - // a把b的内容拷贝过来,用于线性基的撤销 - public static void clone(int[] a, int[] b) { - for (int i = 0; i <= BIT; i++) { - a[i] = b[i]; + // 线性基的撤销,让空间大小回到之前的规模 + public static void cancel(int oldsiz) { + while (basiz > oldsiz) { + basis[inspos[--basiz]] = 0; } } @@ -100,36 +101,29 @@ public static int getEor(int i) { // 可撤销并查集的合并,增加a和b之间,权值为w的边 // 集合合并的过程中,还要更新eor数组 // 更新eor的方式,参考讲解156,带权并查集 - public static boolean union(int a, int b, int w) { - int eora = getEor(a); - int eorb = getEor(b); - int fa = find(a); - int fb = find(b); - w = eora ^ eorb ^ w; - if (fa == fb) { - insert(w); - return false; + public static void union(int u, int v, int w) { + int fu = find(u); + int fv = find(v); + w = getEor(u) ^ getEor(v) ^ w; + if (siz[fu] < siz[fv]) { + int tmp = fu; + fu = fv; + fv = tmp; } - if (siz[fa] < siz[fb]) { - int tmp = fa; - fa = fb; - fb = tmp; - } - father[fb] = fa; - siz[fa] += siz[fb]; - eor[fb] = w; - rollback[++opsize][0] = fa; - rollback[opsize][1] = fb; - return true; + father[fv] = fu; + siz[fu] += siz[fv]; + eor[fv] = w; + rollback[++opsize][0] = fu; + rollback[opsize][1] = fv; } // 并查集的撤销操作 public static void undo() { - int fa = rollback[opsize][0]; - int fb = rollback[opsize--][1]; - father[fb] = fb; - eor[fb] = 0; - siz[fa] -= siz[fb]; + int fx = rollback[opsize][0]; + int fy = rollback[opsize--][1]; + father[fy] = fy; + eor[fy] = 0; + siz[fx] -= siz[fy]; } // 给某个线段树区间增加任务,点x到点y之间,增加权值为w的边 @@ -155,11 +149,22 @@ public static void add(int jobl, int jobr, int jobx, int joby, int jobw, int l, } } - public static void dfs(int l, int r, int i, int dep) { - clone(backup[dep], basis); + public static void dfs(int l, int r, int i) { + int oldsiz = basiz; int unionCnt = 0; + int u, v, w, fu, fv, eoru, eorv; for (int e = head[i]; e > 0; e = next[e]) { - if (union(tox[e], toy[e], tow[e])) { + u = tox[e]; + v = toy[e]; + w = tow[e]; + fu = find(u); + fv = find(v); + eoru = getEor(u); + eorv = getEor(v); + if (fu == fv) { + insert(eoru ^ eorv ^ w); + } else { + union(u, v, w); unionCnt++; } } @@ -169,10 +174,10 @@ public static void dfs(int l, int r, int i, int dep) { } } else { int mid = (l + r) >> 1; - dfs(l, mid, i << 1, dep + 1); - dfs(mid + 1, r, i << 1 | 1, dep + 1); + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); } - clone(basis, backup[dep]); + cancel(oldsiz); for (int k = 1; k <= unionCnt; k++) { undo(); } @@ -229,7 +234,7 @@ public static void main(String[] args) throws IOException { } } prepare(); - dfs(0, q, 1, 0); + dfs(0, q, 1); for (int i = 1; i <= q; i++) { if (op[i] == 3) { out.println(ans[i]); diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code01_ShortestPathQueries2.java index 40825445f..3b8ccb5f2 100644 --- a/src/class167/Code01_ShortestPathQueries2.java +++ b/src/class167/Code01_ShortestPathQueries2.java @@ -26,8 +26,7 @@ // //const int MAXN = 200001; //const int MAXT = 5000001; -//const int BIT = 29; -//const int DEEP = 20; +//const int BIT = 30; //int n, m, q; // //Event event[MAXN << 1]; @@ -38,8 +37,9 @@ //int y[MAXN]; //int d[MAXN]; // -//int basis[BIT + 1]; -//int backup[DEEP][BIT + 1]; +//int basis[BIT]; +//int inspos[BIT]; +//int basiz = 0; // //int head[MAXN << 2]; //int nxt[MAXT]; @@ -51,16 +51,17 @@ //int father[MAXN]; //int siz[MAXN]; //int eor[MAXN]; -//int rollbackArr[MAXN][2]; +//int rollback[MAXN][2]; //int opsize = 0; // //int ans[MAXN]; // //void insert(int num) { -// for (int i = BIT; i >= 0; --i) { +// for (int i = BIT - 1; i >= 0; --i) { // if (num >> i == 1) { // if (basis[i] == 0) { // basis[i] = num; +// inspos[basiz++] = i; // return; // } // num ^= basis[i]; @@ -69,12 +70,18 @@ //} // //int minEor(int num) { -// for (int i = BIT; i >= 0; --i) { +// for (int i = BIT - 1; i >= 0; --i) { // num = min(num, num ^ basis[i]); // } // return num; //} // +//void cancel(int oldsiz) { +// while (basiz > oldsiz) { +// basis[inspos[--basiz]] = 0; +// } +//} +// //int find(int i) { // while (i != father[i]) { // i = father[i]; @@ -91,35 +98,28 @@ // return res; //} // -//bool Union(int a, int b, int w) { -// int eora = getEor(a); -// int eorb = getEor(b); -// int fa = find(a); -// int fb = find(b); -// w = eora ^ eorb ^ w; -// if (fa == fb) { -// insert(w); -// return false; -// } -// if (siz[fa] < siz[fb]) { -// int tmp = fa; -// fa = fb; -// fb = tmp; -// } -// father[fb] = fa; -// siz[fa] += siz[fb]; -// eor[fb] = w; -// rollbackArr[++opsize][0] = fa; -// rollbackArr[opsize][1] = fb; -// return true; +//void Union(int u, int v, int w) { +// int fu = find(u); +// int fv = find(v); +// w = getEor(u) ^ getEor(v) ^ w; +// if (siz[fu] < siz[fv]) { +// int tmp = fu; +// fu = fv; +// fv = tmp; +// } +// father[fv] = fu; +// siz[fu] += siz[fv]; +// eor[fv] = w; +// rollback[++opsize][0] = fu; +// rollback[opsize][1] = fv; //} // //void undo() { -// int fa = rollbackArr[opsize][0]; -// int fb = rollbackArr[opsize--][1]; -// father[fb] = fb; -// eor[fb] = 0; -// siz[fa] -= siz[fb]; +// int fu = rollback[opsize][0]; +// int fv = rollback[opsize--][1]; +// father[fv] = fv; +// eor[fv] = 0; +// siz[fu] -= siz[fv]; //} // //void addEdge(int idx, int u, int v, int w) { @@ -144,11 +144,22 @@ // } //} // -//void dfs(int l, int r, int i, int dep) { -// memcpy(backup[dep], basis, sizeof(backup[dep])); +//void dfs(int l, int r, int i) { +// int oldsiz = basiz; // int unionCnt = 0; +// int u, v, w, fu, fv, eoru, eorv; // for (int e = head[i]; e; e = nxt[e]) { -// if (Union(tox[e], toy[e], tow[e])) { +// u = tox[e]; +// v = toy[e]; +// w = tow[e]; +// fu = find(u); +// fv = find(v); +// eoru = getEor(u); +// eorv = getEor(v); +// if (fu == fv) { +// insert(eoru ^ eorv ^ w); +// } else { +// Union(u, v, w); // unionCnt++; // } // } @@ -158,10 +169,10 @@ // } // } else { // int mid = (l + r) >> 1; -// dfs(l, mid, i << 1, dep + 1); -// dfs(mid + 1, r, i << 1 | 1, dep + 1); +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); // } -// memcpy(basis, backup[dep], sizeof(basis)); +// cancel(oldsiz); // for (int k = 1; k <= unionCnt; k++) { // undo(); // } @@ -212,7 +223,7 @@ // } // } // prepare(); -// dfs(0, q, 1, 0); +// dfs(0, q, 1); // for (int i = 1; i <= q; i++) { // if (op[i] == 3) { // cout << ans[i] << '\n'; diff --git a/src/class167/Code02_EightVerticalHorizontal1.java b/src/class167/Code02_EightVerticalHorizontal1.java deleted file mode 100644 index bee657e1c..000000000 --- a/src/class167/Code02_EightVerticalHorizontal1.java +++ /dev/null @@ -1,9 +0,0 @@ -package class167; - -// 八纵八横 -// 测试链接 : https://www.luogu.com.cn/problem/P3733 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -public class Code02_EightVerticalHorizontal1 { - -} \ No newline at end of file From 7aad7737750c28ab139ea8749992d38cfafd260c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 29 Apr 2025 17:18:44 +0800 Subject: [PATCH 0039/1170] modify code --- src/class167/Code01_ShortestPathQueries1.java | 36 +- src/class167/Code01_ShortestPathQueries2.java | 34 +- .../Code02_EightVerticalHorizontal1.java | 382 ++++++++++++++++++ 3 files changed, 411 insertions(+), 41 deletions(-) create mode 100644 src/class167/Code02_EightVerticalHorizontal1.java diff --git a/src/class167/Code01_ShortestPathQueries1.java b/src/class167/Code01_ShortestPathQueries1.java index 336855b0b..56df48243 100644 --- a/src/class167/Code01_ShortestPathQueries1.java +++ b/src/class167/Code01_ShortestPathQueries1.java @@ -33,6 +33,13 @@ public class Code01_ShortestPathQueries1 { public static int[] inspos = new int[BIT]; public static int basiz = 0; + // 可撤销并查集 + 带权并查集 + public static int[] father = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] eor = new int[MAXN]; + public static int[][] rollback = new int[MAXN][2]; + public static int opsize = 0; + // 时间轴线段树上的区间任务列表 public static int[] head = new int[MAXN << 2]; public static int[] next = new int[MAXT]; @@ -41,13 +48,6 @@ public class Code01_ShortestPathQueries1 { public static int[] tow = new int[MAXT]; public static int cnt = 0; - // 可撤销并查集 + 带权并查集 - public static int[] father = new int[MAXN]; - public static int[] siz = new int[MAXN]; - public static int[] eor = new int[MAXN]; - public static int[][] rollback = new int[MAXN][2]; - public static int opsize = 0; - // 查询操作的答案 public static int[] ans = new int[MAXN]; @@ -65,7 +65,7 @@ public static void insert(int num) { } } - // 根据线性基,返回num能结合出的最小异或和 + // num结合线性基,能得到的最小异或值返回 public static int minEor(int num) { for (int i = BIT - 1; i >= 0; i--) { num = Math.min(num, num ^ basis[i]); @@ -101,10 +101,14 @@ public static int getEor(int i) { // 可撤销并查集的合并,增加a和b之间,权值为w的边 // 集合合并的过程中,还要更新eor数组 // 更新eor的方式,参考讲解156,带权并查集 - public static void union(int u, int v, int w) { + public static boolean union(int u, int v, int w) { int fu = find(u); int fv = find(v); w = getEor(u) ^ getEor(v) ^ w; + if (fu == fv) { + insert(w); + return false; + } if (siz[fu] < siz[fv]) { int tmp = fu; fu = fv; @@ -115,6 +119,7 @@ public static void union(int u, int v, int w) { eor[fv] = w; rollback[++opsize][0] = fu; rollback[opsize][1] = fv; + return true; } // 并查集的撤销操作 @@ -152,19 +157,8 @@ public static void add(int jobl, int jobr, int jobx, int joby, int jobw, int l, public static void dfs(int l, int r, int i) { int oldsiz = basiz; int unionCnt = 0; - int u, v, w, fu, fv, eoru, eorv; for (int e = head[i]; e > 0; e = next[e]) { - u = tox[e]; - v = toy[e]; - w = tow[e]; - fu = find(u); - fv = find(v); - eoru = getEor(u); - eorv = getEor(v); - if (fu == fv) { - insert(eoru ^ eorv ^ w); - } else { - union(u, v, w); + if (union(tox[e], toy[e], tow[e])) { unionCnt++; } } diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code01_ShortestPathQueries2.java index 3b8ccb5f2..003e5b229 100644 --- a/src/class167/Code01_ShortestPathQueries2.java +++ b/src/class167/Code01_ShortestPathQueries2.java @@ -41,6 +41,12 @@ //int inspos[BIT]; //int basiz = 0; // +//int father[MAXN]; +//int siz[MAXN]; +//int eor[MAXN]; +//int rollback[MAXN][2]; +//int opsize = 0; +// //int head[MAXN << 2]; //int nxt[MAXT]; //int tox[MAXT]; @@ -48,12 +54,6 @@ //int tow[MAXT]; //int cnt = 0; // -//int father[MAXN]; -//int siz[MAXN]; -//int eor[MAXN]; -//int rollback[MAXN][2]; -//int opsize = 0; -// //int ans[MAXN]; // //void insert(int num) { @@ -98,10 +98,14 @@ // return res; //} // -//void Union(int u, int v, int w) { +//bool Union(int u, int v, int w) { // int fu = find(u); // int fv = find(v); // w = getEor(u) ^ getEor(v) ^ w; +// if (fu == fv) { +// insert(w); +// return false; +// } // if (siz[fu] < siz[fv]) { // int tmp = fu; // fu = fv; @@ -112,6 +116,7 @@ // eor[fv] = w; // rollback[++opsize][0] = fu; // rollback[opsize][1] = fv; +// return true; //} // //void undo() { @@ -147,25 +152,14 @@ //void dfs(int l, int r, int i) { // int oldsiz = basiz; // int unionCnt = 0; -// int u, v, w, fu, fv, eoru, eorv; // for (int e = head[i]; e; e = nxt[e]) { -// u = tox[e]; -// v = toy[e]; -// w = tow[e]; -// fu = find(u); -// fv = find(v); -// eoru = getEor(u); -// eorv = getEor(v); -// if (fu == fv) { -// insert(eoru ^ eorv ^ w); -// } else { -// Union(u, v, w); +// if (Union(tox[e], toy[e], tow[e])) { // unionCnt++; // } // } // if (l == r) { // if (op[l] == 3) { -// ans[l] = minEor(getEor(x[l]) ^ getEor(y[l])); +// ans[l] = minEor(getEor(x[l]) ^ getEor(y[l])); // } // } else { // int mid = (l + r) >> 1; diff --git a/src/class167/Code02_EightVerticalHorizontal1.java b/src/class167/Code02_EightVerticalHorizontal1.java new file mode 100644 index 000000000..487df775a --- /dev/null +++ b/src/class167/Code02_EightVerticalHorizontal1.java @@ -0,0 +1,382 @@ +package class167; + +// 八纵八横,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3733 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code02_EightVerticalHorizontal1 { + + // 位图 + static class BitSet { + + public int len; + + public int[] arr; + + public BitSet(int size) { + len = (size + 31) / 32; + arr = new int[len]; + } + + public BitSet(String s, int size) { + len = (size + 31) / 32; + arr = new int[len]; + for (int i = 0, j = s.length() - 1; i < s.length(); i++, j--) { + set(i, s.charAt(j) - '0'); + } + } + + // 返回第i位的状态 + public int get(int i) { + return (arr[i / 32] >> (i % 32)) & 1; + } + + // 设置第i位的状态 + public void set(int i, int v) { + if (v == 0) { + arr[i / 32] &= ~(1 << (i % 32)); + } else { + arr[i / 32] |= 1 << (i % 32); + } + } + + // 拷贝other每一位 + public void copy(BitSet other) { + for (int i = 0; i < len; i++) { + arr[i] = other.arr[i]; + } + } + + // 异或other每一位 + public void eor(BitSet other) { + for (int i = 0; i < len; i++) { + arr[i] ^= other.arr[i]; + } + } + + // 清空每一位 + public void clear() { + for (int i = 0; i < len; i++) { + arr[i] = 0; + } + } + + } + + public static int MAXN = 501; + public static int MAXQ = 1001; + public static int MAXT = 10001; + public static int BIT = 1000; + public static int n, m, q; + + // 记录每条操作 + public static int[] x = new int[MAXQ]; + public static int[] y = new int[MAXQ]; + public static BitSet[] w = new BitSet[MAXQ]; + public static int edgeCnt = 0; + public static int[] last = new int[MAXQ]; + + // 可撤销线性基 + public static BitSet[] basis = new BitSet[BIT]; + public static int[] inspos = new int[BIT]; + public static int basiz = 0; + + // 可撤销并查集 + 带权并查集 + public static int[] father = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static BitSet[] eor = new BitSet[MAXN]; + public static int[][] rollback = new int[MAXT][2]; + public static int opsize = 0; + + // 时间轴线段树上的区间任务列表 + public static int[] head = new int[MAXQ << 2]; + public static int[] next = new int[MAXT]; + public static int[] tox = new int[MAXT]; + public static int[] toy = new int[MAXT]; + public static BitSet[] tow = new BitSet[MAXT]; + public static int cnt = 0; + + // 每一步的最大异或值 + public static BitSet[] ans = new BitSet[MAXQ]; + + public static void insert(BitSet num) { + for (int i = BIT - 1; i >= 0; i--) { + if (num.get(i) == 1) { + if (basis[i].get(i) == 0) { + basis[i].copy(num); + inspos[basiz++] = i; + return; + } + num.eor(basis[i]); + } + } + } + + // 0这个数字结合线性基,得到的最大异或值返回 + public static BitSet maxEor() { + BitSet ans = new BitSet(BIT); + for (int i = BIT - 1; i >= 0; i--) { + if (ans.get(i) == 0 && basis[i].get(i) == 1) { + ans.eor(basis[i]); + } + } + return ans; + } + + public static void cancel(int oldsiz) { + while (basiz > oldsiz) { + basis[inspos[--basiz]].clear(); + } + } + + public static int find(int i) { + while (i != father[i]) { + i = father[i]; + } + return i; + } + + public static BitSet getEor(int i) { + BitSet ans = new BitSet(BIT); + while (i != father[i]) { + ans.eor(eor[i]); + i = father[i]; + } + return ans; + } + + public static boolean union(int u, int v, BitSet w) { + int fu = find(u); + int fv = find(v); + BitSet weight = new BitSet(BIT); + weight.eor(getEor(u)); + weight.eor(getEor(v)); + weight.eor(w); + if (fu == fv) { + insert(weight); + return false; + } + if (siz[fu] < siz[fv]) { + int tmp = fu; + fu = fv; + fv = tmp; + } + father[fv] = fu; + siz[fu] += siz[fv]; + eor[fv].copy(weight); + rollback[++opsize][0] = fu; + rollback[opsize][1] = fv; + return true; + } + + public static void undo() { + int fx = rollback[opsize][0]; + int fy = rollback[opsize--][1]; + father[fy] = fy; + eor[fy].clear(); + siz[fx] -= siz[fy]; + } + + public static void addEdge(int i, int x, int y, BitSet w) { + next[++cnt] = head[i]; + tox[cnt] = x; + toy[cnt] = y; + tow[cnt] = w; + head[i] = cnt; + } + + public static void add(int jobl, int jobr, int jobx, int joby, BitSet jobw, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdge(i, jobx, joby, jobw); + } else { + int mid = (l + r) >> 1; + if (jobl <= mid) { + add(jobl, jobr, jobx, joby, jobw, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobx, joby, jobw, mid + 1, r, i << 1 | 1); + } + } + } + + public static void dfs(int l, int r, int i) { + int oldsiz = basiz; + int unionCnt = 0; + for (int e = head[i]; e > 0; e = next[e]) { + if (union(tox[e], toy[e], tow[e])) { + unionCnt++; + } + } + if (l == r) { + ans[l] = maxEor(); + } else { + int mid = (l + r) / 2; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); + } + cancel(oldsiz); + for (int k = 1; k <= unionCnt; k++) { + undo(); + } + } + + public static void print(BitSet bs, PrintWriter out) { + boolean flag = false; + for (int i = BIT - 1, s; i >= 0; i--) { + s = bs.get(i); + if (s == 1) { + flag = true; + } + if (flag) { + out.print(s); + } + } + if (!flag) { + out.print(0); + } + out.println(); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + q = in.nextInt(); + for (int i = 0; i < BIT; i++) { + basis[i] = new BitSet(BIT); + } + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + eor[i] = new BitSet(BIT); + } + for (int i = 1; i <= m; i++) { + int u = in.nextInt(); + int v = in.nextInt(); + BitSet w = new BitSet(in.nextString(), BIT); + union(u, v, w); + } + ans[0] = maxEor(); + String op; + for (int i = 1; i <= q; i++) { + op = in.nextString(); + if (op.equals("Add")) { + edgeCnt++; + x[edgeCnt] = in.nextInt(); + y[edgeCnt] = in.nextInt(); + w[edgeCnt] = new BitSet(in.nextString(), BIT); + last[edgeCnt] = i; + } else if (op.equals("Cancel")) { + int k = in.nextInt(); + add(last[k], i - 1, x[k], y[k], w[k], 1, q, 1); + last[k] = 0; + } else { + int k = in.nextInt(); + add(last[k], i - 1, x[k], y[k], w[k], 1, q, 1); + w[k] = new BitSet(in.nextString(), BIT); + last[k] = i; + } + } + for (int i = 1; i <= edgeCnt; i++) { + if (last[i] != 0) { + add(last[i], q, x[i], y[i], w[i], 1, q, 1); + } + } + if (q > 0) { + dfs(1, q, 1); + } + for (int i = 0; i <= q; i++) { + print(ans[i], out); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private static final int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) { + return true; + } + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) { + return -1; + } + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) { + return 0; + } + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) { + b = readByte(); + } + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + public String nextString() throws IOException { + byte b = readByte(); + while (isWhitespace(b)) { + b = readByte(); + } + StringBuilder sb = new StringBuilder(1000); + while (!isWhitespace(b) && b != -1) { + sb.append((char) b); + b = readByte(); + } + return sb.toString(); + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} \ No newline at end of file From e3d49dbd5af508a21eaed3d5f0e7a1ae76c58d2a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 29 Apr 2025 18:18:52 +0800 Subject: [PATCH 0040/1170] modify code --- .../Code02_EightVerticalHorizontal2.java | 276 ++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100644 src/class167/Code02_EightVerticalHorizontal2.java diff --git a/src/class167/Code02_EightVerticalHorizontal2.java b/src/class167/Code02_EightVerticalHorizontal2.java new file mode 100644 index 000000000..44996eda4 --- /dev/null +++ b/src/class167/Code02_EightVerticalHorizontal2.java @@ -0,0 +1,276 @@ +package class167; + +// 八纵八横,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3733 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct BitSet { +// int len; +// vector arr; +// +// BitSet(int size = 0) { +// len = (size + 31) / 32; +// arr.assign(len, 0); +// } +// +// BitSet(const string& s, int size) { +// len = (size + 31) / 32; +// arr.assign(len, 0); +// for (int i = 0, j = (int)s.size() - 1; i < (int)s.size(); i++, j--) { +// set(i, s[j] - '0'); +// } +// } +// +// int get(int i) const { +// return (arr[i / 32] >> (i % 32)) & 1; +// } +// +// void set(int i, int v) { +// if (v) { +// arr[i / 32] |= 1 << (i % 32); +// } else { +// arr[i / 32] &= ~(1 << (i % 32)); +// } +// } +// +// void copy(const BitSet& other) { +// arr = other.arr; +// } +// +// void eor(const BitSet& other) { +// for (int i = 0; i < len; i++) { +// arr[i] ^= other.arr[i]; +// } +// } +// +// void clear() { +// fill(arr.begin(), arr.end(), 0); +// } +//}; +// +//const int MAXN = 501; +//const int MAXQ = 1001; +//const int MAXT = 10001; +//const int BIT = 1000; +// +//int n, m, q; +//int x[MAXQ]; +//int y[MAXQ]; +//BitSet w[MAXQ]; +//int edgeCnt = 0; +//int last[MAXQ]; +// +//BitSet basis[BIT]; +//int inspos[BIT]; +//int basiz = 0; +// +//int father[MAXN]; +//int siz[MAXN]; +//BitSet eor[MAXN]; +//int rollback[MAXT][2]; +//int opsize = 0; +// +//int head[MAXQ << 2]; +//int nxt[MAXT]; +//int tox[MAXT]; +//int toy[MAXT]; +//BitSet tow[MAXT]; +//int cnt = 0; +// +//BitSet ans[MAXQ]; +// +//void insert(BitSet num) { +// for (int i = BIT - 1; i >= 0; i--) { +// if (num.get(i)) { +// if (basis[i].get(i) == 0) { +// basis[i].copy(num); +// inspos[basiz++] = i; +// return; +// } +// num.eor(basis[i]); +// } +// } +//} +// +//BitSet maxEor() { +// BitSet res(BIT); +// for (int i = BIT - 1; i >= 0; i--) { +// if (res.get(i) == 0 && basis[i].get(i) == 1) { +// res.eor(basis[i]); +// } +// } +// return res; +//} +// +//void cancel(int oldsiz) { +// while (basiz > oldsiz) { +// basis[inspos[--basiz]].clear(); +// } +//} +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//BitSet getEor(int i) { +// BitSet res(BIT); +// while (i != father[i]) { +// res.eor(eor[i]); +// i = father[i]; +// } +// return res; +//} +// +//bool Union(int u, int v, const BitSet& w) { +// int fu = find(u), fv = find(v); +// BitSet weight(BIT); +// weight.eor(getEor(u)); +// weight.eor(getEor(v)); +// weight.eor(w); +// if (fu == fv) { +// insert(weight); +// return false; +// } +// if (siz[fu] < siz[fv]) { +// int tmp = fu; +// fu = fv; +// fv = tmp; +// } +// father[fv] = fu; +// siz[fu] += siz[fv]; +// eor[fv].copy(weight); +// rollback[++opsize][0] = fu; +// rollback[opsize][1] = fv; +// return true; +//} +// +//void undo() { +// int fu = rollback[opsize][0]; +// int fv = rollback[opsize--][1]; +// father[fv] = fv; +// eor[fv].clear(); +// siz[fu] -= siz[fv]; +//} +// +//void addEdge(int i, int u, int v, const BitSet& w) { +// nxt[++cnt] = head[i]; +// tox[cnt] = u; +// toy[cnt] = v; +// tow[cnt].copy(w); +// head[i] = cnt; +//} +// +//void add(int jobl, int jobr, int jobx, int joby, const BitSet& jobw, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobx, joby, jobw); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobx, joby, jobw, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobx, joby, jobw, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i) { +// int oldsiz = basiz; +// int unionCnt = 0; +// for (int e = head[i]; e > 0; e = nxt[e]) { +// if (Union(tox[e], toy[e], tow[e])) { +// unionCnt++; +// } +// } +// if (l == r) { +// ans[l] = maxEor(); +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// cancel(oldsiz); +// for (int k = 1; k <= unionCnt; k++) { +// undo(); +// } +//} +// +//void print(const BitSet& bs) { +// bool flag = false; +// for (int i = BIT - 1, s; i >= 0; i--) { +// s = bs.get(i); +// if (s == 1) { +// flag = true; +// } +// if (flag) { +// cout << s; +// } +// } +// if (!flag) { +// cout << '0'; +// } +// cout << '\n'; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> q; +// for (int i = 0; i < BIT; i++) { +// basis[i] = BitSet(BIT); +// } +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// eor[i] = BitSet(BIT); +// } +// int u, v; +// string str; +// for (int i = 1; i <= m; i++) { +// cin >> u >> v >> str; +// Union(u, v, BitSet(str, BIT)); +// } +// ans[0] = maxEor(); +// string op; +// int k; +// for (int i = 1; i <= q; i++) { +// cin >> op; +// if (op == "Add") { +// ++edgeCnt; +// cin >> x[edgeCnt] >> y[edgeCnt]; +// cin >> str; +// w[edgeCnt] = BitSet(str, BIT); +// last[edgeCnt] = i; +// } else if (op == "Cancel") { +// cin >> k; +// add(last[k], i - 1, x[k], y[k], w[k], 1, q, 1); +// last[k] = 0; +// } else { +// cin >> k; +// add(last[k], i - 1, x[k], y[k], w[k], 1, q, 1); +// cin >> str; +// w[k] = BitSet(str, BIT); +// last[k] = i; +// } +// } +// for (int i = 1; i <= edgeCnt; i++) { +// if (last[i] > 0) { +// add(last[i], q, x[i], y[i], w[i], 1, q, 1); +// } +// } +// if (q > 0) { +// dfs(1, q, 1); +// } +// for (int i = 0; i <= q; i++) { +// print(ans[i]); +// } +// return 0; +//} \ No newline at end of file From b001292550d38764027f32f9fa931d04da689bd1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 30 Apr 2025 12:07:39 +0800 Subject: [PATCH 0041/1170] modify code --- src/class167/Code01_ShortestPathQueries1.java | 10 ++--- src/class167/Code01_ShortestPathQueries2.java | 10 ++--- .../Code02_EightVerticalHorizontal1.java | 38 ++++++++--------- .../Code02_EightVerticalHorizontal2.java | 41 ++++++++++--------- 4 files changed, 50 insertions(+), 49 deletions(-) diff --git a/src/class167/Code01_ShortestPathQueries1.java b/src/class167/Code01_ShortestPathQueries1.java index 56df48243..e85069f8e 100644 --- a/src/class167/Code01_ShortestPathQueries1.java +++ b/src/class167/Code01_ShortestPathQueries1.java @@ -15,7 +15,7 @@ public class Code01_ShortestPathQueries1 { public static int MAXN = 200001; public static int MAXT = 5000001; - public static int BIT = 30; + public static int BIT = 29; public static int n, m, q; // 端点x、端点y、时间点t、边权w @@ -29,8 +29,8 @@ public class Code01_ShortestPathQueries1 { public static int[] d = new int[MAXN]; // 可撤销线性基 - public static int[] basis = new int[BIT]; - public static int[] inspos = new int[BIT]; + public static int[] basis = new int[BIT + 1]; + public static int[] inspos = new int[BIT + 1]; public static int basiz = 0; // 可撤销并查集 + 带权并查集 @@ -53,7 +53,7 @@ public class Code01_ShortestPathQueries1 { // num插入线性基 public static void insert(int num) { - for (int i = BIT - 1; i >= 0; i--) { + for (int i = BIT; i >= 0; i--) { if (num >> i == 1) { if (basis[i] == 0) { basis[i] = num; @@ -67,7 +67,7 @@ public static void insert(int num) { // num结合线性基,能得到的最小异或值返回 public static int minEor(int num) { - for (int i = BIT - 1; i >= 0; i--) { + for (int i = BIT; i >= 0; i--) { num = Math.min(num, num ^ basis[i]); } return num; diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code01_ShortestPathQueries2.java index 003e5b229..f99f9ef4f 100644 --- a/src/class167/Code01_ShortestPathQueries2.java +++ b/src/class167/Code01_ShortestPathQueries2.java @@ -26,7 +26,7 @@ // //const int MAXN = 200001; //const int MAXT = 5000001; -//const int BIT = 30; +//const int BIT = 29; //int n, m, q; // //Event event[MAXN << 1]; @@ -37,8 +37,8 @@ //int y[MAXN]; //int d[MAXN]; // -//int basis[BIT]; -//int inspos[BIT]; +//int basis[BIT + 1]; +//int inspos[BIT + 1]; //int basiz = 0; // //int father[MAXN]; @@ -57,7 +57,7 @@ //int ans[MAXN]; // //void insert(int num) { -// for (int i = BIT - 1; i >= 0; --i) { +// for (int i = BIT; i >= 0; --i) { // if (num >> i == 1) { // if (basis[i] == 0) { // basis[i] = num; @@ -70,7 +70,7 @@ //} // //int minEor(int num) { -// for (int i = BIT - 1; i >= 0; --i) { +// for (int i = BIT; i >= 0; --i) { // num = min(num, num ^ basis[i]); // } // return num; diff --git a/src/class167/Code02_EightVerticalHorizontal1.java b/src/class167/Code02_EightVerticalHorizontal1.java index 487df775a..ba2398bad 100644 --- a/src/class167/Code02_EightVerticalHorizontal1.java +++ b/src/class167/Code02_EightVerticalHorizontal1.java @@ -18,13 +18,13 @@ static class BitSet { public int[] arr; - public BitSet(int size) { - len = (size + 31) / 32; + public BitSet() { + len = (1000 + 31) / 32; arr = new int[len]; } - public BitSet(String s, int size) { - len = (size + 31) / 32; + public BitSet(String s) { + len = (1000 + 31) / 32; arr = new int[len]; for (int i = 0, j = s.length() - 1; i < s.length(); i++, j--) { set(i, s.charAt(j) - '0'); @@ -71,7 +71,7 @@ public void clear() { public static int MAXN = 501; public static int MAXQ = 1001; public static int MAXT = 10001; - public static int BIT = 1000; + public static int BIT = 999; public static int n, m, q; // 记录每条操作 @@ -82,8 +82,8 @@ public void clear() { public static int[] last = new int[MAXQ]; // 可撤销线性基 - public static BitSet[] basis = new BitSet[BIT]; - public static int[] inspos = new int[BIT]; + public static BitSet[] basis = new BitSet[BIT + 1]; + public static int[] inspos = new int[BIT + 1]; public static int basiz = 0; // 可撤销并查集 + 带权并查集 @@ -105,7 +105,7 @@ public void clear() { public static BitSet[] ans = new BitSet[MAXQ]; public static void insert(BitSet num) { - for (int i = BIT - 1; i >= 0; i--) { + for (int i = BIT; i >= 0; i--) { if (num.get(i) == 1) { if (basis[i].get(i) == 0) { basis[i].copy(num); @@ -119,8 +119,8 @@ public static void insert(BitSet num) { // 0这个数字结合线性基,得到的最大异或值返回 public static BitSet maxEor() { - BitSet ans = new BitSet(BIT); - for (int i = BIT - 1; i >= 0; i--) { + BitSet ans = new BitSet(); + for (int i = BIT; i >= 0; i--) { if (ans.get(i) == 0 && basis[i].get(i) == 1) { ans.eor(basis[i]); } @@ -142,7 +142,7 @@ public static int find(int i) { } public static BitSet getEor(int i) { - BitSet ans = new BitSet(BIT); + BitSet ans = new BitSet(); while (i != father[i]) { ans.eor(eor[i]); i = father[i]; @@ -153,7 +153,7 @@ public static BitSet getEor(int i) { public static boolean union(int u, int v, BitSet w) { int fu = find(u); int fv = find(v); - BitSet weight = new BitSet(BIT); + BitSet weight = new BitSet(); weight.eor(getEor(u)); weight.eor(getEor(v)); weight.eor(w); @@ -227,7 +227,7 @@ public static void dfs(int l, int r, int i) { public static void print(BitSet bs, PrintWriter out) { boolean flag = false; - for (int i = BIT - 1, s; i >= 0; i--) { + for (int i = BIT, s; i >= 0; i--) { s = bs.get(i); if (s == 1) { flag = true; @@ -248,18 +248,18 @@ public static void main(String[] args) throws IOException { n = in.nextInt(); m = in.nextInt(); q = in.nextInt(); - for (int i = 0; i < BIT; i++) { - basis[i] = new BitSet(BIT); + for (int i = 0; i <= BIT; i++) { + basis[i] = new BitSet(); } for (int i = 1; i <= n; i++) { father[i] = i; siz[i] = 1; - eor[i] = new BitSet(BIT); + eor[i] = new BitSet(); } for (int i = 1; i <= m; i++) { int u = in.nextInt(); int v = in.nextInt(); - BitSet w = new BitSet(in.nextString(), BIT); + BitSet w = new BitSet(in.nextString()); union(u, v, w); } ans[0] = maxEor(); @@ -270,7 +270,7 @@ public static void main(String[] args) throws IOException { edgeCnt++; x[edgeCnt] = in.nextInt(); y[edgeCnt] = in.nextInt(); - w[edgeCnt] = new BitSet(in.nextString(), BIT); + w[edgeCnt] = new BitSet(in.nextString()); last[edgeCnt] = i; } else if (op.equals("Cancel")) { int k = in.nextInt(); @@ -279,7 +279,7 @@ public static void main(String[] args) throws IOException { } else { int k = in.nextInt(); add(last[k], i - 1, x[k], y[k], w[k], 1, q, 1); - w[k] = new BitSet(in.nextString(), BIT); + w[k] = new BitSet(in.nextString()); last[k] = i; } } diff --git a/src/class167/Code02_EightVerticalHorizontal2.java b/src/class167/Code02_EightVerticalHorizontal2.java index 44996eda4..4335a3d7c 100644 --- a/src/class167/Code02_EightVerticalHorizontal2.java +++ b/src/class167/Code02_EightVerticalHorizontal2.java @@ -13,13 +13,13 @@ // int len; // vector arr; // -// BitSet(int size = 0) { -// len = (size + 31) / 32; +// BitSet() { +// len = (1000 + 31) / 32; // arr.assign(len, 0); // } // -// BitSet(const string& s, int size) { -// len = (size + 31) / 32; +// BitSet(const string& s) { +// len = (1000 + 31) / 32; // arr.assign(len, 0); // for (int i = 0, j = (int)s.size() - 1; i < (int)s.size(); i++, j--) { // set(i, s[j] - '0'); @@ -56,7 +56,7 @@ //const int MAXN = 501; //const int MAXQ = 1001; //const int MAXT = 10001; -//const int BIT = 1000; +//const int BIT = 999; // //int n, m, q; //int x[MAXQ]; @@ -65,8 +65,8 @@ //int edgeCnt = 0; //int last[MAXQ]; // -//BitSet basis[BIT]; -//int inspos[BIT]; +//BitSet basis[BIT + 1]; +//int inspos[BIT + 1]; //int basiz = 0; // //int father[MAXN]; @@ -85,7 +85,7 @@ //BitSet ans[MAXQ]; // //void insert(BitSet num) { -// for (int i = BIT - 1; i >= 0; i--) { +// for (int i = BIT; i >= 0; i--) { // if (num.get(i)) { // if (basis[i].get(i) == 0) { // basis[i].copy(num); @@ -98,8 +98,8 @@ //} // //BitSet maxEor() { -// BitSet res(BIT); -// for (int i = BIT - 1; i >= 0; i--) { +// BitSet res = BitSet(); +// for (int i = BIT; i >= 0; i--) { // if (res.get(i) == 0 && basis[i].get(i) == 1) { // res.eor(basis[i]); // } @@ -121,7 +121,7 @@ //} // //BitSet getEor(int i) { -// BitSet res(BIT); +// BitSet res = BitSet(); // while (i != father[i]) { // res.eor(eor[i]); // i = father[i]; @@ -130,8 +130,9 @@ //} // //bool Union(int u, int v, const BitSet& w) { -// int fu = find(u), fv = find(v); -// BitSet weight(BIT); +// int fu = find(u); +// int fv = find(v); +// BitSet weight = BitSet(); // weight.eor(getEor(u)); // weight.eor(getEor(v)); // weight.eor(w); @@ -205,7 +206,7 @@ // //void print(const BitSet& bs) { // bool flag = false; -// for (int i = BIT - 1, s; i >= 0; i--) { +// for (int i = BIT, s; i >= 0; i--) { // s = bs.get(i); // if (s == 1) { // flag = true; @@ -224,19 +225,19 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m >> q; -// for (int i = 0; i < BIT; i++) { -// basis[i] = BitSet(BIT); +// for (int i = 0; i <= BIT; i++) { +// basis[i] = BitSet(); // } // for (int i = 1; i <= n; i++) { // father[i] = i; // siz[i] = 1; -// eor[i] = BitSet(BIT); +// eor[i] = BitSet(); // } // int u, v; // string str; // for (int i = 1; i <= m; i++) { // cin >> u >> v >> str; -// Union(u, v, BitSet(str, BIT)); +// Union(u, v, BitSet(str)); // } // ans[0] = maxEor(); // string op; @@ -247,7 +248,7 @@ // ++edgeCnt; // cin >> x[edgeCnt] >> y[edgeCnt]; // cin >> str; -// w[edgeCnt] = BitSet(str, BIT); +// w[edgeCnt] = BitSet(str); // last[edgeCnt] = i; // } else if (op == "Cancel") { // cin >> k; @@ -257,7 +258,7 @@ // cin >> k; // add(last[k], i - 1, x[k], y[k], w[k], 1, q, 1); // cin >> str; -// w[k] = BitSet(str, BIT); +// w[k] = BitSet(str); // last[k] = i; // } // } From 98ebfdb545841f7db6ab2a4e75e23a25b8767400 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 1 May 2025 01:13:28 +0800 Subject: [PATCH 0042/1170] modify code --- src/class167/Code04_MarsStore1.java | 288 ++++++++++++++++++++++++++++ src/class167/Code04_MarsStore2.java | 221 +++++++++++++++++++++ 2 files changed, 509 insertions(+) create mode 100644 src/class167/Code04_MarsStore1.java create mode 100644 src/class167/Code04_MarsStore2.java diff --git a/src/class167/Code04_MarsStore1.java b/src/class167/Code04_MarsStore1.java new file mode 100644 index 000000000..3a46fb0cd --- /dev/null +++ b/src/class167/Code04_MarsStore1.java @@ -0,0 +1,288 @@ +package class167; + +// 火星商店,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4585 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code04_MarsStore1 { + + public static int MAXN = 100001; + public static int MAXP = MAXN * 20; + public static int MAXT = 1000001; + public static int BIT = 16; + public static int n, m, t; + + public static int[] arr = new int[MAXN]; + public static int[] op = new int[MAXN]; + public static int[] s = new int[MAXN]; + public static int[] v = new int[MAXN]; + public static int[] sl = new int[MAXN]; + public static int[] sr = new int[MAXN]; + public static int[] x = new int[MAXN]; + public static int[] d = new int[MAXN]; + public static int[] tim = new int[MAXN]; + + public static int[] root = new int[MAXN]; + public static int[][] tree = new int[MAXP][2]; + public static int[] pass = new int[MAXP]; + public static int cntt = 0; + + public static int[] headp = new int[MAXN << 2]; + public static int[] nextp = new int[MAXT]; + public static int[] pid = new int[MAXT]; + public static int cntp = 0; + + public static int[] headb = new int[MAXN << 2]; + public static int[] nextb = new int[MAXT]; + public static int[] bid = new int[MAXT]; + public static int cntb = 0; + + public static int[][] product = new int[MAXN][2]; + public static int[] ans = new int[MAXN]; + + public static int insert(int num, int i) { + int rt = ++cntt; + tree[rt][0] = tree[i][0]; + tree[rt][1] = tree[i][1]; + pass[rt] = pass[i] + 1; + for (int b = BIT, path, pre = rt, cur; b >= 0; b--, pre = cur) { + path = (num >> b) & 1; + i = tree[i][path]; + cur = ++cntt; + tree[cur][0] = tree[i][0]; + tree[cur][1] = tree[i][1]; + pass[cur] = pass[i] + 1; + tree[pre][path] = cur; + } + return rt; + } + + public static int query(int num, int u, int v) { + int ans = 0; + for (int b = BIT, path, best; b >= 0; b--) { + path = (num >> b) & 1; + best = path ^ 1; + if (pass[tree[v][best]] > pass[tree[u][best]]) { + ans += 1 << b; + u = tree[u][best]; + v = tree[v][best]; + } else { + u = tree[u][path]; + v = tree[v][path]; + } + } + return ans; + } + + public static void addInfoP(int i, int pi) { + nextp[++cntp] = headp[i]; + pid[cntp] = pi; + headp[i] = cntp; + } + + public static void addInfoB(int i, int bi) { + nextb[++cntb] = headb[i]; + bid[cntb] = bi; + headb[i] = cntb; + } + + public static void addProduct(int jobi, int pi, int l, int r, int i) { + addInfoP(i, pi); + if (l < r) { + int mid = (l + r) >> 1; + if (jobi <= mid) { + addProduct(jobi, pi, l, mid, i << 1); + } else { + addProduct(jobi, pi, mid + 1, r, i << 1 | 1); + } + } + } + + public static void addBuy(int jobl, int jobr, int bi, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addInfoB(i, bi); + } else { + int mid = (l + r) / 2; + if (jobl <= mid) { + addBuy(jobl, jobr, bi, l, mid, i << 1); + } + if (jobr > mid) { + addBuy(jobl, jobr, bi, mid + 1, r, i << 1 | 1); + } + } + } + + public static int lower(int size, int num) { + int l = 1, r = size, ans = size + 1; + while (l <= r) { + int mid = (l + r) >> 1; + if (product[mid][0] >= num) { + ans = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + return ans; + } + + public static int upper(int size, int num) { + int l = 1, r = size, ans = 0; + while (l <= r) { + int mid = (l + r) >> 1; + if (product[mid][0] <= num) { + ans = mid; + l = mid + 1; + } else { + r = mid - 1; + } + } + return ans; + } + + public static void dfs(int l, int r, int i) { + int pcnt = 0; + for (int e = headp[i]; e > 0; e = nextp[e]) { + product[++pcnt][0] = s[pid[e]]; + product[pcnt][1] = v[pid[e]]; + } + Arrays.sort(product, 1, pcnt + 1, (a, b) -> a[0] - b[0]); + cntt = 0; + for (int k = 1; k <= pcnt; k++) { + root[k] = insert(product[k][1], root[k - 1]); + } + for (int e = headb[i], id, pre, post; e > 0; e = nextb[e]) { + id = bid[e]; + pre = lower(pcnt, sl[id]) - 1; + post = upper(pcnt, sr[id]); + ans[id] = Math.max(ans[id], query(x[id], root[pre], root[post])); + } + if (l < r) { + int mid = (l + r) >> 1; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + root[i] = insert(arr[i], root[i - 1]); + } + for (int i = 1; i <= m; i++) { + if (op[i] == 0) { + addProduct(tim[i], i, 1, t, 1); + } else { + ans[i] = query(x[i], root[sl[i] - 1], root[sr[i]]); + int start = Math.max(tim[i] - d[i] + 1, 1); + if (start <= tim[i]) { + addBuy(start, tim[i], i, 1, t, 1); + } + } + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + t = 0; + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + op[i] = in.nextInt(); + if (op[i] == 0) { + t++; + s[i] = in.nextInt(); + v[i] = in.nextInt(); + } else { + sl[i] = in.nextInt(); + sr[i] = in.nextInt(); + x[i] = in.nextInt(); + d[i] = in.nextInt(); + } + tim[i] = t; + } + prepare(); + dfs(1, t, 1); + for (int i = 1; i <= m; i++) { + if (op[i] == 1) { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class167/Code04_MarsStore2.java b/src/class167/Code04_MarsStore2.java new file mode 100644 index 000000000..a60826f81 --- /dev/null +++ b/src/class167/Code04_MarsStore2.java @@ -0,0 +1,221 @@ +package class167; + +// 火星商店,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4585 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Product { +// int s, v; +//}; +// +//bool ProductCmp(Product a, Product b) { +// return a.s < b.s; +//} +// +//const int MAXN = 100001; +//const int MAXP = MAXN * 20; +//const int MAXT = 1000001; +//const int BIT = 16; +//int n, m, t; +// +//int arr[MAXN]; +//int op[MAXN]; +//int s[MAXN]; +//int v[MAXN]; +//int sl[MAXN]; +//int sr[MAXN]; +//int x[MAXN]; +//int d[MAXN]; +//int tim[MAXN]; +// +//int root[MAXN]; +//int tree[MAXP][2]; +//int pass[MAXP]; +//int cntt; +// +//int headp[MAXN << 2]; +//int nextp[MAXT]; +//int pid[MAXT]; +//int cntp; +// +//int headb[MAXN << 2]; +//int nextb[MAXT]; +//int bid[MAXT]; +//int cntb; +// +//Product product[MAXN]; +//int ans[MAXN]; +// +//int insert(int num, int i) { +// int rt = ++cntt; +// tree[rt][0] = tree[i][0]; +// tree[rt][1] = tree[i][1]; +// pass[rt] = pass[i] + 1; +// for (int b = BIT, path, pre = rt, cur; b >= 0; b--, pre = cur) { +// path = (num >> b) & 1; +// i = tree[i][path]; +// cur = ++cntt; +// tree[cur][0] = tree[i][0]; +// tree[cur][1] = tree[i][1]; +// pass[cur] = pass[i] + 1; +// tree[pre][path] = cur; +// } +// return rt; +//} +// +//int query(int num, int u, int v) { +// int ansv = 0; +// for (int b = BIT, path, best; b >= 0; b--) { +// path = (num >> b) & 1; +// best = path ^ 1; +// if (pass[tree[v][best]] > pass[tree[u][best]]) { +// ansv += 1 << b; +// u = tree[u][best]; +// v = tree[v][best]; +// } else { +// u = tree[u][path]; +// v = tree[v][path]; +// } +// } +// return ansv; +//} +// +//void addInfoP(int i, int pi) { +// nextp[++cntp] = headp[i]; +// pid[cntp] = pi; +// headp[i] = cntp; +//} +// +//void addInfoB(int i, int bi) { +// nextb[++cntb] = headb[i]; +// bid[cntb] = bi; +// headb[i] = cntb; +//} +// +//void addProduct(int jobi, int pi, int l, int r, int i) { +// addInfoP(i, pi); +// if (l < r) { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// addProduct(jobi, pi, l, mid, i << 1); +// } else { +// addProduct(jobi, pi, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void addBuy(int jobl, int jobr, int bi, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addInfoB(i, bi); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// addBuy(jobl, jobr, bi, l, mid, i << 1); +// } +// if (jobr > mid) { +// addBuy(jobl, jobr, bi, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//int lower(int size, int num) { +// int l = 1, r = size, ansv = size + 1; +// while (l <= r) { +// int mid = (l + r) >> 1; +// if (product[mid].s >= num) { +// ansv = mid; +// r = mid - 1; +// } else { +// l = mid + 1; +// } +// } +// return ansv; +//} +// +//int upper(int size, int num) { +// int l = 1, r = size, ansv = 0; +// while (l <= r) { +// int mid = (l + r) >> 1; +// if (product[mid].s <= num) { +// ansv = mid; +// l = mid + 1; +// } else { +// r = mid - 1; +// } +// } +// return ansv; +//} +// +//void dfs(int l, int r, int i) { +// int pcnt = 0; +// for (int e = headp[i]; e > 0; e = nextp[e]) { +// product[++pcnt].s = s[pid[e]]; +// product[pcnt].v = v[pid[e]]; +// } +// sort(product + 1, product + pcnt + 1, ProductCmp); +// cntt = 0; +// for (int k = 1; k <= pcnt; k++) { +// root[k] = insert(product[k].v, root[k - 1]); +// } +// for (int e = headb[i], id, pre, post; e > 0; e = nextb[e]) { +// id = bid[e]; +// pre = lower(pcnt, sl[id]) - 1; +// post = upper(pcnt, sr[id]); +// ans[id] = max(ans[id], query(x[id], root[pre], root[post])); +// } +// if (l < r) { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// root[i] = insert(arr[i], root[i - 1]); +// } +// for (int i = 1; i <= m; i++) { +// if (op[i] == 0) { +// addProduct(tim[i], i, 1, t, 1); +// } else { +// ans[i] = query(x[i], root[sl[i] - 1], root[sr[i]]); +// int start = max(tim[i] - d[i] + 1, 1); +// if (start <= tim[i]) { +// addBuy(start, tim[i], i, 1, t, 1); +// } +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// t = 0; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> op[i]; +// if (op[i] == 0) { +// t++; +// cin >> s[i] >> v[i]; +// } else { +// cin >> sl[i] >> sr[i] >> x[i] >> d[i]; +// } +// tim[i] = t; +// } +// prepare(); +// dfs(1, t, 1); +// for (int i = 1; i <= m; i++) { +// if (op[i] == 1) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 5758da26a24f2e4f93cad376908fdf094f487e75 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 1 May 2025 01:18:53 +0800 Subject: [PATCH 0043/1170] modify code --- src/class167/Code04_MarsStore1.java | 7 +++---- src/class167/Code04_MarsStore2.java | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/class167/Code04_MarsStore1.java b/src/class167/Code04_MarsStore1.java index 3a46fb0cd..4c3b86841 100644 --- a/src/class167/Code04_MarsStore1.java +++ b/src/class167/Code04_MarsStore1.java @@ -13,8 +13,7 @@ public class Code04_MarsStore1 { public static int MAXN = 100001; - public static int MAXP = MAXN * 20; - public static int MAXT = 1000001; + public static int MAXT = 2000001; public static int BIT = 16; public static int n, m, t; @@ -29,8 +28,8 @@ public class Code04_MarsStore1 { public static int[] tim = new int[MAXN]; public static int[] root = new int[MAXN]; - public static int[][] tree = new int[MAXP][2]; - public static int[] pass = new int[MAXP]; + public static int[][] tree = new int[MAXT][2]; + public static int[] pass = new int[MAXT]; public static int cntt = 0; public static int[] headp = new int[MAXN << 2]; diff --git a/src/class167/Code04_MarsStore2.java b/src/class167/Code04_MarsStore2.java index a60826f81..7c9e60a8b 100644 --- a/src/class167/Code04_MarsStore2.java +++ b/src/class167/Code04_MarsStore2.java @@ -18,8 +18,7 @@ //} // //const int MAXN = 100001; -//const int MAXP = MAXN * 20; -//const int MAXT = 1000001; +//const int MAXT = 2000001; //const int BIT = 16; //int n, m, t; // @@ -34,8 +33,8 @@ //int tim[MAXN]; // //int root[MAXN]; -//int tree[MAXP][2]; -//int pass[MAXP]; +//int tree[MAXT][2]; +//int pass[MAXT]; //int cntt; // //int headp[MAXN << 2]; From 3b50129d506b2ae45c76bc2a6b6031f451a3220d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 1 May 2025 19:09:55 +0800 Subject: [PATCH 0044/1170] modify code --- src/class167/Code03_MinimumXor1.java | 125 +++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/class167/Code03_MinimumXor1.java diff --git a/src/class167/Code03_MinimumXor1.java b/src/class167/Code03_MinimumXor1.java new file mode 100644 index 000000000..094d3befd --- /dev/null +++ b/src/class167/Code03_MinimumXor1.java @@ -0,0 +1,125 @@ +package class167; + +// 最小异或查询,java版 +// 测试链接 : https://www.luogu.com.cn/problem/AT_abc308_g +// 测试链接 : https://atcoder.jp/contests/abc308/tasks/abc308_g +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code03_MinimumXor1 { + + public static int MAXN = 10000001; + public static int BIT = 29; + public static int INF = 1 << 30; + + public static int[] fa = new int[MAXN]; + public static int[][] tree = new int[MAXN][2]; + public static int[] pass = new int[MAXN]; + public static int[] eor = new int[MAXN]; + public static int[] data = new int[MAXN]; + public static int cnt = 1; + + public static int insert(int num, int changeCnt) { + int cur = 1; + pass[cur] += changeCnt; + for (int b = BIT, path; b >= 0; b--) { + path = (num >> b) & 1; + if (tree[cur][path] == 0) { + tree[cur][path] = ++cnt; + fa[tree[cur][path]] = cur; + } + cur = tree[cur][path]; + pass[cur] += changeCnt; + } + eor[cur] = (pass[cur] >= 2 ? 0 : INF); + data[cur] = (pass[cur] == 1 ? num : 0); + return cur; + } + + public static void compute(int num, int changeCnt) { + int bottom = insert(num, changeCnt); + for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { + l = tree[i][0]; + r = tree[i][1]; + if (pass[i] < 2) { + eor[i] = INF; + } else if ((l > 0 ? 1 : 0) + (r > 0 ? 1 : 0) == 1) { + eor[i] = (l > 0 ? eor[l] : eor[r]); + } else if (Math.max(pass[l], pass[r]) == 1) { + eor[i] = data[l] ^ data[r]; + } else { + eor[i] = Math.min(eor[l], eor[r]); + } + if (pass[l] + pass[r] == 1) { + data[i] = (pass[l] == 1 ? data[l] : data[r]); + } else { + data[i] = 0; + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + int q = in.nextInt(); + for (int i = 1, op, num; i <= q; i++) { + op = in.nextInt(); + if (op == 3) { + out.println(eor[1]); + } else { + num = in.nextInt(); + if (op == 1) { + compute(num, 1); + } else { + compute(num, -1); + } + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file From 6ee239f76754c5043e5c43792886a5fb3e5a4f75 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 1 May 2025 19:58:00 +0800 Subject: [PATCH 0045/1170] modify code --- src/class167/Code03_MinimumXor1.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/class167/Code03_MinimumXor1.java b/src/class167/Code03_MinimumXor1.java index 094d3befd..4c203ec67 100644 --- a/src/class167/Code03_MinimumXor1.java +++ b/src/class167/Code03_MinimumXor1.java @@ -19,9 +19,10 @@ public class Code03_MinimumXor1 { public static int[] fa = new int[MAXN]; public static int[][] tree = new int[MAXN][2]; public static int[] pass = new int[MAXN]; + public static int cnt = 1; + public static int[] eor = new int[MAXN]; public static int[] data = new int[MAXN]; - public static int cnt = 1; public static int insert(int num, int changeCnt) { int cur = 1; @@ -35,19 +36,19 @@ public static int insert(int num, int changeCnt) { cur = tree[cur][path]; pass[cur] += changeCnt; } - eor[cur] = (pass[cur] >= 2 ? 0 : INF); - data[cur] = (pass[cur] == 1 ? num : 0); return cur; } public static void compute(int num, int changeCnt) { int bottom = insert(num, changeCnt); + eor[bottom] = (pass[bottom] >= 2 ? 0 : INF); + data[bottom] = (pass[bottom] == 1 ? num : 0); for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { l = tree[i][0]; r = tree[i][1]; if (pass[i] < 2) { eor[i] = INF; - } else if ((l > 0 ? 1 : 0) + (r > 0 ? 1 : 0) == 1) { + } else if (l != 0 ^ r != 0) { eor[i] = (l > 0 ? eor[l] : eor[r]); } else if (Math.max(pass[l], pass[r]) == 1) { eor[i] = data[l] ^ data[r]; From edf6835e8448f8d2d9f2016e70095f7923821c4a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 1 May 2025 20:05:26 +0800 Subject: [PATCH 0046/1170] modify code --- src/class167/Code03_MinimumXor1.java | 26 ++++----- src/class167/Code03_MinimumXor2.java | 83 ++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 src/class167/Code03_MinimumXor2.java diff --git a/src/class167/Code03_MinimumXor1.java b/src/class167/Code03_MinimumXor1.java index 4c203ec67..ff4ce0cb7 100644 --- a/src/class167/Code03_MinimumXor1.java +++ b/src/class167/Code03_MinimumXor1.java @@ -22,13 +22,13 @@ public class Code03_MinimumXor1 { public static int cnt = 1; public static int[] eor = new int[MAXN]; - public static int[] data = new int[MAXN]; + public static int[] num = new int[MAXN]; - public static int insert(int num, int changeCnt) { + public static int insert(int x, int changeCnt) { int cur = 1; pass[cur] += changeCnt; for (int b = BIT, path; b >= 0; b--) { - path = (num >> b) & 1; + path = (x >> b) & 1; if (tree[cur][path] == 0) { tree[cur][path] = ++cnt; fa[tree[cur][path]] = cur; @@ -39,10 +39,10 @@ public static int insert(int num, int changeCnt) { return cur; } - public static void compute(int num, int changeCnt) { - int bottom = insert(num, changeCnt); + public static void compute(int x, int changeCnt) { + int bottom = insert(x, changeCnt); eor[bottom] = (pass[bottom] >= 2 ? 0 : INF); - data[bottom] = (pass[bottom] == 1 ? num : 0); + num[bottom] = (pass[bottom] == 1 ? x : 0); for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { l = tree[i][0]; r = tree[i][1]; @@ -51,14 +51,14 @@ public static void compute(int num, int changeCnt) { } else if (l != 0 ^ r != 0) { eor[i] = (l > 0 ? eor[l] : eor[r]); } else if (Math.max(pass[l], pass[r]) == 1) { - eor[i] = data[l] ^ data[r]; + eor[i] = num[l] ^ num[r]; } else { eor[i] = Math.min(eor[l], eor[r]); } if (pass[l] + pass[r] == 1) { - data[i] = (pass[l] == 1 ? data[l] : data[r]); + num[i] = (pass[l] == 1 ? num[l] : num[r]); } else { - data[i] = 0; + num[i] = 0; } } } @@ -67,16 +67,16 @@ public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); int q = in.nextInt(); - for (int i = 1, op, num; i <= q; i++) { + for (int i = 1, op, x; i <= q; i++) { op = in.nextInt(); if (op == 3) { out.println(eor[1]); } else { - num = in.nextInt(); + x = in.nextInt(); if (op == 1) { - compute(num, 1); + compute(x, 1); } else { - compute(num, -1); + compute(x, -1); } } } diff --git a/src/class167/Code03_MinimumXor2.java b/src/class167/Code03_MinimumXor2.java new file mode 100644 index 000000000..a9634289b --- /dev/null +++ b/src/class167/Code03_MinimumXor2.java @@ -0,0 +1,83 @@ +package class167; + +// 最小异或查询,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/AT_abc308_g +// 测试链接 : https://atcoder.jp/contests/abc308/tasks/abc308_g +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 10000001; +//const int BIT = 29; +//const int INF = 1 << 30; +// +//int fa[MAXN]; +//int tree[MAXN][2]; +//int pass[MAXN]; +//int cnt = 1; +// +//int eor[MAXN]; +//int num[MAXN]; +// +//int insert(int x, int changeCnt) { +// int cur = 1; +// pass[cur] += changeCnt; +// for (int b = BIT, path; b >= 0; b--) { +// path = (x >> b) & 1; +// if (tree[cur][path] == 0) { +// tree[cur][path] = ++cnt; +// fa[tree[cur][path]] = cur; +// } +// cur = tree[cur][path]; +// pass[cur] += changeCnt; +// } +// return cur; +//} +// +//void compute(int x, int changeCnt) { +// int bottom = insert(x, changeCnt); +// eor[bottom] = (pass[bottom] >= 2 ? 0 : INF); +// num[bottom] = (pass[bottom] == 1 ? x : 0); +// for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { +// l = tree[i][0]; +// r = tree[i][1]; +// if (pass[i] < 2) { +// eor[i] = INF; +// } else if ((l != 0) ^ (r != 0)) { +// eor[i] = (l > 0 ? eor[l] : eor[r]); +// } else if (max(pass[l], pass[r]) == 1) { +// eor[i] = num[l] ^ num[r]; +// } else { +// eor[i] = min(eor[l], eor[r]); +// } +// if (pass[l] + pass[r] == 1) { +// num[i] = (pass[l] == 1 ? num[l] : num[r]); +// } else { +// num[i] = 0; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int q; +// cin >> q; +// for (int i = 1, op, x; i <= q; i++) { +// cin >> op; +// if (op == 3) { +// cout << eor[1] << '\n'; +// } else { +// cin >> x; +// if (op == 1) { +// compute(x, 1); +// } else { +// compute(x, -1); +// } +// } +// } +// return 0; +//} \ No newline at end of file From 139492d6e6f5c66d3fc2316642f97b5f41f1d9cd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 1 May 2025 20:09:54 +0800 Subject: [PATCH 0047/1170] modify code --- src/class167/Code03_MinimumXor1.java | 10 +++++----- src/class167/Code03_MinimumXor2.java | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class167/Code03_MinimumXor1.java b/src/class167/Code03_MinimumXor1.java index ff4ce0cb7..8b34db95d 100644 --- a/src/class167/Code03_MinimumXor1.java +++ b/src/class167/Code03_MinimumXor1.java @@ -41,22 +41,22 @@ public static int insert(int x, int changeCnt) { public static void compute(int x, int changeCnt) { int bottom = insert(x, changeCnt); - eor[bottom] = (pass[bottom] >= 2 ? 0 : INF); - num[bottom] = (pass[bottom] == 1 ? x : 0); + eor[bottom] = pass[bottom] >= 2 ? 0 : INF; + num[bottom] = pass[bottom] == 1 ? x : 0; for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { l = tree[i][0]; r = tree[i][1]; if (pass[i] < 2) { eor[i] = INF; - } else if (l != 0 ^ r != 0) { - eor[i] = (l > 0 ? eor[l] : eor[r]); + } else if ((l != 0) ^ (r != 0)) { + eor[i] = l > 0 ? eor[l] : eor[r]; } else if (Math.max(pass[l], pass[r]) == 1) { eor[i] = num[l] ^ num[r]; } else { eor[i] = Math.min(eor[l], eor[r]); } if (pass[l] + pass[r] == 1) { - num[i] = (pass[l] == 1 ? num[l] : num[r]); + num[i] = pass[l] == 1 ? num[l] : num[r]; } else { num[i] = 0; } diff --git a/src/class167/Code03_MinimumXor2.java b/src/class167/Code03_MinimumXor2.java index a9634289b..378dd3df0 100644 --- a/src/class167/Code03_MinimumXor2.java +++ b/src/class167/Code03_MinimumXor2.java @@ -39,22 +39,22 @@ // //void compute(int x, int changeCnt) { // int bottom = insert(x, changeCnt); -// eor[bottom] = (pass[bottom] >= 2 ? 0 : INF); -// num[bottom] = (pass[bottom] == 1 ? x : 0); +// eor[bottom] = pass[bottom] >= 2 ? 0 : INF; +// num[bottom] = pass[bottom] == 1 ? x : 0; // for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { // l = tree[i][0]; // r = tree[i][1]; // if (pass[i] < 2) { // eor[i] = INF; // } else if ((l != 0) ^ (r != 0)) { -// eor[i] = (l > 0 ? eor[l] : eor[r]); +// eor[i] = l > 0 ? eor[l] : eor[r]; // } else if (max(pass[l], pass[r]) == 1) { // eor[i] = num[l] ^ num[r]; // } else { // eor[i] = min(eor[l], eor[r]); // } // if (pass[l] + pass[r] == 1) { -// num[i] = (pass[l] == 1 ? num[l] : num[r]); +// num[i] = pass[l] == 1 ? num[l] : num[r]; // } else { // num[i] = 0; // } From c8c2f3fa3bd67eae7b53c0dd7e8d02b003c26515 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 2 May 2025 13:21:58 +0800 Subject: [PATCH 0048/1170] modify code --- src/class167/Code05_AdditionOnSegments1.java | 206 +++++++++++++++++++ src/class167/Code05_AdditionOnSegments2.java | 153 ++++++++++++++ 2 files changed, 359 insertions(+) create mode 100644 src/class167/Code05_AdditionOnSegments1.java create mode 100644 src/class167/Code05_AdditionOnSegments2.java diff --git a/src/class167/Code05_AdditionOnSegments1.java b/src/class167/Code05_AdditionOnSegments1.java new file mode 100644 index 000000000..6e05a129a --- /dev/null +++ b/src/class167/Code05_AdditionOnSegments1.java @@ -0,0 +1,206 @@ +package class167; + +// 能达到的最大值,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF981E +// 测试链接 : https://codeforces.com/problemset/problem/981/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code05_AdditionOnSegments1 { + + public static int MAXN = 10001; + public static int MAXT = 500001; + public static int BIT = 10000; + public static int INTBIT = 32; + public static int LEN = (BIT + INTBIT - 1) / INTBIT; + public static int n, q; + + public static int[] help = new int[LEN]; + public static int[] path = new int[LEN]; + public static int[] ans = new int[LEN]; + + public static int[] head = new int[MAXN << 2]; + public static int[] next = new int[MAXT]; + public static int[] to = new int[MAXT]; + public static int cnt = 0; + + // 清空位图 + public static void clear(int[] bitset) { + for (int i = 0; i < LEN; i++) { + bitset[i] = 0; + } + } + + // 位图set1 拷贝 位图set2的所有状态 + public static void clone(int[] set1, int[] set2) { + for (int i = 0; i < LEN; i++) { + set1[i] = set2[i]; + } + } + + // 返回位图第i位的状态 + public static int getBit(int[] bitset, int i) { + return (bitset[i / INTBIT] >> (i % INTBIT)) & 1; + } + + // 第i位的状态设置成v + public static void setBit(int[] bitset, int i, int v) { + if (v == 0) { + bitset[i / INTBIT] &= ~(1 << (i % INTBIT)); + } else { + bitset[i / INTBIT] |= 1 << (i % INTBIT); + } + } + + // 位图set1 或 位图set2的所有状态 + public static void bitOr(int[] set1, int[] set2) { + for (int i = 0; i < LEN; i++) { + set1[i] |= set2[i]; + } + } + + // 位图ret 变成 位图bitset左移left位之后的状态 + // 不使用一位一位拷贝的方式,因为太慢了 + // 采用整块左移的方式,这样比较快 + public static void bitLeft(int[] ret, int[] bitset, int left) { + clear(ret); + if (left >= BIT) { + return; + } + if (left <= 0) { + clone(ret, bitset); + return; + } + int shift = left / INTBIT; + int offset = left % INTBIT; + if (offset == 0) { + for (int i = LEN - 1; i >= shift; i--) { + ret[i] = bitset[i - shift]; + } + } else { + int carry = INTBIT - offset, high, low; + for (int i = LEN - 1; i > shift; i--) { + high = bitset[i - shift] << offset; + low = bitset[i - shift - 1] >>> carry; + ret[i] = high | low; + } + ret[shift] = bitset[0] << offset; + } + int extra = LEN * INTBIT - BIT - 1; + if (extra > 0) { + int mask = -1 >>> extra; + ret[LEN - 1] &= mask; + } + } + + public static void addEdge(int i, int v) { + next[++cnt] = head[i]; + to[cnt] = v; + head[i] = cnt; + } + + public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdge(i, jobv); + } else { + int mid = (l + r) >> 1; + if (jobl <= mid) { + add(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + } + } + + public static void dfs(int l, int r, int i) { + int[] backup = new int[LEN]; + clone(backup, path); + for (int e = head[i]; e > 0; e = next[e]) { + bitLeft(help, path, to[e]); + bitOr(path, help); + } + if (l == r) { + bitOr(ans, path); + } else { + int mid = (l + r) >> 1; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); + } + clone(path, backup); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + q = in.nextInt(); + for (int i = 1, l, r, k; i <= q; i++) { + l = in.nextInt(); + r = in.nextInt(); + k = in.nextInt(); + add(l, r, k, 1, n, 1); + } + setBit(path, 0, 1); + dfs(1, n, 1); + int ansCnt = 0; + for (int i = 1; i <= n; i++) { + if (getBit(ans, i) == 1) { + ansCnt++; + } + } + out.println(ansCnt); + for (int i = 1; i <= n; i++) { + if (getBit(ans, i) == 1) { + out.print(i + " "); + } + } + out.println(); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class167/Code05_AdditionOnSegments2.java b/src/class167/Code05_AdditionOnSegments2.java new file mode 100644 index 000000000..7ee88aff3 --- /dev/null +++ b/src/class167/Code05_AdditionOnSegments2.java @@ -0,0 +1,153 @@ +package class167; + +// 能达到的最大值,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF981E +// 测试链接 : https://codeforces.com/problemset/problem/981/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//using ui = unsigned int; +// +//const int MAXN = 10001; +//const int MAXT = 500001; +//const int BIT = 10000; +//const int INTBIT = 32; +//const int LEN = (BIT + INTBIT - 1) / INTBIT; +//int n, q; +// +//ui help[LEN]; +//ui path[LEN]; +//ui ans[LEN]; +// +//int head[MAXN << 2]; +//int nxt[MAXT]; +//int to[MAXT]; +//int cnt = 0; +// +//void clear(ui* bitset) { +// for (int i = 0; i < LEN; i++) { +// bitset[i] = 0; +// } +//} +// +//void clone(ui* set1, ui* set2) { +// for (int i = 0; i < LEN; i++) { +// set1[i] = set2[i]; +// } +//} +// +//int getBit(ui* bitset, int i) { +// return (bitset[i / INTBIT] >> (i % INTBIT)) & 1; +//} +// +//void setBit(ui* bitset, int i, int v) { +// if (v == 0) { +// bitset[i / INTBIT] &= ~(1u << (i % INTBIT)); +// } else { +// bitset[i / INTBIT] |= 1u << (i % INTBIT); +// } +//} +// +//void bitOr(ui* set1, ui* set2) { +// for (int i = 0; i < LEN; i++) { +// set1[i] |= set2[i]; +// } +//} +// +//void bitLeft(ui* ret, ui* bitset, int left) { +// clear(ret); +// if (left >= BIT) { +// return; +// } +// if (left <= 0) { +// clone(ret, bitset); +// return; +// } +// int shift = left / INTBIT; +// int offset = left % INTBIT; +// if (offset == 0) { +// for (int i = LEN - 1; i >= shift; i--) { +// ret[i] = bitset[i - shift]; +// } +// } else { +// int carry = INTBIT - offset; +// for (int i = LEN - 1; i > shift; i--) { +// ui high = bitset[i - shift] << offset; +// ui low = bitset[i - shift - 1] >> carry; +// ret[i] = high | low; +// } +// ret[shift] = bitset[0] << offset; +// } +// int extra = LEN * INTBIT - BIT - 1; +// if (extra > 0) { +// ui mask = ~0u >> extra; +// ret[LEN - 1] &= mask; +// } +//} +// +//void addEdge(int i, int v) { +// nxt[++cnt] = head[i]; +// to[cnt] = v; +// head[i] = cnt; +//} +// +//void add(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobv); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobv, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i) { +// ui backup[LEN]; +// clone(backup, path); +// for (int e = head[i]; e > 0; e = nxt[e]) { +// bitLeft(help, path, to[e]); +// bitOr(path, help); +// } +// if (l == r) { +// bitOr(ans, path); +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// clone(path, backup); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1, l, r, k; i <= q; i++) { +// cin >> l >> r >> k; +// add(l, r, k, 1, n, 1); +// } +// setBit(path, 0, 1); +// dfs(1, n, 1); +// int ansCnt = 0; +// for (int i = 1; i <= n; i++) { +// if (getBit(ans, i) == 1) { +// ansCnt++; +// } +// } +// cout << ansCnt << '\n'; +// for (int i = 1; i <= n; i++) { +// if (getBit(ans, i) == 1) { +// cout << i << ' '; +// } +// } +// cout << '\n'; +// return 0; +//} \ No newline at end of file From d1c8f7899711fa4587355ef114164fd216f0875a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 2 May 2025 14:10:43 +0800 Subject: [PATCH 0049/1170] modify code --- .../Code02_EightVerticalHorizontal1.java | 20 +++++++++-------- .../Code02_EightVerticalHorizontal2.java | 22 ++++++++++--------- src/class167/Code05_AdditionOnSegments1.java | 10 ++++----- src/class167/Code05_AdditionOnSegments2.java | 2 +- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/class167/Code02_EightVerticalHorizontal1.java b/src/class167/Code02_EightVerticalHorizontal1.java index ba2398bad..8b527e9bc 100644 --- a/src/class167/Code02_EightVerticalHorizontal1.java +++ b/src/class167/Code02_EightVerticalHorizontal1.java @@ -11,6 +11,12 @@ public class Code02_EightVerticalHorizontal1 { + public static int MAXN = 501; + public static int MAXQ = 1001; + public static int MAXT = 10001; + public static int BIT = 1000; + public static int INTBIT = 32; + // 位图 static class BitSet { @@ -19,12 +25,12 @@ static class BitSet { public int[] arr; public BitSet() { - len = (1000 + 31) / 32; + len = BIT / INTBIT + 1; arr = new int[len]; } public BitSet(String s) { - len = (1000 + 31) / 32; + len = BIT / INTBIT + 1; arr = new int[len]; for (int i = 0, j = s.length() - 1; i < s.length(); i++, j--) { set(i, s.charAt(j) - '0'); @@ -33,15 +39,15 @@ public BitSet(String s) { // 返回第i位的状态 public int get(int i) { - return (arr[i / 32] >> (i % 32)) & 1; + return (arr[i / INTBIT] >> (i % INTBIT)) & 1; } // 设置第i位的状态 public void set(int i, int v) { if (v == 0) { - arr[i / 32] &= ~(1 << (i % 32)); + arr[i / INTBIT] &= ~(1 << (i % INTBIT)); } else { - arr[i / 32] |= 1 << (i % 32); + arr[i / INTBIT] |= 1 << (i % INTBIT); } } @@ -68,10 +74,6 @@ public void clear() { } - public static int MAXN = 501; - public static int MAXQ = 1001; - public static int MAXT = 10001; - public static int BIT = 999; public static int n, m, q; // 记录每条操作 diff --git a/src/class167/Code02_EightVerticalHorizontal2.java b/src/class167/Code02_EightVerticalHorizontal2.java index 4335a3d7c..a3fcd630a 100644 --- a/src/class167/Code02_EightVerticalHorizontal2.java +++ b/src/class167/Code02_EightVerticalHorizontal2.java @@ -9,17 +9,23 @@ // //using namespace std; // +//const int MAXN = 501; +//const int MAXQ = 1001; +//const int MAXT = 10001; +//const int BIT = 1000; +//const int INTBIT = 32; +// //struct BitSet { // int len; // vector arr; // // BitSet() { -// len = (1000 + 31) / 32; +// len = BIT / INTBIT + 1; // arr.assign(len, 0); // } // // BitSet(const string& s) { -// len = (1000 + 31) / 32; +// len = BIT / INTBIT + 1; // arr.assign(len, 0); // for (int i = 0, j = (int)s.size() - 1; i < (int)s.size(); i++, j--) { // set(i, s[j] - '0'); @@ -27,14 +33,14 @@ // } // // int get(int i) const { -// return (arr[i / 32] >> (i % 32)) & 1; +// return (arr[i / INTBIT] >> (i % INTBIT)) & 1; // } // // void set(int i, int v) { // if (v) { -// arr[i / 32] |= 1 << (i % 32); +// arr[i / INTBIT] |= 1 << (i % INTBIT); // } else { -// arr[i / 32] &= ~(1 << (i % 32)); +// arr[i / INTBIT] &= ~(1 << (i % INTBIT)); // } // } // @@ -53,12 +59,8 @@ // } //}; // -//const int MAXN = 501; -//const int MAXQ = 1001; -//const int MAXT = 10001; -//const int BIT = 999; -// //int n, m, q; +// //int x[MAXQ]; //int y[MAXQ]; //BitSet w[MAXQ]; diff --git a/src/class167/Code05_AdditionOnSegments1.java b/src/class167/Code05_AdditionOnSegments1.java index 6e05a129a..5e9a5bc72 100644 --- a/src/class167/Code05_AdditionOnSegments1.java +++ b/src/class167/Code05_AdditionOnSegments1.java @@ -16,7 +16,7 @@ public class Code05_AdditionOnSegments1 { public static int MAXT = 500001; public static int BIT = 10000; public static int INTBIT = 32; - public static int LEN = (BIT + INTBIT - 1) / INTBIT; + public static int LEN = BIT / INTBIT + 1; public static int n, q; public static int[] help = new int[LEN]; @@ -28,14 +28,14 @@ public class Code05_AdditionOnSegments1 { public static int[] to = new int[MAXT]; public static int cnt = 0; - // 清空位图 + // 清空 public static void clear(int[] bitset) { for (int i = 0; i < LEN; i++) { bitset[i] = 0; } } - // 位图set1 拷贝 位图set2的所有状态 + // 位图set1 拷贝 位图set2 public static void clone(int[] set1, int[] set2) { for (int i = 0; i < LEN; i++) { set1[i] = set2[i]; @@ -56,14 +56,14 @@ public static void setBit(int[] bitset, int i, int v) { } } - // 位图set1 或 位图set2的所有状态 + // 位图set1 或 位图set2 public static void bitOr(int[] set1, int[] set2) { for (int i = 0; i < LEN; i++) { set1[i] |= set2[i]; } } - // 位图ret 变成 位图bitset左移left位之后的状态 + // 位图ret 变成 位图bitset左移left之后的状态 // 不使用一位一位拷贝的方式,因为太慢了 // 采用整块左移的方式,这样比较快 public static void bitLeft(int[] ret, int[] bitset, int left) { diff --git a/src/class167/Code05_AdditionOnSegments2.java b/src/class167/Code05_AdditionOnSegments2.java index 7ee88aff3..3ca7b4ee9 100644 --- a/src/class167/Code05_AdditionOnSegments2.java +++ b/src/class167/Code05_AdditionOnSegments2.java @@ -16,7 +16,7 @@ //const int MAXT = 500001; //const int BIT = 10000; //const int INTBIT = 32; -//const int LEN = (BIT + INTBIT - 1) / INTBIT; +//const int LEN = BIT / INTBIT + 1; //int n, q; // //ui help[LEN]; From d6b00d1f18a2db1a17f27c8b603d159c2eb58dc8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 2 May 2025 21:47:27 +0800 Subject: [PATCH 0050/1170] modify code --- src/class167/Code05_AdditionOnSegments1.java | 50 ++++++++++---------- src/class167/Code05_AdditionOnSegments2.java | 48 +++++++++---------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/class167/Code05_AdditionOnSegments1.java b/src/class167/Code05_AdditionOnSegments1.java index 5e9a5bc72..8535e7d67 100644 --- a/src/class167/Code05_AdditionOnSegments1.java +++ b/src/class167/Code05_AdditionOnSegments1.java @@ -17,17 +17,19 @@ public class Code05_AdditionOnSegments1 { public static int BIT = 10000; public static int INTBIT = 32; public static int LEN = BIT / INTBIT + 1; + public static int DEEP = 20; public static int n, q; - public static int[] help = new int[LEN]; - public static int[] path = new int[LEN]; - public static int[] ans = new int[LEN]; - public static int[] head = new int[MAXN << 2]; public static int[] next = new int[MAXT]; public static int[] to = new int[MAXT]; public static int cnt = 0; + public static int[] tmp = new int[LEN]; + public static int[] path = new int[LEN]; + public static int[][] backup = new int[DEEP][LEN]; + public static int[] ans = new int[LEN]; + // 清空 public static void clear(int[] bitset) { for (int i = 0; i < LEN; i++) { @@ -63,23 +65,23 @@ public static void bitOr(int[] set1, int[] set2) { } } - // 位图ret 变成 位图bitset左移left之后的状态 + // 位图ret 变成 位图bitset左移move位的状态 // 不使用一位一位拷贝的方式,因为太慢了 // 采用整块左移的方式,这样比较快 - public static void bitLeft(int[] ret, int[] bitset, int left) { + public static void bitLeft(int[] ret, int[] bitset, int move) { clear(ret); - if (left >= BIT) { + if (move > BIT) { return; } - if (left <= 0) { + if (move <= 0) { clone(ret, bitset); return; } - int shift = left / INTBIT; - int offset = left % INTBIT; + int shift = move / INTBIT; + int offset = move % INTBIT; if (offset == 0) { - for (int i = LEN - 1; i >= shift; i--) { - ret[i] = bitset[i - shift]; + for (int i = LEN - 1, j = i - shift; j >= 0; i--, j--) { + ret[i] = bitset[j]; } } else { int carry = INTBIT - offset, high, low; @@ -90,10 +92,9 @@ public static void bitLeft(int[] ret, int[] bitset, int left) { } ret[shift] = bitset[0] << offset; } - int extra = LEN * INTBIT - BIT - 1; - if (extra > 0) { - int mask = -1 >>> extra; - ret[LEN - 1] &= mask; + int rest = LEN * INTBIT - (BIT + 1); + if (rest > 0) { + ret[LEN - 1] &= (1 << (INTBIT - rest)) - 1; } } @@ -117,21 +118,20 @@ public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { } } - public static void dfs(int l, int r, int i) { - int[] backup = new int[LEN]; - clone(backup, path); + public static void dfs(int l, int r, int i, int dep) { + clone(backup[dep], path); for (int e = head[i]; e > 0; e = next[e]) { - bitLeft(help, path, to[e]); - bitOr(path, help); + bitLeft(tmp, path, to[e]); + bitOr(path, tmp); } if (l == r) { bitOr(ans, path); } else { int mid = (l + r) >> 1; - dfs(l, mid, i << 1); - dfs(mid + 1, r, i << 1 | 1); + dfs(l, mid, i << 1, dep + 1); + dfs(mid + 1, r, i << 1 | 1, dep + 1); } - clone(path, backup); + clone(path, backup[dep]); } public static void main(String[] args) throws Exception { @@ -146,7 +146,7 @@ public static void main(String[] args) throws Exception { add(l, r, k, 1, n, 1); } setBit(path, 0, 1); - dfs(1, n, 1); + dfs(1, n, 1, 1); int ansCnt = 0; for (int i = 1; i <= n; i++) { if (getBit(ans, i) == 1) { diff --git a/src/class167/Code05_AdditionOnSegments2.java b/src/class167/Code05_AdditionOnSegments2.java index 3ca7b4ee9..f51b0bff6 100644 --- a/src/class167/Code05_AdditionOnSegments2.java +++ b/src/class167/Code05_AdditionOnSegments2.java @@ -17,17 +17,19 @@ //const int BIT = 10000; //const int INTBIT = 32; //const int LEN = BIT / INTBIT + 1; +//const int DEEP = 20; //int n, q; // -//ui help[LEN]; -//ui path[LEN]; -//ui ans[LEN]; -// //int head[MAXN << 2]; //int nxt[MAXT]; //int to[MAXT]; //int cnt = 0; // +//ui tmp[LEN]; +//ui path[LEN]; +//ui backup[DEEP][LEN]; +//ui ans[LEN]; +// //void clear(ui* bitset) { // for (int i = 0; i < LEN; i++) { // bitset[i] = 0; @@ -58,20 +60,20 @@ // } //} // -//void bitLeft(ui* ret, ui* bitset, int left) { +//void bitLeft(ui* ret, ui* bitset, int move) { // clear(ret); -// if (left >= BIT) { +// if (move > BIT) { // return; // } -// if (left <= 0) { +// if (move <= 0) { // clone(ret, bitset); // return; // } -// int shift = left / INTBIT; -// int offset = left % INTBIT; +// int shift = move / INTBIT; +// int offset = move % INTBIT; // if (offset == 0) { -// for (int i = LEN - 1; i >= shift; i--) { -// ret[i] = bitset[i - shift]; +// for (int i = LEN - 1, j = i - shift; j >= 0; i--, j--) { +// ret[i] = bitset[j]; // } // } else { // int carry = INTBIT - offset; @@ -82,10 +84,9 @@ // } // ret[shift] = bitset[0] << offset; // } -// int extra = LEN * INTBIT - BIT - 1; -// if (extra > 0) { -// ui mask = ~0u >> extra; -// ret[LEN - 1] &= mask; +// int rest = LEN * INTBIT - (BIT + 1); +// if (rest > 0) { +// ret[LEN - 1] &= (1u << (INTBIT - rest)) - 1u; // } //} // @@ -109,21 +110,20 @@ // } //} // -//void dfs(int l, int r, int i) { -// ui backup[LEN]; -// clone(backup, path); +//void dfs(int l, int r, int i, int dep) { +// clone(backup[dep], path); // for (int e = head[i]; e > 0; e = nxt[e]) { -// bitLeft(help, path, to[e]); -// bitOr(path, help); +// bitLeft(tmp, path, to[e]); +// bitOr(path, tmp); // } // if (l == r) { // bitOr(ans, path); // } else { // int mid = (l + r) >> 1; -// dfs(l, mid, i << 1); -// dfs(mid + 1, r, i << 1 | 1); +// dfs(l, mid, i << 1, dep + 1); +// dfs(mid + 1, r, i << 1 | 1, dep + 1); // } -// clone(path, backup); +// clone(path, backup[dep]); //} // //int main() { @@ -135,7 +135,7 @@ // add(l, r, k, 1, n, 1); // } // setBit(path, 0, 1); -// dfs(1, n, 1); +// dfs(1, n, 1, 1); // int ansCnt = 0; // for (int i = 1; i <= n; i++) { // if (getBit(ans, i) == 1) { From d5e41fbcaa310ef1721d85d8836900cd2a4cb10b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 2 May 2025 22:35:47 +0800 Subject: [PATCH 0051/1170] modify code --- .../Code02_EightVerticalHorizontal1.java | 2 - .../Code02_EightVerticalHorizontal2.java | 157 ++++++------------ 2 files changed, 53 insertions(+), 106 deletions(-) diff --git a/src/class167/Code02_EightVerticalHorizontal1.java b/src/class167/Code02_EightVerticalHorizontal1.java index 8b527e9bc..b1e0c53ab 100644 --- a/src/class167/Code02_EightVerticalHorizontal1.java +++ b/src/class167/Code02_EightVerticalHorizontal1.java @@ -75,8 +75,6 @@ public void clear() { } public static int n, m, q; - - // 记录每条操作 public static int[] x = new int[MAXQ]; public static int[] y = new int[MAXQ]; public static BitSet[] w = new BitSet[MAXQ]; diff --git a/src/class167/Code02_EightVerticalHorizontal2.java b/src/class167/Code02_EightVerticalHorizontal2.java index a3fcd630a..1def385ed 100644 --- a/src/class167/Code02_EightVerticalHorizontal2.java +++ b/src/class167/Code02_EightVerticalHorizontal2.java @@ -12,68 +12,24 @@ //const int MAXN = 501; //const int MAXQ = 1001; //const int MAXT = 10001; -//const int BIT = 1000; -//const int INTBIT = 32; +//const int BIT = 1000; // -//struct BitSet { -// int len; -// vector arr; -// -// BitSet() { -// len = BIT / INTBIT + 1; -// arr.assign(len, 0); -// } -// -// BitSet(const string& s) { -// len = BIT / INTBIT + 1; -// arr.assign(len, 0); -// for (int i = 0, j = (int)s.size() - 1; i < (int)s.size(); i++, j--) { -// set(i, s[j] - '0'); -// } -// } -// -// int get(int i) const { -// return (arr[i / INTBIT] >> (i % INTBIT)) & 1; -// } -// -// void set(int i, int v) { -// if (v) { -// arr[i / INTBIT] |= 1 << (i % INTBIT); -// } else { -// arr[i / INTBIT] &= ~(1 << (i % INTBIT)); -// } -// } -// -// void copy(const BitSet& other) { -// arr = other.arr; -// } -// -// void eor(const BitSet& other) { -// for (int i = 0; i < len; i++) { -// arr[i] ^= other.arr[i]; -// } -// } -// -// void clear() { -// fill(arr.begin(), arr.end(), 0); -// } -//}; +//typedef bitset bs; // //int n, m, q; -// //int x[MAXQ]; //int y[MAXQ]; -//BitSet w[MAXQ]; +//bs w[MAXQ]; //int edgeCnt = 0; //int last[MAXQ]; // -//BitSet basis[BIT + 1]; +//bs basis[BIT + 1]; //int inspos[BIT + 1]; //int basiz = 0; // //int father[MAXN]; //int siz[MAXN]; -//BitSet eor[MAXN]; +//bs eor[MAXN]; //int rollback[MAXT][2]; //int opsize = 0; // @@ -81,63 +37,60 @@ //int nxt[MAXT]; //int tox[MAXT]; //int toy[MAXT]; -//BitSet tow[MAXT]; +//bs tow[MAXT]; //int cnt = 0; // -//BitSet ans[MAXQ]; +//bs ans[MAXQ]; // -//void insert(BitSet num) { -// for (int i = BIT; i >= 0; i--) { -// if (num.get(i)) { -// if (basis[i].get(i) == 0) { -// basis[i].copy(num); +//void insert(bs& num) { +// for (int i = BIT; i >= 0; --i) { +// if (num[i] == 1) { +// if (basis[i][i] == 0) { +// basis[i] = num; // inspos[basiz++] = i; // return; // } -// num.eor(basis[i]); +// num ^= basis[i]; // } // } //} // -//BitSet maxEor() { -// BitSet res = BitSet(); +//bs maxEor() { +// bs ret; // for (int i = BIT; i >= 0; i--) { -// if (res.get(i) == 0 && basis[i].get(i) == 1) { -// res.eor(basis[i]); +// if (ret[i] == 0 && basis[i][i] == 1) { +// ret ^= basis[i]; // } // } -// return res; +// return ret; //} // //void cancel(int oldsiz) { // while (basiz > oldsiz) { -// basis[inspos[--basiz]].clear(); +// basis[inspos[--basiz]].reset(); // } //} // -//int find(int i) { -// while (i != father[i]) { -// i = father[i]; +//int find(int v) { +// while (v != father[v]) { +// v = father[v]; // } -// return i; +// return v; //} // -//BitSet getEor(int i) { -// BitSet res = BitSet(); -// while (i != father[i]) { -// res.eor(eor[i]); -// i = father[i]; +//bs getEor(int v) { +// bs ret; +// while (v != father[v]) { +// ret ^= eor[v]; +// v = father[v]; // } -// return res; +// return ret; //} // -//bool Union(int u, int v, const BitSet& w) { +//bool Union(int u, int v, bs& w) { // int fu = find(u); // int fv = find(v); -// BitSet weight = BitSet(); -// weight.eor(getEor(u)); -// weight.eor(getEor(v)); -// weight.eor(w); +// bs weight = getEor(u) ^ getEor(v) ^ w; // if (fu == fv) { // insert(weight); // return false; @@ -149,7 +102,7 @@ // } // father[fv] = fu; // siz[fu] += siz[fv]; -// eor[fv].copy(weight); +// eor[fv] = weight; // rollback[++opsize][0] = fu; // rollback[opsize][1] = fv; // return true; @@ -159,19 +112,19 @@ // int fu = rollback[opsize][0]; // int fv = rollback[opsize--][1]; // father[fv] = fv; -// eor[fv].clear(); +// eor[fv].reset(); // siz[fu] -= siz[fv]; //} // -//void addEdge(int i, int u, int v, const BitSet& w) { +//void addEdge(int i, int u, int v, bs& w) { // nxt[++cnt] = head[i]; // tox[cnt] = u; // toy[cnt] = v; -// tow[cnt].copy(w); +// tow[cnt] = w; // head[i] = cnt; //} // -//void add(int jobl, int jobr, int jobx, int joby, const BitSet& jobw, int l, int r, int i) { +//void add(int jobl, int jobr, int jobx, int joby, bs& jobw, int l, int r, int i) { // if (jobl <= l && r <= jobr) { // addEdge(i, jobx, joby, jobw); // } else { @@ -188,9 +141,9 @@ //void dfs(int l, int r, int i) { // int oldsiz = basiz; // int unionCnt = 0; -// for (int e = head[i]; e > 0; e = nxt[e]) { +// for (int e = head[i]; e; e = nxt[e]) { // if (Union(tox[e], toy[e], tow[e])) { -// unionCnt++; +// ++unionCnt; // } // } // if (l == r) { @@ -206,15 +159,14 @@ // } //} // -//void print(const BitSet& bs) { +//void print(const bs& ret) { // bool flag = false; -// for (int i = BIT, s; i >= 0; i--) { -// s = bs.get(i); -// if (s == 1) { +// for (int i = BIT; i >= 0; i--) { +// if (ret[i] == 1) { // flag = true; // } // if (flag) { -// cout << s; +// cout << ret[i]; // } // } // if (!flag) { @@ -227,19 +179,19 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m >> q; -// for (int i = 0; i <= BIT; i++) { -// basis[i] = BitSet(); +// for (int i = 0; i <= BIT; ++i) { +// basis[i].reset(); // } -// for (int i = 1; i <= n; i++) { +// for (int i = 1; i <= n; ++i) { // father[i] = i; // siz[i] = 1; -// eor[i] = BitSet(); +// eor[i].reset(); // } // int u, v; -// string str; -// for (int i = 1; i <= m; i++) { -// cin >> u >> v >> str; -// Union(u, v, BitSet(str)); +// bs weight; +// for (int i = 1; i <= m; ++i) { +// cin >> u >> v >> weight; +// Union(u, v, weight); // } // ans[0] = maxEor(); // string op; @@ -248,9 +200,7 @@ // cin >> op; // if (op == "Add") { // ++edgeCnt; -// cin >> x[edgeCnt] >> y[edgeCnt]; -// cin >> str; -// w[edgeCnt] = BitSet(str); +// cin >> x[edgeCnt] >> y[edgeCnt] >> w[edgeCnt]; // last[edgeCnt] = i; // } else if (op == "Cancel") { // cin >> k; @@ -259,13 +209,12 @@ // } else { // cin >> k; // add(last[k], i - 1, x[k], y[k], w[k], 1, q, 1); -// cin >> str; -// w[k] = BitSet(str); +// cin >> w[k]; // last[k] = i; // } // } // for (int i = 1; i <= edgeCnt; i++) { -// if (last[i] > 0) { +// if (last[i] != 0) { // add(last[i], q, x[i], y[i], w[i], 1, q, 1); // } // } From bb80a8b80a11dde327a2a519e5580b4780f84b8f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 2 May 2025 22:50:51 +0800 Subject: [PATCH 0052/1170] modify code --- src/class167/Code05_AdditionOnSegments2.java | 90 +++----------------- 1 file changed, 13 insertions(+), 77 deletions(-) diff --git a/src/class167/Code05_AdditionOnSegments2.java b/src/class167/Code05_AdditionOnSegments2.java index f51b0bff6..3c7c5100c 100644 --- a/src/class167/Code05_AdditionOnSegments2.java +++ b/src/class167/Code05_AdditionOnSegments2.java @@ -10,85 +10,22 @@ // //using namespace std; // -//using ui = unsigned int; -// //const int MAXN = 10001; //const int MAXT = 500001; //const int BIT = 10000; -//const int INTBIT = 32; -//const int LEN = BIT / INTBIT + 1; //const int DEEP = 20; -//int n, q; // +//typedef bitset bs; +// +//int n, q; //int head[MAXN << 2]; //int nxt[MAXT]; //int to[MAXT]; //int cnt = 0; // -//ui tmp[LEN]; -//ui path[LEN]; -//ui backup[DEEP][LEN]; -//ui ans[LEN]; -// -//void clear(ui* bitset) { -// for (int i = 0; i < LEN; i++) { -// bitset[i] = 0; -// } -//} -// -//void clone(ui* set1, ui* set2) { -// for (int i = 0; i < LEN; i++) { -// set1[i] = set2[i]; -// } -//} -// -//int getBit(ui* bitset, int i) { -// return (bitset[i / INTBIT] >> (i % INTBIT)) & 1; -//} -// -//void setBit(ui* bitset, int i, int v) { -// if (v == 0) { -// bitset[i / INTBIT] &= ~(1u << (i % INTBIT)); -// } else { -// bitset[i / INTBIT] |= 1u << (i % INTBIT); -// } -//} -// -//void bitOr(ui* set1, ui* set2) { -// for (int i = 0; i < LEN; i++) { -// set1[i] |= set2[i]; -// } -//} -// -//void bitLeft(ui* ret, ui* bitset, int move) { -// clear(ret); -// if (move > BIT) { -// return; -// } -// if (move <= 0) { -// clone(ret, bitset); -// return; -// } -// int shift = move / INTBIT; -// int offset = move % INTBIT; -// if (offset == 0) { -// for (int i = LEN - 1, j = i - shift; j >= 0; i--, j--) { -// ret[i] = bitset[j]; -// } -// } else { -// int carry = INTBIT - offset; -// for (int i = LEN - 1; i > shift; i--) { -// ui high = bitset[i - shift] << offset; -// ui low = bitset[i - shift - 1] >> carry; -// ret[i] = high | low; -// } -// ret[shift] = bitset[0] << offset; -// } -// int rest = LEN * INTBIT - (BIT + 1); -// if (rest > 0) { -// ret[LEN - 1] &= (1u << (INTBIT - rest)) - 1u; -// } -//} +//bs path; +//bs backup[DEEP]; +//bs ans; // //void addEdge(int i, int v) { // nxt[++cnt] = head[i]; @@ -111,19 +48,18 @@ //} // //void dfs(int l, int r, int i, int dep) { -// clone(backup[dep], path); +// backup[dep] = path; // for (int e = head[i]; e > 0; e = nxt[e]) { -// bitLeft(tmp, path, to[e]); -// bitOr(path, tmp); +// path |= path << to[e]; // } // if (l == r) { -// bitOr(ans, path); +// ans |= path; // } else { // int mid = (l + r) >> 1; // dfs(l, mid, i << 1, dep + 1); // dfs(mid + 1, r, i << 1 | 1, dep + 1); // } -// clone(path, backup[dep]); +// path = backup[dep]; //} // //int main() { @@ -134,17 +70,17 @@ // cin >> l >> r >> k; // add(l, r, k, 1, n, 1); // } -// setBit(path, 0, 1); +// path[0] = 1; // dfs(1, n, 1, 1); // int ansCnt = 0; // for (int i = 1; i <= n; i++) { -// if (getBit(ans, i) == 1) { +// if (ans[i] == 1) { // ansCnt++; // } // } // cout << ansCnt << '\n'; // for (int i = 1; i <= n; i++) { -// if (getBit(ans, i) == 1) { +// if (ans[i] == 1) { // cout << i << ' '; // } // } From d8ab2b073d993095555495a4a975cc67f61a1544 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 3 May 2025 10:56:36 +0800 Subject: [PATCH 0053/1170] modify code --- ...AdditionOnSegments1.java => Code01_AdditionOnSegments1.java} | 2 +- ...AdditionOnSegments2.java => Code01_AdditionOnSegments2.java} | 0 ...ortestPathQueries1.java => Code04_ShortestPathQueries1.java} | 2 +- ...ortestPathQueries2.java => Code04_ShortestPathQueries2.java} | 0 ...calHorizontal1.java => Code05_EightVerticalHorizontal1.java} | 2 +- ...calHorizontal2.java => Code05_EightVerticalHorizontal2.java} | 0 .../{Code03_MinimumXor1.java => Code06_MinimumXor1.java} | 2 +- .../{Code03_MinimumXor2.java => Code06_MinimumXor2.java} | 0 src/class167/{Code04_MarsStore1.java => Code07_MarsStore1.java} | 2 +- src/class167/{Code04_MarsStore2.java => Code07_MarsStore2.java} | 0 10 files changed, 5 insertions(+), 5 deletions(-) rename src/class167/{Code05_AdditionOnSegments1.java => Code01_AdditionOnSegments1.java} (99%) rename src/class167/{Code05_AdditionOnSegments2.java => Code01_AdditionOnSegments2.java} (100%) rename src/class167/{Code01_ShortestPathQueries1.java => Code04_ShortestPathQueries1.java} (99%) rename src/class167/{Code01_ShortestPathQueries2.java => Code04_ShortestPathQueries2.java} (100%) rename src/class167/{Code02_EightVerticalHorizontal1.java => Code05_EightVerticalHorizontal1.java} (99%) rename src/class167/{Code02_EightVerticalHorizontal2.java => Code05_EightVerticalHorizontal2.java} (100%) rename src/class167/{Code03_MinimumXor1.java => Code06_MinimumXor1.java} (98%) rename src/class167/{Code03_MinimumXor2.java => Code06_MinimumXor2.java} (100%) rename src/class167/{Code04_MarsStore1.java => Code07_MarsStore1.java} (99%) rename src/class167/{Code04_MarsStore2.java => Code07_MarsStore2.java} (100%) diff --git a/src/class167/Code05_AdditionOnSegments1.java b/src/class167/Code01_AdditionOnSegments1.java similarity index 99% rename from src/class167/Code05_AdditionOnSegments1.java rename to src/class167/Code01_AdditionOnSegments1.java index 8535e7d67..ad2ffcb1d 100644 --- a/src/class167/Code05_AdditionOnSegments1.java +++ b/src/class167/Code01_AdditionOnSegments1.java @@ -10,7 +10,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_AdditionOnSegments1 { +public class Code01_AdditionOnSegments1 { public static int MAXN = 10001; public static int MAXT = 500001; diff --git a/src/class167/Code05_AdditionOnSegments2.java b/src/class167/Code01_AdditionOnSegments2.java similarity index 100% rename from src/class167/Code05_AdditionOnSegments2.java rename to src/class167/Code01_AdditionOnSegments2.java diff --git a/src/class167/Code01_ShortestPathQueries1.java b/src/class167/Code04_ShortestPathQueries1.java similarity index 99% rename from src/class167/Code01_ShortestPathQueries1.java rename to src/class167/Code04_ShortestPathQueries1.java index e85069f8e..e7105f56d 100644 --- a/src/class167/Code01_ShortestPathQueries1.java +++ b/src/class167/Code04_ShortestPathQueries1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code01_ShortestPathQueries1 { +public class Code04_ShortestPathQueries1 { public static int MAXN = 200001; public static int MAXT = 5000001; diff --git a/src/class167/Code01_ShortestPathQueries2.java b/src/class167/Code04_ShortestPathQueries2.java similarity index 100% rename from src/class167/Code01_ShortestPathQueries2.java rename to src/class167/Code04_ShortestPathQueries2.java diff --git a/src/class167/Code02_EightVerticalHorizontal1.java b/src/class167/Code05_EightVerticalHorizontal1.java similarity index 99% rename from src/class167/Code02_EightVerticalHorizontal1.java rename to src/class167/Code05_EightVerticalHorizontal1.java index b1e0c53ab..4d3110df4 100644 --- a/src/class167/Code02_EightVerticalHorizontal1.java +++ b/src/class167/Code05_EightVerticalHorizontal1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_EightVerticalHorizontal1 { +public class Code05_EightVerticalHorizontal1 { public static int MAXN = 501; public static int MAXQ = 1001; diff --git a/src/class167/Code02_EightVerticalHorizontal2.java b/src/class167/Code05_EightVerticalHorizontal2.java similarity index 100% rename from src/class167/Code02_EightVerticalHorizontal2.java rename to src/class167/Code05_EightVerticalHorizontal2.java diff --git a/src/class167/Code03_MinimumXor1.java b/src/class167/Code06_MinimumXor1.java similarity index 98% rename from src/class167/Code03_MinimumXor1.java rename to src/class167/Code06_MinimumXor1.java index 8b34db95d..b8ad05e0b 100644 --- a/src/class167/Code03_MinimumXor1.java +++ b/src/class167/Code06_MinimumXor1.java @@ -10,7 +10,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code03_MinimumXor1 { +public class Code06_MinimumXor1 { public static int MAXN = 10000001; public static int BIT = 29; diff --git a/src/class167/Code03_MinimumXor2.java b/src/class167/Code06_MinimumXor2.java similarity index 100% rename from src/class167/Code03_MinimumXor2.java rename to src/class167/Code06_MinimumXor2.java diff --git a/src/class167/Code04_MarsStore1.java b/src/class167/Code07_MarsStore1.java similarity index 99% rename from src/class167/Code04_MarsStore1.java rename to src/class167/Code07_MarsStore1.java index 4c3b86841..472b13314 100644 --- a/src/class167/Code04_MarsStore1.java +++ b/src/class167/Code07_MarsStore1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code04_MarsStore1 { +public class Code07_MarsStore1 { public static int MAXN = 100001; public static int MAXT = 2000001; diff --git a/src/class167/Code04_MarsStore2.java b/src/class167/Code07_MarsStore2.java similarity index 100% rename from src/class167/Code04_MarsStore2.java rename to src/class167/Code07_MarsStore2.java From 719692670facd0f9e00b6ca773f529ffea863042 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 3 May 2025 12:28:31 +0800 Subject: [PATCH 0054/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 186 ++++++++++++++++++ src/class167/Code01_MuseumRobbery2.java | 140 +++++++++++++ ...1.java => Code02_AdditionOnSegments1.java} | 2 +- ...2.java => Code02_AdditionOnSegments2.java} | 0 4 files changed, 327 insertions(+), 1 deletion(-) create mode 100644 src/class167/Code01_MuseumRobbery1.java create mode 100644 src/class167/Code01_MuseumRobbery2.java rename src/class167/{Code01_AdditionOnSegments1.java => Code02_AdditionOnSegments1.java} (99%) rename src/class167/{Code01_AdditionOnSegments2.java => Code02_AdditionOnSegments2.java} (100%) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java new file mode 100644 index 000000000..c1f8328d9 --- /dev/null +++ b/src/class167/Code01_MuseumRobbery1.java @@ -0,0 +1,186 @@ +package class167; + +// 博物馆抢劫案,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF601E +// 测试链接 : https://codeforces.com/problemset/problem/601/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code01_MuseumRobbery1 { + + public static int MAXN = 40001; + public static int MAXQ = 30001; + public static int MAXT = 1000001; + public static int MAXK = 1001; + public static int DEEP = 20; + public static int MOD = 1000000007; + public static int BASE = 10000019; + public static int n, k, q; + + public static int[] v = new int[MAXN]; + public static int[] w = new int[MAXN]; + public static int[] from = new int[MAXN]; + public static int[] to = new int[MAXN]; + + public static int[] op = new int[MAXQ]; + public static int[] x = new int[MAXQ]; + public static int[] y = new int[MAXQ]; + + public static int[] head = new int[MAXQ << 2]; + public static int[] next = new int[MAXT]; + public static int[] tov = new int[MAXT]; + public static int[] tow = new int[MAXT]; + public static int cnt = 0; + + public static long[] dp = new long[MAXK]; + public static long[][] backup = new long[DEEP][MAXK]; + + public static long[] ans = new long[MAXQ]; + + public static void clone(long[] a, long[] b) { + for (int i = 0; i <= k; i++) { + a[i] = b[i]; + } + } + + public static void addEdge(int i, int v, int w) { + next[++cnt] = head[i]; + tov[cnt] = v; + tow[cnt] = w; + head[i] = cnt; + } + + public static void add(int jobl, int jobr, int jobv, int jobw, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdge(i, jobv, jobw); + } else { + int mid = (l + r) >> 1; + if (jobl <= mid) { + add(jobl, jobr, jobv, jobw, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobv, jobw, mid + 1, r, i << 1 | 1); + } + } + } + + public static void dfs(int l, int r, int i, int dep) { + clone(backup[dep], dp); + for (int e = head[i]; e > 0; e = next[e]) { + int v = tov[e]; + int w = tow[e]; + for (int j = k; j >= w; j--) { + dp[j] = Math.max(dp[j], dp[j - w] + v); + } + } + if (l == r) { + if (op[l] == 3) { + long b = 1; + for (int j = 1; j <= k; j++) { + ans[l] = (ans[l] + dp[j] * b) % MOD; + b = (b * BASE) % MOD; + } + } + } else { + int mid = (l + r) >> 1; + dfs(l, mid, i << 1, dep + 1); + dfs(mid + 1, r, i << 1 | 1, dep + 1); + } + clone(dp, backup[dep]); + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + from[i] = 1; + to[i] = q; + } + for (int i = 1; i <= q; i++) { + if (op[i] == 1) { + n++; + v[n] = x[i]; + w[n] = y[i]; + from[n] = i; + to[n] = q; + } else if (op[i] == 2) { + to[x[i]] = i; + } + } + for (int i = 1; i <= n; i++) { + add(from[i], to[i], v[i], w[i], 1, q, 1); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + k = in.nextInt(); + for (int i = 1; i <= n; i++) { + v[i] = in.nextInt(); + w[i] = in.nextInt(); + } + q = in.nextInt(); + for (int i = 1; i <= q; i++) { + op[i] = in.nextInt(); + if (op[i] == 1) { + x[i] = in.nextInt(); + y[i] = in.nextInt(); + } else if (op[i] == 2) { + x[i] = in.nextInt(); + } + } + prepare(); + dfs(1, q, 1, 1); + for (int i = 1; i <= q; i++) { + if (op[i] == 3) { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java new file mode 100644 index 000000000..7dd2247c2 --- /dev/null +++ b/src/class167/Code01_MuseumRobbery2.java @@ -0,0 +1,140 @@ +package class167; + +// 博物馆抢劫案,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF601E +// 测试链接 : https://codeforces.com/problemset/problem/601/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 40001; +//const int MAXQ = 30001; +//const int MAXT = 1000001; +//const int MAXK = 1001; +//const int DEEP = 20; +//const long long MOD = 1000000007LL; +//const long long BASE = 10000019LL; +// +//int n, k, q; +// +//int v[MAXN]; +//int w[MAXN]; +//int from[MAXN]; +//int to[MAXN]; +// +//int op[MAXQ]; +//int x[MAXQ]; +//int y[MAXQ]; +// +//int head[MAXQ << 2]; +//int nxt[MAXT]; +//int tov[MAXT]; +//int tow[MAXT]; +//int cnt = 0; +// +//long long dp[MAXK]; +//long long backup[DEEP][MAXK]; +// +//long long ans[MAXQ]; +// +//void clone(long long* a, long long* b) { +// for (int i = 0; i <= k; i++) { +// a[i] = b[i]; +// } +//} +// +//void addEdge(int i, int v, int w) { +// nxt[++cnt] = head[i]; +// tov[cnt] = v; +// tow[cnt] = w; +// head[i] = cnt; +//} +// +//void add(int jobl, int jobr, int jobv, int jobw, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobv, jobw); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobv, jobw, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobv, jobw, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i, int dep) { +// clone(backup[dep], dp); +// for (int e = head[i]; e > 0; e = nxt[e]) { +// int v = tov[e]; +// int w = tow[e]; +// for (int j = k; j >= w; j--) { +// dp[j] = max(dp[j], dp[j - w] + v); +// } +// } +// if (l == r) { +// if (op[l] == 3) { +// long long b = 1; +// for (int j = 1; j <= k; j++) { +// ans[l] = (ans[l] + dp[j] * b) % MOD; +// b = (b * BASE) % MOD; +// } +// } +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1, dep + 1); +// dfs(mid + 1, r, i << 1 | 1, dep + 1); +// } +// clone(dp, backup[dep]); +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// from[i] = 1; +// to[i] = q; +// } +// for (int i = 1; i <= q; i++) { +// if (op[i] == 1) { +// n++; +// v[n] = x[i]; +// w[n] = y[i]; +// from[n] = i; +// to[n] = q; +// } else if (op[i] == 2) { +// to[x[i]] = i; +// } +// } +// for (int i = 1; i <= n; i++) { +// add(from[i], to[i], v[i], w[i], 1, q, 1); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> k; +// for (int i = 1; i <= n; i++) { +// cin >> v[i] >> w[i]; +// } +// cin >> q; +// for (int i = 1; i <= q; i++) { +// cin >> op[i]; +// if (op[i] == 1) { +// cin >> x[i] >> y[i]; +// } else if (op[i] == 2) { +// cin >> x[i]; +// } +// } +// prepare(); +// dfs(1, q, 1, 1); +// for (int i = 1; i <= q; i++) { +// if (op[i] == 3) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class167/Code01_AdditionOnSegments1.java b/src/class167/Code02_AdditionOnSegments1.java similarity index 99% rename from src/class167/Code01_AdditionOnSegments1.java rename to src/class167/Code02_AdditionOnSegments1.java index ad2ffcb1d..dcd7355ac 100644 --- a/src/class167/Code01_AdditionOnSegments1.java +++ b/src/class167/Code02_AdditionOnSegments1.java @@ -10,7 +10,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code01_AdditionOnSegments1 { +public class Code02_AdditionOnSegments1 { public static int MAXN = 10001; public static int MAXT = 500001; diff --git a/src/class167/Code01_AdditionOnSegments2.java b/src/class167/Code02_AdditionOnSegments2.java similarity index 100% rename from src/class167/Code01_AdditionOnSegments2.java rename to src/class167/Code02_AdditionOnSegments2.java From ee55078bbca64dc9253e987b54709d3d6732c79c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 3 May 2025 12:29:58 +0800 Subject: [PATCH 0055/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 3 +-- src/class167/Code01_MuseumRobbery2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index c1f8328d9..8284d29eb 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -1,6 +1,6 @@ package class167; -// 博物馆抢劫案,java版 +// 博物馆劫案,java版 // 测试链接 : https://www.luogu.com.cn/problem/CF601E // 测试链接 : https://codeforces.com/problemset/problem/601/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -38,7 +38,6 @@ public class Code01_MuseumRobbery1 { public static long[] dp = new long[MAXK]; public static long[][] backup = new long[DEEP][MAXK]; - public static long[] ans = new long[MAXQ]; public static void clone(long[] a, long[] b) { diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java index 7dd2247c2..e05e1e59b 100644 --- a/src/class167/Code01_MuseumRobbery2.java +++ b/src/class167/Code01_MuseumRobbery2.java @@ -1,6 +1,6 @@ package class167; -// 博物馆抢劫案,C++版 +// 博物馆劫案,C++版 // 测试链接 : https://www.luogu.com.cn/problem/CF601E // 测试链接 : https://codeforces.com/problemset/problem/601/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -37,7 +37,6 @@ // //long long dp[MAXK]; //long long backup[DEEP][MAXK]; -// //long long ans[MAXQ]; // //void clone(long long* a, long long* b) { From b4c3c891455a56b8583b96213e02c355c99d02fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 3 May 2025 12:36:03 +0800 Subject: [PATCH 0056/1170] modify code --- src/class167/Code03_BlueMoon1.java | 87 +++++++++++++++++++ .../Code05_EightVerticalHorizontal1.java | 16 ---- 2 files changed, 87 insertions(+), 16 deletions(-) create mode 100644 src/class167/Code03_BlueMoon1.java diff --git a/src/class167/Code03_BlueMoon1.java b/src/class167/Code03_BlueMoon1.java new file mode 100644 index 000000000..6cc990aa9 --- /dev/null +++ b/src/class167/Code03_BlueMoon1.java @@ -0,0 +1,87 @@ +package class167; + +// 贪玩蓝月,java版 +// 测试链接 : https://loj.ac/p/6515 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code03_BlueMoon1 { + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private static final int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) { + return true; + } + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) { + return -1; + } + return buffer[ptr++]; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) { + b = readByte(); + } + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + public String nextString() throws IOException { + byte b = readByte(); + while (isWhitespace(b)) { + b = readByte(); + } + StringBuilder sb = new StringBuilder(1000); + while (!isWhitespace(b) && b != -1) { + sb.append((char) b); + b = readByte(); + } + return sb.toString(); + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class167/Code05_EightVerticalHorizontal1.java b/src/class167/Code05_EightVerticalHorizontal1.java index 4d3110df4..e7931b773 100644 --- a/src/class167/Code05_EightVerticalHorizontal1.java +++ b/src/class167/Code05_EightVerticalHorizontal1.java @@ -327,22 +327,6 @@ private byte readByte() throws IOException { return buffer[ptr++]; } - public char nextChar() throws IOException { - byte c; - do { - c = readByte(); - if (c == -1) { - return 0; - } - } while (c <= ' '); - char ans = 0; - while (c > ' ') { - ans = (char) c; - c = readByte(); - } - return ans; - } - public int nextInt() throws IOException { int num = 0; byte b = readByte(); From ea59ff56bbd7e4ac2a98f03236398dd64d909f92 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 3 May 2025 12:39:55 +0800 Subject: [PATCH 0057/1170] modify code --- src/class167/{Code07_MarsStore1.java => Code06_MarsStore1.java} | 2 +- src/class167/{Code07_MarsStore2.java => Code06_MarsStore2.java} | 0 .../{Code06_MinimumXor1.java => Code07_MinimumXor1.java} | 2 +- .../{Code06_MinimumXor2.java => Code07_MinimumXor2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class167/{Code07_MarsStore1.java => Code06_MarsStore1.java} (99%) rename src/class167/{Code07_MarsStore2.java => Code06_MarsStore2.java} (100%) rename src/class167/{Code06_MinimumXor1.java => Code07_MinimumXor1.java} (98%) rename src/class167/{Code06_MinimumXor2.java => Code07_MinimumXor2.java} (100%) diff --git a/src/class167/Code07_MarsStore1.java b/src/class167/Code06_MarsStore1.java similarity index 99% rename from src/class167/Code07_MarsStore1.java rename to src/class167/Code06_MarsStore1.java index 472b13314..a44118266 100644 --- a/src/class167/Code07_MarsStore1.java +++ b/src/class167/Code06_MarsStore1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code07_MarsStore1 { +public class Code06_MarsStore1 { public static int MAXN = 100001; public static int MAXT = 2000001; diff --git a/src/class167/Code07_MarsStore2.java b/src/class167/Code06_MarsStore2.java similarity index 100% rename from src/class167/Code07_MarsStore2.java rename to src/class167/Code06_MarsStore2.java diff --git a/src/class167/Code06_MinimumXor1.java b/src/class167/Code07_MinimumXor1.java similarity index 98% rename from src/class167/Code06_MinimumXor1.java rename to src/class167/Code07_MinimumXor1.java index b8ad05e0b..c0d53c1c1 100644 --- a/src/class167/Code06_MinimumXor1.java +++ b/src/class167/Code07_MinimumXor1.java @@ -10,7 +10,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code06_MinimumXor1 { +public class Code07_MinimumXor1 { public static int MAXN = 10000001; public static int BIT = 29; diff --git a/src/class167/Code06_MinimumXor2.java b/src/class167/Code07_MinimumXor2.java similarity index 100% rename from src/class167/Code06_MinimumXor2.java rename to src/class167/Code07_MinimumXor2.java From 4b722721ad3a0c66f532face2216a38564cc0b29 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 3 May 2025 15:16:31 +0800 Subject: [PATCH 0058/1170] modify code --- src/class167/Code03_BlueMoon1.java | 146 +++++++++++++++++++++++++++- src/class167/Code03_BlueMoon2.java | 149 +++++++++++++++++++++++++++++ 2 files changed, 292 insertions(+), 3 deletions(-) create mode 100644 src/class167/Code03_BlueMoon2.java diff --git a/src/class167/Code03_BlueMoon1.java b/src/class167/Code03_BlueMoon1.java index 6cc990aa9..2701fd2de 100644 --- a/src/class167/Code03_BlueMoon1.java +++ b/src/class167/Code03_BlueMoon1.java @@ -8,13 +8,153 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.util.ArrayDeque; +import java.util.Deque; public class Code03_BlueMoon1 { - + + public static int MAXM = 50001; + public static int MAXP = 501; + public static int MAXT = 1000001; + public static long INF = 1000000000001L; + public static int m, p; + + public static int[] op = new int[MAXM]; + public static int[] x = new int[MAXM]; + public static int[] y = new int[MAXM]; + + public static int[] head = new int[MAXM << 2]; + public static int[] next = new int[MAXT]; + public static int[] tow = new int[MAXT]; + public static int[] tov = new int[MAXT]; + public static int cnt = 0; + + public static int used = 0; + public static long[][] dp = new long[MAXM][MAXP]; + public static long[] ans = new long[MAXM]; + + public static void addEdge(int i, int w, int v) { + next[++cnt] = head[i]; + tow[cnt] = w; + tov[cnt] = v; + head[i] = cnt; + } + + public static void add(int jobl, int jobr, int jobw, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdge(i, jobw, jobv); + } else { + int mid = (l + r) >> 1; + if (jobl <= mid) { + add(jobl, jobr, jobw, jobv, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobw, jobv, mid + 1, r, i << 1 | 1); + } + } + } + + public static void dfs(int l, int r, int i) { + int siz = 0; + for (int e = head[i], w, v; e > 0; e = next[e]) { + w = tow[e]; + v = tov[e]; + for (int j = 0; j < p; j++) { + dp[used + siz + 1][j] = dp[used + siz][j]; + } + for (int j = 0; j < p; j++) { + if (dp[used + siz][j] != -INF) { + dp[used + siz + 1][(j + w) % p] = Math.max(dp[used + siz + 1][(j + w) % p], dp[used + siz][j] + v); + } + } + siz++; + } + used += siz; + if (l == r) { + if (op[l] == 5) { + long ret = -INF; + for (int j = x[l]; j <= y[l]; j++) { + ret = Math.max(ret, dp[used][j]); + } + if (ret == -INF) { + ans[l] = -1; + } else { + ans[l] = ret; + } + } + } else { + int mid = (l + r) >> 1; + dfs(l, mid, i << 1); + dfs(mid + 1, r, i << 1 | 1); + } + used -= siz; + } + + public static void prepare() { + Deque deque = new ArrayDeque<>(); + int[] data; + for (int i = 1; i <= m; i++) { + if (op[i] == 1) { + deque.addFirst(new int[] { x[i] % p, y[i], i }); + } else if (op[i] == 2) { + deque.addLast(new int[] { x[i] % p, y[i], i }); + } else if (op[i] == 3) { + data = deque.peekFirst(); + add(data[2], i - 1, data[0], data[1], 1, m, 1); + deque.pollFirst(); + } else if (op[i] == 4) { + data = deque.peekLast(); + add(data[2], i - 1, data[0], data[1], 1, m, 1); + deque.pollLast(); + } + } + while (!deque.isEmpty()) { + data = deque.peekFirst(); + add(data[2], m, data[0], data[1], 1, m, 1); + deque.pollFirst(); + } + for (int i = 0; i < MAXM; i++) { + for (int j = 0; j < MAXP; j++) { + dp[i][j] = -INF; + } + } + dp[0][0] = 0; + } + public static void main(String[] args) throws IOException { FastReader in = new FastReader(); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - + in.nextInt(); + m = in.nextInt(); + p = in.nextInt(); + String t; + for (int i = 1; i <= m; i++) { + t = in.nextString(); + if (t.equals("IF")) { + op[i] = 1; + x[i] = in.nextInt(); + y[i] = in.nextInt(); + } else if (t.equals("IG")) { + op[i] = 2; + x[i] = in.nextInt(); + y[i] = in.nextInt(); + } else if (t.equals("DF")) { + op[i] = 3; + } else if (t.equals("DG")) { + op[i] = 4; + } else { + op[i] = 5; + x[i] = in.nextInt(); + y[i] = in.nextInt(); + } + } + prepare(); + dfs(1, m, 1); + for (int i = 1; i <= m; i++) { + if (op[i] == 5) { + out.println(ans[i]); + } + } out.flush(); out.close(); } @@ -84,4 +224,4 @@ private boolean isWhitespace(byte b) { } } -} +} \ No newline at end of file diff --git a/src/class167/Code03_BlueMoon2.java b/src/class167/Code03_BlueMoon2.java new file mode 100644 index 000000000..934e1f4be --- /dev/null +++ b/src/class167/Code03_BlueMoon2.java @@ -0,0 +1,149 @@ +package class167; + +// 贪玩蓝月,C++版 +// 测试链接 : https://loj.ac/p/6515 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXM = 50001; +//const int MAXP = 501; +//const int MAXT = 1000001; +//const long long INF = 1000000000001LL; +// +//int m, p; +// +//int op[MAXM]; +//int x[MAXM]; +//int y[MAXM]; +// +//int head[MAXM << 2]; +//int nxt[MAXT]; +//int tow[MAXT]; +//int tov[MAXT]; +//int cnt = 0; +// +//int used = 0; +//long long dp[MAXM][MAXP]; +//long long ans[MAXM]; +// +//void addEdge(int i, int w, int v) { +// nxt[++cnt] = head[i]; +// tow[cnt] = w; +// tov[cnt] = v; +// head[i] = cnt; +//} +// +//void add(int jobl, int jobr, int jobw, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addEdge(i, jobw, jobv); +// } else { +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// add(jobl, jobr, jobw, jobv, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobw, jobv, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void dfs(int l, int r, int i) { +// int siz = 0; +// for (int e = head[i], w, v; e > 0; e = nxt[e]) { +// w = tow[e]; +// v = tov[e]; +// for (int j = 0; j < p; j++) { +// dp[used + siz + 1][j] = dp[used + siz][j]; +// } +// for (int j = 0; j < p; j++) { +// if (dp[used + siz][j] != -INF) { +// int nj = (j + w) % p; +// dp[used + siz + 1][nj] = max(dp[used + siz + 1][nj], dp[used + siz][j] + v); +// } +// } +// siz++; +// } +// used += siz; +// if (l == r) { +// if (op[l] == 5) { +// long long ret = -INF; +// for (int j = x[l]; j <= y[l]; j++) { +// ret = max(ret, dp[used][j]); +// } +// ans[l] = (ret == -INF ? -1 : ret); +// } +// } else { +// int mid = (l + r) >> 1; +// dfs(l, mid, i << 1); +// dfs(mid + 1, r, i << 1 | 1); +// } +// used -= siz; +//} +// +//void prepare() { +// deque> dq; +// for (int i = 1; i <= m; i++) { +// if (op[i] == 1) { +// dq.push_front({x[i] % p, y[i], i}); +// } else if (op[i] == 2) { +// dq.push_back({x[i] % p, y[i], i}); +// } else if (op[i] == 3) { +// auto data = dq.front(); +// add(data[2], i - 1, data[0], data[1], 1, m, 1); +// dq.pop_front(); +// } else if (op[i] == 4) { +// auto data = dq.back(); +// add(data[2], i - 1, data[0], data[1], 1, m, 1); +// dq.pop_back(); +// } +// } +// while (!dq.empty()) { +// auto data = dq.front(); +// add(data[2], m, data[0], data[1], 1, m, 1); +// dq.pop_front(); +// } +// for (int i = 0; i < MAXM; i++) { +// for (int j = 0; j < MAXP; j++) { +// dp[i][j] = -INF; +// } +// } +// dp[0][0] = 0; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int tmp; +// cin >> tmp; +// cin >> m >> p; +// string t; +// for (int i = 1; i <= m; i++) { +// cin >> t; +// if (t == "IF") { +// op[i] = 1; +// cin >> x[i] >> y[i]; +// } else if (t == "IG") { +// op[i] = 2; +// cin >> x[i] >> y[i]; +// } else if (t == "DF") { +// op[i] = 3; +// } else if (t == "DG") { +// op[i] = 4; +// } else { +// op[i] = 5; +// cin >> x[i] >> y[i]; +// } +// } +// prepare(); +// dfs(1, m, 1); +// for (int i = 1; i <= m; i++) { +// if (op[i] == 5) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 4cff3ee798b602479899844ceda3f980ff12fb4b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 3 May 2025 18:34:42 +0800 Subject: [PATCH 0059/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 11 +++++++++++ src/class167/Code01_MuseumRobbery2.java | 11 +++++++++++ src/class167/Code02_AdditionOnSegments1.java | 8 +++++++- src/class167/Code02_AdditionOnSegments2.java | 8 +++++++- src/class167/Code03_BlueMoon1.java | 10 ++++++++++ src/class167/Code03_BlueMoon2.java | 10 ++++++++++ src/class167/Code04_ShortestPathQueries1.java | 8 ++++++++ src/class167/Code04_ShortestPathQueries2.java | 8 ++++++++ src/class167/Code05_EightVerticalHorizontal1.java | 12 +++++++++++- src/class167/Code05_EightVerticalHorizontal2.java | 12 +++++++++++- src/class167/Code06_MarsStore1.java | 7 +++++++ src/class167/Code06_MarsStore2.java | 7 +++++++ src/class167/Code07_MinimumXor1.java | 6 ++++++ src/class167/Code07_MinimumXor2.java | 6 ++++++ 14 files changed, 120 insertions(+), 4 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index 8284d29eb..743ec009f 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -1,6 +1,17 @@ package class167; // 博物馆劫案,java版 +// 给定一个正数k,假设当前商品集合为s,可以随意挑选商品 +// 总重量不超过m的情况下,能得到的最大价值,定义为best(m) +// 定义,f(s) = ∑(m = 1...k) ( best(m) * BASE的m-1次方 % MOD ) +// 其中BASE = 10000019,MOD = 1000000007 +// 给定n件商品,编号1~n,每种商品给定v和w,每件商品都加入商品集合s +// 接下来有q个操作,每种操作是如下三种类型中的一种 +// 操作 1 x y : 集合s中增加价值x、重量y的商品,编号自增即可 +// 操作 2 x : 集合s中删除编号为x的商品 +// 操作 3 : 查询当前的f(s) +// 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 +// 1 <= k、每件商品重量 <= 10^3 1 <= 每件商品价值 <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF601E // 测试链接 : https://codeforces.com/problemset/problem/601/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java index e05e1e59b..8c527cdb6 100644 --- a/src/class167/Code01_MuseumRobbery2.java +++ b/src/class167/Code01_MuseumRobbery2.java @@ -1,6 +1,17 @@ package class167; // 博物馆劫案,C++版 +// 给定一个正数k,假设当前商品集合为s,可以随意挑选商品 +// 总重量不超过m的情况下,能得到的最大价值,定义为best(m) +// 定义,f(s) = ∑(m = 1...k) ( best(m) * BASE的m-1次方 % MOD ) +// 其中BASE = 10000019,MOD = 1000000007 +// 给定n件商品,编号1~n,每种商品给定v和w,每件商品都加入商品集合s +// 接下来有q个操作,每种操作是如下三种类型中的一种 +// 操作 1 x y : 集合s中增加价值x、重量y的商品,编号自增即可 +// 操作 2 x : 集合s中删除编号为x的商品 +// 操作 3 : 查询当前的f(s) +// 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 +// 1 <= k、每件商品重量 <= 10^3 1 <= 每件商品价值 <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF601E // 测试链接 : https://codeforces.com/problemset/problem/601/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class167/Code02_AdditionOnSegments1.java b/src/class167/Code02_AdditionOnSegments1.java index dcd7355ac..136b6786a 100644 --- a/src/class167/Code02_AdditionOnSegments1.java +++ b/src/class167/Code02_AdditionOnSegments1.java @@ -1,6 +1,12 @@ package class167; -// 能达到的最大值,java版 +// 打印所有合法数,java版 +// 一个长度为n的序列,一开始所有值都是0 +// 一共有q条操作,每条操作为 l r k : 序列[l..r]范围上,每个数字加k +// 你可以随意选择操作来执行,但是每条操作只能执行一次 +// 如果你能让序列中的最大值正好为v,那么v就算一个合法数 +// 打印1~n范围内有多少合法数,并且从小到大打印所有的合法数 +// 1 <= k <= n、q <= 10^4 // 测试链接 : https://www.luogu.com.cn/problem/CF981E // 测试链接 : https://codeforces.com/problemset/problem/981/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class167/Code02_AdditionOnSegments2.java b/src/class167/Code02_AdditionOnSegments2.java index 3c7c5100c..4416dc887 100644 --- a/src/class167/Code02_AdditionOnSegments2.java +++ b/src/class167/Code02_AdditionOnSegments2.java @@ -1,6 +1,12 @@ package class167; -// 能达到的最大值,C++版 +// 打印所有合法数,C++版 +// 一个长度为n的序列,一开始所有值都是0 +// 一共有q条操作,每条操作为 l r k : 序列[l..r]范围上,每个数字加k +// 你可以随意选择操作来执行,但是每条操作只能执行一次 +// 如果你能让序列中的最大值正好为v,那么v就算一个合法数 +// 打印1~n范围内有多少合法数,并且从小到大打印所有的合法数 +// 1 <= k <= n、q <= 10^4 // 测试链接 : https://www.luogu.com.cn/problem/CF981E // 测试链接 : https://codeforces.com/problemset/problem/981/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class167/Code03_BlueMoon1.java b/src/class167/Code03_BlueMoon1.java index 2701fd2de..c01ea0197 100644 --- a/src/class167/Code03_BlueMoon1.java +++ b/src/class167/Code03_BlueMoon1.java @@ -1,6 +1,16 @@ package class167; // 贪玩蓝月,java版 +// 每件装备都有特征值w和战斗力v,放装备的背包是一个双端队列 +// 给定数值p,接下来有m条操作,每种操作是如下五种类型中的一种 +// 操作 IF x y : 背包前端加入一件特征值x、战斗力y的装备 +// 操作 IG x y : 背包后端加入一件特征值x、战斗力y的装备 +// 操作 DF : 删除背包前端的装备 +// 操作 DG : 删除背包后端的装备 +// 操作 QU x y : 选择装备的特征值累加和 % p,必须在[x, y]范围 +// 打印能得到的最大战斗力是多少,没有合法方案打印-1 +// 1 <= m <= 5 * 10^4 1 <= p <= 500 +// 0 <= 每件装备特征值、每件装备战斗力 <= 10^9 // 测试链接 : https://loj.ac/p/6515 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class167/Code03_BlueMoon2.java b/src/class167/Code03_BlueMoon2.java index 934e1f4be..07d74dd44 100644 --- a/src/class167/Code03_BlueMoon2.java +++ b/src/class167/Code03_BlueMoon2.java @@ -1,6 +1,16 @@ package class167; // 贪玩蓝月,C++版 +// 每件装备都有特征值w和战斗力v,放装备的背包是一个双端队列 +// 给定数值p,接下来有m条操作,每种操作是如下五种类型中的一种 +// 操作 IF x y : 背包前端加入一件特征值x、战斗力y的装备 +// 操作 IG x y : 背包后端加入一件特征值x、战斗力y的装备 +// 操作 DF : 删除背包前端的装备 +// 操作 DG : 删除背包后端的装备 +// 操作 QU x y : 选择装备的特征值累加和 % p,必须在[x, y]范围 +// 打印能得到的最大战斗力是多少,没有合法方案打印-1 +// 1 <= m <= 5 * 10^4 1 <= p <= 500 +// 0 <= 每件装备特征值、每件装备战斗力 <= 10^9 // 测试链接 : https://loj.ac/p/6515 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class167/Code04_ShortestPathQueries1.java b/src/class167/Code04_ShortestPathQueries1.java index e7105f56d..7f66f4468 100644 --- a/src/class167/Code04_ShortestPathQueries1.java +++ b/src/class167/Code04_ShortestPathQueries1.java @@ -1,6 +1,14 @@ package class167; // 异或最短路,java版 +// 一共有n个节点,m条边,每条边有边权 +// 接下来有q条操作,每种操作是如下三种类型中的一种 +// 操作 1 x y d : 原图中加入,点x到点y,权值为d的边 +// 操作 2 x y : 原图中删除,点x到点y的边 +// 操作 3 x y : 点x到点y,所有路随便走,沿途边权都异或起来 +// 打印能取得的异或最小值 +// 保证任意操作后,图连通、无重边、无自环,所有操作均合法 +// 1 <= n、m、q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF938G // 测试链接 : https://codeforces.com/problemset/problem/938/G // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class167/Code04_ShortestPathQueries2.java b/src/class167/Code04_ShortestPathQueries2.java index f99f9ef4f..0bf523f3a 100644 --- a/src/class167/Code04_ShortestPathQueries2.java +++ b/src/class167/Code04_ShortestPathQueries2.java @@ -1,6 +1,14 @@ package class167; // 异或最短路,C++版 +// 一共有n个节点,m条边,每条边有边权 +// 接下来有q条操作,每种操作是如下三种类型中的一种 +// 操作 1 x y d : 原图中加入,点x到点y,权值为d的边 +// 操作 2 x y : 原图中删除,点x到点y的边 +// 操作 3 x y : 点x到点y,所有路随便走,沿途边权都异或起来 +// 打印能取得的异或最小值 +// 保证任意操作后,图连通、无重边、无自环,所有操作均合法 +// 1 <= n、m、q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF938G // 测试链接 : https://codeforces.com/problemset/problem/938/G // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class167/Code05_EightVerticalHorizontal1.java b/src/class167/Code05_EightVerticalHorizontal1.java index e7931b773..bb3d163c3 100644 --- a/src/class167/Code05_EightVerticalHorizontal1.java +++ b/src/class167/Code05_EightVerticalHorizontal1.java @@ -1,6 +1,16 @@ package class167; // 八纵八横,java版 +// 一共有n个点,给定m条边,每条边的边权,用01字符串表达 +// 初始的m条边永不删除,接下来有q条操作,每种操作是如下三种类型中的一种 +// 操作 Add x y z : 加入点x到点y的边,边权是z,z为01字符串 +// 如果这是第k条添加操作,那么这条边编号为k +// 操作 Cancel k : 删除编号为k的边 +// 操作 Change k z : 编号为k的边,边权修改成z,z为01字符串 +// 从1号点出发,最后回到1号点,边随便走,沿途所有边的边权异或起来 +// 打印只有初始m条边的情况下,异或最大值为多少 +// 每一条操作结束后,都打印异或最大值为多少 +// 1 <= n、m <= 500 0 <= q <= 1000 1 <= 边权字符串长度 <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/P3733 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,7 +24,7 @@ public class Code05_EightVerticalHorizontal1 { public static int MAXN = 501; public static int MAXQ = 1001; public static int MAXT = 10001; - public static int BIT = 1000; + public static int BIT = 999; public static int INTBIT = 32; // 位图 diff --git a/src/class167/Code05_EightVerticalHorizontal2.java b/src/class167/Code05_EightVerticalHorizontal2.java index 1def385ed..88dff9a61 100644 --- a/src/class167/Code05_EightVerticalHorizontal2.java +++ b/src/class167/Code05_EightVerticalHorizontal2.java @@ -1,6 +1,16 @@ package class167; // 八纵八横,C++版 +// 一共有n个点,给定m条边,每条边的边权,用01字符串表达 +// 初始的m条边永不删除,接下来有q条操作,每种操作是如下三种类型中的一种 +// 操作 Add x y z : 加入点x到点y的边,边权是z,z为01字符串 +// 如果这是第k条添加操作,那么这条边编号为k +// 操作 Cancel k : 删除编号为k的边 +// 操作 Change k z : 编号为k的边,边权修改成z,z为01字符串 +// 从1号点出发,最后回到1号点,边随便走,沿途所有边的边权异或起来 +// 打印只有初始m条边的情况下,异或最大值为多少 +// 每一条操作结束后,都打印异或最大值为多少 +// 1 <= n、m <= 500 0 <= q <= 1000 1 <= 边权字符串长度 <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/P3733 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -12,7 +22,7 @@ //const int MAXN = 501; //const int MAXQ = 1001; //const int MAXT = 10001; -//const int BIT = 1000; +//const int BIT = 999; // //typedef bitset bs; // diff --git a/src/class167/Code06_MarsStore1.java b/src/class167/Code06_MarsStore1.java index a44118266..3252a11ea 100644 --- a/src/class167/Code06_MarsStore1.java +++ b/src/class167/Code06_MarsStore1.java @@ -1,6 +1,13 @@ package class167; // 火星商店,java版 +// 有n个商店,编号1~n,初始时每个商店只有一种商品,给定每个商店中唯一商品的价格 +// 有m条操作,每种操作是如下两种类型中的一种 +// 操作 0 s v : 只有操作0能让天数+1,第s号商店,这天新增了价格为v的商品 +// 操作 1 l r x d : 客人只在商店[l..r]中选择一件商品,只购买d天内的出现的商品 +// 所有符合要求的商品中,打印 商品的价格 ^ x 的最大值 +// 注意,只有操作0能让天数+1,操作1不会增加天数 +// 0 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4585 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class167/Code06_MarsStore2.java b/src/class167/Code06_MarsStore2.java index 7c9e60a8b..8060913ab 100644 --- a/src/class167/Code06_MarsStore2.java +++ b/src/class167/Code06_MarsStore2.java @@ -1,6 +1,13 @@ package class167; // 火星商店,C++版 +// 有n个商店,编号1~n,初始时每个商店只有一种商品,给定每个商店中唯一商品的价格 +// 有m条操作,每种操作是如下两种类型中的一种 +// 操作 0 s v : 只有操作0能让天数+1,第s号商店,这天新增了价格为v的商品 +// 操作 1 l r x d : 客人只在商店[l..r]中选择一件商品,只购买d天内的出现的商品 +// 所有符合要求的商品中,打印 商品的价格 ^ x 的最大值 +// 注意,只有操作0能让天数+1,操作1不会增加天数 +// 0 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4585 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class167/Code07_MinimumXor1.java b/src/class167/Code07_MinimumXor1.java index c0d53c1c1..41b3f1e51 100644 --- a/src/class167/Code07_MinimumXor1.java +++ b/src/class167/Code07_MinimumXor1.java @@ -1,6 +1,12 @@ package class167; // 最小异或查询,java版 +// 一共有q条操作,每种操作是如下三种类型中的一种 +// 操作 1 x : 黑板上写上一个数字x,同一种数字可以出现多次 +// 操作 2 x : 将一个x从黑板上擦掉,操作前保证至少有一个x在黑板上 +// 操作 3 : 打印任意两个数的最小异或值,操作前保证黑板上至少有两个数 +// 1 <= q <= 3 * 10^5 +// 0 <= x <= 2^30 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc308_g // 测试链接 : https://atcoder.jp/contests/abc308/tasks/abc308_g // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class167/Code07_MinimumXor2.java b/src/class167/Code07_MinimumXor2.java index 378dd3df0..e664267a2 100644 --- a/src/class167/Code07_MinimumXor2.java +++ b/src/class167/Code07_MinimumXor2.java @@ -1,6 +1,12 @@ package class167; // 最小异或查询,C++版 +// 一共有q条操作,每种操作是如下三种类型中的一种 +// 操作 1 x : 黑板上写上一个数字x,同一种数字可以出现多次 +// 操作 2 x : 将一个x从黑板上擦掉,操作前保证至少有一个x在黑板上 +// 操作 3 : 打印任意两个数的最小异或值,操作前保证黑板上至少有两个数 +// 1 <= q <= 3 * 10^5 +// 0 <= x <= 2^30 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc308_g // 测试链接 : https://atcoder.jp/contests/abc308/tasks/abc308_g // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From ed49a3c060cbbcff8dd9cb8934095118269a7df8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 3 May 2025 19:02:22 +0800 Subject: [PATCH 0060/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 8 +++----- src/class167/Code01_MuseumRobbery2.java | 8 +++----- src/class167/Code03_BlueMoon1.java | 2 +- src/class167/Code03_BlueMoon2.java | 2 +- src/class167/Code05_EightVerticalHorizontal1.java | 3 +-- src/class167/Code05_EightVerticalHorizontal2.java | 3 +-- 6 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index 743ec009f..67f118754 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -1,13 +1,11 @@ package class167; // 博物馆劫案,java版 -// 给定一个正数k,假设当前商品集合为s,可以随意挑选商品 -// 总重量不超过m的情况下,能得到的最大价值,定义为best(m) -// 定义,f(s) = ∑(m = 1...k) ( best(m) * BASE的m-1次方 % MOD ) -// 其中BASE = 10000019,MOD = 1000000007 +// 给定正数k、BASE、MOD,定义a(m) = 当前商品集合s中,挑选商品总重量<=m,能获得的最大价值 +// 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) // 给定n件商品,编号1~n,每种商品给定v和w,每件商品都加入商品集合s // 接下来有q个操作,每种操作是如下三种类型中的一种 -// 操作 1 x y : 集合s中增加价值x、重量y的商品,编号自增即可 +// 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 // 操作 2 x : 集合s中删除编号为x的商品 // 操作 3 : 查询当前的f(s) // 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java index 8c527cdb6..acf34670c 100644 --- a/src/class167/Code01_MuseumRobbery2.java +++ b/src/class167/Code01_MuseumRobbery2.java @@ -1,13 +1,11 @@ package class167; // 博物馆劫案,C++版 -// 给定一个正数k,假设当前商品集合为s,可以随意挑选商品 -// 总重量不超过m的情况下,能得到的最大价值,定义为best(m) -// 定义,f(s) = ∑(m = 1...k) ( best(m) * BASE的m-1次方 % MOD ) -// 其中BASE = 10000019,MOD = 1000000007 +// 给定正数k、BASE、MOD,定义a(m) = 当前商品集合s中,挑选商品总重量<=m,能获得的最大价值 +// 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) // 给定n件商品,编号1~n,每种商品给定v和w,每件商品都加入商品集合s // 接下来有q个操作,每种操作是如下三种类型中的一种 -// 操作 1 x y : 集合s中增加价值x、重量y的商品,编号自增即可 +// 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 // 操作 2 x : 集合s中删除编号为x的商品 // 操作 3 : 查询当前的f(s) // 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 diff --git a/src/class167/Code03_BlueMoon1.java b/src/class167/Code03_BlueMoon1.java index c01ea0197..8cbc2d2bf 100644 --- a/src/class167/Code03_BlueMoon1.java +++ b/src/class167/Code03_BlueMoon1.java @@ -1,7 +1,7 @@ package class167; // 贪玩蓝月,java版 -// 每件装备都有特征值w和战斗力v,放装备的背包是一个双端队列 +// 每件装备都有特征值w和战斗力v,放装备的背包是一个双端队列,只有背包中的装备是可选的 // 给定数值p,接下来有m条操作,每种操作是如下五种类型中的一种 // 操作 IF x y : 背包前端加入一件特征值x、战斗力y的装备 // 操作 IG x y : 背包后端加入一件特征值x、战斗力y的装备 diff --git a/src/class167/Code03_BlueMoon2.java b/src/class167/Code03_BlueMoon2.java index 07d74dd44..740212e10 100644 --- a/src/class167/Code03_BlueMoon2.java +++ b/src/class167/Code03_BlueMoon2.java @@ -1,7 +1,7 @@ package class167; // 贪玩蓝月,C++版 -// 每件装备都有特征值w和战斗力v,放装备的背包是一个双端队列 +// 每件装备都有特征值w和战斗力v,放装备的背包是一个双端队列,只有背包中的装备是可选的 // 给定数值p,接下来有m条操作,每种操作是如下五种类型中的一种 // 操作 IF x y : 背包前端加入一件特征值x、战斗力y的装备 // 操作 IG x y : 背包后端加入一件特征值x、战斗力y的装备 diff --git a/src/class167/Code05_EightVerticalHorizontal1.java b/src/class167/Code05_EightVerticalHorizontal1.java index bb3d163c3..dba6be8ba 100644 --- a/src/class167/Code05_EightVerticalHorizontal1.java +++ b/src/class167/Code05_EightVerticalHorizontal1.java @@ -8,8 +8,7 @@ // 操作 Cancel k : 删除编号为k的边 // 操作 Change k z : 编号为k的边,边权修改成z,z为01字符串 // 从1号点出发,最后回到1号点,边随便走,沿途所有边的边权异或起来 -// 打印只有初始m条边的情况下,异或最大值为多少 -// 每一条操作结束后,都打印异或最大值为多少 +// 打印只有初始m条边的情况下,异或最大值为多少,每一条操作结束后,都打印异或最大值为多少 // 1 <= n、m <= 500 0 <= q <= 1000 1 <= 边权字符串长度 <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/P3733 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class167/Code05_EightVerticalHorizontal2.java b/src/class167/Code05_EightVerticalHorizontal2.java index 88dff9a61..3d9a5e22e 100644 --- a/src/class167/Code05_EightVerticalHorizontal2.java +++ b/src/class167/Code05_EightVerticalHorizontal2.java @@ -8,8 +8,7 @@ // 操作 Cancel k : 删除编号为k的边 // 操作 Change k z : 编号为k的边,边权修改成z,z为01字符串 // 从1号点出发,最后回到1号点,边随便走,沿途所有边的边权异或起来 -// 打印只有初始m条边的情况下,异或最大值为多少 -// 每一条操作结束后,都打印异或最大值为多少 +// 打印只有初始m条边的情况下,异或最大值为多少,每一条操作结束后,都打印异或最大值为多少 // 1 <= n、m <= 500 0 <= q <= 1000 1 <= 边权字符串长度 <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/P3733 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From ce0935bf17740ce807ffd8366e94466c9605f0d4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 11:39:24 +0800 Subject: [PATCH 0061/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 2 +- src/class167/Code01_MuseumRobbery2.java | 2 +- src/class167/Code02_AdditionOnSegments1.java | 20 +++++++++---------- .../Code05_EightVerticalHorizontal1.java | 12 +++++------ 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index 67f118754..1aaeaa7b4 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -23,8 +23,8 @@ public class Code01_MuseumRobbery1 { public static int MAXN = 40001; public static int MAXQ = 30001; - public static int MAXT = 1000001; public static int MAXK = 1001; + public static int MAXT = 1000001; public static int DEEP = 20; public static int MOD = 1000000007; public static int BASE = 10000019; diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java index acf34670c..1550d3bb2 100644 --- a/src/class167/Code01_MuseumRobbery2.java +++ b/src/class167/Code01_MuseumRobbery2.java @@ -21,8 +21,8 @@ // //const int MAXN = 40001; //const int MAXQ = 30001; -//const int MAXT = 1000001; //const int MAXK = 1001; +//const int MAXT = 1000001; //const int DEEP = 20; //const long long MOD = 1000000007LL; //const long long BASE = 10000019LL; diff --git a/src/class167/Code02_AdditionOnSegments1.java b/src/class167/Code02_AdditionOnSegments1.java index 136b6786a..a1aec5403 100644 --- a/src/class167/Code02_AdditionOnSegments1.java +++ b/src/class167/Code02_AdditionOnSegments1.java @@ -21,8 +21,8 @@ public class Code02_AdditionOnSegments1 { public static int MAXN = 10001; public static int MAXT = 500001; public static int BIT = 10000; - public static int INTBIT = 32; - public static int LEN = BIT / INTBIT + 1; + public static int INT_BIT = 32; + public static int LEN = BIT / INT_BIT + 1; public static int DEEP = 20; public static int n, q; @@ -52,15 +52,15 @@ public static void clone(int[] set1, int[] set2) { // 返回位图第i位的状态 public static int getBit(int[] bitset, int i) { - return (bitset[i / INTBIT] >> (i % INTBIT)) & 1; + return (bitset[i / INT_BIT] >> (i % INT_BIT)) & 1; } // 第i位的状态设置成v public static void setBit(int[] bitset, int i, int v) { if (v == 0) { - bitset[i / INTBIT] &= ~(1 << (i % INTBIT)); + bitset[i / INT_BIT] &= ~(1 << (i % INT_BIT)); } else { - bitset[i / INTBIT] |= 1 << (i % INTBIT); + bitset[i / INT_BIT] |= 1 << (i % INT_BIT); } } @@ -83,14 +83,14 @@ public static void bitLeft(int[] ret, int[] bitset, int move) { clone(ret, bitset); return; } - int shift = move / INTBIT; - int offset = move % INTBIT; + int shift = move / INT_BIT; + int offset = move % INT_BIT; if (offset == 0) { for (int i = LEN - 1, j = i - shift; j >= 0; i--, j--) { ret[i] = bitset[j]; } } else { - int carry = INTBIT - offset, high, low; + int carry = INT_BIT - offset, high, low; for (int i = LEN - 1; i > shift; i--) { high = bitset[i - shift] << offset; low = bitset[i - shift - 1] >>> carry; @@ -98,9 +98,9 @@ public static void bitLeft(int[] ret, int[] bitset, int move) { } ret[shift] = bitset[0] << offset; } - int rest = LEN * INTBIT - (BIT + 1); + int rest = LEN * INT_BIT - (BIT + 1); if (rest > 0) { - ret[LEN - 1] &= (1 << (INTBIT - rest)) - 1; + ret[LEN - 1] &= (1 << (INT_BIT - rest)) - 1; } } diff --git a/src/class167/Code05_EightVerticalHorizontal1.java b/src/class167/Code05_EightVerticalHorizontal1.java index dba6be8ba..977754c79 100644 --- a/src/class167/Code05_EightVerticalHorizontal1.java +++ b/src/class167/Code05_EightVerticalHorizontal1.java @@ -24,7 +24,7 @@ public class Code05_EightVerticalHorizontal1 { public static int MAXQ = 1001; public static int MAXT = 10001; public static int BIT = 999; - public static int INTBIT = 32; + public static int INT_BIT = 32; // 位图 static class BitSet { @@ -34,12 +34,12 @@ static class BitSet { public int[] arr; public BitSet() { - len = BIT / INTBIT + 1; + len = BIT / INT_BIT + 1; arr = new int[len]; } public BitSet(String s) { - len = BIT / INTBIT + 1; + len = BIT / INT_BIT + 1; arr = new int[len]; for (int i = 0, j = s.length() - 1; i < s.length(); i++, j--) { set(i, s.charAt(j) - '0'); @@ -48,15 +48,15 @@ public BitSet(String s) { // 返回第i位的状态 public int get(int i) { - return (arr[i / INTBIT] >> (i % INTBIT)) & 1; + return (arr[i / INT_BIT] >> (i % INT_BIT)) & 1; } // 设置第i位的状态 public void set(int i, int v) { if (v == 0) { - arr[i / INTBIT] &= ~(1 << (i % INTBIT)); + arr[i / INT_BIT] &= ~(1 << (i % INT_BIT)); } else { - arr[i / INTBIT] |= 1 << (i % INTBIT); + arr[i / INT_BIT] |= 1 << (i % INT_BIT); } } From 06b723271817628ee13175b40bd6fd9cae9494e0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 13:05:44 +0800 Subject: [PATCH 0062/1170] modify code --- src/class167/Code03_BlueMoon1.java | 10 ++++------ src/class167/Code03_BlueMoon2.java | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/class167/Code03_BlueMoon1.java b/src/class167/Code03_BlueMoon1.java index 8cbc2d2bf..d7cfab9f7 100644 --- a/src/class167/Code03_BlueMoon1.java +++ b/src/class167/Code03_BlueMoon1.java @@ -39,7 +39,6 @@ public class Code03_BlueMoon1 { public static int[] tov = new int[MAXT]; public static int cnt = 0; - public static int used = 0; public static long[][] dp = new long[MAXM][MAXP]; public static long[] ans = new long[MAXM]; @@ -64,7 +63,7 @@ public static void add(int jobl, int jobr, int jobw, int jobv, int l, int r, int } } - public static void dfs(int l, int r, int i) { + public static void dfs(int l, int r, int i, int used) { int siz = 0; for (int e = head[i], w, v; e > 0; e = next[e]) { w = tow[e]; @@ -94,10 +93,9 @@ public static void dfs(int l, int r, int i) { } } else { int mid = (l + r) >> 1; - dfs(l, mid, i << 1); - dfs(mid + 1, r, i << 1 | 1); + dfs(l, mid, i << 1, used); + dfs(mid + 1, r, i << 1 | 1, used); } - used -= siz; } public static void prepare() { @@ -159,7 +157,7 @@ public static void main(String[] args) throws IOException { } } prepare(); - dfs(1, m, 1); + dfs(1, m, 1, 0); for (int i = 1; i <= m; i++) { if (op[i] == 5) { out.println(ans[i]); diff --git a/src/class167/Code03_BlueMoon2.java b/src/class167/Code03_BlueMoon2.java index 740212e10..396bbedfa 100644 --- a/src/class167/Code03_BlueMoon2.java +++ b/src/class167/Code03_BlueMoon2.java @@ -36,7 +36,6 @@ //int tov[MAXT]; //int cnt = 0; // -//int used = 0; //long long dp[MAXM][MAXP]; //long long ans[MAXM]; // @@ -61,7 +60,7 @@ // } //} // -//void dfs(int l, int r, int i) { +//void dfs(int l, int r, int i, int used) { // int siz = 0; // for (int e = head[i], w, v; e > 0; e = nxt[e]) { // w = tow[e]; @@ -88,10 +87,9 @@ // } // } else { // int mid = (l + r) >> 1; -// dfs(l, mid, i << 1); -// dfs(mid + 1, r, i << 1 | 1); +// dfs(l, mid, i << 1, used); +// dfs(mid + 1, r, i << 1 | 1, used); // } -// used -= siz; //} // //void prepare() { @@ -149,7 +147,7 @@ // } // } // prepare(); -// dfs(1, m, 1); +// dfs(1, m, 1, 0); // for (int i = 1; i <= m; i++) { // if (op[i] == 5) { // cout << ans[i] << '\n'; From 63df660abb6282b1186f052354ecb39480c28117 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 13:18:34 +0800 Subject: [PATCH 0063/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 8 ++++---- src/class167/Code01_MuseumRobbery2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index 1aaeaa7b4..d887a4e8a 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -1,13 +1,13 @@ package class167; // 博物馆劫案,java版 -// 给定正数k、BASE、MOD,定义a(m) = 当前商品集合s中,挑选商品总重量<=m,能获得的最大价值 -// 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) -// 给定n件商品,编号1~n,每种商品给定v和w,每件商品都加入商品集合s +// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BASE、MOD // 接下来有q个操作,每种操作是如下三种类型中的一种 // 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 -// 操作 2 x : 集合s中删除编号为x的商品 +// 操作 2 x : 集合s中删除编号为x的商品,保证编号x的商品之前没有删除 // 操作 3 : 查询当前的f(s) +// 定义a(m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 +// 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) // 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 // 1 <= k、每件商品重量 <= 10^3 1 <= 每件商品价值 <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF601E diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java index 1550d3bb2..4a331b66d 100644 --- a/src/class167/Code01_MuseumRobbery2.java +++ b/src/class167/Code01_MuseumRobbery2.java @@ -1,13 +1,13 @@ package class167; // 博物馆劫案,C++版 -// 给定正数k、BASE、MOD,定义a(m) = 当前商品集合s中,挑选商品总重量<=m,能获得的最大价值 -// 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) -// 给定n件商品,编号1~n,每种商品给定v和w,每件商品都加入商品集合s +// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BASE、MOD // 接下来有q个操作,每种操作是如下三种类型中的一种 // 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 -// 操作 2 x : 集合s中删除编号为x的商品 +// 操作 2 x : 集合s中删除编号为x的商品,保证编号x的商品之前没有删除 // 操作 3 : 查询当前的f(s) +// 定义a(m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 +// 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) // 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 // 1 <= k、每件商品重量 <= 10^3 1 <= 每件商品价值 <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF601E From 46a514a6c3e61108deba2028c85e87a3039718af Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 13:21:07 +0800 Subject: [PATCH 0064/1170] modify code --- src/class167/Code04_ShortestPathQueries1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class167/Code04_ShortestPathQueries1.java b/src/class167/Code04_ShortestPathQueries1.java index 7f66f4468..d21e2dd8b 100644 --- a/src/class167/Code04_ShortestPathQueries1.java +++ b/src/class167/Code04_ShortestPathQueries1.java @@ -41,7 +41,7 @@ public class Code04_ShortestPathQueries1 { public static int[] inspos = new int[BIT + 1]; public static int basiz = 0; - // 可撤销并查集 + 带权并查集 + // 带权并查集 + 可撤销并查集 public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[] eor = new int[MAXN]; From 574212f824e40aadf3cd1110913ad903832a821c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 15:53:53 +0800 Subject: [PATCH 0065/1170] modify code --- src/class167/Code07_MinimumXor1.java | 22 +++++++++++----------- src/class167/Code07_MinimumXor2.java | 22 +++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/class167/Code07_MinimumXor1.java b/src/class167/Code07_MinimumXor1.java index 41b3f1e51..8f3482e88 100644 --- a/src/class167/Code07_MinimumXor1.java +++ b/src/class167/Code07_MinimumXor1.java @@ -27,8 +27,8 @@ public class Code07_MinimumXor1 { public static int[] pass = new int[MAXN]; public static int cnt = 1; - public static int[] eor = new int[MAXN]; - public static int[] num = new int[MAXN]; + public static int[] mineor = new int[MAXN]; + public static int[] only = new int[MAXN]; public static int insert(int x, int changeCnt) { int cur = 1; @@ -47,24 +47,24 @@ public static int insert(int x, int changeCnt) { public static void compute(int x, int changeCnt) { int bottom = insert(x, changeCnt); - eor[bottom] = pass[bottom] >= 2 ? 0 : INF; - num[bottom] = pass[bottom] == 1 ? x : 0; + mineor[bottom] = pass[bottom] >= 2 ? 0 : INF; + only[bottom] = pass[bottom] == 1 ? x : 0; for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { l = tree[i][0]; r = tree[i][1]; if (pass[i] < 2) { - eor[i] = INF; + mineor[i] = INF; } else if ((l != 0) ^ (r != 0)) { - eor[i] = l > 0 ? eor[l] : eor[r]; + mineor[i] = l > 0 ? mineor[l] : mineor[r]; } else if (Math.max(pass[l], pass[r]) == 1) { - eor[i] = num[l] ^ num[r]; + mineor[i] = only[l] ^ only[r]; } else { - eor[i] = Math.min(eor[l], eor[r]); + mineor[i] = Math.min(mineor[l], mineor[r]); } if (pass[l] + pass[r] == 1) { - num[i] = pass[l] == 1 ? num[l] : num[r]; + only[i] = pass[l] == 1 ? only[l] : only[r]; } else { - num[i] = 0; + only[i] = 0; } } } @@ -76,7 +76,7 @@ public static void main(String[] args) throws Exception { for (int i = 1, op, x; i <= q; i++) { op = in.nextInt(); if (op == 3) { - out.println(eor[1]); + out.println(mineor[1]); } else { x = in.nextInt(); if (op == 1) { diff --git a/src/class167/Code07_MinimumXor2.java b/src/class167/Code07_MinimumXor2.java index e664267a2..a33df8e2a 100644 --- a/src/class167/Code07_MinimumXor2.java +++ b/src/class167/Code07_MinimumXor2.java @@ -25,8 +25,8 @@ //int pass[MAXN]; //int cnt = 1; // -//int eor[MAXN]; -//int num[MAXN]; +//int mineor[MAXN]; +//int only[MAXN]; // //int insert(int x, int changeCnt) { // int cur = 1; @@ -45,24 +45,24 @@ // //void compute(int x, int changeCnt) { // int bottom = insert(x, changeCnt); -// eor[bottom] = pass[bottom] >= 2 ? 0 : INF; -// num[bottom] = pass[bottom] == 1 ? x : 0; +// mineor[bottom] = pass[bottom] >= 2 ? 0 : INF; +// only[bottom] = pass[bottom] == 1 ? x : 0; // for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { // l = tree[i][0]; // r = tree[i][1]; // if (pass[i] < 2) { -// eor[i] = INF; +// mineor[i] = INF; // } else if ((l != 0) ^ (r != 0)) { -// eor[i] = l > 0 ? eor[l] : eor[r]; +// mineor[i] = l > 0 ? mineor[l] : mineor[r]; // } else if (max(pass[l], pass[r]) == 1) { -// eor[i] = num[l] ^ num[r]; +// mineor[i] = only[l] ^ only[r]; // } else { -// eor[i] = min(eor[l], eor[r]); +// mineor[i] = min(mineor[l], mineor[r]); // } // if (pass[l] + pass[r] == 1) { -// num[i] = pass[l] == 1 ? num[l] : num[r]; +// only[i] = pass[l] == 1 ? only[l] : only[r]; // } else { -// num[i] = 0; +// only[i] = 0; // } // } //} @@ -75,7 +75,7 @@ // for (int i = 1, op, x; i <= q; i++) { // cin >> op; // if (op == 3) { -// cout << eor[1] << '\n'; +// cout << mineor[1] << '\n'; // } else { // cin >> x; // if (op == 1) { From f04b9c0cde3b6f9641c0d49caf350cbeb99b10dc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 16:20:40 +0800 Subject: [PATCH 0066/1170] modify code --- ...3_BlueMoon1.java => Code02_BlueMoon1.java} | 28 +++++++++---------- ...3_BlueMoon2.java => Code02_BlueMoon2.java} | 27 +++++++++--------- ...1.java => Code03_AdditionOnSegments1.java} | 2 +- ...2.java => Code03_AdditionOnSegments2.java} | 0 4 files changed, 28 insertions(+), 29 deletions(-) rename src/class167/{Code03_BlueMoon1.java => Code02_BlueMoon1.java} (90%) rename src/class167/{Code03_BlueMoon2.java => Code02_BlueMoon2.java} (86%) rename src/class167/{Code02_AdditionOnSegments1.java => Code03_AdditionOnSegments1.java} (99%) rename src/class167/{Code02_AdditionOnSegments2.java => Code03_AdditionOnSegments2.java} (100%) diff --git a/src/class167/Code03_BlueMoon1.java b/src/class167/Code02_BlueMoon1.java similarity index 90% rename from src/class167/Code03_BlueMoon1.java rename to src/class167/Code02_BlueMoon1.java index d7cfab9f7..66550e3d9 100644 --- a/src/class167/Code03_BlueMoon1.java +++ b/src/class167/Code02_BlueMoon1.java @@ -21,7 +21,7 @@ import java.util.ArrayDeque; import java.util.Deque; -public class Code03_BlueMoon1 { +public class Code02_BlueMoon1 { public static int MAXM = 50001; public static int MAXP = 501; @@ -99,27 +99,25 @@ public static void dfs(int l, int r, int i, int used) { } public static void prepare() { - Deque deque = new ArrayDeque<>(); - int[] data; + // 背包<装备特征值、装备战斗力、装备出现时间点> + Deque knapsack = new ArrayDeque<>(); + int[] equip; for (int i = 1; i <= m; i++) { if (op[i] == 1) { - deque.addFirst(new int[] { x[i] % p, y[i], i }); + knapsack.addFirst(new int[] { x[i] % p, y[i], i }); } else if (op[i] == 2) { - deque.addLast(new int[] { x[i] % p, y[i], i }); + knapsack.addLast(new int[] { x[i] % p, y[i], i }); } else if (op[i] == 3) { - data = deque.peekFirst(); - add(data[2], i - 1, data[0], data[1], 1, m, 1); - deque.pollFirst(); + equip = knapsack.pollFirst(); + add(equip[2], i - 1, equip[0], equip[1], 1, m, 1); } else if (op[i] == 4) { - data = deque.peekLast(); - add(data[2], i - 1, data[0], data[1], 1, m, 1); - deque.pollLast(); + equip = knapsack.pollLast(); + add(equip[2], i - 1, equip[0], equip[1], 1, m, 1); } } - while (!deque.isEmpty()) { - data = deque.peekFirst(); - add(data[2], m, data[0], data[1], 1, m, 1); - deque.pollFirst(); + while (!knapsack.isEmpty()) { + equip = knapsack.pollFirst(); + add(equip[2], m, equip[0], equip[1], 1, m, 1); } for (int i = 0; i < MAXM; i++) { for (int j = 0; j < MAXP; j++) { diff --git a/src/class167/Code03_BlueMoon2.java b/src/class167/Code02_BlueMoon2.java similarity index 86% rename from src/class167/Code03_BlueMoon2.java rename to src/class167/Code02_BlueMoon2.java index 396bbedfa..c32269704 100644 --- a/src/class167/Code03_BlueMoon2.java +++ b/src/class167/Code02_BlueMoon2.java @@ -93,26 +93,27 @@ //} // //void prepare() { -// deque> dq; +// deque> knapsack; +// array equip; // for (int i = 1; i <= m; i++) { // if (op[i] == 1) { -// dq.push_front({x[i] % p, y[i], i}); +// knapsack.push_front({x[i] % p, y[i], i}); // } else if (op[i] == 2) { -// dq.push_back({x[i] % p, y[i], i}); +// knapsack.push_back({x[i] % p, y[i], i}); // } else if (op[i] == 3) { -// auto data = dq.front(); -// add(data[2], i - 1, data[0], data[1], 1, m, 1); -// dq.pop_front(); +// equip = knapsack.front(); +// add(equip[2], i - 1, equip[0], equip[1], 1, m, 1); +// knapsack.pop_front(); // } else if (op[i] == 4) { -// auto data = dq.back(); -// add(data[2], i - 1, data[0], data[1], 1, m, 1); -// dq.pop_back(); +// equip = knapsack.back(); +// add(equip[2], i - 1, equip[0], equip[1], 1, m, 1); +// knapsack.pop_back(); // } // } -// while (!dq.empty()) { -// auto data = dq.front(); -// add(data[2], m, data[0], data[1], 1, m, 1); -// dq.pop_front(); +// while (!knapsack.empty()) { +// equip = knapsack.front(); +// add(equip[2], m, equip[0], equip[1], 1, m, 1); +// knapsack.pop_front(); // } // for (int i = 0; i < MAXM; i++) { // for (int j = 0; j < MAXP; j++) { diff --git a/src/class167/Code02_AdditionOnSegments1.java b/src/class167/Code03_AdditionOnSegments1.java similarity index 99% rename from src/class167/Code02_AdditionOnSegments1.java rename to src/class167/Code03_AdditionOnSegments1.java index a1aec5403..26b6467e5 100644 --- a/src/class167/Code02_AdditionOnSegments1.java +++ b/src/class167/Code03_AdditionOnSegments1.java @@ -16,7 +16,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_AdditionOnSegments1 { +public class Code03_AdditionOnSegments1 { public static int MAXN = 10001; public static int MAXT = 500001; diff --git a/src/class167/Code02_AdditionOnSegments2.java b/src/class167/Code03_AdditionOnSegments2.java similarity index 100% rename from src/class167/Code02_AdditionOnSegments2.java rename to src/class167/Code03_AdditionOnSegments2.java From eba83eace67cee198d308c4bc19531c35dd722d3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 16:30:05 +0800 Subject: [PATCH 0067/1170] modify code --- src/class167/Code02_BlueMoon1.java | 5 +++-- src/class167/Code02_BlueMoon2.java | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/class167/Code02_BlueMoon1.java b/src/class167/Code02_BlueMoon1.java index 66550e3d9..803691e5e 100644 --- a/src/class167/Code02_BlueMoon1.java +++ b/src/class167/Code02_BlueMoon1.java @@ -33,6 +33,9 @@ public class Code02_BlueMoon1 { public static int[] x = new int[MAXM]; public static int[] y = new int[MAXM]; + // 背包<装备特征值、装备战斗力、装备出现时间点> + public static Deque knapsack = new ArrayDeque<>(); + public static int[] head = new int[MAXM << 2]; public static int[] next = new int[MAXT]; public static int[] tow = new int[MAXT]; @@ -99,8 +102,6 @@ public static void dfs(int l, int r, int i, int used) { } public static void prepare() { - // 背包<装备特征值、装备战斗力、装备出现时间点> - Deque knapsack = new ArrayDeque<>(); int[] equip; for (int i = 1; i <= m; i++) { if (op[i] == 1) { diff --git a/src/class167/Code02_BlueMoon2.java b/src/class167/Code02_BlueMoon2.java index c32269704..8e00cbeaf 100644 --- a/src/class167/Code02_BlueMoon2.java +++ b/src/class167/Code02_BlueMoon2.java @@ -30,6 +30,8 @@ //int x[MAXM]; //int y[MAXM]; // +//deque> knapsack; +// //int head[MAXM << 2]; //int nxt[MAXT]; //int tow[MAXT]; @@ -93,7 +95,6 @@ //} // //void prepare() { -// deque> knapsack; // array equip; // for (int i = 1; i <= m; i++) { // if (op[i] == 1) { From 779414fe54730dcdc5e85d405864f36c3b4da059 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 16:36:53 +0800 Subject: [PATCH 0068/1170] modify code --- src/class167/Code02_BlueMoon1.java | 13 ++++--------- src/class167/Code02_BlueMoon2.java | 10 ++++------ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/class167/Code02_BlueMoon1.java b/src/class167/Code02_BlueMoon1.java index 803691e5e..b4088f208 100644 --- a/src/class167/Code02_BlueMoon1.java +++ b/src/class167/Code02_BlueMoon1.java @@ -26,7 +26,6 @@ public class Code02_BlueMoon1 { public static int MAXM = 50001; public static int MAXP = 501; public static int MAXT = 1000001; - public static long INF = 1000000000001L; public static int m, p; public static int[] op = new int[MAXM]; @@ -75,7 +74,7 @@ public static void dfs(int l, int r, int i, int used) { dp[used + siz + 1][j] = dp[used + siz][j]; } for (int j = 0; j < p; j++) { - if (dp[used + siz][j] != -INF) { + if (dp[used + siz][j] != -1) { dp[used + siz + 1][(j + w) % p] = Math.max(dp[used + siz + 1][(j + w) % p], dp[used + siz][j] + v); } } @@ -84,15 +83,11 @@ public static void dfs(int l, int r, int i, int used) { used += siz; if (l == r) { if (op[l] == 5) { - long ret = -INF; + long ret = -1; for (int j = x[l]; j <= y[l]; j++) { ret = Math.max(ret, dp[used][j]); } - if (ret == -INF) { - ans[l] = -1; - } else { - ans[l] = ret; - } + ans[l] = ret; } } else { int mid = (l + r) >> 1; @@ -122,7 +117,7 @@ public static void prepare() { } for (int i = 0; i < MAXM; i++) { for (int j = 0; j < MAXP; j++) { - dp[i][j] = -INF; + dp[i][j] = -1; } } dp[0][0] = 0; diff --git a/src/class167/Code02_BlueMoon2.java b/src/class167/Code02_BlueMoon2.java index 8e00cbeaf..8679b76e5 100644 --- a/src/class167/Code02_BlueMoon2.java +++ b/src/class167/Code02_BlueMoon2.java @@ -22,8 +22,6 @@ //const int MAXM = 50001; //const int MAXP = 501; //const int MAXT = 1000001; -//const long long INF = 1000000000001LL; -// //int m, p; // //int op[MAXM]; @@ -71,7 +69,7 @@ // dp[used + siz + 1][j] = dp[used + siz][j]; // } // for (int j = 0; j < p; j++) { -// if (dp[used + siz][j] != -INF) { +// if (dp[used + siz][j] != -1) { // int nj = (j + w) % p; // dp[used + siz + 1][nj] = max(dp[used + siz + 1][nj], dp[used + siz][j] + v); // } @@ -81,11 +79,11 @@ // used += siz; // if (l == r) { // if (op[l] == 5) { -// long long ret = -INF; +// long long ret = -1; // for (int j = x[l]; j <= y[l]; j++) { // ret = max(ret, dp[used][j]); // } -// ans[l] = (ret == -INF ? -1 : ret); +// ans[l] = ret; // } // } else { // int mid = (l + r) >> 1; @@ -118,7 +116,7 @@ // } // for (int i = 0; i < MAXM; i++) { // for (int j = 0; j < MAXP; j++) { -// dp[i][j] = -INF; +// dp[i][j] = -1; // } // } // dp[0][0] = 0; From 971aa9c08585ec6e12aadaec89c72aead6dea878 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 16:41:22 +0800 Subject: [PATCH 0069/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 2 +- src/class167/Code01_MuseumRobbery2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index d887a4e8a..d1c79d950 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -4,7 +4,7 @@ // 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BASE、MOD // 接下来有q个操作,每种操作是如下三种类型中的一种 // 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 -// 操作 2 x : 集合s中删除编号为x的商品,保证编号x的商品之前没有删除 +// 操作 2 x : 集合s中删除编号为x的商品,删除时保证x号商品存在 // 操作 3 : 查询当前的f(s) // 定义a(m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 // 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java index 4a331b66d..9d4d7dc50 100644 --- a/src/class167/Code01_MuseumRobbery2.java +++ b/src/class167/Code01_MuseumRobbery2.java @@ -4,7 +4,7 @@ // 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BASE、MOD // 接下来有q个操作,每种操作是如下三种类型中的一种 // 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 -// 操作 2 x : 集合s中删除编号为x的商品,保证编号x的商品之前没有删除 +// 操作 2 x : 集合s中删除编号为x的商品,删除时保证x号商品存在 // 操作 3 : 查询当前的f(s) // 定义a(m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 // 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) From 2ed63c1371342779c28b85832dd793e0b5487804 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 16:53:30 +0800 Subject: [PATCH 0070/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 19 ++++++++++-------- src/class167/Code01_MuseumRobbery2.java | 26 +++++++++++++------------ 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index d1c79d950..d21b660de 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -1,13 +1,13 @@ package class167; // 博物馆劫案,java版 -// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BASE、MOD +// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BAS、MOD // 接下来有q个操作,每种操作是如下三种类型中的一种 // 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 // 操作 2 x : 集合s中删除编号为x的商品,删除时保证x号商品存在 // 操作 3 : 查询当前的f(s) // 定义a(m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 -// 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) +// 定义f(s) = ∑(m = 1...k) ( a(m) * BAS的m-1次方 % MOD ) // 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 // 1 <= k、每件商品重量 <= 10^3 1 <= 每件商品价值 <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF601E @@ -26,19 +26,20 @@ public class Code01_MuseumRobbery1 { public static int MAXK = 1001; public static int MAXT = 1000001; public static int DEEP = 20; + public static int BAS = 10000019; public static int MOD = 1000000007; - public static int BASE = 10000019; public static int n, k, q; public static int[] v = new int[MAXN]; public static int[] w = new int[MAXN]; - public static int[] from = new int[MAXN]; - public static int[] to = new int[MAXN]; public static int[] op = new int[MAXQ]; public static int[] x = new int[MAXQ]; public static int[] y = new int[MAXQ]; + public static int[] from = new int[MAXN]; + public static int[] to = new int[MAXN]; + public static int[] head = new int[MAXQ << 2]; public static int[] next = new int[MAXT]; public static int[] tov = new int[MAXT]; @@ -87,11 +88,13 @@ public static void dfs(int l, int r, int i, int dep) { } if (l == r) { if (op[l] == 3) { - long b = 1; + long ret = 0; + long base = 1; for (int j = 1; j <= k; j++) { - ans[l] = (ans[l] + dp[j] * b) % MOD; - b = (b * BASE) % MOD; + ret = (ret + dp[j] * base) % MOD; + base = (base * BAS) % MOD; } + ans[l] = ret; } } else { int mid = (l + r) >> 1; diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java index 9d4d7dc50..af48ba0d2 100644 --- a/src/class167/Code01_MuseumRobbery2.java +++ b/src/class167/Code01_MuseumRobbery2.java @@ -1,13 +1,13 @@ package class167; // 博物馆劫案,C++版 -// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BASE、MOD +// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BAS、MOD // 接下来有q个操作,每种操作是如下三种类型中的一种 // 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 // 操作 2 x : 集合s中删除编号为x的商品,删除时保证x号商品存在 // 操作 3 : 查询当前的f(s) // 定义a(m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 -// 定义f(s) = ∑(m = 1...k) ( a(m) * BASE的m-1次方 % MOD ) +// 定义f(s) = ∑(m = 1...k) ( a(m) * BAS的m-1次方 % MOD ) // 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 // 1 <= k、每件商品重量 <= 10^3 1 <= 每件商品价值 <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF601E @@ -24,20 +24,20 @@ //const int MAXK = 1001; //const int MAXT = 1000001; //const int DEEP = 20; +//const long long BAS = 10000019LL; //const long long MOD = 1000000007LL; -//const long long BASE = 10000019LL; -// //int n, k, q; // //int v[MAXN]; //int w[MAXN]; -//int from[MAXN]; -//int to[MAXN]; // //int op[MAXQ]; //int x[MAXQ]; //int y[MAXQ]; // +//int from[MAXN]; +//int to[MAXN]; +// //int head[MAXQ << 2]; //int nxt[MAXT]; //int tov[MAXT]; @@ -86,11 +86,13 @@ // } // if (l == r) { // if (op[l] == 3) { -// long long b = 1; +// long long ret = 0; +// long long base = 1; // for (int j = 1; j <= k; j++) { -// ans[l] = (ans[l] + dp[j] * b) % MOD; -// b = (b * BASE) % MOD; +// ret = (ret + dp[j] * base) % MOD; +// base = (base * BAS) % MOD; // } +// ans[l] = ret; // } // } else { // int mid = (l + r) >> 1; @@ -102,8 +104,8 @@ // //void prepare() { // for (int i = 1; i <= n; i++) { -// from[i] = 1; -// to[i] = q; +// from[i] = 1; +// to[i] = q; // } // for (int i = 1; i <= q; i++) { // if (op[i] == 1) { @@ -113,7 +115,7 @@ // from[n] = i; // to[n] = q; // } else if (op[i] == 2) { -// to[x[i]] = i; +// to[x[i]] = i; // } // } // for (int i = 1; i <= n; i++) { From 9a5c70099a11d8ff1f38fe5ea5c066c8895da513 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 17:01:55 +0800 Subject: [PATCH 0071/1170] modify code --- src/class167/Code02_BlueMoon1.java | 3 +-- src/class167/Code02_BlueMoon2.java | 3 +-- src/class167/Code05_EightVerticalHorizontal1.java | 3 +-- src/class167/Code05_EightVerticalHorizontal2.java | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/class167/Code02_BlueMoon1.java b/src/class167/Code02_BlueMoon1.java index b4088f208..a706a7c03 100644 --- a/src/class167/Code02_BlueMoon1.java +++ b/src/class167/Code02_BlueMoon1.java @@ -7,8 +7,7 @@ // 操作 IG x y : 背包后端加入一件特征值x、战斗力y的装备 // 操作 DF : 删除背包前端的装备 // 操作 DG : 删除背包后端的装备 -// 操作 QU x y : 选择装备的特征值累加和 % p,必须在[x, y]范围 -// 打印能得到的最大战斗力是多少,没有合法方案打印-1 +// 操作 QU x y : 选择装备的特征值累加和 % p,必须在[x, y]范围,打印最大战斗力,无方案打印-1 // 1 <= m <= 5 * 10^4 1 <= p <= 500 // 0 <= 每件装备特征值、每件装备战斗力 <= 10^9 // 测试链接 : https://loj.ac/p/6515 diff --git a/src/class167/Code02_BlueMoon2.java b/src/class167/Code02_BlueMoon2.java index 8679b76e5..67ad8490f 100644 --- a/src/class167/Code02_BlueMoon2.java +++ b/src/class167/Code02_BlueMoon2.java @@ -7,8 +7,7 @@ // 操作 IG x y : 背包后端加入一件特征值x、战斗力y的装备 // 操作 DF : 删除背包前端的装备 // 操作 DG : 删除背包后端的装备 -// 操作 QU x y : 选择装备的特征值累加和 % p,必须在[x, y]范围 -// 打印能得到的最大战斗力是多少,没有合法方案打印-1 +// 操作 QU x y : 选择装备的特征值累加和 % p,必须在[x, y]范围,打印最大战斗力,无方案打印-1 // 1 <= m <= 5 * 10^4 1 <= p <= 500 // 0 <= 每件装备特征值、每件装备战斗力 <= 10^9 // 测试链接 : https://loj.ac/p/6515 diff --git a/src/class167/Code05_EightVerticalHorizontal1.java b/src/class167/Code05_EightVerticalHorizontal1.java index 977754c79..f03aac151 100644 --- a/src/class167/Code05_EightVerticalHorizontal1.java +++ b/src/class167/Code05_EightVerticalHorizontal1.java @@ -3,8 +3,7 @@ // 八纵八横,java版 // 一共有n个点,给定m条边,每条边的边权,用01字符串表达 // 初始的m条边永不删除,接下来有q条操作,每种操作是如下三种类型中的一种 -// 操作 Add x y z : 加入点x到点y的边,边权是z,z为01字符串 -// 如果这是第k条添加操作,那么这条边编号为k +// 操作 Add x y z : 加入点x到点y的边,边权是z,z为01字符串,第k条添加操作,边的编号为k // 操作 Cancel k : 删除编号为k的边 // 操作 Change k z : 编号为k的边,边权修改成z,z为01字符串 // 从1号点出发,最后回到1号点,边随便走,沿途所有边的边权异或起来 diff --git a/src/class167/Code05_EightVerticalHorizontal2.java b/src/class167/Code05_EightVerticalHorizontal2.java index 3d9a5e22e..df9556618 100644 --- a/src/class167/Code05_EightVerticalHorizontal2.java +++ b/src/class167/Code05_EightVerticalHorizontal2.java @@ -3,8 +3,7 @@ // 八纵八横,C++版 // 一共有n个点,给定m条边,每条边的边权,用01字符串表达 // 初始的m条边永不删除,接下来有q条操作,每种操作是如下三种类型中的一种 -// 操作 Add x y z : 加入点x到点y的边,边权是z,z为01字符串 -// 如果这是第k条添加操作,那么这条边编号为k +// 操作 Add x y z : 加入点x到点y的边,边权是z,z为01字符串,第k条添加操作,边的编号为k // 操作 Cancel k : 删除编号为k的边 // 操作 Change k z : 编号为k的边,边权修改成z,z为01字符串 // 从1号点出发,最后回到1号点,边随便走,沿途所有边的边权异或起来 From 17221f84fc83c0e69142a1b8ddd571522f8891cc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 17:03:42 +0800 Subject: [PATCH 0072/1170] modify code --- src/class167/Code04_ShortestPathQueries1.java | 3 +-- src/class167/Code04_ShortestPathQueries2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class167/Code04_ShortestPathQueries1.java b/src/class167/Code04_ShortestPathQueries1.java index d21e2dd8b..271792ab5 100644 --- a/src/class167/Code04_ShortestPathQueries1.java +++ b/src/class167/Code04_ShortestPathQueries1.java @@ -5,8 +5,7 @@ // 接下来有q条操作,每种操作是如下三种类型中的一种 // 操作 1 x y d : 原图中加入,点x到点y,权值为d的边 // 操作 2 x y : 原图中删除,点x到点y的边 -// 操作 3 x y : 点x到点y,所有路随便走,沿途边权都异或起来 -// 打印能取得的异或最小值 +// 操作 3 x y : 点x到点y,所有路随便走,沿途边权都异或起来,打印能取得的异或最小值 // 保证任意操作后,图连通、无重边、无自环,所有操作均合法 // 1 <= n、m、q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF938G diff --git a/src/class167/Code04_ShortestPathQueries2.java b/src/class167/Code04_ShortestPathQueries2.java index 0bf523f3a..9272b84ef 100644 --- a/src/class167/Code04_ShortestPathQueries2.java +++ b/src/class167/Code04_ShortestPathQueries2.java @@ -5,8 +5,7 @@ // 接下来有q条操作,每种操作是如下三种类型中的一种 // 操作 1 x y d : 原图中加入,点x到点y,权值为d的边 // 操作 2 x y : 原图中删除,点x到点y的边 -// 操作 3 x y : 点x到点y,所有路随便走,沿途边权都异或起来 -// 打印能取得的异或最小值 +// 操作 3 x y : 点x到点y,所有路随便走,沿途边权都异或起来,打印能取得的异或最小值 // 保证任意操作后,图连通、无重边、无自环,所有操作均合法 // 1 <= n、m、q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF938G From df66d3b4eca85dd27d584b453e775a79ae440ea2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 17:32:40 +0800 Subject: [PATCH 0073/1170] modify code --- src/class167/Code06_MarsStore1.java | 8 ++++---- src/class167/Code06_MarsStore2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class167/Code06_MarsStore1.java b/src/class167/Code06_MarsStore1.java index 3252a11ea..dd8bc6815 100644 --- a/src/class167/Code06_MarsStore1.java +++ b/src/class167/Code06_MarsStore1.java @@ -1,11 +1,11 @@ package class167; // 火星商店,java版 -// 有n个商店,编号1~n,初始时每个商店只有一种商品,给定每个商店中唯一商品的价格 +// 有n个商店,每个商店只有一种初始商品,给出每个商店的初始商品价格 // 有m条操作,每种操作是如下两种类型中的一种 -// 操作 0 s v : 只有操作0能让天数+1,第s号商店,这天新增了价格为v的商品 -// 操作 1 l r x d : 客人只在商店[l..r]中选择一件商品,只购买d天内的出现的商品 -// 所有符合要求的商品中,打印 商品的价格 ^ x 的最大值 +// 操作 0 s v : 只有操作0能让天数+1,第s号商店,在新的一天增加了价格为v的新商品 +// 操作 1 l r x d : 只能在商店[l..r]中挑选,只能挑选初始商品或d天内出现的新商品 +// 只能挑选一件商品,打印 商品的价格 ^ x 的最大值 // 注意,只有操作0能让天数+1,操作1不会增加天数 // 0 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4585 diff --git a/src/class167/Code06_MarsStore2.java b/src/class167/Code06_MarsStore2.java index 8060913ab..b70bf0ab5 100644 --- a/src/class167/Code06_MarsStore2.java +++ b/src/class167/Code06_MarsStore2.java @@ -1,11 +1,11 @@ package class167; // 火星商店,C++版 -// 有n个商店,编号1~n,初始时每个商店只有一种商品,给定每个商店中唯一商品的价格 +// 有n个商店,每个商店只有一种初始商品,给出每个商店的初始商品价格 // 有m条操作,每种操作是如下两种类型中的一种 -// 操作 0 s v : 只有操作0能让天数+1,第s号商店,这天新增了价格为v的商品 -// 操作 1 l r x d : 客人只在商店[l..r]中选择一件商品,只购买d天内的出现的商品 -// 所有符合要求的商品中,打印 商品的价格 ^ x 的最大值 +// 操作 0 s v : 只有操作0能让天数+1,第s号商店,在新的一天增加了价格为v的新商品 +// 操作 1 l r x d : 只能在商店[l..r]中挑选,只能挑选初始商品或d天内出现的新商品 +// 只能挑选一件商品,打印 商品的价格 ^ x 的最大值 // 注意,只有操作0能让天数+1,操作1不会增加天数 // 0 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4585 From 1b0159b7e0b78c965b6e23744458646264432468 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 17:37:20 +0800 Subject: [PATCH 0074/1170] modify code --- src/class167/Code06_MarsStore1.java | 4 ++-- src/class167/Code06_MarsStore2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class167/Code06_MarsStore1.java b/src/class167/Code06_MarsStore1.java index dd8bc6815..4cccefdcf 100644 --- a/src/class167/Code06_MarsStore1.java +++ b/src/class167/Code06_MarsStore1.java @@ -3,10 +3,10 @@ // 火星商店,java版 // 有n个商店,每个商店只有一种初始商品,给出每个商店的初始商品价格 // 有m条操作,每种操作是如下两种类型中的一种 -// 操作 0 s v : 只有操作0能让天数+1,第s号商店,在新的一天增加了价格为v的新商品 +// 操作 0 s v : 操作0会让天数+1,第s号商店,在这天增加了价格为v的新商品 // 操作 1 l r x d : 只能在商店[l..r]中挑选,只能挑选初始商品或d天内出现的新商品 // 只能挑选一件商品,打印 商品的价格 ^ x 的最大值 -// 注意,只有操作0能让天数+1,操作1不会增加天数 +// 注意,只有操作0能让天数+1,操作1不会 // 0 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4585 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class167/Code06_MarsStore2.java b/src/class167/Code06_MarsStore2.java index b70bf0ab5..e4a01b850 100644 --- a/src/class167/Code06_MarsStore2.java +++ b/src/class167/Code06_MarsStore2.java @@ -3,10 +3,10 @@ // 火星商店,C++版 // 有n个商店,每个商店只有一种初始商品,给出每个商店的初始商品价格 // 有m条操作,每种操作是如下两种类型中的一种 -// 操作 0 s v : 只有操作0能让天数+1,第s号商店,在新的一天增加了价格为v的新商品 +// 操作 0 s v : 操作0会让天数+1,第s号商店,在这天增加了价格为v的新商品 // 操作 1 l r x d : 只能在商店[l..r]中挑选,只能挑选初始商品或d天内出现的新商品 // 只能挑选一件商品,打印 商品的价格 ^ x 的最大值 -// 注意,只有操作0能让天数+1,操作1不会增加天数 +// 注意,只有操作0能让天数+1,操作1不会 // 0 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4585 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 5318d6ea576b7ec8e0936926c740bc8b987f301a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 17:55:20 +0800 Subject: [PATCH 0075/1170] modify code --- src/class167/Code07_MinimumXor1.java | 4 ++-- src/class167/Code07_MinimumXor2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class167/Code07_MinimumXor1.java b/src/class167/Code07_MinimumXor1.java index 8f3482e88..f8eb21de0 100644 --- a/src/class167/Code07_MinimumXor1.java +++ b/src/class167/Code07_MinimumXor1.java @@ -3,8 +3,8 @@ // 最小异或查询,java版 // 一共有q条操作,每种操作是如下三种类型中的一种 // 操作 1 x : 黑板上写上一个数字x,同一种数字可以出现多次 -// 操作 2 x : 将一个x从黑板上擦掉,操作前保证至少有一个x在黑板上 -// 操作 3 : 打印任意两个数的最小异或值,操作前保证黑板上至少有两个数 +// 操作 2 x : 将一个x从黑板上擦掉,操作时保证至少有一个x在黑板上 +// 操作 3 : 打印黑板上任意两数的最小异或值,操作时保证黑板上至少有两个数 // 1 <= q <= 3 * 10^5 // 0 <= x <= 2^30 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc308_g diff --git a/src/class167/Code07_MinimumXor2.java b/src/class167/Code07_MinimumXor2.java index a33df8e2a..17a641718 100644 --- a/src/class167/Code07_MinimumXor2.java +++ b/src/class167/Code07_MinimumXor2.java @@ -3,8 +3,8 @@ // 最小异或查询,C++版 // 一共有q条操作,每种操作是如下三种类型中的一种 // 操作 1 x : 黑板上写上一个数字x,同一种数字可以出现多次 -// 操作 2 x : 将一个x从黑板上擦掉,操作前保证至少有一个x在黑板上 -// 操作 3 : 打印任意两个数的最小异或值,操作前保证黑板上至少有两个数 +// 操作 2 x : 将一个x从黑板上擦掉,操作时保证至少有一个x在黑板上 +// 操作 3 : 打印黑板上任意两数的最小异或值,操作时保证黑板上至少有两个数 // 1 <= q <= 3 * 10^5 // 0 <= x <= 2^30 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc308_g From 398e367bd88363929a637c29a4313697458170b5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 4 May 2025 18:08:50 +0800 Subject: [PATCH 0076/1170] modify code --- src/class167/Code02_BlueMoon1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class167/Code02_BlueMoon1.java b/src/class167/Code02_BlueMoon1.java index a706a7c03..1547d8a85 100644 --- a/src/class167/Code02_BlueMoon1.java +++ b/src/class167/Code02_BlueMoon1.java @@ -31,7 +31,7 @@ public class Code02_BlueMoon1 { public static int[] x = new int[MAXM]; public static int[] y = new int[MAXM]; - // 背包<装备特征值、装备战斗力、装备出现时间点> + // 背包<装备特征值%p、装备战斗力、装备出现时间点> public static Deque knapsack = new ArrayDeque<>(); public static int[] head = new int[MAXM << 2]; From dca11d036547deda477b5008daa448b3599e558a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 5 May 2025 12:32:36 +0800 Subject: [PATCH 0077/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 6 ++++ src/class167/Code02_BlueMoon1.java | 48 +++++++++++++++---------- src/class167/Code02_BlueMoon2.java | 44 ++++++++++++----------- 3 files changed, 59 insertions(+), 39 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index d21b660de..658130c85 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -37,17 +37,23 @@ public class Code01_MuseumRobbery1 { public static int[] x = new int[MAXQ]; public static int[] y = new int[MAXQ]; + // 第i号商品的生效时间段,从from[i]持续到to[i] public static int[] from = new int[MAXN]; public static int[] to = new int[MAXN]; + // 时间轴线段树的区间上挂上生效的商品,价值v,重量w public static int[] head = new int[MAXQ << 2]; public static int[] next = new int[MAXT]; public static int[] tov = new int[MAXT]; public static int[] tow = new int[MAXT]; public static int cnt = 0; + // 动态规划表 public static long[] dp = new long[MAXK]; + // 动态规划表的备份 public static long[][] backup = new long[DEEP][MAXK]; + + // 答案 public static long[] ans = new long[MAXQ]; public static void clone(long[] a, long[] b) { diff --git a/src/class167/Code02_BlueMoon1.java b/src/class167/Code02_BlueMoon1.java index 1547d8a85..f8c010f43 100644 --- a/src/class167/Code02_BlueMoon1.java +++ b/src/class167/Code02_BlueMoon1.java @@ -25,6 +25,7 @@ public class Code02_BlueMoon1 { public static int MAXM = 50001; public static int MAXP = 501; public static int MAXT = 1000001; + public static int DEEP = 20; public static int m, p; public static int[] op = new int[MAXM]; @@ -34,15 +35,29 @@ public class Code02_BlueMoon1 { // 背包<装备特征值%p、装备战斗力、装备出现时间点> public static Deque knapsack = new ArrayDeque<>(); + // 时间轴线段树的区间上挂上生效的商品,(特征值 % p)记为w,战斗力记为v public static int[] head = new int[MAXM << 2]; public static int[] next = new int[MAXT]; public static int[] tow = new int[MAXT]; public static int[] tov = new int[MAXT]; public static int cnt = 0; - public static long[][] dp = new long[MAXM][MAXP]; + // 动态规划表不考虑当前商品的状态,上一行的状态 + public static long[] pre = new long[MAXP]; + // 动态规划表考虑当前商品的状态,本行的状态,需要更新 + public static long[] dp = new long[MAXP]; + // 动态规划表的备份 + public static long[][] backup = new long[DEEP][MAXP]; + + // 答案 public static long[] ans = new long[MAXM]; + public static void clone(long[] a, long[] b) { + for (int i = 0; i < p; i++) { + a[i] = b[i]; + } + } + public static void addEdge(int i, int w, int v) { next[++cnt] = head[i]; tow[cnt] = w; @@ -64,35 +79,32 @@ public static void add(int jobl, int jobr, int jobw, int jobv, int l, int r, int } } - public static void dfs(int l, int r, int i, int used) { - int siz = 0; + public static void dfs(int l, int r, int i, int dep) { + clone(backup[dep], dp); for (int e = head[i], w, v; e > 0; e = next[e]) { w = tow[e]; v = tov[e]; + clone(pre, dp); for (int j = 0; j < p; j++) { - dp[used + siz + 1][j] = dp[used + siz][j]; - } - for (int j = 0; j < p; j++) { - if (dp[used + siz][j] != -1) { - dp[used + siz + 1][(j + w) % p] = Math.max(dp[used + siz + 1][(j + w) % p], dp[used + siz][j] + v); + if (pre[j] != -1) { + dp[(j + w) % p] = Math.max(dp[(j + w) % p], pre[j] + v); } } - siz++; } - used += siz; if (l == r) { if (op[l] == 5) { long ret = -1; for (int j = x[l]; j <= y[l]; j++) { - ret = Math.max(ret, dp[used][j]); + ret = Math.max(ret, dp[j]); } ans[l] = ret; } } else { int mid = (l + r) >> 1; - dfs(l, mid, i << 1, used); - dfs(mid + 1, r, i << 1 | 1, used); + dfs(l, mid, i << 1, dep + 1); + dfs(mid + 1, r, i << 1 | 1, dep + 1); } + clone(dp, backup[dep]); } public static void prepare() { @@ -114,12 +126,10 @@ public static void prepare() { equip = knapsack.pollFirst(); add(equip[2], m, equip[0], equip[1], 1, m, 1); } - for (int i = 0; i < MAXM; i++) { - for (int j = 0; j < MAXP; j++) { - dp[i][j] = -1; - } + for (int i = 0; i < p; i++) { + dp[i] = -1; } - dp[0][0] = 0; + dp[0] = 0; } public static void main(String[] args) throws IOException { @@ -150,7 +160,7 @@ public static void main(String[] args) throws IOException { } } prepare(); - dfs(1, m, 1, 0); + dfs(1, m, 1, 1); for (int i = 1; i <= m; i++) { if (op[i] == 5) { out.println(ans[i]); diff --git a/src/class167/Code02_BlueMoon2.java b/src/class167/Code02_BlueMoon2.java index 67ad8490f..aa120a168 100644 --- a/src/class167/Code02_BlueMoon2.java +++ b/src/class167/Code02_BlueMoon2.java @@ -21,6 +21,7 @@ //const int MAXM = 50001; //const int MAXP = 501; //const int MAXT = 1000001; +//const int DEEP = 20; //int m, p; // //int op[MAXM]; @@ -35,9 +36,18 @@ //int tov[MAXT]; //int cnt = 0; // -//long long dp[MAXM][MAXP]; +//long long pre[MAXP]; +//long long dp[MAXP]; +//long long backup[DEEP][MAXP]; +// //long long ans[MAXM]; // +//void clone(long long* a, long long* b) { +// for (int i = 0; i <= p; i++) { +// a[i] = b[i]; +// } +//} +// //void addEdge(int i, int w, int v) { // nxt[++cnt] = head[i]; // tow[cnt] = w; @@ -59,36 +69,32 @@ // } //} // -//void dfs(int l, int r, int i, int used) { -// int siz = 0; +//void dfs(int l, int r, int i, int dep) { +// clone(backup[dep], dp); // for (int e = head[i], w, v; e > 0; e = nxt[e]) { // w = tow[e]; // v = tov[e]; +// clone(pre, dp); // for (int j = 0; j < p; j++) { -// dp[used + siz + 1][j] = dp[used + siz][j]; -// } -// for (int j = 0; j < p; j++) { -// if (dp[used + siz][j] != -1) { -// int nj = (j + w) % p; -// dp[used + siz + 1][nj] = max(dp[used + siz + 1][nj], dp[used + siz][j] + v); +// if (pre[j] != -1) { +// dp[(j + w) % p] = max(dp[(j + w) % p], pre[j] + v); // } // } -// siz++; // } -// used += siz; // if (l == r) { // if (op[l] == 5) { // long long ret = -1; // for (int j = x[l]; j <= y[l]; j++) { -// ret = max(ret, dp[used][j]); +// ret = max(ret, dp[j]); // } // ans[l] = ret; // } // } else { // int mid = (l + r) >> 1; -// dfs(l, mid, i << 1, used); -// dfs(mid + 1, r, i << 1 | 1, used); +// dfs(l, mid, i << 1, dep + 1); +// dfs(mid + 1, r, i << 1 | 1, dep + 1); // } +// clone(dp, backup[dep]); //} // //void prepare() { @@ -113,12 +119,10 @@ // add(equip[2], m, equip[0], equip[1], 1, m, 1); // knapsack.pop_front(); // } -// for (int i = 0; i < MAXM; i++) { -// for (int j = 0; j < MAXP; j++) { -// dp[i][j] = -1; -// } +// for (int i = 0; i < p; i++) { +// dp[i] = -1; // } -// dp[0][0] = 0; +// dp[0] = 0; //} // //int main() { @@ -146,7 +150,7 @@ // } // } // prepare(); -// dfs(1, m, 1, 0); +// dfs(1, m, 1, 1); // for (int i = 1; i <= m; i++) { // if (op[i] == 5) { // cout << ans[i] << '\n'; From b54186505b33f88b1935a434d33ee1e9455b3866 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 5 May 2025 13:09:38 +0800 Subject: [PATCH 0078/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 6 +++--- src/class167/Code01_MuseumRobbery2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index 658130c85..b76f7d8e0 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -1,13 +1,13 @@ package class167; // 博物馆劫案,java版 -// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BAS、MOD +// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s // 接下来有q个操作,每种操作是如下三种类型中的一种 // 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 // 操作 2 x : 集合s中删除编号为x的商品,删除时保证x号商品存在 // 操作 3 : 查询当前的f(s) -// 定义a(m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 -// 定义f(s) = ∑(m = 1...k) ( a(m) * BAS的m-1次方 % MOD ) +// 定义a(s, m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 +// 给定正数k、BAS、MOD,定义f(s) = ∑(m = 1...k) (a(s, m) * BAS的m-1次方 % MOD) // 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 // 1 <= k、每件商品重量 <= 10^3 1 <= 每件商品价值 <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF601E diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java index af48ba0d2..c75b93ca0 100644 --- a/src/class167/Code01_MuseumRobbery2.java +++ b/src/class167/Code01_MuseumRobbery2.java @@ -1,13 +1,13 @@ package class167; // 博物馆劫案,C++版 -// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s,给定正数k、BAS、MOD +// 给定n件商品,商品有价值v和重量w,1~n号商品加入集合s // 接下来有q个操作,每种操作是如下三种类型中的一种 // 操作 1 x y : 集合s中增加价值x、重量y的商品,商品编号自增得到 // 操作 2 x : 集合s中删除编号为x的商品,删除时保证x号商品存在 // 操作 3 : 查询当前的f(s) -// 定义a(m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 -// 定义f(s) = ∑(m = 1...k) ( a(m) * BAS的m-1次方 % MOD ) +// 定义a(s, m) = 集合s中,挑选商品总重量<=m,能获得的最大价值 +// 给定正数k、BAS、MOD,定义f(s) = ∑(m = 1...k) (a(s, m) * BAS的m-1次方 % MOD) // 1 <= n <= 5 * 10^3 1 <= q <= 3 * 10^4 // 1 <= k、每件商品重量 <= 10^3 1 <= 每件商品价值 <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF601E From 7cac4f6d372a0edf87fd7f8eaa2039c2abab8255 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 5 May 2025 14:10:12 +0800 Subject: [PATCH 0079/1170] modify code --- src/class167/Code01_MuseumRobbery1.java | 6 ++++-- src/class167/Code01_MuseumRobbery2.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/class167/Code01_MuseumRobbery1.java b/src/class167/Code01_MuseumRobbery1.java index b76f7d8e0..35c63ad3a 100644 --- a/src/class167/Code01_MuseumRobbery1.java +++ b/src/class167/Code01_MuseumRobbery1.java @@ -123,11 +123,13 @@ public static void prepare() { from[n] = i; to[n] = q; } else if (op[i] == 2) { - to[x[i]] = i; + to[x[i]] = i - 1; } } for (int i = 1; i <= n; i++) { - add(from[i], to[i], v[i], w[i], 1, q, 1); + if (from[i] <= to[i]) { + add(from[i], to[i], v[i], w[i], 1, q, 1); + } } } diff --git a/src/class167/Code01_MuseumRobbery2.java b/src/class167/Code01_MuseumRobbery2.java index c75b93ca0..9d43315ce 100644 --- a/src/class167/Code01_MuseumRobbery2.java +++ b/src/class167/Code01_MuseumRobbery2.java @@ -115,11 +115,13 @@ // from[n] = i; // to[n] = q; // } else if (op[i] == 2) { -// to[x[i]] = i; +// to[x[i]] = i - 1; // } // } // for (int i = 1; i <= n; i++) { -// add(from[i], to[i], v[i], w[i], 1, q, 1); +// if (from[i] <= to[i]) { +// add(from[i], to[i], v[i], w[i], 1, q, 1); +// } // } //} // From 58b83d3392cd2f859686537667c4b01a1e4152c9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 5 May 2025 15:52:14 +0800 Subject: [PATCH 0080/1170] modify code --- src/class167/Code03_AdditionOnSegments1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class167/Code03_AdditionOnSegments1.java b/src/class167/Code03_AdditionOnSegments1.java index 26b6467e5..1ecc9dea4 100644 --- a/src/class167/Code03_AdditionOnSegments1.java +++ b/src/class167/Code03_AdditionOnSegments1.java @@ -98,6 +98,8 @@ public static void bitLeft(int[] ret, int[] bitset, int move) { } ret[shift] = bitset[0] << offset; } + // 最高位BIT到最低位0,一共BIT+1个有效位 + // 其他更高位信息需要清空,rest就是有多少无效的更高位 int rest = LEN * INT_BIT - (BIT + 1); if (rest > 0) { ret[LEN - 1] &= (1 << (INT_BIT - rest)) - 1; From 2d55a5d36c0cfdecc870da33de7cebec1962cae7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 5 May 2025 16:14:52 +0800 Subject: [PATCH 0081/1170] modify code --- src/class167/Code02_BlueMoon1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class167/Code02_BlueMoon1.java b/src/class167/Code02_BlueMoon1.java index f8c010f43..f07a1fefc 100644 --- a/src/class167/Code02_BlueMoon1.java +++ b/src/class167/Code02_BlueMoon1.java @@ -35,16 +35,16 @@ public class Code02_BlueMoon1 { // 背包<装备特征值%p、装备战斗力、装备出现时间点> public static Deque knapsack = new ArrayDeque<>(); - // 时间轴线段树的区间上挂上生效的商品,(特征值 % p)记为w,战斗力记为v + // 时间轴线段树的区间上挂上生效的装备,(特征值 % p)记为w,战斗力记为v public static int[] head = new int[MAXM << 2]; public static int[] next = new int[MAXT]; public static int[] tow = new int[MAXT]; public static int[] tov = new int[MAXT]; public static int cnt = 0; - // 动态规划表不考虑当前商品的状态,上一行的状态 + // 动态规划表不考虑当前装备的状态,上一行的状态 public static long[] pre = new long[MAXP]; - // 动态规划表考虑当前商品的状态,本行的状态,需要更新 + // 动态规划表考虑当前装备的状态,本行的状态,需要更新 public static long[] dp = new long[MAXP]; // 动态规划表的备份 public static long[][] backup = new long[DEEP][MAXP]; From f20c88c6cccefc5452baf047a3478954b4784b5b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 5 May 2025 17:10:09 +0800 Subject: [PATCH 0082/1170] modify code --- src/class167/Code03_AdditionOnSegments1.java | 16 ++++++++-------- src/class167/Code03_AdditionOnSegments2.java | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class167/Code03_AdditionOnSegments1.java b/src/class167/Code03_AdditionOnSegments1.java index 1ecc9dea4..9d52fa8b4 100644 --- a/src/class167/Code03_AdditionOnSegments1.java +++ b/src/class167/Code03_AdditionOnSegments1.java @@ -21,9 +21,9 @@ public class Code03_AdditionOnSegments1 { public static int MAXN = 10001; public static int MAXT = 500001; public static int BIT = 10000; + public static int DEEP = 20; public static int INT_BIT = 32; public static int LEN = BIT / INT_BIT + 1; - public static int DEEP = 20; public static int n, q; public static int[] head = new int[MAXN << 2]; @@ -32,7 +32,7 @@ public class Code03_AdditionOnSegments1 { public static int cnt = 0; public static int[] tmp = new int[LEN]; - public static int[] path = new int[LEN]; + public static int[] dp = new int[LEN]; public static int[][] backup = new int[DEEP][LEN]; public static int[] ans = new int[LEN]; @@ -127,19 +127,19 @@ public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { } public static void dfs(int l, int r, int i, int dep) { - clone(backup[dep], path); + clone(backup[dep], dp); for (int e = head[i]; e > 0; e = next[e]) { - bitLeft(tmp, path, to[e]); - bitOr(path, tmp); + bitLeft(tmp, dp, to[e]); + bitOr(dp, tmp); } if (l == r) { - bitOr(ans, path); + bitOr(ans, dp); } else { int mid = (l + r) >> 1; dfs(l, mid, i << 1, dep + 1); dfs(mid + 1, r, i << 1 | 1, dep + 1); } - clone(path, backup[dep]); + clone(dp, backup[dep]); } public static void main(String[] args) throws Exception { @@ -153,7 +153,7 @@ public static void main(String[] args) throws Exception { k = in.nextInt(); add(l, r, k, 1, n, 1); } - setBit(path, 0, 1); + setBit(dp, 0, 1); dfs(1, n, 1, 1); int ansCnt = 0; for (int i = 1; i <= n; i++) { diff --git a/src/class167/Code03_AdditionOnSegments2.java b/src/class167/Code03_AdditionOnSegments2.java index 4416dc887..cc4b33abd 100644 --- a/src/class167/Code03_AdditionOnSegments2.java +++ b/src/class167/Code03_AdditionOnSegments2.java @@ -29,7 +29,7 @@ //int to[MAXT]; //int cnt = 0; // -//bs path; +//bs dp; //bs backup[DEEP]; //bs ans; // @@ -54,18 +54,18 @@ //} // //void dfs(int l, int r, int i, int dep) { -// backup[dep] = path; +// backup[dep] = dp; // for (int e = head[i]; e > 0; e = nxt[e]) { -// path |= path << to[e]; +// dp |= dp << to[e]; // } // if (l == r) { -// ans |= path; +// ans |= dp; // } else { // int mid = (l + r) >> 1; // dfs(l, mid, i << 1, dep + 1); // dfs(mid + 1, r, i << 1 | 1, dep + 1); // } -// path = backup[dep]; +// dp = backup[dep]; //} // //int main() { @@ -76,7 +76,7 @@ // cin >> l >> r >> k; // add(l, r, k, 1, n, 1); // } -// path[0] = 1; +// dp[0] = 1; // dfs(1, n, 1, 1); // int ansCnt = 0; // for (int i = 1; i <= n; i++) { From 580cee127a64b304d9c4a42336a7042227bbf19b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 5 May 2025 17:48:07 +0800 Subject: [PATCH 0083/1170] modify code --- src/class167/Code04_ShortestPathQueries1.java | 2 +- src/class167/Code04_ShortestPathQueries2.java | 2 +- .../Code05_EightVerticalHorizontal1.java | 47 ++++++------------- .../Code05_EightVerticalHorizontal2.java | 45 +++++------------- 4 files changed, 30 insertions(+), 66 deletions(-) diff --git a/src/class167/Code04_ShortestPathQueries1.java b/src/class167/Code04_ShortestPathQueries1.java index 271792ab5..ce1103c29 100644 --- a/src/class167/Code04_ShortestPathQueries1.java +++ b/src/class167/Code04_ShortestPathQueries1.java @@ -6,7 +6,7 @@ // 操作 1 x y d : 原图中加入,点x到点y,权值为d的边 // 操作 2 x y : 原图中删除,点x到点y的边 // 操作 3 x y : 点x到点y,所有路随便走,沿途边权都异或起来,打印能取得的异或最小值 -// 保证任意操作后,图连通、无重边、无自环,所有操作均合法 +// 保证x < y,并且任意操作后,图连通、无重边、无自环,所有操作均合法 // 1 <= n、m、q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF938G // 测试链接 : https://codeforces.com/problemset/problem/938/G diff --git a/src/class167/Code04_ShortestPathQueries2.java b/src/class167/Code04_ShortestPathQueries2.java index 9272b84ef..dc4999a8a 100644 --- a/src/class167/Code04_ShortestPathQueries2.java +++ b/src/class167/Code04_ShortestPathQueries2.java @@ -6,7 +6,7 @@ // 操作 1 x y d : 原图中加入,点x到点y,权值为d的边 // 操作 2 x y : 原图中删除,点x到点y的边 // 操作 3 x y : 点x到点y,所有路随便走,沿途边权都异或起来,打印能取得的异或最小值 -// 保证任意操作后,图连通、无重边、无自环,所有操作均合法 +// 保证x < y,并且任意操作后,图连通、无重边、无自环,所有操作均合法 // 1 <= n、m、q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF938G // 测试链接 : https://codeforces.com/problemset/problem/938/G diff --git a/src/class167/Code05_EightVerticalHorizontal1.java b/src/class167/Code05_EightVerticalHorizontal1.java index f03aac151..fd2ca71a9 100644 --- a/src/class167/Code05_EightVerticalHorizontal1.java +++ b/src/class167/Code05_EightVerticalHorizontal1.java @@ -1,7 +1,7 @@ package class167; // 八纵八横,java版 -// 一共有n个点,给定m条边,每条边的边权,用01字符串表达 +// 一共有n个点,给定m条边,每条边的边权,用01字符串表达,初始时就保证图连通 // 初始的m条边永不删除,接下来有q条操作,每种操作是如下三种类型中的一种 // 操作 Add x y z : 加入点x到点y的边,边权是z,z为01字符串,第k条添加操作,边的编号为k // 操作 Cancel k : 删除编号为k的边 @@ -94,12 +94,10 @@ public void clear() { public static int[] inspos = new int[BIT + 1]; public static int basiz = 0; - // 可撤销并查集 + 带权并查集 + // 带权并查集 public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static BitSet[] eor = new BitSet[MAXN]; - public static int[][] rollback = new int[MAXT][2]; - public static int opsize = 0; // 时间轴线段树上的区间任务列表 public static int[] head = new int[MAXQ << 2]; @@ -112,6 +110,7 @@ public void clear() { // 每一步的最大异或值 public static BitSet[] ans = new BitSet[MAXQ]; + // num插入线性基 public static void insert(BitSet num) { for (int i = BIT; i >= 0; i--) { if (num.get(i) == 1) { @@ -136,6 +135,7 @@ public static BitSet maxEor() { return ans; } + // 线性基的撤销 public static void cancel(int oldsiz) { while (basiz > oldsiz) { basis[inspos[--basiz]].clear(); @@ -158,7 +158,7 @@ public static BitSet getEor(int i) { return ans; } - public static boolean union(int u, int v, BitSet w) { + public static void union(int u, int v, BitSet w) { int fu = find(u); int fv = find(v); BitSet weight = new BitSet(); @@ -167,27 +167,16 @@ public static boolean union(int u, int v, BitSet w) { weight.eor(w); if (fu == fv) { insert(weight); - return false; - } - if (siz[fu] < siz[fv]) { - int tmp = fu; - fu = fv; - fv = tmp; + } else { + if (siz[fu] < siz[fv]) { + int tmp = fu; + fu = fv; + fv = tmp; + } + father[fv] = fu; + siz[fu] += siz[fv]; + eor[fv].copy(weight); } - father[fv] = fu; - siz[fu] += siz[fv]; - eor[fv].copy(weight); - rollback[++opsize][0] = fu; - rollback[opsize][1] = fv; - return true; - } - - public static void undo() { - int fx = rollback[opsize][0]; - int fy = rollback[opsize--][1]; - father[fy] = fy; - eor[fy].clear(); - siz[fx] -= siz[fy]; } public static void addEdge(int i, int x, int y, BitSet w) { @@ -214,11 +203,8 @@ public static void add(int jobl, int jobr, int jobx, int joby, BitSet jobw, int public static void dfs(int l, int r, int i) { int oldsiz = basiz; - int unionCnt = 0; for (int e = head[i]; e > 0; e = next[e]) { - if (union(tox[e], toy[e], tow[e])) { - unionCnt++; - } + union(tox[e], toy[e], tow[e]); } if (l == r) { ans[l] = maxEor(); @@ -228,9 +214,6 @@ public static void dfs(int l, int r, int i) { dfs(mid + 1, r, i << 1 | 1); } cancel(oldsiz); - for (int k = 1; k <= unionCnt; k++) { - undo(); - } } public static void print(BitSet bs, PrintWriter out) { diff --git a/src/class167/Code05_EightVerticalHorizontal2.java b/src/class167/Code05_EightVerticalHorizontal2.java index df9556618..969e393ba 100644 --- a/src/class167/Code05_EightVerticalHorizontal2.java +++ b/src/class167/Code05_EightVerticalHorizontal2.java @@ -1,7 +1,7 @@ package class167; // 八纵八横,C++版 -// 一共有n个点,给定m条边,每条边的边权,用01字符串表达 +// 一共有n个点,给定m条边,每条边的边权,用01字符串表达,初始时就保证图连通 // 初始的m条边永不删除,接下来有q条操作,每种操作是如下三种类型中的一种 // 操作 Add x y z : 加入点x到点y的边,边权是z,z为01字符串,第k条添加操作,边的编号为k // 操作 Cancel k : 删除编号为k的边 @@ -38,8 +38,6 @@ //int father[MAXN]; //int siz[MAXN]; //bs eor[MAXN]; -//int rollback[MAXT][2]; -//int opsize = 0; // //int head[MAXQ << 2]; //int nxt[MAXT]; @@ -95,33 +93,22 @@ // return ret; //} // -//bool Union(int u, int v, bs& w) { +//void Union(int u, int v, bs& w) { // int fu = find(u); // int fv = find(v); // bs weight = getEor(u) ^ getEor(v) ^ w; // if (fu == fv) { // insert(weight); -// return false; -// } -// if (siz[fu] < siz[fv]) { -// int tmp = fu; -// fu = fv; -// fv = tmp; -// } -// father[fv] = fu; -// siz[fu] += siz[fv]; -// eor[fv] = weight; -// rollback[++opsize][0] = fu; -// rollback[opsize][1] = fv; -// return true; -//} -// -//void undo() { -// int fu = rollback[opsize][0]; -// int fv = rollback[opsize--][1]; -// father[fv] = fv; -// eor[fv].reset(); -// siz[fu] -= siz[fv]; +// } else { +// if (siz[fu] < siz[fv]) { +// int tmp = fu; +// fu = fv; +// fv = tmp; +// } +// father[fv] = fu; +// siz[fu] += siz[fv]; +// eor[fv] = weight; +// } //} // //void addEdge(int i, int u, int v, bs& w) { @@ -148,11 +135,8 @@ // //void dfs(int l, int r, int i) { // int oldsiz = basiz; -// int unionCnt = 0; // for (int e = head[i]; e; e = nxt[e]) { -// if (Union(tox[e], toy[e], tow[e])) { -// ++unionCnt; -// } +// Union(tox[e], toy[e], tow[e]); // } // if (l == r) { // ans[l] = maxEor(); @@ -162,9 +146,6 @@ // dfs(mid + 1, r, i << 1 | 1); // } // cancel(oldsiz); -// for (int k = 1; k <= unionCnt; k++) { -// undo(); -// } //} // //void print(const bs& ret) { From 93faa66e25319097e7198de529cfd0fc84b75eb5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 6 May 2025 13:22:52 +0800 Subject: [PATCH 0084/1170] modify code --- .../Code05_EightVerticalHorizontal1.java | 38 ++++++------------- .../Code05_EightVerticalHorizontal2.java | 28 +++++--------- 2 files changed, 20 insertions(+), 46 deletions(-) diff --git a/src/class167/Code05_EightVerticalHorizontal1.java b/src/class167/Code05_EightVerticalHorizontal1.java index fd2ca71a9..3cc5b4805 100644 --- a/src/class167/Code05_EightVerticalHorizontal1.java +++ b/src/class167/Code05_EightVerticalHorizontal1.java @@ -59,13 +59,6 @@ public void set(int i, int v) { } } - // 拷贝other每一位 - public void copy(BitSet other) { - for (int i = 0; i < len; i++) { - arr[i] = other.arr[i]; - } - } - // 异或other每一位 public void eor(BitSet other) { for (int i = 0; i < len; i++) { @@ -94,9 +87,8 @@ public void clear() { public static int[] inspos = new int[BIT + 1]; public static int basiz = 0; - // 带权并查集 + // 经典带权并查集,只做扁平化,不做小挂大 public static int[] father = new int[MAXN]; - public static int[] siz = new int[MAXN]; public static BitSet[] eor = new BitSet[MAXN]; // 时间轴线段树上的区间任务列表 @@ -115,7 +107,7 @@ public static void insert(BitSet num) { for (int i = BIT; i >= 0; i--) { if (num.get(i) == 1) { if (basis[i].get(i) == 0) { - basis[i].copy(num); + basis[i] = num; inspos[basiz++] = i; return; } @@ -142,20 +134,19 @@ public static void cancel(int oldsiz) { } } + // 带权并查集,扁平化优化,find的同时修改eor public static int find(int i) { - while (i != father[i]) { - i = father[i]; + if (i != father[i]) { + int tmp = father[i]; + father[i] = find(tmp); + eor[i].eor(eor[tmp]); } - return i; + return father[i]; } public static BitSet getEor(int i) { - BitSet ans = new BitSet(); - while (i != father[i]) { - ans.eor(eor[i]); - i = father[i]; - } - return ans; + find(i); + return eor[i]; } public static void union(int u, int v, BitSet w) { @@ -168,14 +159,8 @@ public static void union(int u, int v, BitSet w) { if (fu == fv) { insert(weight); } else { - if (siz[fu] < siz[fv]) { - int tmp = fu; - fu = fv; - fv = tmp; - } father[fv] = fu; - siz[fu] += siz[fv]; - eor[fv].copy(weight); + eor[fv] = weight; } } @@ -244,7 +229,6 @@ public static void main(String[] args) throws IOException { } for (int i = 1; i <= n; i++) { father[i] = i; - siz[i] = 1; eor[i] = new BitSet(); } for (int i = 1; i <= m; i++) { diff --git a/src/class167/Code05_EightVerticalHorizontal2.java b/src/class167/Code05_EightVerticalHorizontal2.java index 969e393ba..762f79888 100644 --- a/src/class167/Code05_EightVerticalHorizontal2.java +++ b/src/class167/Code05_EightVerticalHorizontal2.java @@ -36,7 +36,6 @@ //int basiz = 0; // //int father[MAXN]; -//int siz[MAXN]; //bs eor[MAXN]; // //int head[MAXQ << 2]; @@ -77,20 +76,18 @@ // } //} // -//int find(int v) { -// while (v != father[v]) { -// v = father[v]; +//int find(int i) { +// if (i != father[i]) { +// int tmp = father[i]; +// father[i] = find(tmp); +// eor[i] ^= eor[tmp]; // } -// return v; +// return father[i]; //} // -//bs getEor(int v) { -// bs ret; -// while (v != father[v]) { -// ret ^= eor[v]; -// v = father[v]; -// } -// return ret; +//bs getEor(int i) { +// find(i); +// return eor[i]; //} // //void Union(int u, int v, bs& w) { @@ -100,13 +97,7 @@ // if (fu == fv) { // insert(weight); // } else { -// if (siz[fu] < siz[fv]) { -// int tmp = fu; -// fu = fv; -// fv = tmp; -// } // father[fv] = fu; -// siz[fu] += siz[fv]; // eor[fv] = weight; // } //} @@ -173,7 +164,6 @@ // } // for (int i = 1; i <= n; ++i) { // father[i] = i; -// siz[i] = 1; // eor[i].reset(); // } // int u, v; From f272bc8d5ae1eb8de945cbf3efbc22af4b0ec4b1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 6 May 2025 13:24:35 +0800 Subject: [PATCH 0085/1170] modify code --- src/class167/Code05_EightVerticalHorizontal1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class167/Code05_EightVerticalHorizontal1.java b/src/class167/Code05_EightVerticalHorizontal1.java index 3cc5b4805..78012fbaf 100644 --- a/src/class167/Code05_EightVerticalHorizontal1.java +++ b/src/class167/Code05_EightVerticalHorizontal1.java @@ -134,7 +134,7 @@ public static void cancel(int oldsiz) { } } - // 带权并查集,扁平化优化,find的同时修改eor + // 扁平化优化,find的同时修改eor,就是经典的带权并查集 public static int find(int i) { if (i != father[i]) { int tmp = father[i]; From baef3d372e2b31bd95e2731183bd30968261a891 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 6 May 2025 17:47:37 +0800 Subject: [PATCH 0086/1170] modify code --- src/class167/Code06_MarsStore1.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/class167/Code06_MarsStore1.java b/src/class167/Code06_MarsStore1.java index 4cccefdcf..96a389408 100644 --- a/src/class167/Code06_MarsStore1.java +++ b/src/class167/Code06_MarsStore1.java @@ -49,9 +49,12 @@ public class Code06_MarsStore1 { public static int[] bid = new int[MAXT]; public static int cntb = 0; + // 每个商品(所属的商店编号,该商品的价格) public static int[][] product = new int[MAXN][2]; public static int[] ans = new int[MAXN]; + // 可持久化前缀树 + // 基于i版本的树,添加num,返回新版本的编号 public static int insert(int num, int i) { int rt = ++cntt; tree[rt][0] = tree[i][0]; @@ -69,6 +72,8 @@ public static int insert(int num, int i) { return rt; } + // 可持久化前缀树 + // 根据(v版本 - u版本)的数据状况,看看哪个数字 ^ num能得到最大值并返回 public static int query(int num, int u, int v) { int ans = 0; for (int b = BIT, path, best; b >= 0; b--) { @@ -98,6 +103,7 @@ public static void addInfoB(int i, int bi) { headb[i] = cntb; } + // 当前商品编号pi,沿途经过的所有区间,都把该商品加上 public static void addProduct(int jobi, int pi, int l, int r, int i) { addInfoP(i, pi); if (l < r) { @@ -110,6 +116,7 @@ public static void addProduct(int jobi, int pi, int l, int r, int i) { } } + // 当前购买行为编号bi,命中的线段树区间,把该购买行为加上 public static void addBuy(int jobl, int jobr, int bi, int l, int r, int i) { if (jobl <= l && r <= jobr) { addInfoB(i, bi); From f60591ce1404de0c0005b77d761a5380405ee6df Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 6 May 2025 18:04:36 +0800 Subject: [PATCH 0087/1170] modify code --- src/class167/Code07_MinimumXor1.java | 10 +++++----- src/class167/Code07_MinimumXor2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class167/Code07_MinimumXor1.java b/src/class167/Code07_MinimumXor1.java index f8eb21de0..af6468a6e 100644 --- a/src/class167/Code07_MinimumXor1.java +++ b/src/class167/Code07_MinimumXor1.java @@ -30,7 +30,7 @@ public class Code07_MinimumXor1 { public static int[] mineor = new int[MAXN]; public static int[] only = new int[MAXN]; - public static int insert(int x, int changeCnt) { + public static int change(int x, int changeCnt) { int cur = 1; pass[cur] += changeCnt; for (int b = BIT, path; b >= 0; b--) { @@ -46,7 +46,7 @@ public static int insert(int x, int changeCnt) { } public static void compute(int x, int changeCnt) { - int bottom = insert(x, changeCnt); + int bottom = change(x, changeCnt); mineor[bottom] = pass[bottom] >= 2 ? 0 : INF; only[bottom] = pass[bottom] == 1 ? x : 0; for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { @@ -54,10 +54,10 @@ public static void compute(int x, int changeCnt) { r = tree[i][1]; if (pass[i] < 2) { mineor[i] = INF; - } else if ((l != 0) ^ (r != 0)) { - mineor[i] = l > 0 ? mineor[l] : mineor[r]; - } else if (Math.max(pass[l], pass[r]) == 1) { + } else if (pass[l] == 1 && pass[r] == 1) { mineor[i] = only[l] ^ only[r]; + } else if (pass[l] == 0 ^ pass[r] == 0) { + mineor[i] = pass[l] == 0 ? mineor[r] : mineor[l]; } else { mineor[i] = Math.min(mineor[l], mineor[r]); } diff --git a/src/class167/Code07_MinimumXor2.java b/src/class167/Code07_MinimumXor2.java index 17a641718..33cd9d7ec 100644 --- a/src/class167/Code07_MinimumXor2.java +++ b/src/class167/Code07_MinimumXor2.java @@ -28,7 +28,7 @@ //int mineor[MAXN]; //int only[MAXN]; // -//int insert(int x, int changeCnt) { +//int change(int x, int changeCnt) { // int cur = 1; // pass[cur] += changeCnt; // for (int b = BIT, path; b >= 0; b--) { @@ -44,7 +44,7 @@ //} // //void compute(int x, int changeCnt) { -// int bottom = insert(x, changeCnt); +// int bottom = change(x, changeCnt); // mineor[bottom] = pass[bottom] >= 2 ? 0 : INF; // only[bottom] = pass[bottom] == 1 ? x : 0; // for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { @@ -52,10 +52,10 @@ // r = tree[i][1]; // if (pass[i] < 2) { // mineor[i] = INF; -// } else if ((l != 0) ^ (r != 0)) { -// mineor[i] = l > 0 ? mineor[l] : mineor[r]; -// } else if (max(pass[l], pass[r]) == 1) { +// } else if (pass[l] == 1 && pass[r] == 1) { // mineor[i] = only[l] ^ only[r]; +// } else if (pass[l] == 0 ^ pass[r] == 0) { +// mineor[i] = pass[l] == 0 ? mineor[r] : mineor[l]; // } else { // mineor[i] = min(mineor[l], mineor[r]); // } From 62eb0a9b8afb363cdc8266cbfc241d1d0cd333ac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 6 May 2025 18:27:06 +0800 Subject: [PATCH 0088/1170] modify code --- src/class167/Code07_MinimumXor1.java | 2 +- src/class167/Code07_MinimumXor2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class167/Code07_MinimumXor1.java b/src/class167/Code07_MinimumXor1.java index af6468a6e..6e3e3f05a 100644 --- a/src/class167/Code07_MinimumXor1.java +++ b/src/class167/Code07_MinimumXor1.java @@ -48,7 +48,7 @@ public static int change(int x, int changeCnt) { public static void compute(int x, int changeCnt) { int bottom = change(x, changeCnt); mineor[bottom] = pass[bottom] >= 2 ? 0 : INF; - only[bottom] = pass[bottom] == 1 ? x : 0; + only[bottom] = pass[bottom] >= 1 ? x : 0; for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { l = tree[i][0]; r = tree[i][1]; diff --git a/src/class167/Code07_MinimumXor2.java b/src/class167/Code07_MinimumXor2.java index 33cd9d7ec..61689441e 100644 --- a/src/class167/Code07_MinimumXor2.java +++ b/src/class167/Code07_MinimumXor2.java @@ -46,7 +46,7 @@ //void compute(int x, int changeCnt) { // int bottom = change(x, changeCnt); // mineor[bottom] = pass[bottom] >= 2 ? 0 : INF; -// only[bottom] = pass[bottom] == 1 ? x : 0; +// only[bottom] = pass[bottom] >= 1 ? x : 0; // for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { // l = tree[i][0]; // r = tree[i][1]; From 17a284599333a063ec1aa3ef8d70937f1e403577 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 6 May 2025 18:50:26 +0800 Subject: [PATCH 0089/1170] modify code --- src/class167/Code07_MinimumXor1.java | 4 +++- src/class167/Code07_MinimumXor2.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class167/Code07_MinimumXor1.java b/src/class167/Code07_MinimumXor1.java index 6e3e3f05a..2c738b5d5 100644 --- a/src/class167/Code07_MinimumXor1.java +++ b/src/class167/Code07_MinimumXor1.java @@ -27,7 +27,9 @@ public class Code07_MinimumXor1 { public static int[] pass = new int[MAXN]; public static int cnt = 1; + // 整棵树上最小异或值 public static int[] mineor = new int[MAXN]; + // 整棵树上如果只有一个数x,才有记录,否则记录是0 public static int[] only = new int[MAXN]; public static int change(int x, int changeCnt) { @@ -48,7 +50,7 @@ public static int change(int x, int changeCnt) { public static void compute(int x, int changeCnt) { int bottom = change(x, changeCnt); mineor[bottom] = pass[bottom] >= 2 ? 0 : INF; - only[bottom] = pass[bottom] >= 1 ? x : 0; + only[bottom] = pass[bottom] == 1 ? x : 0; for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { l = tree[i][0]; r = tree[i][1]; diff --git a/src/class167/Code07_MinimumXor2.java b/src/class167/Code07_MinimumXor2.java index 61689441e..33cd9d7ec 100644 --- a/src/class167/Code07_MinimumXor2.java +++ b/src/class167/Code07_MinimumXor2.java @@ -46,7 +46,7 @@ //void compute(int x, int changeCnt) { // int bottom = change(x, changeCnt); // mineor[bottom] = pass[bottom] >= 2 ? 0 : INF; -// only[bottom] = pass[bottom] >= 1 ? x : 0; +// only[bottom] = pass[bottom] == 1 ? x : 0; // for (int i = fa[bottom], l, r; i > 0; i = fa[i]) { // l = tree[i][0]; // r = tree[i][1]; From d873183ab83c2e2c854f5e374f276e9e1bef98c9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 6 May 2025 19:30:22 +0800 Subject: [PATCH 0090/1170] modify code --- ...1\345\210\206\346\262\273-\344\270\213.pptx" | Bin 0 -> 49862 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243167\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\345\210\206\346\262\273-\344\270\213.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243167\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\345\210\206\346\262\273-\344\270\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243167\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\345\210\206\346\262\273-\344\270\213.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..a1bd74b722975164d6c5a9a147743ceefa23676e GIT binary patch literal 49862 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

6;`!=yhr28pyVPH% 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%0A}(9^5=>k=E$D<%Ts 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 Date: Thu, 8 May 2025 12:19:10 +0800 Subject: [PATCH 0091/1170] modify code --- src/class168/Code07_Network1.java | 335 ++++++++++++++++++++++++++++++ 1 file changed, 335 insertions(+) create mode 100644 src/class168/Code07_Network1.java diff --git a/src/class168/Code07_Network1.java b/src/class168/Code07_Network1.java new file mode 100644 index 000000000..6291e0006 --- /dev/null +++ b/src/class168/Code07_Network1.java @@ -0,0 +1,335 @@ +package class168; + +// 网络,java版 +// 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 +// 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 +// 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i +// 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 +// 操作 1 t : 当初时间为t的操作,一定是增加请求的操作,现在这个请求结束了 +// 操作 2 x : 当前时间下,和x号服务器无关的所有请求中,打印最大的重要度 +// 关于操作2,如果当前时间下,没有任何请求、或者所有请求都和x号服务器有关,打印-1 +// 2 <= n <= 10^5 1 <= m <= 2 * 10^5 1 <= 重要度 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P3250 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.StreamTokenizer; +import java.util.Arrays; + +public class Code07_Network1 { + + public static int MAXN = 100001; + public static int MAXM = 200001; + public static int MAXH = 20; + public static int n, m; + + // 链式前向星 + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg = 0; + + // 树上点差分 + 树上倍增 + public static int[] fa = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXH]; + public static int cntd; + + // 树状数组 + public static int[] tree = new int[MAXN]; + + // 从早到晚发生的事件 + public static int[][] events = new int[MAXM][4]; + public static int[] sorted = new int[MAXM]; + public static int s = 0; + + // 整体二分 + public static int[][] lset = new int[MAXM][4]; + public static int[][] rset = new int[MAXM][4]; + public static int[] ans = new int[MAXM]; + public static int cntans = 0; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs1(int u, int f) { + fa[u] = f; + dep[u] = dep[f] + 1; + siz[u] = 1; + dfn[u] = ++cntd; + stjump[u][0] = f; + for (int p = 1; p < MAXH; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = head[u]; e != 0; e = next[e]) { + if (to[e] != f) { + dfs1(to[e], u); + } + } + for (int e = head[u]; e != 0; e = next[e]) { + if (to[e] != f) { + siz[u] += siz[to[e]]; + } + } + } + + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + public static int[][] ufe = new int[MAXN][3]; + + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + // dfs1的迭代版 + public static void dfs2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + fa[u] = f; + dep[u] = dep[f] + 1; + siz[u] = 1; + dfn[u] = ++cntd; + stjump[u][0] = f; + for (int p = 1; p < MAXH; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + e = head[u]; + } else { + e = next[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } else { + for (int e = head[u]; e != 0; e = next[e]) { + if (to[e] != f) { + siz[u] += siz[to[e]]; + } + } + } + } + } + + public static int lca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static void add(int i, int v) { + for (; i <= n; i += i & -i) { + tree[i] += v; + } + } + + public static int query(int i) { + int sum = 0; + for (; i > 0; i -= i & -i) { + sum += tree[i]; + } + return sum; + } + + public static void pathAdd(int x, int y, int v) { + int xylca = lca(x, y); + int lcafa = fa[xylca]; + add(dfn[x], v); + add(dfn[y], v); + add(dfn[xylca], -v); + if (lcafa != 0) { + add(dfn[lcafa], -v); + } + } + + public static int pointQuery(int x) { + return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); + } + + public static int kth(int num) { + int left = 1, right = s, mid; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] == num) { + return mid; + } else if (sorted[mid] < num) { + left = mid + 1; + } else { + right = mid - 1; + } + } + return -1; + } + + public static void clone(int[] event1, int[] event2) { + event1[0] = event2[0]; + event1[1] = event2[1]; + event1[2] = event2[2]; + event1[3] = event2[3]; + } + + public static void prepare() { + dfs2(); // 为了防止爆栈调用迭代版 + sorted[0] = -1; + for (int i = 1; i <= m; i++) { + if (events[i][0] == 0) { + sorted[++s] = events[i][3]; + } + } + Arrays.sort(sorted, 1, s + 1); + int len = 1; + for (int i = 2; i <= s; i++) { + if (sorted[len] != sorted[i]) { + sorted[++len] = sorted[i]; + } + } + s = len; + for (int i = 1; i <= m; i++) { + if (events[i][0] == 0) { + events[i][3] = kth(events[i][3]); + } else if (events[i][0] == 1) { + clone(events[i], events[events[i][1]]); + events[i][0] = -1; + } else { + events[i][0] = ++cntans; + } + } + } + + public static void compute(int evtl, int evtr, int impl, int impr) { + if (evtl > evtr) { + return; + } + if (impl == impr) { + for (int i = evtl; i <= evtr; i++) { + if (events[i][0] > 0) { + ans[events[i][0]] = impl; + } + } + } else { + int impm = (impl + impr) / 2; + int lsize = 0, rsize = 0, request = 0; + for (int i = evtl; i <= evtr; i++) { + if (events[i][0] == 0) { + if (events[i][3] > impm) { + pathAdd(events[i][1], events[i][2], 1); + clone(rset[++rsize], events[i]); + request++; + } else { + clone(lset[++lsize], events[i]); + } + } else if (events[i][0] == -1) { + if (events[i][3] > impm) { + pathAdd(events[i][1], events[i][2], -1); + clone(rset[++rsize], events[i]); + request--; + } else { + clone(lset[++lsize], events[i]); + } + } else { + if (pointQuery(events[i][1]) != request) { + clone(rset[++rsize], events[i]); + } else { + clone(lset[++lsize], events[i]); + } + } + } + for (int i = 1; i <= rsize; i++) { + if (rset[i][0] == 0 && rset[i][3] > impm) { + pathAdd(rset[i][1], rset[i][2], -1); + } + if (rset[i][0] == -1 && rset[i][3] > impm) { + pathAdd(rset[i][1], rset[i][2], 1); + } + } + for (int i = evtl, j = 1; j <= lsize; i++, j++) { + clone(events[i], lset[j]); + } + for (int i = evtl + lsize, j = 1; j <= rsize; i++, j++) { + clone(events[i], rset[j]); + } + compute(evtl, evtl + lsize - 1, impl, impm); + compute(evtl + lsize, evtr, impm + 1, impr); + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StreamTokenizer in = new StreamTokenizer(br); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m = (int) in.nval; + for (int i = 1, u, v; i < n; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + addEdge(u, v); + addEdge(v, u); + } + for (int i = 1; i <= m; i++) { + in.nextToken(); + events[i][0] = (int) in.nval; + in.nextToken(); + events[i][1] = (int) in.nval; + if (events[i][0] == 0) { + in.nextToken(); + events[i][2] = (int) in.nval; + in.nextToken(); + events[i][3] = (int) in.nval; + } + } + prepare(); + compute(1, m, 0, s); + for (int i = 1; i <= cntans; i++) { + out.println(sorted[ans[i]]); + } + out.flush(); + out.close(); + } + +} From c642c257492c60b17a5d63b9794b276f0cec632c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 8 May 2025 12:36:45 +0800 Subject: [PATCH 0092/1170] modify code --- src/class168/Code07_Network2.java | 256 ++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 src/class168/Code07_Network2.java diff --git a/src/class168/Code07_Network2.java b/src/class168/Code07_Network2.java new file mode 100644 index 000000000..7394bf1f5 --- /dev/null +++ b/src/class168/Code07_Network2.java @@ -0,0 +1,256 @@ +package class168; + +// 网络,C++版 +// 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 +// 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 +// 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i +// 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 +// 操作 1 t : 当初时间为t的操作,一定是增加请求的操作,现在这个请求结束了 +// 操作 2 x : 当前时间下,和x号服务器无关的所有请求中,打印最大的重要度 +// 关于操作2,如果当前时间下,没有任何请求、或者所有请求都和x号服务器有关,打印-1 +// 2 <= n <= 10^5 1 <= m <= 2 * 10^5 1 <= 重要度 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P3250 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXM = 200001; +//const int MAXH = 20; +// +//int n, m; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int dfn[MAXN]; +//int stjump[MAXN][MAXH]; +//int cntd = 0; +// +//int tree[MAXN]; +// +//int events[MAXM][4]; +//int sorted[MAXM]; +//int s = 0; +// +//int lset[MAXM][4]; +//int rset[MAXM][4]; +//int ans[MAXM]; +//int cntans = 0; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs(int u, int f) { +// fa[u] = f; +// dep[u] = dep[f] + 1; +// siz[u] = 1; +// dfn[u] = ++cntd; +// stjump[u][0] = f; +// for (int p = 1; p < MAXH; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = head[u]; e != 0; e = nxt[e]) { +// if (to[e] != f) { +// dfs(to[e], u); +// } +// } +// for (int e = head[u]; e != 0; e = nxt[e]) { +// if (to[e] != f) { +// siz[u] += siz[to[e]]; +// } +// } +//} +// +//int lca(int a, int b) { +// if (dep[a] < dep[b]) { +// int tmp = a; +// a = b; +// b = tmp; +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//void add(int i, int v) { +// for (; i <= n; i += i & -i) { +// tree[i] += v; +// } +//} +// +//int query(int i) { +// int sum = 0; +// for (; i > 0; i -= i & -i) { +// sum += tree[i]; +// } +// return sum; +//} +// +//void pathAdd(int x, int y, int v) { +// int xylca = lca(x, y); +// int lcafa = fa[xylca]; +// add(dfn[x], v); +// add(dfn[y], v); +// add(dfn[xylca], -v); +// if (lcafa != 0) { +// add(dfn[lcafa], -v); +// } +//} +// +//int pointQuery(int x) { +// return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); +//} +// +//int kth(int num) { +// int left = 1, right = s, mid; +// while (left <= right) { +// mid = (left + right) / 2; +// if (sorted[mid] == num) { +// return mid; +// } else if (sorted[mid] < num) { +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return -1; +//} +// +//void clone(int* e1, int* e2) { +// e1[0] = e2[0]; +// e1[1] = e2[1]; +// e1[2] = e2[2]; +// e1[3] = e2[3]; +//} +// +//void prepare() { +// dfs(1, 0); +// sorted[0] = -1; +// for (int i = 1; i <= m; i++) { +// if (events[i][0] == 0) { +// sorted[++s] = events[i][3]; +// } +// } +// sort(sorted + 1, sorted + s + 1); +// int len = 1; +// for (int i = 2; i <= s; i++) { +// if (sorted[len] != sorted[i]) { +// sorted[++len] = sorted[i]; +// } +// } +// s = len; +// for (int i = 1; i <= m; i++) { +// if (events[i][0] == 0) { +// events[i][3] = kth(events[i][3]); +// } else if (events[i][0] == 1) { +// clone(events[i], events[events[i][1]]); +// events[i][0] = -1; +// } else { +// events[i][0] = ++cntans; +// } +// } +//} +// +//void compute(int evtl, int evtr, int impl, int impr) { +// if (evtl > evtr) { +// return; +// } +// if (impl == impr) { +// for (int i = evtl; i <= evtr; i++) { +// if (events[i][0] > 0) { +// ans[events[i][0]] = impl; +// } +// } +// } else { +// int impm = (impl + impr) / 2; +// int lsize = 0, rsize = 0, request = 0; +// for (int i = evtl; i <= evtr; i++) { +// if (events[i][0] == 0) { +// if (events[i][3] > impm) { +// pathAdd(events[i][1], events[i][2], 1); +// clone(rset[++rsize], events[i]); +// request++; +// } else { +// clone(lset[++lsize], events[i]); +// } +// } else if (events[i][0] == -1) { +// if (events[i][3] > impm) { +// pathAdd(events[i][1], events[i][2], -1); +// clone(rset[++rsize], events[i]); +// request--; +// } else { +// clone(lset[++lsize], events[i]); +// } +// } else { +// if (pointQuery(events[i][1]) != request) { +// clone(rset[++rsize], events[i]); +// } else { +// clone(lset[++lsize], events[i]); +// } +// } +// } +// for (int i = 1; i <= rsize; i++) { +// if (rset[i][0] == 0 && rset[i][3] > impm) { +// pathAdd(rset[i][1], rset[i][2], -1); +// } +// if (rset[i][0] == -1 && rset[i][3] > impm) { +// pathAdd(rset[i][1], rset[i][2], 1); +// } +// } +// for (int i = evtl, j = 1; j <= lsize; i++, j++) { +// clone(events[i], lset[j]); +// } +// for (int i = evtl + lsize, j = 1; j <= rsize; i++, j++) { +// clone(events[i], rset[j]); +// } +// compute(evtl, evtl + lsize - 1, impl, impm); +// compute(evtl + lsize, evtr, impm + 1, impr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// for (int i = 1; i <= m; i++) { +// cin >> events[i][0] >> events[i][1]; +// if (events[i][0] == 0) { +// cin >> events[i][2] >> events[i][3]; +// } +// } +// prepare(); +// compute(1, m, 0, s); +// for (int i = 1; i <= cntans; i++) { +// cout << sorted[ans[i]] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 0061aead887356be9c82bf047d2cf46410d0703a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 8 May 2025 14:09:34 +0800 Subject: [PATCH 0093/1170] modify code --- src/class168/{Code07_Network1.java => Code05_Network1.java} | 2 +- src/class168/{Code07_Network2.java => Code05_Network2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class168/{Code07_Network1.java => Code05_Network1.java} (99%) rename src/class168/{Code07_Network2.java => Code05_Network2.java} (100%) diff --git a/src/class168/Code07_Network1.java b/src/class168/Code05_Network1.java similarity index 99% rename from src/class168/Code07_Network1.java rename to src/class168/Code05_Network1.java index 6291e0006..8bc47b4e7 100644 --- a/src/class168/Code07_Network1.java +++ b/src/class168/Code05_Network1.java @@ -20,7 +20,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code07_Network1 { +public class Code05_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; diff --git a/src/class168/Code07_Network2.java b/src/class168/Code05_Network2.java similarity index 100% rename from src/class168/Code07_Network2.java rename to src/class168/Code05_Network2.java From 1efcfd487b2d65d83b1f8f91aa5ee0c40c1df244 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 8 May 2025 14:14:18 +0800 Subject: [PATCH 0094/1170] modify code --- src/class168/{Code05_Network1.java => Code06_Network1.java} | 2 +- src/class168/{Code05_Network2.java => Code06_Network2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class168/{Code05_Network1.java => Code06_Network1.java} (99%) rename src/class168/{Code05_Network2.java => Code06_Network2.java} (100%) diff --git a/src/class168/Code05_Network1.java b/src/class168/Code06_Network1.java similarity index 99% rename from src/class168/Code05_Network1.java rename to src/class168/Code06_Network1.java index 8bc47b4e7..279253d22 100644 --- a/src/class168/Code05_Network1.java +++ b/src/class168/Code06_Network1.java @@ -20,7 +20,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_Network1 { +public class Code06_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; diff --git a/src/class168/Code05_Network2.java b/src/class168/Code06_Network2.java similarity index 100% rename from src/class168/Code05_Network2.java rename to src/class168/Code06_Network2.java From da124ae8742c9cc72a6a518c3b782d3c84ad984c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 8 May 2025 21:25:42 +0800 Subject: [PATCH 0095/1170] modify code --- src/class168/Code01_MixedJuice1.java | 9 +++++++++ src/class168/Code05_Meteors1.java | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/class168/Code01_MixedJuice1.java create mode 100644 src/class168/Code05_Meteors1.java diff --git a/src/class168/Code01_MixedJuice1.java b/src/class168/Code01_MixedJuice1.java new file mode 100644 index 000000000..df4cc292f --- /dev/null +++ b/src/class168/Code01_MixedJuice1.java @@ -0,0 +1,9 @@ +package class168; + +// 混合果汁,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4602 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code01_MixedJuice1 { + +} diff --git a/src/class168/Code05_Meteors1.java b/src/class168/Code05_Meteors1.java new file mode 100644 index 000000000..5f1a75dcc --- /dev/null +++ b/src/class168/Code05_Meteors1.java @@ -0,0 +1,9 @@ +package class168; + +// 陨石雨,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3527 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code05_Meteors1 { + +} From 76ff39e6508100108eb8106ef318cf1262e50072 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 9 May 2025 00:31:14 +0800 Subject: [PATCH 0096/1170] modify code --- src/class168/Code01_Meteors1.java | 187 ++++++++++++++++++ src/class168/Code01_Meteors2.java | 137 +++++++++++++ ...xedJuice1.java => Code02_MixedJuice1.java} | 2 +- src/class168/Code05_Meteors1.java | 9 - src/class168/Code06_Network1.java | 70 +++++-- 5 files changed, 374 insertions(+), 31 deletions(-) create mode 100644 src/class168/Code01_Meteors1.java create mode 100644 src/class168/Code01_Meteors2.java rename src/class168/{Code01_MixedJuice1.java => Code02_MixedJuice1.java} (85%) delete mode 100644 src/class168/Code05_Meteors1.java diff --git a/src/class168/Code01_Meteors1.java b/src/class168/Code01_Meteors1.java new file mode 100644 index 000000000..99746af28 --- /dev/null +++ b/src/class168/Code01_Meteors1.java @@ -0,0 +1,187 @@ +package class168; + +// 陨石雨,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3527 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是通过不了,空间使用过大 +// 这道题只考虑C++能通过的空间极限,根本没考虑java的用户 +// 想通过用C++实现,本节课Code01_Meteors2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code01_Meteors1 { + + public static int MAXN = 300001; + public static int n, m, k; + + public static int[] arr = new int[MAXN]; + public static int[] need = new int[MAXN]; + + public static int[] rainl = new int[MAXN]; + public static int[] rainr = new int[MAXN]; + public static int[] num = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN]; + public static int[] to = new int[MAXN]; + public static int cnt = 0; + + public static long[] tree = new long[MAXN << 1]; + + public static int[] lset = new int[MAXN]; + public static int[] rset = new int[MAXN]; + + public static int[] ans = new int[MAXN]; + + public static void addEdge(int i, int v) { + next[++cnt] = head[i]; + to[cnt] = v; + head[i] = cnt; + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + int siz = m * 2; + while (i <= siz) { + tree[i] += v; + i += lowbit(i); + } + } + + public static void add(int l, int r, int v) { + add(l, v); + add(r + 1, -v); + } + + public static long query(int i) { + long ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static void compute(int al, int ar, int tl, int tr) { + if (tl == tr) { + for (int i = al; i <= ar; i++) { + ans[arr[i]] = tl; + } + } else { + int mid = (tl + tr) >> 1; + int lsiz = 0, rsiz = 0, nation; + long times; + for (int i = tl; i <= mid; i++) { + add(rainl[i], rainr[i], num[i]); + } + for (int i = al; i <= ar; i++) { + nation = arr[i]; + times = 0; + for (int e = head[nation]; e > 0; e = next[e]) { + times += query(to[e]) + query(to[e] + m); + if (times >= need[nation]) { + break; + } + } + if (times >= need[nation]) { + lset[++lsiz] = nation; + } else { + need[nation] -= times; + rset[++rsiz] = nation; + } + } + for (int i = tl; i <= mid; i++) { + add(rainl[i], rainr[i], -num[i]); + } + for (int i = 1; i <= lsiz; i++) { + arr[al + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + arr[al + lsiz + i - 1] = rset[i]; + } + compute(al, al + lsiz - 1, tl, mid); + compute(al + lsiz, ar, mid + 1, tr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, nation; i <= m; i++) { + nation = in.nextInt(); + addEdge(nation, i); + } + for (int i = 1; i <= n; i++) { + arr[i] = i; + need[i] = in.nextInt(); + } + k = in.nextInt(); + for (int i = 1; i <= k; i++) { + rainl[i] = in.nextInt(); + rainr[i] = in.nextInt(); + if (rainr[i] < rainl[i]) { + rainr[i] += m; + } + num[i] = in.nextInt(); + } + compute(1, n, 1, k + 1); + for (int i = 1; i <= n; i++) { + if (ans[i] == k + 1) { + out.println("NIE"); + } else { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class168/Code01_Meteors2.java b/src/class168/Code01_Meteors2.java new file mode 100644 index 000000000..f92c223aa --- /dev/null +++ b/src/class168/Code01_Meteors2.java @@ -0,0 +1,137 @@ +package class168; + +// 陨石雨,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3527 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +// +//int n, m, k; +// +//int arr[MAXN]; +//int need[MAXN]; +// +//int rainl[MAXN]; +//int rainr[MAXN]; +//int num[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN]; +//int to[MAXN]; +//int cnt = 0; +// +//long long tree[MAXN << 1]; +// +//int lset[MAXN]; +//int rset[MAXN]; +// +//int ans[MAXN]; +// +//void addEdge(int i, int v) { +// nxt[++cnt] = head[i]; +// to[cnt] = v; +// head[i] = cnt; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// int siz = m * 2; +// while (i <= siz) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//void add(int l, int r, int v) { +// add(l, v); +// add(r + 1, -v); +//} +// +//long long query(int i) { +// long long ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void compute(int al, int ar, int tl, int tr) { +// if (tl == tr) { +// for (int i = al; i <= ar; i++) { +// ans[arr[i]] = tl; +// } +// } else { +// int mid = (tl + tr) >> 1; +// int lsiz = 0, rsiz = 0, nation; +// long long times; +// for (int i = tl; i <= mid; i++) { +// add(rainl[i], rainr[i], num[i]); +// } +// for (int i = al; i <= ar; i++) { +// nation = arr[i]; +// times = 0; +// for (int e = head[nation]; e > 0; e = nxt[e]) { +// times += query(to[e]) + query(to[e] + m); +// if (times >= need[nation]) { +// break; +// } +// } +// if (times >= need[nation]) { +// lset[++lsiz] = nation; +// } else { +// need[nation] -= static_cast(times); +// rset[++rsiz] = nation; +// } +// } +// for (int i = tl; i <= mid; i++) { +// add(rainl[i], rainr[i], -num[i]); +// } +// for (int i = 1; i <= lsiz; i++) { +// arr[al + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// arr[al + lsiz + i - 1] = rset[i]; +// } +// compute(al, al + lsiz - 1, tl, mid); +// compute(al + lsiz, ar, mid + 1, tr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, nation; i <= m; i++) { +// cin >> nation; +// addEdge(nation, i); +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = i; +// cin >> need[i]; +// } +// cin >> k; +// for (int i = 1; i <= k; i++) { +// cin >> rainl[i] >> rainr[i] >> num[i]; +// if (rainr[i] < rainl[i]) { +// rainr[i] += m; +// } +// } +// compute(1, n, 1, k + 1); +// for (int i = 1; i <= n; i++) { +// if (ans[i] == k + 1) { +// cout << "NIE" << '\n'; +// } else { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class168/Code01_MixedJuice1.java b/src/class168/Code02_MixedJuice1.java similarity index 85% rename from src/class168/Code01_MixedJuice1.java rename to src/class168/Code02_MixedJuice1.java index df4cc292f..45add820c 100644 --- a/src/class168/Code01_MixedJuice1.java +++ b/src/class168/Code02_MixedJuice1.java @@ -4,6 +4,6 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4602 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -public class Code01_MixedJuice1 { +public class Code02_MixedJuice1 { } diff --git a/src/class168/Code05_Meteors1.java b/src/class168/Code05_Meteors1.java deleted file mode 100644 index 5f1a75dcc..000000000 --- a/src/class168/Code05_Meteors1.java +++ /dev/null @@ -1,9 +0,0 @@ -package class168; - -// 陨石雨,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P3527 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -public class Code05_Meteors1 { - -} diff --git a/src/class168/Code06_Network1.java b/src/class168/Code06_Network1.java index 279253d22..320619cf3 100644 --- a/src/class168/Code06_Network1.java +++ b/src/class168/Code06_Network1.java @@ -12,12 +12,10 @@ // 测试链接 : https://www.luogu.com.cn/problem/P3250 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; +import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.io.StreamTokenizer; import java.util.Arrays; public class Code06_Network1 { @@ -296,31 +294,22 @@ public static void compute(int evtl, int evtr, int impl, int impr) { } public static void main(String[] args) throws IOException { - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - StreamTokenizer in = new StreamTokenizer(br); + FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - in.nextToken(); - n = (int) in.nval; - in.nextToken(); - m = (int) in.nval; + n = in.nextInt(); + m = in.nextInt(); for (int i = 1, u, v; i < n; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; + u = in.nextInt(); + v = in.nextInt(); addEdge(u, v); addEdge(v, u); } for (int i = 1; i <= m; i++) { - in.nextToken(); - events[i][0] = (int) in.nval; - in.nextToken(); - events[i][1] = (int) in.nval; + events[i][0] = in.nextInt(); + events[i][1] = in.nextInt(); if (events[i][0] == 0) { - in.nextToken(); - events[i][2] = (int) in.nval; - in.nextToken(); - events[i][3] = (int) in.nval; + events[i][2] = in.nextInt(); + events[i][3] = in.nextInt(); } } prepare(); @@ -332,4 +321,43 @@ public static void main(String[] args) throws IOException { out.close(); } + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From 444e52647f07fccfa6fb82f15b553f884a78a1d1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 9 May 2025 00:35:07 +0800 Subject: [PATCH 0097/1170] modify code --- src/class168/Code01_Meteors1.java | 12 ++++++------ src/class168/Code01_Meteors2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class168/Code01_Meteors1.java b/src/class168/Code01_Meteors1.java index 99746af28..a441bc983 100644 --- a/src/class168/Code01_Meteors1.java +++ b/src/class168/Code01_Meteors1.java @@ -77,23 +77,23 @@ public static void compute(int al, int ar, int tl, int tr) { } else { int mid = (tl + tr) >> 1; int lsiz = 0, rsiz = 0, nation; - long times; + long satisfy; for (int i = tl; i <= mid; i++) { add(rainl[i], rainr[i], num[i]); } for (int i = al; i <= ar; i++) { nation = arr[i]; - times = 0; + satisfy = 0; for (int e = head[nation]; e > 0; e = next[e]) { - times += query(to[e]) + query(to[e] + m); - if (times >= need[nation]) { + satisfy += query(to[e]) + query(to[e] + m); + if (satisfy >= need[nation]) { break; } } - if (times >= need[nation]) { + if (satisfy >= need[nation]) { lset[++lsiz] = nation; } else { - need[nation] -= times; + need[nation] -= satisfy; rset[++rsiz] = nation; } } diff --git a/src/class168/Code01_Meteors2.java b/src/class168/Code01_Meteors2.java index f92c223aa..f04f66767 100644 --- a/src/class168/Code01_Meteors2.java +++ b/src/class168/Code01_Meteors2.java @@ -72,23 +72,23 @@ // } else { // int mid = (tl + tr) >> 1; // int lsiz = 0, rsiz = 0, nation; -// long long times; +// long long satisfy; // for (int i = tl; i <= mid; i++) { // add(rainl[i], rainr[i], num[i]); // } // for (int i = al; i <= ar; i++) { // nation = arr[i]; -// times = 0; +// satisfy = 0; // for (int e = head[nation]; e > 0; e = nxt[e]) { -// times += query(to[e]) + query(to[e] + m); -// if (times >= need[nation]) { +// satisfy += query(to[e]) + query(to[e] + m); +// if (satisfy >= need[nation]) { // break; // } // } -// if (times >= need[nation]) { +// if (satisfy >= need[nation]) { // lset[++lsiz] = nation; // } else { -// need[nation] -= static_cast(times); +// need[nation] -= static_cast(satisfy); // rset[++rsiz] = nation; // } // } From 2943dbb65d387cddfa232f38ae5250e77899fe9c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 9 May 2025 15:58:02 +0800 Subject: [PATCH 0098/1170] modify code --- src/class168/Code02_MixedJuice1.java | 185 +++++++++++++++++++++++++++ src/class168/Code02_MixedJuice2.java | 127 ++++++++++++++++++ src/class168/Code06_Network1.java | 3 - src/class168/Code06_Network2.java | 3 - 4 files changed, 312 insertions(+), 6 deletions(-) create mode 100644 src/class168/Code02_MixedJuice2.java diff --git a/src/class168/Code02_MixedJuice1.java b/src/class168/Code02_MixedJuice1.java index 45add820c..0b6fa7122 100644 --- a/src/class168/Code02_MixedJuice1.java +++ b/src/class168/Code02_MixedJuice1.java @@ -4,6 +4,191 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4602 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + public class Code02_MixedJuice1 { + public static int MAXN = 100001; + public static int n, m; + // 果汁参数 : 美味度d、每升价格p、添加上限l + public static int[][] juice = new int[MAXN][3]; + // 记录所有小朋友的编号 + public static int[] arr = new int[MAXN]; + // 小朋友的钱数 + public static long[] money = new long[MAXN]; + // 小朋友需要至少多少升果汁 + public static long[] least = new long[MAXN]; + + // 线段树 + public static int maxp = 0; + public static long[] suml = new long[MAXN << 2]; + public static long[] cost = new long[MAXN << 2]; + // 多少种果汁参数加入了线段树 + public static int used = 0; + + // 整体二分的过程需要 + public static int[] lset = new int[MAXN]; + public static int[] rset = new int[MAXN]; + + // 每个小朋友的答案,是第几号果汁的美味度 + public static int[] ans = new int[MAXN]; + + public static void up(int i) { + suml[i] = suml[i << 1] + suml[i << 1 | 1]; + cost[i] = cost[i << 1] + cost[i << 1 | 1]; + } + + public static void add(int jobi, int jobv, int l, int r, int i) { + if (l == r) { + suml[i] += jobv; + cost[i] = suml[i] * l; + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + add(jobi, jobv, l, mid, i << 1); + } else { + add(jobi, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static long query(long volume, int l, int r, int i) { + if (l == r) { + return volume * l; + } + int mid = (l + r) >> 1; + if (suml[i << 1] >= volume) { + return query(volume, l, mid, i << 1); + } else { + return cost[i << 1] + query(volume - suml[i << 1], mid + 1, r, i << 1 | 1); + } + } + + public static void compute(int al, int ar, int jl, int jr) { + if (jl == jr) { + for (int i = al; i <= ar; i++) { + ans[arr[i]] = jl; + } + } else { + int mid = (jl + jr) >> 1; + while (used < mid) { + used++; + add(juice[used][1], juice[used][2], 1, maxp, 1); + } + while (used > mid) { + add(juice[used][1], -juice[used][2], 1, maxp, 1); + used--; + } + int lsiz = 0, rsiz = 0; + for (int i = al, id; i <= ar; i++) { + id = arr[i]; + if (suml[1] >= least[id] && query(least[id], 1, maxp, 1) <= money[id]) { + lset[++lsiz] = id; + } else { + rset[++rsiz] = id; + } + } + for (int i = 1; i <= lsiz; i++) { + arr[al + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + arr[al + lsiz + i - 1] = rset[i]; + } + compute(al, al + lsiz - 1, jl, mid); + compute(al + lsiz, ar, mid + 1, jr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + juice[i][0] = in.nextInt(); + juice[i][1] = in.nextInt(); + juice[i][2] = in.nextInt(); + maxp = Math.max(maxp, juice[i][1]); + } + for (int i = 1; i <= m; i++) { + arr[i] = i; + money[i] = in.nextLong(); + least[i] = in.nextLong(); + } + Arrays.sort(juice, 1, n + 1, (a, b) -> b[0] - a[0]); + compute(1, m, 1, n + 1); + for (int i = 1; i <= m; i++) { + if (ans[i] == n + 1) { + out.println(-1); + } else { + out.println(juice[ans[i]][0]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + + long nextLong() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + long val = 0L; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + + } + } diff --git a/src/class168/Code02_MixedJuice2.java b/src/class168/Code02_MixedJuice2.java new file mode 100644 index 000000000..fb01de2a6 --- /dev/null +++ b/src/class168/Code02_MixedJuice2.java @@ -0,0 +1,127 @@ +package class168; + +// 混合果汁,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4602 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Juice { +// int d, p, l; +//}; +// +//bool JuiceCmp(Juice x, Juice y) { +// return x.d > y.d; +//} +// +//const int MAXN = 100001; +//int n, m; +// +//Juice juice[MAXN]; +//int arr[MAXN]; +//long long money[MAXN]; +//long long least[MAXN]; +// +//int maxp = 0; +//long long suml[MAXN << 2]; +//long long cost[MAXN << 2]; +//int used = 0; +// +//int lset[MAXN]; +//int rset[MAXN]; +// +//int ans[MAXN]; +// +//void up(int i) { +// suml[i] = suml[i << 1] + suml[i << 1 | 1]; +// cost[i] = cost[i << 1] + cost[i << 1 | 1]; +//} +// +//void add(int jobi, int jobv, int l, int r, int i) { +// if (l == r) { +// suml[i] += jobv; +// cost[i] = suml[i] * l; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// add(jobi, jobv, l, mid, i << 1); +// } else { +// add(jobi, jobv, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//long long query(long long volume, int l, int r, int i) { +// if (l == r) { +// return volume * l; +// } +// int mid = (l + r) >> 1; +// if (suml[i << 1] >= volume) { +// return query(volume, l, mid, i << 1); +// } else { +// return cost[i << 1] + query(volume - suml[i << 1], mid + 1, r, i << 1 | 1); +// } +//} +// +//void compute(int al, int ar, int jl, int jr) { +// if (jl == jr) { +// for (int i = al; i <= ar; i++) { +// ans[arr[i]] = jl; +// } +// } else { +// int mid = (jl + jr) >> 1; +// while (used < mid) { +// used++; +// add(juice[used].p, juice[used].l, 1, maxp, 1); +// } +// while (used > mid) { +// add(juice[used].p, -juice[used].l, 1, maxp, 1); +// used--; +// } +// int lsiz = 0, rsiz = 0; +// for (int i = al, id; i <= ar; i++) { +// id = arr[i]; +// if (suml[1] >= least[id] && query(least[id], 1, maxp, 1) <= money[id]) { +// lset[++lsiz] = id; +// } else { +// rset[++rsiz] = id; +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// arr[al + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// arr[al + lsiz + i - 1] = rset[i]; +// } +// compute(al, al + lsiz - 1, jl, mid); +// compute(al + lsiz, ar, mid + 1, jr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> juice[i].d >> juice[i].p >> juice[i].l; +// maxp = max(maxp, juice[i].p); +// } +// for (int i = 1; i <= m; i++) { +// arr[i] = i; +// cin >> money[i] >> least[i]; +// } +// sort(juice + 1, juice + n + 1, JuiceCmp); +// compute(1, m, 1, n + 1); +// for (int i = 1; i <= m; i++) { +// if (ans[i] == n + 1) { +// cout << -1 << '\n'; +// } else { +// cout << juice[ans[i]].d << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class168/Code06_Network1.java b/src/class168/Code06_Network1.java index 320619cf3..5226931cf 100644 --- a/src/class168/Code06_Network1.java +++ b/src/class168/Code06_Network1.java @@ -237,9 +237,6 @@ public static void prepare() { } public static void compute(int evtl, int evtr, int impl, int impr) { - if (evtl > evtr) { - return; - } if (impl == impr) { for (int i = evtl; i <= evtr; i++) { if (events[i][0] > 0) { diff --git a/src/class168/Code06_Network2.java b/src/class168/Code06_Network2.java index 7394bf1f5..dcae9f688 100644 --- a/src/class168/Code06_Network2.java +++ b/src/class168/Code06_Network2.java @@ -176,9 +176,6 @@ //} // //void compute(int evtl, int evtr, int impl, int impr) { -// if (evtl > evtr) { -// return; -// } // if (impl == impr) { // for (int i = evtl; i <= evtr; i++) { // if (events[i][0] > 0) { From a457fe4c04f513bea6e64bfb7bae3e92886fa126 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 9 May 2025 16:03:34 +0800 Subject: [PATCH 0099/1170] modify code --- src/class168/Code02_MixedJuice1.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/class168/Code02_MixedJuice1.java b/src/class168/Code02_MixedJuice1.java index 0b6fa7122..ad549269f 100644 --- a/src/class168/Code02_MixedJuice1.java +++ b/src/class168/Code02_MixedJuice1.java @@ -14,20 +14,23 @@ public class Code02_MixedJuice1 { public static int MAXN = 100001; public static int n, m; - // 果汁参数 : 美味度d、每升价格p、添加上限l + // 果汁有三个参数,美味度d、每升价格p、添加上限l public static int[][] juice = new int[MAXN][3]; // 记录所有小朋友的编号 public static int[] arr = new int[MAXN]; - // 小朋友的钱数 + // 小朋友能花的钱数 public static long[] money = new long[MAXN]; - // 小朋友需要至少多少升果汁 + // 小朋友至少的果汁量 public static long[] least = new long[MAXN]; - // 线段树 + // 果汁单价作为下标的线段树 + // maxp为单价的最大上限 public static int maxp = 0; + // suml[i] : 线段树某单价区间上,总果汁的量 public static long[] suml = new long[MAXN << 2]; + // cost[i] : 线段树某单价区间上,如果总果汁的量全买,花费多少钱 public static long[] cost = new long[MAXN << 2]; - // 多少种果汁参数加入了线段树 + // 多少种果汁加入了线段树 public static int used = 0; // 整体二分的过程需要 From 66eab4e42cb96c1cc4c4ad07bf2e3e5033157ab0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 9 May 2025 16:09:13 +0800 Subject: [PATCH 0100/1170] modify code --- src/class168/Code01_Meteors1.java | 4 ++-- src/class168/Code02_MixedJuice1.java | 2 ++ src/class168/Code03_Multiplication1.java | 9 +++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 src/class168/Code03_Multiplication1.java diff --git a/src/class168/Code01_Meteors1.java b/src/class168/Code01_Meteors1.java index a441bc983..4d2ffae0a 100644 --- a/src/class168/Code01_Meteors1.java +++ b/src/class168/Code01_Meteors1.java @@ -3,8 +3,8 @@ // 陨石雨,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3527 // 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是通过不了,空间使用过大 -// 这道题只考虑C++能通过的空间极限,根本没考虑java的用户 +// java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 +// 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 // 想通过用C++实现,本节课Code01_Meteors2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 diff --git a/src/class168/Code02_MixedJuice1.java b/src/class168/Code02_MixedJuice1.java index ad549269f..b4cd638ef 100644 --- a/src/class168/Code02_MixedJuice1.java +++ b/src/class168/Code02_MixedJuice1.java @@ -79,10 +79,12 @@ public static void compute(int al, int ar, int jl, int jr) { } } else { int mid = (jl + jr) >> 1; + // 线段树包含果汁的种类少就添加 while (used < mid) { used++; add(juice[used][1], juice[used][2], 1, maxp, 1); } + // 线段树包含果汁的种类多就撤销 while (used > mid) { add(juice[used][1], -juice[used][2], 1, maxp, 1); used--; diff --git a/src/class168/Code03_Multiplication1.java b/src/class168/Code03_Multiplication1.java new file mode 100644 index 000000000..9b844c148 --- /dev/null +++ b/src/class168/Code03_Multiplication1.java @@ -0,0 +1,9 @@ +package class168; + +// 矩阵乘法,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1527 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code03_Multiplication1 { + +} From 0c7908420fe0c6b925a03e976caec4eadbf8e837 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 9 May 2025 16:09:55 +0800 Subject: [PATCH 0101/1170] modify code --- src/class168/{Code02_MixedJuice1.java => Code02_Juice1.java} | 2 +- src/class168/{Code02_MixedJuice2.java => Code02_Juice2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class168/{Code02_MixedJuice1.java => Code02_Juice1.java} (99%) rename src/class168/{Code02_MixedJuice2.java => Code02_Juice2.java} (100%) diff --git a/src/class168/Code02_MixedJuice1.java b/src/class168/Code02_Juice1.java similarity index 99% rename from src/class168/Code02_MixedJuice1.java rename to src/class168/Code02_Juice1.java index b4cd638ef..936b7b910 100644 --- a/src/class168/Code02_MixedJuice1.java +++ b/src/class168/Code02_Juice1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_MixedJuice1 { +public class Code02_Juice1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class168/Code02_MixedJuice2.java b/src/class168/Code02_Juice2.java similarity index 100% rename from src/class168/Code02_MixedJuice2.java rename to src/class168/Code02_Juice2.java From 8c71a60deb16cba67dada8bae1442e87488562b3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 10 May 2025 22:55:13 +0800 Subject: [PATCH 0102/1170] modify code --- src/class168/Code01_KthSmall1.java | 179 ++++++++++++++++++ src/class168/Code01_KthSmall2.java | 129 +++++++++++++ ...e01_Meteors1.java => Code02_Meteors1.java} | 62 +++--- ...e01_Meteors2.java => Code02_Meteors2.java} | 58 +++--- ...{Code02_Juice1.java => Code03_Juice1.java} | 31 +-- ...{Code02_Juice2.java => Code03_Juice2.java} | 29 +-- src/class168/Code03_Multiplication1.java | 9 - src/class168/Code06_Network1.java | 31 +-- src/class168/Code06_Network2.java | 31 +-- 9 files changed, 439 insertions(+), 120 deletions(-) create mode 100644 src/class168/Code01_KthSmall1.java create mode 100644 src/class168/Code01_KthSmall2.java rename src/class168/{Code01_Meteors1.java => Code02_Meteors1.java} (77%) rename src/class168/{Code01_Meteors2.java => Code02_Meteors2.java} (67%) rename src/class168/{Code02_Juice1.java => Code03_Juice1.java} (90%) rename src/class168/{Code02_Juice2.java => Code03_Juice2.java} (84%) delete mode 100644 src/class168/Code03_Multiplication1.java diff --git a/src/class168/Code01_KthSmall1.java b/src/class168/Code01_KthSmall1.java new file mode 100644 index 000000000..58b3a7540 --- /dev/null +++ b/src/class168/Code01_KthSmall1.java @@ -0,0 +1,179 @@ +package class168; + +// 子矩阵第k小,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1527 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_KthSmall1 { + + public static int MAXN = 501; + public static int MAXQ = 1000001; + public static int INF = 1000000001; + public static int n, q; + + // 矩阵中的每个数字,所在行x、所在列y、数值v + public static int[][] xyv = new int[MAXN * MAXN][3]; + public static int cntv = 0; + public static int used = 0; + + // 查询任务的编号 + public static int[] qid = new int[MAXQ]; + // 查询范围的左上角坐标 + public static int[] a = new int[MAXQ]; + public static int[] b = new int[MAXQ]; + // 查询范围的右下角坐标 + public static int[] c = new int[MAXQ]; + public static int[] d = new int[MAXQ]; + // 查询任务的第几小值 + public static int[] k = new int[MAXQ]; + + // 二维树状数组 + public static int[][] tree = new int[MAXN][MAXN]; + + // 整体二分 + public static int[] lset = new int[MAXQ]; + public static int[] rset = new int[MAXQ]; + + // 每条查询的答案 + public static int[] ans = new int[MAXQ]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int x, int y, int v) { + for (int i = x; i <= n; i += lowbit(i)) { + for (int j = y; j <= n; j += lowbit(j)) { + tree[i][j] += v; + } + } + } + + public static int query(int x, int y) { + int ret = 0; + for (int i = x; i > 0; i -= lowbit(i)) { + for (int j = y; j > 0; j -= lowbit(j)) { + ret += tree[i][j]; + } + } + return ret; + } + + public static int query(int a, int b, int c, int d) { + return query(c, d) - query(a - 1, d) - query(c, b - 1) + query(a - 1, b - 1); + } + + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[qid[i]] = vl; + } + } else { + int mid = (vl + vr) >> 1; + int lsiz = 0, rsiz = 0; + while (used + 1 <= cntv && xyv[used + 1][2] <= mid) { + used++; + add(xyv[used][0], xyv[used][1], 1); + } + while (used >= 1 && xyv[used][2] > mid) { + add(xyv[used][0], xyv[used][1], -1); + used--; + } + for (int i = ql; i <= qr; i++) { + int id = qid[i]; + int check = query(a[id], b[id], c[id], d[id]); + if (check >= k[id]) { + lset[++lsiz] = id; + } else { + rset[++rsiz] = id; + } + } + for (int i = 1; i <= lsiz; i++) { + qid[ql + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + qid[ql + lsiz + i - 1] = rset[i]; + } + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + q = in.nextInt(); + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + xyv[++cntv][0] = i; + xyv[cntv][1] = j; + xyv[cntv][2] = in.nextInt(); + } + } + for (int i = 1; i <= q; i++) { + qid[i] = i; + a[i] = in.nextInt(); + b[i] = in.nextInt(); + c[i] = in.nextInt(); + d[i] = in.nextInt(); + k[i] = in.nextInt(); + } + Arrays.sort(xyv, 1, cntv + 1, (a, b) -> a[2] - b[2]); + compute(1, q, 0, INF); + for (int i = 1; i <= q; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class168/Code01_KthSmall2.java b/src/class168/Code01_KthSmall2.java new file mode 100644 index 000000000..2e1dd4109 --- /dev/null +++ b/src/class168/Code01_KthSmall2.java @@ -0,0 +1,129 @@ +package class168; + +// 子矩阵第k小,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P1527 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Number { +// int x, y, v; +//}; +// +//bool NumberCmp(Number a, Number b) { +// return a.v < b.v; +//} +// +//const int MAXN = 501; +//const int MAXQ = 1000001; +//const int INF = 1000000001; +//int n, q; +// +//Number xyv[MAXN * MAXN]; +//int cntv = 0; +//int used = 0; +// +//int qid[MAXQ]; +//int a[MAXQ]; +//int b[MAXQ]; +//int c[MAXQ]; +//int d[MAXQ]; +//int k[MAXQ]; +// +//int tree[MAXN][MAXN]; +// +//int lset[MAXQ]; +//int rset[MAXQ]; +// +//int ans[MAXQ]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int x, int y, int v) { +// for (int i = x; i <= n; i += lowbit(i)) { +// for (int j = y; j <= n; j += lowbit(j)) { +// tree[i][j] += v; +// } +// } +//} +// +//int query(int x, int y) { +// int ret = 0; +// for (int i = x; i > 0; i -= lowbit(i)) { +// for (int j = y; j > 0; j -= lowbit(j)) { +// ret += tree[i][j]; +// } +// } +// return ret; +//} +// +//int query(int a, int b, int c, int d) { +// return query(c, d) - query(a - 1, d) - query(c, b - 1) + query(a - 1, b - 1); +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = vl; +// } +// } else { +// int mid = (vl + vr) >> 1; +// int lsiz = 0, rsiz = 0; +// while (used + 1 <= cntv && xyv[used + 1].v <= mid) { +// used++; +// add(xyv[used].x, xyv[used].y, 1); +// } +// while (used >= 1 && xyv[used].v > mid) { +// add(xyv[used].x, xyv[used].y, -1); +// used--; +// } +// for (int i = ql; i <= qr; i++) { +// int id = qid[i]; +// int check = query(a[id], b[id], c[id], d[id]); +// if (check >= k[id]) { +// lset[++lsiz] = id; +// } else { +// rset[++rsiz] = id; +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// qid[ql + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// qid[ql + lsiz + i - 1] = rset[i]; +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1; i <= n; i++) { +// for (int j = 1; j <= n; j++) { +// xyv[++cntv].x = i; +// xyv[cntv].y = j; +// cin >> xyv[cntv].v; +// } +// } +// for (int i = 1; i <= q; i++) { +// qid[i] = i; +// cin >> a[i] >> b[i] >> c[i] >> d[i] >> k[i]; +// } +// sort(xyv + 1, xyv + cntv + 1, NumberCmp); +// compute(1, q, 0, INF); +// for (int i = 1; i <= q; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class168/Code01_Meteors1.java b/src/class168/Code02_Meteors1.java similarity index 77% rename from src/class168/Code01_Meteors1.java rename to src/class168/Code02_Meteors1.java index 4d2ffae0a..8dbfaa7c8 100644 --- a/src/class168/Code01_Meteors1.java +++ b/src/class168/Code02_Meteors1.java @@ -5,7 +5,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 // 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 -// 想通过用C++实现,本节课Code01_Meteors2文件就是C++的实现 +// 想通过用C++实现,本节课Code02_Meteors2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -13,17 +13,18 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code01_Meteors1 { +public class Code02_Meteors1 { public static int MAXN = 300001; public static int n, m, k; - public static int[] arr = new int[MAXN]; + public static int[] qid = new int[MAXN]; public static int[] need = new int[MAXN]; public static int[] rainl = new int[MAXN]; public static int[] rainr = new int[MAXN]; public static int[] num = new int[MAXN]; + public static int used = 0; public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN]; @@ -69,45 +70,48 @@ public static long query(int i) { return ret; } - public static void compute(int al, int ar, int tl, int tr) { - if (tl == tr) { - for (int i = al; i <= ar; i++) { - ans[arr[i]] = tl; + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[qid[i]] = vl; } } else { - int mid = (tl + tr) >> 1; - int lsiz = 0, rsiz = 0, nation; - long satisfy; - for (int i = tl; i <= mid; i++) { - add(rainl[i], rainr[i], num[i]); + int mid = (vl + vr) >> 1; + int lsiz = 0, rsiz = 0; + while (used < mid) { + used++; + add(rainl[used], rainr[used], num[used]); + } + while (used > mid) { + add(rainl[used], rainr[used], -num[used]); + used--; } - for (int i = al; i <= ar; i++) { - nation = arr[i]; - satisfy = 0; - for (int e = head[nation]; e > 0; e = next[e]) { + for (int i = ql; i <= qr; i++) { + int id = qid[i]; + long satisfy = 0; + for (int e = head[id]; e > 0; e = next[e]) { satisfy += query(to[e]) + query(to[e] + m); - if (satisfy >= need[nation]) { + if (satisfy >= need[id]) { break; } } - if (satisfy >= need[nation]) { - lset[++lsiz] = nation; + if (satisfy >= need[id]) { + lset[++lsiz] = id; } else { - need[nation] -= satisfy; - rset[++rsiz] = nation; + rset[++rsiz] = id; } } - for (int i = tl; i <= mid; i++) { - add(rainl[i], rainr[i], -num[i]); - } for (int i = 1; i <= lsiz; i++) { - arr[al + i - 1] = lset[i]; + qid[ql + i - 1] = lset[i]; } for (int i = 1; i <= rsiz; i++) { - arr[al + lsiz + i - 1] = rset[i]; + qid[ql + lsiz + i - 1] = rset[i]; } - compute(al, al + lsiz - 1, tl, mid); - compute(al + lsiz, ar, mid + 1, tr); + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); } } @@ -121,7 +125,7 @@ public static void main(String[] args) throws Exception { addEdge(nation, i); } for (int i = 1; i <= n; i++) { - arr[i] = i; + qid[i] = i; need[i] = in.nextInt(); } k = in.nextInt(); diff --git a/src/class168/Code01_Meteors2.java b/src/class168/Code02_Meteors2.java similarity index 67% rename from src/class168/Code01_Meteors2.java rename to src/class168/Code02_Meteors2.java index f04f66767..b677b3dcd 100644 --- a/src/class168/Code01_Meteors2.java +++ b/src/class168/Code02_Meteors2.java @@ -13,12 +13,13 @@ // //int n, m, k; // -//int arr[MAXN]; +//int qid[MAXN]; //int need[MAXN]; // //int rainl[MAXN]; //int rainr[MAXN]; //int num[MAXN]; +//int used = 0; // //int head[MAXN]; //int nxt[MAXN]; @@ -64,45 +65,48 @@ // return ret; //} // -//void compute(int al, int ar, int tl, int tr) { -// if (tl == tr) { -// for (int i = al; i <= ar; i++) { -// ans[arr[i]] = tl; +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = vl; // } // } else { -// int mid = (tl + tr) >> 1; -// int lsiz = 0, rsiz = 0, nation; -// long long satisfy; -// for (int i = tl; i <= mid; i++) { -// add(rainl[i], rainr[i], num[i]); +// int mid = (vl + vr) >> 1; +// int lsiz = 0, rsiz = 0; +// while (used < mid) { +// used++; +// add(rainl[used], rainr[used], num[used]); +// } +// while (used > mid) { +// add(rainl[used], rainr[used], -num[used]); +// used--; // } -// for (int i = al; i <= ar; i++) { -// nation = arr[i]; -// satisfy = 0; -// for (int e = head[nation]; e > 0; e = nxt[e]) { +// for (int i = ql; i <= qr; i++) { +// int id = qid[i]; +// long long satisfy = 0; +// for (int e = head[id]; e > 0; e = nxt[e]) { // satisfy += query(to[e]) + query(to[e] + m); -// if (satisfy >= need[nation]) { +// if (satisfy >= need[id]) { // break; // } // } -// if (satisfy >= need[nation]) { -// lset[++lsiz] = nation; +// if (satisfy >= need[id]) { +// lset[++lsiz] = id; // } else { -// need[nation] -= static_cast(satisfy); -// rset[++rsiz] = nation; +// rset[++rsiz] = id; // } // } -// for (int i = tl; i <= mid; i++) { -// add(rainl[i], rainr[i], -num[i]); -// } // for (int i = 1; i <= lsiz; i++) { -// arr[al + i - 1] = lset[i]; +// qid[ql + i - 1] = lset[i]; // } // for (int i = 1; i <= rsiz; i++) { -// arr[al + lsiz + i - 1] = rset[i]; +// qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(al, al + lsiz - 1, tl, mid); -// compute(al + lsiz, ar, mid + 1, tr); +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); // } //} // @@ -115,7 +119,7 @@ // addEdge(nation, i); // } // for (int i = 1; i <= n; i++) { -// arr[i] = i; +// qid[i] = i; // cin >> need[i]; // } // cin >> k; diff --git a/src/class168/Code02_Juice1.java b/src/class168/Code03_Juice1.java similarity index 90% rename from src/class168/Code02_Juice1.java rename to src/class168/Code03_Juice1.java index 936b7b910..9566f275a 100644 --- a/src/class168/Code02_Juice1.java +++ b/src/class168/Code03_Juice1.java @@ -10,14 +10,14 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_Juice1 { +public class Code03_Juice1 { public static int MAXN = 100001; public static int n, m; // 果汁有三个参数,美味度d、每升价格p、添加上限l public static int[][] juice = new int[MAXN][3]; // 记录所有小朋友的编号 - public static int[] arr = new int[MAXN]; + public static int[] qid = new int[MAXN]; // 小朋友能花的钱数 public static long[] money = new long[MAXN]; // 小朋友至少的果汁量 @@ -72,13 +72,16 @@ public static long query(long volume, int l, int r, int i) { } } - public static void compute(int al, int ar, int jl, int jr) { - if (jl == jr) { - for (int i = al; i <= ar; i++) { - ans[arr[i]] = jl; + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[qid[i]] = vl; } } else { - int mid = (jl + jr) >> 1; + int mid = (vl + vr) >> 1; // 线段树包含果汁的种类少就添加 while (used < mid) { used++; @@ -90,8 +93,8 @@ public static void compute(int al, int ar, int jl, int jr) { used--; } int lsiz = 0, rsiz = 0; - for (int i = al, id; i <= ar; i++) { - id = arr[i]; + for (int i = ql, id; i <= qr; i++) { + id = qid[i]; if (suml[1] >= least[id] && query(least[id], 1, maxp, 1) <= money[id]) { lset[++lsiz] = id; } else { @@ -99,13 +102,13 @@ public static void compute(int al, int ar, int jl, int jr) { } } for (int i = 1; i <= lsiz; i++) { - arr[al + i - 1] = lset[i]; + qid[ql + i - 1] = lset[i]; } for (int i = 1; i <= rsiz; i++) { - arr[al + lsiz + i - 1] = rset[i]; + qid[ql + lsiz + i - 1] = rset[i]; } - compute(al, al + lsiz - 1, jl, mid); - compute(al + lsiz, ar, mid + 1, jr); + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); } } @@ -121,7 +124,7 @@ public static void main(String[] args) throws Exception { maxp = Math.max(maxp, juice[i][1]); } for (int i = 1; i <= m; i++) { - arr[i] = i; + qid[i] = i; money[i] = in.nextLong(); least[i] = in.nextLong(); } diff --git a/src/class168/Code02_Juice2.java b/src/class168/Code03_Juice2.java similarity index 84% rename from src/class168/Code02_Juice2.java rename to src/class168/Code03_Juice2.java index fb01de2a6..2319998e9 100644 --- a/src/class168/Code02_Juice2.java +++ b/src/class168/Code03_Juice2.java @@ -21,7 +21,7 @@ //int n, m; // //Juice juice[MAXN]; -//int arr[MAXN]; +//int qid[MAXN]; //long long money[MAXN]; //long long least[MAXN]; // @@ -67,13 +67,16 @@ // } //} // -//void compute(int al, int ar, int jl, int jr) { -// if (jl == jr) { -// for (int i = al; i <= ar; i++) { -// ans[arr[i]] = jl; +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = vl; // } // } else { -// int mid = (jl + jr) >> 1; +// int mid = (vl + vr) >> 1; // while (used < mid) { // used++; // add(juice[used].p, juice[used].l, 1, maxp, 1); @@ -83,8 +86,8 @@ // used--; // } // int lsiz = 0, rsiz = 0; -// for (int i = al, id; i <= ar; i++) { -// id = arr[i]; +// for (int i = ql, id; i <= qr; i++) { +// id = qid[i]; // if (suml[1] >= least[id] && query(least[id], 1, maxp, 1) <= money[id]) { // lset[++lsiz] = id; // } else { @@ -92,13 +95,13 @@ // } // } // for (int i = 1; i <= lsiz; i++) { -// arr[al + i - 1] = lset[i]; +// qid[ql + i - 1] = lset[i]; // } // for (int i = 1; i <= rsiz; i++) { -// arr[al + lsiz + i - 1] = rset[i]; +// qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(al, al + lsiz - 1, jl, mid); -// compute(al + lsiz, ar, mid + 1, jr); +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); // } //} // @@ -111,7 +114,7 @@ // maxp = max(maxp, juice[i].p); // } // for (int i = 1; i <= m; i++) { -// arr[i] = i; +// qid[i] = i; // cin >> money[i] >> least[i]; // } // sort(juice + 1, juice + n + 1, JuiceCmp); diff --git a/src/class168/Code03_Multiplication1.java b/src/class168/Code03_Multiplication1.java deleted file mode 100644 index 9b844c148..000000000 --- a/src/class168/Code03_Multiplication1.java +++ /dev/null @@ -1,9 +0,0 @@ -package class168; - -// 矩阵乘法,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P1527 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -public class Code03_Multiplication1 { - -} diff --git a/src/class168/Code06_Network1.java b/src/class168/Code06_Network1.java index 5226931cf..688518678 100644 --- a/src/class168/Code06_Network1.java +++ b/src/class168/Code06_Network1.java @@ -236,19 +236,22 @@ public static void prepare() { } } - public static void compute(int evtl, int evtr, int impl, int impr) { - if (impl == impr) { - for (int i = evtl; i <= evtr; i++) { + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { if (events[i][0] > 0) { - ans[events[i][0]] = impl; + ans[events[i][0]] = vl; } } } else { - int impm = (impl + impr) / 2; + int mid = (vl + vr) / 2; int lsize = 0, rsize = 0, request = 0; - for (int i = evtl; i <= evtr; i++) { + for (int i = ql; i <= qr; i++) { if (events[i][0] == 0) { - if (events[i][3] > impm) { + if (events[i][3] > mid) { pathAdd(events[i][1], events[i][2], 1); clone(rset[++rsize], events[i]); request++; @@ -256,7 +259,7 @@ public static void compute(int evtl, int evtr, int impl, int impr) { clone(lset[++lsize], events[i]); } } else if (events[i][0] == -1) { - if (events[i][3] > impm) { + if (events[i][3] > mid) { pathAdd(events[i][1], events[i][2], -1); clone(rset[++rsize], events[i]); request--; @@ -272,21 +275,21 @@ public static void compute(int evtl, int evtr, int impl, int impr) { } } for (int i = 1; i <= rsize; i++) { - if (rset[i][0] == 0 && rset[i][3] > impm) { + if (rset[i][0] == 0 && rset[i][3] > mid) { pathAdd(rset[i][1], rset[i][2], -1); } - if (rset[i][0] == -1 && rset[i][3] > impm) { + if (rset[i][0] == -1 && rset[i][3] > mid) { pathAdd(rset[i][1], rset[i][2], 1); } } - for (int i = evtl, j = 1; j <= lsize; i++, j++) { + for (int i = ql, j = 1; j <= lsize; i++, j++) { clone(events[i], lset[j]); } - for (int i = evtl + lsize, j = 1; j <= rsize; i++, j++) { + for (int i = ql + lsize, j = 1; j <= rsize; i++, j++) { clone(events[i], rset[j]); } - compute(evtl, evtl + lsize - 1, impl, impm); - compute(evtl + lsize, evtr, impm + 1, impr); + compute(ql, ql + lsize - 1, vl, mid); + compute(ql + lsize, qr, mid + 1, vr); } } diff --git a/src/class168/Code06_Network2.java b/src/class168/Code06_Network2.java index dcae9f688..e3180b3c6 100644 --- a/src/class168/Code06_Network2.java +++ b/src/class168/Code06_Network2.java @@ -175,19 +175,22 @@ // } //} // -//void compute(int evtl, int evtr, int impl, int impr) { -// if (impl == impr) { -// for (int i = evtl; i <= evtr; i++) { +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { // if (events[i][0] > 0) { -// ans[events[i][0]] = impl; +// ans[events[i][0]] = vl; // } // } // } else { -// int impm = (impl + impr) / 2; +// int mid = (vl + vr) / 2; // int lsize = 0, rsize = 0, request = 0; -// for (int i = evtl; i <= evtr; i++) { +// for (int i = ql; i <= qr; i++) { // if (events[i][0] == 0) { -// if (events[i][3] > impm) { +// if (events[i][3] > mid) { // pathAdd(events[i][1], events[i][2], 1); // clone(rset[++rsize], events[i]); // request++; @@ -195,7 +198,7 @@ // clone(lset[++lsize], events[i]); // } // } else if (events[i][0] == -1) { -// if (events[i][3] > impm) { +// if (events[i][3] > mid) { // pathAdd(events[i][1], events[i][2], -1); // clone(rset[++rsize], events[i]); // request--; @@ -211,21 +214,21 @@ // } // } // for (int i = 1; i <= rsize; i++) { -// if (rset[i][0] == 0 && rset[i][3] > impm) { +// if (rset[i][0] == 0 && rset[i][3] > mid) { // pathAdd(rset[i][1], rset[i][2], -1); // } -// if (rset[i][0] == -1 && rset[i][3] > impm) { +// if (rset[i][0] == -1 && rset[i][3] > mid) { // pathAdd(rset[i][1], rset[i][2], 1); // } // } -// for (int i = evtl, j = 1; j <= lsize; i++, j++) { +// for (int i = ql, j = 1; j <= lsize; i++, j++) { // clone(events[i], lset[j]); // } -// for (int i = evtl + lsize, j = 1; j <= rsize; i++, j++) { +// for (int i = ql + lsize, j = 1; j <= rsize; i++, j++) { // clone(events[i], rset[j]); // } -// compute(evtl, evtl + lsize - 1, impl, impm); -// compute(evtl + lsize, evtr, impm + 1, impr); +// compute(ql, ql + lsize - 1, vl, mid); +// compute(ql + lsize, qr, mid + 1, vr); // } //} // From 39c57b31fd3a469aa3d58f14e2f6db5cbe510db1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 11 May 2025 12:26:56 +0800 Subject: [PATCH 0103/1170] modify code --- src/class168/Code04_Fruit1.java | 11 +++++++++++ .../{Code06_Network1.java => Code05_Network1.java} | 2 +- .../{Code06_Network2.java => Code05_Network2.java} | 0 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/class168/Code04_Fruit1.java rename src/class168/{Code06_Network1.java => Code05_Network1.java} (99%) rename src/class168/{Code06_Network2.java => Code05_Network2.java} (100%) diff --git a/src/class168/Code04_Fruit1.java b/src/class168/Code04_Fruit1.java new file mode 100644 index 000000000..1da4ad0eb --- /dev/null +++ b/src/class168/Code04_Fruit1.java @@ -0,0 +1,11 @@ +package class168; + +// 接水果,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3242 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code04_Fruit1 { + + + +} diff --git a/src/class168/Code06_Network1.java b/src/class168/Code05_Network1.java similarity index 99% rename from src/class168/Code06_Network1.java rename to src/class168/Code05_Network1.java index 688518678..f38fbf7e5 100644 --- a/src/class168/Code06_Network1.java +++ b/src/class168/Code05_Network1.java @@ -18,7 +18,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code06_Network1 { +public class Code05_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; diff --git a/src/class168/Code06_Network2.java b/src/class168/Code05_Network2.java similarity index 100% rename from src/class168/Code06_Network2.java rename to src/class168/Code05_Network2.java From 423dacef869140cc35e0dcc9f59f04784ad8252d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 11 May 2025 19:26:46 +0800 Subject: [PATCH 0104/1170] modify code --- src/class168/Code04_Fruit1.java | 11 - src/class168/Code04_PlateAndFruit1.java | 338 ++++++++++++++++++++++++ src/class168/Code04_PlateAndFruit2.java | 244 +++++++++++++++++ src/class168/Code05_Network1.java | 67 ++--- src/class168/Code05_Network2.java | 47 +--- 5 files changed, 610 insertions(+), 97 deletions(-) delete mode 100644 src/class168/Code04_Fruit1.java create mode 100644 src/class168/Code04_PlateAndFruit1.java create mode 100644 src/class168/Code04_PlateAndFruit2.java diff --git a/src/class168/Code04_Fruit1.java b/src/class168/Code04_Fruit1.java deleted file mode 100644 index 1da4ad0eb..000000000 --- a/src/class168/Code04_Fruit1.java +++ /dev/null @@ -1,11 +0,0 @@ -package class168; - -// 接水果,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P3242 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -public class Code04_Fruit1 { - - - -} diff --git a/src/class168/Code04_PlateAndFruit1.java b/src/class168/Code04_PlateAndFruit1.java new file mode 100644 index 000000000..3c2ae73c4 --- /dev/null +++ b/src/class168/Code04_PlateAndFruit1.java @@ -0,0 +1,338 @@ +package class168; + +// 接水果,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3242 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code04_PlateAndFruit1 { + + public static int MAXN = 40001; + public static int MAXH = 16; + public static int INF = 1000000001; + public static int n, p, q; + + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg = 0; + + public static int[] dep = new int[MAXN]; + public static int[] ldfn = new int[MAXN]; + public static int[] rdfn = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXH]; + public static int cntd = 0; + + public static int[] tree = new int[MAXN]; + + // event[i][0]代表事件的类型,1为盘子类型,2为水果类型 + // event[i][1]表示x轴的位置 + // 如果是盘子类型,那么event[i][2..5]分别代表 : yl、yr、权值v、产生的影响d + // 如果是水果类型,那么event[i][2..5]分别代表 : y、空缺、要求v、问题的编号d + public static int[][] event = new int[MAXN << 3][6]; + public static int cnte = 0; + + public static int[][] lset = new int[MAXN << 3][6]; + public static int[][] rset = new int[MAXN << 3][6]; + + public static int[] ans = new int[MAXN]; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs1(int u, int fa) { + dep[u] = dep[fa] + 1; + ldfn[u] = ++cntd; + stjump[u][0] = fa; + for (int p = 1; p < MAXH; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = head[u]; e > 0; e = next[e]) { + if (to[e] != fa) { + dfs1(to[e], u); + } + } + rdfn[u] = cntd; + } + + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + public static int[][] ufe = new int[MAXN][3]; + + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + // dfs1的迭代版 + public static void dfs2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dep[u] = dep[f] + 1; + ldfn[u] = ++cntd; + stjump[u][0] = f; + for (int p = 1; p < MAXH; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + e = head[u]; + } else { + e = next[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } else { + rdfn[u] = cntd; + } + } + } + + public static int lca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static int lcaSon(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (dep[stjump[a][p]] > dep[b]) { + a = stjump[a][p]; + } + } + return a; + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= n) { + tree[i] += v; + i += lowbit(i); + } + } + + public static void add(int l, int r, int v) { + add(l, v); + add(r + 1, -v); + } + + public static int query(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static void addPlate(int x, int yl, int yr, int v, int d) { + event[++cnte][0] = 1; + event[cnte][1] = x; + event[cnte][2] = yl; + event[cnte][3] = yr; + event[cnte][4] = v; + event[cnte][5] = d; + } + + public static void addFruit(int x, int y, int v, int d) { + event[++cnte][0] = 2; + event[cnte][1] = x; + event[cnte][2] = y; + event[cnte][4] = v; + event[cnte][5] = d; + } + + public static void clone(int[] a, int[] b) { + a[0] = b[0]; + a[1] = b[1]; + a[2] = b[2]; + a[3] = b[3]; + a[4] = b[4]; + a[5] = b[5]; + } + + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + if (event[i][0] == 2) { + ans[event[i][5]] = vl; + } + } + } else { + int mid = (vl + vr) >> 1; + int lsiz = 0, rsiz = 0; + for (int i = ql; i <= qr; i++) { + if (event[i][0] == 1) { + if (event[i][4] <= mid) { + add(event[i][2], event[i][3], event[i][5]); + clone(lset[++lsiz], event[i]); + } else { + clone(rset[++rsiz], event[i]); + } + } else { + int check = query(event[i][2]); + if (check >= event[i][4]) { + clone(lset[++lsiz], event[i]); + } else { + event[i][4] -= check; + clone(rset[++rsiz], event[i]); + } + } + } + for (int i = ql; i <= qr; i++) { + if (event[i][0] == 1 && event[i][4] <= mid) { + add(event[i][2], event[i][3], -event[i][5]); + } + } + for (int i = 1; i <= lsiz; i++) { + clone(event[ql + i - 1], lset[i]); + } + for (int i = 1; i <= rsiz; i++) { + clone(event[ql + lsiz + i - 1], rset[i]); + } + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + p = in.nextInt(); + q = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + dfs2(); + for (int i = 1; i <= p; i++) { + int a = in.nextInt(); + int b = in.nextInt(); + int c = in.nextInt(); + if (ldfn[a] > ldfn[b]) { + int tmp = a; + a = b; + b = tmp; + } + int ablca = lca(a, b); + if (ablca == a) { + int son = lcaSon(a, b); + addPlate(1, ldfn[b], rdfn[b], c, 1); + addPlate(ldfn[son], ldfn[b], rdfn[b], c, -1); + addPlate(ldfn[b], rdfn[son] + 1, n, c, 1); + addPlate(rdfn[b] + 1, rdfn[son] + 1, n, c, -1); + } else { + addPlate(ldfn[a], ldfn[b], rdfn[b], c, 1); + addPlate(rdfn[a] + 1, ldfn[b], rdfn[b], c, -1); + } + } + for (int i = 1; i <= q; i++) { + int u = in.nextInt(); + int v = in.nextInt(); + int k = in.nextInt(); + addFruit(Math.min(ldfn[u], ldfn[v]), Math.max(ldfn[u], ldfn[v]), k, i); + } + Arrays.sort(event, 1, cnte + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[0] - b[0]); + compute(1, cnte, 0, INF); + for (int i = 1; i <= q; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + + } + +} diff --git a/src/class168/Code04_PlateAndFruit2.java b/src/class168/Code04_PlateAndFruit2.java new file mode 100644 index 000000000..5e1bd50e1 --- /dev/null +++ b/src/class168/Code04_PlateAndFruit2.java @@ -0,0 +1,244 @@ +package class168; + +// 接水果,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3242 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Event { +// int op, x, yl, yr, v, d; +//}; +// +//bool EventCmp(Event e1, Event e2) { +// if (e1.x != e2.x) { +// return e1.x < e2.x; +// } +// return e1.op < e2.op; +//} +// +//const int MAXN = 40001; +//const int MAXH = 16; +//const int INF = 1000000001; +//int n, p, q; +// +//int head[MAXN]; +//int nxtt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +// +//int dep[MAXN]; +//int ldfn[MAXN]; +//int rdfn[MAXN]; +//int stjump[MAXN][MAXH]; +//int cntd = 0; +// +//int tree[MAXN]; +// +//Event event[MAXN << 3]; +//int cnte = 0; +// +//Event lset[MAXN << 3]; +//Event rset[MAXN << 3]; +// +//int ans[MAXN]; +// +//void addEdge(int u, int v) { +// nxtt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// ldfn[u] = ++cntd; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXH; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = head[u]; e > 0; e = nxtt[e]) { +// if (to[e] != fa) { +// dfs(to[e], u); +// } +// } +// rdfn[u] = cntd; +//} +// +//int lca(int a, int b) { +// if (dep[a] < dep[b]) { +// int tmp = a; +// a = b; +// b = tmp; +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//int lcaSon(int a, int b) { +// if (dep[a] < dep[b]) { +// int tmp = a; +// a = b; +// b = tmp; +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] > dep[b]) { +// a = stjump[a][p]; +// } +// } +// return a; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= n) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//void add(int l, int r, int v) { +// add(l, v); +// add(r + 1, -v); +//} +// +//int query(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void addPlate(int x, int yl, int yr, int v, int d) { +// event[++cnte].op = 1; +// event[cnte].x = x; +// event[cnte].yl = yl; +// event[cnte].yr = yr; +// event[cnte].v = v; +// event[cnte].d = d; +//} +// +//void addFruit(int x, int y, int v, int d) { +// event[++cnte].op = 2; +// event[cnte].x = x; +// event[cnte].yl = y; +// event[cnte].v = v; +// event[cnte].d = d; +//} +// +//void clone(Event& e1, Event& e2) { +// e1.op = e2.op; +// e1.x = e2.x; +// e1.yl = e2.yl; +// e1.yr = e2.yr; +// e1.v = e2.v; +// e1.d = e2.d; +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// if (event[i].op == 2) { +// ans[event[i].d] = vl; +// } +// } +// } else { +// int mid = (vl + vr) >> 1; +// int lsiz = 0, rsiz = 0; +// for (int i = ql; i <= qr; i++) { +// if (event[i].op == 1) { +// if (event[i].v <= mid) { +// add(event[i].yl, event[i].yr, event[i].d); +// clone(lset[++lsiz], event[i]); +// } else { +// clone(rset[++rsiz], event[i]); +// } +// } else { +// int check = query(event[i].yl); +// if (check >= event[i].v) { +// clone(lset[++lsiz], event[i]); +// } else { +// event[i].v -= check; +// clone(rset[++rsiz], event[i]); +// } +// } +// } +// for (int i = ql; i <= qr; i++) { +// if (event[i].op == 1 && event[i].v <= mid) { +// add(event[i].yl, event[i].yr, -event[i].d); +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// clone(event[ql + i - 1], lset[i]); +// } +// for (int i = 1; i <= rsiz; i++) { +// clone(event[ql + lsiz + i - 1], rset[i]); +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> p >> q; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs(1, 0); +// for (int i = 1, a, b, c; i <= p; i++) { +// cin >> a >> b >> c; +// if (ldfn[a] > ldfn[b]) { +// int tmp = a; +// a = b; +// b = tmp; +// } +// int ablca = lca(a, b); +// if (ablca == a) { +// int son = lcaSon(a, b); +// addPlate(1, ldfn[b], rdfn[b], c, 1); +// addPlate(ldfn[son], ldfn[b], rdfn[b], c, -1); +// addPlate(ldfn[b], rdfn[son] + 1, n, c, 1); +// addPlate(rdfn[b] + 1, rdfn[son] + 1, n, c, -1); +// } else { +// addPlate(ldfn[a], ldfn[b], rdfn[b], c, 1); +// addPlate(rdfn[a] + 1, ldfn[b], rdfn[b], c, -1); +// } +// } +// for (int i = 1, u, v, k; i <= q; i++) { +// cin >> u >> v >> k; +// addFruit(min(ldfn[u], ldfn[v]), max(ldfn[u], ldfn[v]), k, i); +// } +// sort(event + 1, event + cnte + 1, EventCmp); +// compute(1, cnte, 0, INF); +// for (int i = 1; i <= q; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class168/Code05_Network1.java b/src/class168/Code05_Network1.java index f38fbf7e5..596bae652 100644 --- a/src/class168/Code05_Network1.java +++ b/src/class168/Code05_Network1.java @@ -16,13 +16,13 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.util.Arrays; public class Code05_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; public static int MAXH = 20; + public static int INF = 1000000001; public static int n, m; // 链式前向星 @@ -44,8 +44,6 @@ public class Code05_Network1 { // 从早到晚发生的事件 public static int[][] events = new int[MAXM][4]; - public static int[] sorted = new int[MAXM]; - public static int s = 0; // 整体二分 public static int[][] lset = new int[MAXM][4]; @@ -186,21 +184,6 @@ public static int pointQuery(int x) { return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); } - public static int kth(int num) { - int left = 1, right = s, mid; - while (left <= right) { - mid = (left + right) / 2; - if (sorted[mid] == num) { - return mid; - } else if (sorted[mid] < num) { - left = mid + 1; - } else { - right = mid - 1; - } - } - return -1; - } - public static void clone(int[] event1, int[] event2) { event1[0] = event2[0]; event1[1] = event2[1]; @@ -208,34 +191,6 @@ public static void clone(int[] event1, int[] event2) { event1[3] = event2[3]; } - public static void prepare() { - dfs2(); // 为了防止爆栈调用迭代版 - sorted[0] = -1; - for (int i = 1; i <= m; i++) { - if (events[i][0] == 0) { - sorted[++s] = events[i][3]; - } - } - Arrays.sort(sorted, 1, s + 1); - int len = 1; - for (int i = 2; i <= s; i++) { - if (sorted[len] != sorted[i]) { - sorted[++len] = sorted[i]; - } - } - s = len; - for (int i = 1; i <= m; i++) { - if (events[i][0] == 0) { - events[i][3] = kth(events[i][3]); - } else if (events[i][0] == 1) { - clone(events[i], events[events[i][1]]); - events[i][0] = -1; - } else { - events[i][0] = ++cntans; - } - } - } - public static void compute(int ql, int qr, int vl, int vr) { if (ql > qr) { return; @@ -293,6 +248,18 @@ public static void compute(int ql, int qr, int vl, int vr) { } } + public static void prepare() { + dfs2(); + for (int i = 1; i <= m; i++) { + if (events[i][0] == 1) { + clone(events[i], events[events[i][1]]); + events[i][0] = -1; + } else if (events[i][0] == 2) { + events[i][0] = ++cntans; + } + } + } + public static void main(String[] args) throws IOException { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); @@ -313,9 +280,13 @@ public static void main(String[] args) throws IOException { } } prepare(); - compute(1, m, 0, s); + compute(1, m, 0, INF); for (int i = 1; i <= cntans; i++) { - out.println(sorted[ans[i]]); + if (ans[i] == 0) { + out.println(-1); + } else { + out.println(ans[i]); + } } out.flush(); out.close(); diff --git a/src/class168/Code05_Network2.java b/src/class168/Code05_Network2.java index e3180b3c6..e602f47e9 100644 --- a/src/class168/Code05_Network2.java +++ b/src/class168/Code05_Network2.java @@ -20,7 +20,7 @@ //const int MAXN = 100001; //const int MAXM = 200001; //const int MAXH = 20; -// +//const int INF = 1000000001; //int n, m; // //int head[MAXN]; @@ -38,8 +38,6 @@ //int tree[MAXN]; // //int events[MAXM][4]; -//int sorted[MAXM]; -//int s = 0; // //int lset[MAXM][4]; //int rset[MAXM][4]; @@ -125,21 +123,6 @@ // return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); //} // -//int kth(int num) { -// int left = 1, right = s, mid; -// while (left <= right) { -// mid = (left + right) / 2; -// if (sorted[mid] == num) { -// return mid; -// } else if (sorted[mid] < num) { -// left = mid + 1; -// } else { -// right = mid - 1; -// } -// } -// return -1; -//} -// //void clone(int* e1, int* e2) { // e1[0] = e2[0]; // e1[1] = e2[1]; @@ -149,27 +132,11 @@ // //void prepare() { // dfs(1, 0); -// sorted[0] = -1; -// for (int i = 1; i <= m; i++) { -// if (events[i][0] == 0) { -// sorted[++s] = events[i][3]; -// } -// } -// sort(sorted + 1, sorted + s + 1); -// int len = 1; -// for (int i = 2; i <= s; i++) { -// if (sorted[len] != sorted[i]) { -// sorted[++len] = sorted[i]; -// } -// } -// s = len; // for (int i = 1; i <= m; i++) { -// if (events[i][0] == 0) { -// events[i][3] = kth(events[i][3]); -// } else if (events[i][0] == 1) { +// if (events[i][0] == 1) { // clone(events[i], events[events[i][1]]); // events[i][0] = -1; -// } else { +// } else if (events[i][0] == 2){ // events[i][0] = ++cntans; // } // } @@ -248,9 +215,13 @@ // } // } // prepare(); -// compute(1, m, 0, s); +// compute(1, m, 0, INF); // for (int i = 1; i <= cntans; i++) { -// cout << sorted[ans[i]] << '\n'; +// if (ans[i] == 0) { +// cout << -1 << '\n'; +// } else { +// cout << ans[i] << '\n'; +// } // } // return 0; //} \ No newline at end of file From 16c19af8d70daca94b3c17a5ec90d6153129aa3c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 11 May 2025 19:31:32 +0800 Subject: [PATCH 0105/1170] modify code --- src/class168/Code05_Network1.java | 56 +++++++++++++++---------------- src/class168/Code05_Network2.java | 52 ++++++++++++++-------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/class168/Code05_Network1.java b/src/class168/Code05_Network1.java index 596bae652..3a7abe27d 100644 --- a/src/class168/Code05_Network1.java +++ b/src/class168/Code05_Network1.java @@ -43,7 +43,7 @@ public class Code05_Network1 { public static int[] tree = new int[MAXN]; // 从早到晚发生的事件 - public static int[][] events = new int[MAXM][4]; + public static int[][] event = new int[MAXM][4]; // 整体二分 public static int[][] lset = new int[MAXM][4]; @@ -197,35 +197,35 @@ public static void compute(int ql, int qr, int vl, int vr) { } if (vl == vr) { for (int i = ql; i <= qr; i++) { - if (events[i][0] > 0) { - ans[events[i][0]] = vl; + if (event[i][0] > 0) { + ans[event[i][0]] = vl; } } } else { int mid = (vl + vr) / 2; int lsize = 0, rsize = 0, request = 0; for (int i = ql; i <= qr; i++) { - if (events[i][0] == 0) { - if (events[i][3] > mid) { - pathAdd(events[i][1], events[i][2], 1); - clone(rset[++rsize], events[i]); + if (event[i][0] == 0) { + if (event[i][3] > mid) { + pathAdd(event[i][1], event[i][2], 1); + clone(rset[++rsize], event[i]); request++; } else { - clone(lset[++lsize], events[i]); + clone(lset[++lsize], event[i]); } - } else if (events[i][0] == -1) { - if (events[i][3] > mid) { - pathAdd(events[i][1], events[i][2], -1); - clone(rset[++rsize], events[i]); + } else if (event[i][0] == -1) { + if (event[i][3] > mid) { + pathAdd(event[i][1], event[i][2], -1); + clone(rset[++rsize], event[i]); request--; } else { - clone(lset[++lsize], events[i]); + clone(lset[++lsize], event[i]); } } else { - if (pointQuery(events[i][1]) != request) { - clone(rset[++rsize], events[i]); + if (pointQuery(event[i][1]) != request) { + clone(rset[++rsize], event[i]); } else { - clone(lset[++lsize], events[i]); + clone(lset[++lsize], event[i]); } } } @@ -238,10 +238,10 @@ public static void compute(int ql, int qr, int vl, int vr) { } } for (int i = ql, j = 1; j <= lsize; i++, j++) { - clone(events[i], lset[j]); + clone(event[i], lset[j]); } for (int i = ql + lsize, j = 1; j <= rsize; i++, j++) { - clone(events[i], rset[j]); + clone(event[i], rset[j]); } compute(ql, ql + lsize - 1, vl, mid); compute(ql + lsize, qr, mid + 1, vr); @@ -251,11 +251,11 @@ public static void compute(int ql, int qr, int vl, int vr) { public static void prepare() { dfs2(); for (int i = 1; i <= m; i++) { - if (events[i][0] == 1) { - clone(events[i], events[events[i][1]]); - events[i][0] = -1; - } else if (events[i][0] == 2) { - events[i][0] = ++cntans; + if (event[i][0] == 1) { + clone(event[i], event[event[i][1]]); + event[i][0] = -1; + } else if (event[i][0] == 2) { + event[i][0] = ++cntans; } } } @@ -272,11 +272,11 @@ public static void main(String[] args) throws IOException { addEdge(v, u); } for (int i = 1; i <= m; i++) { - events[i][0] = in.nextInt(); - events[i][1] = in.nextInt(); - if (events[i][0] == 0) { - events[i][2] = in.nextInt(); - events[i][3] = in.nextInt(); + event[i][0] = in.nextInt(); + event[i][1] = in.nextInt(); + if (event[i][0] == 0) { + event[i][2] = in.nextInt(); + event[i][3] = in.nextInt(); } } prepare(); diff --git a/src/class168/Code05_Network2.java b/src/class168/Code05_Network2.java index e602f47e9..5fa68cab3 100644 --- a/src/class168/Code05_Network2.java +++ b/src/class168/Code05_Network2.java @@ -37,7 +37,7 @@ // //int tree[MAXN]; // -//int events[MAXM][4]; +//int event[MAXM][4]; // //int lset[MAXM][4]; //int rset[MAXM][4]; @@ -133,11 +133,11 @@ //void prepare() { // dfs(1, 0); // for (int i = 1; i <= m; i++) { -// if (events[i][0] == 1) { -// clone(events[i], events[events[i][1]]); -// events[i][0] = -1; -// } else if (events[i][0] == 2){ -// events[i][0] = ++cntans; +// if (event[i][0] == 1) { +// clone(event[i], event[event[i][1]]); +// event[i][0] = -1; +// } else if (event[i][0] == 2){ +// event[i][0] = ++cntans; // } // } //} @@ -148,35 +148,35 @@ // } // if (vl == vr) { // for (int i = ql; i <= qr; i++) { -// if (events[i][0] > 0) { -// ans[events[i][0]] = vl; +// if (event[i][0] > 0) { +// ans[event[i][0]] = vl; // } // } // } else { // int mid = (vl + vr) / 2; // int lsize = 0, rsize = 0, request = 0; // for (int i = ql; i <= qr; i++) { -// if (events[i][0] == 0) { -// if (events[i][3] > mid) { -// pathAdd(events[i][1], events[i][2], 1); -// clone(rset[++rsize], events[i]); +// if (event[i][0] == 0) { +// if (event[i][3] > mid) { +// pathAdd(event[i][1], event[i][2], 1); +// clone(rset[++rsize], event[i]); // request++; // } else { -// clone(lset[++lsize], events[i]); +// clone(lset[++lsize], event[i]); // } -// } else if (events[i][0] == -1) { -// if (events[i][3] > mid) { -// pathAdd(events[i][1], events[i][2], -1); -// clone(rset[++rsize], events[i]); +// } else if (event[i][0] == -1) { +// if (event[i][3] > mid) { +// pathAdd(event[i][1], event[i][2], -1); +// clone(rset[++rsize], event[i]); // request--; // } else { -// clone(lset[++lsize], events[i]); +// clone(lset[++lsize], event[i]); // } // } else { -// if (pointQuery(events[i][1]) != request) { -// clone(rset[++rsize], events[i]); +// if (pointQuery(event[i][1]) != request) { +// clone(rset[++rsize], event[i]); // } else { -// clone(lset[++lsize], events[i]); +// clone(lset[++lsize], event[i]); // } // } // } @@ -189,10 +189,10 @@ // } // } // for (int i = ql, j = 1; j <= lsize; i++, j++) { -// clone(events[i], lset[j]); +// clone(event[i], lset[j]); // } // for (int i = ql + lsize, j = 1; j <= rsize; i++, j++) { -// clone(events[i], rset[j]); +// clone(event[i], rset[j]); // } // compute(ql, ql + lsize - 1, vl, mid); // compute(ql + lsize, qr, mid + 1, vr); @@ -209,9 +209,9 @@ // addEdge(v, u); // } // for (int i = 1; i <= m; i++) { -// cin >> events[i][0] >> events[i][1]; -// if (events[i][0] == 0) { -// cin >> events[i][2] >> events[i][3]; +// cin >> event[i][0] >> event[i][1]; +// if (event[i][0] == 0) { +// cin >> event[i][2] >> event[i][3]; // } // } // prepare(); From c8bd577e6d9fa9b215382692c3f57efc048292ce Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 11 May 2025 19:33:17 +0800 Subject: [PATCH 0106/1170] modify code --- src/class168/Code04_PlateAndFruit2.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class168/Code04_PlateAndFruit2.java b/src/class168/Code04_PlateAndFruit2.java index 5e1bd50e1..25a6a800c 100644 --- a/src/class168/Code04_PlateAndFruit2.java +++ b/src/class168/Code04_PlateAndFruit2.java @@ -26,7 +26,7 @@ //int n, p, q; // //int head[MAXN]; -//int nxtt[MAXN << 1]; +//int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; // @@ -47,7 +47,7 @@ //int ans[MAXN]; // //void addEdge(int u, int v) { -// nxtt[++cntg] = head[u]; +// nxt[++cntg] = head[u]; // to[cntg] = v; // head[u] = cntg; //} @@ -59,7 +59,7 @@ // for (int p = 1; p < MAXH; p++) { // stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; // } -// for (int e = head[u]; e > 0; e = nxtt[e]) { +// for (int e = head[u]; e > 0; e = nxt[e]) { // if (to[e] != fa) { // dfs(to[e], u); // } From 31059298231c862ca9f9a006ad61ea24bff8794f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 11 May 2025 20:17:52 +0800 Subject: [PATCH 0107/1170] modify code --- src/class168/Code04_PlateAndFruit1.java | 11 ++++++----- src/class168/Code04_PlateAndFruit2.java | 5 ----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/class168/Code04_PlateAndFruit1.java b/src/class168/Code04_PlateAndFruit1.java index 3c2ae73c4..06a86194c 100644 --- a/src/class168/Code04_PlateAndFruit1.java +++ b/src/class168/Code04_PlateAndFruit1.java @@ -230,11 +230,12 @@ public static void compute(int ql, int qr, int vl, int vr) { } } } - for (int i = ql; i <= qr; i++) { - if (event[i][0] == 1 && event[i][4] <= mid) { - add(event[i][2], event[i][3], -event[i][5]); - } - } + // 这里为什么不用做撤销? + // 因为任何一个盘子,一定有两条扫描线 + // 一条扫描线会增加yl..yr的计数 + // 另外一条扫描线会减少计数 + // 并且同一个盘子的两条扫描线不可能分开 + // 所以此时树状数组就是清空的,并不需要做撤销了 for (int i = 1; i <= lsiz; i++) { clone(event[ql + i - 1], lset[i]); } diff --git a/src/class168/Code04_PlateAndFruit2.java b/src/class168/Code04_PlateAndFruit2.java index 25a6a800c..de4f0ae7a 100644 --- a/src/class168/Code04_PlateAndFruit2.java +++ b/src/class168/Code04_PlateAndFruit2.java @@ -186,11 +186,6 @@ // } // } // } -// for (int i = ql; i <= qr; i++) { -// if (event[i].op == 1 && event[i].v <= mid) { -// add(event[i].yl, event[i].yr, -event[i].d); -// } -// } // for (int i = 1; i <= lsiz; i++) { // clone(event[ql + i - 1], lset[i]); // } From 8983e05185d1d1a24ca8d52fd7f729257a6ae612 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 11 May 2025 20:20:07 +0800 Subject: [PATCH 0108/1170] modify code --- src/class168/Code04_PlateAndFruit1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class168/Code04_PlateAndFruit1.java b/src/class168/Code04_PlateAndFruit1.java index 06a86194c..1cce01e88 100644 --- a/src/class168/Code04_PlateAndFruit1.java +++ b/src/class168/Code04_PlateAndFruit1.java @@ -234,8 +234,8 @@ public static void compute(int ql, int qr, int vl, int vr) { // 因为任何一个盘子,一定有两条扫描线 // 一条扫描线会增加yl..yr的计数 // 另外一条扫描线会减少计数 - // 并且同一个盘子的两条扫描线不可能分开 - // 所以此时树状数组就是清空的,并不需要做撤销了 + // 同一个盘子的两条扫描线,一定会在一起,是不可能分开的 + // 所以此时树状数组就是清空的,不需要再做撤销操作 for (int i = 1; i <= lsiz; i++) { clone(event[ql + i - 1], lset[i]); } From abfc6bc672414d0e105db31b3a05293b8ca62952 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 11 May 2025 20:24:09 +0800 Subject: [PATCH 0109/1170] modify code --- src/class168/Code04_PlateAndFruit1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class168/Code04_PlateAndFruit1.java b/src/class168/Code04_PlateAndFruit1.java index 1cce01e88..7e9e7e1c1 100644 --- a/src/class168/Code04_PlateAndFruit1.java +++ b/src/class168/Code04_PlateAndFruit1.java @@ -233,7 +233,7 @@ public static void compute(int ql, int qr, int vl, int vr) { // 这里为什么不用做撤销? // 因为任何一个盘子,一定有两条扫描线 // 一条扫描线会增加yl..yr的计数 - // 另外一条扫描线会减少计数 + // 一条扫描线会减少yl..yr的计数 // 同一个盘子的两条扫描线,一定会在一起,是不可能分开的 // 所以此时树状数组就是清空的,不需要再做撤销操作 for (int i = 1; i <= lsiz; i++) { From 8e2753d94f01fa2060da328ff9e562d3e7298b3a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 11 May 2025 20:51:08 +0800 Subject: [PATCH 0110/1170] modify code --- src/class168/Code04_PlateAndFruit2.java | 21 ++---- src/class168/Code05_Network1.java | 8 ++- src/class168/Code05_Network2.java | 90 ++++++++++++------------- 3 files changed, 56 insertions(+), 63 deletions(-) diff --git a/src/class168/Code04_PlateAndFruit2.java b/src/class168/Code04_PlateAndFruit2.java index de4f0ae7a..60a2cb904 100644 --- a/src/class168/Code04_PlateAndFruit2.java +++ b/src/class168/Code04_PlateAndFruit2.java @@ -146,15 +146,6 @@ // event[cnte].d = d; //} // -//void clone(Event& e1, Event& e2) { -// e1.op = e2.op; -// e1.x = e2.x; -// e1.yl = e2.yl; -// e1.yr = e2.yr; -// e1.v = e2.v; -// e1.d = e2.d; -//} -// //void compute(int ql, int qr, int vl, int vr) { // if (ql > qr) { // return; @@ -172,25 +163,25 @@ // if (event[i].op == 1) { // if (event[i].v <= mid) { // add(event[i].yl, event[i].yr, event[i].d); -// clone(lset[++lsiz], event[i]); +// lset[++lsiz] = event[i]; // } else { -// clone(rset[++rsiz], event[i]); +// rset[++rsiz] = event[i]; // } // } else { // int check = query(event[i].yl); // if (check >= event[i].v) { -// clone(lset[++lsiz], event[i]); +// lset[++lsiz] = event[i]; // } else { // event[i].v -= check; -// clone(rset[++rsiz], event[i]); +// rset[++rsiz] = event[i]; // } // } // } // for (int i = 1; i <= lsiz; i++) { -// clone(event[ql + i - 1], lset[i]); +// event[ql + i - 1] = lset[i]; // } // for (int i = 1; i <= rsiz; i++) { -// clone(event[ql + lsiz + i - 1], rset[i]); +// event[ql + lsiz + i - 1] = rset[i]; // } // compute(ql, ql + lsiz - 1, vl, mid); // compute(ql + lsiz, qr, mid + 1, vr); diff --git a/src/class168/Code05_Network1.java b/src/class168/Code05_Network1.java index 3a7abe27d..cf17dbce2 100644 --- a/src/class168/Code05_Network1.java +++ b/src/class168/Code05_Network1.java @@ -4,7 +4,7 @@ // 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 // 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 // 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i -// 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 +// 操作 0 x y v : x号服务器到y号服务器的路径上,增加了一个重要度为v的请求 // 操作 1 t : 当初时间为t的操作,一定是增加请求的操作,现在这个请求结束了 // 操作 2 x : 当前时间下,和x号服务器无关的所有请求中,打印最大的重要度 // 关于操作2,如果当前时间下,没有任何请求、或者所有请求都和x号服务器有关,打印-1 @@ -42,12 +42,16 @@ public class Code05_Network1 { // 树状数组 public static int[] tree = new int[MAXN]; - // 从早到晚发生的事件 + // 从早到晚发生的事件,op、x、y、v + // op == 0,添加点x到点y,重要度为v的路径 + // op == -1,删除点x到点y,重要度为v的路径 + // op > 0,那么op表示问题的编号,查询和x相关的答案 public static int[][] event = new int[MAXM][4]; // 整体二分 public static int[][] lset = new int[MAXM][4]; public static int[][] rset = new int[MAXM][4]; + public static int[] ans = new int[MAXM]; public static int cntans = 0; diff --git a/src/class168/Code05_Network2.java b/src/class168/Code05_Network2.java index 5fa68cab3..625c3bcf8 100644 --- a/src/class168/Code05_Network2.java +++ b/src/class168/Code05_Network2.java @@ -4,7 +4,7 @@ // 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 // 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 // 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i -// 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 +// 操作 0 x y v : x号服务器到y号服务器的路径上,增加了一个重要度为v的请求 // 操作 1 t : 当初时间为t的操作,一定是增加请求的操作,现在这个请求结束了 // 操作 2 x : 当前时间下,和x号服务器无关的所有请求中,打印最大的重要度 // 关于操作2,如果当前时间下,没有任何请求、或者所有请求都和x号服务器有关,打印-1 @@ -17,6 +17,10 @@ // //using namespace std; // +//struct Event { +// int op, x, y, v; +//}; +// //const int MAXN = 100001; //const int MAXM = 200001; //const int MAXH = 20; @@ -37,10 +41,11 @@ // //int tree[MAXN]; // -//int event[MAXM][4]; +//Event event[MAXM]; +// +//Event lset[MAXM]; +//Event rset[MAXM]; // -//int lset[MAXM][4]; -//int rset[MAXM][4]; //int ans[MAXM]; //int cntans = 0; // @@ -123,21 +128,14 @@ // return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); //} // -//void clone(int* e1, int* e2) { -// e1[0] = e2[0]; -// e1[1] = e2[1]; -// e1[2] = e2[2]; -// e1[3] = e2[3]; -//} -// //void prepare() { // dfs(1, 0); // for (int i = 1; i <= m; i++) { -// if (event[i][0] == 1) { -// clone(event[i], event[event[i][1]]); -// event[i][0] = -1; -// } else if (event[i][0] == 2){ -// event[i][0] = ++cntans; +// if (event[i].op == 1) { +// event[i] = event[event[i].x]; +// event[i].op = -1; +// } else if (event[i].op == 2){ +// event[i].op = ++cntans; // } // } //} @@ -148,54 +146,54 @@ // } // if (vl == vr) { // for (int i = ql; i <= qr; i++) { -// if (event[i][0] > 0) { -// ans[event[i][0]] = vl; +// if (event[i].op > 0) { +// ans[event[i].op] = vl; // } // } // } else { // int mid = (vl + vr) / 2; -// int lsize = 0, rsize = 0, request = 0; +// int lsiz = 0, rsiz = 0, request = 0; // for (int i = ql; i <= qr; i++) { -// if (event[i][0] == 0) { -// if (event[i][3] > mid) { -// pathAdd(event[i][1], event[i][2], 1); -// clone(rset[++rsize], event[i]); +// if (event[i].op == 0) { +// if (event[i].v > mid) { +// pathAdd(event[i].x, event[i].y, 1); +// rset[++rsiz] = event[i]; // request++; // } else { -// clone(lset[++lsize], event[i]); +// lset[++lsiz] = event[i]; // } -// } else if (event[i][0] == -1) { -// if (event[i][3] > mid) { -// pathAdd(event[i][1], event[i][2], -1); -// clone(rset[++rsize], event[i]); +// } else if (event[i].op == -1) { +// if (event[i].v > mid) { +// pathAdd(event[i].x, event[i].y, -1); +// rset[++rsiz] = event[i]; // request--; // } else { -// clone(lset[++lsize], event[i]); +// lset[++lsiz] = event[i]; // } // } else { -// if (pointQuery(event[i][1]) != request) { -// clone(rset[++rsize], event[i]); +// if (pointQuery(event[i].x) != request) { +// rset[++rsiz] = event[i]; // } else { -// clone(lset[++lsize], event[i]); +// lset[++lsiz] = event[i]; // } // } // } -// for (int i = 1; i <= rsize; i++) { -// if (rset[i][0] == 0 && rset[i][3] > mid) { -// pathAdd(rset[i][1], rset[i][2], -1); +// for (int i = 1; i <= rsiz; i++) { +// if (rset[i].op == 0 && rset[i].v > mid) { +// pathAdd(rset[i].x, rset[i].y, -1); // } -// if (rset[i][0] == -1 && rset[i][3] > mid) { -// pathAdd(rset[i][1], rset[i][2], 1); +// if (rset[i].op == -1 && rset[i].v > mid) { +// pathAdd(rset[i].x, rset[i].y, 1); // } // } -// for (int i = ql, j = 1; j <= lsize; i++, j++) { -// clone(event[i], lset[j]); +// for (int i = 1; i <= lsiz; i++) { +// event[ql + i - 1] = lset[i]; // } -// for (int i = ql + lsize, j = 1; j <= rsize; i++, j++) { -// clone(event[i], rset[j]); +// for (int i = 1; i <= rsiz; i++) { +// event[ql + lsiz + i - 1] = rset[i]; // } -// compute(ql, ql + lsize - 1, vl, mid); -// compute(ql + lsize, qr, mid + 1, vr); +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); // } //} // @@ -209,9 +207,9 @@ // addEdge(v, u); // } // for (int i = 1; i <= m; i++) { -// cin >> event[i][0] >> event[i][1]; -// if (event[i][0] == 0) { -// cin >> event[i][2] >> event[i][3]; +// cin >> event[i].op >> event[i].x; +// if (event[i].op == 0) { +// cin >> event[i].y >> event[i].v; // } // } // prepare(); From 91da612c63c80abf94754612131013ce867d9026 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 12 May 2025 18:54:24 +0800 Subject: [PATCH 0111/1170] modify code --- src/class168/Code04_IvanAndBurgers1.java | 173 ++++++++++++++++++ src/class168/Code04_IvanAndBurgers2.java | 128 +++++++++++++ ...Fruit1.java => Code06_PlateAndFruit1.java} | 2 +- ...Fruit2.java => Code06_PlateAndFruit2.java} | 0 ...e05_Network1.java => Code07_Network1.java} | 2 +- ...e05_Network2.java => Code07_Network2.java} | 0 6 files changed, 303 insertions(+), 2 deletions(-) create mode 100644 src/class168/Code04_IvanAndBurgers1.java create mode 100644 src/class168/Code04_IvanAndBurgers2.java rename src/class168/{Code04_PlateAndFruit1.java => Code06_PlateAndFruit1.java} (99%) rename src/class168/{Code04_PlateAndFruit2.java => Code06_PlateAndFruit2.java} (100%) rename src/class168/{Code05_Network1.java => Code07_Network1.java} (99%) rename src/class168/{Code05_Network2.java => Code07_Network2.java} (100%) diff --git a/src/class168/Code04_IvanAndBurgers1.java b/src/class168/Code04_IvanAndBurgers1.java new file mode 100644 index 000000000..11229890b --- /dev/null +++ b/src/class168/Code04_IvanAndBurgers1.java @@ -0,0 +1,173 @@ +package class168; + +// 范围内最大异或和,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1100F +// 测试链接 : https://codeforces.com/problemset/problem/1100/F +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code04_IvanAndBurgers1 { + + public static int MAXN = 500001; + public static int BIT = 21; + public static int n, m; + + public static int[] arr = new int[MAXN]; + public static int[] qid = new int[MAXN]; + public static int[] l = new int[MAXN]; + public static int[] r = new int[MAXN]; + + public static int[][] baset = new int[MAXN][BIT + 1]; + public static int[] tmp = new int[BIT + 1]; + + public static int[] lset = new int[MAXN]; + public static int[] rset = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + public static void insert(int[] basis, int num) { + for (int i = BIT; i >= 0; i--) { + if (num >> i == 1) { + if (basis[i] == 0) { + basis[i] = num; + return; + } + num ^= basis[i]; + } + } + } + + public static void clear(int[] basis) { + for (int i = 0; i <= BIT; i++) { + basis[i] = 0; + } + } + + public static int maxEor(int[] basis) { + int ret = 0; + for (int i = BIT; i >= 0; i--) { + ret = Math.max(ret, ret ^ basis[i]); + } + return ret; + } + + public static void clone(int[] b1, int[] b2) { + for (int i = 0; i <= BIT; i++) { + b1[i] = b2[i]; + } + } + + public static void merge(int[] b1, int[] b2) { + clone(tmp, b1); + for (int i = 0; i <= BIT; i++) { + insert(tmp, b2[i]); + } + } + + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[qid[i]] = arr[vl]; + } + } else { + int mid = (vl + vr) >> 1; + clear(baset[mid]); + insert(baset[mid], arr[mid]); + for (int i = mid - 1; i >= vl; i--) { + clone(baset[i], baset[i + 1]); + insert(baset[i], arr[i]); + } + for (int i = mid + 1; i <= vr; i++) { + clone(baset[i], baset[i - 1]); + insert(baset[i], arr[i]); + } + int lsiz = 0, rsiz = 0, id; + for (int i = ql; i <= qr; i++) { + id = qid[i]; + if (r[id] < mid) { + lset[++lsiz] = id; + } else if (l[id] > mid) { + rset[++rsiz] = id; + } else { + merge(baset[l[id]], baset[r[id]]); + ans[id] = maxEor(tmp); + } + } + for (int i = 1; i <= lsiz; i++) { + qid[ql + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + qid[ql + lsiz + i - 1] = rset[i]; + } + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, ql + lsiz + rsiz - 1, mid + 1, vr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + m = in.nextInt(); + for (int i = 1; i <= m; i++) { + qid[i] = i; + l[i] = in.nextInt(); + r[i] = in.nextInt(); + } + compute(1, m, 1, n); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class168/Code04_IvanAndBurgers2.java b/src/class168/Code04_IvanAndBurgers2.java new file mode 100644 index 000000000..b2ca5dff2 --- /dev/null +++ b/src/class168/Code04_IvanAndBurgers2.java @@ -0,0 +1,128 @@ +package class168; + +// 范围内最大异或和,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1100F +// 测试链接 : https://codeforces.com/problemset/problem/1100/F +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 500001; +//const int BIT = 21; +//int n, m; +// +//int arr[MAXN]; +//int qid[MAXN]; +//int l[MAXN]; +//int r[MAXN]; +// +//int baset[MAXN][BIT + 1]; +//int tmp[BIT + 1]; +// +//int lset[MAXN]; +//int rset[MAXN]; +//int ans[MAXN]; +// +//void insert(int* basis, int num) { +// for (int i = BIT; i >= 0; i--) { +// if ((num >> i) & 1) { +// if (basis[i] == 0) { +// basis[i] = num; +// return; +// } +// num ^= basis[i]; +// } +// } +//} +// +//void clear(int* basis) { +// for (int i = 0; i <= BIT; i++) { +// basis[i] = 0; +// } +//} +// +//int maxEor(int* basis) { +// int ret = 0; +// for (int i = BIT; i >= 0; i--) { +// ret = max(ret, ret ^ basis[i]); +// } +// return ret; +//} +// +//void clone(int* b1, int* b2) { +// for (int i = 0; i <= BIT; i++) { +// b1[i] = b2[i]; +// } +//} +// +//void merge(int* b1, int* b2) { +// clone(tmp, b1); +// for (int i = 0; i <= BIT; i++) { +// insert(tmp, b2[i]); +// } +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = arr[vl]; +// } +// } else { +// int mid = (vl + vr) >> 1; +// clear(baset[mid]); +// insert(baset[mid], arr[mid]); +// for (int i = mid - 1; i >= vl; i--) { +// clone(baset[i], baset[i + 1]); +// insert(baset[i], arr[i]); +// } +// for (int i = mid + 1; i <= vr; i++) { +// clone(baset[i], baset[i - 1]); +// insert(baset[i], arr[i]); +// } +// int lsiz = 0, rsiz = 0; +// for (int i = ql, id; i <= qr; i++) { +// id = qid[i]; +// if (r[id] < mid) { +// lset[++lsiz] = id; +// } else if (l[id] > mid) { +// rset[++rsiz] = id; +// } else { +// merge(baset[l[id]], baset[r[id]]); +// ans[id] = maxEor(tmp); +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// qid[ql + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// qid[ql + lsiz + i - 1] = rset[i]; +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, ql + lsiz + rsiz - 1, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// cin >> m; +// for (int i = 1; i <= m; i++) { +// qid[i] = i; +// cin >> l[i] >> r[i]; +// } +// compute(1, m, 1, n); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class168/Code04_PlateAndFruit1.java b/src/class168/Code06_PlateAndFruit1.java similarity index 99% rename from src/class168/Code04_PlateAndFruit1.java rename to src/class168/Code06_PlateAndFruit1.java index 7e9e7e1c1..dffd4dd09 100644 --- a/src/class168/Code04_PlateAndFruit1.java +++ b/src/class168/Code06_PlateAndFruit1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code04_PlateAndFruit1 { +public class Code06_PlateAndFruit1 { public static int MAXN = 40001; public static int MAXH = 16; diff --git a/src/class168/Code04_PlateAndFruit2.java b/src/class168/Code06_PlateAndFruit2.java similarity index 100% rename from src/class168/Code04_PlateAndFruit2.java rename to src/class168/Code06_PlateAndFruit2.java diff --git a/src/class168/Code05_Network1.java b/src/class168/Code07_Network1.java similarity index 99% rename from src/class168/Code05_Network1.java rename to src/class168/Code07_Network1.java index cf17dbce2..afa669476 100644 --- a/src/class168/Code05_Network1.java +++ b/src/class168/Code07_Network1.java @@ -17,7 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_Network1 { +public class Code07_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; diff --git a/src/class168/Code05_Network2.java b/src/class168/Code07_Network2.java similarity index 100% rename from src/class168/Code05_Network2.java rename to src/class168/Code07_Network2.java From e5b1a898621904f0060f231fa06911c1b1cd81a7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 12 May 2025 18:59:10 +0800 Subject: [PATCH 0112/1170] modify code --- src/class168/Code05_PastoralOddities1.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/class168/Code05_PastoralOddities1.java diff --git a/src/class168/Code05_PastoralOddities1.java b/src/class168/Code05_PastoralOddities1.java new file mode 100644 index 000000000..2d62931d3 --- /dev/null +++ b/src/class168/Code05_PastoralOddities1.java @@ -0,0 +1,9 @@ +package class168; + +// 度为奇数的最大边权,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF603E +// 测试链接 : https://codeforces.com/problemset/problem/603/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +public class Code05_PastoralOddities1 { + +} From f9a03884db62fe14baa167d606a20152965b858e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 12 May 2025 20:32:24 +0800 Subject: [PATCH 0113/1170] modify code --- ...ode04_IvanAndBurgers1.java => Code02_IvanAndBurgers1.java} | 2 +- ...ode04_IvanAndBurgers2.java => Code02_IvanAndBurgers2.java} | 0 src/class168/{Code02_Meteors1.java => Code03_Meteors1.java} | 4 ++-- src/class168/{Code02_Meteors2.java => Code03_Meteors2.java} | 0 src/class168/{Code03_Juice1.java => Code04_Juice1.java} | 2 +- src/class168/{Code03_Juice2.java => Code04_Juice2.java} | 0 6 files changed, 4 insertions(+), 4 deletions(-) rename src/class168/{Code04_IvanAndBurgers1.java => Code02_IvanAndBurgers1.java} (99%) rename src/class168/{Code04_IvanAndBurgers2.java => Code02_IvanAndBurgers2.java} (100%) rename src/class168/{Code02_Meteors1.java => Code03_Meteors1.java} (97%) rename src/class168/{Code02_Meteors2.java => Code03_Meteors2.java} (100%) rename src/class168/{Code03_Juice1.java => Code04_Juice1.java} (99%) rename src/class168/{Code03_Juice2.java => Code04_Juice2.java} (100%) diff --git a/src/class168/Code04_IvanAndBurgers1.java b/src/class168/Code02_IvanAndBurgers1.java similarity index 99% rename from src/class168/Code04_IvanAndBurgers1.java rename to src/class168/Code02_IvanAndBurgers1.java index 11229890b..4a65d40a2 100644 --- a/src/class168/Code04_IvanAndBurgers1.java +++ b/src/class168/Code02_IvanAndBurgers1.java @@ -10,7 +10,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_IvanAndBurgers1 { +public class Code02_IvanAndBurgers1 { public static int MAXN = 500001; public static int BIT = 21; diff --git a/src/class168/Code04_IvanAndBurgers2.java b/src/class168/Code02_IvanAndBurgers2.java similarity index 100% rename from src/class168/Code04_IvanAndBurgers2.java rename to src/class168/Code02_IvanAndBurgers2.java diff --git a/src/class168/Code02_Meteors1.java b/src/class168/Code03_Meteors1.java similarity index 97% rename from src/class168/Code02_Meteors1.java rename to src/class168/Code03_Meteors1.java index 8dbfaa7c8..5c95ed8fb 100644 --- a/src/class168/Code02_Meteors1.java +++ b/src/class168/Code03_Meteors1.java @@ -5,7 +5,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 // 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 -// 想通过用C++实现,本节课Code02_Meteors2文件就是C++的实现 +// 想通过用C++实现,本节课Code03_Meteors2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -13,7 +13,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_Meteors1 { +public class Code03_Meteors1 { public static int MAXN = 300001; public static int n, m, k; diff --git a/src/class168/Code02_Meteors2.java b/src/class168/Code03_Meteors2.java similarity index 100% rename from src/class168/Code02_Meteors2.java rename to src/class168/Code03_Meteors2.java diff --git a/src/class168/Code03_Juice1.java b/src/class168/Code04_Juice1.java similarity index 99% rename from src/class168/Code03_Juice1.java rename to src/class168/Code04_Juice1.java index 9566f275a..6e4002ea3 100644 --- a/src/class168/Code03_Juice1.java +++ b/src/class168/Code04_Juice1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code03_Juice1 { +public class Code04_Juice1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class168/Code03_Juice2.java b/src/class168/Code04_Juice2.java similarity index 100% rename from src/class168/Code03_Juice2.java rename to src/class168/Code04_Juice2.java From 10dcbbf9fb58448e256ebd53e50c4debf913ac1f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 12 May 2025 22:34:37 +0800 Subject: [PATCH 0114/1170] modify code --- src/class168/Code05_PastoralOddities1.java | 191 +++++++++++++++++++++ src/class168/Code05_PastoralOddities2.java | 154 +++++++++++++++++ 2 files changed, 345 insertions(+) create mode 100644 src/class168/Code05_PastoralOddities2.java diff --git a/src/class168/Code05_PastoralOddities1.java b/src/class168/Code05_PastoralOddities1.java index 2d62931d3..55d870a47 100644 --- a/src/class168/Code05_PastoralOddities1.java +++ b/src/class168/Code05_PastoralOddities1.java @@ -4,6 +4,197 @@ // 测试链接 : https://www.luogu.com.cn/problem/CF603E // 测试链接 : https://codeforces.com/problemset/problem/603/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + public class Code05_PastoralOddities1 { + public static int MAXN = 100001; + public static int MAXM = 300002; + public static int n, m; + + // 边的编号i、端点x、端点y、权值w + public static int[][] edge = new int[MAXM][4]; + public static int[][] sorted = new int[MAXM][4]; + + // 节点数为奇数的联通区数量 + public static int oddnum; + // 可撤销并查集 + public static int[] father = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[][] rollback = new int[MAXN][2]; + public static int opsize = 0; + + public static int[] ans = new int[MAXM]; + + public static int find(int i) { + while (i != father[i]) { + i = father[i]; + } + return i; + } + + public static boolean union(int x, int y) { + int fx = find(x); + int fy = find(y); + if (fx == fy) { + return false; + } + if ((siz[fx] & 1) == 1 && (siz[fy] & 1) == 1) { + oddnum -= 2; + } + if (siz[fx] < siz[fy]) { + int tmp = fx; + fx = fy; + fy = tmp; + } + father[fy] = fx; + siz[fx] += siz[fy]; + rollback[++opsize][0] = fx; + rollback[opsize][1] = fy; + return true; + } + + public static void undo() { + int fx = rollback[opsize][0]; + int fy = rollback[opsize--][1]; + father[fy] = fy; + siz[fx] -= siz[fy]; + if ((siz[fx] & 1) == 1 && (siz[fy] & 1) == 1) { + oddnum += 2; + } + } + + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[i] = sorted[vl][3]; + } + } else { + int mid = (vl + vr) >> 1; + int unionCnt1 = 0; + for (int i = vl; i <= mid; i++) { + if (sorted[i][0] < ql) { + if (union(sorted[i][1], sorted[i][2])) { + unionCnt1++; + } + } + } + int unionCnt2 = 0; + int split = qr + 1; + for (int i = ql; i <= qr; i++) { + if (edge[i][3] <= sorted[mid][3]) { + if (union(edge[i][1], edge[i][2])) { + unionCnt2++; + } + } + if (oddnum == 0) { + split = i; + break; + } + } + for (int i = 1; i <= unionCnt2; i++) { + undo(); + } + compute(ql, split - 1, mid + 1, vr); + for (int i = 1; i <= unionCnt1; i++) { + undo(); + } + int unionCnt3 = 0; + for (int i = ql; i <= split - 1; i++) { + if (edge[i][3] <= sorted[vl][3]) { + if (union(edge[i][1], edge[i][2])) { + unionCnt3++; + } + } + } + compute(split, qr, vl, mid); + for (int i = 1; i <= unionCnt3; i++) { + undo(); + } + } + } + + public static void prepare() { + oddnum = n; + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + } + for (int i = 1; i <= m; i++) { + sorted[i][0] = edge[i][0]; + sorted[i][1] = edge[i][1]; + sorted[i][2] = edge[i][2]; + sorted[i][3] = edge[i][3]; + } + Arrays.sort(sorted, 1, m + 1, (a, b) -> a[3] - b[3]); + sorted[m + 1][3] = -1; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= m; i++) { + edge[i][0] = i; + edge[i][1] = in.nextInt(); + edge[i][2] = in.nextInt(); + edge[i][3] = in.nextInt(); + } + prepare(); + compute(1, m, 1, m + 1); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class168/Code05_PastoralOddities2.java b/src/class168/Code05_PastoralOddities2.java new file mode 100644 index 000000000..b1d935721 --- /dev/null +++ b/src/class168/Code05_PastoralOddities2.java @@ -0,0 +1,154 @@ +package class168; + +// 度为奇数的最大边权,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF603E +// 测试链接 : https://codeforces.com/problemset/problem/603/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int i, x, y, w; +//}; +// +//bool EdgeCmp(Edge a, Edge b) { +// return a.w < b.w; +//} +// +//const int MAXN = 100001; +//const int MAXM = 300002; +//int n, m; +// +//Edge edge[MAXM]; +//Edge sorted[MAXM]; +// +//int oddnum; +//int father[MAXN]; +//int siz[MAXN]; +//int rollback[MAXN][2]; +//int opsize = 0; +// +//int ans[MAXM]; +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//bool Union(int x, int y) { +// int fx = find(x); +// int fy = find(y); +// if (fx == fy) { +// return false; +// } +// if ((siz[fx] & 1) == 1 && (siz[fy] & 1) == 1) { +// oddnum -= 2; +// } +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; +// return true; +//} +// +//void undo() { +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +// if ((siz[fx] & 1) == 1 && (siz[fy] & 1) == 1) { +// oddnum += 2; +// } +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[i] = sorted[vl].w; +// } +// } else { +// int mid = (vl + vr) >> 1; +// int unionCnt1 = 0; +// for (int i = vl; i <= mid; i++) { +// if (sorted[i].i < ql) { +// if (Union(sorted[i].x, sorted[i].y)) { +// unionCnt1++; +// } +// } +// } +// int unionCnt2 = 0; +// int split = qr + 1; +// for (int i = ql; i <= qr; i++) { +// if (edge[i].w <= sorted[mid].w) { +// if (Union(edge[i].x, edge[i].y)) { +// unionCnt2++; +// } +// } +// if (oddnum == 0) { +// split = i; +// break; +// } +// } +// for (int i = 1; i <= unionCnt2; i++) { +// undo(); +// } +// compute(ql, split - 1, mid + 1, vr); +// for (int i = 1; i <= unionCnt1; i++) { +// undo(); +// } +// int unionCnt3 = 0; +// for (int i = ql; i <= split - 1; i++) { +// if (edge[i].w <= sorted[vl].w) { +// if (Union(edge[i].x, edge[i].y)) { +// unionCnt3++; +// } +// } +// } +// compute(split, qr, vl, mid); +// for (int i = 1; i <= unionCnt3; i++) { +// undo(); +// } +// } +//} +// +//void prepare() { +// oddnum = n; +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// for (int i = 1; i <= m; i++) { +// sorted[i] = edge[i]; +// } +// sort(sorted + 1, sorted + m + 1, EdgeCmp); +// sorted[m + 1].w = -1; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= m; i++) { +// edge[i].i = i; +// cin >> edge[i].x >> edge[i].y >> edge[i].w; +// } +// prepare(); +// compute(1, m, 1, m + 1); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 59f05c28cf2212ccbe8b73ee2cbcfb1a0a163a49 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 14 May 2025 11:41:44 +0800 Subject: [PATCH 0115/1170] modify code --- src/class168/Code01_KthSmall1.java | 5 ++++ src/class168/Code01_KthSmall2.java | 5 ++++ src/class168/Code02_IvanAndBurgers1.java | 14 ++++++---- src/class168/Code02_IvanAndBurgers2.java | 14 ++++++---- src/class168/Code03_Meteors1.java | 7 +++++ src/class168/Code03_Meteors2.java | 7 +++++ src/class168/Code04_Juice1.java | 6 ++++ src/class168/Code04_Juice2.java | 6 ++++ src/class168/Code05_PastoralOddities1.java | 32 +++++++++++++--------- src/class168/Code05_PastoralOddities2.java | 26 +++++++++++------- 10 files changed, 89 insertions(+), 33 deletions(-) diff --git a/src/class168/Code01_KthSmall1.java b/src/class168/Code01_KthSmall1.java index 58b3a7540..dd41b0399 100644 --- a/src/class168/Code01_KthSmall1.java +++ b/src/class168/Code01_KthSmall1.java @@ -1,6 +1,11 @@ package class168; // 子矩阵第k小,java版 +// 给定一个n * n的矩阵,接下来有q条查询,格式如下 +// 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 +// 1 <= n <= 500 +// 1 <= q <= 6 * 10^4 +// 0 <= 矩阵中的数字 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1527 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class168/Code01_KthSmall2.java b/src/class168/Code01_KthSmall2.java index 2e1dd4109..49d6073bd 100644 --- a/src/class168/Code01_KthSmall2.java +++ b/src/class168/Code01_KthSmall2.java @@ -1,6 +1,11 @@ package class168; // 子矩阵第k小,C++版 +// 给定一个n * n的矩阵,接下来有q条查询,格式如下 +// 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 +// 1 <= n <= 500 +// 1 <= q <= 6 * 10^4 +// 0 <= 矩阵中的数字 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1527 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class168/Code02_IvanAndBurgers1.java b/src/class168/Code02_IvanAndBurgers1.java index 4a65d40a2..f42ae111b 100644 --- a/src/class168/Code02_IvanAndBurgers1.java +++ b/src/class168/Code02_IvanAndBurgers1.java @@ -1,6 +1,10 @@ package class168; // 范围内最大异或和,java版 +// 给定一个长度为n的数组arr,下标1~n,接下来有q条查询,格式如下 +// 查询 l r : arr[l..r]中选若干个数,打印最大的异或和 +// 1 <= n、q <= 5 * 10^5 +// 0 <= arr[i] <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1100F // 测试链接 : https://codeforces.com/problemset/problem/1100/F // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,7 +18,7 @@ public class Code02_IvanAndBurgers1 { public static int MAXN = 500001; public static int BIT = 21; - public static int n, m; + public static int n, q; public static int[] arr = new int[MAXN]; public static int[] qid = new int[MAXN]; @@ -117,14 +121,14 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } - m = in.nextInt(); - for (int i = 1; i <= m; i++) { + q = in.nextInt(); + for (int i = 1; i <= q; i++) { qid[i] = i; l[i] = in.nextInt(); r[i] = in.nextInt(); } - compute(1, m, 1, n); - for (int i = 1; i <= m; i++) { + compute(1, q, 1, n); + for (int i = 1; i <= q; i++) { out.println(ans[i]); } out.flush(); diff --git a/src/class168/Code02_IvanAndBurgers2.java b/src/class168/Code02_IvanAndBurgers2.java index b2ca5dff2..104c1e4e6 100644 --- a/src/class168/Code02_IvanAndBurgers2.java +++ b/src/class168/Code02_IvanAndBurgers2.java @@ -1,6 +1,10 @@ package class168; // 范围内最大异或和,C++版 +// 给定一个长度为n的数组arr,下标1~n,接下来有q条查询,格式如下 +// 查询 l r : arr[l..r]中选若干个数,打印最大的异或和 +// 1 <= n、q <= 5 * 10^5 +// 0 <= arr[i] <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1100F // 测试链接 : https://codeforces.com/problemset/problem/1100/F // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -12,7 +16,7 @@ // //const int MAXN = 500001; //const int BIT = 21; -//int n, m; +//int n, q; // //int arr[MAXN]; //int qid[MAXN]; @@ -115,13 +119,13 @@ // for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } -// cin >> m; -// for (int i = 1; i <= m; i++) { +// cin >> q; +// for (int i = 1; i <= q; i++) { // qid[i] = i; // cin >> l[i] >> r[i]; // } -// compute(1, m, 1, n); -// for (int i = 1; i <= m; i++) { +// compute(1, q, 1, n); +// for (int i = 1; i <= q; i++) { // cout << ans[i] << '\n'; // } // return 0; diff --git a/src/class168/Code03_Meteors1.java b/src/class168/Code03_Meteors1.java index 5c95ed8fb..3b2e09019 100644 --- a/src/class168/Code03_Meteors1.java +++ b/src/class168/Code03_Meteors1.java @@ -1,6 +1,13 @@ package class168; // 陨石雨,java版 +// 一共有n个国家,给定n个数字,表示每个国家希望收集到的陨石数量 +// 一共有m个区域,1号区顺时针到2号区...m号区顺时针到1号区,即环形相连 +// 每个区域只属于某一个国家,给定m个数字,表示每个区域归属给哪个国家 +// 接下来会依次发生k场陨石雨,陨石雨格式 l r num,含义如下 +// 从l号区顺时针到r号区发生了陨石雨,每个区域都增加num个陨石 +// 打印每个国家经历前几场陨石雨,可以达到收集要求,如果无法满足,打印"NIE" +// 1 <= n、m、k <= 3 * 10^5 1 <= 陨石数量 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3527 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 diff --git a/src/class168/Code03_Meteors2.java b/src/class168/Code03_Meteors2.java index b677b3dcd..458d40b0f 100644 --- a/src/class168/Code03_Meteors2.java +++ b/src/class168/Code03_Meteors2.java @@ -1,6 +1,13 @@ package class168; // 陨石雨,C++版 +// 一共有n个国家,给定n个数字,表示每个国家希望收集到的陨石数量 +// 一共有m个区域,1号区顺时针到2号区...m号区顺时针到1号区,即环形相连 +// 每个区域只属于某一个国家,给定m个数字,表示每个区域归属给哪个国家 +// 接下来会依次发生k场陨石雨,陨石雨格式 l r num,含义如下 +// 从l号区顺时针到r号区发生了陨石雨,每个区域都增加num个陨石 +// 打印每个国家经历前几场陨石雨,可以达到收集要求,如果无法满足,打印"NIE" +// 1 <= n、m、k <= 3 * 10^5 1 <= 陨石数量 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3527 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class168/Code04_Juice1.java b/src/class168/Code04_Juice1.java index 6e4002ea3..9b4d59a42 100644 --- a/src/class168/Code04_Juice1.java +++ b/src/class168/Code04_Juice1.java @@ -1,6 +1,12 @@ package class168; // 混合果汁,java版 +// 一共有n种果汁,每种果汁给定,美味度d、每升价格p、添加上限l +// 制作混合果汁时每种果汁不能超过添加上限,其中美味度最低的果汁,决定混合果汁的美味度 +// 一共有m个小朋友,给每位制作混合果汁时,钱数不超过money[i],体积不少于least[i] +// 打印每个小朋友能得到的混合果汁最大美味度,如果无法满足,打印-1 +// 1 <= n、m、d、p、l <= 10^5 +// 1 <= money[i]、least[i] <= 10^18 // 测试链接 : https://www.luogu.com.cn/problem/P4602 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class168/Code04_Juice2.java b/src/class168/Code04_Juice2.java index 2319998e9..cd8b90296 100644 --- a/src/class168/Code04_Juice2.java +++ b/src/class168/Code04_Juice2.java @@ -1,6 +1,12 @@ package class168; // 混合果汁,C++版 +// 一共有n种果汁,每种果汁给定,美味度d、每升价格p、添加上限l +// 制作混合果汁时每种果汁不能超过添加上限,其中美味度最低的果汁,决定混合果汁的美味度 +// 一共有m个小朋友,给每位制作混合果汁时,钱数不超过money[i],体积不少于least[i] +// 打印每个小朋友能得到的混合果汁最大美味度,如果无法满足,打印-1 +// 1 <= n、m、d、p、l <= 10^5 +// 1 <= money[i]、least[i] <= 10^18 // 测试链接 : https://www.luogu.com.cn/problem/P4602 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class168/Code05_PastoralOddities1.java b/src/class168/Code05_PastoralOddities1.java index 55d870a47..071a4444c 100644 --- a/src/class168/Code05_PastoralOddities1.java +++ b/src/class168/Code05_PastoralOddities1.java @@ -1,6 +1,12 @@ package class168; -// 度为奇数的最大边权,java版 +// 度为奇的最小瓶颈边,java版 +// 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 +// 每次加入后,询问是否存在一个边集,满足每个点连接的边的数量都是奇数 +// 如果存在,希望边集的最大边权,尽可能小,打印该值 +// 2 <= n <= 10^5 +// 1 <= m <= 3 * 10^5 +// 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF603E // 测试链接 : https://codeforces.com/problemset/problem/603/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -19,7 +25,7 @@ public class Code05_PastoralOddities1 { // 边的编号i、端点x、端点y、权值w public static int[][] edge = new int[MAXM][4]; - public static int[][] sorted = new int[MAXM][4]; + public static int[][] wsort = new int[MAXM][4]; // 节点数为奇数的联通区数量 public static int oddnum; @@ -75,14 +81,14 @@ public static void compute(int ql, int qr, int vl, int vr) { } if (vl == vr) { for (int i = ql; i <= qr; i++) { - ans[i] = sorted[vl][3]; + ans[i] = wsort[vl][3]; } } else { int mid = (vl + vr) >> 1; int unionCnt1 = 0; for (int i = vl; i <= mid; i++) { - if (sorted[i][0] < ql) { - if (union(sorted[i][1], sorted[i][2])) { + if (wsort[i][0] < ql) { + if (union(wsort[i][1], wsort[i][2])) { unionCnt1++; } } @@ -90,7 +96,7 @@ public static void compute(int ql, int qr, int vl, int vr) { int unionCnt2 = 0; int split = qr + 1; for (int i = ql; i <= qr; i++) { - if (edge[i][3] <= sorted[mid][3]) { + if (edge[i][3] <= wsort[mid][3]) { if (union(edge[i][1], edge[i][2])) { unionCnt2++; } @@ -109,7 +115,7 @@ public static void compute(int ql, int qr, int vl, int vr) { } int unionCnt3 = 0; for (int i = ql; i <= split - 1; i++) { - if (edge[i][3] <= sorted[vl][3]) { + if (edge[i][3] <= wsort[vl][3]) { if (union(edge[i][1], edge[i][2])) { unionCnt3++; } @@ -129,13 +135,13 @@ public static void prepare() { siz[i] = 1; } for (int i = 1; i <= m; i++) { - sorted[i][0] = edge[i][0]; - sorted[i][1] = edge[i][1]; - sorted[i][2] = edge[i][2]; - sorted[i][3] = edge[i][3]; + wsort[i][0] = edge[i][0]; + wsort[i][1] = edge[i][1]; + wsort[i][2] = edge[i][2]; + wsort[i][3] = edge[i][3]; } - Arrays.sort(sorted, 1, m + 1, (a, b) -> a[3] - b[3]); - sorted[m + 1][3] = -1; + Arrays.sort(wsort, 1, m + 1, (a, b) -> a[3] - b[3]); + wsort[m + 1][3] = -1; } public static void main(String[] args) throws Exception { diff --git a/src/class168/Code05_PastoralOddities2.java b/src/class168/Code05_PastoralOddities2.java index b1d935721..45dd60b81 100644 --- a/src/class168/Code05_PastoralOddities2.java +++ b/src/class168/Code05_PastoralOddities2.java @@ -1,6 +1,12 @@ package class168; -// 度为奇数的最大边权,C++版 +// 度为奇的最小瓶颈边,C++版 +// 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 +// 每次加入后,询问是否存在一个边集,满足每个点连接的边的数量都是奇数 +// 如果存在,希望边集的最大边权,尽可能小,打印该值 +// 2 <= n <= 10^5 +// 1 <= m <= 3 * 10^5 +// 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF603E // 测试链接 : https://codeforces.com/problemset/problem/603/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -23,7 +29,7 @@ //int n, m; // //Edge edge[MAXM]; -//Edge sorted[MAXM]; +//Edge wsort[MAXM]; // //int oddnum; //int father[MAXN]; @@ -77,14 +83,14 @@ // } // if (vl == vr) { // for (int i = ql; i <= qr; i++) { -// ans[i] = sorted[vl].w; +// ans[i] = wsort[vl].w; // } // } else { // int mid = (vl + vr) >> 1; // int unionCnt1 = 0; // for (int i = vl; i <= mid; i++) { -// if (sorted[i].i < ql) { -// if (Union(sorted[i].x, sorted[i].y)) { +// if (wsort[i].i < ql) { +// if (Union(wsort[i].x, wsort[i].y)) { // unionCnt1++; // } // } @@ -92,7 +98,7 @@ // int unionCnt2 = 0; // int split = qr + 1; // for (int i = ql; i <= qr; i++) { -// if (edge[i].w <= sorted[mid].w) { +// if (edge[i].w <= wsort[mid].w) { // if (Union(edge[i].x, edge[i].y)) { // unionCnt2++; // } @@ -111,7 +117,7 @@ // } // int unionCnt3 = 0; // for (int i = ql; i <= split - 1; i++) { -// if (edge[i].w <= sorted[vl].w) { +// if (edge[i].w <= wsort[vl].w) { // if (Union(edge[i].x, edge[i].y)) { // unionCnt3++; // } @@ -131,10 +137,10 @@ // siz[i] = 1; // } // for (int i = 1; i <= m; i++) { -// sorted[i] = edge[i]; +// wsort[i] = edge[i]; // } -// sort(sorted + 1, sorted + m + 1, EdgeCmp); -// sorted[m + 1].w = -1; +// sort(wsort + 1, wsort + m + 1, EdgeCmp); +// wsort[m + 1].w = -1; //} // //int main() { From 0bab68b5c4a24720908d674e98881ff1f7b671ef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 14 May 2025 17:28:23 +0800 Subject: [PATCH 0116/1170] modify code --- src/class168/Code05_PastoralOddities1.java | 4 ++-- src/class168/Code05_PastoralOddities2.java | 4 ++-- src/class168/Code06_PlateAndFruit1.java | 7 +++++++ src/class168/Code06_PlateAndFruit2.java | 7 +++++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/class168/Code05_PastoralOddities1.java b/src/class168/Code05_PastoralOddities1.java index 071a4444c..065daf323 100644 --- a/src/class168/Code05_PastoralOddities1.java +++ b/src/class168/Code05_PastoralOddities1.java @@ -1,9 +1,9 @@ package class168; -// 度为奇的最小瓶颈边,java版 +// 度为奇最小瓶颈,java版 // 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 // 每次加入后,询问是否存在一个边集,满足每个点连接的边的数量都是奇数 -// 如果存在,希望边集的最大边权,尽可能小,打印该值 +// 如果存在,希望边集的最大边权,尽可能小,一共有m条打印 // 2 <= n <= 10^5 // 1 <= m <= 3 * 10^5 // 1 <= 边权 <= 10^9 diff --git a/src/class168/Code05_PastoralOddities2.java b/src/class168/Code05_PastoralOddities2.java index 45dd60b81..bd46af12d 100644 --- a/src/class168/Code05_PastoralOddities2.java +++ b/src/class168/Code05_PastoralOddities2.java @@ -1,9 +1,9 @@ package class168; -// 度为奇的最小瓶颈边,C++版 +// 度为奇最小瓶颈,C++版 // 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 // 每次加入后,询问是否存在一个边集,满足每个点连接的边的数量都是奇数 -// 如果存在,希望边集的最大边权,尽可能小,打印该值 +// 如果存在,希望边集的最大边权,尽可能小,一共有m条打印 // 2 <= n <= 10^5 // 1 <= m <= 3 * 10^5 // 1 <= 边权 <= 10^9 diff --git a/src/class168/Code06_PlateAndFruit1.java b/src/class168/Code06_PlateAndFruit1.java index dffd4dd09..57e3ef3dd 100644 --- a/src/class168/Code06_PlateAndFruit1.java +++ b/src/class168/Code06_PlateAndFruit1.java @@ -1,6 +1,13 @@ package class168; // 接水果,java版 +// 一共有n个点,给定n-1条无向边,所有点连成一棵树 +// 一共有p个盘子,每个盘子格式 a b c : 盘子是点a到点b的路径,盘子权值为c +// 一共有q个水果,每个水果格式 u v k : 水果是点u到点v的路径,k含义如下 +// 如果一个盘子路径完全在一个水果路径的内部,那么该盘子可以接住该水果 +// 那么对于每个水果,可能有很多盘子都可以将其接住,打印其中第k小的权值 +// 1 <= n、p、q <= 4 * 10^4 +// 0 <= 盘子权值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3242 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class168/Code06_PlateAndFruit2.java b/src/class168/Code06_PlateAndFruit2.java index 60a2cb904..27c43fde3 100644 --- a/src/class168/Code06_PlateAndFruit2.java +++ b/src/class168/Code06_PlateAndFruit2.java @@ -1,6 +1,13 @@ package class168; // 接水果,C++版 +// 一共有n个点,给定n-1条无向边,所有点连成一棵树 +// 一共有p个盘子,每个盘子格式 a b c : 盘子是点a到点b的路径,盘子权值为c +// 一共有q个水果,每个水果格式 u v k : 水果是点u到点v的路径,k含义如下 +// 如果一个盘子路径完全在一个水果路径的内部,那么该盘子可以接住该水果 +// 那么对于每个水果,可能有很多盘子都可以将其接住,打印其中第k小的权值 +// 1 <= n、p、q <= 4 * 10^4 +// 0 <= 盘子权值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3242 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 6d6461e25123889e8aff66c9f3d9d1dabe084cf4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 14 May 2025 17:29:03 +0800 Subject: [PATCH 0117/1170] modify code --- src/class168/{Code06_PlateAndFruit1.java => Code06_Fruit1.java} | 2 +- src/class168/{Code06_PlateAndFruit2.java => Code06_Fruit2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class168/{Code06_PlateAndFruit1.java => Code06_Fruit1.java} (99%) rename src/class168/{Code06_PlateAndFruit2.java => Code06_Fruit2.java} (100%) diff --git a/src/class168/Code06_PlateAndFruit1.java b/src/class168/Code06_Fruit1.java similarity index 99% rename from src/class168/Code06_PlateAndFruit1.java rename to src/class168/Code06_Fruit1.java index 57e3ef3dd..39064bf2e 100644 --- a/src/class168/Code06_PlateAndFruit1.java +++ b/src/class168/Code06_Fruit1.java @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code06_PlateAndFruit1 { +public class Code06_Fruit1 { public static int MAXN = 40001; public static int MAXH = 16; diff --git a/src/class168/Code06_PlateAndFruit2.java b/src/class168/Code06_Fruit2.java similarity index 100% rename from src/class168/Code06_PlateAndFruit2.java rename to src/class168/Code06_Fruit2.java From 69b4bccd13a3994fef0c5386559382f4c91e0eb5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 14 May 2025 17:37:00 +0800 Subject: [PATCH 0118/1170] modify code --- src/class168/Code01_KthSmall1.java | 2 +- src/class168/Code01_KthSmall2.java | 2 +- src/class168/Code02_IvanAndBurgers1.java | 2 +- src/class168/Code02_IvanAndBurgers2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class168/Code01_KthSmall1.java b/src/class168/Code01_KthSmall1.java index dd41b0399..1eb041245 100644 --- a/src/class168/Code01_KthSmall1.java +++ b/src/class168/Code01_KthSmall1.java @@ -1,6 +1,6 @@ package class168; -// 子矩阵第k小,java版 +// 区域第k小,java版 // 给定一个n * n的矩阵,接下来有q条查询,格式如下 // 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 // 1 <= n <= 500 diff --git a/src/class168/Code01_KthSmall2.java b/src/class168/Code01_KthSmall2.java index 49d6073bd..a44d472e2 100644 --- a/src/class168/Code01_KthSmall2.java +++ b/src/class168/Code01_KthSmall2.java @@ -1,6 +1,6 @@ package class168; -// 子矩阵第k小,C++版 +// 区域第k小,C++版 // 给定一个n * n的矩阵,接下来有q条查询,格式如下 // 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 // 1 <= n <= 500 diff --git a/src/class168/Code02_IvanAndBurgers1.java b/src/class168/Code02_IvanAndBurgers1.java index f42ae111b..6a0340655 100644 --- a/src/class168/Code02_IvanAndBurgers1.java +++ b/src/class168/Code02_IvanAndBurgers1.java @@ -1,6 +1,6 @@ package class168; -// 范围内最大异或和,java版 +// 范围最大异或和,java版 // 给定一个长度为n的数组arr,下标1~n,接下来有q条查询,格式如下 // 查询 l r : arr[l..r]中选若干个数,打印最大的异或和 // 1 <= n、q <= 5 * 10^5 diff --git a/src/class168/Code02_IvanAndBurgers2.java b/src/class168/Code02_IvanAndBurgers2.java index 104c1e4e6..e00d24623 100644 --- a/src/class168/Code02_IvanAndBurgers2.java +++ b/src/class168/Code02_IvanAndBurgers2.java @@ -1,6 +1,6 @@ package class168; -// 范围内最大异或和,C++版 +// 范围最大异或和,C++版 // 给定一个长度为n的数组arr,下标1~n,接下来有q条查询,格式如下 // 查询 l r : arr[l..r]中选若干个数,打印最大的异或和 // 1 <= n、q <= 5 * 10^5 From 793032dede539f32e8afe85d0cd74bb33082fd55 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 14 May 2025 18:17:56 +0800 Subject: [PATCH 0119/1170] modify code --- src/class168/{Code03_Meteors1.java => Code02_Meteors1.java} | 4 ++-- src/class168/{Code03_Meteors2.java => Code02_Meteors2.java} | 0 src/class168/{Code04_Juice1.java => Code03_Juice1.java} | 2 +- src/class168/{Code04_Juice2.java => Code03_Juice2.java} | 0 ...5_PastoralOddities1.java => Code04_PastoralOddities1.java} | 2 +- ...5_PastoralOddities2.java => Code04_PastoralOddities2.java} | 0 src/class168/{Code06_Fruit1.java => Code05_Fruit1.java} | 2 +- src/class168/{Code06_Fruit2.java => Code05_Fruit2.java} | 0 src/class168/{Code07_Network1.java => Code06_Network1.java} | 2 +- src/class168/{Code07_Network2.java => Code06_Network2.java} | 0 ...ode02_IvanAndBurgers1.java => Code07_IvanAndBurgers1.java} | 2 +- ...ode02_IvanAndBurgers2.java => Code07_IvanAndBurgers2.java} | 0 12 files changed, 7 insertions(+), 7 deletions(-) rename src/class168/{Code03_Meteors1.java => Code02_Meteors1.java} (98%) rename src/class168/{Code03_Meteors2.java => Code02_Meteors2.java} (100%) rename src/class168/{Code04_Juice1.java => Code03_Juice1.java} (99%) rename src/class168/{Code04_Juice2.java => Code03_Juice2.java} (100%) rename src/class168/{Code05_PastoralOddities1.java => Code04_PastoralOddities1.java} (99%) rename src/class168/{Code05_PastoralOddities2.java => Code04_PastoralOddities2.java} (100%) rename src/class168/{Code06_Fruit1.java => Code05_Fruit1.java} (99%) rename src/class168/{Code06_Fruit2.java => Code05_Fruit2.java} (100%) rename src/class168/{Code07_Network1.java => Code06_Network1.java} (99%) rename src/class168/{Code07_Network2.java => Code06_Network2.java} (100%) rename src/class168/{Code02_IvanAndBurgers1.java => Code07_IvanAndBurgers1.java} (99%) rename src/class168/{Code02_IvanAndBurgers2.java => Code07_IvanAndBurgers2.java} (100%) diff --git a/src/class168/Code03_Meteors1.java b/src/class168/Code02_Meteors1.java similarity index 98% rename from src/class168/Code03_Meteors1.java rename to src/class168/Code02_Meteors1.java index 3b2e09019..45420cbcb 100644 --- a/src/class168/Code03_Meteors1.java +++ b/src/class168/Code02_Meteors1.java @@ -12,7 +12,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 // 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 -// 想通过用C++实现,本节课Code03_Meteors2文件就是C++的实现 +// 想通过用C++实现,本节课Code02_Meteors2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -20,7 +20,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code03_Meteors1 { +public class Code02_Meteors1 { public static int MAXN = 300001; public static int n, m, k; diff --git a/src/class168/Code03_Meteors2.java b/src/class168/Code02_Meteors2.java similarity index 100% rename from src/class168/Code03_Meteors2.java rename to src/class168/Code02_Meteors2.java diff --git a/src/class168/Code04_Juice1.java b/src/class168/Code03_Juice1.java similarity index 99% rename from src/class168/Code04_Juice1.java rename to src/class168/Code03_Juice1.java index 9b4d59a42..7cdf7cb57 100644 --- a/src/class168/Code04_Juice1.java +++ b/src/class168/Code03_Juice1.java @@ -16,7 +16,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code04_Juice1 { +public class Code03_Juice1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class168/Code04_Juice2.java b/src/class168/Code03_Juice2.java similarity index 100% rename from src/class168/Code04_Juice2.java rename to src/class168/Code03_Juice2.java diff --git a/src/class168/Code05_PastoralOddities1.java b/src/class168/Code04_PastoralOddities1.java similarity index 99% rename from src/class168/Code05_PastoralOddities1.java rename to src/class168/Code04_PastoralOddities1.java index 065daf323..f4561d084 100644 --- a/src/class168/Code05_PastoralOddities1.java +++ b/src/class168/Code04_PastoralOddities1.java @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_PastoralOddities1 { +public class Code04_PastoralOddities1 { public static int MAXN = 100001; public static int MAXM = 300002; diff --git a/src/class168/Code05_PastoralOddities2.java b/src/class168/Code04_PastoralOddities2.java similarity index 100% rename from src/class168/Code05_PastoralOddities2.java rename to src/class168/Code04_PastoralOddities2.java diff --git a/src/class168/Code06_Fruit1.java b/src/class168/Code05_Fruit1.java similarity index 99% rename from src/class168/Code06_Fruit1.java rename to src/class168/Code05_Fruit1.java index 39064bf2e..e0f5ffaeb 100644 --- a/src/class168/Code06_Fruit1.java +++ b/src/class168/Code05_Fruit1.java @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code06_Fruit1 { +public class Code05_Fruit1 { public static int MAXN = 40001; public static int MAXH = 16; diff --git a/src/class168/Code06_Fruit2.java b/src/class168/Code05_Fruit2.java similarity index 100% rename from src/class168/Code06_Fruit2.java rename to src/class168/Code05_Fruit2.java diff --git a/src/class168/Code07_Network1.java b/src/class168/Code06_Network1.java similarity index 99% rename from src/class168/Code07_Network1.java rename to src/class168/Code06_Network1.java index afa669476..c076eeef1 100644 --- a/src/class168/Code07_Network1.java +++ b/src/class168/Code06_Network1.java @@ -17,7 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code07_Network1 { +public class Code06_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; diff --git a/src/class168/Code07_Network2.java b/src/class168/Code06_Network2.java similarity index 100% rename from src/class168/Code07_Network2.java rename to src/class168/Code06_Network2.java diff --git a/src/class168/Code02_IvanAndBurgers1.java b/src/class168/Code07_IvanAndBurgers1.java similarity index 99% rename from src/class168/Code02_IvanAndBurgers1.java rename to src/class168/Code07_IvanAndBurgers1.java index 6a0340655..97a84adbd 100644 --- a/src/class168/Code02_IvanAndBurgers1.java +++ b/src/class168/Code07_IvanAndBurgers1.java @@ -14,7 +14,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_IvanAndBurgers1 { +public class Code07_IvanAndBurgers1 { public static int MAXN = 500001; public static int BIT = 21; diff --git a/src/class168/Code02_IvanAndBurgers2.java b/src/class168/Code07_IvanAndBurgers2.java similarity index 100% rename from src/class168/Code02_IvanAndBurgers2.java rename to src/class168/Code07_IvanAndBurgers2.java From f9cbbd0cce23146ef40aa58cc1e5f6380647e0eb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 May 2025 11:18:30 +0800 Subject: [PATCH 0120/1170] modify code --- src/class168/Code01_RangeKth1.java | 170 ++++++++++++++++++ src/class168/Code01_RangeKth2.java | 125 +++++++++++++ ..._KthSmall1.java => Code02_MatrixKth1.java} | 8 +- ..._KthSmall2.java => Code02_MatrixKth2.java} | 6 +- ...e02_Meteors1.java => Code03_Meteors1.java} | 4 +- ...e02_Meteors2.java => Code03_Meteors2.java} | 0 ...{Code03_Juice1.java => Code04_Juice1.java} | 2 +- ...{Code03_Juice2.java => Code04_Juice2.java} | 0 ...es1.java => Code05_PastoralOddities1.java} | 2 +- ...es2.java => Code05_PastoralOddities2.java} | 0 ...{Code05_Fruit1.java => Code06_Fruit1.java} | 2 +- ...{Code05_Fruit2.java => Code06_Fruit2.java} | 0 ...e06_Network1.java => Code07_Network1.java} | 2 +- ...e06_Network2.java => Code07_Network2.java} | 0 ...gers1.java => Code08_IvanAndBurgers1.java} | 2 +- ...gers2.java => Code08_IvanAndBurgers2.java} | 0 16 files changed, 309 insertions(+), 14 deletions(-) create mode 100644 src/class168/Code01_RangeKth1.java create mode 100644 src/class168/Code01_RangeKth2.java rename src/class168/{Code01_KthSmall1.java => Code02_MatrixKth1.java} (95%) rename src/class168/{Code01_KthSmall2.java => Code02_MatrixKth2.java} (95%) rename src/class168/{Code02_Meteors1.java => Code03_Meteors1.java} (98%) rename src/class168/{Code02_Meteors2.java => Code03_Meteors2.java} (100%) rename src/class168/{Code03_Juice1.java => Code04_Juice1.java} (99%) rename src/class168/{Code03_Juice2.java => Code04_Juice2.java} (100%) rename src/class168/{Code04_PastoralOddities1.java => Code05_PastoralOddities1.java} (99%) rename src/class168/{Code04_PastoralOddities2.java => Code05_PastoralOddities2.java} (100%) rename src/class168/{Code05_Fruit1.java => Code06_Fruit1.java} (99%) rename src/class168/{Code05_Fruit2.java => Code06_Fruit2.java} (100%) rename src/class168/{Code06_Network1.java => Code07_Network1.java} (99%) rename src/class168/{Code06_Network2.java => Code07_Network2.java} (100%) rename src/class168/{Code07_IvanAndBurgers1.java => Code08_IvanAndBurgers1.java} (99%) rename src/class168/{Code07_IvanAndBurgers2.java => Code08_IvanAndBurgers2.java} (100%) diff --git a/src/class168/Code01_RangeKth1.java b/src/class168/Code01_RangeKth1.java new file mode 100644 index 000000000..2e57e9843 --- /dev/null +++ b/src/class168/Code01_RangeKth1.java @@ -0,0 +1,170 @@ +package class168; + +// 区间第k小,java版 +// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 +// 给定一个长度为n的数组,接下来有m条查询,格式如下 +// 查询 l r k : 打印[l..r]范围内第k小的值 +// 1 <= n、m <= 2 * 10^5 +// 1 <= 数组中的数字 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_RangeKth1 { + + public static int MAXN = 200001; + public static int INF = 1000000001; + public static int n, m; + + // 位置i,数值v + public static int[][] arr = new int[MAXN][2]; + + // 查询 + public static int[] qid = new int[MAXN]; + public static int[] l = new int[MAXN]; + public static int[] r = new int[MAXN]; + public static int[] k = new int[MAXN]; + + // 树状数组 + public static int[] tree = new int[MAXN]; + public static int used = 0; + + // 整体二分 + public static int[] lset = new int[MAXN]; + public static int[] rset = new int[MAXN]; + + // 查询的答案 + public static int[] ans = new int[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= n) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static int query(int l, int r) { + return sum(r) - sum(l - 1); + } + + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[qid[i]] = vl; + } + } else { + int mid = (vl + vr) / 2; + while (used + 1 <= n && arr[used + 1][1] <= mid) { + used++; + add(arr[used][0], 1); + } + while (used >= 1 && arr[used][1] > mid) { + add(arr[used][0], -1); + used--; + } + int lsiz = 0, rsiz = 0; + for (int i = ql; i <= qr; i++) { + int id = qid[i]; + int check = query(l[id], r[id]); + if (check >= k[id]) { + lset[++lsiz] = id; + } else { + rset[++rsiz] = id; + } + } + for (int i = 1; i <= lsiz; i++) { + qid[ql + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + qid[ql + lsiz + i - 1] = rset[i]; + } + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i][0] = i; + arr[i][1] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + qid[i] = i; + l[i] = in.nextInt(); + r[i] = in.nextInt(); + k[i] = in.nextInt(); + } + Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] - b[1]); + compute(1, m, 0, INF); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java new file mode 100644 index 000000000..f29518ebb --- /dev/null +++ b/src/class168/Code01_RangeKth2.java @@ -0,0 +1,125 @@ +package class168; + +// 区间第k小,C++版 +// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 +// 给定一个长度为n的数组,接下来有m条查询,格式如下 +// 查询 l r k : 打印[l..r]范围内第k小的值 +// 1 <= n、m <= 2 * 10^5 +// 1 <= 数组中的数字 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Number { +// int i, v; +//}; +// +//bool NumberCmp(Number x, Number y) { +// return x.v < y.v; +//} +// +//const int MAXN = 200001; +//const int INF = 1000000001; +//int n, m; +// +//Number arr[MAXN]; +// +//int qid[MAXN]; +//int l[MAXN]; +//int r[MAXN]; +//int k[MAXN]; +// +//int tree[MAXN]; +//int used = 0; +// +//int lset[MAXN]; +//int rset[MAXN]; +// +//int ans[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= n) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//int query(int l, int r) { +// return sum(r) - sum(l - 1); +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = vl; +// } +// } else { +// int mid = (vl + vr) / 2; +// while (used + 1 <= n && arr[used + 1].v <= mid) { +// used++; +// add(arr[used].i, 1); +// } +// while (used >= 1 && arr[used].v > mid) { +// add(arr[used].i, -1); +// used--; +// } +// int lsiz = 0, rsiz = 0; +// for (int i = ql; i <= qr; i++) { +// int id = qid[i]; +// int check = query(l[id], r[id]); +// if (check >= k[id]) { +// lset[++lsiz] = id; +// } else { +// rset[++rsiz] = id; +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// qid[ql + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// qid[ql + lsiz + i - 1] = rset[i]; +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// arr[i].i = i; +// cin >> arr[i].v; +// } +// for (int i = 1; i <= m; i++) { +// qid[i] = i; +// cin >> l[i] >> r[i] >> k[i]; +// } +// sort(arr + 1, arr + n + 1, NumberCmp); +// compute(1, m, 0, INF); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class168/Code01_KthSmall1.java b/src/class168/Code02_MatrixKth1.java similarity index 95% rename from src/class168/Code01_KthSmall1.java rename to src/class168/Code02_MatrixKth1.java index 1eb041245..1582bf779 100644 --- a/src/class168/Code01_KthSmall1.java +++ b/src/class168/Code02_MatrixKth1.java @@ -1,6 +1,6 @@ package class168; -// 区域第k小,java版 +// 矩阵第k小,java版 // 给定一个n * n的矩阵,接下来有q条查询,格式如下 // 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 // 1 <= n <= 500 @@ -15,7 +15,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code01_KthSmall1 { +public class Code02_MatrixKth1 { public static int MAXN = 501; public static int MAXQ = 1000001; @@ -60,7 +60,7 @@ public static void add(int x, int y, int v) { } } - public static int query(int x, int y) { + public static int sum(int x, int y) { int ret = 0; for (int i = x; i > 0; i -= lowbit(i)) { for (int j = y; j > 0; j -= lowbit(j)) { @@ -71,7 +71,7 @@ public static int query(int x, int y) { } public static int query(int a, int b, int c, int d) { - return query(c, d) - query(a - 1, d) - query(c, b - 1) + query(a - 1, b - 1); + return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1); } public static void compute(int ql, int qr, int vl, int vr) { diff --git a/src/class168/Code01_KthSmall2.java b/src/class168/Code02_MatrixKth2.java similarity index 95% rename from src/class168/Code01_KthSmall2.java rename to src/class168/Code02_MatrixKth2.java index a44d472e2..c7c55cf09 100644 --- a/src/class168/Code01_KthSmall2.java +++ b/src/class168/Code02_MatrixKth2.java @@ -1,6 +1,6 @@ package class168; -// 区域第k小,C++版 +// 矩阵第k小,C++版 // 给定一个n * n的矩阵,接下来有q条查询,格式如下 // 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 // 1 <= n <= 500 @@ -57,7 +57,7 @@ // } //} // -//int query(int x, int y) { +//int sum(int x, int y) { // int ret = 0; // for (int i = x; i > 0; i -= lowbit(i)) { // for (int j = y; j > 0; j -= lowbit(j)) { @@ -68,7 +68,7 @@ //} // //int query(int a, int b, int c, int d) { -// return query(c, d) - query(a - 1, d) - query(c, b - 1) + query(a - 1, b - 1); +// return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1); //} // //void compute(int ql, int qr, int vl, int vr) { diff --git a/src/class168/Code02_Meteors1.java b/src/class168/Code03_Meteors1.java similarity index 98% rename from src/class168/Code02_Meteors1.java rename to src/class168/Code03_Meteors1.java index 45420cbcb..3b2e09019 100644 --- a/src/class168/Code02_Meteors1.java +++ b/src/class168/Code03_Meteors1.java @@ -12,7 +12,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 // 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 -// 想通过用C++实现,本节课Code02_Meteors2文件就是C++的实现 +// 想通过用C++实现,本节课Code03_Meteors2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -20,7 +20,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_Meteors1 { +public class Code03_Meteors1 { public static int MAXN = 300001; public static int n, m, k; diff --git a/src/class168/Code02_Meteors2.java b/src/class168/Code03_Meteors2.java similarity index 100% rename from src/class168/Code02_Meteors2.java rename to src/class168/Code03_Meteors2.java diff --git a/src/class168/Code03_Juice1.java b/src/class168/Code04_Juice1.java similarity index 99% rename from src/class168/Code03_Juice1.java rename to src/class168/Code04_Juice1.java index 7cdf7cb57..9b4d59a42 100644 --- a/src/class168/Code03_Juice1.java +++ b/src/class168/Code04_Juice1.java @@ -16,7 +16,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code03_Juice1 { +public class Code04_Juice1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class168/Code03_Juice2.java b/src/class168/Code04_Juice2.java similarity index 100% rename from src/class168/Code03_Juice2.java rename to src/class168/Code04_Juice2.java diff --git a/src/class168/Code04_PastoralOddities1.java b/src/class168/Code05_PastoralOddities1.java similarity index 99% rename from src/class168/Code04_PastoralOddities1.java rename to src/class168/Code05_PastoralOddities1.java index f4561d084..065daf323 100644 --- a/src/class168/Code04_PastoralOddities1.java +++ b/src/class168/Code05_PastoralOddities1.java @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code04_PastoralOddities1 { +public class Code05_PastoralOddities1 { public static int MAXN = 100001; public static int MAXM = 300002; diff --git a/src/class168/Code04_PastoralOddities2.java b/src/class168/Code05_PastoralOddities2.java similarity index 100% rename from src/class168/Code04_PastoralOddities2.java rename to src/class168/Code05_PastoralOddities2.java diff --git a/src/class168/Code05_Fruit1.java b/src/class168/Code06_Fruit1.java similarity index 99% rename from src/class168/Code05_Fruit1.java rename to src/class168/Code06_Fruit1.java index e0f5ffaeb..39064bf2e 100644 --- a/src/class168/Code05_Fruit1.java +++ b/src/class168/Code06_Fruit1.java @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_Fruit1 { +public class Code06_Fruit1 { public static int MAXN = 40001; public static int MAXH = 16; diff --git a/src/class168/Code05_Fruit2.java b/src/class168/Code06_Fruit2.java similarity index 100% rename from src/class168/Code05_Fruit2.java rename to src/class168/Code06_Fruit2.java diff --git a/src/class168/Code06_Network1.java b/src/class168/Code07_Network1.java similarity index 99% rename from src/class168/Code06_Network1.java rename to src/class168/Code07_Network1.java index c076eeef1..afa669476 100644 --- a/src/class168/Code06_Network1.java +++ b/src/class168/Code07_Network1.java @@ -17,7 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code06_Network1 { +public class Code07_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; diff --git a/src/class168/Code06_Network2.java b/src/class168/Code07_Network2.java similarity index 100% rename from src/class168/Code06_Network2.java rename to src/class168/Code07_Network2.java diff --git a/src/class168/Code07_IvanAndBurgers1.java b/src/class168/Code08_IvanAndBurgers1.java similarity index 99% rename from src/class168/Code07_IvanAndBurgers1.java rename to src/class168/Code08_IvanAndBurgers1.java index 97a84adbd..815d9067c 100644 --- a/src/class168/Code07_IvanAndBurgers1.java +++ b/src/class168/Code08_IvanAndBurgers1.java @@ -14,7 +14,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code07_IvanAndBurgers1 { +public class Code08_IvanAndBurgers1 { public static int MAXN = 500001; public static int BIT = 21; diff --git a/src/class168/Code07_IvanAndBurgers2.java b/src/class168/Code08_IvanAndBurgers2.java similarity index 100% rename from src/class168/Code07_IvanAndBurgers2.java rename to src/class168/Code08_IvanAndBurgers2.java From 4f4b4071ff38b699948020ccecdd3af3bd253e3c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 May 2025 11:20:33 +0800 Subject: [PATCH 0121/1170] modify code --- src/class168/Code01_RangeKth1.java | 2 +- src/class168/Code01_RangeKth2.java | 2 +- src/class168/Code02_MatrixKth1.java | 2 +- src/class168/Code02_MatrixKth2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class168/Code01_RangeKth1.java b/src/class168/Code01_RangeKth1.java index 2e57e9843..5807d6aae 100644 --- a/src/class168/Code01_RangeKth1.java +++ b/src/class168/Code01_RangeKth1.java @@ -1,6 +1,6 @@ package class168; -// 区间第k小,java版 +// 区间内第k小,java版 // 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 给定一个长度为n的数组,接下来有m条查询,格式如下 // 查询 l r k : 打印[l..r]范围内第k小的值 diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index f29518ebb..771f55791 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -1,6 +1,6 @@ package class168; -// 区间第k小,C++版 +// 区间内第k小,C++版 // 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 给定一个长度为n的数组,接下来有m条查询,格式如下 // 查询 l r k : 打印[l..r]范围内第k小的值 diff --git a/src/class168/Code02_MatrixKth1.java b/src/class168/Code02_MatrixKth1.java index 1582bf779..87b88fc9e 100644 --- a/src/class168/Code02_MatrixKth1.java +++ b/src/class168/Code02_MatrixKth1.java @@ -1,6 +1,6 @@ package class168; -// 矩阵第k小,java版 +// 矩阵内第k小,java版 // 给定一个n * n的矩阵,接下来有q条查询,格式如下 // 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 // 1 <= n <= 500 diff --git a/src/class168/Code02_MatrixKth2.java b/src/class168/Code02_MatrixKth2.java index c7c55cf09..5f89826ed 100644 --- a/src/class168/Code02_MatrixKth2.java +++ b/src/class168/Code02_MatrixKth2.java @@ -1,6 +1,6 @@ package class168; -// 矩阵第k小,C++版 +// 矩阵内第k小,C++版 // 给定一个n * n的矩阵,接下来有q条查询,格式如下 // 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 // 1 <= n <= 500 From 8ae4070b6c4548c64b6cce0c68f7520322451267 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 May 2025 19:38:03 +0800 Subject: [PATCH 0122/1170] modify code --- .../Code04_Juice1.java => class169/Code01_Juice1.java} | 4 ++-- .../Code04_Juice2.java => class169/Code01_Juice2.java} | 2 +- .../Code02_PastoralOddities1.java} | 4 ++-- .../Code02_PastoralOddities2.java} | 2 +- .../Code06_Fruit1.java => class169/Code03_Fruit1.java} | 4 ++-- .../Code06_Fruit2.java => class169/Code03_Fruit2.java} | 2 +- .../Code07_Network1.java => class169/Code04_Network1.java} | 4 ++-- .../Code07_Network2.java => class169/Code04_Network2.java} | 2 +- .../Code05_IvanAndBurgers1.java} | 4 ++-- .../Code05_IvanAndBurgers2.java} | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) rename src/{class168/Code04_Juice1.java => class169/Code01_Juice1.java} (99%) rename src/{class168/Code04_Juice2.java => class169/Code01_Juice2.java} (99%) rename src/{class168/Code05_PastoralOddities1.java => class169/Code02_PastoralOddities1.java} (98%) rename src/{class168/Code05_PastoralOddities2.java => class169/Code02_PastoralOddities2.java} (99%) rename src/{class168/Code06_Fruit1.java => class169/Code03_Fruit1.java} (99%) rename src/{class168/Code06_Fruit2.java => class169/Code03_Fruit2.java} (99%) rename src/{class168/Code07_Network1.java => class169/Code04_Network1.java} (99%) rename src/{class168/Code07_Network2.java => class169/Code04_Network2.java} (99%) rename src/{class168/Code08_IvanAndBurgers1.java => class169/Code05_IvanAndBurgers1.java} (98%) rename src/{class168/Code08_IvanAndBurgers2.java => class169/Code05_IvanAndBurgers2.java} (99%) diff --git a/src/class168/Code04_Juice1.java b/src/class169/Code01_Juice1.java similarity index 99% rename from src/class168/Code04_Juice1.java rename to src/class169/Code01_Juice1.java index 9b4d59a42..36209772d 100644 --- a/src/class168/Code04_Juice1.java +++ b/src/class169/Code01_Juice1.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 混合果汁,java版 // 一共有n种果汁,每种果汁给定,美味度d、每升价格p、添加上限l @@ -16,7 +16,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code04_Juice1 { +public class Code01_Juice1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class168/Code04_Juice2.java b/src/class169/Code01_Juice2.java similarity index 99% rename from src/class168/Code04_Juice2.java rename to src/class169/Code01_Juice2.java index cd8b90296..ba7207068 100644 --- a/src/class168/Code04_Juice2.java +++ b/src/class169/Code01_Juice2.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 混合果汁,C++版 // 一共有n种果汁,每种果汁给定,美味度d、每升价格p、添加上限l diff --git a/src/class168/Code05_PastoralOddities1.java b/src/class169/Code02_PastoralOddities1.java similarity index 98% rename from src/class168/Code05_PastoralOddities1.java rename to src/class169/Code02_PastoralOddities1.java index 065daf323..7df208e19 100644 --- a/src/class168/Code05_PastoralOddities1.java +++ b/src/class169/Code02_PastoralOddities1.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 度为奇最小瓶颈,java版 // 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_PastoralOddities1 { +public class Code02_PastoralOddities1 { public static int MAXN = 100001; public static int MAXM = 300002; diff --git a/src/class168/Code05_PastoralOddities2.java b/src/class169/Code02_PastoralOddities2.java similarity index 99% rename from src/class168/Code05_PastoralOddities2.java rename to src/class169/Code02_PastoralOddities2.java index bd46af12d..606c75a30 100644 --- a/src/class168/Code05_PastoralOddities2.java +++ b/src/class169/Code02_PastoralOddities2.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 度为奇最小瓶颈,C++版 // 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 diff --git a/src/class168/Code06_Fruit1.java b/src/class169/Code03_Fruit1.java similarity index 99% rename from src/class168/Code06_Fruit1.java rename to src/class169/Code03_Fruit1.java index 39064bf2e..c17a4e92f 100644 --- a/src/class168/Code06_Fruit1.java +++ b/src/class169/Code03_Fruit1.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 接水果,java版 // 一共有n个点,给定n-1条无向边,所有点连成一棵树 @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code06_Fruit1 { +public class Code03_Fruit1 { public static int MAXN = 40001; public static int MAXH = 16; diff --git a/src/class168/Code06_Fruit2.java b/src/class169/Code03_Fruit2.java similarity index 99% rename from src/class168/Code06_Fruit2.java rename to src/class169/Code03_Fruit2.java index 27c43fde3..f05b53be3 100644 --- a/src/class168/Code06_Fruit2.java +++ b/src/class169/Code03_Fruit2.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 接水果,C++版 // 一共有n个点,给定n-1条无向边,所有点连成一棵树 diff --git a/src/class168/Code07_Network1.java b/src/class169/Code04_Network1.java similarity index 99% rename from src/class168/Code07_Network1.java rename to src/class169/Code04_Network1.java index afa669476..8be1de6e4 100644 --- a/src/class168/Code07_Network1.java +++ b/src/class169/Code04_Network1.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 网络,java版 // 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 @@ -17,7 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code07_Network1 { +public class Code04_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; diff --git a/src/class168/Code07_Network2.java b/src/class169/Code04_Network2.java similarity index 99% rename from src/class168/Code07_Network2.java rename to src/class169/Code04_Network2.java index 625c3bcf8..ea4b11131 100644 --- a/src/class168/Code07_Network2.java +++ b/src/class169/Code04_Network2.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 网络,C++版 // 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 diff --git a/src/class168/Code08_IvanAndBurgers1.java b/src/class169/Code05_IvanAndBurgers1.java similarity index 98% rename from src/class168/Code08_IvanAndBurgers1.java rename to src/class169/Code05_IvanAndBurgers1.java index 815d9067c..e1fffe19b 100644 --- a/src/class168/Code08_IvanAndBurgers1.java +++ b/src/class169/Code05_IvanAndBurgers1.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 范围最大异或和,java版 // 给定一个长度为n的数组arr,下标1~n,接下来有q条查询,格式如下 @@ -14,7 +14,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code08_IvanAndBurgers1 { +public class Code05_IvanAndBurgers1 { public static int MAXN = 500001; public static int BIT = 21; diff --git a/src/class168/Code08_IvanAndBurgers2.java b/src/class169/Code05_IvanAndBurgers2.java similarity index 99% rename from src/class168/Code08_IvanAndBurgers2.java rename to src/class169/Code05_IvanAndBurgers2.java index e00d24623..c9606fc42 100644 --- a/src/class168/Code08_IvanAndBurgers2.java +++ b/src/class169/Code05_IvanAndBurgers2.java @@ -1,4 +1,4 @@ -package class168; +package class169; // 范围最大异或和,C++版 // 给定一个长度为n的数组arr,下标1~n,接下来有q条查询,格式如下 From bd07e8e723a592d307f141b82515b8defa74c9f9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 May 2025 20:58:03 +0800 Subject: [PATCH 0123/1170] modify code --- src/class168/Code01_RangeKth1.java | 29 +-- src/class168/Code01_RangeKth2.java | 279 ++++++++++++++----------- src/class168/Code01_RangeKth3.java | 122 +++++++++++ src/class168/Code01_RangeKth4.java | 125 ++++++++++++ src/class168/Code02_MatrixKth1.java | 184 ----------------- src/class168/Code02_MatrixKth2.java | 302 ++++++++++++++++------------ src/class168/Code02_MatrixKth4.java | 134 ++++++++++++ src/class169/Code03_Fruit1.java | 6 +- src/class169/Code03_Fruit2.java | 6 +- 9 files changed, 740 insertions(+), 447 deletions(-) create mode 100644 src/class168/Code01_RangeKth3.java create mode 100644 src/class168/Code01_RangeKth4.java delete mode 100644 src/class168/Code02_MatrixKth1.java create mode 100644 src/class168/Code02_MatrixKth4.java diff --git a/src/class168/Code01_RangeKth1.java b/src/class168/Code01_RangeKth1.java index 5807d6aae..c457172ba 100644 --- a/src/class168/Code01_RangeKth1.java +++ b/src/class168/Code01_RangeKth1.java @@ -1,6 +1,6 @@ package class168; -// 区间内第k小,java版 +// 区间内第k小,第一种写法,java版 // 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 给定一个长度为n的数组,接下来有m条查询,格式如下 // 查询 l r k : 打印[l..r]范围内第k小的值 @@ -18,7 +18,6 @@ public class Code01_RangeKth1 { public static int MAXN = 200001; - public static int INF = 1000000001; public static int n, m; // 位置i,数值v @@ -32,7 +31,6 @@ public class Code01_RangeKth1 { // 树状数组 public static int[] tree = new int[MAXN]; - public static int used = 0; // 整体二分 public static int[] lset = new int[MAXN]; @@ -71,25 +69,23 @@ public static void compute(int ql, int qr, int vl, int vr) { } if (vl == vr) { for (int i = ql; i <= qr; i++) { - ans[qid[i]] = vl; + ans[qid[i]] = arr[vl][1]; } } else { + // 修改数据状况 int mid = (vl + vr) / 2; - while (used + 1 <= n && arr[used + 1][1] <= mid) { - used++; - add(arr[used][0], 1); - } - while (used >= 1 && arr[used][1] > mid) { - add(arr[used][0], -1); - used--; + for (int i = vl; i <= mid; i++) { + add(arr[i][0], 1); } + // 检查每个问题并划分左右 int lsiz = 0, rsiz = 0; for (int i = ql; i <= qr; i++) { int id = qid[i]; - int check = query(l[id], r[id]); - if (check >= k[id]) { + int satisfy = query(l[id], r[id]); + if (satisfy >= k[id]) { lset[++lsiz] = id; } else { + k[id] -= satisfy; rset[++rsiz] = id; } } @@ -99,6 +95,11 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } + // 撤回数据状况 + for (int i = vl; i <= mid; i++) { + add(arr[i][0], -1); + } + // 左右两侧各自递归 compute(ql, ql + lsiz - 1, vl, mid); compute(ql + lsiz, qr, mid + 1, vr); } @@ -120,7 +121,7 @@ public static void main(String[] args) throws Exception { k[i] = in.nextInt(); } Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] - b[1]); - compute(1, m, 0, INF); + compute(1, m, 1, n); for (int i = 1; i <= m; i++) { out.println(ans[i]); } diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index 771f55791..98d0f010a 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -1,125 +1,170 @@ package class168; -// 区间内第k小,C++版 +// 区间内第k小,第二种写法,java版 // 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 给定一个长度为n的数组,接下来有m条查询,格式如下 // 查询 l r k : 打印[l..r]范围内第k小的值 // 1 <= n、m <= 2 * 10^5 // 1 <= 数组中的数字 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3834 -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 - -//#include -// -//using namespace std; -// -//struct Number { -// int i, v; -//}; -// -//bool NumberCmp(Number x, Number y) { -// return x.v < y.v; -//} -// -//const int MAXN = 200001; -//const int INF = 1000000001; -//int n, m; -// -//Number arr[MAXN]; -// -//int qid[MAXN]; -//int l[MAXN]; -//int r[MAXN]; -//int k[MAXN]; -// -//int tree[MAXN]; -//int used = 0; -// -//int lset[MAXN]; -//int rset[MAXN]; -// -//int ans[MAXN]; -// -//int lowbit(int i) { -// return i & -i; -//} -// -//void add(int i, int v) { -// while (i <= n) { -// tree[i] += v; -// i += lowbit(i); -// } -//} -// -//int sum(int i) { -// int ret = 0; -// while (i > 0) { -// ret += tree[i]; -// i -= lowbit(i); -// } -// return ret; -//} -// -//int query(int l, int r) { -// return sum(r) - sum(l - 1); -//} -// -//void compute(int ql, int qr, int vl, int vr) { -// if (ql > qr) { -// return; -// } -// if (vl == vr) { -// for (int i = ql; i <= qr; i++) { -// ans[qid[i]] = vl; -// } -// } else { -// int mid = (vl + vr) / 2; -// while (used + 1 <= n && arr[used + 1].v <= mid) { -// used++; -// add(arr[used].i, 1); -// } -// while (used >= 1 && arr[used].v > mid) { -// add(arr[used].i, -1); -// used--; -// } -// int lsiz = 0, rsiz = 0; -// for (int i = ql; i <= qr; i++) { -// int id = qid[i]; -// int check = query(l[id], r[id]); -// if (check >= k[id]) { -// lset[++lsiz] = id; -// } else { -// rset[++rsiz] = id; -// } -// } -// for (int i = 1; i <= lsiz; i++) { -// qid[ql + i - 1] = lset[i]; -// } -// for (int i = 1; i <= rsiz; i++) { -// qid[ql + lsiz + i - 1] = rset[i]; -// } -// compute(ql, ql + lsiz - 1, vl, mid); -// compute(ql + lsiz, qr, mid + 1, vr); -// } -//} -// -//int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n >> m; -// for (int i = 1; i <= n; i++) { -// arr[i].i = i; -// cin >> arr[i].v; -// } -// for (int i = 1; i <= m; i++) { -// qid[i] = i; -// cin >> l[i] >> r[i] >> k[i]; -// } -// sort(arr + 1, arr + n + 1, NumberCmp); -// compute(1, m, 0, INF); -// for (int i = 1; i <= m; i++) { -// cout << ans[i] << '\n'; -// } -// return 0; -//} \ No newline at end of file +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_RangeKth2 { + + public static int MAXN = 200001; + public static int INF = 1000000001; + public static int n, m; + + // 位置i,数值v + public static int[][] arr = new int[MAXN][2]; + + // 查询 + public static int[] qid = new int[MAXN]; + public static int[] l = new int[MAXN]; + public static int[] r = new int[MAXN]; + public static int[] k = new int[MAXN]; + + // 树状数组 + public static int[] tree = new int[MAXN]; + public static int used = 0; + + // 整体二分 + public static int[] lset = new int[MAXN]; + public static int[] rset = new int[MAXN]; + + // 查询的答案 + public static int[] ans = new int[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= n) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static int query(int l, int r) { + return sum(r) - sum(l - 1); + } + + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[qid[i]] = vl; + } + } else { + int mid = (vl + vr) / 2; + while (used + 1 <= n && arr[used + 1][1] <= mid) { + used++; + add(arr[used][0], 1); + } + while (used >= 1 && arr[used][1] > mid) { + add(arr[used][0], -1); + used--; + } + int lsiz = 0, rsiz = 0; + for (int i = ql; i <= qr; i++) { + int id = qid[i]; + int satisfy = query(l[id], r[id]); + if (satisfy >= k[id]) { + lset[++lsiz] = id; + } else { + rset[++rsiz] = id; + } + } + for (int i = 1; i <= lsiz; i++) { + qid[ql + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + qid[ql + lsiz + i - 1] = rset[i]; + } + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i][0] = i; + arr[i][1] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + qid[i] = i; + l[i] = in.nextInt(); + r[i] = in.nextInt(); + k[i] = in.nextInt(); + } + Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] - b[1]); + compute(1, m, 0, INF); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class168/Code01_RangeKth3.java b/src/class168/Code01_RangeKth3.java new file mode 100644 index 000000000..dba9e5465 --- /dev/null +++ b/src/class168/Code01_RangeKth3.java @@ -0,0 +1,122 @@ +package class168; + +// 区间内第k小,第一种写法,C++版 +// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 +// 给定一个长度为n的数组,接下来有m条查询,格式如下 +// 查询 l r k : 打印[l..r]范围内第k小的值 +// 1 <= n、m <= 2 * 10^5 +// 1 <= 数组中的数字 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Number { +// int i, v; +//}; +// +//bool NumberCmp(Number x, Number y) { +// return x.v < y.v; +//} +// +//const int MAXN = 200001; +//int n, m; +// +//Number arr[MAXN]; +// +//int qid[MAXN]; +//int l[MAXN]; +//int r[MAXN]; +//int k[MAXN]; +// +//int tree[MAXN]; +// +//int lset[MAXN]; +//int rset[MAXN]; +// +//int ans[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= n) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//int query(int l, int r) { +// return sum(r) - sum(l - 1); +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = arr[vl].v; +// } +// } else { +// int mid = (vl + vr) >> 1; +// for (int i = vl; i <= mid; i++) { +// add(arr[i].i, 1); +// } +// int lsiz = 0, rsiz = 0; +// for (int i = ql; i <= qr; i++) { +// int id = qid[i]; +// int satisfy = query(l[id], r[id]); +// if (satisfy >= k[id]) { +// lset[++lsiz] = id; +// } else { +// k[id] -= satisfy; +// rset[++rsiz] = id; +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// qid[ql + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// qid[ql + lsiz + i - 1] = rset[i]; +// } +// for (int i = vl; i <= mid; i++) { +// add(arr[i].i, -1); +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// arr[i].i = i; +// cin >> arr[i].v; +// } +// for (int i = 1; i <= m; i++) { +// qid[i] = i; +// cin >> l[i] >> r[i] >> k[i]; +// } +// sort(arr + 1, arr + n + 1, NumberCmp); +// compute(1, m, 1, n); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class168/Code01_RangeKth4.java b/src/class168/Code01_RangeKth4.java new file mode 100644 index 000000000..b869d9fc4 --- /dev/null +++ b/src/class168/Code01_RangeKth4.java @@ -0,0 +1,125 @@ +package class168; + +// 区间内第k小,第二种写法,C++版 +// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 +// 给定一个长度为n的数组,接下来有m条查询,格式如下 +// 查询 l r k : 打印[l..r]范围内第k小的值 +// 1 <= n、m <= 2 * 10^5 +// 1 <= 数组中的数字 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Number { +// int i, v; +//}; +// +//bool NumberCmp(Number x, Number y) { +// return x.v < y.v; +//} +// +//const int MAXN = 200001; +//const int INF = 1000000001; +//int n, m; +// +//Number arr[MAXN]; +// +//int qid[MAXN]; +//int l[MAXN]; +//int r[MAXN]; +//int k[MAXN]; +// +//int tree[MAXN]; +//int used = 0; +// +//int lset[MAXN]; +//int rset[MAXN]; +// +//int ans[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= n) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//int query(int l, int r) { +// return sum(r) - sum(l - 1); +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = vl; +// } +// } else { +// int mid = (vl + vr) / 2; +// while (used + 1 <= n && arr[used + 1].v <= mid) { +// used++; +// add(arr[used].i, 1); +// } +// while (used >= 1 && arr[used].v > mid) { +// add(arr[used].i, -1); +// used--; +// } +// int lsiz = 0, rsiz = 0; +// for (int i = ql; i <= qr; i++) { +// int id = qid[i]; +// int satisfy = query(l[id], r[id]); +// if (satisfy >= k[id]) { +// lset[++lsiz] = id; +// } else { +// rset[++rsiz] = id; +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// qid[ql + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// qid[ql + lsiz + i - 1] = rset[i]; +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// arr[i].i = i; +// cin >> arr[i].v; +// } +// for (int i = 1; i <= m; i++) { +// qid[i] = i; +// cin >> l[i] >> r[i] >> k[i]; +// } +// sort(arr + 1, arr + n + 1, NumberCmp); +// compute(1, m, 0, INF); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class168/Code02_MatrixKth1.java b/src/class168/Code02_MatrixKth1.java deleted file mode 100644 index 87b88fc9e..000000000 --- a/src/class168/Code02_MatrixKth1.java +++ /dev/null @@ -1,184 +0,0 @@ -package class168; - -// 矩阵内第k小,java版 -// 给定一个n * n的矩阵,接下来有q条查询,格式如下 -// 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 -// 1 <= n <= 500 -// 1 <= q <= 6 * 10^4 -// 0 <= 矩阵中的数字 <= 10^9 -// 测试链接 : https://www.luogu.com.cn/problem/P1527 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.util.Arrays; - -public class Code02_MatrixKth1 { - - public static int MAXN = 501; - public static int MAXQ = 1000001; - public static int INF = 1000000001; - public static int n, q; - - // 矩阵中的每个数字,所在行x、所在列y、数值v - public static int[][] xyv = new int[MAXN * MAXN][3]; - public static int cntv = 0; - public static int used = 0; - - // 查询任务的编号 - public static int[] qid = new int[MAXQ]; - // 查询范围的左上角坐标 - public static int[] a = new int[MAXQ]; - public static int[] b = new int[MAXQ]; - // 查询范围的右下角坐标 - public static int[] c = new int[MAXQ]; - public static int[] d = new int[MAXQ]; - // 查询任务的第几小值 - public static int[] k = new int[MAXQ]; - - // 二维树状数组 - public static int[][] tree = new int[MAXN][MAXN]; - - // 整体二分 - public static int[] lset = new int[MAXQ]; - public static int[] rset = new int[MAXQ]; - - // 每条查询的答案 - public static int[] ans = new int[MAXQ]; - - public static int lowbit(int i) { - return i & -i; - } - - public static void add(int x, int y, int v) { - for (int i = x; i <= n; i += lowbit(i)) { - for (int j = y; j <= n; j += lowbit(j)) { - tree[i][j] += v; - } - } - } - - public static int sum(int x, int y) { - int ret = 0; - for (int i = x; i > 0; i -= lowbit(i)) { - for (int j = y; j > 0; j -= lowbit(j)) { - ret += tree[i][j]; - } - } - return ret; - } - - public static int query(int a, int b, int c, int d) { - return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1); - } - - public static void compute(int ql, int qr, int vl, int vr) { - if (ql > qr) { - return; - } - if (vl == vr) { - for (int i = ql; i <= qr; i++) { - ans[qid[i]] = vl; - } - } else { - int mid = (vl + vr) >> 1; - int lsiz = 0, rsiz = 0; - while (used + 1 <= cntv && xyv[used + 1][2] <= mid) { - used++; - add(xyv[used][0], xyv[used][1], 1); - } - while (used >= 1 && xyv[used][2] > mid) { - add(xyv[used][0], xyv[used][1], -1); - used--; - } - for (int i = ql; i <= qr; i++) { - int id = qid[i]; - int check = query(a[id], b[id], c[id], d[id]); - if (check >= k[id]) { - lset[++lsiz] = id; - } else { - rset[++rsiz] = id; - } - } - for (int i = 1; i <= lsiz; i++) { - qid[ql + i - 1] = lset[i]; - } - for (int i = 1; i <= rsiz; i++) { - qid[ql + lsiz + i - 1] = rset[i]; - } - compute(ql, ql + lsiz - 1, vl, mid); - compute(ql + lsiz, qr, mid + 1, vr); - } - } - - public static void main(String[] args) throws Exception { - FastReader in = new FastReader(System.in); - PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - n = in.nextInt(); - q = in.nextInt(); - for (int i = 1; i <= n; i++) { - for (int j = 1; j <= n; j++) { - xyv[++cntv][0] = i; - xyv[cntv][1] = j; - xyv[cntv][2] = in.nextInt(); - } - } - for (int i = 1; i <= q; i++) { - qid[i] = i; - a[i] = in.nextInt(); - b[i] = in.nextInt(); - c[i] = in.nextInt(); - d[i] = in.nextInt(); - k[i] = in.nextInt(); - } - Arrays.sort(xyv, 1, cntv + 1, (a, b) -> a[2] - b[2]); - compute(1, q, 0, INF); - for (int i = 1; i <= q; i++) { - out.println(ans[i]); - } - out.flush(); - out.close(); - } - - // 读写工具类 - static class FastReader { - private final byte[] buffer = new byte[1 << 16]; - private int ptr = 0, len = 0; - private final InputStream in; - - FastReader(InputStream in) { - this.in = in; - } - - private int readByte() throws IOException { - if (ptr >= len) { - len = in.read(buffer); - ptr = 0; - if (len <= 0) - return -1; - } - return buffer[ptr++]; - } - - int nextInt() throws IOException { - int c; - do { - c = readByte(); - } while (c <= ' ' && c != -1); - boolean neg = false; - if (c == '-') { - neg = true; - c = readByte(); - } - int val = 0; - while (c > ' ' && c != -1) { - val = val * 10 + (c - '0'); - c = readByte(); - } - return neg ? -val : val; - } - } - -} diff --git a/src/class168/Code02_MatrixKth2.java b/src/class168/Code02_MatrixKth2.java index 5f89826ed..e7f749dbe 100644 --- a/src/class168/Code02_MatrixKth2.java +++ b/src/class168/Code02_MatrixKth2.java @@ -1,134 +1,184 @@ package class168; -// 矩阵内第k小,C++版 +// 矩阵内第k小,第二种写法,java版 // 给定一个n * n的矩阵,接下来有q条查询,格式如下 // 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 // 1 <= n <= 500 // 1 <= q <= 6 * 10^4 // 0 <= 矩阵中的数字 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1527 -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 - -//#include -// -//using namespace std; -// -//struct Number { -// int x, y, v; -//}; -// -//bool NumberCmp(Number a, Number b) { -// return a.v < b.v; -//} -// -//const int MAXN = 501; -//const int MAXQ = 1000001; -//const int INF = 1000000001; -//int n, q; -// -//Number xyv[MAXN * MAXN]; -//int cntv = 0; -//int used = 0; -// -//int qid[MAXQ]; -//int a[MAXQ]; -//int b[MAXQ]; -//int c[MAXQ]; -//int d[MAXQ]; -//int k[MAXQ]; -// -//int tree[MAXN][MAXN]; -// -//int lset[MAXQ]; -//int rset[MAXQ]; -// -//int ans[MAXQ]; -// -//int lowbit(int i) { -// return i & -i; -//} -// -//void add(int x, int y, int v) { -// for (int i = x; i <= n; i += lowbit(i)) { -// for (int j = y; j <= n; j += lowbit(j)) { -// tree[i][j] += v; -// } -// } -//} -// -//int sum(int x, int y) { -// int ret = 0; -// for (int i = x; i > 0; i -= lowbit(i)) { -// for (int j = y; j > 0; j -= lowbit(j)) { -// ret += tree[i][j]; -// } -// } -// return ret; -//} -// -//int query(int a, int b, int c, int d) { -// return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1); -//} -// -//void compute(int ql, int qr, int vl, int vr) { -// if (ql > qr) { -// return; -// } -// if (vl == vr) { -// for (int i = ql; i <= qr; i++) { -// ans[qid[i]] = vl; -// } -// } else { -// int mid = (vl + vr) >> 1; -// int lsiz = 0, rsiz = 0; -// while (used + 1 <= cntv && xyv[used + 1].v <= mid) { -// used++; -// add(xyv[used].x, xyv[used].y, 1); -// } -// while (used >= 1 && xyv[used].v > mid) { -// add(xyv[used].x, xyv[used].y, -1); -// used--; -// } -// for (int i = ql; i <= qr; i++) { -// int id = qid[i]; -// int check = query(a[id], b[id], c[id], d[id]); -// if (check >= k[id]) { -// lset[++lsiz] = id; -// } else { -// rset[++rsiz] = id; -// } -// } -// for (int i = 1; i <= lsiz; i++) { -// qid[ql + i - 1] = lset[i]; -// } -// for (int i = 1; i <= rsiz; i++) { -// qid[ql + lsiz + i - 1] = rset[i]; -// } -// compute(ql, ql + lsiz - 1, vl, mid); -// compute(ql + lsiz, qr, mid + 1, vr); -// } -//} -// -//int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n >> q; -// for (int i = 1; i <= n; i++) { -// for (int j = 1; j <= n; j++) { -// xyv[++cntv].x = i; -// xyv[cntv].y = j; -// cin >> xyv[cntv].v; -// } -// } -// for (int i = 1; i <= q; i++) { -// qid[i] = i; -// cin >> a[i] >> b[i] >> c[i] >> d[i] >> k[i]; -// } -// sort(xyv + 1, xyv + cntv + 1, NumberCmp); -// compute(1, q, 0, INF); -// for (int i = 1; i <= q; i++) { -// cout << ans[i] << '\n'; -// } -// return 0; -//} \ No newline at end of file +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code02_MatrixKth2 { + + public static int MAXN = 501; + public static int MAXQ = 1000001; + public static int INF = 1000000001; + public static int n, q; + + // 矩阵中的每个数字,所在行x、所在列y、数值v + public static int[][] xyv = new int[MAXN * MAXN][3]; + public static int cntv = 0; + public static int used = 0; + + // 查询任务的编号 + public static int[] qid = new int[MAXQ]; + // 查询范围的左上角坐标 + public static int[] a = new int[MAXQ]; + public static int[] b = new int[MAXQ]; + // 查询范围的右下角坐标 + public static int[] c = new int[MAXQ]; + public static int[] d = new int[MAXQ]; + // 查询任务的第几小值 + public static int[] k = new int[MAXQ]; + + // 二维树状数组 + public static int[][] tree = new int[MAXN][MAXN]; + + // 整体二分 + public static int[] lset = new int[MAXQ]; + public static int[] rset = new int[MAXQ]; + + // 每条查询的答案 + public static int[] ans = new int[MAXQ]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int x, int y, int v) { + for (int i = x; i <= n; i += lowbit(i)) { + for (int j = y; j <= n; j += lowbit(j)) { + tree[i][j] += v; + } + } + } + + public static int sum(int x, int y) { + int ret = 0; + for (int i = x; i > 0; i -= lowbit(i)) { + for (int j = y; j > 0; j -= lowbit(j)) { + ret += tree[i][j]; + } + } + return ret; + } + + public static int query(int a, int b, int c, int d) { + return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1); + } + + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[qid[i]] = vl; + } + } else { + int mid = (vl + vr) >> 1; + int lsiz = 0, rsiz = 0; + while (used + 1 <= cntv && xyv[used + 1][2] <= mid) { + used++; + add(xyv[used][0], xyv[used][1], 1); + } + while (used >= 1 && xyv[used][2] > mid) { + add(xyv[used][0], xyv[used][1], -1); + used--; + } + for (int i = ql; i <= qr; i++) { + int id = qid[i]; + int satisfy = query(a[id], b[id], c[id], d[id]); + if (satisfy >= k[id]) { + lset[++lsiz] = id; + } else { + rset[++rsiz] = id; + } + } + for (int i = 1; i <= lsiz; i++) { + qid[ql + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + qid[ql + lsiz + i - 1] = rset[i]; + } + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + q = in.nextInt(); + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + xyv[++cntv][0] = i; + xyv[cntv][1] = j; + xyv[cntv][2] = in.nextInt(); + } + } + for (int i = 1; i <= q; i++) { + qid[i] = i; + a[i] = in.nextInt(); + b[i] = in.nextInt(); + c[i] = in.nextInt(); + d[i] = in.nextInt(); + k[i] = in.nextInt(); + } + Arrays.sort(xyv, 1, cntv + 1, (a, b) -> a[2] - b[2]); + compute(1, q, 0, INF); + for (int i = 1; i <= q; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class168/Code02_MatrixKth4.java b/src/class168/Code02_MatrixKth4.java new file mode 100644 index 000000000..329b5b61b --- /dev/null +++ b/src/class168/Code02_MatrixKth4.java @@ -0,0 +1,134 @@ +package class168; + +// 矩阵内第k小,第二种写法,C++版 +// 给定一个n * n的矩阵,接下来有q条查询,格式如下 +// 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 +// 1 <= n <= 500 +// 1 <= q <= 6 * 10^4 +// 0 <= 矩阵中的数字 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P1527 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Number { +// int x, y, v; +//}; +// +//bool NumberCmp(Number a, Number b) { +// return a.v < b.v; +//} +// +//const int MAXN = 501; +//const int MAXQ = 1000001; +//const int INF = 1000000001; +//int n, q; +// +//Number xyv[MAXN * MAXN]; +//int cntv = 0; +//int used = 0; +// +//int qid[MAXQ]; +//int a[MAXQ]; +//int b[MAXQ]; +//int c[MAXQ]; +//int d[MAXQ]; +//int k[MAXQ]; +// +//int tree[MAXN][MAXN]; +// +//int lset[MAXQ]; +//int rset[MAXQ]; +// +//int ans[MAXQ]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int x, int y, int v) { +// for (int i = x; i <= n; i += lowbit(i)) { +// for (int j = y; j <= n; j += lowbit(j)) { +// tree[i][j] += v; +// } +// } +//} +// +//int sum(int x, int y) { +// int ret = 0; +// for (int i = x; i > 0; i -= lowbit(i)) { +// for (int j = y; j > 0; j -= lowbit(j)) { +// ret += tree[i][j]; +// } +// } +// return ret; +//} +// +//int query(int a, int b, int c, int d) { +// return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1); +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = vl; +// } +// } else { +// int mid = (vl + vr) >> 1; +// int lsiz = 0, rsiz = 0; +// while (used + 1 <= cntv && xyv[used + 1].v <= mid) { +// used++; +// add(xyv[used].x, xyv[used].y, 1); +// } +// while (used >= 1 && xyv[used].v > mid) { +// add(xyv[used].x, xyv[used].y, -1); +// used--; +// } +// for (int i = ql; i <= qr; i++) { +// int id = qid[i]; +// int satisfy = query(a[id], b[id], c[id], d[id]); +// if (satisfy >= k[id]) { +// lset[++lsiz] = id; +// } else { +// rset[++rsiz] = id; +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// qid[ql + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// qid[ql + lsiz + i - 1] = rset[i]; +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1; i <= n; i++) { +// for (int j = 1; j <= n; j++) { +// xyv[++cntv].x = i; +// xyv[cntv].y = j; +// cin >> xyv[cntv].v; +// } +// } +// for (int i = 1; i <= q; i++) { +// qid[i] = i; +// cin >> a[i] >> b[i] >> c[i] >> d[i] >> k[i]; +// } +// sort(xyv + 1, xyv + cntv + 1, NumberCmp); +// compute(1, q, 0, INF); +// for (int i = 1; i <= q; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class169/Code03_Fruit1.java b/src/class169/Code03_Fruit1.java index c17a4e92f..db0f585eb 100644 --- a/src/class169/Code03_Fruit1.java +++ b/src/class169/Code03_Fruit1.java @@ -228,11 +228,11 @@ public static void compute(int ql, int qr, int vl, int vr) { clone(rset[++rsiz], event[i]); } } else { - int check = query(event[i][2]); - if (check >= event[i][4]) { + int satisfy = query(event[i][2]); + if (satisfy >= event[i][4]) { clone(lset[++lsiz], event[i]); } else { - event[i][4] -= check; + event[i][4] -= satisfy; clone(rset[++rsiz], event[i]); } } diff --git a/src/class169/Code03_Fruit2.java b/src/class169/Code03_Fruit2.java index f05b53be3..e3150f87e 100644 --- a/src/class169/Code03_Fruit2.java +++ b/src/class169/Code03_Fruit2.java @@ -175,11 +175,11 @@ // rset[++rsiz] = event[i]; // } // } else { -// int check = query(event[i].yl); -// if (check >= event[i].v) { +// int satisfy = query(event[i].yl); +// if (satisfy >= event[i].v) { // lset[++lsiz] = event[i]; // } else { -// event[i].v -= check; +// event[i].v -= satisfy; // rset[++rsiz] = event[i]; // } // } From 73645cd5cd2a0da87298b4f4eda9b509f74e71aa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 May 2025 21:13:56 +0800 Subject: [PATCH 0124/1170] modify code --- src/class168/Code02_MatrixKth1.java | 181 ++++++++++++++++++++++++++++ src/class168/Code02_MatrixKth3.java | 131 ++++++++++++++++++++ 2 files changed, 312 insertions(+) create mode 100644 src/class168/Code02_MatrixKth1.java create mode 100644 src/class168/Code02_MatrixKth3.java diff --git a/src/class168/Code02_MatrixKth1.java b/src/class168/Code02_MatrixKth1.java new file mode 100644 index 000000000..a183d7247 --- /dev/null +++ b/src/class168/Code02_MatrixKth1.java @@ -0,0 +1,181 @@ +package class168; + +// 矩阵内第k小,第一种写法,java版 +// 给定一个n * n的矩阵,接下来有q条查询,格式如下 +// 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 +// 1 <= n <= 500 +// 1 <= q <= 6 * 10^4 +// 0 <= 矩阵中的数字 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P1527 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code02_MatrixKth1 { + + public static int MAXN = 501; + public static int MAXQ = 1000001; + public static int n, q; + + // 矩阵中的每个数字,所在行x、所在列y、数值v + public static int[][] xyv = new int[MAXN * MAXN][3]; + public static int cntv = 0; + + // 查询任务的编号 + public static int[] qid = new int[MAXQ]; + // 查询范围的左上角坐标 + public static int[] a = new int[MAXQ]; + public static int[] b = new int[MAXQ]; + // 查询范围的右下角坐标 + public static int[] c = new int[MAXQ]; + public static int[] d = new int[MAXQ]; + // 查询任务的第几小值 + public static int[] k = new int[MAXQ]; + + // 二维树状数组 + public static int[][] tree = new int[MAXN][MAXN]; + + // 整体二分 + public static int[] lset = new int[MAXQ]; + public static int[] rset = new int[MAXQ]; + + // 每条查询的答案 + public static int[] ans = new int[MAXQ]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int x, int y, int v) { + for (int i = x; i <= n; i += lowbit(i)) { + for (int j = y; j <= n; j += lowbit(j)) { + tree[i][j] += v; + } + } + } + + public static int sum(int x, int y) { + int ret = 0; + for (int i = x; i > 0; i -= lowbit(i)) { + for (int j = y; j > 0; j -= lowbit(j)) { + ret += tree[i][j]; + } + } + return ret; + } + + public static int query(int a, int b, int c, int d) { + return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1); + } + + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[qid[i]] = xyv[vl][2]; + } + } else { + int mid = (vl + vr) >> 1; + for (int i = vl; i <= mid; i++) { + add(xyv[i][0], xyv[i][1], 1); + } + int lsiz = 0, rsiz = 0; + for (int i = ql; i <= qr; i++) { + int id = qid[i]; + int satisfy = query(a[id], b[id], c[id], d[id]); + if (satisfy >= k[id]) { + lset[++lsiz] = id; + } else { + k[id] -= satisfy; + rset[++rsiz] = id; + } + } + for (int i = 1; i <= lsiz; i++) { + qid[ql + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + qid[ql + lsiz + i - 1] = rset[i]; + } + for (int i = vl; i <= mid; i++) { + add(xyv[i][0], xyv[i][1], -1); + } + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + q = in.nextInt(); + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + xyv[++cntv][0] = i; + xyv[cntv][1] = j; + xyv[cntv][2] = in.nextInt(); + } + } + for (int i = 1; i <= q; i++) { + qid[i] = i; + a[i] = in.nextInt(); + b[i] = in.nextInt(); + c[i] = in.nextInt(); + d[i] = in.nextInt(); + k[i] = in.nextInt(); + } + Arrays.sort(xyv, 1, cntv + 1, (a, b) -> a[2] - b[2]); + compute(1, q, 1, cntv); + for (int i = 1; i <= q; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class168/Code02_MatrixKth3.java b/src/class168/Code02_MatrixKth3.java new file mode 100644 index 000000000..1bd6212b7 --- /dev/null +++ b/src/class168/Code02_MatrixKth3.java @@ -0,0 +1,131 @@ +package class168; + +// 矩阵内第k小,第一种写法,C++版 +// 给定一个n * n的矩阵,接下来有q条查询,格式如下 +// 查询 a b c d k : 左上角(a, b),右下角(c, d),打印该区域中第k小的数 +// 1 <= n <= 500 +// 1 <= q <= 6 * 10^4 +// 0 <= 矩阵中的数字 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P1527 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Number { +// int x, y, v; +//}; +// +//bool NumberCmp(Number a, Number b) { +// return a.v < b.v; +//} +// +//const int MAXN = 501; +//const int MAXQ = 1000001; +//int n, q; +// +//Number xyv[MAXN * MAXN]; +//int cntv = 0; +// +//int qid[MAXQ]; +//int a[MAXQ]; +//int b[MAXQ]; +//int c[MAXQ]; +//int d[MAXQ]; +//int k[MAXQ]; +// +//int tree[MAXN][MAXN]; +// +//int lset[MAXQ]; +//int rset[MAXQ]; +// +//int ans[MAXQ]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int x, int y, int v) { +// for (int i = x; i <= n; i += lowbit(i)) { +// for (int j = y; j <= n; j += lowbit(j)) { +// tree[i][j] += v; +// } +// } +//} +// +//int sum(int x, int y) { +// int ret = 0; +// for (int i = x; i > 0; i -= lowbit(i)) { +// for (int j = y; j > 0; j -= lowbit(j)) { +// ret += tree[i][j]; +// } +// } +// return ret; +//} +// +//int query(int a, int b, int c, int d) { +// return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1); +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = xyv[vl].v; +// } +// } else { +// int mid = (vl + vr) >> 1; +// for (int i = vl; i <= mid; i++) { +// add(xyv[i].x, xyv[i].y, 1); +// } +// int lsiz = 0, rsiz = 0; +// for (int i = ql; i <= qr; i++) { +// int id = qid[i]; +// int satisfy = query(a[id], b[id], c[id], d[id]); +// if (satisfy >= k[id]) { +// lset[++lsiz] = id; +// } else { +// k[id] -= satisfy; +// rset[++rsiz] = id; +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// qid[ql + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// qid[ql + lsiz + i - 1] = rset[i]; +// } +// for (int i = vl; i <= mid; i++) { +// add(xyv[i].x, xyv[i].y, -1); +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1; i <= n; i++) { +// for (int j = 1; j <= n; j++) { +// xyv[++cntv].x = i; +// xyv[cntv].y = j; +// cin >> xyv[cntv].v; +// } +// } +// for (int i = 1; i <= q; i++) { +// qid[i] = i; +// cin >> a[i] >> b[i] >> c[i] >> d[i] >> k[i]; +// } +// sort(xyv + 1, xyv + cntv + 1, NumberCmp); +// compute(1, q, 1, cntv); +// for (int i = 1; i <= q; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 59d682e04f9a58c2c3e8a22b512b00e52b340880 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 May 2025 21:29:11 +0800 Subject: [PATCH 0125/1170] modify code --- src/class168/Code03_Meteors1.java | 20 +- src/class168/Code03_Meteors2.java | 326 +++++++++++++++++------------- src/class168/Code03_Meteors3.java | 145 +++++++++++++ src/class168/Code03_Meteors4.java | 147 ++++++++++++++ 4 files changed, 489 insertions(+), 149 deletions(-) create mode 100644 src/class168/Code03_Meteors3.java create mode 100644 src/class168/Code03_Meteors4.java diff --git a/src/class168/Code03_Meteors1.java b/src/class168/Code03_Meteors1.java index 3b2e09019..494feccc6 100644 --- a/src/class168/Code03_Meteors1.java +++ b/src/class168/Code03_Meteors1.java @@ -1,6 +1,6 @@ package class168; -// 陨石雨,java版 +// 陨石雨,第一种写法,java版 // 一共有n个国家,给定n个数字,表示每个国家希望收集到的陨石数量 // 一共有m个区域,1号区顺时针到2号区...m号区顺时针到1号区,即环形相连 // 每个区域只属于某一个国家,给定m个数字,表示每个区域归属给哪个国家 @@ -12,7 +12,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 // 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 -// 想通过用C++实现,本节课Code03_Meteors2文件就是C++的实现 +// 想通过用C++实现,本节课Code03_Meteors3文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -31,7 +31,6 @@ public class Code03_Meteors1 { public static int[] rainl = new int[MAXN]; public static int[] rainr = new int[MAXN]; public static int[] num = new int[MAXN]; - public static int used = 0; public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN]; @@ -87,15 +86,10 @@ public static void compute(int ql, int qr, int vl, int vr) { } } else { int mid = (vl + vr) >> 1; - int lsiz = 0, rsiz = 0; - while (used < mid) { - used++; - add(rainl[used], rainr[used], num[used]); - } - while (used > mid) { - add(rainl[used], rainr[used], -num[used]); - used--; + for (int i = vl; i <= mid; i++) { + add(rainl[i], rainr[i], num[i]); } + int lsiz = 0, rsiz = 0; for (int i = ql; i <= qr; i++) { int id = qid[i]; long satisfy = 0; @@ -108,6 +102,7 @@ public static void compute(int ql, int qr, int vl, int vr) { if (satisfy >= need[id]) { lset[++lsiz] = id; } else { + need[id] -= satisfy; rset[++rsiz] = id; } } @@ -117,6 +112,9 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } + for (int i = vl; i <= mid; i++) { + add(rainl[i], rainr[i], -num[i]); + } compute(ql, ql + lsiz - 1, vl, mid); compute(ql + lsiz, qr, mid + 1, vr); } diff --git a/src/class168/Code03_Meteors2.java b/src/class168/Code03_Meteors2.java index 458d40b0f..1b25d9408 100644 --- a/src/class168/Code03_Meteors2.java +++ b/src/class168/Code03_Meteors2.java @@ -1,6 +1,6 @@ package class168; -// 陨石雨,C++版 +// 陨石雨,第二种写法,java版 // 一共有n个国家,给定n个数字,表示每个国家希望收集到的陨石数量 // 一共有m个区域,1号区顺时针到2号区...m号区顺时针到1号区,即环形相连 // 每个区域只属于某一个国家,给定m个数字,表示每个区域归属给哪个国家 @@ -9,140 +9,190 @@ // 打印每个国家经历前几场陨石雨,可以达到收集要求,如果无法满足,打印"NIE" // 1 <= n、m、k <= 3 * 10^5 1 <= 陨石数量 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3527 -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 - -//#include -// -//using namespace std; -// -//const int MAXN = 300001; -// -//int n, m, k; -// -//int qid[MAXN]; -//int need[MAXN]; -// -//int rainl[MAXN]; -//int rainr[MAXN]; -//int num[MAXN]; -//int used = 0; -// -//int head[MAXN]; -//int nxt[MAXN]; -//int to[MAXN]; -//int cnt = 0; -// -//long long tree[MAXN << 1]; -// -//int lset[MAXN]; -//int rset[MAXN]; -// -//int ans[MAXN]; -// -//void addEdge(int i, int v) { -// nxt[++cnt] = head[i]; -// to[cnt] = v; -// head[i] = cnt; -//} -// -//int lowbit(int i) { -// return i & -i; -//} -// -//void add(int i, int v) { -// int siz = m * 2; -// while (i <= siz) { -// tree[i] += v; -// i += lowbit(i); -// } -//} -// -//void add(int l, int r, int v) { -// add(l, v); -// add(r + 1, -v); -//} -// -//long long query(int i) { -// long long ret = 0; -// while (i > 0) { -// ret += tree[i]; -// i -= lowbit(i); -// } -// return ret; -//} -// -//void compute(int ql, int qr, int vl, int vr) { -// if (ql > qr) { -// return; -// } -// if (vl == vr) { -// for (int i = ql; i <= qr; i++) { -// ans[qid[i]] = vl; -// } -// } else { -// int mid = (vl + vr) >> 1; -// int lsiz = 0, rsiz = 0; -// while (used < mid) { -// used++; -// add(rainl[used], rainr[used], num[used]); -// } -// while (used > mid) { -// add(rainl[used], rainr[used], -num[used]); -// used--; -// } -// for (int i = ql; i <= qr; i++) { -// int id = qid[i]; -// long long satisfy = 0; -// for (int e = head[id]; e > 0; e = nxt[e]) { -// satisfy += query(to[e]) + query(to[e] + m); -// if (satisfy >= need[id]) { -// break; -// } -// } -// if (satisfy >= need[id]) { -// lset[++lsiz] = id; -// } else { -// rset[++rsiz] = id; -// } -// } -// for (int i = 1; i <= lsiz; i++) { -// qid[ql + i - 1] = lset[i]; -// } -// for (int i = 1; i <= rsiz; i++) { -// qid[ql + lsiz + i - 1] = rset[i]; -// } -// compute(ql, ql + lsiz - 1, vl, mid); -// compute(ql + lsiz, qr, mid + 1, vr); -// } -//} -// -//int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n >> m; -// for (int i = 1, nation; i <= m; i++) { -// cin >> nation; -// addEdge(nation, i); -// } -// for (int i = 1; i <= n; i++) { -// qid[i] = i; -// cin >> need[i]; -// } -// cin >> k; -// for (int i = 1; i <= k; i++) { -// cin >> rainl[i] >> rainr[i] >> num[i]; -// if (rainr[i] < rainl[i]) { -// rainr[i] += m; -// } -// } -// compute(1, n, 1, k + 1); -// for (int i = 1; i <= n; i++) { -// if (ans[i] == k + 1) { -// cout << "NIE" << '\n'; -// } else { -// cout << ans[i] << '\n'; -// } -// } -// return 0; -//} \ No newline at end of file +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 +// 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 +// 想通过用C++实现,本节课Code03_Meteors4文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code03_Meteors2 { + + public static int MAXN = 300001; + public static int n, m, k; + + public static int[] qid = new int[MAXN]; + public static int[] need = new int[MAXN]; + + public static int[] rainl = new int[MAXN]; + public static int[] rainr = new int[MAXN]; + public static int[] num = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN]; + public static int[] to = new int[MAXN]; + public static int cnt = 0; + + public static long[] tree = new long[MAXN << 1]; + public static int used = 0; + + public static int[] lset = new int[MAXN]; + public static int[] rset = new int[MAXN]; + + public static int[] ans = new int[MAXN]; + + public static void addEdge(int i, int v) { + next[++cnt] = head[i]; + to[cnt] = v; + head[i] = cnt; + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + int siz = m * 2; + while (i <= siz) { + tree[i] += v; + i += lowbit(i); + } + } + + public static void add(int l, int r, int v) { + add(l, v); + add(r + 1, -v); + } + + public static long query(int i) { + long ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static void compute(int ql, int qr, int vl, int vr) { + if (ql > qr) { + return; + } + if (vl == vr) { + for (int i = ql; i <= qr; i++) { + ans[qid[i]] = vl; + } + } else { + int mid = (vl + vr) >> 1; + int lsiz = 0, rsiz = 0; + while (used < mid) { + used++; + add(rainl[used], rainr[used], num[used]); + } + while (used > mid) { + add(rainl[used], rainr[used], -num[used]); + used--; + } + for (int i = ql; i <= qr; i++) { + int id = qid[i]; + long satisfy = 0; + for (int e = head[id]; e > 0; e = next[e]) { + satisfy += query(to[e]) + query(to[e] + m); + if (satisfy >= need[id]) { + break; + } + } + if (satisfy >= need[id]) { + lset[++lsiz] = id; + } else { + rset[++rsiz] = id; + } + } + for (int i = 1; i <= lsiz; i++) { + qid[ql + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + qid[ql + lsiz + i - 1] = rset[i]; + } + compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, nation; i <= m; i++) { + nation = in.nextInt(); + addEdge(nation, i); + } + for (int i = 1; i <= n; i++) { + qid[i] = i; + need[i] = in.nextInt(); + } + k = in.nextInt(); + for (int i = 1; i <= k; i++) { + rainl[i] = in.nextInt(); + rainr[i] = in.nextInt(); + if (rainr[i] < rainl[i]) { + rainr[i] += m; + } + num[i] = in.nextInt(); + } + compute(1, n, 1, k + 1); + for (int i = 1; i <= n; i++) { + if (ans[i] == k + 1) { + out.println("NIE"); + } else { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class168/Code03_Meteors3.java b/src/class168/Code03_Meteors3.java new file mode 100644 index 000000000..ad30c4a14 --- /dev/null +++ b/src/class168/Code03_Meteors3.java @@ -0,0 +1,145 @@ +package class168; + +// 陨石雨,第一种写法,C++版 +// 一共有n个国家,给定n个数字,表示每个国家希望收集到的陨石数量 +// 一共有m个区域,1号区顺时针到2号区...m号区顺时针到1号区,即环形相连 +// 每个区域只属于某一个国家,给定m个数字,表示每个区域归属给哪个国家 +// 接下来会依次发生k场陨石雨,陨石雨格式 l r num,含义如下 +// 从l号区顺时针到r号区发生了陨石雨,每个区域都增加num个陨石 +// 打印每个国家经历前几场陨石雨,可以达到收集要求,如果无法满足,打印"NIE" +// 1 <= n、m、k <= 3 * 10^5 1 <= 陨石数量 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P3527 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//int n, m, k; +// +//int qid[MAXN]; +//int need[MAXN]; +// +//int rainl[MAXN]; +//int rainr[MAXN]; +//int num[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN]; +//int to[MAXN]; +//int cnt = 0; +// +//long long tree[MAXN << 1]; +// +//int lset[MAXN]; +//int rset[MAXN]; +// +//int ans[MAXN]; +// +//void addEdge(int i, int v) { +// nxt[++cnt] = head[i]; +// to[cnt] = v; +// head[i] = cnt; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// int siz = m * 2; +// while (i <= siz) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//void add(int l, int r, int v) { +// add(l, v); +// add(r + 1, -v); +//} +// +//long long query(int i) { +// long long ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = vl; +// } +// } else { +// int mid = (vl + vr) >> 1; +// for (int i = vl; i <= mid; i++) { +// add(rainl[i], rainr[i], num[i]); +// } +// int lsiz = 0, rsiz = 0; +// for (int i = ql; i <= qr; i++) { +// int id = qid[i]; +// long long satisfy = 0; +// for (int e = head[id]; e > 0; e = nxt[e]) { +// satisfy += query(to[e]) + query(to[e] + m); +// if (satisfy >= need[id]) { +// break; +// } +// } +// if (satisfy >= need[id]) { +// lset[++lsiz] = id; +// } else { +// need[id] -= satisfy; +// rset[++rsiz] = id; +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// qid[ql + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// qid[ql + lsiz + i - 1] = rset[i]; +// } +// for (int i = vl; i <= mid; i++) { +// add(rainl[i], rainr[i], -num[i]); +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, nation; i <= m; i++) { +// cin >> nation; +// addEdge(nation, i); +// } +// for (int i = 1; i <= n; i++) { +// qid[i] = i; +// cin >> need[i]; +// } +// cin >> k; +// for (int i = 1; i <= k; i++) { +// cin >> rainl[i] >> rainr[i] >> num[i]; +// if (rainr[i] < rainl[i]) { +// rainr[i] += m; +// } +// } +// compute(1, n, 1, k + 1); +// for (int i = 1; i <= n; i++) { +// if (ans[i] == k + 1) { +// cout << "NIE" << '\n'; +// } else { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class168/Code03_Meteors4.java b/src/class168/Code03_Meteors4.java new file mode 100644 index 000000000..5353778a0 --- /dev/null +++ b/src/class168/Code03_Meteors4.java @@ -0,0 +1,147 @@ +package class168; + +// 陨石雨,第二种写法,C++版 +// 一共有n个国家,给定n个数字,表示每个国家希望收集到的陨石数量 +// 一共有m个区域,1号区顺时针到2号区...m号区顺时针到1号区,即环形相连 +// 每个区域只属于某一个国家,给定m个数字,表示每个区域归属给哪个国家 +// 接下来会依次发生k场陨石雨,陨石雨格式 l r num,含义如下 +// 从l号区顺时针到r号区发生了陨石雨,每个区域都增加num个陨石 +// 打印每个国家经历前几场陨石雨,可以达到收集要求,如果无法满足,打印"NIE" +// 1 <= n、m、k <= 3 * 10^5 1 <= 陨石数量 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P3527 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//int n, m, k; +// +//int qid[MAXN]; +//int need[MAXN]; +// +//int rainl[MAXN]; +//int rainr[MAXN]; +//int num[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN]; +//int to[MAXN]; +//int cnt = 0; +// +//long long tree[MAXN << 1]; +//int used = 0; +// +//int lset[MAXN]; +//int rset[MAXN]; +// +//int ans[MAXN]; +// +//void addEdge(int i, int v) { +// nxt[++cnt] = head[i]; +// to[cnt] = v; +// head[i] = cnt; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// int siz = m * 2; +// while (i <= siz) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//void add(int l, int r, int v) { +// add(l, v); +// add(r + 1, -v); +//} +// +//long long query(int i) { +// long long ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void compute(int ql, int qr, int vl, int vr) { +// if (ql > qr) { +// return; +// } +// if (vl == vr) { +// for (int i = ql; i <= qr; i++) { +// ans[qid[i]] = vl; +// } +// } else { +// int mid = (vl + vr) >> 1; +// int lsiz = 0, rsiz = 0; +// while (used < mid) { +// used++; +// add(rainl[used], rainr[used], num[used]); +// } +// while (used > mid) { +// add(rainl[used], rainr[used], -num[used]); +// used--; +// } +// for (int i = ql; i <= qr; i++) { +// int id = qid[i]; +// long long satisfy = 0; +// for (int e = head[id]; e > 0; e = nxt[e]) { +// satisfy += query(to[e]) + query(to[e] + m); +// if (satisfy >= need[id]) { +// break; +// } +// } +// if (satisfy >= need[id]) { +// lset[++lsiz] = id; +// } else { +// rset[++rsiz] = id; +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// qid[ql + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// qid[ql + lsiz + i - 1] = rset[i]; +// } +// compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, nation; i <= m; i++) { +// cin >> nation; +// addEdge(nation, i); +// } +// for (int i = 1; i <= n; i++) { +// qid[i] = i; +// cin >> need[i]; +// } +// cin >> k; +// for (int i = 1; i <= k; i++) { +// cin >> rainl[i] >> rainr[i] >> num[i]; +// if (rainr[i] < rainl[i]) { +// rainr[i] += m; +// } +// } +// compute(1, n, 1, k + 1); +// for (int i = 1; i <= n; i++) { +// if (ans[i] == k + 1) { +// cout << "NIE" << '\n'; +// } else { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From fb26df198480d10cab1948653373ba0aba7e7f05 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 12:18:11 +0800 Subject: [PATCH 0126/1170] modify code --- src/class168/Code01_RangeKth2.java | 3 ++- src/class168/Code01_RangeKth4.java | 2 +- src/class168/Code02_MatrixKth2.java | 3 ++- src/class168/Code02_MatrixKth4.java | 2 +- src/class168/Code03_Meteors2.java | 3 ++- src/class168/Code03_Meteors4.java | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index 98d0f010a..1e40503a4 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -99,8 +99,9 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } - compute(ql, ql + lsiz - 1, vl, mid); + // 先右后左 compute(ql + lsiz, qr, mid + 1, vr); + compute(ql, ql + lsiz - 1, vl, mid); } } diff --git a/src/class168/Code01_RangeKth4.java b/src/class168/Code01_RangeKth4.java index b869d9fc4..dd0bf1f8d 100644 --- a/src/class168/Code01_RangeKth4.java +++ b/src/class168/Code01_RangeKth4.java @@ -99,8 +99,8 @@ // for (int i = 1; i <= rsiz; i++) { // qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(ql, ql + lsiz - 1, vl, mid); // compute(ql + lsiz, qr, mid + 1, vr); +// compute(ql, ql + lsiz - 1, vl, mid); // } //} // diff --git a/src/class168/Code02_MatrixKth2.java b/src/class168/Code02_MatrixKth2.java index e7f749dbe..20dc6e7a8 100644 --- a/src/class168/Code02_MatrixKth2.java +++ b/src/class168/Code02_MatrixKth2.java @@ -108,8 +108,9 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } - compute(ql, ql + lsiz - 1, vl, mid); + // 先右后左 compute(ql + lsiz, qr, mid + 1, vr); + compute(ql, ql + lsiz - 1, vl, mid); } } diff --git a/src/class168/Code02_MatrixKth4.java b/src/class168/Code02_MatrixKth4.java index 329b5b61b..344259cd2 100644 --- a/src/class168/Code02_MatrixKth4.java +++ b/src/class168/Code02_MatrixKth4.java @@ -105,8 +105,8 @@ // for (int i = 1; i <= rsiz; i++) { // qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(ql, ql + lsiz - 1, vl, mid); // compute(ql + lsiz, qr, mid + 1, vr); +// compute(ql, ql + lsiz - 1, vl, mid); // } //} // diff --git a/src/class168/Code03_Meteors2.java b/src/class168/Code03_Meteors2.java index 1b25d9408..0eb9db33d 100644 --- a/src/class168/Code03_Meteors2.java +++ b/src/class168/Code03_Meteors2.java @@ -117,8 +117,9 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } - compute(ql, ql + lsiz - 1, vl, mid); + // 先右后左 compute(ql + lsiz, qr, mid + 1, vr); + compute(ql, ql + lsiz - 1, vl, mid); } } diff --git a/src/class168/Code03_Meteors4.java b/src/class168/Code03_Meteors4.java index 5353778a0..868277333 100644 --- a/src/class168/Code03_Meteors4.java +++ b/src/class168/Code03_Meteors4.java @@ -111,8 +111,8 @@ // for (int i = 1; i <= rsiz; i++) { // qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(ql, ql + lsiz - 1, vl, mid); // compute(ql + lsiz, qr, mid + 1, vr); +// compute(ql, ql + lsiz - 1, vl, mid); // } //} // From 04d6fe1c8989cb92e76449a5f0026ff91eabecdf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 12:22:38 +0800 Subject: [PATCH 0127/1170] modify code --- src/class168/Code01_RangeKth2.java | 6 +----- src/class168/Code02_MatrixKth2.java | 11 ++--------- src/class168/Code02_MatrixKth4.java | 2 +- src/class168/Code03_Meteors2.java | 1 + 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index 1e40503a4..011579bc7 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -21,24 +21,20 @@ public class Code01_RangeKth2 { public static int INF = 1000000001; public static int n, m; - // 位置i,数值v public static int[][] arr = new int[MAXN][2]; - // 查询 public static int[] qid = new int[MAXN]; public static int[] l = new int[MAXN]; public static int[] r = new int[MAXN]; public static int[] k = new int[MAXN]; - // 树状数组 public static int[] tree = new int[MAXN]; + // 操作使用的数量 public static int used = 0; - // 整体二分 public static int[] lset = new int[MAXN]; public static int[] rset = new int[MAXN]; - // 查询的答案 public static int[] ans = new int[MAXN]; public static int lowbit(int i) { diff --git a/src/class168/Code02_MatrixKth2.java b/src/class168/Code02_MatrixKth2.java index 20dc6e7a8..8aa39ae66 100644 --- a/src/class168/Code02_MatrixKth2.java +++ b/src/class168/Code02_MatrixKth2.java @@ -22,30 +22,23 @@ public class Code02_MatrixKth2 { public static int INF = 1000000001; public static int n, q; - // 矩阵中的每个数字,所在行x、所在列y、数值v public static int[][] xyv = new int[MAXN * MAXN][3]; public static int cntv = 0; - public static int used = 0; - // 查询任务的编号 public static int[] qid = new int[MAXQ]; - // 查询范围的左上角坐标 public static int[] a = new int[MAXQ]; public static int[] b = new int[MAXQ]; - // 查询范围的右下角坐标 public static int[] c = new int[MAXQ]; public static int[] d = new int[MAXQ]; - // 查询任务的第几小值 public static int[] k = new int[MAXQ]; - // 二维树状数组 public static int[][] tree = new int[MAXN][MAXN]; + // 操作使用的数量 + public static int used = 0; - // 整体二分 public static int[] lset = new int[MAXQ]; public static int[] rset = new int[MAXQ]; - // 每条查询的答案 public static int[] ans = new int[MAXQ]; public static int lowbit(int i) { diff --git a/src/class168/Code02_MatrixKth4.java b/src/class168/Code02_MatrixKth4.java index 344259cd2..3b530c101 100644 --- a/src/class168/Code02_MatrixKth4.java +++ b/src/class168/Code02_MatrixKth4.java @@ -29,7 +29,6 @@ // //Number xyv[MAXN * MAXN]; //int cntv = 0; -//int used = 0; // //int qid[MAXQ]; //int a[MAXQ]; @@ -39,6 +38,7 @@ //int k[MAXQ]; // //int tree[MAXN][MAXN]; +//int used = 0; // //int lset[MAXQ]; //int rset[MAXQ]; diff --git a/src/class168/Code03_Meteors2.java b/src/class168/Code03_Meteors2.java index 0eb9db33d..183eb2cbd 100644 --- a/src/class168/Code03_Meteors2.java +++ b/src/class168/Code03_Meteors2.java @@ -38,6 +38,7 @@ public class Code03_Meteors2 { public static int cnt = 0; public static long[] tree = new long[MAXN << 1]; + // 操作使用的数量 public static int used = 0; public static int[] lset = new int[MAXN]; From 987ee2a34de153e2c019c1cafa446157ad5edf28 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 12:26:19 +0800 Subject: [PATCH 0128/1170] modify code --- src/class168/Code01_RangeKth1.java | 2 +- src/class168/Code01_RangeKth2.java | 2 +- src/class168/Code01_RangeKth3.java | 2 +- src/class168/Code01_RangeKth4.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class168/Code01_RangeKth1.java b/src/class168/Code01_RangeKth1.java index c457172ba..d4625a808 100644 --- a/src/class168/Code01_RangeKth1.java +++ b/src/class168/Code01_RangeKth1.java @@ -1,12 +1,12 @@ package class168; // 区间内第k小,第一种写法,java版 -// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 给定一个长度为n的数组,接下来有m条查询,格式如下 // 查询 l r k : 打印[l..r]范围内第k小的值 // 1 <= n、m <= 2 * 10^5 // 1 <= 数组中的数字 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index 011579bc7..0d024bd6e 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -1,12 +1,12 @@ package class168; // 区间内第k小,第二种写法,java版 -// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 给定一个长度为n的数组,接下来有m条查询,格式如下 // 查询 l r k : 打印[l..r]范围内第k小的值 // 1 <= n、m <= 2 * 10^5 // 1 <= 数组中的数字 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; diff --git a/src/class168/Code01_RangeKth3.java b/src/class168/Code01_RangeKth3.java index dba9e5465..b80ce20a0 100644 --- a/src/class168/Code01_RangeKth3.java +++ b/src/class168/Code01_RangeKth3.java @@ -1,12 +1,12 @@ package class168; // 区间内第k小,第一种写法,C++版 -// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 给定一个长度为n的数组,接下来有m条查询,格式如下 // 查询 l r k : 打印[l..r]范围内第k小的值 // 1 <= n、m <= 2 * 10^5 // 1 <= 数组中的数字 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class168/Code01_RangeKth4.java b/src/class168/Code01_RangeKth4.java index dd0bf1f8d..4ecd937ed 100644 --- a/src/class168/Code01_RangeKth4.java +++ b/src/class168/Code01_RangeKth4.java @@ -1,12 +1,12 @@ package class168; // 区间内第k小,第二种写法,C++版 -// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 给定一个长度为n的数组,接下来有m条查询,格式如下 // 查询 l r k : 打印[l..r]范围内第k小的值 // 1 <= n、m <= 2 * 10^5 // 1 <= 数组中的数字 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 本题是讲解157,可持久化线段树模版题,现在作为整体二分的模版题 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 6c2e8aa0e86bb9501a3bc3ceb88747c9c48dbc9c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 15:32:45 +0800 Subject: [PATCH 0129/1170] modify code --- src/class169/Code04_Network1.java | 47 ++++++++++++------------ src/class169/Code04_Network2.java | 59 ++++++++++++++++--------------- 2 files changed, 55 insertions(+), 51 deletions(-) diff --git a/src/class169/Code04_Network1.java b/src/class169/Code04_Network1.java index 8be1de6e4..ac3caf07f 100644 --- a/src/class169/Code04_Network1.java +++ b/src/class169/Code04_Network1.java @@ -44,16 +44,17 @@ public class Code04_Network1 { // 从早到晚发生的事件,op、x、y、v // op == 0,添加点x到点y,重要度为v的路径 - // op == -1,删除点x到点y,重要度为v的路径 - // op > 0,那么op表示问题的编号,查询和x相关的答案 + // op == 1,删除点x到点y,重要度为v的路径 + // op == 2,查询和x相关的答案,y表示问题的编号 public static int[][] event = new int[MAXM][4]; + // 查询问题的数量 + public static int cntq = 0; // 整体二分 public static int[][] lset = new int[MAXM][4]; public static int[][] rset = new int[MAXM][4]; public static int[] ans = new int[MAXM]; - public static int cntans = 0; public static void addEdge(int u, int v) { next[++cntg] = head[u]; @@ -201,8 +202,8 @@ public static void compute(int ql, int qr, int vl, int vr) { } if (vl == vr) { for (int i = ql; i <= qr; i++) { - if (event[i][0] > 0) { - ans[event[i][0]] = vl; + if (event[i][0] == 2) { + ans[event[i][2]] = vl; } } } else { @@ -210,26 +211,27 @@ public static void compute(int ql, int qr, int vl, int vr) { int lsize = 0, rsize = 0, request = 0; for (int i = ql; i <= qr; i++) { if (event[i][0] == 0) { - if (event[i][3] > mid) { + if (event[i][3] <= mid) { + clone(lset[++lsize], event[i]); + } else { pathAdd(event[i][1], event[i][2], 1); - clone(rset[++rsize], event[i]); request++; - } else { - clone(lset[++lsize], event[i]); + clone(rset[++rsize], event[i]); + } - } else if (event[i][0] == -1) { - if (event[i][3] > mid) { + } else if (event[i][0] == 1) { + if (event[i][3] <= mid) { + clone(lset[++lsize], event[i]); + } else { pathAdd(event[i][1], event[i][2], -1); - clone(rset[++rsize], event[i]); request--; - } else { - clone(lset[++lsize], event[i]); + clone(rset[++rsize], event[i]); } } else { - if (pointQuery(event[i][1]) != request) { - clone(rset[++rsize], event[i]); - } else { + if (pointQuery(event[i][1]) == request) { clone(lset[++lsize], event[i]); + } else { + clone(rset[++rsize], event[i]); } } } @@ -237,7 +239,7 @@ public static void compute(int ql, int qr, int vl, int vr) { if (rset[i][0] == 0 && rset[i][3] > mid) { pathAdd(rset[i][1], rset[i][2], -1); } - if (rset[i][0] == -1 && rset[i][3] > mid) { + if (rset[i][0] == 1 && rset[i][3] > mid) { pathAdd(rset[i][1], rset[i][2], 1); } } @@ -257,9 +259,10 @@ public static void prepare() { for (int i = 1; i <= m; i++) { if (event[i][0] == 1) { clone(event[i], event[event[i][1]]); - event[i][0] = -1; - } else if (event[i][0] == 2) { - event[i][0] = ++cntans; + event[i][0] = 1; + } + if (event[i][0] == 2) { + event[i][2] = ++cntq; } } } @@ -285,7 +288,7 @@ public static void main(String[] args) throws IOException { } prepare(); compute(1, m, 0, INF); - for (int i = 1; i <= cntans; i++) { + for (int i = 1; i <= cntq; i++) { if (ans[i] == 0) { out.println(-1); } else { diff --git a/src/class169/Code04_Network2.java b/src/class169/Code04_Network2.java index ea4b11131..26c91f39a 100644 --- a/src/class169/Code04_Network2.java +++ b/src/class169/Code04_Network2.java @@ -42,12 +42,12 @@ //int tree[MAXN]; // //Event event[MAXM]; +//int cntq = 0; // //Event lset[MAXM]; //Event rset[MAXM]; // //int ans[MAXM]; -//int cntans = 0; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; @@ -128,26 +128,14 @@ // return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); //} // -//void prepare() { -// dfs(1, 0); -// for (int i = 1; i <= m; i++) { -// if (event[i].op == 1) { -// event[i] = event[event[i].x]; -// event[i].op = -1; -// } else if (event[i].op == 2){ -// event[i].op = ++cntans; -// } -// } -//} -// //void compute(int ql, int qr, int vl, int vr) { // if (ql > qr) { // return; // } // if (vl == vr) { // for (int i = ql; i <= qr; i++) { -// if (event[i].op > 0) { -// ans[event[i].op] = vl; +// if (event[i].op == 2) { +// ans[event[i].y] = vl; // } // } // } else { @@ -155,26 +143,26 @@ // int lsiz = 0, rsiz = 0, request = 0; // for (int i = ql; i <= qr; i++) { // if (event[i].op == 0) { -// if (event[i].v > mid) { +// if (event[i].v <= mid) { +// lset[++lsiz] = event[i]; +// } else { // pathAdd(event[i].x, event[i].y, 1); -// rset[++rsiz] = event[i]; // request++; -// } else { -// lset[++lsiz] = event[i]; +// rset[++rsiz] = event[i]; // } -// } else if (event[i].op == -1) { -// if (event[i].v > mid) { +// } else if (event[i].op == 1) { +// if (event[i].v <= mid) { +// lset[++lsiz] = event[i]; +// } else { // pathAdd(event[i].x, event[i].y, -1); -// rset[++rsiz] = event[i]; // request--; -// } else { -// lset[++lsiz] = event[i]; +// rset[++rsiz] = event[i]; // } // } else { -// if (pointQuery(event[i].x) != request) { -// rset[++rsiz] = event[i]; -// } else { +// if (pointQuery(event[i].x) == request) { // lset[++lsiz] = event[i]; +// } else { +// rset[++rsiz] = event[i]; // } // } // } @@ -182,7 +170,7 @@ // if (rset[i].op == 0 && rset[i].v > mid) { // pathAdd(rset[i].x, rset[i].y, -1); // } -// if (rset[i].op == -1 && rset[i].v > mid) { +// if (rset[i].op == 1 && rset[i].v > mid) { // pathAdd(rset[i].x, rset[i].y, 1); // } // } @@ -197,6 +185,19 @@ // } //} // +//void prepare() { +// dfs(1, 0); +// for (int i = 1; i <= m; i++) { +// if (event[i].op == 1) { +// event[i] = event[event[i].x]; +// event[i].op = 1; +// } +// if (event[i].op == 2){ +// event[i].y = ++cntq; +// } +// } +//} +// //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); @@ -214,7 +215,7 @@ // } // prepare(); // compute(1, m, 0, INF); -// for (int i = 1; i <= cntans; i++) { +// for (int i = 1; i <= cntq; i++) { // if (ans[i] == 0) { // cout << -1 << '\n'; // } else { From a753a6049733ecb2cc666a50a5525d02437ddd8e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 15:38:06 +0800 Subject: [PATCH 0130/1170] modify code --- src/class168/Code02_MatrixKth1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class168/Code02_MatrixKth1.java b/src/class168/Code02_MatrixKth1.java index a183d7247..bc4d2a6bc 100644 --- a/src/class168/Code02_MatrixKth1.java +++ b/src/class168/Code02_MatrixKth1.java @@ -33,7 +33,7 @@ public class Code02_MatrixKth1 { // 查询范围的右下角坐标 public static int[] c = new int[MAXQ]; public static int[] d = new int[MAXQ]; - // 查询任务的第几小值 + // 查询矩阵内第k小 public static int[] k = new int[MAXQ]; // 二维树状数组 From b73283250cd64ba6bba86192b2b97d5d74516617 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 16:34:59 +0800 Subject: [PATCH 0131/1170] modify code --- src/class168/Code01_RangeKth2.java | 9 ++++----- src/class168/Code01_RangeKth4.java | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index 0d024bd6e..f74c20c68 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -18,7 +18,6 @@ public class Code01_RangeKth2 { public static int MAXN = 200001; - public static int INF = 1000000001; public static int n, m; public static int[][] arr = new int[MAXN][2]; @@ -67,15 +66,15 @@ public static void compute(int ql, int qr, int vl, int vr) { } if (vl == vr) { for (int i = ql; i <= qr; i++) { - ans[qid[i]] = vl; + ans[qid[i]] = arr[vl][1]; } } else { int mid = (vl + vr) / 2; - while (used + 1 <= n && arr[used + 1][1] <= mid) { + while (used + 1 <= mid) { used++; add(arr[used][0], 1); } - while (used >= 1 && arr[used][1] > mid) { + while (used > mid) { add(arr[used][0], -1); used--; } @@ -117,7 +116,7 @@ public static void main(String[] args) throws Exception { k[i] = in.nextInt(); } Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] - b[1]); - compute(1, m, 0, INF); + compute(1, m, 1, n); for (int i = 1; i <= m; i++) { out.println(ans[i]); } diff --git a/src/class168/Code01_RangeKth4.java b/src/class168/Code01_RangeKth4.java index 4ecd937ed..df66d4e86 100644 --- a/src/class168/Code01_RangeKth4.java +++ b/src/class168/Code01_RangeKth4.java @@ -23,7 +23,6 @@ //} // //const int MAXN = 200001; -//const int INF = 1000000001; //int n, m; // //Number arr[MAXN]; @@ -71,15 +70,15 @@ // } // if (vl == vr) { // for (int i = ql; i <= qr; i++) { -// ans[qid[i]] = vl; +// ans[qid[i]] = arr[vl].v; // } // } else { // int mid = (vl + vr) / 2; -// while (used + 1 <= n && arr[used + 1].v <= mid) { +// while (used + 1 <= mid) { // used++; // add(arr[used].i, 1); // } -// while (used >= 1 && arr[used].v > mid) { +// while (used > mid) { // add(arr[used].i, -1); // used--; // } @@ -117,7 +116,7 @@ // cin >> l[i] >> r[i] >> k[i]; // } // sort(arr + 1, arr + n + 1, NumberCmp); -// compute(1, m, 0, INF); +// compute(1, m, 1, n); // for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; // } From 58531babb5dbe330ea639f364ef89fe50eb22451 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 16:40:43 +0800 Subject: [PATCH 0132/1170] modify code --- src/class168/Code01_RangeKth2.java | 2 +- src/class168/Code01_RangeKth4.java | 2 +- src/class168/Code02_MatrixKth2.java | 9 ++++----- src/class168/Code02_MatrixKth4.java | 9 ++++----- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index f74c20c68..c24230c02 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -70,7 +70,7 @@ public static void compute(int ql, int qr, int vl, int vr) { } } else { int mid = (vl + vr) / 2; - while (used + 1 <= mid) { + while (used < mid) { used++; add(arr[used][0], 1); } diff --git a/src/class168/Code01_RangeKth4.java b/src/class168/Code01_RangeKth4.java index df66d4e86..1c055ad23 100644 --- a/src/class168/Code01_RangeKth4.java +++ b/src/class168/Code01_RangeKth4.java @@ -74,7 +74,7 @@ // } // } else { // int mid = (vl + vr) / 2; -// while (used + 1 <= mid) { +// while (used < mid) { // used++; // add(arr[used].i, 1); // } diff --git a/src/class168/Code02_MatrixKth2.java b/src/class168/Code02_MatrixKth2.java index 8aa39ae66..fcd096a58 100644 --- a/src/class168/Code02_MatrixKth2.java +++ b/src/class168/Code02_MatrixKth2.java @@ -19,7 +19,6 @@ public class Code02_MatrixKth2 { public static int MAXN = 501; public static int MAXQ = 1000001; - public static int INF = 1000000001; public static int n, q; public static int[][] xyv = new int[MAXN * MAXN][3]; @@ -73,16 +72,16 @@ public static void compute(int ql, int qr, int vl, int vr) { } if (vl == vr) { for (int i = ql; i <= qr; i++) { - ans[qid[i]] = vl; + ans[qid[i]] = xyv[vl][2]; } } else { int mid = (vl + vr) >> 1; int lsiz = 0, rsiz = 0; - while (used + 1 <= cntv && xyv[used + 1][2] <= mid) { + while (used < mid) { used++; add(xyv[used][0], xyv[used][1], 1); } - while (used >= 1 && xyv[used][2] > mid) { + while (used > mid) { add(xyv[used][0], xyv[used][1], -1); used--; } @@ -128,7 +127,7 @@ public static void main(String[] args) throws Exception { k[i] = in.nextInt(); } Arrays.sort(xyv, 1, cntv + 1, (a, b) -> a[2] - b[2]); - compute(1, q, 0, INF); + compute(1, q, 1, cntv); for (int i = 1; i <= q; i++) { out.println(ans[i]); } diff --git a/src/class168/Code02_MatrixKth4.java b/src/class168/Code02_MatrixKth4.java index 3b530c101..8dd693ef3 100644 --- a/src/class168/Code02_MatrixKth4.java +++ b/src/class168/Code02_MatrixKth4.java @@ -24,7 +24,6 @@ // //const int MAXN = 501; //const int MAXQ = 1000001; -//const int INF = 1000000001; //int n, q; // //Number xyv[MAXN * MAXN]; @@ -77,16 +76,16 @@ // } // if (vl == vr) { // for (int i = ql; i <= qr; i++) { -// ans[qid[i]] = vl; +// ans[qid[i]] = xyv[vl].v; // } // } else { // int mid = (vl + vr) >> 1; // int lsiz = 0, rsiz = 0; -// while (used + 1 <= cntv && xyv[used + 1].v <= mid) { +// while (used < mid) { // used++; // add(xyv[used].x, xyv[used].y, 1); // } -// while (used >= 1 && xyv[used].v > mid) { +// while (used > mid) { // add(xyv[used].x, xyv[used].y, -1); // used--; // } @@ -126,7 +125,7 @@ // cin >> a[i] >> b[i] >> c[i] >> d[i] >> k[i]; // } // sort(xyv + 1, xyv + cntv + 1, NumberCmp); -// compute(1, q, 0, INF); +// compute(1, q, 1, cntv); // for (int i = 1; i <= q; i++) { // cout << ans[i] << '\n'; // } From 2250e4e49b35f0e6c6726f2c27d4e129f019710f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 16:47:47 +0800 Subject: [PATCH 0133/1170] modify code --- src/class169/Code01_Juice1.java | 3 ++- src/class169/Code01_Juice2.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class169/Code01_Juice1.java b/src/class169/Code01_Juice1.java index 36209772d..b43325071 100644 --- a/src/class169/Code01_Juice1.java +++ b/src/class169/Code01_Juice1.java @@ -113,8 +113,9 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } - compute(ql, ql + lsiz - 1, vl, mid); + // 先右后左 compute(ql + lsiz, qr, mid + 1, vr); + compute(ql, ql + lsiz - 1, vl, mid); } } diff --git a/src/class169/Code01_Juice2.java b/src/class169/Code01_Juice2.java index ba7207068..a9162a17c 100644 --- a/src/class169/Code01_Juice2.java +++ b/src/class169/Code01_Juice2.java @@ -106,8 +106,8 @@ // for (int i = 1; i <= rsiz; i++) { // qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(ql, ql + lsiz - 1, vl, mid); // compute(ql + lsiz, qr, mid + 1, vr); +// compute(ql, ql + lsiz - 1, vl, mid); // } //} // From 9297daec87a1b425e640224e3499b60dae35baeb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 19:33:18 +0800 Subject: [PATCH 0134/1170] modify code --- src/class168/Code01_RangeKth1.java | 6 ++++++ src/class168/Code01_RangeKth2.java | 1 + 2 files changed, 7 insertions(+) diff --git a/src/class168/Code01_RangeKth1.java b/src/class168/Code01_RangeKth1.java index d4625a808..6b1ecaf07 100644 --- a/src/class168/Code01_RangeKth1.java +++ b/src/class168/Code01_RangeKth1.java @@ -39,10 +39,12 @@ public class Code01_RangeKth1 { // 查询的答案 public static int[] ans = new int[MAXN]; + // 树状数组中的lowbit public static int lowbit(int i) { return i & -i; } + // 树状数组中增加i位置的词频 public static void add(int i, int v) { while (i <= n) { tree[i] += v; @@ -50,6 +52,7 @@ public static void add(int i, int v) { } } + // 树状数组中查询[1~i]范围的词频累加和 public static int sum(int i) { int ret = 0; while (i > 0) { @@ -59,10 +62,13 @@ public static int sum(int i) { return ret; } + // 树状数组中查询[l~r]范围的词频累加和 public static int query(int l, int r) { return sum(r) - sum(l - 1); } + // 整体二分的第一种写法 + // 问题范围[ql..qr],答案范围[vl..vr],答案范围的每个下标都是数字的排名 public static void compute(int ql, int qr, int vl, int vr) { if (ql > qr) { return; diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index c24230c02..3a2fed440 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -60,6 +60,7 @@ public static int query(int l, int r) { return sum(r) - sum(l - 1); } + // 整体二分的第二种写法 public static void compute(int ql, int qr, int vl, int vr) { if (ql > qr) { return; From e2d8cabc7e4bd9f07b904342bddb4cb4a23250db Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 19:34:31 +0800 Subject: [PATCH 0135/1170] modify code --- src/class168/Code01_RangeKth2.java | 2 +- src/class168/Code02_MatrixKth2.java | 2 +- src/class168/Code03_Meteors2.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index 3a2fed440..c0ef0fbca 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -28,7 +28,7 @@ public class Code01_RangeKth2 { public static int[] k = new int[MAXN]; public static int[] tree = new int[MAXN]; - // 操作使用的数量 + // 数据的使用数量 public static int used = 0; public static int[] lset = new int[MAXN]; diff --git a/src/class168/Code02_MatrixKth2.java b/src/class168/Code02_MatrixKth2.java index fcd096a58..3ba82cacd 100644 --- a/src/class168/Code02_MatrixKth2.java +++ b/src/class168/Code02_MatrixKth2.java @@ -32,7 +32,7 @@ public class Code02_MatrixKth2 { public static int[] k = new int[MAXQ]; public static int[][] tree = new int[MAXN][MAXN]; - // 操作使用的数量 + // 数据的使用数量 public static int used = 0; public static int[] lset = new int[MAXQ]; diff --git a/src/class168/Code03_Meteors2.java b/src/class168/Code03_Meteors2.java index 183eb2cbd..c8e249b38 100644 --- a/src/class168/Code03_Meteors2.java +++ b/src/class168/Code03_Meteors2.java @@ -38,7 +38,7 @@ public class Code03_Meteors2 { public static int cnt = 0; public static long[] tree = new long[MAXN << 1]; - // 操作使用的数量 + // 数据的使用数量 public static int used = 0; public static int[] lset = new int[MAXN]; From 416a39bbcf42e36f313d7900fd6bf16f09763f09 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 20:24:33 +0800 Subject: [PATCH 0136/1170] modify code --- src/class168/Code01_RangeKth2.java | 3 +-- src/class168/Code01_RangeKth4.java | 2 +- src/class168/Code02_MatrixKth2.java | 3 +-- src/class168/Code02_MatrixKth4.java | 2 +- src/class168/Code03_Meteors2.java | 3 +-- src/class168/Code03_Meteors4.java | 2 +- src/class169/Code01_Juice1.java | 3 +-- src/class169/Code01_Juice2.java | 2 +- 8 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index c0ef0fbca..77c2f7727 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -95,9 +95,8 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } - // 先右后左 - compute(ql + lsiz, qr, mid + 1, vr); compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); } } diff --git a/src/class168/Code01_RangeKth4.java b/src/class168/Code01_RangeKth4.java index 1c055ad23..046158681 100644 --- a/src/class168/Code01_RangeKth4.java +++ b/src/class168/Code01_RangeKth4.java @@ -98,8 +98,8 @@ // for (int i = 1; i <= rsiz; i++) { // qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(ql + lsiz, qr, mid + 1, vr); // compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); // } //} // diff --git a/src/class168/Code02_MatrixKth2.java b/src/class168/Code02_MatrixKth2.java index 3ba82cacd..48ed9fd54 100644 --- a/src/class168/Code02_MatrixKth2.java +++ b/src/class168/Code02_MatrixKth2.java @@ -100,9 +100,8 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } - // 先右后左 - compute(ql + lsiz, qr, mid + 1, vr); compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); } } diff --git a/src/class168/Code02_MatrixKth4.java b/src/class168/Code02_MatrixKth4.java index 8dd693ef3..9cc524ce5 100644 --- a/src/class168/Code02_MatrixKth4.java +++ b/src/class168/Code02_MatrixKth4.java @@ -104,8 +104,8 @@ // for (int i = 1; i <= rsiz; i++) { // qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(ql + lsiz, qr, mid + 1, vr); // compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); // } //} // diff --git a/src/class168/Code03_Meteors2.java b/src/class168/Code03_Meteors2.java index c8e249b38..d823aa0fa 100644 --- a/src/class168/Code03_Meteors2.java +++ b/src/class168/Code03_Meteors2.java @@ -118,9 +118,8 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } - // 先右后左 - compute(ql + lsiz, qr, mid + 1, vr); compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); } } diff --git a/src/class168/Code03_Meteors4.java b/src/class168/Code03_Meteors4.java index 868277333..5353778a0 100644 --- a/src/class168/Code03_Meteors4.java +++ b/src/class168/Code03_Meteors4.java @@ -111,8 +111,8 @@ // for (int i = 1; i <= rsiz; i++) { // qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(ql + lsiz, qr, mid + 1, vr); // compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); // } //} // diff --git a/src/class169/Code01_Juice1.java b/src/class169/Code01_Juice1.java index b43325071..36209772d 100644 --- a/src/class169/Code01_Juice1.java +++ b/src/class169/Code01_Juice1.java @@ -113,9 +113,8 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= rsiz; i++) { qid[ql + lsiz + i - 1] = rset[i]; } - // 先右后左 - compute(ql + lsiz, qr, mid + 1, vr); compute(ql, ql + lsiz - 1, vl, mid); + compute(ql + lsiz, qr, mid + 1, vr); } } diff --git a/src/class169/Code01_Juice2.java b/src/class169/Code01_Juice2.java index a9162a17c..ba7207068 100644 --- a/src/class169/Code01_Juice2.java +++ b/src/class169/Code01_Juice2.java @@ -106,8 +106,8 @@ // for (int i = 1; i <= rsiz; i++) { // qid[ql + lsiz + i - 1] = rset[i]; // } -// compute(ql + lsiz, qr, mid + 1, vr); // compute(ql, ql + lsiz - 1, vl, mid); +// compute(ql + lsiz, qr, mid + 1, vr); // } //} // From 89f03e2cacabde5cf270f8218828024f56e3da5a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 20:28:38 +0800 Subject: [PATCH 0137/1170] modify code --- src/class168/Code01_RangeKth2.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class168/Code01_RangeKth2.java b/src/class168/Code01_RangeKth2.java index 77c2f7727..088a3dfd5 100644 --- a/src/class168/Code01_RangeKth2.java +++ b/src/class168/Code01_RangeKth2.java @@ -71,10 +71,12 @@ public static void compute(int ql, int qr, int vl, int vr) { } } else { int mid = (vl + vr) / 2; + // 数据不够就叠加 while (used < mid) { used++; add(arr[used][0], 1); } + // 数据超了就撤销 while (used > mid) { add(arr[used][0], -1); used--; From fe0252540436dbcc649c38d582f45209f207c1b5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 21:19:56 +0800 Subject: [PATCH 0138/1170] modify code --- src/class168/Code02_MatrixKth1.java | 4 ++++ src/class168/Code03_Meteors1.java | 7 +++++++ src/class168/Code03_Meteors2.java | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/class168/Code02_MatrixKth1.java b/src/class168/Code02_MatrixKth1.java index bc4d2a6bc..76bdc6387 100644 --- a/src/class168/Code02_MatrixKth1.java +++ b/src/class168/Code02_MatrixKth1.java @@ -23,6 +23,7 @@ public class Code02_MatrixKth1 { // 矩阵中的每个数字,所在行x、所在列y、数值v public static int[][] xyv = new int[MAXN * MAXN][3]; + // 矩阵中一共有多少个数字,cntv就是矩阵的规模 public static int cntv = 0; // 查询任务的编号 @@ -50,6 +51,7 @@ public static int lowbit(int i) { return i & -i; } + // 二维空间中,(x,y)位置的词频加v public static void add(int x, int y, int v) { for (int i = x; i <= n; i += lowbit(i)) { for (int j = y; j <= n; j += lowbit(j)) { @@ -58,6 +60,7 @@ public static void add(int x, int y, int v) { } } + // 二维空间中,左上角(1,1)到右下角(x,y)范围上的词频累加和 public static int sum(int x, int y) { int ret = 0; for (int i = x; i > 0; i -= lowbit(i)) { @@ -68,6 +71,7 @@ public static int sum(int x, int y) { return ret; } + // 二维空间中,左上角(a,b)到右下角(c,d)范围上的词频累加和 public static int query(int a, int b, int c, int d) { return sum(c, d) - sum(a - 1, d) - sum(c, b - 1) + sum(a - 1, b - 1); } diff --git a/src/class168/Code03_Meteors1.java b/src/class168/Code03_Meteors1.java index 494feccc6..6cb1521a8 100644 --- a/src/class168/Code03_Meteors1.java +++ b/src/class168/Code03_Meteors1.java @@ -25,23 +25,30 @@ public class Code03_Meteors1 { public static int MAXN = 300001; public static int n, m, k; + // 国家编号 public static int[] qid = new int[MAXN]; + // 国家的需求 public static int[] need = new int[MAXN]; + // 陨石雨的参数 public static int[] rainl = new int[MAXN]; public static int[] rainr = new int[MAXN]; public static int[] num = new int[MAXN]; + // 国家拥有的区域列表 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN]; public static int[] to = new int[MAXN]; public static int cnt = 0; + // 树状数组,支持范围修改、单点查询 public static long[] tree = new long[MAXN << 1]; + // 整体二分 public static int[] lset = new int[MAXN]; public static int[] rset = new int[MAXN]; + // 每个国家的答案 public static int[] ans = new int[MAXN]; public static void addEdge(int i, int v) { diff --git a/src/class168/Code03_Meteors2.java b/src/class168/Code03_Meteors2.java index d823aa0fa..95b7eb369 100644 --- a/src/class168/Code03_Meteors2.java +++ b/src/class168/Code03_Meteors2.java @@ -38,7 +38,7 @@ public class Code03_Meteors2 { public static int cnt = 0; public static long[] tree = new long[MAXN << 1]; - // 数据的使用数量 + // 下了多少场陨石雨 public static int used = 0; public static int[] lset = new int[MAXN]; From 2050e2e6e8b4c773d30af220cff61c562252b62c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 May 2025 22:07:27 +0800 Subject: [PATCH 0139/1170] modify code --- ...3\344\272\214\345\210\206-\344\270\212.pptx" | Bin 0 -> 45995 bytes src/class168/Code03_Meteors1.java | 1 + 2 files changed, 1 insertion(+) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243168\343\200\220\346\214\272\351\232\276\343\200\221\346\225\264\344\275\223\344\272\214\345\210\206-\344\270\212.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243168\343\200\220\346\214\272\351\232\276\343\200\221\346\225\264\344\275\223\344\272\214\345\210\206-\344\270\212.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243168\343\200\220\346\214\272\351\232\276\343\200\221\346\225\264\344\275\223\344\272\214\345\210\206-\344\270\212.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..6e3c91d83a203c62d828309a250d666b739789ad GIT binary patch literal 45995 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

;a8y{RHOK3S-Zlr)@7 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 G@BRXfulX1N literal 0 HcmV?d00001 diff --git a/src/class168/Code03_Meteors1.java b/src/class168/Code03_Meteors1.java index 6cb1521a8..b8bfaf6a8 100644 --- a/src/class168/Code03_Meteors1.java +++ b/src/class168/Code03_Meteors1.java @@ -149,6 +149,7 @@ public static void main(String[] args) throws Exception { } num[i] = in.nextInt(); } + // 答案范围[1..k+1],第k+1场陨石雨认为满足不了要求 compute(1, n, 1, k + 1); for (int i = 1; i <= n; i++) { if (ans[i] == k + 1) { From 70fdf771b3b1e53e7324aca423c5c30c87e5245c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 19 May 2025 21:23:44 +0800 Subject: [PATCH 0140/1170] modify code --- src/class169/Code04_Network1.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class169/Code04_Network1.java b/src/class169/Code04_Network1.java index ac3caf07f..9c2e1314c 100644 --- a/src/class169/Code04_Network1.java +++ b/src/class169/Code04_Network1.java @@ -217,7 +217,6 @@ public static void compute(int ql, int qr, int vl, int vr) { pathAdd(event[i][1], event[i][2], 1); request++; clone(rset[++rsize], event[i]); - } } else if (event[i][0] == 1) { if (event[i][3] <= mid) { From df000bb472d9136e6606b3f384eab7dc03230c2e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 19 May 2025 21:54:07 +0800 Subject: [PATCH 0141/1170] modify code --- src/class169/{Code04_Network1.java => Code03_Network1.java} | 2 +- src/class169/{Code04_Network2.java => Code03_Network2.java} | 0 src/class169/{Code03_Fruit1.java => Code04_Fruit1.java} | 2 +- src/class169/{Code03_Fruit2.java => Code04_Fruit2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class169/{Code04_Network1.java => Code03_Network1.java} (99%) rename src/class169/{Code04_Network2.java => Code03_Network2.java} (100%) rename src/class169/{Code03_Fruit1.java => Code04_Fruit1.java} (99%) rename src/class169/{Code03_Fruit2.java => Code04_Fruit2.java} (100%) diff --git a/src/class169/Code04_Network1.java b/src/class169/Code03_Network1.java similarity index 99% rename from src/class169/Code04_Network1.java rename to src/class169/Code03_Network1.java index 9c2e1314c..89174db4c 100644 --- a/src/class169/Code04_Network1.java +++ b/src/class169/Code03_Network1.java @@ -17,7 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_Network1 { +public class Code03_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; diff --git a/src/class169/Code04_Network2.java b/src/class169/Code03_Network2.java similarity index 100% rename from src/class169/Code04_Network2.java rename to src/class169/Code03_Network2.java diff --git a/src/class169/Code03_Fruit1.java b/src/class169/Code04_Fruit1.java similarity index 99% rename from src/class169/Code03_Fruit1.java rename to src/class169/Code04_Fruit1.java index db0f585eb..b5ecbe81d 100644 --- a/src/class169/Code03_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code03_Fruit1 { +public class Code04_Fruit1 { public static int MAXN = 40001; public static int MAXH = 16; diff --git a/src/class169/Code03_Fruit2.java b/src/class169/Code04_Fruit2.java similarity index 100% rename from src/class169/Code03_Fruit2.java rename to src/class169/Code04_Fruit2.java From ba032faf06fdfc777569dc9efb7cefb3ad243461 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 19 May 2025 23:05:27 +0800 Subject: [PATCH 0142/1170] modify code --- src/class169/Code03_CrbQueries1.java | 39 +++++++++++++++++++ ...e03_Network1.java => Code04_Network1.java} | 18 ++++++--- ...e03_Network2.java => Code04_Network2.java} | 16 +++++--- ...{Code04_Fruit1.java => Code05_Fruit1.java} | 2 +- ...{Code04_Fruit2.java => Code05_Fruit2.java} | 0 ...gers1.java => Code06_IvanAndBurgers1.java} | 2 +- ...gers2.java => Code06_IvanAndBurgers2.java} | 0 7 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 src/class169/Code03_CrbQueries1.java rename src/class169/{Code03_Network1.java => Code04_Network1.java} (97%) rename src/class169/{Code03_Network2.java => Code04_Network2.java} (96%) rename src/class169/{Code04_Fruit1.java => Code05_Fruit1.java} (99%) rename src/class169/{Code04_Fruit2.java => Code05_Fruit2.java} (100%) rename src/class169/{Code05_IvanAndBurgers1.java => Code06_IvanAndBurgers1.java} (99%) rename src/class169/{Code05_IvanAndBurgers2.java => Code06_IvanAndBurgers2.java} (100%) diff --git a/src/class169/Code03_CrbQueries1.java b/src/class169/Code03_CrbQueries1.java new file mode 100644 index 000000000..f199671dc --- /dev/null +++ b/src/class169/Code03_CrbQueries1.java @@ -0,0 +1,39 @@ +package class169; + +// 动态查询第k小,java版 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5412 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code03_CrbQueries1 { + + public static int MAXN = 100001; + + public static int n; + + public static int[] tree = new int[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= n) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static int query(int l, int r) { + return sum(r) - sum(l - 1); + } + +} diff --git a/src/class169/Code03_Network1.java b/src/class169/Code04_Network1.java similarity index 97% rename from src/class169/Code03_Network1.java rename to src/class169/Code04_Network1.java index 89174db4c..239d3c743 100644 --- a/src/class169/Code03_Network1.java +++ b/src/class169/Code04_Network1.java @@ -17,7 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code03_Network1 { +public class Code04_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; @@ -160,18 +160,24 @@ public static int lca(int a, int b) { return stjump[a][0]; } + public static int lowbit(int i) { + return i & -i; + } + public static void add(int i, int v) { - for (; i <= n; i += i & -i) { + while (i <= n) { tree[i] += v; + i += lowbit(i); } } public static int query(int i) { - int sum = 0; - for (; i > 0; i -= i & -i) { - sum += tree[i]; + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); } - return sum; + return ret; } public static void pathAdd(int x, int y, int v) { diff --git a/src/class169/Code03_Network2.java b/src/class169/Code04_Network2.java similarity index 96% rename from src/class169/Code03_Network2.java rename to src/class169/Code04_Network2.java index 26c91f39a..7f0c3e9d3 100644 --- a/src/class169/Code03_Network2.java +++ b/src/class169/Code04_Network2.java @@ -99,18 +99,24 @@ // return stjump[a][0]; //} // +//int lowbit(int i) { +// return i & -i; +//} +// //void add(int i, int v) { -// for (; i <= n; i += i & -i) { +// while (i <= n) { // tree[i] += v; +// i += lowbit(i); // } //} // //int query(int i) { -// int sum = 0; -// for (; i > 0; i -= i & -i) { -// sum += tree[i]; +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); // } -// return sum; +// return ret; //} // //void pathAdd(int x, int y, int v) { diff --git a/src/class169/Code04_Fruit1.java b/src/class169/Code05_Fruit1.java similarity index 99% rename from src/class169/Code04_Fruit1.java rename to src/class169/Code05_Fruit1.java index b5ecbe81d..433c37d16 100644 --- a/src/class169/Code04_Fruit1.java +++ b/src/class169/Code05_Fruit1.java @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code04_Fruit1 { +public class Code05_Fruit1 { public static int MAXN = 40001; public static int MAXH = 16; diff --git a/src/class169/Code04_Fruit2.java b/src/class169/Code05_Fruit2.java similarity index 100% rename from src/class169/Code04_Fruit2.java rename to src/class169/Code05_Fruit2.java diff --git a/src/class169/Code05_IvanAndBurgers1.java b/src/class169/Code06_IvanAndBurgers1.java similarity index 99% rename from src/class169/Code05_IvanAndBurgers1.java rename to src/class169/Code06_IvanAndBurgers1.java index e1fffe19b..01b51188a 100644 --- a/src/class169/Code05_IvanAndBurgers1.java +++ b/src/class169/Code06_IvanAndBurgers1.java @@ -14,7 +14,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_IvanAndBurgers1 { +public class Code06_IvanAndBurgers1 { public static int MAXN = 500001; public static int BIT = 21; diff --git a/src/class169/Code05_IvanAndBurgers2.java b/src/class169/Code06_IvanAndBurgers2.java similarity index 100% rename from src/class169/Code05_IvanAndBurgers2.java rename to src/class169/Code06_IvanAndBurgers2.java From eb62869eba97e55780855e70dddbcc1daa476b58 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 May 2025 00:20:31 +0800 Subject: [PATCH 0143/1170] modify code --- src/class169/Code03_CrbQueries1.java | 147 ++++++++++++++++++++++++- src/class169/Code03_CrbQueries2.java | 153 +++++++++++++++++++++++++++ 2 files changed, 298 insertions(+), 2 deletions(-) create mode 100644 src/class169/Code03_CrbQueries2.java diff --git a/src/class169/Code03_CrbQueries1.java b/src/class169/Code03_CrbQueries1.java index f199671dc..81838bc14 100644 --- a/src/class169/Code03_CrbQueries1.java +++ b/src/class169/Code03_CrbQueries1.java @@ -1,17 +1,50 @@ package class169; -// 动态查询第k小,java版 +// 带修改的区间第k小,java版 +// 给定一个长度为n的数组arr,接下来是m条操作,每种操作是如下两种类型的一种 +// 操作 1 x y : 把x位置的值修改成y +// 操作 2 x y v : 查询arr[x..y]范围上第v小的值 +// 1 <= n、m <= 10^5 +// 1 <= 数组中的值 <= 10^9 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5412 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.StreamTokenizer; +import java.util.Arrays; + public class Code03_CrbQueries1 { public static int MAXN = 100001; + public static int INF = 1000000001; + public static int n, m; + + public static int[] arr = new int[MAXN]; - public static int n; + // 事件编号组成的数组 + public static int[] eid = new int[MAXN << 2]; + // op == 1,代表修改事件,x处,值y,效果v + // op == 2,代表查询事件,[x..y]范围上查询第v小,答案填入q位置 + public static int[] op = new int[MAXN << 2]; + public static int[] x = new int[MAXN << 2]; + public static int[] y = new int[MAXN << 2]; + public static int[] v = new int[MAXN << 2]; + public static int[] q = new int[MAXN << 2]; + // 树状数组 public static int[] tree = new int[MAXN]; + // 整体二分 + public static int[] lset = new int[MAXN << 2]; + public static int[] rset = new int[MAXN << 2]; + + // 查询的答案 + public static int[] ans = new int[MAXN]; + public static int lowbit(int i) { return i & -i; } @@ -36,4 +69,114 @@ public static int query(int l, int r) { return sum(r) - sum(l - 1); } + public static void compute(int el, int er, int vl, int vr) { + if (el > er) { + return; + } + if (vl == vr) { + for (int i = el; i <= er; i++) { + int id = eid[i]; + if (op[id] == 2) { + ans[q[id]] = vl; + } + } + } else { + int mid = (vl + vr) >> 1; + int lsiz = 0, rsiz = 0; + for (int i = el; i <= er; i++) { + int id = eid[i]; + if (op[id] == 1) { + if (y[id] <= mid) { + add(x[id], v[id]); + lset[++lsiz] = id; + } else { + rset[++rsiz] = id; + } + } else { + int satisfy = query(x[id], y[id]); + if (v[id] <= satisfy) { + lset[++lsiz] = id; + } else { + v[id] -= satisfy; + rset[++rsiz] = id; + } + } + } + for (int i = 1; i <= lsiz; i++) { + eid[el + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + eid[el + lsiz + i - 1] = rset[i]; + } + for (int i = 1; i <= lsiz; i++) { + int id = lset[i]; + if (op[id] == 1 && y[id] <= mid) { + add(x[id], -v[id]); + } + } + compute(el, el + lsiz - 1, vl, mid); + compute(el + lsiz, er, mid + 1, vr); + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StreamTokenizer in = new StreamTokenizer(br); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + while (in.nextToken() != StreamTokenizer.TT_EOF) { + n = (int) in.nval; + Arrays.fill(tree, 1, n + 1, 0); + int eventCnt = 0; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + op[++eventCnt] = 1; + x[eventCnt] = i; + y[eventCnt] = arr[i]; + v[eventCnt] = 1; + } + in.nextToken(); + m = (int) in.nval; + int queryCnt = 0; + for (int i = 1; i <= m; i++) { + in.nextToken(); + op[++eventCnt] = (int) in.nval; + if (op[eventCnt] == 1) { + in.nextToken(); + int a = (int) in.nval; + in.nextToken(); + int b = (int) in.nval; + // 前面的值取消 + x[eventCnt] = a; + y[eventCnt] = arr[a]; + v[eventCnt] = -1; + // 当前的值生效 + op[++eventCnt] = 1; + x[eventCnt] = a; + y[eventCnt] = b; + v[eventCnt] = 1; + arr[a] = b; + } else { + in.nextToken(); + x[eventCnt] = (int) in.nval; + in.nextToken(); + y[eventCnt] = (int) in.nval; + in.nextToken(); + v[eventCnt] = (int) in.nval; + q[eventCnt] = ++queryCnt; + } + } + for (int i = 1; i <= eventCnt; i++) { + eid[i] = i; + } + compute(1, eventCnt, 1, INF); + for (int i = 1; i <= queryCnt; i++) { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + br.close(); + } + } diff --git a/src/class169/Code03_CrbQueries2.java b/src/class169/Code03_CrbQueries2.java new file mode 100644 index 000000000..c142c38d6 --- /dev/null +++ b/src/class169/Code03_CrbQueries2.java @@ -0,0 +1,153 @@ +package class169; + +// 带修改的区间第k小,C++版 +// 给定一个长度为n的数组arr,接下来是m条操作,每种操作是如下两种类型的一种 +// 操作 1 x y : 把x位置的值修改成y +// 操作 2 x y v : 查询arr[x..y]范围上第v小的值 +// 1 <= n、m <= 10^5 +// 1 <= 数组中的值 <= 10^9 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5412 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int INF = 1000000001; +//int n, m; +// +//int arr[MAXN]; +// +//int eid[MAXN << 2]; +//int op[MAXN << 2]; +//int x[MAXN << 2]; +//int y[MAXN << 2]; +//int v[MAXN << 2]; +//int q[MAXN << 2]; +// +//int tree[MAXN]; +// +//int lset[MAXN << 2]; +//int rset[MAXN << 2]; +// +//int ans[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= n) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//int query(int l, int r) { +// return sum(r) - sum(l - 1); +//} +// +//void compute(int el, int er, int vl, int vr) { +// if (el > er) { +// return; +// } +// if (vl == vr) { +// for (int i = el; i <= er; i++) { +// int id = eid[i]; +// if (op[id] == 2) { +// ans[q[id]] = vl; +// } +// } +// } else { +// int mid = (vl + vr) >> 1; +// int lsiz = 0, rsiz = 0; +// for (int i = el; i <= er; i++) { +// int id = eid[i]; +// if (op[id] == 1) { +// if (y[id] <= mid) { +// add(x[id], v[id]); +// lset[++lsiz] = id; +// } else { +// rset[++rsiz] = id; +// } +// } else { +// int satisfy = query(x[id], y[id]); +// if (v[id] <= satisfy) { +// lset[++lsiz] = id; +// } else { +// v[id] -= satisfy; +// rset[++rsiz] = id; +// } +// } +// } +// for (int i = 1; i <= lsiz; i++) { +// eid[el + i - 1] = lset[i]; +// } +// for (int i = 1; i <= rsiz; i++) { +// eid[el + lsiz + i - 1] = rset[i]; +// } +// for (int i = 1; i <= lsiz; i++) { +// int id = lset[i]; +// if (op[id] == 1 && y[id] <= mid) { +// add(x[id], -v[id]); +// } +// } +// compute(el, el + lsiz - 1, vl, mid); +// compute(el + lsiz, er, mid + 1, vr); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// while (cin >> n) { +// fill(tree + 1, tree + n + 1, 0); +// int eventCnt = 0; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// op[++eventCnt] = 1; +// x[eventCnt] = i; +// y[eventCnt] = arr[i]; +// v[eventCnt] = 1; +// } +// cin >> m; +// int queryCnt = 0; +// for (int i = 1; i <= m; i++) { +// cin >> op[++eventCnt]; +// if (op[eventCnt] == 1) { +// int a, b; +// cin >> a >> b; +// x[eventCnt] = a; +// y[eventCnt] = arr[a]; +// v[eventCnt] = -1; +// op[++eventCnt] = 1; +// x[eventCnt] = a; +// y[eventCnt] = b; +// v[eventCnt] = 1; +// arr[a] = b; +// } else { +// cin >> x[eventCnt] >> y[eventCnt] >> v[eventCnt]; +// q[eventCnt] = ++queryCnt; +// } +// } +// for (int i = 1; i <= eventCnt; i++) { +// eid[i] = i; +// } +// compute(1, eventCnt, 1, INF); +// for (int i = 1; i <= queryCnt; i++) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From e0ff0b1d59b9663f5bb9db696b503599fea55fdd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 May 2025 00:59:22 +0800 Subject: [PATCH 0144/1170] modify code --- src/class169/Code03_CrbQueries1.java | 2 +- src/class169/Code04_Network1.java | 120 ++++++++++++++------------- src/class169/Code04_Network2.java | 100 ++++++++++++---------- 3 files changed, 117 insertions(+), 105 deletions(-) diff --git a/src/class169/Code03_CrbQueries1.java b/src/class169/Code03_CrbQueries1.java index 81838bc14..04c97ac70 100644 --- a/src/class169/Code03_CrbQueries1.java +++ b/src/class169/Code03_CrbQueries1.java @@ -28,7 +28,7 @@ public class Code03_CrbQueries1 { // 事件编号组成的数组 public static int[] eid = new int[MAXN << 2]; // op == 1,代表修改事件,x处,值y,效果v - // op == 2,代表查询事件,[x..y]范围上查询第v小,答案填入q位置 + // op == 2,代表查询事件,[x..y]范围上查询第v小,q表示问题的编号 public static int[] op = new int[MAXN << 2]; public static int[] x = new int[MAXN << 2]; public static int[] y = new int[MAXN << 2]; diff --git a/src/class169/Code04_Network1.java b/src/class169/Code04_Network1.java index 239d3c743..8dd4afafa 100644 --- a/src/class169/Code04_Network1.java +++ b/src/class169/Code04_Network1.java @@ -42,17 +42,20 @@ public class Code04_Network1 { // 树状数组 public static int[] tree = new int[MAXN]; - // 从早到晚发生的事件,op、x、y、v - // op == 0,添加点x到点y,重要度为v的路径 - // op == 1,删除点x到点y,重要度为v的路径 - // op == 2,查询和x相关的答案,y表示问题的编号 - public static int[][] event = new int[MAXM][4]; - // 查询问题的数量 + // 事件编号组成的数组 + public static int[] eid = new int[MAXM]; + // 如果op == 0,添加点x到点y,重要度为v的路径 + // 如果op == 1,删除点x到点y,重要度为v的路径 + // 如果op == 2,查询和x相关的答案,y表示问题的编号 + public static int[] op = new int[MAXM]; + public static int[] x = new int[MAXM]; + public static int[] y = new int[MAXM]; + public static int[] v = new int[MAXM]; public static int cntq = 0; // 整体二分 - public static int[][] lset = new int[MAXM][4]; - public static int[][] rset = new int[MAXM][4]; + public static int[] lset = new int[MAXM]; + public static int[] rset = new int[MAXM]; public static int[] ans = new int[MAXM]; @@ -195,81 +198,82 @@ public static int pointQuery(int x) { return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); } - public static void clone(int[] event1, int[] event2) { - event1[0] = event2[0]; - event1[1] = event2[1]; - event1[2] = event2[2]; - event1[3] = event2[3]; - } - - public static void compute(int ql, int qr, int vl, int vr) { - if (ql > qr) { + public static void compute(int el, int er, int vl, int vr) { + if (el > er) { return; } if (vl == vr) { - for (int i = ql; i <= qr; i++) { - if (event[i][0] == 2) { - ans[event[i][2]] = vl; + for (int i = el; i <= er; i++) { + int id = eid[i]; + if (op[id] == 2) { + ans[y[id]] = vl; } } } else { int mid = (vl + vr) / 2; - int lsize = 0, rsize = 0, request = 0; - for (int i = ql; i <= qr; i++) { - if (event[i][0] == 0) { - if (event[i][3] <= mid) { - clone(lset[++lsize], event[i]); + int lsiz = 0, rsiz = 0, request = 0; + for (int i = el; i <= er; i++) { + int id = eid[i]; + if (op[id] == 0) { + if (v[id] <= mid) { + lset[++lsiz] = id; } else { - pathAdd(event[i][1], event[i][2], 1); + pathAdd(x[id], y[id], 1); request++; - clone(rset[++rsize], event[i]); + rset[++rsiz] = id; } - } else if (event[i][0] == 1) { - if (event[i][3] <= mid) { - clone(lset[++lsize], event[i]); + } else if (op[id] == 1) { + if (v[id] <= mid) { + lset[++lsiz] = id; } else { - pathAdd(event[i][1], event[i][2], -1); + pathAdd(x[id], y[id], -1); request--; - clone(rset[++rsize], event[i]); + rset[++rsiz] = id; } } else { - if (pointQuery(event[i][1]) == request) { - clone(lset[++lsize], event[i]); + if (pointQuery(x[id]) == request) { + lset[++lsiz] = id; } else { - clone(rset[++rsize], event[i]); + rset[++rsiz] = id; } } } - for (int i = 1; i <= rsize; i++) { - if (rset[i][0] == 0 && rset[i][3] > mid) { - pathAdd(rset[i][1], rset[i][2], -1); - } - if (rset[i][0] == 1 && rset[i][3] > mid) { - pathAdd(rset[i][1], rset[i][2], 1); - } + for (int i = 1; i <= lsiz; i++) { + eid[el + i - 1] = lset[i]; } - for (int i = ql, j = 1; j <= lsize; i++, j++) { - clone(event[i], lset[j]); + for (int i = 1; i <= rsiz; i++) { + eid[el + lsiz + i - 1] = rset[i]; } - for (int i = ql + lsize, j = 1; j <= rsize; i++, j++) { - clone(event[i], rset[j]); + for (int i = 1; i <= rsiz; i++) { + int id = rset[i]; + if (op[id] == 0 && v[id] > mid) { + pathAdd(x[id], y[id], -1); + } + if (op[id] == 1 && v[id] > mid) { + pathAdd(x[id], y[id], 1); + } } - compute(ql, ql + lsize - 1, vl, mid); - compute(ql + lsize, qr, mid + 1, vr); + compute(el, el + lsiz - 1, vl, mid); + compute(el + lsiz, er, mid + 1, vr); } } public static void prepare() { dfs2(); for (int i = 1; i <= m; i++) { - if (event[i][0] == 1) { - clone(event[i], event[event[i][1]]); - event[i][0] = 1; + if (op[i] == 1) { + int pre = x[i]; + x[i] = x[pre]; + y[i] = y[pre]; + v[i] = v[pre]; } - if (event[i][0] == 2) { - event[i][2] = ++cntq; + if (op[i] == 2) { + y[i] = ++cntq; } } + for (int i = 1; i <= m; i++) { + eid[i] = i; + } } public static void main(String[] args) throws IOException { @@ -284,11 +288,11 @@ public static void main(String[] args) throws IOException { addEdge(v, u); } for (int i = 1; i <= m; i++) { - event[i][0] = in.nextInt(); - event[i][1] = in.nextInt(); - if (event[i][0] == 0) { - event[i][2] = in.nextInt(); - event[i][3] = in.nextInt(); + op[i] = in.nextInt(); + x[i] = in.nextInt(); + if (op[i] == 0) { + y[i] = in.nextInt(); + v[i] = in.nextInt(); } } prepare(); diff --git a/src/class169/Code04_Network2.java b/src/class169/Code04_Network2.java index 7f0c3e9d3..272271811 100644 --- a/src/class169/Code04_Network2.java +++ b/src/class169/Code04_Network2.java @@ -17,10 +17,6 @@ // //using namespace std; // -//struct Event { -// int op, x, y, v; -//}; -// //const int MAXN = 100001; //const int MAXM = 200001; //const int MAXH = 20; @@ -41,11 +37,15 @@ // //int tree[MAXN]; // -//Event event[MAXM]; +//int eid[MAXM]; +//int op[MAXM]; +//int x[MAXM]; +//int y[MAXM]; +//int v[MAXM]; //int cntq = 0; // -//Event lset[MAXM]; -//Event rset[MAXM]; +//int lset[MAXM]; +//int rset[MAXM]; // //int ans[MAXM]; // @@ -134,74 +134,82 @@ // return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); //} // -//void compute(int ql, int qr, int vl, int vr) { -// if (ql > qr) { +//void compute(int el, int er, int vl, int vr) { +// if (el > er) { // return; // } // if (vl == vr) { -// for (int i = ql; i <= qr; i++) { -// if (event[i].op == 2) { -// ans[event[i].y] = vl; +// for (int i = el; i <= er; i++) { +// int id = eid[i]; +// if (op[id] == 2) { +// ans[y[id]] = vl; // } // } // } else { // int mid = (vl + vr) / 2; // int lsiz = 0, rsiz = 0, request = 0; -// for (int i = ql; i <= qr; i++) { -// if (event[i].op == 0) { -// if (event[i].v <= mid) { -// lset[++lsiz] = event[i]; +// for (int i = el; i <= er; i++) { +// int id = eid[i]; +// if (op[id] == 0) { +// if (v[id] <= mid) { +// lset[++lsiz] = id; // } else { -// pathAdd(event[i].x, event[i].y, 1); +// pathAdd(x[id], y[id], 1); // request++; -// rset[++rsiz] = event[i]; +// rset[++rsiz] = id; // } -// } else if (event[i].op == 1) { -// if (event[i].v <= mid) { -// lset[++lsiz] = event[i]; +// } else if (op[id] == 1) { +// if (v[id] <= mid) { +// lset[++lsiz] = id; // } else { -// pathAdd(event[i].x, event[i].y, -1); +// pathAdd(x[id], y[id], -1); // request--; -// rset[++rsiz] = event[i]; +// rset[++rsiz] = id; // } // } else { -// if (pointQuery(event[i].x) == request) { -// lset[++lsiz] = event[i]; +// if (pointQuery(x[id]) == request) { +// lset[++lsiz] = id; // } else { -// rset[++rsiz] = event[i]; +// rset[++rsiz] = id; // } // } // } -// for (int i = 1; i <= rsiz; i++) { -// if (rset[i].op == 0 && rset[i].v > mid) { -// pathAdd(rset[i].x, rset[i].y, -1); -// } -// if (rset[i].op == 1 && rset[i].v > mid) { -// pathAdd(rset[i].x, rset[i].y, 1); -// } -// } // for (int i = 1; i <= lsiz; i++) { -// event[ql + i - 1] = lset[i]; +// eid[el + i - 1] = lset[i]; // } // for (int i = 1; i <= rsiz; i++) { -// event[ql + lsiz + i - 1] = rset[i]; +// eid[el + lsiz + i - 1] = rset[i]; // } -// compute(ql, ql + lsiz - 1, vl, mid); -// compute(ql + lsiz, qr, mid + 1, vr); +// for (int i = 1; i <= rsiz; i++) { +// int id = rset[i]; +// if (op[id] == 0 && v[id] > mid) { +// pathAdd(x[id], y[id], -1); +// } +// if (op[id] == 1 && v[id] > mid) { +// pathAdd(x[id], y[id], 1); +// } +// } +// compute(el, el + lsiz - 1, vl, mid); +// compute(el + lsiz, er, mid + 1, vr); // } //} // //void prepare() { // dfs(1, 0); // for (int i = 1; i <= m; i++) { -// if (event[i].op == 1) { -// event[i] = event[event[i].x]; -// event[i].op = 1; +// if (op[i] == 1) { +// int pre = x[i]; +// x[i] = x[pre]; +// y[i] = y[pre]; +// v[i] = v[pre]; // } -// if (event[i].op == 2){ -// event[i].y = ++cntq; +// if (op[i] == 2) { +// y[i] = ++cntq; // } // } +// for (int i = 1; i <= m; i++) { +// eid[i] = i; +// } //} // //int main() { @@ -214,9 +222,9 @@ // addEdge(v, u); // } // for (int i = 1; i <= m; i++) { -// cin >> event[i].op >> event[i].x; -// if (event[i].op == 0) { -// cin >> event[i].y >> event[i].v; +// cin >> op[i] >> x[i]; +// if (op[i] == 0) { +// cin >> y[i] >> v[i]; // } // } // prepare(); From f05fdcf4691f09282971cab62fba911c7ec16db2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 May 2025 10:16:06 +0800 Subject: [PATCH 0145/1170] modify code --- src/class169/Code03_CrbQueries1.java | 182 -------------- src/class169/Code03_DynamicRankings1.java | 233 ++++++++++++++++++ ...ies2.java => Code03_DynamicRankings2.java} | 111 ++++----- 3 files changed, 289 insertions(+), 237 deletions(-) delete mode 100644 src/class169/Code03_CrbQueries1.java create mode 100644 src/class169/Code03_DynamicRankings1.java rename src/class169/{Code03_CrbQueries2.java => Code03_DynamicRankings2.java} (60%) diff --git a/src/class169/Code03_CrbQueries1.java b/src/class169/Code03_CrbQueries1.java deleted file mode 100644 index 04c97ac70..000000000 --- a/src/class169/Code03_CrbQueries1.java +++ /dev/null @@ -1,182 +0,0 @@ -package class169; - -// 带修改的区间第k小,java版 -// 给定一个长度为n的数组arr,接下来是m条操作,每种操作是如下两种类型的一种 -// 操作 1 x y : 把x位置的值修改成y -// 操作 2 x y v : 查询arr[x..y]范围上第v小的值 -// 1 <= n、m <= 10^5 -// 1 <= 数组中的值 <= 10^9 -// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5412 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.io.StreamTokenizer; -import java.util.Arrays; - -public class Code03_CrbQueries1 { - - public static int MAXN = 100001; - public static int INF = 1000000001; - public static int n, m; - - public static int[] arr = new int[MAXN]; - - // 事件编号组成的数组 - public static int[] eid = new int[MAXN << 2]; - // op == 1,代表修改事件,x处,值y,效果v - // op == 2,代表查询事件,[x..y]范围上查询第v小,q表示问题的编号 - public static int[] op = new int[MAXN << 2]; - public static int[] x = new int[MAXN << 2]; - public static int[] y = new int[MAXN << 2]; - public static int[] v = new int[MAXN << 2]; - public static int[] q = new int[MAXN << 2]; - - // 树状数组 - public static int[] tree = new int[MAXN]; - - // 整体二分 - public static int[] lset = new int[MAXN << 2]; - public static int[] rset = new int[MAXN << 2]; - - // 查询的答案 - public static int[] ans = new int[MAXN]; - - public static int lowbit(int i) { - return i & -i; - } - - public static void add(int i, int v) { - while (i <= n) { - tree[i] += v; - i += lowbit(i); - } - } - - public static int sum(int i) { - int ret = 0; - while (i > 0) { - ret += tree[i]; - i -= lowbit(i); - } - return ret; - } - - public static int query(int l, int r) { - return sum(r) - sum(l - 1); - } - - public static void compute(int el, int er, int vl, int vr) { - if (el > er) { - return; - } - if (vl == vr) { - for (int i = el; i <= er; i++) { - int id = eid[i]; - if (op[id] == 2) { - ans[q[id]] = vl; - } - } - } else { - int mid = (vl + vr) >> 1; - int lsiz = 0, rsiz = 0; - for (int i = el; i <= er; i++) { - int id = eid[i]; - if (op[id] == 1) { - if (y[id] <= mid) { - add(x[id], v[id]); - lset[++lsiz] = id; - } else { - rset[++rsiz] = id; - } - } else { - int satisfy = query(x[id], y[id]); - if (v[id] <= satisfy) { - lset[++lsiz] = id; - } else { - v[id] -= satisfy; - rset[++rsiz] = id; - } - } - } - for (int i = 1; i <= lsiz; i++) { - eid[el + i - 1] = lset[i]; - } - for (int i = 1; i <= rsiz; i++) { - eid[el + lsiz + i - 1] = rset[i]; - } - for (int i = 1; i <= lsiz; i++) { - int id = lset[i]; - if (op[id] == 1 && y[id] <= mid) { - add(x[id], -v[id]); - } - } - compute(el, el + lsiz - 1, vl, mid); - compute(el + lsiz, er, mid + 1, vr); - } - } - - public static void main(String[] args) throws IOException { - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - StreamTokenizer in = new StreamTokenizer(br); - PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - while (in.nextToken() != StreamTokenizer.TT_EOF) { - n = (int) in.nval; - Arrays.fill(tree, 1, n + 1, 0); - int eventCnt = 0; - for (int i = 1; i <= n; i++) { - in.nextToken(); - arr[i] = (int) in.nval; - op[++eventCnt] = 1; - x[eventCnt] = i; - y[eventCnt] = arr[i]; - v[eventCnt] = 1; - } - in.nextToken(); - m = (int) in.nval; - int queryCnt = 0; - for (int i = 1; i <= m; i++) { - in.nextToken(); - op[++eventCnt] = (int) in.nval; - if (op[eventCnt] == 1) { - in.nextToken(); - int a = (int) in.nval; - in.nextToken(); - int b = (int) in.nval; - // 前面的值取消 - x[eventCnt] = a; - y[eventCnt] = arr[a]; - v[eventCnt] = -1; - // 当前的值生效 - op[++eventCnt] = 1; - x[eventCnt] = a; - y[eventCnt] = b; - v[eventCnt] = 1; - arr[a] = b; - } else { - in.nextToken(); - x[eventCnt] = (int) in.nval; - in.nextToken(); - y[eventCnt] = (int) in.nval; - in.nextToken(); - v[eventCnt] = (int) in.nval; - q[eventCnt] = ++queryCnt; - } - } - for (int i = 1; i <= eventCnt; i++) { - eid[i] = i; - } - compute(1, eventCnt, 1, INF); - for (int i = 1; i <= queryCnt; i++) { - out.println(ans[i]); - } - } - out.flush(); - out.close(); - br.close(); - } - -} diff --git a/src/class169/Code03_DynamicRankings1.java b/src/class169/Code03_DynamicRankings1.java new file mode 100644 index 000000000..339d8d1d3 --- /dev/null +++ b/src/class169/Code03_DynamicRankings1.java @@ -0,0 +1,233 @@ +package class169; + +// 带修改的区间第k小,java版 +// 给定一个长度为n的数组arr,接下来是m条操作,每种操作是如下两种类型的一种 +// 操作 Q x y v : 查询arr[x..y]范围上第v小的值 +// 操作 C x y : 把x位置的值修改成y +// 1 <= n、m <= 10^5 +// 1 <= 数组中的值 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P2617 +// 本题是讲解160,树套树模版题,现在作为带修改的整体二分模版题 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code03_DynamicRankings1 { + + public static int MAXN = 100001; + public static int MAXE = MAXN << 2; + public static int INF = 1000000001; + public static int n, m; + + public static int[] arr = new int[MAXN]; + + // 事件编号组成的数组 + public static int[] eid = new int[MAXE]; + // op == 1,代表查询事件,[x..y]范围上查询第v小,q表示问题的编号 + // op == 2,代表修改事件,x处,值y,效果v + public static int[] op = new int[MAXE]; + public static int[] x = new int[MAXE]; + public static int[] y = new int[MAXE]; + public static int[] v = new int[MAXE]; + public static int[] q = new int[MAXE]; + public static int cnte = 0; + public static int cntq = 0; + + // 树状数组 + public static int[] tree = new int[MAXN]; + + // 整体二分 + public static int[] lset = new int[MAXE]; + public static int[] rset = new int[MAXE]; + + // 查询的答案 + public static int[] ans = new int[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= n) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static int query(int l, int r) { + return sum(r) - sum(l - 1); + } + + public static void compute(int el, int er, int vl, int vr) { + if (el > er) { + return; + } + if (vl == vr) { + for (int i = el; i <= er; i++) { + int id = eid[i]; + if (op[id] == 1) { + ans[q[id]] = vl; + } + } + } else { + int mid = (vl + vr) >> 1; + int lsiz = 0, rsiz = 0; + for (int i = el; i <= er; i++) { + int id = eid[i]; + if (op[id] == 1) { + int satisfy = query(x[id], y[id]); + if (v[id] <= satisfy) { + lset[++lsiz] = id; + } else { + v[id] -= satisfy; + rset[++rsiz] = id; + } + } else { + if (y[id] <= mid) { + add(x[id], v[id]); + lset[++lsiz] = id; + } else { + rset[++rsiz] = id; + } + } + } + for (int i = 1; i <= lsiz; i++) { + eid[el + i - 1] = lset[i]; + } + for (int i = 1; i <= rsiz; i++) { + eid[el + lsiz + i - 1] = rset[i]; + } + for (int i = 1; i <= lsiz; i++) { + int id = lset[i]; + if (op[id] == 2 && y[id] <= mid) { + add(x[id], -v[id]); + } + } + compute(el, el + lsiz - 1, vl, mid); + compute(el + lsiz, er, mid + 1, vr); + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + op[++cnte] = 2; + x[cnte] = i; + y[cnte] = arr[i]; + v[cnte] = 1; + } + char type; + for (int i = 1; i <= m; i++) { + type = in.nextChar(); + if (type == 'Q') { + op[++cnte] = 1; + x[cnte] = in.nextInt(); + y[cnte] = in.nextInt(); + v[cnte] = in.nextInt(); + q[cnte] = ++cntq; + } else { + int a = in.nextInt(); + int b = in.nextInt(); + op[++cnte] = 2; + x[cnte] = a; + y[cnte] = arr[a]; + v[cnte] = -1; + op[++cnte] = 2; + x[cnte] = a; + y[cnte] = b; + v[cnte] = 1; + arr[a] = b; + } + } + for (int i = 1; i <= cnte; i++) { + eid[i] = i; + } + compute(1, cnte, 0, INF); + for (int i = 1; i <= cntq; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class169/Code03_CrbQueries2.java b/src/class169/Code03_DynamicRankings2.java similarity index 60% rename from src/class169/Code03_CrbQueries2.java rename to src/class169/Code03_DynamicRankings2.java index c142c38d6..df251c7ed 100644 --- a/src/class169/Code03_CrbQueries2.java +++ b/src/class169/Code03_DynamicRankings2.java @@ -2,11 +2,12 @@ // 带修改的区间第k小,C++版 // 给定一个长度为n的数组arr,接下来是m条操作,每种操作是如下两种类型的一种 -// 操作 1 x y : 把x位置的值修改成y -// 操作 2 x y v : 查询arr[x..y]范围上第v小的值 +// 操作 Q x y v : 查询arr[x..y]范围上第v小的值 +// 操作 C x y : 把x位置的值修改成y // 1 <= n、m <= 10^5 // 1 <= 数组中的值 <= 10^9 -// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5412 +// 测试链接 : https://www.luogu.com.cn/problem/P2617 +// 本题是讲解160,树套树模版题,现在作为带修改的整体二分模版题 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -15,22 +16,24 @@ //using namespace std; // //const int MAXN = 100001; +//const int MAXE = MAXN << 2; //const int INF = 1000000001; //int n, m; // //int arr[MAXN]; -// -//int eid[MAXN << 2]; -//int op[MAXN << 2]; -//int x[MAXN << 2]; -//int y[MAXN << 2]; -//int v[MAXN << 2]; -//int q[MAXN << 2]; +//int eid[MAXE]; +//int op[MAXE]; +//int x[MAXE]; +//int y[MAXE]; +//int v[MAXE]; +//int q[MAXE]; +//int cnte = 0; +//int cntq = 0; // //int tree[MAXN]; // -//int lset[MAXN << 2]; -//int rset[MAXN << 2]; +//int lset[MAXE]; +//int rset[MAXE]; // //int ans[MAXN]; // @@ -65,7 +68,7 @@ // if (vl == vr) { // for (int i = el; i <= er; i++) { // int id = eid[i]; -// if (op[id] == 2) { +// if (op[id] == 1) { // ans[q[id]] = vl; // } // } @@ -75,18 +78,18 @@ // for (int i = el; i <= er; i++) { // int id = eid[i]; // if (op[id] == 1) { -// if (y[id] <= mid) { -// add(x[id], v[id]); +// int satisfy = query(x[id], y[id]); +// if (v[id] <= satisfy) { // lset[++lsiz] = id; // } else { +// v[id] -= satisfy; // rset[++rsiz] = id; // } // } else { -// int satisfy = query(x[id], y[id]); -// if (v[id] <= satisfy) { +// if (y[id] <= mid) { +// add(x[id], v[id]); // lset[++lsiz] = id; // } else { -// v[id] -= satisfy; // rset[++rsiz] = id; // } // } @@ -99,7 +102,7 @@ // } // for (int i = 1; i <= lsiz; i++) { // int id = lset[i]; -// if (op[id] == 1 && y[id] <= mid) { +// if (op[id] == 2 && y[id] <= mid) { // add(x[id], -v[id]); // } // } @@ -111,43 +114,41 @@ //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); -// while (cin >> n) { -// fill(tree + 1, tree + n + 1, 0); -// int eventCnt = 0; -// for (int i = 1; i <= n; i++) { -// cin >> arr[i]; -// op[++eventCnt] = 1; -// x[eventCnt] = i; -// y[eventCnt] = arr[i]; -// v[eventCnt] = 1; -// } -// cin >> m; -// int queryCnt = 0; -// for (int i = 1; i <= m; i++) { -// cin >> op[++eventCnt]; -// if (op[eventCnt] == 1) { -// int a, b; -// cin >> a >> b; -// x[eventCnt] = a; -// y[eventCnt] = arr[a]; -// v[eventCnt] = -1; -// op[++eventCnt] = 1; -// x[eventCnt] = a; -// y[eventCnt] = b; -// v[eventCnt] = 1; -// arr[a] = b; -// } else { -// cin >> x[eventCnt] >> y[eventCnt] >> v[eventCnt]; -// q[eventCnt] = ++queryCnt; -// } -// } -// for (int i = 1; i <= eventCnt; i++) { -// eid[i] = i; -// } -// compute(1, eventCnt, 1, INF); -// for (int i = 1; i <= queryCnt; i++) { -// cout << ans[i] << '\n'; +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// op[++cnte] = 2; +// x[cnte] = i; +// y[cnte] = arr[i]; +// v[cnte] = 1; +// } +// for (int i = 1; i <= m; i++) { +// char type; +// cin >> type; +// if (type == 'Q') { +// op[++cnte] = 1; +// cin >> x[cnte] >> y[cnte] >> v[cnte]; +// q[cnte] = ++cntq; +// } else { +// int a, b; +// cin >> a >> b; +// op[++cnte] = 2; +// x[cnte] = a; +// y[cnte] = arr[a]; +// v[cnte] = -1; +// op[++cnte] = 2; +// x[cnte] = a; +// y[cnte] = b; +// v[cnte] = 1; +// arr[a] = b; // } // } +// for (int i = 1; i <= cnte; i++) { +// eid[i] = i; +// } +// compute(1, cnte, 0, INF); +// for (int i = 1; i <= cntq; i++) { +// cout << ans[i] << '\n'; +// } // return 0; //} \ No newline at end of file From 260b97b621acc0d034b29369892cd316522a3c36 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 May 2025 10:40:50 +0800 Subject: [PATCH 0146/1170] modify code --- src/class169/Code05_Fruit1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class169/Code05_Fruit1.java b/src/class169/Code05_Fruit1.java index 433c37d16..d199a9399 100644 --- a/src/class169/Code05_Fruit1.java +++ b/src/class169/Code05_Fruit1.java @@ -39,7 +39,7 @@ public class Code05_Fruit1 { // event[i][0]代表事件的类型,1为盘子类型,2为水果类型 // event[i][1]表示x轴的位置 - // 如果是盘子类型,那么event[i][2..5]分别代表 : yl、yr、权值v、产生的影响d + // 如果是盘子类型,那么event[i][2..5]分别代表 : yl、yr、权值v、产生的效果d // 如果是水果类型,那么event[i][2..5]分别代表 : y、空缺、要求v、问题的编号d public static int[][] event = new int[MAXN << 3][6]; public static int cnte = 0; From cade44cb4e52e8e9e46d559ce462f252b2533fd1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 May 2025 11:16:47 +0800 Subject: [PATCH 0147/1170] modify code --- src/class169/Code05_Fruit1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class169/Code05_Fruit1.java b/src/class169/Code05_Fruit1.java index d199a9399..4dcfa45dd 100644 --- a/src/class169/Code05_Fruit1.java +++ b/src/class169/Code05_Fruit1.java @@ -37,10 +37,10 @@ public class Code05_Fruit1 { public static int[] tree = new int[MAXN]; - // event[i][0]代表事件的类型,1为盘子类型,2为水果类型 - // event[i][1]表示x轴的位置 - // 如果是盘子类型,那么event[i][2..5]分别代表 : yl、yr、权值v、产生的效果d - // 如果是水果类型,那么event[i][2..5]分别代表 : y、空缺、要求v、问题的编号d + // event[i][0] == 1为盘子类型 + // 如果是盘子类型,event[i][1..5]分别代表 : x、yl、yr、权值v、产生的效果d + // event[i][0] == 2为水果类型 + // 如果是水果类型,event[i][1..5]分别代表 : x、y、空缺、要求v、问题的编号d public static int[][] event = new int[MAXN << 3][6]; public static int cnte = 0; From 2b5587353707605449597b1f6286bd38b52b9f41 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 May 2025 12:47:53 +0800 Subject: [PATCH 0148/1170] modify code --- src/class169/Code01_Juice1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class169/Code01_Juice1.java b/src/class169/Code01_Juice1.java index 36209772d..84b963e7a 100644 --- a/src/class169/Code01_Juice1.java +++ b/src/class169/Code01_Juice1.java @@ -32,9 +32,9 @@ public class Code01_Juice1 { // 果汁单价作为下标的线段树 // maxp为单价的最大上限 public static int maxp = 0; - // suml[i] : 线段树某单价区间上,总果汁的量 + // suml[i] : 线段树某单价区间上,允许添加的总量 public static long[] suml = new long[MAXN << 2]; - // cost[i] : 线段树某单价区间上,如果总果汁的量全买,花费多少钱 + // cost[i] : 线段树某单价区间上,如果允许添加的总量全要,花费多少钱 public static long[] cost = new long[MAXN << 2]; // 多少种果汁加入了线段树 public static int used = 0; From 9ad36438785f317d0ac6e468c71e6335f66916dd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 May 2025 13:37:30 +0800 Subject: [PATCH 0149/1170] modify code --- src/class169/Code01_Juice1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class169/Code01_Juice1.java b/src/class169/Code01_Juice1.java index 84b963e7a..dc31a44c2 100644 --- a/src/class169/Code01_Juice1.java +++ b/src/class169/Code01_Juice1.java @@ -30,7 +30,7 @@ public class Code01_Juice1 { public static long[] least = new long[MAXN]; // 果汁单价作为下标的线段树 - // maxp为单价的最大上限 + // maxp为最大的果汁单价 public static int maxp = 0; // suml[i] : 线段树某单价区间上,允许添加的总量 public static long[] suml = new long[MAXN << 2]; From 9f6c4201aaff5f06e963df0e73f2513085347f8e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 May 2025 13:44:49 +0800 Subject: [PATCH 0150/1170] modify code --- src/class169/Code01_Juice1.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/class169/Code01_Juice1.java b/src/class169/Code01_Juice1.java index dc31a44c2..0d6cf24fa 100644 --- a/src/class169/Code01_Juice1.java +++ b/src/class169/Code01_Juice1.java @@ -51,6 +51,7 @@ public static void up(int i) { cost[i] = cost[i << 1] + cost[i << 1 | 1]; } + // 单价为jobi,现在允许添加的量增加了jobv public static void add(int jobi, int jobv, int l, int r, int i) { if (l == r) { suml[i] += jobv; @@ -66,6 +67,8 @@ public static void add(int jobi, int jobv, int l, int r, int i) { } } + // 总体积一共volume,已知总体积一定能耗尽 + // 返回总体积耗尽的情况下,能花的最少钱数 public static long query(long volume, int l, int r, int i) { if (l == r) { return volume * l; @@ -134,7 +137,10 @@ public static void main(String[] args) throws Exception { money[i] = in.nextLong(); least[i] = in.nextLong(); } + // 所有果汁按照美味度排序,美味度大的在前,美味度小的在后 Arrays.sort(juice, 1, n + 1, (a, b) -> b[0] - a[0]); + // 答案范围就是美味度范围,从最美味的第1名,到最难喝的第n名 + // 如果小朋友答案为n+1,说明无法满足这个小朋友 compute(1, m, 1, n + 1); for (int i = 1; i <= m; i++) { if (ans[i] == n + 1) { From cf0ecb496d6bed7fdc500bf789a62b889f1ed018 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 May 2025 15:41:50 +0800 Subject: [PATCH 0151/1170] modify code --- src/class169/Code02_PastoralOddities1.java | 4 ++-- src/class169/Code02_PastoralOddities2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class169/Code02_PastoralOddities1.java b/src/class169/Code02_PastoralOddities1.java index 7df208e19..0eca2ceb0 100644 --- a/src/class169/Code02_PastoralOddities1.java +++ b/src/class169/Code02_PastoralOddities1.java @@ -81,7 +81,7 @@ public static void compute(int ql, int qr, int vl, int vr) { } if (vl == vr) { for (int i = ql; i <= qr; i++) { - ans[i] = wsort[vl][3]; + ans[i] = vl; } } else { int mid = (vl + vr) >> 1; @@ -158,7 +158,7 @@ public static void main(String[] args) throws Exception { prepare(); compute(1, m, 1, m + 1); for (int i = 1; i <= m; i++) { - out.println(ans[i]); + out.println(wsort[ans[i]][3]); } out.flush(); out.close(); diff --git a/src/class169/Code02_PastoralOddities2.java b/src/class169/Code02_PastoralOddities2.java index 606c75a30..3a7ce06bc 100644 --- a/src/class169/Code02_PastoralOddities2.java +++ b/src/class169/Code02_PastoralOddities2.java @@ -83,7 +83,7 @@ // } // if (vl == vr) { // for (int i = ql; i <= qr; i++) { -// ans[i] = wsort[vl].w; +// ans[i] = vl; // } // } else { // int mid = (vl + vr) >> 1; @@ -154,7 +154,7 @@ // prepare(); // compute(1, m, 1, m + 1); // for (int i = 1; i <= m; i++) { -// cout << ans[i] << '\n'; +// cout << wsort[ans[i]].w << '\n'; // } // return 0; //} \ No newline at end of file From 23289aa2864309be721c087835b8b8230c27f300 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 May 2025 13:48:58 +0800 Subject: [PATCH 0152/1170] modify code --- ...Rankings1.java => Code02_DynamicRankings1.java} | 2 +- ...Rankings2.java => Code02_DynamicRankings2.java} | 0 .../{Code04_Network1.java => Code03_Network1.java} | 2 +- .../{Code04_Network2.java => Code03_Network2.java} | 0 .../{Code05_Fruit1.java => Code04_Fruit1.java} | 2 +- .../{Code05_Fruit2.java => Code04_Fruit2.java} | 0 ...ddities1.java => Code05_PastoralOddities1.java} | 14 ++++++++++---- ...ddities2.java => Code05_PastoralOddities2.java} | 2 +- 8 files changed, 14 insertions(+), 8 deletions(-) rename src/class169/{Code03_DynamicRankings1.java => Code02_DynamicRankings1.java} (99%) rename src/class169/{Code03_DynamicRankings2.java => Code02_DynamicRankings2.java} (100%) rename src/class169/{Code04_Network1.java => Code03_Network1.java} (99%) rename src/class169/{Code04_Network2.java => Code03_Network2.java} (100%) rename src/class169/{Code05_Fruit1.java => Code04_Fruit1.java} (99%) rename src/class169/{Code05_Fruit2.java => Code04_Fruit2.java} (100%) rename src/class169/{Code02_PastoralOddities1.java => Code05_PastoralOddities1.java} (91%) rename src/class169/{Code02_PastoralOddities2.java => Code05_PastoralOddities2.java} (100%) diff --git a/src/class169/Code03_DynamicRankings1.java b/src/class169/Code02_DynamicRankings1.java similarity index 99% rename from src/class169/Code03_DynamicRankings1.java rename to src/class169/Code02_DynamicRankings1.java index 339d8d1d3..178655215 100644 --- a/src/class169/Code03_DynamicRankings1.java +++ b/src/class169/Code02_DynamicRankings1.java @@ -15,7 +15,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code03_DynamicRankings1 { +public class Code02_DynamicRankings1 { public static int MAXN = 100001; public static int MAXE = MAXN << 2; diff --git a/src/class169/Code03_DynamicRankings2.java b/src/class169/Code02_DynamicRankings2.java similarity index 100% rename from src/class169/Code03_DynamicRankings2.java rename to src/class169/Code02_DynamicRankings2.java diff --git a/src/class169/Code04_Network1.java b/src/class169/Code03_Network1.java similarity index 99% rename from src/class169/Code04_Network1.java rename to src/class169/Code03_Network1.java index 8dd4afafa..2706c5db7 100644 --- a/src/class169/Code04_Network1.java +++ b/src/class169/Code03_Network1.java @@ -17,7 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_Network1 { +public class Code03_Network1 { public static int MAXN = 100001; public static int MAXM = 200001; diff --git a/src/class169/Code04_Network2.java b/src/class169/Code03_Network2.java similarity index 100% rename from src/class169/Code04_Network2.java rename to src/class169/Code03_Network2.java diff --git a/src/class169/Code05_Fruit1.java b/src/class169/Code04_Fruit1.java similarity index 99% rename from src/class169/Code05_Fruit1.java rename to src/class169/Code04_Fruit1.java index 4dcfa45dd..5d36518a3 100644 --- a/src/class169/Code05_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -17,7 +17,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_Fruit1 { +public class Code04_Fruit1 { public static int MAXN = 40001; public static int MAXH = 16; diff --git a/src/class169/Code05_Fruit2.java b/src/class169/Code04_Fruit2.java similarity index 100% rename from src/class169/Code05_Fruit2.java rename to src/class169/Code04_Fruit2.java diff --git a/src/class169/Code02_PastoralOddities1.java b/src/class169/Code05_PastoralOddities1.java similarity index 91% rename from src/class169/Code02_PastoralOddities1.java rename to src/class169/Code05_PastoralOddities1.java index 0eca2ceb0..67dee7a8e 100644 --- a/src/class169/Code02_PastoralOddities1.java +++ b/src/class169/Code05_PastoralOddities1.java @@ -17,23 +17,25 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_PastoralOddities1 { +public class Code05_PastoralOddities1 { public static int MAXN = 100001; public static int MAXM = 300002; public static int n, m; - // 边的编号i、端点x、端点y、权值w + // edge是按时序组织的边数组 + // wsort是按权值组织的边数组 + // 边的时序i、端点x、端点y、权值w public static int[][] edge = new int[MAXM][4]; public static int[][] wsort = new int[MAXM][4]; - // 节点数为奇数的联通区数量 - public static int oddnum; // 可撤销并查集 public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[][] rollback = new int[MAXN][2]; public static int opsize = 0; + // 节点数为奇数的联通区数量 + public static int oddnum; public static int[] ans = new int[MAXM]; @@ -75,6 +77,10 @@ public static void undo() { } } + // 按时序组织的边在edge里,当前来到[ql..qr]范围 + // 按权值组织的边在wsort里,答案范围[vl..vr] + // 前提 : ql之前的边里,边权 <= wsort[vl].w 的所有边,都已经加到图上了 + // 利用整体二分得到所有边的答案 public static void compute(int ql, int qr, int vl, int vr) { if (ql > qr) { return; diff --git a/src/class169/Code02_PastoralOddities2.java b/src/class169/Code05_PastoralOddities2.java similarity index 100% rename from src/class169/Code02_PastoralOddities2.java rename to src/class169/Code05_PastoralOddities2.java index 3a7ce06bc..992907023 100644 --- a/src/class169/Code02_PastoralOddities2.java +++ b/src/class169/Code05_PastoralOddities2.java @@ -31,11 +31,11 @@ //Edge edge[MAXM]; //Edge wsort[MAXM]; // -//int oddnum; //int father[MAXN]; //int siz[MAXN]; //int rollback[MAXN][2]; //int opsize = 0; +//int oddnum; // //int ans[MAXM]; // From b68a9f225c2b1cf59f916918a569485a2537010b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 May 2025 15:53:47 +0800 Subject: [PATCH 0153/1170] modify code --- src/class169/Code02_DynamicRankings1.java | 40 +++++++++++------------ src/class169/Code02_DynamicRankings2.java | 32 +++++++++--------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/class169/Code02_DynamicRankings1.java b/src/class169/Code02_DynamicRankings1.java index 178655215..31b4a0b73 100644 --- a/src/class169/Code02_DynamicRankings1.java +++ b/src/class169/Code02_DynamicRankings1.java @@ -2,8 +2,8 @@ // 带修改的区间第k小,java版 // 给定一个长度为n的数组arr,接下来是m条操作,每种操作是如下两种类型的一种 -// 操作 Q x y v : 查询arr[x..y]范围上第v小的值 // 操作 C x y : 把x位置的值修改成y +// 操作 Q x y v : 查询arr[x..y]范围上第v小的值 // 1 <= n、m <= 10^5 // 1 <= 数组中的值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P2617 @@ -26,8 +26,8 @@ public class Code02_DynamicRankings1 { // 事件编号组成的数组 public static int[] eid = new int[MAXE]; - // op == 1,代表查询事件,[x..y]范围上查询第v小,q表示问题的编号 - // op == 2,代表修改事件,x处,值y,效果v + // op == 1,代表修改事件,x处,值y,效果v + // op == 2,代表查询事件,[x..y]范围上查询第v小,q表示问题的编号 public static int[] op = new int[MAXE]; public static int[] x = new int[MAXE]; public static int[] y = new int[MAXE]; @@ -77,7 +77,7 @@ public static void compute(int el, int er, int vl, int vr) { if (vl == vr) { for (int i = el; i <= er; i++) { int id = eid[i]; - if (op[id] == 1) { + if (op[id] == 2) { ans[q[id]] = vl; } } @@ -87,18 +87,18 @@ public static void compute(int el, int er, int vl, int vr) { for (int i = el; i <= er; i++) { int id = eid[i]; if (op[id] == 1) { - int satisfy = query(x[id], y[id]); - if (v[id] <= satisfy) { + if (y[id] <= mid) { + add(x[id], v[id]); lset[++lsiz] = id; } else { - v[id] -= satisfy; rset[++rsiz] = id; } } else { - if (y[id] <= mid) { - add(x[id], v[id]); + int satisfy = query(x[id], y[id]); + if (v[id] <= satisfy) { lset[++lsiz] = id; } else { + v[id] -= satisfy; rset[++rsiz] = id; } } @@ -111,7 +111,7 @@ public static void compute(int el, int er, int vl, int vr) { } for (int i = 1; i <= lsiz; i++) { int id = lset[i]; - if (op[id] == 2 && y[id] <= mid) { + if (op[id] == 1 && y[id] <= mid) { add(x[id], -v[id]); } } @@ -127,7 +127,7 @@ public static void main(String[] args) throws IOException { m = in.nextInt(); for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); - op[++cnte] = 2; + op[++cnte] = 1; x[cnte] = i; y[cnte] = arr[i]; v[cnte] = 1; @@ -135,24 +135,24 @@ public static void main(String[] args) throws IOException { char type; for (int i = 1; i <= m; i++) { type = in.nextChar(); - if (type == 'Q') { - op[++cnte] = 1; - x[cnte] = in.nextInt(); - y[cnte] = in.nextInt(); - v[cnte] = in.nextInt(); - q[cnte] = ++cntq; - } else { + if (type == 'C') { int a = in.nextInt(); int b = in.nextInt(); - op[++cnte] = 2; + op[++cnte] = 1; x[cnte] = a; y[cnte] = arr[a]; v[cnte] = -1; - op[++cnte] = 2; + op[++cnte] = 1; x[cnte] = a; y[cnte] = b; v[cnte] = 1; arr[a] = b; + } else { + op[++cnte] = 2; + x[cnte] = in.nextInt(); + y[cnte] = in.nextInt(); + v[cnte] = in.nextInt(); + q[cnte] = ++cntq; } } for (int i = 1; i <= cnte; i++) { diff --git a/src/class169/Code02_DynamicRankings2.java b/src/class169/Code02_DynamicRankings2.java index df251c7ed..4bbc856fa 100644 --- a/src/class169/Code02_DynamicRankings2.java +++ b/src/class169/Code02_DynamicRankings2.java @@ -2,8 +2,8 @@ // 带修改的区间第k小,C++版 // 给定一个长度为n的数组arr,接下来是m条操作,每种操作是如下两种类型的一种 -// 操作 Q x y v : 查询arr[x..y]范围上第v小的值 // 操作 C x y : 把x位置的值修改成y +// 操作 Q x y v : 查询arr[x..y]范围上第v小的值 // 1 <= n、m <= 10^5 // 1 <= 数组中的值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P2617 @@ -68,7 +68,7 @@ // if (vl == vr) { // for (int i = el; i <= er; i++) { // int id = eid[i]; -// if (op[id] == 1) { +// if (op[id] == 2) { // ans[q[id]] = vl; // } // } @@ -78,18 +78,18 @@ // for (int i = el; i <= er; i++) { // int id = eid[i]; // if (op[id] == 1) { -// int satisfy = query(x[id], y[id]); -// if (v[id] <= satisfy) { +// if (y[id] <= mid) { +// add(x[id], v[id]); // lset[++lsiz] = id; // } else { -// v[id] -= satisfy; // rset[++rsiz] = id; // } // } else { -// if (y[id] <= mid) { -// add(x[id], v[id]); +// int satisfy = query(x[id], y[id]); +// if (v[id] <= satisfy) { // lset[++lsiz] = id; // } else { +// v[id] -= satisfy; // rset[++rsiz] = id; // } // } @@ -102,7 +102,7 @@ // } // for (int i = 1; i <= lsiz; i++) { // int id = lset[i]; -// if (op[id] == 2 && y[id] <= mid) { +// if (op[id] == 1 && y[id] <= mid) { // add(x[id], -v[id]); // } // } @@ -117,7 +117,7 @@ // cin >> n >> m; // for (int i = 1; i <= n; i++) { // cin >> arr[i]; -// op[++cnte] = 2; +// op[++cnte] = 1; // x[cnte] = i; // y[cnte] = arr[i]; // v[cnte] = 1; @@ -125,22 +125,22 @@ // for (int i = 1; i <= m; i++) { // char type; // cin >> type; -// if (type == 'Q') { -// op[++cnte] = 1; -// cin >> x[cnte] >> y[cnte] >> v[cnte]; -// q[cnte] = ++cntq; -// } else { +// if (type == 'C') { // int a, b; // cin >> a >> b; -// op[++cnte] = 2; +// op[++cnte] = 1; // x[cnte] = a; // y[cnte] = arr[a]; // v[cnte] = -1; -// op[++cnte] = 2; +// op[++cnte] = 1; // x[cnte] = a; // y[cnte] = b; // v[cnte] = 1; // arr[a] = b; +// } else { +// op[++cnte] = 2; +// cin >> x[cnte] >> y[cnte] >> v[cnte]; +// q[cnte] = ++cntq; // } // } // for (int i = 1; i <= cnte; i++) { From 8ea691b268b43bde1e87f7cee1362f94417c55c3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 May 2025 17:43:00 +0800 Subject: [PATCH 0154/1170] modify code --- src/class169/Code03_Network1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class169/Code03_Network1.java b/src/class169/Code03_Network1.java index 2706c5db7..72e2cd1bc 100644 --- a/src/class169/Code03_Network1.java +++ b/src/class169/Code03_Network1.java @@ -183,6 +183,7 @@ public static int query(int i) { return ret; } + // 点x到点y的路径上,每个点增加v个请求数量 public static void pathAdd(int x, int y, int v) { int xylca = lca(x, y); int lcafa = fa[xylca]; @@ -194,6 +195,7 @@ public static void pathAdd(int x, int y, int v) { } } + // 查询和x点相关的请求数量 public static int pointQuery(int x) { return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); } From a9e5c65d1a57eafd5eb68add33a08281b7159a90 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 May 2025 17:50:11 +0800 Subject: [PATCH 0155/1170] modify code --- src/class169/Code04_Fruit1.java | 16 ++++++++-------- src/class169/Code04_Fruit2.java | 16 ++++++++-------- src/class169/Code05_PastoralOddities1.java | 18 +++++++++--------- src/class169/Code05_PastoralOddities2.java | 18 +++++++++--------- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/class169/Code04_Fruit1.java b/src/class169/Code04_Fruit1.java index 5d36518a3..b1107c6f6 100644 --- a/src/class169/Code04_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -206,12 +206,12 @@ public static void clone(int[] a, int[] b) { a[5] = b[5]; } - public static void compute(int ql, int qr, int vl, int vr) { - if (ql > qr) { + public static void compute(int el, int er, int vl, int vr) { + if (el > er) { return; } if (vl == vr) { - for (int i = ql; i <= qr; i++) { + for (int i = el; i <= er; i++) { if (event[i][0] == 2) { ans[event[i][5]] = vl; } @@ -219,7 +219,7 @@ public static void compute(int ql, int qr, int vl, int vr) { } else { int mid = (vl + vr) >> 1; int lsiz = 0, rsiz = 0; - for (int i = ql; i <= qr; i++) { + for (int i = el; i <= er; i++) { if (event[i][0] == 1) { if (event[i][4] <= mid) { add(event[i][2], event[i][3], event[i][5]); @@ -244,13 +244,13 @@ public static void compute(int ql, int qr, int vl, int vr) { // 同一个盘子的两条扫描线,一定会在一起,是不可能分开的 // 所以此时树状数组就是清空的,不需要再做撤销操作 for (int i = 1; i <= lsiz; i++) { - clone(event[ql + i - 1], lset[i]); + clone(event[el + i - 1], lset[i]); } for (int i = 1; i <= rsiz; i++) { - clone(event[ql + lsiz + i - 1], rset[i]); + clone(event[el + lsiz + i - 1], rset[i]); } - compute(ql, ql + lsiz - 1, vl, mid); - compute(ql + lsiz, qr, mid + 1, vr); + compute(el, el + lsiz - 1, vl, mid); + compute(el + lsiz, er, mid + 1, vr); } } diff --git a/src/class169/Code04_Fruit2.java b/src/class169/Code04_Fruit2.java index e3150f87e..875faafb5 100644 --- a/src/class169/Code04_Fruit2.java +++ b/src/class169/Code04_Fruit2.java @@ -153,12 +153,12 @@ // event[cnte].d = d; //} // -//void compute(int ql, int qr, int vl, int vr) { -// if (ql > qr) { +//void compute(int el, int er, int vl, int vr) { +// if (el > er) { // return; // } // if (vl == vr) { -// for (int i = ql; i <= qr; i++) { +// for (int i = el; i <= er; i++) { // if (event[i].op == 2) { // ans[event[i].d] = vl; // } @@ -166,7 +166,7 @@ // } else { // int mid = (vl + vr) >> 1; // int lsiz = 0, rsiz = 0; -// for (int i = ql; i <= qr; i++) { +// for (int i = el; i <= er; i++) { // if (event[i].op == 1) { // if (event[i].v <= mid) { // add(event[i].yl, event[i].yr, event[i].d); @@ -185,13 +185,13 @@ // } // } // for (int i = 1; i <= lsiz; i++) { -// event[ql + i - 1] = lset[i]; +// event[el + i - 1] = lset[i]; // } // for (int i = 1; i <= rsiz; i++) { -// event[ql + lsiz + i - 1] = rset[i]; +// event[el + lsiz + i - 1] = rset[i]; // } -// compute(ql, ql + lsiz - 1, vl, mid); -// compute(ql + lsiz, qr, mid + 1, vr); +// compute(el, el + lsiz - 1, vl, mid); +// compute(el + lsiz, er, mid + 1, vr); // } //} // diff --git a/src/class169/Code05_PastoralOddities1.java b/src/class169/Code05_PastoralOddities1.java index 67dee7a8e..55f247375 100644 --- a/src/class169/Code05_PastoralOddities1.java +++ b/src/class169/Code05_PastoralOddities1.java @@ -81,27 +81,27 @@ public static void undo() { // 按权值组织的边在wsort里,答案范围[vl..vr] // 前提 : ql之前的边里,边权 <= wsort[vl].w 的所有边,都已经加到图上了 // 利用整体二分得到所有边的答案 - public static void compute(int ql, int qr, int vl, int vr) { - if (ql > qr) { + public static void compute(int el, int er, int vl, int vr) { + if (el > er) { return; } if (vl == vr) { - for (int i = ql; i <= qr; i++) { + for (int i = el; i <= er; i++) { ans[i] = vl; } } else { int mid = (vl + vr) >> 1; int unionCnt1 = 0; for (int i = vl; i <= mid; i++) { - if (wsort[i][0] < ql) { + if (wsort[i][0] < el) { if (union(wsort[i][1], wsort[i][2])) { unionCnt1++; } } } int unionCnt2 = 0; - int split = qr + 1; - for (int i = ql; i <= qr; i++) { + int split = er + 1; + for (int i = el; i <= er; i++) { if (edge[i][3] <= wsort[mid][3]) { if (union(edge[i][1], edge[i][2])) { unionCnt2++; @@ -115,19 +115,19 @@ public static void compute(int ql, int qr, int vl, int vr) { for (int i = 1; i <= unionCnt2; i++) { undo(); } - compute(ql, split - 1, mid + 1, vr); + compute(el, split - 1, mid + 1, vr); for (int i = 1; i <= unionCnt1; i++) { undo(); } int unionCnt3 = 0; - for (int i = ql; i <= split - 1; i++) { + for (int i = el; i <= split - 1; i++) { if (edge[i][3] <= wsort[vl][3]) { if (union(edge[i][1], edge[i][2])) { unionCnt3++; } } } - compute(split, qr, vl, mid); + compute(split, er, vl, mid); for (int i = 1; i <= unionCnt3; i++) { undo(); } diff --git a/src/class169/Code05_PastoralOddities2.java b/src/class169/Code05_PastoralOddities2.java index 992907023..a8a99a0b1 100644 --- a/src/class169/Code05_PastoralOddities2.java +++ b/src/class169/Code05_PastoralOddities2.java @@ -77,27 +77,27 @@ // } //} // -//void compute(int ql, int qr, int vl, int vr) { -// if (ql > qr) { +//void compute(int el, int er, int vl, int vr) { +// if (el > er) { // return; // } // if (vl == vr) { -// for (int i = ql; i <= qr; i++) { +// for (int i = el; i <= er; i++) { // ans[i] = vl; // } // } else { // int mid = (vl + vr) >> 1; // int unionCnt1 = 0; // for (int i = vl; i <= mid; i++) { -// if (wsort[i].i < ql) { +// if (wsort[i].i < el) { // if (Union(wsort[i].x, wsort[i].y)) { // unionCnt1++; // } // } // } // int unionCnt2 = 0; -// int split = qr + 1; -// for (int i = ql; i <= qr; i++) { +// int split = er + 1; +// for (int i = el; i <= er; i++) { // if (edge[i].w <= wsort[mid].w) { // if (Union(edge[i].x, edge[i].y)) { // unionCnt2++; @@ -111,19 +111,19 @@ // for (int i = 1; i <= unionCnt2; i++) { // undo(); // } -// compute(ql, split - 1, mid + 1, vr); +// compute(el, split - 1, mid + 1, vr); // for (int i = 1; i <= unionCnt1; i++) { // undo(); // } // int unionCnt3 = 0; -// for (int i = ql; i <= split - 1; i++) { +// for (int i = el; i <= split - 1; i++) { // if (edge[i].w <= wsort[vl].w) { // if (Union(edge[i].x, edge[i].y)) { // unionCnt3++; // } // } // } -// compute(split, qr, vl, mid); +// compute(split, er, vl, mid); // for (int i = 1; i <= unionCnt3; i++) { // undo(); // } From 18527b93f8e09d42ff7683d7d30a27786809d9ed Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 May 2025 19:20:40 +0800 Subject: [PATCH 0156/1170] modify code --- src/class169/Code04_Fruit1.java | 1 + src/class169/Code04_Fruit2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class169/Code04_Fruit1.java b/src/class169/Code04_Fruit1.java index b1107c6f6..7f7f86dd4 100644 --- a/src/class169/Code04_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -8,6 +8,7 @@ // 那么对于每个水果,可能有很多盘子都可以将其接住,打印其中第k小的权值 // 1 <= n、p、q <= 4 * 10^4 // 0 <= 盘子权值 <= 10^9 +// 内存可用空间500MB // 测试链接 : https://www.luogu.com.cn/problem/P3242 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class169/Code04_Fruit2.java b/src/class169/Code04_Fruit2.java index 875faafb5..0a4597d9a 100644 --- a/src/class169/Code04_Fruit2.java +++ b/src/class169/Code04_Fruit2.java @@ -8,6 +8,7 @@ // 那么对于每个水果,可能有很多盘子都可以将其接住,打印其中第k小的权值 // 1 <= n、p、q <= 4 * 10^4 // 0 <= 盘子权值 <= 10^9 +// 内存可用空间500MB // 测试链接 : https://www.luogu.com.cn/problem/P3242 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From d441e7f641d4ace15da90d26c03b68138a215f4e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 May 2025 22:14:49 +0800 Subject: [PATCH 0157/1170] modify code --- ...kets.java => Code03_GroupBuyTickets1.java} | 2 +- src/class091/Code03_GroupBuyTickets2.java | 129 ++++++++++++++++++ 2 files changed, 130 insertions(+), 1 deletion(-) rename src/class091/{Code03_GroupBuyTickets.java => Code03_GroupBuyTickets1.java} (99%) create mode 100644 src/class091/Code03_GroupBuyTickets2.java diff --git a/src/class091/Code03_GroupBuyTickets.java b/src/class091/Code03_GroupBuyTickets1.java similarity index 99% rename from src/class091/Code03_GroupBuyTickets.java rename to src/class091/Code03_GroupBuyTickets1.java index 62a90da3c..fa987d966 100644 --- a/src/class091/Code03_GroupBuyTickets.java +++ b/src/class091/Code03_GroupBuyTickets1.java @@ -22,7 +22,7 @@ // 数据量描述 : // 1 <= M、N、Ki、Bi <= 10^5 // 来自真实大厂笔试,没有在线测试,对数器验证 -public class Code03_GroupBuyTickets { +public class Code03_GroupBuyTickets1 { // 暴力方法 // 为了验证 diff --git a/src/class091/Code03_GroupBuyTickets2.java b/src/class091/Code03_GroupBuyTickets2.java new file mode 100644 index 000000000..0312b6ced --- /dev/null +++ b/src/class091/Code03_GroupBuyTickets2.java @@ -0,0 +1,129 @@ +package class091; + +// 组团买票找到了在线测试 +// 逻辑和课上讲的一样,做了一些小优化 +// 测试链接 : https://www.luogu.com.cn/problem/P12331 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.util.PriorityQueue; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code03_GroupBuyTickets2 { + + public static class Game { + public long ki; + public long bi; + public int people; + + public Game(long k, long b) { + ki = k; + bi = b; + } + + public long earn() { + return cost(people + 1) - cost(people); + } + + public long cost(long p) { + long price = ki * p + bi; + if (price < 0) { + price = 0; + } + return p * price; + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + int n = in.nextInt(); + int m = in.nextInt(); + PriorityQueue heap = new PriorityQueue<>((a, b) -> Long.compare(b.earn(), a.earn())); + for (int i = 0; i < m; i++) { + Game cur = new Game(in.nextLong(), in.nextLong()); + // 初始增费<=0的项目直接忽略 + if (cur.earn() > 0) { + heap.add(cur); + } + } + long ans = 0; + for (int i = 0; i < n && !heap.isEmpty(); i++) { + Game cur = heap.poll(); + long money = cur.earn(); + if (money <= 0) { + // 没有正向增费,那么可以结束了 + break; + } + ans += money; + cur.people++; + if (cur.earn() > 0) { + heap.add(cur); + } + } + out.println(ans); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + + long nextLong() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + long val = 0L; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + + } + +} From ff1789bf51d7a949bb8e4082219b8377e4bffff6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 May 2025 22:37:46 +0800 Subject: [PATCH 0158/1170] modify code --- src/class169/Code04_Fruit1.java | 60 ++++++++++++++++++++------------- src/class169/Code04_Fruit2.java | 48 ++++++++++++++++---------- 2 files changed, 67 insertions(+), 41 deletions(-) diff --git a/src/class169/Code04_Fruit1.java b/src/class169/Code04_Fruit1.java index 7f7f86dd4..c81577e2a 100644 --- a/src/class169/Code04_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -38,15 +38,14 @@ public class Code04_Fruit1 { public static int[] tree = new int[MAXN]; - // event[i][0] == 1为盘子类型 - // 如果是盘子类型,event[i][1..5]分别代表 : x、yl、yr、权值v、产生的效果d - // event[i][0] == 2为水果类型 - // 如果是水果类型,event[i][1..5]分别代表 : x、y、空缺、要求v、问题的编号d - public static int[][] event = new int[MAXN << 3][6]; + // event[i][0] == 1为加盘子事件,x处加,yl..yr词频+1,盘子权值v + // event[i][0] == 2为删盘子事件,x处减,yl..yr词频+1,盘子权值v + // event[i][0] == 3为水果事件,x、yl、要求yr、问题编号v + public static int[][] event = new int[MAXN << 3][5]; public static int cnte = 0; - public static int[][] lset = new int[MAXN << 3][6]; - public static int[][] rset = new int[MAXN << 3][6]; + public static int[][] lset = new int[MAXN << 3][5]; + public static int[][] rset = new int[MAXN << 3][5]; public static int[] ans = new int[MAXN]; @@ -181,21 +180,28 @@ public static int query(int i) { return ret; } - public static void addPlate(int x, int yl, int yr, int v, int d) { + public static void addPlate(int x, int yl, int yr, int v) { event[++cnte][0] = 1; event[cnte][1] = x; event[cnte][2] = yl; event[cnte][3] = yr; event[cnte][4] = v; - event[cnte][5] = d; } - public static void addFruit(int x, int y, int v, int d) { + public static void delPlate(int x, int yl, int yr, int v) { event[++cnte][0] = 2; event[cnte][1] = x; - event[cnte][2] = y; + event[cnte][2] = yl; + event[cnte][3] = yr; event[cnte][4] = v; - event[cnte][5] = d; + } + + public static void addFruit(int x, int y, int v, int i) { + event[++cnte][0] = 3; + event[cnte][1] = x; + event[cnte][2] = y; + event[cnte][3] = v; + event[cnte][4] = i; } public static void clone(int[] a, int[] b) { @@ -204,7 +210,6 @@ public static void clone(int[] a, int[] b) { a[2] = b[2]; a[3] = b[3]; a[4] = b[4]; - a[5] = b[5]; } public static void compute(int el, int er, int vl, int vr) { @@ -213,8 +218,8 @@ public static void compute(int el, int er, int vl, int vr) { } if (vl == vr) { for (int i = el; i <= er; i++) { - if (event[i][0] == 2) { - ans[event[i][5]] = vl; + if (event[i][0] == 3) { + ans[event[i][4]] = vl; } } } else { @@ -223,17 +228,24 @@ public static void compute(int el, int er, int vl, int vr) { for (int i = el; i <= er; i++) { if (event[i][0] == 1) { if (event[i][4] <= mid) { - add(event[i][2], event[i][3], event[i][5]); + add(event[i][2], event[i][3], 1); + clone(lset[++lsiz], event[i]); + } else { + clone(rset[++rsiz], event[i]); + } + } else if (event[i][0] == 2) { + if (event[i][4] <= mid) { + add(event[i][2], event[i][3], -1); clone(lset[++lsiz], event[i]); } else { clone(rset[++rsiz], event[i]); } } else { int satisfy = query(event[i][2]); - if (satisfy >= event[i][4]) { + if (satisfy >= event[i][3]) { clone(lset[++lsiz], event[i]); } else { - event[i][4] -= satisfy; + event[i][3] -= satisfy; clone(rset[++rsiz], event[i]); } } @@ -280,13 +292,13 @@ public static void main(String[] args) throws Exception { int ablca = lca(a, b); if (ablca == a) { int son = lcaSon(a, b); - addPlate(1, ldfn[b], rdfn[b], c, 1); - addPlate(ldfn[son], ldfn[b], rdfn[b], c, -1); - addPlate(ldfn[b], rdfn[son] + 1, n, c, 1); - addPlate(rdfn[b] + 1, rdfn[son] + 1, n, c, -1); + addPlate(1, ldfn[b], rdfn[b], c); + delPlate(ldfn[son], ldfn[b], rdfn[b], c); + addPlate(ldfn[b], rdfn[son] + 1, n, c); + delPlate(rdfn[b] + 1, rdfn[son] + 1, n, c); } else { - addPlate(ldfn[a], ldfn[b], rdfn[b], c, 1); - addPlate(rdfn[a] + 1, ldfn[b], rdfn[b], c, -1); + addPlate(ldfn[a], ldfn[b], rdfn[b], c); + delPlate(rdfn[a] + 1, ldfn[b], rdfn[b], c); } } for (int i = 1; i <= q; i++) { diff --git a/src/class169/Code04_Fruit2.java b/src/class169/Code04_Fruit2.java index 0a4597d9a..3ce666ea2 100644 --- a/src/class169/Code04_Fruit2.java +++ b/src/class169/Code04_Fruit2.java @@ -18,7 +18,7 @@ //using namespace std; // //struct Event { -// int op, x, yl, yr, v, d; +// int op, x, yl, yr, v; //}; // //bool EventCmp(Event e1, Event e2) { @@ -137,21 +137,28 @@ // return ret; //} // -//void addPlate(int x, int yl, int yr, int v, int d) { +//void addPlate(int x, int yl, int yr, int v) { // event[++cnte].op = 1; // event[cnte].x = x; // event[cnte].yl = yl; // event[cnte].yr = yr; // event[cnte].v = v; -// event[cnte].d = d; //} // -//void addFruit(int x, int y, int v, int d) { +//void delPlate(int x, int yl, int yr, int v) { // event[++cnte].op = 2; // event[cnte].x = x; -// event[cnte].yl = y; +// event[cnte].yl = yl; +// event[cnte].yr = yr; // event[cnte].v = v; -// event[cnte].d = d; +//} +// +//void addFruit(int x, int y, int k, int i) { +// event[++cnte].op = 3; +// event[cnte].x = x; +// event[cnte].yl = y; +// event[cnte].yr = k; +// event[cnte].v = i; //} // //void compute(int el, int er, int vl, int vr) { @@ -160,8 +167,8 @@ // } // if (vl == vr) { // for (int i = el; i <= er; i++) { -// if (event[i].op == 2) { -// ans[event[i].d] = vl; +// if (event[i].op == 3) { +// ans[event[i].v] = vl; // } // } // } else { @@ -170,17 +177,24 @@ // for (int i = el; i <= er; i++) { // if (event[i].op == 1) { // if (event[i].v <= mid) { -// add(event[i].yl, event[i].yr, event[i].d); +// add(event[i].yl, event[i].yr, 1); +// lset[++lsiz] = event[i]; +// } else { +// rset[++rsiz] = event[i]; +// } +// } else if (event[i].op == 2) { +// if (event[i].v <= mid) { +// add(event[i].yl, event[i].yr, -1); // lset[++lsiz] = event[i]; // } else { // rset[++rsiz] = event[i]; // } // } else { // int satisfy = query(event[i].yl); -// if (satisfy >= event[i].v) { +// if (satisfy >= event[i].yr) { // lset[++lsiz] = event[i]; // } else { -// event[i].v -= satisfy; +// event[i].yr -= satisfy; // rset[++rsiz] = event[i]; // } // } @@ -216,13 +230,13 @@ // int ablca = lca(a, b); // if (ablca == a) { // int son = lcaSon(a, b); -// addPlate(1, ldfn[b], rdfn[b], c, 1); -// addPlate(ldfn[son], ldfn[b], rdfn[b], c, -1); -// addPlate(ldfn[b], rdfn[son] + 1, n, c, 1); -// addPlate(rdfn[b] + 1, rdfn[son] + 1, n, c, -1); +// addPlate(1, ldfn[b], rdfn[b], c); +// delPlate(ldfn[son], ldfn[b], rdfn[b], c); +// addPlate(ldfn[b], rdfn[son] + 1, n, c); +// delPlate(rdfn[b] + 1, rdfn[son] + 1, n, c); // } else { -// addPlate(ldfn[a], ldfn[b], rdfn[b], c, 1); -// addPlate(rdfn[a] + 1, ldfn[b], rdfn[b], c, -1); +// addPlate(ldfn[a], ldfn[b], rdfn[b], c); +// delPlate(rdfn[a] + 1, ldfn[b], rdfn[b], c); // } // } // for (int i = 1, u, v, k; i <= q; i++) { From 4332e9198dea8a1cdc90c2f04189aeda92052721 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 May 2025 22:55:06 +0800 Subject: [PATCH 0159/1170] modify code --- src/class091/Code03_GroupBuyTickets2.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class091/Code03_GroupBuyTickets2.java b/src/class091/Code03_GroupBuyTickets2.java index 0312b6ced..8800d4adb 100644 --- a/src/class091/Code03_GroupBuyTickets2.java +++ b/src/class091/Code03_GroupBuyTickets2.java @@ -1,7 +1,8 @@ package class091; // 组团买票找到了在线测试 -// 逻辑和课上讲的一样,做了一些小优化 +// 逻辑和课上讲的一样,但是测试中设定的ki为负数 +// 实现做了一些小优化,具体可以看注释 // 测试链接 : https://www.luogu.com.cn/problem/P12331 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 2ae065cedb5efdc33ea6e4648ce3add184a4d5d8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 May 2025 13:18:12 +0800 Subject: [PATCH 0160/1170] modify code --- src/class169/Code04_Fruit1.java | 86 +++++++++++++++++++-------------- src/class169/Code04_Fruit2.java | 56 +++++++++++---------- 2 files changed, 80 insertions(+), 62 deletions(-) diff --git a/src/class169/Code04_Fruit1.java b/src/class169/Code04_Fruit1.java index c81577e2a..429a3cd97 100644 --- a/src/class169/Code04_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -25,28 +25,37 @@ public class Code04_Fruit1 { public static int INF = 1000000001; public static int n, p, q; + // 链式前向星 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN << 1]; public static int[] to = new int[MAXN << 1]; public static int cntg = 0; + // 树上倍增 + 每棵子树上的ldfn和rdfn public static int[] dep = new int[MAXN]; public static int[] ldfn = new int[MAXN]; public static int[] rdfn = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXH]; public static int cntd = 0; + // 只有y维度的树状数组 public static int[] tree = new int[MAXN]; - // event[i][0] == 1为加盘子事件,x处加,yl..yr词频+1,盘子权值v - // event[i][0] == 2为删盘子事件,x处减,yl..yr词频+1,盘子权值v - // event[i][0] == 3为水果事件,x、yl、要求yr、问题编号v - public static int[][] event = new int[MAXN << 3][5]; + // 所有事件编号的数组 + public static int[] eid = new int[MAXN << 3]; + // 所有事件对象的数组,每个对象有8个属性值 + // event[i][0] == 1为加盘子事件,x处加,yl..yr词频+1,盘子权值v、空缺、空缺、空缺 + // event[i][0] == 2为删盘子事件,x处减,yl..yr词频+1,盘子权值v、空缺、空缺、空缺 + // event[i][0] == 3为水果事件,x、空缺、空缺、空缺、y、要求k、问题编号i + public static int[][] event = new int[MAXN << 3][8]; + // 事件的总数 public static int cnte = 0; - public static int[][] lset = new int[MAXN << 3][5]; - public static int[][] rset = new int[MAXN << 3][5]; + // 整体二分 + public static int[] lset = new int[MAXN << 3]; + public static int[] rset = new int[MAXN << 3]; + // 每个水果的答案 public static int[] ans = new int[MAXN]; public static void addEdge(int u, int v) { @@ -141,6 +150,8 @@ public static int lca(int a, int b) { return stjump[a][0]; } + // 已知a和b的最低公共祖先一定是a或b + // 假设祖先为x,后代为y,返回x的哪个儿子的子树里有y public static int lcaSon(int a, int b) { if (dep[a] < dep[b]) { int tmp = a; @@ -166,11 +177,13 @@ public static void add(int i, int v) { } } + // 树状数组中[l..r]范围上的每个数增加v public static void add(int l, int r, int v) { add(l, v); add(r + 1, -v); } + // 树状数组中查询单点的值 public static int query(int i) { int ret = 0; while (i > 0) { @@ -196,20 +209,13 @@ public static void delPlate(int x, int yl, int yr, int v) { event[cnte][4] = v; } - public static void addFruit(int x, int y, int v, int i) { + public static void addFruit(int x, int y, int k, int i) { event[++cnte][0] = 3; event[cnte][1] = x; - event[cnte][2] = y; - event[cnte][3] = v; - event[cnte][4] = i; - } - - public static void clone(int[] a, int[] b) { - a[0] = b[0]; - a[1] = b[1]; - a[2] = b[2]; - a[3] = b[3]; - a[4] = b[4]; + // 2、3、4位空缺 + event[cnte][5] = y; + event[cnte][6] = k; + event[cnte][7] = i; } public static void compute(int el, int er, int vl, int vr) { @@ -218,35 +224,37 @@ public static void compute(int el, int er, int vl, int vr) { } if (vl == vr) { for (int i = el; i <= er; i++) { - if (event[i][0] == 3) { - ans[event[i][4]] = vl; + int id = eid[i]; + if (event[id][0] == 3) { + ans[event[id][7]] = vl; } } } else { int mid = (vl + vr) >> 1; int lsiz = 0, rsiz = 0; for (int i = el; i <= er; i++) { - if (event[i][0] == 1) { - if (event[i][4] <= mid) { - add(event[i][2], event[i][3], 1); - clone(lset[++lsiz], event[i]); + int id = eid[i]; + if (event[id][0] == 1) { + if (event[id][4] <= mid) { + add(event[id][2], event[id][3], 1); + lset[++lsiz] = id; } else { - clone(rset[++rsiz], event[i]); + rset[++rsiz] = id; } - } else if (event[i][0] == 2) { - if (event[i][4] <= mid) { - add(event[i][2], event[i][3], -1); - clone(lset[++lsiz], event[i]); + } else if (event[id][0] == 2) { + if (event[id][4] <= mid) { + add(event[id][2], event[id][3], -1); + lset[++lsiz] = id; } else { - clone(rset[++rsiz], event[i]); + rset[++rsiz] = id; } } else { - int satisfy = query(event[i][2]); - if (satisfy >= event[i][3]) { - clone(lset[++lsiz], event[i]); + int satisfy = query(event[id][5]); + if (satisfy >= event[id][6]) { + lset[++lsiz] = id; } else { - event[i][3] -= satisfy; - clone(rset[++rsiz], event[i]); + event[id][6] -= satisfy; + rset[++rsiz] = id; } } } @@ -257,10 +265,10 @@ public static void compute(int el, int er, int vl, int vr) { // 同一个盘子的两条扫描线,一定会在一起,是不可能分开的 // 所以此时树状数组就是清空的,不需要再做撤销操作 for (int i = 1; i <= lsiz; i++) { - clone(event[el + i - 1], lset[i]); + eid[el + i - 1] = lset[i]; } for (int i = 1; i <= rsiz; i++) { - clone(event[el + lsiz + i - 1], rset[i]); + eid[el + lsiz + i - 1] = rset[i]; } compute(el, el + lsiz - 1, vl, mid); compute(el + lsiz, er, mid + 1, vr); @@ -307,7 +315,11 @@ public static void main(String[] args) throws Exception { int k = in.nextInt(); addFruit(Math.min(ldfn[u], ldfn[v]), Math.max(ldfn[u], ldfn[v]), k, i); } + // 根据x排序,如果x一样,加盘子排最前、删盘子其次、水果最后 Arrays.sort(event, 1, cnte + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[0] - b[0]); + for (int i = 1; i <= cnte; i++) { + eid[i] = i; + } compute(1, cnte, 0, INF); for (int i = 1; i <= q; i++) { out.println(ans[i]); diff --git a/src/class169/Code04_Fruit2.java b/src/class169/Code04_Fruit2.java index 3ce666ea2..792e30012 100644 --- a/src/class169/Code04_Fruit2.java +++ b/src/class169/Code04_Fruit2.java @@ -18,7 +18,7 @@ //using namespace std; // //struct Event { -// int op, x, yl, yr, v; +// int op, x, yl, yr, v, y, k, i; //}; // //bool EventCmp(Event e1, Event e2) { @@ -46,11 +46,12 @@ // //int tree[MAXN]; // +//int eid[MAXN << 3]; //Event event[MAXN << 3]; //int cnte = 0; // -//Event lset[MAXN << 3]; -//Event rset[MAXN << 3]; +//int lset[MAXN << 3]; +//int rset[MAXN << 3]; // //int ans[MAXN]; // @@ -156,9 +157,9 @@ //void addFruit(int x, int y, int k, int i) { // event[++cnte].op = 3; // event[cnte].x = x; -// event[cnte].yl = y; -// event[cnte].yr = k; -// event[cnte].v = i; +// event[cnte].y = y; +// event[cnte].k = k; +// event[cnte].i = i; //} // //void compute(int el, int er, int vl, int vr) { @@ -167,43 +168,45 @@ // } // if (vl == vr) { // for (int i = el; i <= er; i++) { -// if (event[i].op == 3) { -// ans[event[i].v] = vl; +// int id = eid[i]; +// if (event[id].op == 3) { +// ans[event[id].i] = vl; // } // } // } else { // int mid = (vl + vr) >> 1; // int lsiz = 0, rsiz = 0; // for (int i = el; i <= er; i++) { -// if (event[i].op == 1) { -// if (event[i].v <= mid) { -// add(event[i].yl, event[i].yr, 1); -// lset[++lsiz] = event[i]; +// int id = eid[i]; +// if (event[id].op == 1) { +// if (event[id].v <= mid) { +// add(event[id].yl, event[id].yr, 1); +// lset[++lsiz] = id; // } else { -// rset[++rsiz] = event[i]; +// rset[++rsiz] = id; // } -// } else if (event[i].op == 2) { -// if (event[i].v <= mid) { -// add(event[i].yl, event[i].yr, -1); -// lset[++lsiz] = event[i]; +// } else if (event[id].op == 2) { +// if (event[id].v <= mid) { +// add(event[id].yl, event[id].yr, -1); +// lset[++lsiz] = id; // } else { -// rset[++rsiz] = event[i]; +// rset[++rsiz] = id; // } // } else { -// int satisfy = query(event[i].yl); -// if (satisfy >= event[i].yr) { -// lset[++lsiz] = event[i]; +// int satisfy = query(event[id].y); +// if (satisfy >= event[id].k) { +// lset[++lsiz] = id; // } else { -// event[i].yr -= satisfy; -// rset[++rsiz] = event[i]; +// event[id].k -= satisfy; +// rset[++rsiz] = id; // } // } // } // for (int i = 1; i <= lsiz; i++) { -// event[el + i - 1] = lset[i]; +// eid[el + i - 1] = lset[i]; // } // for (int i = 1; i <= rsiz; i++) { -// event[el + lsiz + i - 1] = rset[i]; +// eid[el + lsiz + i - 1] = rset[i]; // } // compute(el, el + lsiz - 1, vl, mid); // compute(el + lsiz, er, mid + 1, vr); @@ -244,6 +247,9 @@ // addFruit(min(ldfn[u], ldfn[v]), max(ldfn[u], ldfn[v]), k, i); // } // sort(event + 1, event + cnte + 1, EventCmp); +// for (int i = 1; i <= cnte; i++) { +// eid[i] = i; +// } // compute(1, cnte, 0, INF); // for (int i = 1; i <= q; i++) { // cout << ans[i] << '\n'; From cb0d474add4b6cdff0eaf9c43fe6f5879560e96c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 May 2025 13:19:59 +0800 Subject: [PATCH 0161/1170] modify code --- src/class169/Code04_Fruit1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class169/Code04_Fruit1.java b/src/class169/Code04_Fruit1.java index 429a3cd97..747e21db6 100644 --- a/src/class169/Code04_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -43,7 +43,7 @@ public class Code04_Fruit1 { // 所有事件编号的数组 public static int[] eid = new int[MAXN << 3]; - // 所有事件对象的数组,每个对象有8个属性值 + // 每个对象有8个属性值 // event[i][0] == 1为加盘子事件,x处加,yl..yr词频+1,盘子权值v、空缺、空缺、空缺 // event[i][0] == 2为删盘子事件,x处减,yl..yr词频+1,盘子权值v、空缺、空缺、空缺 // event[i][0] == 3为水果事件,x、空缺、空缺、空缺、y、要求k、问题编号i From cbbe6a2daea693d6b12e285788d0348d2a2b81be Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 May 2025 15:43:06 +0800 Subject: [PATCH 0162/1170] modify code --- src/class169/Code04_Fruit1.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/class169/Code04_Fruit1.java b/src/class169/Code04_Fruit1.java index 747e21db6..586cf7eb8 100644 --- a/src/class169/Code04_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -41,12 +41,12 @@ public class Code04_Fruit1 { // 只有y维度的树状数组 public static int[] tree = new int[MAXN]; - // 所有事件编号的数组 + // 所有事件排完序之后,依次把下标放入eid数组 public static int[] eid = new int[MAXN << 3]; - // 每个对象有8个属性值 - // event[i][0] == 1为加盘子事件,x处加,yl..yr词频+1,盘子权值v、空缺、空缺、空缺 - // event[i][0] == 2为删盘子事件,x处减,yl..yr词频+1,盘子权值v、空缺、空缺、空缺 - // event[i][0] == 3为水果事件,x、空缺、空缺、空缺、y、要求k、问题编号i + // 每个事件有8个属性值 + // op==1加盘子,x处加、yl、yr,盘子权值v、空缺、空缺、空缺 + // op==2删盘子,x处删、yl、yr,盘子权值v、空缺、空缺、空缺 + // op==3为水果,x、空缺、空缺、空缺、y、要求k、问题编号i public static int[][] event = new int[MAXN << 3][8]; // 事件的总数 public static int cnte = 0; @@ -300,11 +300,14 @@ public static void main(String[] args) throws Exception { int ablca = lca(a, b); if (ablca == a) { int son = lcaSon(a, b); + // (1 ~ dfn[son]-1) (b子树上的dfn范围) addPlate(1, ldfn[b], rdfn[b], c); delPlate(ldfn[son], ldfn[b], rdfn[b], c); + // (b子树上的dfn范围) (son子树上最大的dfn序号+1 ~ n) addPlate(ldfn[b], rdfn[son] + 1, n, c); delPlate(rdfn[b] + 1, rdfn[son] + 1, n, c); } else { + // (a子树上的dfn范围) (b子树上的dfn范围) addPlate(ldfn[a], ldfn[b], rdfn[b], c); delPlate(rdfn[a] + 1, ldfn[b], rdfn[b], c); } From 0a2c6450cef1e98a1ae96ac14d55fb4bba28de61 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 May 2025 15:46:47 +0800 Subject: [PATCH 0163/1170] modify code --- src/class169/Code04_Fruit1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class169/Code04_Fruit1.java b/src/class169/Code04_Fruit1.java index 586cf7eb8..cf5ad6cad 100644 --- a/src/class169/Code04_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -298,6 +298,8 @@ public static void main(String[] args) throws Exception { b = tmp; } int ablca = lca(a, b); + // 类型1,a和b的lca是a或b,2个区域,4个事件产生 + // 类型2,a和b的lca不是a或b,1个区域,2个事件产生 if (ablca == a) { int son = lcaSon(a, b); // (1 ~ dfn[son]-1) (b子树上的dfn范围) From b0e8a99db37c685107b60bc9e09fab0c36d4678c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 May 2025 16:10:34 +0800 Subject: [PATCH 0164/1170] modify code --- src/class169/Code04_Fruit1.java | 2 +- src/class169/Code04_Fruit2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class169/Code04_Fruit1.java b/src/class169/Code04_Fruit1.java index cf5ad6cad..8ef093a86 100644 --- a/src/class169/Code04_Fruit1.java +++ b/src/class169/Code04_Fruit1.java @@ -300,7 +300,7 @@ public static void main(String[] args) throws Exception { int ablca = lca(a, b); // 类型1,a和b的lca是a或b,2个区域,4个事件产生 // 类型2,a和b的lca不是a或b,1个区域,2个事件产生 - if (ablca == a) { + if (ablca == a || ablca == b) { int son = lcaSon(a, b); // (1 ~ dfn[son]-1) (b子树上的dfn范围) addPlate(1, ldfn[b], rdfn[b], c); diff --git a/src/class169/Code04_Fruit2.java b/src/class169/Code04_Fruit2.java index 792e30012..1a16cbc3d 100644 --- a/src/class169/Code04_Fruit2.java +++ b/src/class169/Code04_Fruit2.java @@ -231,7 +231,7 @@ // b = tmp; // } // int ablca = lca(a, b); -// if (ablca == a) { +// if (ablca == a || ablca == b) { // int son = lcaSon(a, b); // addPlate(1, ldfn[b], rdfn[b], c); // delPlate(ldfn[son], ldfn[b], rdfn[b], c); From a3d334fe752d90072776d4839ac30403a630f7b8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 May 2025 17:01:29 +0800 Subject: [PATCH 0165/1170] modify code --- src/class169/Code05_PastoralOddities1.java | 2 +- src/class169/Code05_PastoralOddities2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class169/Code05_PastoralOddities1.java b/src/class169/Code05_PastoralOddities1.java index 55f247375..86bd5ed2e 100644 --- a/src/class169/Code05_PastoralOddities1.java +++ b/src/class169/Code05_PastoralOddities1.java @@ -3,7 +3,7 @@ // 度为奇最小瓶颈,java版 // 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 // 每次加入后,询问是否存在一个边集,满足每个点连接的边的数量都是奇数 -// 如果存在,希望边集的最大边权,尽可能小,一共有m条打印 +// 如果存在,希望边集的最大边权,尽可能小,如果不存在打印-1 // 2 <= n <= 10^5 // 1 <= m <= 3 * 10^5 // 1 <= 边权 <= 10^9 diff --git a/src/class169/Code05_PastoralOddities2.java b/src/class169/Code05_PastoralOddities2.java index a8a99a0b1..40d131642 100644 --- a/src/class169/Code05_PastoralOddities2.java +++ b/src/class169/Code05_PastoralOddities2.java @@ -3,7 +3,7 @@ // 度为奇最小瓶颈,C++版 // 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 // 每次加入后,询问是否存在一个边集,满足每个点连接的边的数量都是奇数 -// 如果存在,希望边集的最大边权,尽可能小,一共有m条打印 +// 如果存在,希望边集的最大边权,尽可能小,如果不存在打印-1 // 2 <= n <= 10^5 // 1 <= m <= 3 * 10^5 // 1 <= 边权 <= 10^9 From 5571c829f7e466e0a84249efa91776391bbd2cad Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 May 2025 17:07:50 +0800 Subject: [PATCH 0166/1170] modify code --- src/class169/Code05_PastoralOddities1.java | 2 +- src/class169/Code05_PastoralOddities2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class169/Code05_PastoralOddities1.java b/src/class169/Code05_PastoralOddities1.java index 86bd5ed2e..6fa8dc0fd 100644 --- a/src/class169/Code05_PastoralOddities1.java +++ b/src/class169/Code05_PastoralOddities1.java @@ -1,6 +1,6 @@ package class169; -// 度为奇最小瓶颈,java版 +// 点的度都是奇数的最小瓶颈,java版 // 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 // 每次加入后,询问是否存在一个边集,满足每个点连接的边的数量都是奇数 // 如果存在,希望边集的最大边权,尽可能小,如果不存在打印-1 diff --git a/src/class169/Code05_PastoralOddities2.java b/src/class169/Code05_PastoralOddities2.java index 40d131642..261867549 100644 --- a/src/class169/Code05_PastoralOddities2.java +++ b/src/class169/Code05_PastoralOddities2.java @@ -1,6 +1,6 @@ package class169; -// 度为奇最小瓶颈,C++版 +// 点的度都是奇数的最小瓶颈,C++版 // 一共有n个点,初始没有边,依次加入m条无向边,每条边有边权 // 每次加入后,询问是否存在一个边集,满足每个点连接的边的数量都是奇数 // 如果存在,希望边集的最大边权,尽可能小,如果不存在打印-1 From acd9263392cdcfdee3020526179f31c882a2000d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 23 May 2025 18:25:10 +0800 Subject: [PATCH 0167/1170] modify code --- src/class169/Code05_PastoralOddities1.java | 55 ++++++++++++++-------- src/class169/Code05_PastoralOddities2.java | 30 ++++++++---- 2 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/class169/Code05_PastoralOddities1.java b/src/class169/Code05_PastoralOddities1.java index 6fa8dc0fd..191d397a4 100644 --- a/src/class169/Code05_PastoralOddities1.java +++ b/src/class169/Code05_PastoralOddities1.java @@ -20,22 +20,21 @@ public class Code05_PastoralOddities1 { public static int MAXN = 100001; - public static int MAXM = 300002; + public static int MAXM = 300001; public static int n, m; // edge是按时序组织的边数组 // wsort是按权值组织的边数组 - // 边的时序i、端点x、端点y、权值w - public static int[][] edge = new int[MAXM][4]; - public static int[][] wsort = new int[MAXM][4]; + // 每条边有:端点x、端点y、权值w、时序tim、排名rak + public static int[][] edge = new int[MAXM][5]; + public static int[][] wsort = new int[MAXM][5]; - // 可撤销并查集 + // 可撤销并查集 + 维护节点数为奇数的连通区数量oddnum + public static int oddnum; public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[][] rollback = new int[MAXN][2]; public static int opsize = 0; - // 节点数为奇数的联通区数量 - public static int oddnum; public static int[] ans = new int[MAXM]; @@ -77,9 +76,9 @@ public static void undo() { } } - // 按时序组织的边在edge里,当前来到[ql..qr]范围 + // 按时序组织的边在edge里,当前来到[el..er]范围 // 按权值组织的边在wsort里,答案范围[vl..vr] - // 前提 : ql之前的边里,边权 <= wsort[vl].w 的所有边,都已经加到图上了 + // 调用递归的前提 : el之前,边权排名 er) { @@ -91,19 +90,21 @@ public static void compute(int el, int er, int vl, int vr) { } } else { int mid = (vl + vr) >> 1; + // 1) el之前,边权排名在[vl..mid]之间的边,加到图里,遍历wsort[vl..mid]来加速 int unionCnt1 = 0; for (int i = vl; i <= mid; i++) { - if (wsort[i][0] < el) { - if (union(wsort[i][1], wsort[i][2])) { + if (wsort[i][3] < el) { + if (union(wsort[i][0], wsort[i][1])) { unionCnt1++; } } } + // 2) 从el开始,边权排名<=mid的边,加到图里,找到第一个达标的边split int unionCnt2 = 0; int split = er + 1; for (int i = el; i <= er; i++) { - if (edge[i][3] <= wsort[mid][3]) { - if (union(edge[i][1], edge[i][2])) { + if (edge[i][4] <= mid) { + if (union(edge[i][0], edge[i][1])) { unionCnt2++; } } @@ -112,22 +113,28 @@ public static void compute(int el, int er, int vl, int vr) { break; } } + // 3) 撤销2)的效果,el之前,边权排名<=mid的边,都在图中 for (int i = 1; i <= unionCnt2; i++) { undo(); } + // 4) 执行compute(el, split - 1, mid + 1, vr),此时满足子递归的前提 compute(el, split - 1, mid + 1, vr); + // 5) 撤销1)的效果,此时只剩下前提了,el之前,边权排名 a[3] - b[3]); - wsort[m + 1][3] = -1; + Arrays.sort(wsort, 1, m + 1, (a, b) -> a[2] - b[2]); + // edge数组和wsort数组里的每条边,设置排名信息 + for (int i = 1; i <= m; i++) { + wsort[i][4] = i; + edge[wsort[i][3]][4] = i; + } } public static void main(String[] args) throws Exception { @@ -156,15 +167,19 @@ public static void main(String[] args) throws Exception { n = in.nextInt(); m = in.nextInt(); for (int i = 1; i <= m; i++) { - edge[i][0] = i; + edge[i][0] = in.nextInt(); edge[i][1] = in.nextInt(); edge[i][2] = in.nextInt(); - edge[i][3] = in.nextInt(); + edge[i][3] = i; } prepare(); compute(1, m, 1, m + 1); for (int i = 1; i <= m; i++) { - out.println(wsort[ans[i]][3]); + if (ans[i] == m + 1) { + out.println(-1); + } else { + out.println(wsort[ans[i]][2]); + } } out.flush(); out.close(); diff --git a/src/class169/Code05_PastoralOddities2.java b/src/class169/Code05_PastoralOddities2.java index 261867549..806c535f3 100644 --- a/src/class169/Code05_PastoralOddities2.java +++ b/src/class169/Code05_PastoralOddities2.java @@ -17,7 +17,7 @@ //using namespace std; // //struct Edge { -// int i, x, y, w; +// int x, y, w, tim, rak; //}; // //bool EdgeCmp(Edge a, Edge b) { @@ -25,17 +25,17 @@ //} // //const int MAXN = 100001; -//const int MAXM = 300002; +//const int MAXM = 300001; //int n, m; // //Edge edge[MAXM]; //Edge wsort[MAXM]; // +//int oddnum; //int father[MAXN]; //int siz[MAXN]; //int rollback[MAXN][2]; //int opsize = 0; -//int oddnum; // //int ans[MAXM]; // @@ -89,7 +89,7 @@ // int mid = (vl + vr) >> 1; // int unionCnt1 = 0; // for (int i = vl; i <= mid; i++) { -// if (wsort[i].i < el) { +// if (wsort[i].tim < el) { // if (Union(wsort[i].x, wsort[i].y)) { // unionCnt1++; // } @@ -98,7 +98,7 @@ // int unionCnt2 = 0; // int split = er + 1; // for (int i = el; i <= er; i++) { -// if (edge[i].w <= wsort[mid].w) { +// if (edge[i].rak <= mid) { // if (Union(edge[i].x, edge[i].y)) { // unionCnt2++; // } @@ -117,7 +117,7 @@ // } // int unionCnt3 = 0; // for (int i = el; i <= split - 1; i++) { -// if (edge[i].w <= wsort[vl].w) { +// if (edge[i].rak < vl) { // if (Union(edge[i].x, edge[i].y)) { // unionCnt3++; // } @@ -137,10 +137,16 @@ // siz[i] = 1; // } // for (int i = 1; i <= m; i++) { -// wsort[i] = edge[i]; +// wsort[i].x = edge[i].x; +// wsort[i].y = edge[i].y; +// wsort[i].w = edge[i].w; +// wsort[i].tim = edge[i].tim; // } // sort(wsort + 1, wsort + m + 1, EdgeCmp); -// wsort[m + 1].w = -1; +// for (int i = 1; i <= m; i++) { +// wsort[i].rak = i; +// edge[wsort[i].tim].rak = i; +// } //} // //int main() { @@ -148,13 +154,17 @@ // cin.tie(nullptr); // cin >> n >> m; // for (int i = 1; i <= m; i++) { -// edge[i].i = i; // cin >> edge[i].x >> edge[i].y >> edge[i].w; +// edge[i].tim = i; // } // prepare(); // compute(1, m, 1, m + 1); // for (int i = 1; i <= m; i++) { -// cout << wsort[ans[i]].w << '\n'; +// if (ans[i] == m + 1) { +// cout << -1 << '\n'; +// } else { +// cout << wsort[ans[i]].w << '\n'; +// } // } // return 0; //} \ No newline at end of file From 83c0f60cd7f456173eecee6bc41816687d133153 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 23 May 2025 18:29:45 +0800 Subject: [PATCH 0168/1170] modify code --- src/class169/Code05_PastoralOddities1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class169/Code05_PastoralOddities1.java b/src/class169/Code05_PastoralOddities1.java index 191d397a4..e2aaac269 100644 --- a/src/class169/Code05_PastoralOddities1.java +++ b/src/class169/Code05_PastoralOddities1.java @@ -90,7 +90,7 @@ public static void compute(int el, int er, int vl, int vr) { } } else { int mid = (vl + vr) >> 1; - // 1) el之前,边权排名在[vl..mid]之间的边,加到图里,遍历wsort[vl..mid]来加速 + // 1) el之前,边权排名在[vl..mid]之间的边,加到图里,通过遍历wsort[vl..mid]来加速 int unionCnt1 = 0; for (int i = vl; i <= mid; i++) { if (wsort[i][3] < el) { @@ -99,7 +99,7 @@ public static void compute(int el, int er, int vl, int vr) { } } } - // 2) 从el开始,边权排名<=mid的边,加到图里,找到第一个达标的边split + // 2) 从el开始遍历,边权排名<=mid的边,加到图里,找到第一个达标的边split int unionCnt2 = 0; int split = er + 1; for (int i = el; i <= er; i++) { @@ -117,7 +117,7 @@ public static void compute(int el, int er, int vl, int vr) { for (int i = 1; i <= unionCnt2; i++) { undo(); } - // 4) 执行compute(el, split - 1, mid + 1, vr),此时满足子递归的前提 + // 4) 执行 compute(el, split - 1, mid + 1, vr),此时满足子递归的前提 compute(el, split - 1, mid + 1, vr); // 5) 撤销1)的效果,此时只剩下前提了,el之前,边权排名 Date: Fri, 23 May 2025 18:33:33 +0800 Subject: [PATCH 0169/1170] modify code --- src/class169/Code05_PastoralOddities1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class169/Code05_PastoralOddities1.java b/src/class169/Code05_PastoralOddities1.java index e2aaac269..04fbb6eb0 100644 --- a/src/class169/Code05_PastoralOddities1.java +++ b/src/class169/Code05_PastoralOddities1.java @@ -25,7 +25,7 @@ public class Code05_PastoralOddities1 { // edge是按时序组织的边数组 // wsort是按权值组织的边数组 - // 每条边有:端点x、端点y、权值w、时序tim、排名rak + // 每条边有:端点x、端点y、边权w、时序tim、边权排名rak public static int[][] edge = new int[MAXM][5]; public static int[][] wsort = new int[MAXM][5]; @@ -154,7 +154,7 @@ public static void prepare() { wsort[i][3] = edge[i][3]; } Arrays.sort(wsort, 1, m + 1, (a, b) -> a[2] - b[2]); - // edge数组和wsort数组里的每条边,设置排名信息 + // edge数组、wsort数组,每条边设置排名信息 for (int i = 1; i <= m; i++) { wsort[i][4] = i; edge[wsort[i][3]][4] = i; From b3641c888682a4d317f198e3a658bddab3d0d5a0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 23 May 2025 18:50:07 +0800 Subject: [PATCH 0170/1170] modify code --- src/class169/Code05_PastoralOddities1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class169/Code05_PastoralOddities1.java b/src/class169/Code05_PastoralOddities1.java index 04fbb6eb0..a89ae24fc 100644 --- a/src/class169/Code05_PastoralOddities1.java +++ b/src/class169/Code05_PastoralOddities1.java @@ -23,8 +23,8 @@ public class Code05_PastoralOddities1 { public static int MAXM = 300001; public static int n, m; - // edge是按时序组织的边数组 - // wsort是按权值组织的边数组 + // edge代表所有边依次出现 + // wsort代表所有边按边权排序 // 每条边有:端点x、端点y、边权w、时序tim、边权排名rak public static int[][] edge = new int[MAXM][5]; public static int[][] wsort = new int[MAXM][5]; @@ -76,8 +76,8 @@ public static void undo() { } } - // 按时序组织的边在edge里,当前来到[el..er]范围 - // 按权值组织的边在wsort里,答案范围[vl..vr] + // 依次出现的边在edge里,当前来到[el..er]范围 + // 权值排序后的边在wsort里,答案范围[vl..vr],同时也是排名范围 // 调用递归的前提 : el之前,边权排名 Date: Fri, 23 May 2025 21:27:50 +0800 Subject: [PATCH 0171/1170] modify code --- src/class169/Code05_PastoralOddities1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class169/Code05_PastoralOddities1.java b/src/class169/Code05_PastoralOddities1.java index a89ae24fc..e028ad6b3 100644 --- a/src/class169/Code05_PastoralOddities1.java +++ b/src/class169/Code05_PastoralOddities1.java @@ -29,7 +29,7 @@ public class Code05_PastoralOddities1 { public static int[][] edge = new int[MAXM][5]; public static int[][] wsort = new int[MAXM][5]; - // 可撤销并查集 + 维护节点数为奇数的连通区数量oddnum + // 可撤销并查集 + 节点数为奇数的连通区数量为oddnum public static int oddnum; public static int[] father = new int[MAXN]; public static int[] siz = new int[MAXN]; From 3b65e1a1a8bd3caf95e80ad7f33a29567ce8e779 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 23 May 2025 22:05:57 +0800 Subject: [PATCH 0172/1170] modify code --- ...3\344\272\214\345\210\206-\344\270\213.pptx" | Bin 0 -> 48349 bytes src/class169/Code06_IvanAndBurgers1.java | 1 + 2 files changed, 1 insertion(+) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243169\343\200\220\346\214\272\351\232\276\343\200\221\346\225\264\344\275\223\344\272\214\345\210\206-\344\270\213.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243169\343\200\220\346\214\272\351\232\276\343\200\221\346\225\264\344\275\223\344\272\214\345\210\206-\344\270\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243169\343\200\220\346\214\272\351\232\276\343\200\221\346\225\264\344\275\223\344\272\214\345\210\206-\344\270\213.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..9b01581dc1d378f2330b68b63b00b9022c063423 GIT binary patch literal 48349 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 GpZ)_oCO5YL literal 0 HcmV?d00001 diff --git a/src/class169/Code06_IvanAndBurgers1.java b/src/class169/Code06_IvanAndBurgers1.java index 01b51188a..7cbb79d17 100644 --- a/src/class169/Code06_IvanAndBurgers1.java +++ b/src/class169/Code06_IvanAndBurgers1.java @@ -30,6 +30,7 @@ public class Code06_IvanAndBurgers1 { public static int[] lset = new int[MAXN]; public static int[] rset = new int[MAXN]; + public static int[] ans = new int[MAXN]; public static void insert(int[] basis, int num) { From 5e17eb625cd3fefb219a70caadbf91c3e0d7973c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 23 May 2025 22:06:22 +0800 Subject: [PATCH 0173/1170] modify code --- src/class169/Code06_IvanAndBurgers2.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class169/Code06_IvanAndBurgers2.java b/src/class169/Code06_IvanAndBurgers2.java index c9606fc42..5b9c607ea 100644 --- a/src/class169/Code06_IvanAndBurgers2.java +++ b/src/class169/Code06_IvanAndBurgers2.java @@ -28,6 +28,7 @@ // //int lset[MAXN]; //int rset[MAXN]; +// //int ans[MAXN]; // //void insert(int* basis, int num) { From 92c3dcd5c2f9c14cf39078e93e202f619d81295a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 26 May 2025 15:24:37 +0800 Subject: [PATCH 0174/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 177 +++++++++++++++++++++++ src/class170/Code01_3DPartialOrder2.java | 123 ++++++++++++++++ 2 files changed, 300 insertions(+) create mode 100644 src/class170/Code01_3DPartialOrder1.java create mode 100644 src/class170/Code01_3DPartialOrder2.java diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java new file mode 100644 index 000000000..6b6cb0b68 --- /dev/null +++ b/src/class170/Code01_3DPartialOrder1.java @@ -0,0 +1,177 @@ +package class170; + +// 三维偏序,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3810 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_3DPartialOrder1 { + + public static int MAXN = 200001; + public static int n, k; + + // 位置i、属性a、属性b、属性c + public static int[][] arr = new int[MAXN][4]; + // 归并排序辅助数组 + public static int[][] help = new int[MAXN][4]; + // 树状数组 + public static int[] tree = new int[MAXN]; + // 每个位置统计f(i) + public static int[] f = new int[MAXN]; + // 答案 + public static int[] ans = new int[MAXN]; + + public static void clone(int[] a, int[] b) { + a[0] = b[0]; + a[1] = b[1]; + a[2] = b[2]; + a[3] = b[3]; + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= k) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int query(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static void merge(int l, int m, int r) { + // 利用左右各自有序,进行不回退的统计 + int p1, p2; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][2] <= arr[p2][2]) { + p1++; + add(arr[p1][3], 1); + } + f[arr[p2][0]] += query(arr[p2][3]); + } + // 清空树状数组 + for (int i = l; i <= p1; i++) { + add(arr[i][3], -1); + } + p1 = l; + p2 = m + 1; + int i = l; + while (p1 <= m && p2 <= r) { + clone(help[i++], arr[p1][2] <= arr[p2][2] ? arr[p1++] : arr[p2++]); + } + while (p1 <= m) { + clone(help[i++], arr[p1++]); + } + while (p2 <= r) { + clone(help[i++], arr[p2++]); + } + for (i = l; i <= r; i++) { + clone(arr[i], help[i]); + } + } + + public static void compute(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + compute(l, mid); + compute(mid + 1, r); + merge(l, mid, r); + } + + public static void prepare() { + // 根据a排序,a一样根据b排序,b一样根据c排序 + Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[3] - b[3]); + // 排序后,a、b、c都一样的同一组内,组前的下标会得不到组后的下标统计 + // 所以需要先设置f的初始值 + for (int l = 1, r = 1; l <= n; l = ++r) { + while (r + 1 <= n && arr[l][1] == arr[r + 1][1] && arr[l][2] == arr[r + 1][2] + && arr[l][3] == arr[r + 1][3]) { + r++; + } + for (int i = l; i <= r; i++) { + f[arr[i][0]] = r - i; + } + } + // 清空答案数组 + Arrays.fill(ans, 0, n, 0); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + k = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i][0] = i; + arr[i][1] = in.nextInt(); + arr[i][2] = in.nextInt(); + arr[i][3] = in.nextInt(); + } + prepare(); + compute(1, n); + for (int i = 1; i <= n; i++) { + ans[f[i]]++; + } + for (int i = 0; i < n; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file diff --git a/src/class170/Code01_3DPartialOrder2.java b/src/class170/Code01_3DPartialOrder2.java new file mode 100644 index 000000000..3d61394a2 --- /dev/null +++ b/src/class170/Code01_3DPartialOrder2.java @@ -0,0 +1,123 @@ +package class170; + +// 三维偏序,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3810 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Number { +// int i, a, b, c; +//}; +// +//bool NumberCmp(Number x, Number y) { +// if (x.a != y.a) { +// return x.a < y.a; +// } +// if (x.b != y.b) { +// return x.b < y.b; +// } +// return x.c < y.c; +//} +// +//const int MAXN = 200001; +//int n, k; +//Number arr[MAXN]; +//Number help[MAXN]; +//int tree[MAXN]; +//int f[MAXN]; +//int ans[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= k) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int query(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void merge(int l, int m, int r) { +// int p1, p2; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].b <= arr[p2].b) { +// p1++; +// add(arr[p1].c, 1); +// } +// f[arr[p2].i] += query(arr[p2].c); +// } +// for (int i = l; i <= p1; i++) { +// add(arr[i].c, -1); +// } +// p1 = l; +// p2 = m + 1; +// int i = l; +// while (p1 <= m && p2 <= r) { +// help[i++] = arr[p1].b <= arr[p2].b ? arr[p1++] : arr[p2++]; +// } +// while (p1 <= m) { +// help[i++] = arr[p1++]; +// } +// while (p2 <= r) { +// help[i++] = arr[p2++]; +// } +// for (i = l; i <= r; i++) { +// arr[i] = help[i]; +// } +//} +// +//void compute(int l, int r) { +// if (l == r) { +// return; +// } +// int mid = (l + r) / 2; +// compute(l, mid); +// compute(mid + 1, r); +// merge(l, mid, r); +//} +// +//void prepare() { +// sort(arr + 1, arr + n + 1, NumberCmp); +// for (int l = 1, r = 1; l <= n; l = ++r) { +// while (r + 1 <= n && arr[l].a == arr[r + 1].a && arr[l].b == arr[r + 1].b && arr[l].c == arr[r + 1].c) { +// r++; +// } +// for (int i = l; i <= r; i++) { +// f[arr[i].i] = r - i; +// } +// } +// fill(ans, ans + n, 0); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> k; +// for (int i = 1; i <= n; i++) { +// arr[i].i = i; +// cin >> arr[i].a >> arr[i].b >> arr[i].c; +// } +// prepare(); +// compute(1, n); +// for (int i = 1; i <= n; i++) { +// ans[f[i]]++; +// } +// for (int i = 0; i < n; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 0860aa42ba730a90ad87d4e20892ac6dea4139b4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 26 May 2025 15:32:23 +0800 Subject: [PATCH 0175/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index 6b6cb0b68..1d2075cb1 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -97,8 +97,8 @@ public static void compute(int l, int r) { public static void prepare() { // 根据a排序,a一样根据b排序,b一样根据c排序 Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[3] - b[3]); - // 排序后,a、b、c都一样的同一组内,组前的下标会得不到组后的下标统计 - // 所以需要先设置f的初始值 + // 排序后,a、b、c都一样的同一组内,组前的下标,得不到同组后面的统计量 + // 所以先设置f的初始值,把这部分补偿给组前的下标 for (int l = 1, r = 1; l <= n; l = ++r) { while (r + 1 <= n && arr[l][1] == arr[r + 1][1] && arr[l][2] == arr[r + 1][2] && arr[l][3] == arr[r + 1][3]) { From 71aa11512fa6d707915fc9581627e25a99b9b799 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 11:20:54 +0800 Subject: [PATCH 0176/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 3 --- src/class170/Code01_3DPartialOrder2.java | 1 - 2 files changed, 4 deletions(-) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index 1d2075cb1..e3917b454 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -14,7 +14,6 @@ public class Code01_3DPartialOrder1 { public static int MAXN = 200001; public static int n, k; - // 位置i、属性a、属性b、属性c public static int[][] arr = new int[MAXN][4]; // 归并排序辅助数组 @@ -108,8 +107,6 @@ public static void prepare() { f[arr[i][0]] = r - i; } } - // 清空答案数组 - Arrays.fill(ans, 0, n, 0); } public static void main(String[] args) throws IOException { diff --git a/src/class170/Code01_3DPartialOrder2.java b/src/class170/Code01_3DPartialOrder2.java index 3d61394a2..580850e49 100644 --- a/src/class170/Code01_3DPartialOrder2.java +++ b/src/class170/Code01_3DPartialOrder2.java @@ -100,7 +100,6 @@ // f[arr[i].i] = r - i; // } // } -// fill(ans, ans + n, 0); //} // //int main() { From dfed03e3130ffab7be139a2621a7e767402fc528 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 11:44:24 +0800 Subject: [PATCH 0177/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 4 ++-- src/class170/Code02_GardenerTrouble1.java | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 src/class170/Code02_GardenerTrouble1.java diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index e3917b454..bca7bf4e5 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -95,9 +95,9 @@ public static void compute(int l, int r) { public static void prepare() { // 根据a排序,a一样根据b排序,b一样根据c排序 + // 排序后a、b、c一样的同组内,组前的下标得不到同组后面的统计量 + // 所以先设置f的初始值,把这部分提前补偿给组前的下标,然后跑CDQ分治 Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[3] - b[3]); - // 排序后,a、b、c都一样的同一组内,组前的下标,得不到同组后面的统计量 - // 所以先设置f的初始值,把这部分补偿给组前的下标 for (int l = 1, r = 1; l <= n; l = ++r) { while (r + 1 <= n && arr[l][1] == arr[r + 1][1] && arr[l][2] == arr[r + 1][2] && arr[l][3] == arr[r + 1][3]) { diff --git a/src/class170/Code02_GardenerTrouble1.java b/src/class170/Code02_GardenerTrouble1.java new file mode 100644 index 000000000..be4393749 --- /dev/null +++ b/src/class170/Code02_GardenerTrouble1.java @@ -0,0 +1,9 @@ +package class170; + +// 园丁的烦恼,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2163 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code02_GardenerTrouble1 { + +} From 7176d6371fdbe254aeb451b347167ac4d49499e4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 15:57:40 +0800 Subject: [PATCH 0178/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 18 +-- src/class170/Code01_3DPartialOrder2.java | 18 +-- src/class170/Code02_GardenerTrouble1.java | 158 +++++++++++++++++++++- src/class170/Code02_GardenerTrouble2.java | 113 ++++++++++++++++ 4 files changed, 288 insertions(+), 19 deletions(-) create mode 100644 src/class170/Code02_GardenerTrouble2.java diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index bca7bf4e5..2b560ad23 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -17,7 +17,7 @@ public class Code01_3DPartialOrder1 { // 位置i、属性a、属性b、属性c public static int[][] arr = new int[MAXN][4]; // 归并排序辅助数组 - public static int[][] help = new int[MAXN][4]; + public static int[][] tmp = new int[MAXN][4]; // 树状数组 public static int[] tree = new int[MAXN]; // 每个位置统计f(i) @@ -70,26 +70,26 @@ public static void merge(int l, int m, int r) { p2 = m + 1; int i = l; while (p1 <= m && p2 <= r) { - clone(help[i++], arr[p1][2] <= arr[p2][2] ? arr[p1++] : arr[p2++]); + clone(tmp[i++], arr[p1][2] <= arr[p2][2] ? arr[p1++] : arr[p2++]); } while (p1 <= m) { - clone(help[i++], arr[p1++]); + clone(tmp[i++], arr[p1++]); } while (p2 <= r) { - clone(help[i++], arr[p2++]); + clone(tmp[i++], arr[p2++]); } for (i = l; i <= r; i++) { - clone(arr[i], help[i]); + clone(arr[i], tmp[i]); } } - public static void compute(int l, int r) { + public static void cdq(int l, int r) { if (l == r) { return; } int mid = (l + r) / 2; - compute(l, mid); - compute(mid + 1, r); + cdq(l, mid); + cdq(mid + 1, r); merge(l, mid, r); } @@ -121,7 +121,7 @@ public static void main(String[] args) throws IOException { arr[i][3] = in.nextInt(); } prepare(); - compute(1, n); + cdq(1, n); for (int i = 1; i <= n; i++) { ans[f[i]]++; } diff --git a/src/class170/Code01_3DPartialOrder2.java b/src/class170/Code01_3DPartialOrder2.java index 580850e49..721e39c65 100644 --- a/src/class170/Code01_3DPartialOrder2.java +++ b/src/class170/Code01_3DPartialOrder2.java @@ -26,7 +26,7 @@ //const int MAXN = 200001; //int n, k; //Number arr[MAXN]; -//Number help[MAXN]; +//Number tmp[MAXN]; //int tree[MAXN]; //int f[MAXN]; //int ans[MAXN]; @@ -67,26 +67,26 @@ // p2 = m + 1; // int i = l; // while (p1 <= m && p2 <= r) { -// help[i++] = arr[p1].b <= arr[p2].b ? arr[p1++] : arr[p2++]; +// tmp[i++] = arr[p1].b <= arr[p2].b ? arr[p1++] : arr[p2++]; // } // while (p1 <= m) { -// help[i++] = arr[p1++]; +// tmp[i++] = arr[p1++]; // } // while (p2 <= r) { -// help[i++] = arr[p2++]; +// tmp[i++] = arr[p2++]; // } // for (i = l; i <= r; i++) { -// arr[i] = help[i]; +// arr[i] = tmp[i]; // } //} // -//void compute(int l, int r) { +//void cdq(int l, int r) { // if (l == r) { // return; // } // int mid = (l + r) / 2; -// compute(l, mid); -// compute(mid + 1, r); +// cdq(l, mid); +// cdq(mid + 1, r); // merge(l, mid, r); //} // @@ -111,7 +111,7 @@ // cin >> arr[i].a >> arr[i].b >> arr[i].c; // } // prepare(); -// compute(1, n); +// cdq(1, n); // for (int i = 1; i <= n; i++) { // ans[f[i]]++; // } diff --git a/src/class170/Code02_GardenerTrouble1.java b/src/class170/Code02_GardenerTrouble1.java index be4393749..15b6f988b 100644 --- a/src/class170/Code02_GardenerTrouble1.java +++ b/src/class170/Code02_GardenerTrouble1.java @@ -2,8 +2,164 @@ // 园丁的烦恼,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2163 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 +// 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 +// 想通过用C++实现,本节课Code02_GardenerTrouble2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; public class Code02_GardenerTrouble1 { + public static int MAXN = 500001 * 5; + public static int n, m, p; + + // op == 1代表树木,x、y、后面空缺 + // op == 2代表查询,x、y、效果v、隶属的问题q、树木量num + public static int[][] arr = new int[MAXN][6]; + public static int[][] tmp = new int[MAXN][6]; + public static int[] ans = new int[MAXN]; + + public static void clone(int[] a, int[] b) { + a[0] = b[0]; + a[1] = b[1]; + a[2] = b[2]; + a[3] = b[3]; + a[4] = b[4]; + a[5] = b[5]; + } + + public static void addTree(int x, int y) { + arr[++p][0] = 1; + arr[p][1] = x; + arr[p][2] = y; + } + + public static void addQuery(int x, int y, int v, int q) { + arr[++p][0] = 2; + arr[p][1] = x; + arr[p][2] = y; + arr[p][3] = v; + arr[p][4] = q; + arr[p][5] = 0; + } + + public static void merge(int l, int m, int r) { + int p1, p2, tree = 0; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][2] <= arr[p2][2]) { + p1++; + if (arr[p1][0] == 1) { + tree++; + } + } + if (arr[p2][0] == 2) { + arr[p2][5] += tree; + } + } + p1 = l; + p2 = m + 1; + int i = l; + while (p1 <= m && p2 <= r) { + clone(tmp[i++], arr[p1][2] <= arr[p2][2] ? arr[p1++] : arr[p2++]); + } + while (p1 <= m) { + clone(tmp[i++], arr[p1++]); + } + while (p2 <= r) { + clone(tmp[i++], arr[p2++]); + } + for (i = l; i <= r; i++) { + clone(arr[i], tmp[i]); + } + } + + public static void cdq(int l, int r) { + if (l == r) { + return; + } + int mid = l + r >> 1; + cdq(l, mid); + cdq(mid + 1, r); + merge(l, mid, r); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, x, y; i <= n; i++) { + x = in.nextInt(); + y = in.nextInt(); + addTree(x, y); + } + for (int i = 1, a, b, c, d; i <= m; i++) { + a = in.nextInt(); + b = in.nextInt(); + c = in.nextInt(); + d = in.nextInt(); + addQuery(c, d, 1, i); + addQuery(a - 1, b - 1, 1, i); + addQuery(a - 1, d, -1, i); + addQuery(c, b - 1, -1, i); + } + Arrays.sort(arr, 1, p + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[0] - b[0]); + cdq(1, p); + for (int i = 1; i <= p; i++) { + if (arr[i][0] == 2) { + ans[arr[i][4]] += arr[i][3] * arr[i][5]; + } + } + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class170/Code02_GardenerTrouble2.java b/src/class170/Code02_GardenerTrouble2.java new file mode 100644 index 000000000..1b1048b01 --- /dev/null +++ b/src/class170/Code02_GardenerTrouble2.java @@ -0,0 +1,113 @@ +package class170; + +// 园丁的烦恼,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2163 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int op, x, y, v, q, num; +//}; +// +//bool NodeCmp(Node a, Node b) { +// if (a.x != b.x) { +// return a.x < b.x; +// } +// if (a.y != b.y) { +// return a.y < b.y; +// } +// return a.op < b.op; +//} +// +//const int MAXN = 500001 * 5; +//int n, m, p = 0; +//Node arr[MAXN]; +//Node tmp[MAXN]; +//int ans[MAXN]; +// +//void addTree(int x, int y) { +// arr[++p].op = 1; +// arr[p].x = x; +// arr[p].y = y; +//} +// +//void addQuery(int x, int y, int v, int q) { +// arr[++p].op = 2; +// arr[p].x = x; +// arr[p].y = y; +// arr[p].v = v; +// arr[p].q = q; +// arr[p].num = 0; +//} +// +//void merge(int l, int m, int r) { +// int p1, p2, tree = 0; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].y <= arr[p2].y) { +// p1++; +// if (arr[p1].op == 1) { +// tree++; +// } +// } +// if (arr[p2].op == 2) { +// arr[p2].num += tree; +// } +// } +// p1 = l; +// p2 = m + 1; +// int i = l; +// while (p1 <= m && p2 <= r) { +// tmp[i++] = arr[p1].y <= arr[p2].y ? arr[p1++] : arr[p2++]; +// } +// while (p1 <= m) { +// tmp[i++] = arr[p1++]; +// } +// while (p2 <= r) { +// tmp[i++] = arr[p2++]; +// } +// for (i = l; i <= r; i++) { +// arr[i] = tmp[i]; +// } +//} +// +//void cdq(int l, int r) { +// if (l == r) { +// return; +// } +// int mid = (l + r) >> 1; +// cdq(l, mid); +// cdq(mid + 1, r); +// merge(l, mid, r); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, x, y; i <= n; i++) { +// cin >> x >> y; +// addTree(x, y); +// } +// for (int i = 1, a, b, c, d; i <= m; i++) { +// cin >> a >> b >> c >> d; +// addQuery(c, d, 1, i); +// addQuery(a - 1, b - 1, 1, i); +// addQuery(a - 1, d, -1, i); +// addQuery(c, b - 1, -1, i); +// } +// sort(arr + 1, arr + p + 1, NodeCmp); +// cdq(1, p); +// for (int i = 1; i <= p; i++) { +// if (arr[i].op == 2) { +// ans[arr[i].q] += arr[i].v * arr[i].num; +// } +// } +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 5956811842bf424871ca82b8c268eac70a0f3399 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 16:00:23 +0800 Subject: [PATCH 0179/1170] modify code --- src/class170/Code02_GardenerTrouble1.java | 4 ++-- src/class170/Code02_GardenerTrouble2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class170/Code02_GardenerTrouble1.java b/src/class170/Code02_GardenerTrouble1.java index 15b6f988b..d4e54321d 100644 --- a/src/class170/Code02_GardenerTrouble1.java +++ b/src/class170/Code02_GardenerTrouble1.java @@ -3,7 +3,7 @@ // 园丁的烦恼,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2163 // 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但无法通过所有测试用例,内存使用过大 +// java实现的逻辑一定是正确的,但无法通过测试用例,内存使用过大 // 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 // 想通过用C++实现,本节课Code02_GardenerTrouble2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 @@ -83,7 +83,7 @@ public static void cdq(int l, int r) { if (l == r) { return; } - int mid = l + r >> 1; + int mid = (l + r) / 2; cdq(l, mid); cdq(mid + 1, r); merge(l, mid, r); diff --git a/src/class170/Code02_GardenerTrouble2.java b/src/class170/Code02_GardenerTrouble2.java index 1b1048b01..39ee9f94f 100644 --- a/src/class170/Code02_GardenerTrouble2.java +++ b/src/class170/Code02_GardenerTrouble2.java @@ -78,7 +78,7 @@ // if (l == r) { // return; // } -// int mid = (l + r) >> 1; +// int mid = (l + r) / 2; // cdq(l, mid); // cdq(mid + 1, r); // merge(l, mid, r); From 6b74204afd032a8cc7e81280ffc248cf7537e3eb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 16:04:43 +0800 Subject: [PATCH 0180/1170] modify code --- src/class170/Code02_GardenerTrouble2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class170/Code02_GardenerTrouble2.java b/src/class170/Code02_GardenerTrouble2.java index 39ee9f94f..6105d7325 100644 --- a/src/class170/Code02_GardenerTrouble2.java +++ b/src/class170/Code02_GardenerTrouble2.java @@ -10,7 +10,7 @@ //using namespace std; // //struct Node { -// int op, x, y, v, q, num; +// int op, x, y, v, q, num; // 类型、x、y、效果v、问题q、树木量num //}; // //bool NodeCmp(Node a, Node b) { From 0ed737b07d382a49b5172869e5ca141afb54c0ac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 19:46:05 +0800 Subject: [PATCH 0181/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 7 +- ...erTrouble1.java => Code02_RegionSum1.java} | 73 +++++++++---------- ...erTrouble2.java => Code02_RegionSum2.java} | 55 +++++++------- 3 files changed, 67 insertions(+), 68 deletions(-) rename src/class170/{Code02_GardenerTrouble1.java => Code02_RegionSum1.java} (62%) rename src/class170/{Code02_GardenerTrouble2.java => Code02_RegionSum2.java} (67%) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index 2b560ad23..aef8c0020 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -14,14 +14,19 @@ public class Code01_3DPartialOrder1 { public static int MAXN = 200001; public static int n, k; + // 位置i、属性a、属性b、属性c public static int[][] arr = new int[MAXN][4]; - // 归并排序辅助数组 + + // 归并排序需要 public static int[][] tmp = new int[MAXN][4]; + // 树状数组 public static int[] tree = new int[MAXN]; + // 每个位置统计f(i) public static int[] f = new int[MAXN]; + // 答案 public static int[] ans = new int[MAXN]; diff --git a/src/class170/Code02_GardenerTrouble1.java b/src/class170/Code02_RegionSum1.java similarity index 62% rename from src/class170/Code02_GardenerTrouble1.java rename to src/class170/Code02_RegionSum1.java index d4e54321d..49dd7a400 100644 --- a/src/class170/Code02_GardenerTrouble1.java +++ b/src/class170/Code02_RegionSum1.java @@ -1,12 +1,8 @@ package class170; -// 园丁的烦恼,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P2163 -// 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但无法通过测试用例,内存使用过大 -// 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 -// 想通过用C++实现,本节课Code02_GardenerTrouble2文件就是C++的实现 -// 两个版本的逻辑完全一样,C++版本可以通过所有测试 +// 二维空间查询经典模版,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3755 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; @@ -14,16 +10,21 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_GardenerTrouble1 { +public class Code02_RegionSum1 { - public static int MAXN = 500001 * 5; - public static int n, m, p; + public static int MAXN = 500001; + public static int n, m; - // op == 1代表树木,x、y、后面空缺 - // op == 2代表查询,x、y、效果v、隶属的问题q、树木量num - public static int[][] arr = new int[MAXN][6]; - public static int[][] tmp = new int[MAXN][6]; - public static int[] ans = new int[MAXN]; + // op == 1代表基站,x、y、功率v + // op == 2代表查询,x、y、效果v、问题q + public static int[][] arr = new int[MAXN][5]; + public static int cnt = 0; + + // 归并排序需要 + public static int[][] tmp = new int[MAXN][5]; + + // 问题的答案 + public static long[] ans = new long[MAXN]; public static void clone(int[] a, int[] b) { a[0] = b[0]; @@ -31,35 +32,35 @@ public static void clone(int[] a, int[] b) { a[2] = b[2]; a[3] = b[3]; a[4] = b[4]; - a[5] = b[5]; } - public static void addTree(int x, int y) { - arr[++p][0] = 1; - arr[p][1] = x; - arr[p][2] = y; + public static void addStation(int x, int y, int v) { + arr[++cnt][0] = 1; + arr[cnt][1] = x; + arr[cnt][2] = y; + arr[cnt][3] = v; } public static void addQuery(int x, int y, int v, int q) { - arr[++p][0] = 2; - arr[p][1] = x; - arr[p][2] = y; - arr[p][3] = v; - arr[p][4] = q; - arr[p][5] = 0; + arr[++cnt][0] = 2; + arr[cnt][1] = x; + arr[cnt][2] = y; + arr[cnt][3] = v; + arr[cnt][4] = q; } public static void merge(int l, int m, int r) { - int p1, p2, tree = 0; + int p1, p2; + long sum = 0; for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && arr[p1 + 1][2] <= arr[p2][2]) { p1++; if (arr[p1][0] == 1) { - tree++; + sum += arr[p1][3]; } } if (arr[p2][0] == 2) { - arr[p2][5] += tree; + ans[arr[p2][4]] += sum * arr[p2][3]; } } p1 = l; @@ -94,10 +95,11 @@ public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); m = in.nextInt(); - for (int i = 1, x, y; i <= n; i++) { + for (int i = 1, x, y, v; i <= n; i++) { x = in.nextInt(); y = in.nextInt(); - addTree(x, y); + v = in.nextInt(); + addStation(x, y, v); } for (int i = 1, a, b, c, d; i <= m; i++) { a = in.nextInt(); @@ -109,13 +111,8 @@ public static void main(String[] args) throws IOException { addQuery(a - 1, d, -1, i); addQuery(c, b - 1, -1, i); } - Arrays.sort(arr, 1, p + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[0] - b[0]); - cdq(1, p); - for (int i = 1; i <= p; i++) { - if (arr[i][0] == 2) { - ans[arr[i][4]] += arr[i][3] * arr[i][5]; - } - } + Arrays.sort(arr, 1, cnt + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[0] - b[0]); + cdq(1, cnt); for (int i = 1; i <= m; i++) { out.println(ans[i]); } diff --git a/src/class170/Code02_GardenerTrouble2.java b/src/class170/Code02_RegionSum2.java similarity index 67% rename from src/class170/Code02_GardenerTrouble2.java rename to src/class170/Code02_RegionSum2.java index 6105d7325..d9af3bd83 100644 --- a/src/class170/Code02_GardenerTrouble2.java +++ b/src/class170/Code02_RegionSum2.java @@ -1,7 +1,7 @@ package class170; -// 园丁的烦恼,C++版 -// 测试链接 : https://www.luogu.com.cn/problem/P2163 +// 二维空间查询经典模版,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3755 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -10,7 +10,7 @@ //using namespace std; // //struct Node { -// int op, x, y, v, q, num; // 类型、x、y、效果v、问题q、树木量num +// int op, x, y, v, q; //}; // //bool NodeCmp(Node a, Node b) { @@ -23,38 +23,40 @@ // return a.op < b.op; //} // -//const int MAXN = 500001 * 5; -//int n, m, p = 0; +//const int MAXN = 500001; +//int n, m; //Node arr[MAXN]; +//int cnt = 0; //Node tmp[MAXN]; -//int ans[MAXN]; +//long long ans[MAXN]; // -//void addTree(int x, int y) { -// arr[++p].op = 1; -// arr[p].x = x; -// arr[p].y = y; +//void addStation(int x, int y, int v) { +// arr[++cnt].op = 1; +// arr[cnt].x = x; +// arr[cnt].y = y; +// arr[cnt].v = v; //} // //void addQuery(int x, int y, int v, int q) { -// arr[++p].op = 2; -// arr[p].x = x; -// arr[p].y = y; -// arr[p].v = v; -// arr[p].q = q; -// arr[p].num = 0; +// arr[++cnt].op = 2; +// arr[cnt].x = x; +// arr[cnt].y = y; +// arr[cnt].v = v; +// arr[cnt].q = q; //} // //void merge(int l, int m, int r) { -// int p1, p2, tree = 0; +// int p1, p2; +// long long sum = 0; // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { // while (p1 + 1 <= m && arr[p1 + 1].y <= arr[p2].y) { // p1++; // if (arr[p1].op == 1) { -// tree++; +// sum += arr[p1].v; // } // } // if (arr[p2].op == 2) { -// arr[p2].num += tree; +// ans[arr[p2].q] += sum * arr[p2].v; // } // } // p1 = l; @@ -88,9 +90,9 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m; -// for (int i = 1, x, y; i <= n; i++) { -// cin >> x >> y; -// addTree(x, y); +// for (int i = 1, x, y, v; i <= n; i++) { +// cin >> x >> y >> v; +// addStation(x, y, v); // } // for (int i = 1, a, b, c, d; i <= m; i++) { // cin >> a >> b >> c >> d; @@ -99,13 +101,8 @@ // addQuery(a - 1, d, -1, i); // addQuery(c, b - 1, -1, i); // } -// sort(arr + 1, arr + p + 1, NodeCmp); -// cdq(1, p); -// for (int i = 1; i <= p; i++) { -// if (arr[i].op == 2) { -// ans[arr[i].q] += arr[i].v * arr[i].num; -// } -// } +// sort(arr + 1, arr + cnt + 1, NodeCmp); +// cdq(1, cnt); // for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; // } From 675b94d8e9ec5ef61dc4404ed5e9ed9de9c2c844 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 19:51:01 +0800 Subject: [PATCH 0182/1170] modify code --- src/class170/Code02_RegionSum1.java | 2 +- src/class170/Code02_RegionSum2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class170/Code02_RegionSum1.java b/src/class170/Code02_RegionSum1.java index 49dd7a400..8f56bf6c4 100644 --- a/src/class170/Code02_RegionSum1.java +++ b/src/class170/Code02_RegionSum1.java @@ -1,6 +1,6 @@ package class170; -// 二维空间查询经典模版,java版 +// 二维空间查询经典模型,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class170/Code02_RegionSum2.java b/src/class170/Code02_RegionSum2.java index d9af3bd83..beef3051b 100644 --- a/src/class170/Code02_RegionSum2.java +++ b/src/class170/Code02_RegionSum2.java @@ -1,6 +1,6 @@ package class170; -// 二维空间查询经典模版,C++版 +// 二维空间查询经典模型,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 5b1b8d969d3c49b6b2aaabb528f0358ee03abb3d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 19:51:53 +0800 Subject: [PATCH 0183/1170] modify code --- src/class170/Code02_RegionSum1.java | 2 +- src/class170/Code02_RegionSum2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class170/Code02_RegionSum1.java b/src/class170/Code02_RegionSum1.java index 8f56bf6c4..121bd550a 100644 --- a/src/class170/Code02_RegionSum1.java +++ b/src/class170/Code02_RegionSum1.java @@ -1,6 +1,6 @@ package class170; -// 二维空间查询经典模型,java版 +// 二维空间查询计数模版题,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class170/Code02_RegionSum2.java b/src/class170/Code02_RegionSum2.java index beef3051b..0f3a9b307 100644 --- a/src/class170/Code02_RegionSum2.java +++ b/src/class170/Code02_RegionSum2.java @@ -1,6 +1,6 @@ package class170; -// 二维空间查询经典模型,C++版 +// 二维空间查询计数模版题,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From a626793148469775035afab5d1c22e208c3d75e2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 19:52:25 +0800 Subject: [PATCH 0184/1170] modify code --- src/class170/Code02_RegionSum1.java | 2 +- src/class170/Code02_RegionSum2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class170/Code02_RegionSum1.java b/src/class170/Code02_RegionSum1.java index 121bd550a..a379d4919 100644 --- a/src/class170/Code02_RegionSum1.java +++ b/src/class170/Code02_RegionSum1.java @@ -1,6 +1,6 @@ package class170; -// 二维空间查询计数模版题,java版 +// 空间查询计数cdq模版题,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class170/Code02_RegionSum2.java b/src/class170/Code02_RegionSum2.java index 0f3a9b307..17509661f 100644 --- a/src/class170/Code02_RegionSum2.java +++ b/src/class170/Code02_RegionSum2.java @@ -1,6 +1,6 @@ package class170; -// 二维空间查询计数模版题,C++版 +// 空间查询计数cdq模版题,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From d6b8133108874acce35952d26e1922f006f94d6c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 21:30:46 +0800 Subject: [PATCH 0185/1170] modify code --- src/class170/{Code02_RegionSum1.java => Code05_RegionSum1.java} | 2 +- src/class170/{Code02_RegionSum2.java => Code05_RegionSum2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class170/{Code02_RegionSum1.java => Code05_RegionSum1.java} (99%) rename src/class170/{Code02_RegionSum2.java => Code05_RegionSum2.java} (100%) diff --git a/src/class170/Code02_RegionSum1.java b/src/class170/Code05_RegionSum1.java similarity index 99% rename from src/class170/Code02_RegionSum1.java rename to src/class170/Code05_RegionSum1.java index a379d4919..62f7151b8 100644 --- a/src/class170/Code02_RegionSum1.java +++ b/src/class170/Code05_RegionSum1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_RegionSum1 { +public class Code05_RegionSum1 { public static int MAXN = 500001; public static int n, m; diff --git a/src/class170/Code02_RegionSum2.java b/src/class170/Code05_RegionSum2.java similarity index 100% rename from src/class170/Code02_RegionSum2.java rename to src/class170/Code05_RegionSum2.java From 789344628774a3882a822d96f0469488c13fe8dd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 21:47:36 +0800 Subject: [PATCH 0186/1170] modify code --- src/class170/Code04_GardenerTrouble1.java | 163 ++++++++++++++++++ src/class170/Code04_GardenerTrouble2.java | 108 ++++++++++++ ...egionSum1.java => Code05_MissionOfC1.java} | 4 +- ...egionSum2.java => Code05_MissionOfC2.java} | 2 +- 4 files changed, 274 insertions(+), 3 deletions(-) create mode 100644 src/class170/Code04_GardenerTrouble1.java create mode 100644 src/class170/Code04_GardenerTrouble2.java rename src/class170/{Code05_RegionSum1.java => Code05_MissionOfC1.java} (97%) rename src/class170/{Code05_RegionSum2.java => Code05_MissionOfC2.java} (98%) diff --git a/src/class170/Code04_GardenerTrouble1.java b/src/class170/Code04_GardenerTrouble1.java new file mode 100644 index 000000000..bf2b0395f --- /dev/null +++ b/src/class170/Code04_GardenerTrouble1.java @@ -0,0 +1,163 @@ +package class170; + +// 园丁的烦恼,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2163 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但无法通过测试用例,内存使用过大 +// 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 +// 想通过用C++实现,本节课Code04_GardenerTrouble2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code04_GardenerTrouble1 { + + public static int MAXN = 500001 * 5; + public static int n, m; + + // op == 1代表树木,x、y + // op == 2代表查询,x、y、效果v、问题q + public static int[][] arr = new int[MAXN][5]; + public static int cnt = 0; + + // 归并排序需要 + public static int[][] tmp = new int[MAXN][5]; + + // 问题的答案 + public static int[] ans = new int[MAXN]; + + public static void clone(int[] a, int[] b) { + a[0] = b[0]; + a[1] = b[1]; + a[2] = b[2]; + a[3] = b[3]; + a[4] = b[4]; + } + + public static void addTree(int x, int y) { + arr[++cnt][0] = 1; + arr[cnt][1] = x; + arr[cnt][2] = y; + } + + public static void addQuery(int x, int y, int v, int q) { + arr[++cnt][0] = 2; + arr[cnt][1] = x; + arr[cnt][2] = y; + arr[cnt][3] = v; + arr[cnt][4] = q; + } + + public static void merge(int l, int m, int r) { + int p1, p2, tree = 0; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][2] <= arr[p2][2]) { + p1++; + if (arr[p1][0] == 1) { + tree++; + } + } + if (arr[p2][0] == 2) { + ans[arr[p2][4]] += tree * arr[p2][3]; + } + } + p1 = l; + p2 = m + 1; + int i = l; + while (p1 <= m && p2 <= r) { + clone(tmp[i++], arr[p1][2] <= arr[p2][2] ? arr[p1++] : arr[p2++]); + } + while (p1 <= m) { + clone(tmp[i++], arr[p1++]); + } + while (p2 <= r) { + clone(tmp[i++], arr[p2++]); + } + for (i = l; i <= r; i++) { + clone(arr[i], tmp[i]); + } + } + + public static void cdq(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + cdq(l, mid); + cdq(mid + 1, r); + merge(l, mid, r); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, x, y; i <= n; i++) { + x = in.nextInt(); + y = in.nextInt(); + addTree(x, y); + } + for (int i = 1, a, b, c, d; i <= m; i++) { + a = in.nextInt(); + b = in.nextInt(); + c = in.nextInt(); + d = in.nextInt(); + addQuery(c, d, 1, i); + addQuery(a - 1, b - 1, 1, i); + addQuery(a - 1, d, -1, i); + addQuery(c, b - 1, -1, i); + } + Arrays.sort(arr, 1, cnt + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[0] - b[0]); + cdq(1, cnt); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class170/Code04_GardenerTrouble2.java b/src/class170/Code04_GardenerTrouble2.java new file mode 100644 index 000000000..1fb008b9d --- /dev/null +++ b/src/class170/Code04_GardenerTrouble2.java @@ -0,0 +1,108 @@ +package class170; + +// 园丁的烦恼,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2163 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int op, x, y, v, q; +//}; +// +//bool NodeCmp(Node a, Node b) { +// if (a.x != b.x) { +// return a.x < b.x; +// } +// if (a.y != b.y) { +// return a.y < b.y; +// } +// return a.op < b.op; +//} +// +//const int MAXN = 500001 * 5; +//int n, m; +//Node arr[MAXN]; +//int cnt = 0; +//Node tmp[MAXN]; +//int ans[MAXN]; +// +//void addTree(int x, int y) { +// arr[++cnt].op = 1; +// arr[cnt].x = x; +// arr[cnt].y = y; +//} +// +//void addQuery(int x, int y, int v, int q) { +// arr[++cnt].op = 2; +// arr[cnt].x = x; +// arr[cnt].y = y; +// arr[cnt].v = v; +// arr[cnt].q = q; +//} +// +//void merge(int l, int m, int r) { +// int p1, p2, tree = 0; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].y <= arr[p2].y) { +// p1++; +// if (arr[p1].op == 1) { +// tree++; +// } +// } +// if (arr[p2].op == 2) { +// ans[arr[p2].q] += tree * arr[p2].v; +// } +// } +// p1 = l; +// p2 = m + 1; +// int i = l; +// while (p1 <= m && p2 <= r) { +// tmp[i++] = arr[p1].y <= arr[p2].y ? arr[p1++] : arr[p2++]; +// } +// while (p1 <= m) { +// tmp[i++] = arr[p1++]; +// } +// while (p2 <= r) { +// tmp[i++] = arr[p2++]; +// } +// for (i = l; i <= r; i++) { +// arr[i] = tmp[i]; +// } +//} +// +//void cdq(int l, int r) { +// if (l == r) { +// return; +// } +// int mid = (l + r) / 2; +// cdq(l, mid); +// cdq(mid + 1, r); +// merge(l, mid, r); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, x, y; i <= n; i++) { +// cin >> x >> y; +// addTree(x, y); +// } +// for (int i = 1, a, b, c, d; i <= m; i++) { +// cin >> a >> b >> c >> d; +// addQuery(c, d, 1, i); +// addQuery(a - 1, b - 1, 1, i); +// addQuery(a - 1, d, -1, i); +// addQuery(c, b - 1, -1, i); +// } +// sort(arr + 1, arr + cnt + 1, NodeCmp); +// cdq(1, cnt); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class170/Code05_RegionSum1.java b/src/class170/Code05_MissionOfC1.java similarity index 97% rename from src/class170/Code05_RegionSum1.java rename to src/class170/Code05_MissionOfC1.java index 62f7151b8..a2b2c45f7 100644 --- a/src/class170/Code05_RegionSum1.java +++ b/src/class170/Code05_MissionOfC1.java @@ -1,6 +1,6 @@ package class170; -// 空间查询计数cdq模版题,java版 +// 老C的任务,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_RegionSum1 { +public class Code05_MissionOfC1 { public static int MAXN = 500001; public static int n, m; diff --git a/src/class170/Code05_RegionSum2.java b/src/class170/Code05_MissionOfC2.java similarity index 98% rename from src/class170/Code05_RegionSum2.java rename to src/class170/Code05_MissionOfC2.java index 17509661f..cbcc3d37b 100644 --- a/src/class170/Code05_RegionSum2.java +++ b/src/class170/Code05_MissionOfC2.java @@ -1,6 +1,6 @@ package class170; -// 空间查询计数cdq模版题,C++版 +// 老C的任务,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From a4d03e54d16a150ac13462d5cc5476464c89225d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 22:01:03 +0800 Subject: [PATCH 0187/1170] modify code --- src/class170/{Code05_MissionOfC1.java => Code05_TaskOfC1.java} | 2 +- src/class170/{Code05_MissionOfC2.java => Code05_TaskOfC2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class170/{Code05_MissionOfC1.java => Code05_TaskOfC1.java} (99%) rename src/class170/{Code05_MissionOfC2.java => Code05_TaskOfC2.java} (100%) diff --git a/src/class170/Code05_MissionOfC1.java b/src/class170/Code05_TaskOfC1.java similarity index 99% rename from src/class170/Code05_MissionOfC1.java rename to src/class170/Code05_TaskOfC1.java index a2b2c45f7..82ede170c 100644 --- a/src/class170/Code05_MissionOfC1.java +++ b/src/class170/Code05_TaskOfC1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_MissionOfC1 { +public class Code05_TaskOfC1 { public static int MAXN = 500001; public static int n, m; diff --git a/src/class170/Code05_MissionOfC2.java b/src/class170/Code05_TaskOfC2.java similarity index 100% rename from src/class170/Code05_MissionOfC2.java rename to src/class170/Code05_TaskOfC2.java From 8068170377587932368bb2ff34c2ca878aa2ddd7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 May 2025 22:02:50 +0800 Subject: [PATCH 0188/1170] modify code --- src/class170/Code02_DynamicInversion1.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/class170/Code02_DynamicInversion1.java diff --git a/src/class170/Code02_DynamicInversion1.java b/src/class170/Code02_DynamicInversion1.java new file mode 100644 index 000000000..29ac13278 --- /dev/null +++ b/src/class170/Code02_DynamicInversion1.java @@ -0,0 +1,9 @@ +package class170; + +// 动态逆序对,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3157 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code02_DynamicInversion1 { + +} From 4b700b4eb04afa7cb41b2066c974917353554bd7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 12:26:38 +0800 Subject: [PATCH 0189/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 31 ++++--------------- src/class170/Code01_3DPartialOrder2.java | 25 +++++---------- ...ble1.java => Code05_GardenerTrouble1.java} | 2 +- ...ble2.java => Code05_GardenerTrouble2.java} | 0 ...e05_TaskOfC1.java => Code06_TaskOfC1.java} | 2 +- ...e05_TaskOfC2.java => Code06_TaskOfC2.java} | 0 6 files changed, 15 insertions(+), 45 deletions(-) rename src/class170/{Code04_GardenerTrouble1.java => Code05_GardenerTrouble1.java} (98%) rename src/class170/{Code04_GardenerTrouble2.java => Code05_GardenerTrouble2.java} (100%) rename src/class170/{Code05_TaskOfC1.java => Code06_TaskOfC1.java} (99%) rename src/class170/{Code05_TaskOfC2.java => Code06_TaskOfC2.java} (100%) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index aef8c0020..dc5684434 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -18,9 +18,6 @@ public class Code01_3DPartialOrder1 { // 位置i、属性a、属性b、属性c public static int[][] arr = new int[MAXN][4]; - // 归并排序需要 - public static int[][] tmp = new int[MAXN][4]; - // 树状数组 public static int[] tree = new int[MAXN]; @@ -30,13 +27,6 @@ public class Code01_3DPartialOrder1 { // 答案 public static int[] ans = new int[MAXN]; - public static void clone(int[] a, int[] b) { - a[0] = b[0]; - a[1] = b[1]; - a[2] = b[2]; - a[3] = b[3]; - } - public static int lowbit(int i) { return i & -i; } @@ -71,21 +61,12 @@ public static void merge(int l, int m, int r) { for (int i = l; i <= p1; i++) { add(arr[i][3], -1); } - p1 = l; - p2 = m + 1; - int i = l; - while (p1 <= m && p2 <= r) { - clone(tmp[i++], arr[p1][2] <= arr[p2][2] ? arr[p1++] : arr[p2++]); - } - while (p1 <= m) { - clone(tmp[i++], arr[p1++]); - } - while (p2 <= r) { - clone(tmp[i++], arr[p2++]); - } - for (i = l; i <= r; i++) { - clone(arr[i], tmp[i]); - } + // 上面的过程,有树状数组的操作,O(n * log n) + // 复杂度表达式,t(n) = 2 * t(n / 2) + O(n * log n) + // 时间复杂度O(n * log n * log n) + // 既然复杂度已经如此,接下来根据b属性来归并,执行O(n)的过程就显得无所谓了 + // 不如直接排序了,还更容易写 + Arrays.sort(arr, l, r + 1, (a, b) -> a[2] - b[2]); } public static void cdq(int l, int r) { diff --git a/src/class170/Code01_3DPartialOrder2.java b/src/class170/Code01_3DPartialOrder2.java index 721e39c65..212248f5a 100644 --- a/src/class170/Code01_3DPartialOrder2.java +++ b/src/class170/Code01_3DPartialOrder2.java @@ -13,7 +13,7 @@ // int i, a, b, c; //}; // -//bool NumberCmp(Number x, Number y) { +//bool CmpAbc(Number x, Number y) { // if (x.a != y.a) { // return x.a < y.a; // } @@ -23,10 +23,13 @@ // return x.c < y.c; //} // +//bool CmpB(Number x, Number y) { +// return x.b < y.b; +//} +// //const int MAXN = 200001; //int n, k; //Number arr[MAXN]; -//Number tmp[MAXN]; //int tree[MAXN]; //int f[MAXN]; //int ans[MAXN]; @@ -63,21 +66,7 @@ // for (int i = l; i <= p1; i++) { // add(arr[i].c, -1); // } -// p1 = l; -// p2 = m + 1; -// int i = l; -// while (p1 <= m && p2 <= r) { -// tmp[i++] = arr[p1].b <= arr[p2].b ? arr[p1++] : arr[p2++]; -// } -// while (p1 <= m) { -// tmp[i++] = arr[p1++]; -// } -// while (p2 <= r) { -// tmp[i++] = arr[p2++]; -// } -// for (i = l; i <= r; i++) { -// arr[i] = tmp[i]; -// } +// sort(arr + l, arr + r + 1, CmpB); //} // //void cdq(int l, int r) { @@ -91,7 +80,7 @@ //} // //void prepare() { -// sort(arr + 1, arr + n + 1, NumberCmp); +// sort(arr + 1, arr + n + 1, CmpAbc); // for (int l = 1, r = 1; l <= n; l = ++r) { // while (r + 1 <= n && arr[l].a == arr[r + 1].a && arr[l].b == arr[r + 1].b && arr[l].c == arr[r + 1].c) { // r++; diff --git a/src/class170/Code04_GardenerTrouble1.java b/src/class170/Code05_GardenerTrouble1.java similarity index 98% rename from src/class170/Code04_GardenerTrouble1.java rename to src/class170/Code05_GardenerTrouble1.java index bf2b0395f..8c392d60d 100644 --- a/src/class170/Code04_GardenerTrouble1.java +++ b/src/class170/Code05_GardenerTrouble1.java @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code04_GardenerTrouble1 { +public class Code05_GardenerTrouble1 { public static int MAXN = 500001 * 5; public static int n, m; diff --git a/src/class170/Code04_GardenerTrouble2.java b/src/class170/Code05_GardenerTrouble2.java similarity index 100% rename from src/class170/Code04_GardenerTrouble2.java rename to src/class170/Code05_GardenerTrouble2.java diff --git a/src/class170/Code05_TaskOfC1.java b/src/class170/Code06_TaskOfC1.java similarity index 99% rename from src/class170/Code05_TaskOfC1.java rename to src/class170/Code06_TaskOfC1.java index 82ede170c..13f49de4c 100644 --- a/src/class170/Code05_TaskOfC1.java +++ b/src/class170/Code06_TaskOfC1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_TaskOfC1 { +public class Code06_TaskOfC1 { public static int MAXN = 500001; public static int n, m; diff --git a/src/class170/Code05_TaskOfC2.java b/src/class170/Code06_TaskOfC2.java similarity index 100% rename from src/class170/Code05_TaskOfC2.java rename to src/class170/Code06_TaskOfC2.java From c7285884551b58cbfd1a8b55a50a746bae070c4d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 12:55:21 +0800 Subject: [PATCH 0190/1170] modify code --- ...ode05_GardenerTrouble1.java => Code04_GardenerTrouble1.java} | 2 +- ...ode05_GardenerTrouble2.java => Code04_GardenerTrouble2.java} | 0 src/class170/{Code06_TaskOfC1.java => Code05_TaskOfC1.java} | 2 +- src/class170/{Code06_TaskOfC2.java => Code05_TaskOfC2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class170/{Code05_GardenerTrouble1.java => Code04_GardenerTrouble1.java} (98%) rename src/class170/{Code05_GardenerTrouble2.java => Code04_GardenerTrouble2.java} (100%) rename src/class170/{Code06_TaskOfC1.java => Code05_TaskOfC1.java} (99%) rename src/class170/{Code06_TaskOfC2.java => Code05_TaskOfC2.java} (100%) diff --git a/src/class170/Code05_GardenerTrouble1.java b/src/class170/Code04_GardenerTrouble1.java similarity index 98% rename from src/class170/Code05_GardenerTrouble1.java rename to src/class170/Code04_GardenerTrouble1.java index 8c392d60d..bf2b0395f 100644 --- a/src/class170/Code05_GardenerTrouble1.java +++ b/src/class170/Code04_GardenerTrouble1.java @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_GardenerTrouble1 { +public class Code04_GardenerTrouble1 { public static int MAXN = 500001 * 5; public static int n, m; diff --git a/src/class170/Code05_GardenerTrouble2.java b/src/class170/Code04_GardenerTrouble2.java similarity index 100% rename from src/class170/Code05_GardenerTrouble2.java rename to src/class170/Code04_GardenerTrouble2.java diff --git a/src/class170/Code06_TaskOfC1.java b/src/class170/Code05_TaskOfC1.java similarity index 99% rename from src/class170/Code06_TaskOfC1.java rename to src/class170/Code05_TaskOfC1.java index 13f49de4c..82ede170c 100644 --- a/src/class170/Code06_TaskOfC1.java +++ b/src/class170/Code05_TaskOfC1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code06_TaskOfC1 { +public class Code05_TaskOfC1 { public static int MAXN = 500001; public static int n, m; diff --git a/src/class170/Code06_TaskOfC2.java b/src/class170/Code05_TaskOfC2.java similarity index 100% rename from src/class170/Code06_TaskOfC2.java rename to src/class170/Code05_TaskOfC2.java From 1b0555c6fac37992aab70f48efe6cdb7ea214c3e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 14:20:08 +0800 Subject: [PATCH 0191/1170] modify code --- src/class170/Code02_DynamicInversion1.java | 155 +++++++++++++++++++++ src/class170/Code02_DynamicInversion2.java | 125 +++++++++++++++++ 2 files changed, 280 insertions(+) create mode 100644 src/class170/Code02_DynamicInversion2.java diff --git a/src/class170/Code02_DynamicInversion1.java b/src/class170/Code02_DynamicInversion1.java index 29ac13278..995cb1a48 100644 --- a/src/class170/Code02_DynamicInversion1.java +++ b/src/class170/Code02_DynamicInversion1.java @@ -4,6 +4,161 @@ // 测试链接 : https://www.luogu.com.cn/problem/P3157 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + public class Code02_DynamicInversion1 { + public static int MAXN = 100001; + public static int MAXM = 50001; + public static int n, m; + + public static int[] num = new int[MAXN]; + public static int[] pos = new int[MAXN]; + public static int[] del = new int[MAXM]; + + // 位置i、数值v、效果d、问题q + public static int[][] arr = new int[MAXN + MAXM][4]; + public static int cnt = 0; + + public static int[] tree = new int[MAXN]; + + public static long[] ans = new long[MAXM]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= n) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int query(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static void merge(int l, int m, int r) { + int p1, p2; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][0] <= arr[p2][0]) { + p1++; + add(arr[p1][1], arr[p1][2]); + } + ans[arr[p2][3]] += arr[p2][2] * (query(n) - query(arr[p2][1])); + } + for (int i = l; i <= p1; i++) { + add(arr[i][1], -arr[i][2]); + } + for (p1 = m + 1, p2 = r; p2 > m; p2--) { + while (p1 - 1 >= l && arr[p1 - 1][0] >= arr[p2][0]) { + p1--; + add(arr[p1][1], arr[p1][2]); + } + ans[arr[p2][3]] += arr[p2][2] * query(arr[p2][1] - 1); + } + for (int i = m; i >= p1; i--) { + add(arr[i][1], -arr[i][2]); + } + Arrays.sort(arr, l, r + 1, (a, b) -> a[0] - b[0]); + } + + public static void cdq(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + cdq(l, mid); + cdq(mid + 1, r); + merge(l, mid, r); + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + arr[++cnt][0] = i; + arr[cnt][1] = num[i]; + arr[cnt][2] = 1; + arr[cnt][3] = 0; + } + for (int i = 1; i <= m; i++) { + arr[++cnt][0] = pos[del[i]]; + arr[cnt][1] = del[i]; + arr[cnt][2] = -1; + arr[cnt][3] = i; + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + num[i] = in.nextInt(); + pos[num[i]] = i; + } + for (int i = 1; i <= m; i++) { + del[i] = in.nextInt(); + } + prepare(); + cdq(1, cnt); + for (int i = 1; i < m; i++) { + ans[i] += ans[i - 1]; + } + for (int i = 0; i < m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class170/Code02_DynamicInversion2.java b/src/class170/Code02_DynamicInversion2.java new file mode 100644 index 000000000..7d33c1b39 --- /dev/null +++ b/src/class170/Code02_DynamicInversion2.java @@ -0,0 +1,125 @@ +package class170; + +// 动态逆序对,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3157 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Number { +// int i, v, d, q; +//}; +// +//bool CmpIndex(Number x, Number y) { +// return x.i < y.i; +//} +// +//const int MAXN = 100001; +//const int MAXM = 50001; +//int n, m; +// +//int num[MAXN]; +//int pos[MAXN]; +//int del[MAXM]; +// +//Number arr[MAXN + MAXM]; +//int cnt = 0; +// +//int tree[MAXN]; +// +//long long ans[MAXM]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= n) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int query(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void merge(int l, int m, int r) { +// int p1, p2; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].i <= arr[p2].i) { +// p1++; +// add(arr[p1].v, arr[p1].d); +// } +// ans[arr[p2].q] += arr[p2].d * (query(n) - query(arr[p2].v)); +// } +// for (int i = l; i <= p1; i++) { +// add(arr[i].v, -arr[i].d); +// } +// for (p1 = m + 1, p2 = r; p2 > m; p2--) { +// while (p1 - 1 >= l && arr[p1 - 1].i >= arr[p2].i) { +// p1--; +// add(arr[p1].v, arr[p1].d); +// } +// ans[arr[p2].q] += arr[p2].d * query(arr[p2].v - 1); +// } +// for (int i = m; i >= p1; i--) { +// add(arr[i].v, -arr[i].d); +// } +// sort(arr + l, arr + r + 1, CmpIndex); +//} +// +//void cdq(int l, int r) { +// if (l == r) { +// return; +// } +// int mid = (l + r) / 2; +// cdq(l, mid); +// cdq(mid + 1, r); +// merge(l, mid, r); +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// arr[++cnt].i = i; +// arr[cnt].v = num[i]; +// arr[cnt].d = 1; +// arr[cnt].q = 0; +// } +// for (int i = 1; i <= m; i++) { +// arr[++cnt].i = pos[del[i]]; +// arr[cnt].v = del[i]; +// arr[cnt].d = -1; +// arr[cnt].q = i; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> num[i]; +// pos[num[i]] = i; +// } +// for (int i = 1; i <= m; i++) { +// cin >> del[i]; +// } +// prepare(); +// cdq(1, cnt); +// for (int i = 1; i < m; i++) { +// ans[i] += ans[i - 1]; +// } +// for (int i = 0; i < m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 5c54b2c9d1b2242bf93392330a4023a63d318430 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 14:25:49 +0800 Subject: [PATCH 0192/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index dc5684434..d3fb75295 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -61,11 +61,11 @@ public static void merge(int l, int m, int r) { for (int i = l; i <= p1; i++) { add(arr[i][3], -1); } - // 上面的过程,有树状数组的操作,O(n * log n) - // 复杂度表达式,t(n) = 2 * t(n / 2) + O(n * log n) - // 时间复杂度O(n * log n * log n) - // 既然复杂度已经如此,接下来根据b属性来归并,执行O(n)的过程就显得无所谓了 - // 不如直接排序了,还更容易写 + // 上面的过程有树状数组的操作,时间复杂度,O(n * log n) + // 复杂度表达式为 t(n) = 2 * t(n / 2) + O(n * log n) + // 上面表达式的复杂度为 O(n * log n * log n) + // 既然复杂度已经如此,接下来根据b属性来归并,做到O(n)的归并过程就不重要了 + // 不如直接排序,更容易写,还省了辅助数组的空间 Arrays.sort(arr, l, r + 1, (a, b) -> a[2] - b[2]); } From 1e2b3739dd3a2f0e9e622aacfdf9aec79de88ed6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 14:26:53 +0800 Subject: [PATCH 0193/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index d3fb75295..3b4456306 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -65,7 +65,7 @@ public static void merge(int l, int m, int r) { // 复杂度表达式为 t(n) = 2 * t(n / 2) + O(n * log n) // 上面表达式的复杂度为 O(n * log n * log n) // 既然复杂度已经如此,接下来根据b属性来归并,做到O(n)的归并过程就不重要了 - // 不如直接排序,更容易写,还省了辅助数组的空间 + // 不如直接根据b属性排序,更容易写,还省了辅助数组的空间 Arrays.sort(arr, l, r + 1, (a, b) -> a[2] - b[2]); } From de055bd170a425a0f9269b4896f3163ebd971e09 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 14:34:21 +0800 Subject: [PATCH 0194/1170] modify code --- src/class170/Code03_AngelDoll1.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/class170/Code03_AngelDoll1.java diff --git a/src/class170/Code03_AngelDoll1.java b/src/class170/Code03_AngelDoll1.java new file mode 100644 index 000000000..2d039ac92 --- /dev/null +++ b/src/class170/Code03_AngelDoll1.java @@ -0,0 +1,9 @@ +package class170; + +// 天使玩偶,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4169 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code03_AngelDoll1 { + +} From ebbf05bcf0d719972819e9d1ca2d12c8b551f3e8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 16:02:33 +0800 Subject: [PATCH 0195/1170] modify code --- ...e04_GardenerTrouble1.java => Code03_GardenerTrouble1.java} | 4 ++-- ...e04_GardenerTrouble2.java => Code03_GardenerTrouble2.java} | 0 src/class170/{Code05_TaskOfC1.java => Code04_TaskOfC1.java} | 2 +- src/class170/{Code05_TaskOfC2.java => Code04_TaskOfC2.java} | 0 .../{Code03_AngelDoll1.java => Code05_AngelDoll1.java} | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename src/class170/{Code04_GardenerTrouble1.java => Code03_GardenerTrouble1.java} (97%) rename src/class170/{Code04_GardenerTrouble2.java => Code03_GardenerTrouble2.java} (100%) rename src/class170/{Code05_TaskOfC1.java => Code04_TaskOfC1.java} (99%) rename src/class170/{Code05_TaskOfC2.java => Code04_TaskOfC2.java} (100%) rename src/class170/{Code03_AngelDoll1.java => Code05_AngelDoll1.java} (85%) diff --git a/src/class170/Code04_GardenerTrouble1.java b/src/class170/Code03_GardenerTrouble1.java similarity index 97% rename from src/class170/Code04_GardenerTrouble1.java rename to src/class170/Code03_GardenerTrouble1.java index bf2b0395f..0cc0c7f18 100644 --- a/src/class170/Code04_GardenerTrouble1.java +++ b/src/class170/Code03_GardenerTrouble1.java @@ -5,7 +5,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但无法通过测试用例,内存使用过大 // 因为这道题只考虑C++能通过的空间极限,根本没考虑java的用户 -// 想通过用C++实现,本节课Code04_GardenerTrouble2文件就是C++的实现 +// 想通过用C++实现,本节课Code03_GardenerTrouble2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code04_GardenerTrouble1 { +public class Code03_GardenerTrouble1 { public static int MAXN = 500001 * 5; public static int n, m; diff --git a/src/class170/Code04_GardenerTrouble2.java b/src/class170/Code03_GardenerTrouble2.java similarity index 100% rename from src/class170/Code04_GardenerTrouble2.java rename to src/class170/Code03_GardenerTrouble2.java diff --git a/src/class170/Code05_TaskOfC1.java b/src/class170/Code04_TaskOfC1.java similarity index 99% rename from src/class170/Code05_TaskOfC1.java rename to src/class170/Code04_TaskOfC1.java index 82ede170c..4eda9cb8a 100644 --- a/src/class170/Code05_TaskOfC1.java +++ b/src/class170/Code04_TaskOfC1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_TaskOfC1 { +public class Code04_TaskOfC1 { public static int MAXN = 500001; public static int n, m; diff --git a/src/class170/Code05_TaskOfC2.java b/src/class170/Code04_TaskOfC2.java similarity index 100% rename from src/class170/Code05_TaskOfC2.java rename to src/class170/Code04_TaskOfC2.java diff --git a/src/class170/Code03_AngelDoll1.java b/src/class170/Code05_AngelDoll1.java similarity index 85% rename from src/class170/Code03_AngelDoll1.java rename to src/class170/Code05_AngelDoll1.java index 2d039ac92..a65d56bd8 100644 --- a/src/class170/Code03_AngelDoll1.java +++ b/src/class170/Code05_AngelDoll1.java @@ -4,6 +4,6 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4169 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -public class Code03_AngelDoll1 { +public class Code05_AngelDoll1 { } From 9852a529988d2ee6ec2b6540939e59fba084b801 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 17:45:28 +0800 Subject: [PATCH 0196/1170] modify code --- src/class170/Code05_AngelDoll1.java | 203 ++++++++++++++++++++++++++++ src/class170/Code05_AngelDoll2.java | 151 +++++++++++++++++++++ 2 files changed, 354 insertions(+) create mode 100644 src/class170/Code05_AngelDoll2.java diff --git a/src/class170/Code05_AngelDoll1.java b/src/class170/Code05_AngelDoll1.java index a65d56bd8..5a03cbd1c 100644 --- a/src/class170/Code05_AngelDoll1.java +++ b/src/class170/Code05_AngelDoll1.java @@ -4,6 +4,209 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4169 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + public class Code05_AngelDoll1 { + public static int MAXN = 300001; + public static int MAXV = 1000001; + public static int INF = 1000000001; + public static int n, m, v; + + // op == 1代表添加事件,x、y、空缺 + // op == 1代表查询事件,x、y、问题q + public static int[][] tim = new int[MAXN << 1][4]; + public static int cnte = 0; + public static int cntq = 0; + + // tim永远保持原始时序,每次执行cdq时,让arr去变动 + public static int[][] arr = new int[MAXN << 1][4]; + + public static int[] tree = new int[MAXV]; + + public static int[] ans = new int[MAXN]; + + public static void clone(int[] a, int[] b) { + a[0] = b[0]; + a[1] = b[1]; + a[2] = b[2]; + a[3] = b[3]; + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void update(int i, int num) { + while (i <= v) { + tree[i] = Math.max(tree[i], num); + i += lowbit(i); + } + } + + public static int query(int i) { + int ret = 0; + while (i > 0) { + ret = Math.max(ret, tree[i]); + i -= lowbit(i); + } + // 如果左下没有点,那么返回无效答案 + return ret != 0 ? ret : -INF; + } + + public static void clear(int i) { + while (i <= v) { + tree[i] = 0; + i += lowbit(i); + } + } + + // 所有点变到第一象限 + public static void to1() { + for (int i = 1; i <= cnte; i++) { + clone(arr[i], tim[i]); + } + } + + // 所有点变到第二象限 + public static void to2() { + for (int i = 1; i <= cnte; i++) { + clone(arr[i], tim[i]); + arr[i][1] = v - arr[i][1]; + } + } + + // 所有点变到第三象限 + public static void to3() { + for (int i = 1; i <= cnte; i++) { + clone(arr[i], tim[i]); + arr[i][1] = v - arr[i][1]; + arr[i][2] = v - arr[i][2]; + } + } + + // 所有点变到第四象限 + public static void to4() { + for (int i = 1; i <= cnte; i++) { + clone(arr[i], tim[i]); + arr[i][2] = v - arr[i][2]; + } + } + + public static void merge(int l, int m, int r) { + int p1, p2; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][1]) { + p1++; + if (arr[p1][0] == 1) { + update(arr[p1][2], arr[p1][1] + arr[p1][2]); + } + } + if (arr[p2][0] == 2) { + ans[arr[p2][3]] = Math.min(ans[arr[p2][3]], arr[p2][1] + arr[p2][2] - query(arr[p2][2])); + } + } + for (int i = l; i <= p1; i++) { + if (arr[i][0] == 1) { + clear(arr[i][2]); + } + } + Arrays.sort(arr, l, r + 1, (a, b) -> a[1] - b[1]); + } + + public static void cdq(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + cdq(l, mid); + cdq(mid + 1, r); + merge(l, mid, r); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + // 树状数组下标从1开始,所以x和y都要自增一下 + for (int i = 1, x, y; i <= n; i++) { + x = in.nextInt(); + y = in.nextInt(); + tim[++cnte][0] = 1; + tim[cnte][1] = ++x; + tim[cnte][2] = ++y; + v = Math.max(v, Math.max(x, y)); + } + for (int i = 1, op, x, y; i <= m; i++) { + op = in.nextInt(); + x = in.nextInt(); + y = in.nextInt(); + tim[++cnte][0] = op; + tim[cnte][1] = ++x; + tim[cnte][2] = ++y; + if (op == 2) { + tim[cnte][3] = ++cntq; + } + v = Math.max(v, Math.max(x, y)); + } + // 变换象限时,防止 v - (x或y) 出现0,所以v再自增一下 + v++; + for (int i = 1; i <= cntq; i++) { + ans[i] = INF; + } + to1(); cdq(1, cnte); + to2(); cdq(1, cnte); + to3(); cdq(1, cnte); + to4(); cdq(1, cnte); + for (int i = 1; i <= cntq; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class170/Code05_AngelDoll2.java b/src/class170/Code05_AngelDoll2.java new file mode 100644 index 000000000..2bcf87602 --- /dev/null +++ b/src/class170/Code05_AngelDoll2.java @@ -0,0 +1,151 @@ +package class170; + +// 天使玩偶,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4169 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int op, x, y, q; +//}; +// +//bool NodeCmp(Node a, Node b) { +// return a.x < b.x; +//} +// +//const int MAXN = 300001; +//const int MAXV = 1000001; +//const int INF = 1000000001; +//int n, m, v; +// +//Node tim[MAXN << 1]; +//int cnte = 0; +//int cntq = 0; +//Node arr[MAXN << 1]; +//int tree[MAXV]; +//int ans[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void update(int i, int num) { +// while (i <= v) { +// tree[i] = max(tree[i], num); +// i += lowbit(i); +// } +//} +// +//int query(int i) { +// int ret = 0; +// while (i > 0) { +// ret = max(ret, tree[i]); +// i -= lowbit(i); +// } +// return ret ? ret : -INF; +//} +// +//void clear(int i) { +// while (i <= v) { +// tree[i] = 0; +// i += lowbit(i); +// } +//} +// +//void to1() { +// for (int i = 1; i <= cnte; i++) { +// arr[i] = tim[i]; +// } +//} +// +//void to2() { +// for (int i = 1; i <= cnte; i++) { +// arr[i] = tim[i]; +// arr[i].x = v - arr[i].x; +// } +//} +// +//void to3() { +// for (int i = 1; i <= cnte; i++) { +// arr[i] = tim[i]; +// arr[i].x = v - arr[i].x; +// arr[i].y = v - arr[i].y; +// } +//} +// +//void to4() { +// for (int i = 1; i <= cnte; i++) { +// arr[i] = tim[i]; +// arr[i].y = v - arr[i].y; +// } +//} +// +//void merge(int l, int m, int r) { +// int p1, p2; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].x <= arr[p2].x) { +// p1++; +// if (arr[p1].op == 1) { +// update(arr[p1].y, arr[p1].x + arr[p1].y); +// } +// } +// if (arr[p2].op == 2) { +// ans[arr[p2].q] = min(ans[arr[p2].q], arr[p2].x + arr[p2].y - query(arr[p2].y)); +// } +// } +// for (int i = l; i <= p1; i++) { +// if (arr[i].op == 1) { +// clear(arr[i].y); +// } +// } +// sort(arr + l, arr + r + 1, NodeCmp); +//} +// +//void cdq(int l, int r) { +// if (l == r) { +// return; +// } +// int mid = (l + r) >> 1; +// cdq(l, mid); +// cdq(mid + 1, r); +// merge(l, mid, r); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, x, y; i <= n; i++) { +// cin >> x >> y; +// tim[++cnte].op = 1; +// tim[cnte].x = ++x; +// tim[cnte].y = ++y; +// v = max(v, max(x, y)); +// } +// for (int i = 1, op, x, y; i <= m; i++) { +// cin >> op >> x >> y; +// tim[++cnte].op = op; +// tim[cnte].x = ++x; +// tim[cnte].y = ++y; +// if (op == 2) { +// tim[cnte].q = ++cntq; +// } +// v = max(v, max(x, y)); +// } +// v++; +// for (int i = 1; i <= cntq; i++) { +// ans[i] = INF; +// } +// to1(); cdq(1, cnte); +// to2(); cdq(1, cnte); +// to3(); cdq(1, cnte); +// to4(); cdq(1, cnte); +// for (int i = 1; i <= cntq; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From ab316bdf032448141e956b21eb87cdc53e05bb64 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 18:14:38 +0800 Subject: [PATCH 0197/1170] modify code --- src/class170/Code05_Mokia1.java | 9 +++++++++ .../{Code05_AngelDoll1.java => Code06_AngelDoll1.java} | 2 +- .../{Code05_AngelDoll2.java => Code06_AngelDoll2.java} | 0 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/class170/Code05_Mokia1.java rename src/class170/{Code05_AngelDoll1.java => Code06_AngelDoll1.java} (99%) rename src/class170/{Code05_AngelDoll2.java => Code06_AngelDoll2.java} (100%) diff --git a/src/class170/Code05_Mokia1.java b/src/class170/Code05_Mokia1.java new file mode 100644 index 000000000..1e83389bb --- /dev/null +++ b/src/class170/Code05_Mokia1.java @@ -0,0 +1,9 @@ +package class170; + +// 摩基亚,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4390 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code05_Mokia1 { + +} diff --git a/src/class170/Code05_AngelDoll1.java b/src/class170/Code06_AngelDoll1.java similarity index 99% rename from src/class170/Code05_AngelDoll1.java rename to src/class170/Code06_AngelDoll1.java index 5a03cbd1c..cb75f0a41 100644 --- a/src/class170/Code05_AngelDoll1.java +++ b/src/class170/Code06_AngelDoll1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_AngelDoll1 { +public class Code06_AngelDoll1 { public static int MAXN = 300001; public static int MAXV = 1000001; diff --git a/src/class170/Code05_AngelDoll2.java b/src/class170/Code06_AngelDoll2.java similarity index 100% rename from src/class170/Code05_AngelDoll2.java rename to src/class170/Code06_AngelDoll2.java From 4a8137977e6dc64d0be77a75046946af6afa93cf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 21:43:46 +0800 Subject: [PATCH 0198/1170] modify code --- src/class170/Code05_Mokia1.java | 158 ++++++++++++++++++++++++++++ src/class170/Code05_Mokia2.java | 127 ++++++++++++++++++++++ src/class170/Code06_AngelDoll1.java | 2 +- src/class170/Code06_AngelDoll2.java | 2 +- 4 files changed, 287 insertions(+), 2 deletions(-) create mode 100644 src/class170/Code05_Mokia2.java diff --git a/src/class170/Code05_Mokia1.java b/src/class170/Code05_Mokia1.java index 1e83389bb..d72f8ea61 100644 --- a/src/class170/Code05_Mokia1.java +++ b/src/class170/Code05_Mokia1.java @@ -4,6 +4,164 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4390 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + public class Code05_Mokia1 { + public static int MAXN = 200001; + public static int MAXV = 2000002; + public static int w; + + // op == 1表示增加事件,x、y、人数v + // op == 1表示查询事件,x、y、效果v、问题q + public static int[][] arr = new int[MAXN][5]; + public static int cnte = 0; + public static int cntq = 0; + + public static int[] tree = new int[MAXV]; + + public static int[] ans = new int[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= w) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int query(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static void addPeople(int x, int y, int v) { + arr[++cnte][0] = 1; + arr[cnte][1] = x; + arr[cnte][2] = y; + arr[cnte][3] = v; + } + + public static void addQuery(int x, int y, int v, int q) { + arr[++cnte][0] = 2; + arr[cnte][1] = x; + arr[cnte][2] = y; + arr[cnte][3] = v; + arr[cnte][4] = q; + } + + public static void merge(int l, int m, int r) { + int p1, p2; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][1]) { + p1++; + if (arr[p1][0] == 1) { + add(arr[p1][2], arr[p1][3]); + } + } + if (arr[p2][0] == 2) { + ans[arr[p2][4]] += arr[p2][3] * query(arr[p2][2]); + } + } + for (int i = l; i <= p1; i++) { + if (arr[i][0] == 1) { + add(arr[i][2], -arr[i][3]); + } + } + Arrays.sort(arr, l, r + 1, (a, b) -> a[1] - b[1]); + } + + public static void cdq(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + cdq(l, mid); + cdq(mid + 1, r); + merge(l, mid, r); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + in.nextInt(); + w = in.nextInt() + 1; + int op, x, y, v, a, b, c, d; + op = in.nextInt(); + while (op != 3) { + if (op == 1) { + x = in.nextInt() + 1; + y = in.nextInt() + 1; + v = in.nextInt(); + addPeople(x, y, v); + } else { + a = in.nextInt() + 1; + b = in.nextInt() + 1; + c = in.nextInt() + 1; + d = in.nextInt() + 1; + addQuery(c, d, 1, ++cntq); + addQuery(a - 1, b - 1, 1, cntq); + addQuery(a - 1, d, -1, cntq); + addQuery(c, b - 1, -1, cntq); + } + op = in.nextInt(); + } + cdq(1, cnte); + for (int i = 1; i <= cntq; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class170/Code05_Mokia2.java b/src/class170/Code05_Mokia2.java new file mode 100644 index 000000000..f7c97f09e --- /dev/null +++ b/src/class170/Code05_Mokia2.java @@ -0,0 +1,127 @@ +package class170; + +// 摩基亚,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4390 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int op, x, y, v, q; +//}; +// +//bool NodeCmp(Node a, Node b) { +// return a.x < b.x; +//} +// +//const int MAXN = 200001; +//const int MAXV = 2000002; +//const int INF = 1000000001; +//int w; +// +//Node arr[MAXN]; +//int cnte = 0; +//int cntq = 0; +// +//int tree[MAXV]; +// +//int ans[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= w) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int query(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void addPeople(int x, int y, int v) { +// arr[++cnte].op = 1; +// arr[cnte].x = x; +// arr[cnte].y = y; +// arr[cnte].v = v; +//} +// +//void addQuery(int x, int y, int v, int q) { +// arr[++cnte].op = 2; +// arr[cnte].x = x; +// arr[cnte].y = y; +// arr[cnte].v = v; +// arr[cnte].q = q; +//} +// +//void merge(int l, int m, int r) { +// int p1, p2; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].x <= arr[p2].x) { +// p1++; +// if (arr[p1].op == 1) { +// add(arr[p1].y, arr[p1].v); +// } +// } +// if (arr[p2].op == 2) { +// ans[arr[p2].q] += arr[p2].v * query(arr[p2].y); +// } +// } +// for (int i = l; i <= p1; i++) { +// if (arr[i].op == 1) { +// add(arr[i].y, -arr[i].v); +// } +// } +// sort(arr + l, arr + r + 1, NodeCmp); +//} +// +//void cdq(int l, int r) { +// if (l == r) { +// return; +// } +// int mid = (l + r) / 2; +// cdq(l, mid); +// cdq(mid + 1, r); +// merge(l, mid, r); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int tmp; +// cin >> tmp >> w; +// w++; +// int op, x, y, v, a, b, c, d; +// cin >> op; +// while (op != 3) { +// if (op == 1) { +// cin >> x >> y >> v; +// x++; y++; +// addPeople(x, y, v); +// } else { +// cin >> a >> b >> c >> d; +// a++; b++; c++; d++; +// addQuery(c, d, 1, ++cntq); +// addQuery(a - 1, b - 1, 1, cntq); +// addQuery(a - 1, d, -1, cntq); +// addQuery(c, b - 1, -1, cntq); +// } +// cin >> op; +// } +// cdq(1, cnte); +// for (int i = 1; i <= cntq; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class170/Code06_AngelDoll1.java b/src/class170/Code06_AngelDoll1.java index cb75f0a41..1e296d1c2 100644 --- a/src/class170/Code06_AngelDoll1.java +++ b/src/class170/Code06_AngelDoll1.java @@ -13,7 +13,7 @@ public class Code06_AngelDoll1 { public static int MAXN = 300001; - public static int MAXV = 1000001; + public static int MAXV = 1000002; public static int INF = 1000000001; public static int n, m, v; diff --git a/src/class170/Code06_AngelDoll2.java b/src/class170/Code06_AngelDoll2.java index 2bcf87602..7eaf21012 100644 --- a/src/class170/Code06_AngelDoll2.java +++ b/src/class170/Code06_AngelDoll2.java @@ -18,7 +18,7 @@ //} // //const int MAXN = 300001; -//const int MAXV = 1000001; +//const int MAXV = 1000002; //const int INF = 1000000001; //int n, m, v; // From 628860f9d0f4cee7dc0d1a948ca0ead670579c86 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 21:51:17 +0800 Subject: [PATCH 0199/1170] modify code --- src/class170/Code01_3DPartialOrder2.java | 8 ++++---- src/class170/Code02_DynamicInversion2.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/class170/Code01_3DPartialOrder2.java b/src/class170/Code01_3DPartialOrder2.java index 212248f5a..99a29a35f 100644 --- a/src/class170/Code01_3DPartialOrder2.java +++ b/src/class170/Code01_3DPartialOrder2.java @@ -9,11 +9,11 @@ // //using namespace std; // -//struct Number { +//struct Node { // int i, a, b, c; //}; // -//bool CmpAbc(Number x, Number y) { +//bool CmpAbc(Node x, Node y) { // if (x.a != y.a) { // return x.a < y.a; // } @@ -23,13 +23,13 @@ // return x.c < y.c; //} // -//bool CmpB(Number x, Number y) { +//bool CmpB(Node x, Node y) { // return x.b < y.b; //} // //const int MAXN = 200001; //int n, k; -//Number arr[MAXN]; +//Node arr[MAXN]; //int tree[MAXN]; //int f[MAXN]; //int ans[MAXN]; diff --git a/src/class170/Code02_DynamicInversion2.java b/src/class170/Code02_DynamicInversion2.java index 7d33c1b39..eaf3960d1 100644 --- a/src/class170/Code02_DynamicInversion2.java +++ b/src/class170/Code02_DynamicInversion2.java @@ -9,11 +9,11 @@ // //using namespace std; // -//struct Number { +//struct Node { // int i, v, d, q; //}; // -//bool CmpIndex(Number x, Number y) { +//bool CmpIndex(Node x, Node y) { // return x.i < y.i; //} // @@ -25,7 +25,7 @@ //int pos[MAXN]; //int del[MAXM]; // -//Number arr[MAXN + MAXM]; +//Node arr[MAXN + MAXM]; //int cnt = 0; // //int tree[MAXN]; From 010fb3b8907e1902647de3bd3307cd6e265c1319 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 May 2025 21:58:47 +0800 Subject: [PATCH 0200/1170] modify code --- src/class170/Code02_DynamicInversion2.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class170/Code02_DynamicInversion2.java b/src/class170/Code02_DynamicInversion2.java index eaf3960d1..d0d5bcaba 100644 --- a/src/class170/Code02_DynamicInversion2.java +++ b/src/class170/Code02_DynamicInversion2.java @@ -13,7 +13,7 @@ // int i, v, d, q; //}; // -//bool CmpIndex(Node x, Node y) { +//bool NodeCmp(Node x, Node y) { // return x.i < y.i; //} // @@ -74,7 +74,7 @@ // for (int i = m; i >= p1; i--) { // add(arr[i].v, -arr[i].d); // } -// sort(arr + l, arr + r + 1, CmpIndex); +// sort(arr + l, arr + r + 1, NodeCmp); //} // //void cdq(int l, int r) { From a96f357a9268fbc254fe65668d3e82060622664e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 May 2025 11:27:45 +0800 Subject: [PATCH 0201/1170] modify code --- src/class170/Code06_AngelDoll1.java | 15 ++++++++------- src/class170/Code06_AngelDoll2.java | 13 +++++++++---- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/class170/Code06_AngelDoll1.java b/src/class170/Code06_AngelDoll1.java index 1e296d1c2..796009a7b 100644 --- a/src/class170/Code06_AngelDoll1.java +++ b/src/class170/Code06_AngelDoll1.java @@ -19,13 +19,12 @@ public class Code06_AngelDoll1 { // op == 1代表添加事件,x、y、空缺 // op == 1代表查询事件,x、y、问题q + // tim永远保持原始时序,每次执行cdq时,让arr去变动 public static int[][] tim = new int[MAXN << 1][4]; + public static int[][] arr = new int[MAXN << 1][4]; public static int cnte = 0; public static int cntq = 0; - // tim永远保持原始时序,每次执行cdq时,让arr去变动 - public static int[][] arr = new int[MAXN << 1][4]; - public static int[] tree = new int[MAXV]; public static int[] ans = new int[MAXN]; @@ -49,18 +48,17 @@ public static void update(int i, int num) { } public static int query(int i) { - int ret = 0; + int ret = -INF; while (i > 0) { ret = Math.max(ret, tree[i]); i -= lowbit(i); } - // 如果左下没有点,那么返回无效答案 - return ret != 0 ? ret : -INF; + return ret; } public static void clear(int i) { while (i <= v) { - tree[i] = 0; + tree[i] = -INF; i += lowbit(i); } } @@ -156,6 +154,9 @@ public static void main(String[] args) throws IOException { } // 变换象限时,防止 v - (x或y) 出现0,所以v再自增一下 v++; + for (int i = 1; i <= v; i++) { + tree[i] = -INF; + } for (int i = 1; i <= cntq; i++) { ans[i] = INF; } diff --git a/src/class170/Code06_AngelDoll2.java b/src/class170/Code06_AngelDoll2.java index 7eaf21012..9f7ac4f6b 100644 --- a/src/class170/Code06_AngelDoll2.java +++ b/src/class170/Code06_AngelDoll2.java @@ -23,10 +23,12 @@ //int n, m, v; // //Node tim[MAXN << 1]; +//Node arr[MAXN << 1]; //int cnte = 0; //int cntq = 0; -//Node arr[MAXN << 1]; +// //int tree[MAXV]; +// //int ans[MAXN]; // //int lowbit(int i) { @@ -41,17 +43,17 @@ //} // //int query(int i) { -// int ret = 0; +// int ret = -INF; // while (i > 0) { // ret = max(ret, tree[i]); // i -= lowbit(i); // } -// return ret ? ret : -INF; +// return ret; //} // //void clear(int i) { // while (i <= v) { -// tree[i] = 0; +// tree[i] = -INF; // i += lowbit(i); // } //} @@ -137,6 +139,9 @@ // v = max(v, max(x, y)); // } // v++; +// for (int i = 1; i <= v; i++) { +// tree[i] = -INF; +// } // for (int i = 1; i <= cntq; i++) { // ans[i] = INF; // } From 9ed8b6ca1d5409afd72b7111ade98a648951020d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 May 2025 11:40:11 +0800 Subject: [PATCH 0202/1170] modify code --- src/class170/Code06_AngelDoll1.java | 79 +++++++++++++++-------------- src/class170/Code06_AngelDoll2.java | 68 +++++++++++++------------ 2 files changed, 78 insertions(+), 69 deletions(-) diff --git a/src/class170/Code06_AngelDoll1.java b/src/class170/Code06_AngelDoll1.java index 796009a7b..e8735a569 100644 --- a/src/class170/Code06_AngelDoll1.java +++ b/src/class170/Code06_AngelDoll1.java @@ -63,38 +63,6 @@ public static void clear(int i) { } } - // 所有点变到第一象限 - public static void to1() { - for (int i = 1; i <= cnte; i++) { - clone(arr[i], tim[i]); - } - } - - // 所有点变到第二象限 - public static void to2() { - for (int i = 1; i <= cnte; i++) { - clone(arr[i], tim[i]); - arr[i][1] = v - arr[i][1]; - } - } - - // 所有点变到第三象限 - public static void to3() { - for (int i = 1; i <= cnte; i++) { - clone(arr[i], tim[i]); - arr[i][1] = v - arr[i][1]; - arr[i][2] = v - arr[i][2]; - } - } - - // 所有点变到第四象限 - public static void to4() { - for (int i = 1; i <= cnte; i++) { - clone(arr[i], tim[i]); - arr[i][2] = v - arr[i][2]; - } - } - public static void merge(int l, int m, int r) { int p1, p2; for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { @@ -126,12 +94,50 @@ public static void cdq(int l, int r) { merge(l, mid, r); } + // 点变换到第一象限进行cdq分治 + public static void to1() { + for (int i = 1; i <= cnte; i++) { + clone(arr[i], tim[i]); + } + cdq(1, cnte); + } + + // 点变换到第二象限进行cdq分治 + public static void to2() { + for (int i = 1; i <= cnte; i++) { + clone(arr[i], tim[i]); + arr[i][1] = v - arr[i][1]; + } + cdq(1, cnte); + } + + // 点变换到第三象限进行cdq分治 + public static void to3() { + for (int i = 1; i <= cnte; i++) { + clone(arr[i], tim[i]); + arr[i][1] = v - arr[i][1]; + arr[i][2] = v - arr[i][2]; + } + cdq(1, cnte); + } + + // 点变换到第四象限进行cdq分治 + public static void to4() { + for (int i = 1; i <= cnte; i++) { + clone(arr[i], tim[i]); + arr[i][2] = v - arr[i][2]; + } + cdq(1, cnte); + } + public static void main(String[] args) throws IOException { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); m = in.nextInt(); // 树状数组下标从1开始,所以x和y都要自增一下 + // x或y的最大值用v记录,变换象限时,防止 v - (x或y) 出现0 + // 所以最后v再自增一下 for (int i = 1, x, y; i <= n; i++) { x = in.nextInt(); y = in.nextInt(); @@ -152,7 +158,6 @@ public static void main(String[] args) throws IOException { } v = Math.max(v, Math.max(x, y)); } - // 变换象限时,防止 v - (x或y) 出现0,所以v再自增一下 v++; for (int i = 1; i <= v; i++) { tree[i] = -INF; @@ -160,10 +165,10 @@ public static void main(String[] args) throws IOException { for (int i = 1; i <= cntq; i++) { ans[i] = INF; } - to1(); cdq(1, cnte); - to2(); cdq(1, cnte); - to3(); cdq(1, cnte); - to4(); cdq(1, cnte); + to1(); + to2(); + to3(); + to4(); for (int i = 1; i <= cntq; i++) { out.println(ans[i]); } diff --git a/src/class170/Code06_AngelDoll2.java b/src/class170/Code06_AngelDoll2.java index 9f7ac4f6b..7b183edac 100644 --- a/src/class170/Code06_AngelDoll2.java +++ b/src/class170/Code06_AngelDoll2.java @@ -58,34 +58,6 @@ // } //} // -//void to1() { -// for (int i = 1; i <= cnte; i++) { -// arr[i] = tim[i]; -// } -//} -// -//void to2() { -// for (int i = 1; i <= cnte; i++) { -// arr[i] = tim[i]; -// arr[i].x = v - arr[i].x; -// } -//} -// -//void to3() { -// for (int i = 1; i <= cnte; i++) { -// arr[i] = tim[i]; -// arr[i].x = v - arr[i].x; -// arr[i].y = v - arr[i].y; -// } -//} -// -//void to4() { -// for (int i = 1; i <= cnte; i++) { -// arr[i] = tim[i]; -// arr[i].y = v - arr[i].y; -// } -//} -// //void merge(int l, int m, int r) { // int p1, p2; // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { @@ -117,6 +89,38 @@ // merge(l, mid, r); //} // +//void to1() { +// for (int i = 1; i <= cnte; i++) { +// arr[i] = tim[i]; +// } +// cdq(1, cnte); +//} +// +//void to2() { +// for (int i = 1; i <= cnte; i++) { +// arr[i] = tim[i]; +// arr[i].x = v - arr[i].x; +// } +// cdq(1, cnte); +//} +// +//void to3() { +// for (int i = 1; i <= cnte; i++) { +// arr[i] = tim[i]; +// arr[i].x = v - arr[i].x; +// arr[i].y = v - arr[i].y; +// } +// cdq(1, cnte); +//} +// +//void to4() { +// for (int i = 1; i <= cnte; i++) { +// arr[i] = tim[i]; +// arr[i].y = v - arr[i].y; +// } +// cdq(1, cnte); +//} +// //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); @@ -145,10 +149,10 @@ // for (int i = 1; i <= cntq; i++) { // ans[i] = INF; // } -// to1(); cdq(1, cnte); -// to2(); cdq(1, cnte); -// to3(); cdq(1, cnte); -// to4(); cdq(1, cnte); +// to1(); +// to2(); +// to3(); +// to4(); // for (int i = 1; i <= cntq; i++) { // cout << ans[i] << '\n'; // } From a3e4d5e69cdff0800d56f855026a1064017e4f00 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 May 2025 19:55:00 +0800 Subject: [PATCH 0203/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 14 +++++++------- src/class170/Code01_3DPartialOrder2.java | 6 ++++++ src/class170/Code02_DynamicInversion1.java | 6 ++++++ src/class170/Code02_DynamicInversion2.java | 6 ++++++ src/class170/Code03_GardenerTrouble1.java | 5 +++++ src/class170/Code03_GardenerTrouble2.java | 5 +++++ src/class170/Code04_TaskOfC1.java | 5 +++++ src/class170/Code04_TaskOfC2.java | 5 +++++ src/class170/Code05_Mokia1.java | 7 +++++++ src/class170/Code05_Mokia2.java | 7 +++++++ src/class170/Code06_AngelDoll1.java | 6 ++++++ src/class170/Code06_AngelDoll2.java | 6 ++++++ 12 files changed, 71 insertions(+), 7 deletions(-) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index 3b4456306..08817696a 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -1,6 +1,12 @@ package class170; // 三维偏序,java版 +// 一共有n个对象,属性值范围[1, k],每个对象有a属性、b属性、c属性 +// f(i)表示,aj <= ai 且 bj <= bi 且 cj <= ci 且 j != i 的j的数量 +// ans(d)表示,f(i) == d 的i的数量 +// 打印所有的ans[d],d的范围[0, n) +// 1 <= n <= 10^5 +// 1 <= k <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3810 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -21,10 +27,8 @@ public class Code01_3DPartialOrder1 { // 树状数组 public static int[] tree = new int[MAXN]; - // 每个位置统计f(i) public static int[] f = new int[MAXN]; - // 答案 public static int[] ans = new int[MAXN]; public static int lowbit(int i) { @@ -61,11 +65,7 @@ public static void merge(int l, int m, int r) { for (int i = l; i <= p1; i++) { add(arr[i][3], -1); } - // 上面的过程有树状数组的操作,时间复杂度,O(n * log n) - // 复杂度表达式为 t(n) = 2 * t(n / 2) + O(n * log n) - // 上面表达式的复杂度为 O(n * log n * log n) - // 既然复杂度已经如此,接下来根据b属性来归并,做到O(n)的归并过程就不重要了 - // 不如直接根据b属性排序,更容易写,还省了辅助数组的空间 + // 直接排序,课上重点解释了这么做的理由 Arrays.sort(arr, l, r + 1, (a, b) -> a[2] - b[2]); } diff --git a/src/class170/Code01_3DPartialOrder2.java b/src/class170/Code01_3DPartialOrder2.java index 99a29a35f..f392dc1fc 100644 --- a/src/class170/Code01_3DPartialOrder2.java +++ b/src/class170/Code01_3DPartialOrder2.java @@ -1,6 +1,12 @@ package class170; // 三维偏序,C++版 +// 一共有n个对象,属性值范围[1, k],每个对象有a属性、b属性、c属性 +// f(i)表示,aj <= ai 且 bj <= bi 且 cj <= ci 且 j != i 的j的数量 +// ans(d)表示,f(i) == d 的i的数量 +// 打印所有的ans[d],d的范围[0, n) +// 1 <= n <= 10^5 +// 1 <= k <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3810 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class170/Code02_DynamicInversion1.java b/src/class170/Code02_DynamicInversion1.java index 995cb1a48..82156ac90 100644 --- a/src/class170/Code02_DynamicInversion1.java +++ b/src/class170/Code02_DynamicInversion1.java @@ -1,6 +1,12 @@ package class170; // 动态逆序对,java版 +// 给定一个长度为n的排列,1~n所有数字都出现一次 +// 如果,前面的数 > 后面的数,那么这两个数就组成一个逆序对 +// 给定一个长度为m的数组,表示依次删除的数字 +// 打印每次删除数字前,排列中一共有多少逆序对,一共m条打印 +// 1 <= n <= 10^5 +// 1 <= m <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P3157 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class170/Code02_DynamicInversion2.java b/src/class170/Code02_DynamicInversion2.java index d0d5bcaba..79fec7567 100644 --- a/src/class170/Code02_DynamicInversion2.java +++ b/src/class170/Code02_DynamicInversion2.java @@ -1,6 +1,12 @@ package class170; // 动态逆序对,C++版 +// 给定一个长度为n的排列,1~n所有数字都出现一次 +// 如果,前面的数 > 后面的数,那么这两个数就组成一个逆序对 +// 给定一个长度为m的数组,表示依次删除的数字 +// 打印每次删除数字前,排列中一共有多少逆序对,一共m条打印 +// 1 <= n <= 10^5 +// 1 <= m <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P3157 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class170/Code03_GardenerTrouble1.java b/src/class170/Code03_GardenerTrouble1.java index 0cc0c7f18..d29084219 100644 --- a/src/class170/Code03_GardenerTrouble1.java +++ b/src/class170/Code03_GardenerTrouble1.java @@ -1,6 +1,11 @@ package class170; // 园丁的烦恼,java版 +// 有n棵树,每棵树给定位置坐标(x, y),接下来有m条查询,格式如下 +// 查询 a b c d : 打印左上角(a, b)、右下角(c, d)的区域里有几棵树 +// 0 <= n <= 5 * 10^5 +// 1 <= m <= 5 * 10^5 +// 0 <= 坐标值 <= 10^7 // 测试链接 : https://www.luogu.com.cn/problem/P2163 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但无法通过测试用例,内存使用过大 diff --git a/src/class170/Code03_GardenerTrouble2.java b/src/class170/Code03_GardenerTrouble2.java index 1fb008b9d..7a80680b1 100644 --- a/src/class170/Code03_GardenerTrouble2.java +++ b/src/class170/Code03_GardenerTrouble2.java @@ -1,6 +1,11 @@ package class170; // 园丁的烦恼,C++版 +// 有n棵树,每棵树给定位置坐标(x, y),接下来有m条查询,格式如下 +// 查询 a b c d : 打印左上角(a, b)、右下角(c, d)的区域里有几棵树 +// 0 <= n <= 5 * 10^5 +// 1 <= m <= 5 * 10^5 +// 0 <= 坐标值 <= 10^7 // 测试链接 : https://www.luogu.com.cn/problem/P2163 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class170/Code04_TaskOfC1.java b/src/class170/Code04_TaskOfC1.java index 4eda9cb8a..12fdbff4f 100644 --- a/src/class170/Code04_TaskOfC1.java +++ b/src/class170/Code04_TaskOfC1.java @@ -1,6 +1,11 @@ package class170; // 老C的任务,java版 +// 有n个基站,每个基站给定x、y、v,表示基站在(x, y)位置,功率为v +// 接下来有m条查询,每条查询格式如下 +// 查询 a b c d : 打印左上角(a, b)、右下角(c, d)的区域里基站的功率和 +// 1 <= n、m <= 10^5 +// 其余数值都在int类型的范围 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class170/Code04_TaskOfC2.java b/src/class170/Code04_TaskOfC2.java index cbcc3d37b..6b00b2949 100644 --- a/src/class170/Code04_TaskOfC2.java +++ b/src/class170/Code04_TaskOfC2.java @@ -1,6 +1,11 @@ package class170; // 老C的任务,C++版 +// 有n个基站,每个基站给定x、y、v,表示基站在(x, y)位置,功率为v +// 接下来有m条查询,每条查询格式如下 +// 查询 a b c d : 打印左上角(a, b)、右下角(c, d)的区域里基站的功率和 +// 1 <= n、m <= 10^5 +// 其余数值都在int类型的范围 // 测试链接 : https://www.luogu.com.cn/problem/P3755 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class170/Code05_Mokia1.java b/src/class170/Code05_Mokia1.java index d72f8ea61..36cfd8c20 100644 --- a/src/class170/Code05_Mokia1.java +++ b/src/class170/Code05_Mokia1.java @@ -1,6 +1,13 @@ package class170; // 摩基亚,java版 +// 给定数字w,表示一个w * w的正方形区域,所有位置都在其中 +// 接下来有m条操作,每种操作是如下两种类型中的一种 +// 操作 1 x y v : 坐标(x, y)位置增加了v个人 +// 操作 2 a b c d : 打印左上角(a, b)、右下角(c, d)区域里的人数 +// 1 <= w <= 2 * 10^6 +// 1 <= m <= 2 * 10^5 +// 0 <= v <= 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P4390 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class170/Code05_Mokia2.java b/src/class170/Code05_Mokia2.java index f7c97f09e..800255c5d 100644 --- a/src/class170/Code05_Mokia2.java +++ b/src/class170/Code05_Mokia2.java @@ -1,6 +1,13 @@ package class170; // 摩基亚,C++版 +// 给定数字w,表示一个w * w的正方形区域,所有位置都在其中 +// 接下来有m条操作,每种操作是如下两种类型中的一种 +// 操作 1 x y v : 坐标(x, y)位置增加了v个人 +// 操作 2 a b c d : 打印左上角(a, b)、右下角(c, d)区域里的人数 +// 1 <= w <= 2 * 10^6 +// 1 <= m <= 2 * 10^5 +// 0 <= v <= 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P4390 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class170/Code06_AngelDoll1.java b/src/class170/Code06_AngelDoll1.java index e8735a569..137ee2139 100644 --- a/src/class170/Code06_AngelDoll1.java +++ b/src/class170/Code06_AngelDoll1.java @@ -1,6 +1,12 @@ package class170; // 天使玩偶,java版 +// 规定(x1, y1)和(x2, y2)之间的距离 = | x1 - x2 | + | y1 - y2 | +// 一开始先给定n个点的位置,接下来有m条操作,每种操作是如下两种类型中的一种 +// 操作 1 x y : 在(x, y)位置添加一个点 +// 操作 2 x y : 打印已经添加的所有点中,到(x, y)位置最短距离的点是多远 +// 1 <= n、m <= 3 * 10^5 +// 0 <= x、y <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P4169 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class170/Code06_AngelDoll2.java b/src/class170/Code06_AngelDoll2.java index 7b183edac..05bcce6ec 100644 --- a/src/class170/Code06_AngelDoll2.java +++ b/src/class170/Code06_AngelDoll2.java @@ -1,6 +1,12 @@ package class170; // 天使玩偶,C++版 +// 规定(x1, y1)和(x2, y2)之间的距离 = | x1 - x2 | + | y1 - y2 | +// 一开始先给定n个点的位置,接下来有m条操作,每种操作是如下两种类型中的一种 +// 操作 1 x y : 在(x, y)位置添加一个点 +// 操作 2 x y : 打印已经添加的所有点中,到(x, y)位置最短距离的点是多远 +// 1 <= n、m <= 3 * 10^5 +// 0 <= x、y <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P4169 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 3f6d6d539e2959abe332997b6998b0856272f46a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 14:47:13 +0800 Subject: [PATCH 0204/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index 08817696a..6d2c041d9 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -65,7 +65,7 @@ public static void merge(int l, int m, int r) { for (int i = l; i <= p1; i++) { add(arr[i][3], -1); } - // 直接排序,课上重点解释了这么做的理由 + // 直接排序,课上重点解释了原因 Arrays.sort(arr, l, r + 1, (a, b) -> a[2] - b[2]); } @@ -82,7 +82,7 @@ public static void cdq(int l, int r) { public static void prepare() { // 根据a排序,a一样根据b排序,b一样根据c排序 // 排序后a、b、c一样的同组内,组前的下标得不到同组后面的统计量 - // 所以先设置f的初始值,把这部分提前补偿给组前的下标,然后跑CDQ分治 + // 所以把这部分的贡献,提前补偿给组前的下标,然后再跑CDQ分治 Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[3] - b[3]); for (int l = 1, r = 1; l <= n; l = ++r) { while (r + 1 <= n && arr[l][1] == arr[r + 1][1] && arr[l][2] == arr[r + 1][2] From 20833ab745751f8740483db4ff4804c276ddf4e5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 17:37:36 +0800 Subject: [PATCH 0205/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 16 ++++++++++------ src/class170/Code01_3DPartialOrder2.java | 6 ++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index 6d2c041d9..670bd31f2 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -18,17 +18,20 @@ public class Code01_3DPartialOrder1 { - public static int MAXN = 200001; + public static int MAXN = 100001; + public static int MAXK = 200001; public static int n, k; - // 位置i、属性a、属性b、属性c + // 对象的编号i、属性a、属性b、属性c public static int[][] arr = new int[MAXN][4]; - // 树状数组 - public static int[] tree = new int[MAXN]; + // 树状数组,根据属性c的值增加词频,查询 <= 某个数的词频累加和 + public static int[] tree = new int[MAXK]; + // 每个对象的答案 public static int[] f = new int[MAXN]; + // 题目要求的ans[d] public static int[] ans = new int[MAXN]; public static int lowbit(int i) { @@ -52,7 +55,8 @@ public static int query(int i) { } public static void merge(int l, int m, int r) { - // 利用左右各自有序,进行不回退的统计 + // 利用左、右各自b属性有序 + // 不回退的找,当前右组对象包括了几个左组的对象 int p1, p2; for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && arr[p1 + 1][2] <= arr[p2][2]) { @@ -65,7 +69,7 @@ public static void merge(int l, int m, int r) { for (int i = l; i <= p1; i++) { add(arr[i][3], -1); } - // 直接排序,课上重点解释了原因 + // 直接根据b属性排序,无需写经典的归并过程,课上重点解释了原因 Arrays.sort(arr, l, r + 1, (a, b) -> a[2] - b[2]); } diff --git a/src/class170/Code01_3DPartialOrder2.java b/src/class170/Code01_3DPartialOrder2.java index f392dc1fc..9d3a07a20 100644 --- a/src/class170/Code01_3DPartialOrder2.java +++ b/src/class170/Code01_3DPartialOrder2.java @@ -33,10 +33,12 @@ // return x.b < y.b; //} // -//const int MAXN = 200001; +//const int MAXN = 100001; +//const int MAXK = 200001; //int n, k; +// //Node arr[MAXN]; -//int tree[MAXN]; +//int tree[MAXK]; //int f[MAXN]; //int ans[MAXN]; // From ef19f092e988c312bb13a40a656c98884187097c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 17:39:49 +0800 Subject: [PATCH 0206/1170] modify code --- src/class170/Code02_DynamicInversion1.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/class170/Code02_DynamicInversion1.java b/src/class170/Code02_DynamicInversion1.java index 82156ac90..aa244094f 100644 --- a/src/class170/Code02_DynamicInversion1.java +++ b/src/class170/Code02_DynamicInversion1.java @@ -26,7 +26,7 @@ public class Code02_DynamicInversion1 { public static int[] pos = new int[MAXN]; public static int[] del = new int[MAXM]; - // 位置i、数值v、效果d、问题q + // 位置i、数值v、效果d、问题编号q public static int[][] arr = new int[MAXN + MAXM][4]; public static int cnt = 0; @@ -56,6 +56,7 @@ public static int query(int i) { public static void merge(int l, int m, int r) { int p1, p2; + // 从左到右获得贡献 for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && arr[p1 + 1][0] <= arr[p2][0]) { p1++; @@ -63,9 +64,11 @@ public static void merge(int l, int m, int r) { } ans[arr[p2][3]] += arr[p2][2] * (query(n) - query(arr[p2][1])); } + // 清除树状数组 for (int i = l; i <= p1; i++) { add(arr[i][1], -arr[i][2]); } + // 从右到左获得贡献 for (p1 = m + 1, p2 = r; p2 > m; p2--) { while (p1 - 1 >= l && arr[p1 - 1][0] >= arr[p2][0]) { p1--; @@ -73,9 +76,11 @@ public static void merge(int l, int m, int r) { } ans[arr[p2][3]] += arr[p2][2] * query(arr[p2][1] - 1); } + // 清除树状数组 for (int i = m; i >= p1; i--) { add(arr[i][1], -arr[i][2]); } + // 直接排序 Arrays.sort(arr, l, r + 1, (a, b) -> a[0] - b[0]); } From d25b5a77d67f446fc0ddfb3d80f1e3228d7ef14e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 17:41:57 +0800 Subject: [PATCH 0207/1170] modify code --- src/class170/Code01_3DPartialOrder1.java | 1 + src/class170/Code02_DynamicInversion1.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class170/Code01_3DPartialOrder1.java b/src/class170/Code01_3DPartialOrder1.java index 670bd31f2..e8814ab18 100644 --- a/src/class170/Code01_3DPartialOrder1.java +++ b/src/class170/Code01_3DPartialOrder1.java @@ -73,6 +73,7 @@ public static void merge(int l, int m, int r) { Arrays.sort(arr, l, r + 1, (a, b) -> a[2] - b[2]); } + // 大顺序已经按a属性排序,cdq分治里按b属性重新排序 public static void cdq(int l, int r) { if (l == r) { return; diff --git a/src/class170/Code02_DynamicInversion1.java b/src/class170/Code02_DynamicInversion1.java index aa244094f..116d6ba2f 100644 --- a/src/class170/Code02_DynamicInversion1.java +++ b/src/class170/Code02_DynamicInversion1.java @@ -84,6 +84,7 @@ public static void merge(int l, int m, int r) { Arrays.sort(arr, l, r + 1, (a, b) -> a[0] - b[0]); } + // 整体按时序组织,cdq分治里根据下标重新排序 public static void cdq(int l, int r) { if (l == r) { return; From c23628853af5ff661e4770c94b5cdb6846ed51ee Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 18:31:15 +0800 Subject: [PATCH 0208/1170] modify code --- src/class170/Code02_DynamicInversion1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class170/Code02_DynamicInversion1.java b/src/class170/Code02_DynamicInversion1.java index 116d6ba2f..d1d509b41 100644 --- a/src/class170/Code02_DynamicInversion1.java +++ b/src/class170/Code02_DynamicInversion1.java @@ -30,8 +30,10 @@ public class Code02_DynamicInversion1 { public static int[][] arr = new int[MAXN + MAXM][4]; public static int cnt = 0; + // 树状数组 public static int[] tree = new int[MAXN]; + // 每次逆序对的变化量 public static long[] ans = new long[MAXM]; public static int lowbit(int i) { From 79a5f8efc5154e73f3b87f3a4d278b234139b1c7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 19:22:48 +0800 Subject: [PATCH 0209/1170] modify code --- src/class170/Code02_DynamicInversion1.java | 32 +++++++++++----------- src/class170/Code02_DynamicInversion2.java | 10 +++---- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/class170/Code02_DynamicInversion1.java b/src/class170/Code02_DynamicInversion1.java index d1d509b41..7869b3f28 100644 --- a/src/class170/Code02_DynamicInversion1.java +++ b/src/class170/Code02_DynamicInversion1.java @@ -26,7 +26,7 @@ public class Code02_DynamicInversion1 { public static int[] pos = new int[MAXN]; public static int[] del = new int[MAXM]; - // 位置i、数值v、效果d、问题编号q + // 数值v、位置i、效果d、问题编号q public static int[][] arr = new int[MAXN + MAXM][4]; public static int cnt = 0; @@ -58,32 +58,32 @@ public static int query(int i) { public static void merge(int l, int m, int r) { int p1, p2; - // 从左到右获得贡献 + // 从左到右统计左侧值大的数量 for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { - while (p1 + 1 <= m && arr[p1 + 1][0] <= arr[p2][0]) { + while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][1]) { p1++; - add(arr[p1][1], arr[p1][2]); + add(arr[p1][0], arr[p1][2]); } - ans[arr[p2][3]] += arr[p2][2] * (query(n) - query(arr[p2][1])); + ans[arr[p2][3]] += arr[p2][2] * (query(n) - query(arr[p2][0])); } // 清除树状数组 for (int i = l; i <= p1; i++) { - add(arr[i][1], -arr[i][2]); + add(arr[i][0], -arr[i][2]); } - // 从右到左获得贡献 + // 从右到左统计右侧值小的数量 for (p1 = m + 1, p2 = r; p2 > m; p2--) { - while (p1 - 1 >= l && arr[p1 - 1][0] >= arr[p2][0]) { + while (p1 - 1 >= l && arr[p1 - 1][1] >= arr[p2][1]) { p1--; - add(arr[p1][1], arr[p1][2]); + add(arr[p1][0], arr[p1][2]); } - ans[arr[p2][3]] += arr[p2][2] * query(arr[p2][1] - 1); + ans[arr[p2][3]] += arr[p2][2] * query(arr[p2][0] - 1); } // 清除树状数组 for (int i = m; i >= p1; i--) { - add(arr[i][1], -arr[i][2]); + add(arr[i][0], -arr[i][2]); } // 直接排序 - Arrays.sort(arr, l, r + 1, (a, b) -> a[0] - b[0]); + Arrays.sort(arr, l, r + 1, (a, b) -> a[1] - b[1]); } // 整体按时序组织,cdq分治里根据下标重新排序 @@ -99,14 +99,14 @@ public static void cdq(int l, int r) { public static void prepare() { for (int i = 1; i <= n; i++) { - arr[++cnt][0] = i; - arr[cnt][1] = num[i]; + arr[++cnt][0] = num[i]; + arr[cnt][1] = i; arr[cnt][2] = 1; arr[cnt][3] = 0; } for (int i = 1; i <= m; i++) { - arr[++cnt][0] = pos[del[i]]; - arr[cnt][1] = del[i]; + arr[++cnt][0] = del[i]; + arr[cnt][1] = pos[del[i]]; arr[cnt][2] = -1; arr[cnt][3] = i; } diff --git a/src/class170/Code02_DynamicInversion2.java b/src/class170/Code02_DynamicInversion2.java index 79fec7567..4ab28b025 100644 --- a/src/class170/Code02_DynamicInversion2.java +++ b/src/class170/Code02_DynamicInversion2.java @@ -16,7 +16,7 @@ //using namespace std; // //struct Node { -// int i, v, d, q; +// int v, i, d, q; //}; // //bool NodeCmp(Node x, Node y) { @@ -95,14 +95,14 @@ // //void prepare() { // for (int i = 1; i <= n; i++) { -// arr[++cnt].i = i; -// arr[cnt].v = num[i]; +// arr[++cnt].v = num[i]; +// arr[cnt].i = i; // arr[cnt].d = 1; // arr[cnt].q = 0; // } // for (int i = 1; i <= m; i++) { -// arr[++cnt].i = pos[del[i]]; -// arr[cnt].v = del[i]; +// arr[++cnt].v = del[i]; +// arr[cnt].i = pos[del[i]]; // arr[cnt].d = -1; // arr[cnt].q = i; // } From 1dba19e7fb11e6f0fea96118e91599ca82523060 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 20:50:58 +0800 Subject: [PATCH 0210/1170] modify code --- src/class170/Code02_DynamicInversion1.java | 4 ++-- src/class170/Code02_DynamicInversion2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class170/Code02_DynamicInversion1.java b/src/class170/Code02_DynamicInversion1.java index 7869b3f28..20688fc00 100644 --- a/src/class170/Code02_DynamicInversion1.java +++ b/src/class170/Code02_DynamicInversion1.java @@ -60,7 +60,7 @@ public static void merge(int l, int m, int r) { int p1, p2; // 从左到右统计左侧值大的数量 for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { - while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][1]) { + while (p1 + 1 <= m && arr[p1 + 1][1] < arr[p2][1]) { p1++; add(arr[p1][0], arr[p1][2]); } @@ -72,7 +72,7 @@ public static void merge(int l, int m, int r) { } // 从右到左统计右侧值小的数量 for (p1 = m + 1, p2 = r; p2 > m; p2--) { - while (p1 - 1 >= l && arr[p1 - 1][1] >= arr[p2][1]) { + while (p1 - 1 >= l && arr[p1 - 1][1] > arr[p2][1]) { p1--; add(arr[p1][0], arr[p1][2]); } diff --git a/src/class170/Code02_DynamicInversion2.java b/src/class170/Code02_DynamicInversion2.java index 4ab28b025..0a0320fc8 100644 --- a/src/class170/Code02_DynamicInversion2.java +++ b/src/class170/Code02_DynamicInversion2.java @@ -61,7 +61,7 @@ //void merge(int l, int m, int r) { // int p1, p2; // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { -// while (p1 + 1 <= m && arr[p1 + 1].i <= arr[p2].i) { +// while (p1 + 1 <= m && arr[p1 + 1].i < arr[p2].i) { // p1++; // add(arr[p1].v, arr[p1].d); // } @@ -71,7 +71,7 @@ // add(arr[i].v, -arr[i].d); // } // for (p1 = m + 1, p2 = r; p2 > m; p2--) { -// while (p1 - 1 >= l && arr[p1 - 1].i >= arr[p2].i) { +// while (p1 - 1 >= l && arr[p1 - 1].i > arr[p2].i) { // p1--; // add(arr[p1].v, arr[p1].d); // } From b19b1e35e7404c9fc6444524bddf36e39457faf8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 21:13:53 +0800 Subject: [PATCH 0211/1170] modify code --- src/class170/Code02_DynamicInversion1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class170/Code02_DynamicInversion1.java b/src/class170/Code02_DynamicInversion1.java index 20688fc00..179315f6f 100644 --- a/src/class170/Code02_DynamicInversion1.java +++ b/src/class170/Code02_DynamicInversion1.java @@ -22,6 +22,9 @@ public class Code02_DynamicInversion1 { public static int MAXM = 50001; public static int n, m; + // num : 原始序列依次的值 + // pos : 每个值在什么位置 + // del : 每一步删掉的值 public static int[] num = new int[MAXN]; public static int[] pos = new int[MAXN]; public static int[] del = new int[MAXM]; From d6e4fa36a5c9bac0039a32bff29f8bfabd728d08 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 21:16:00 +0800 Subject: [PATCH 0212/1170] modify code --- src/class170/Code03_GardenerTrouble1.java | 2 +- src/class170/Code04_TaskOfC1.java | 2 +- src/class170/Code05_Mokia1.java | 2 +- src/class170/Code06_AngelDoll1.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class170/Code03_GardenerTrouble1.java b/src/class170/Code03_GardenerTrouble1.java index d29084219..0d8982206 100644 --- a/src/class170/Code03_GardenerTrouble1.java +++ b/src/class170/Code03_GardenerTrouble1.java @@ -25,7 +25,7 @@ public class Code03_GardenerTrouble1 { public static int n, m; // op == 1代表树木,x、y - // op == 2代表查询,x、y、效果v、问题q + // op == 2代表查询,x、y、效果v、查询编号q public static int[][] arr = new int[MAXN][5]; public static int cnt = 0; diff --git a/src/class170/Code04_TaskOfC1.java b/src/class170/Code04_TaskOfC1.java index 12fdbff4f..909e69967 100644 --- a/src/class170/Code04_TaskOfC1.java +++ b/src/class170/Code04_TaskOfC1.java @@ -21,7 +21,7 @@ public class Code04_TaskOfC1 { public static int n, m; // op == 1代表基站,x、y、功率v - // op == 2代表查询,x、y、效果v、问题q + // op == 2代表查询,x、y、效果v、查询编号q public static int[][] arr = new int[MAXN][5]; public static int cnt = 0; diff --git a/src/class170/Code05_Mokia1.java b/src/class170/Code05_Mokia1.java index 36cfd8c20..eb676313c 100644 --- a/src/class170/Code05_Mokia1.java +++ b/src/class170/Code05_Mokia1.java @@ -24,7 +24,7 @@ public class Code05_Mokia1 { public static int w; // op == 1表示增加事件,x、y、人数v - // op == 1表示查询事件,x、y、效果v、问题q + // op == 1表示查询事件,x、y、效果v、查询编号q public static int[][] arr = new int[MAXN][5]; public static int cnte = 0; public static int cntq = 0; diff --git a/src/class170/Code06_AngelDoll1.java b/src/class170/Code06_AngelDoll1.java index 137ee2139..f88efe12a 100644 --- a/src/class170/Code06_AngelDoll1.java +++ b/src/class170/Code06_AngelDoll1.java @@ -24,7 +24,7 @@ public class Code06_AngelDoll1 { public static int n, m, v; // op == 1代表添加事件,x、y、空缺 - // op == 1代表查询事件,x、y、问题q + // op == 1代表查询事件,x、y、查询编号q // tim永远保持原始时序,每次执行cdq时,让arr去变动 public static int[][] tim = new int[MAXN << 1][4]; public static int[][] arr = new int[MAXN << 1][4]; From 645937ea4b6f41d53683d8f9b5878bf3f8a5d0b9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 21:22:55 +0800 Subject: [PATCH 0213/1170] modify code --- src/class170/Code03_GardenerTrouble1.java | 5 ++++- src/class170/Code03_GardenerTrouble2.java | 3 --- src/class170/Code04_TaskOfC1.java | 2 +- src/class170/Code04_TaskOfC2.java | 3 --- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/class170/Code03_GardenerTrouble1.java b/src/class170/Code03_GardenerTrouble1.java index 0d8982206..e448738e4 100644 --- a/src/class170/Code03_GardenerTrouble1.java +++ b/src/class170/Code03_GardenerTrouble1.java @@ -70,6 +70,9 @@ public static void merge(int l, int m, int r) { ans[arr[p2][4]] += tree * arr[p2][3]; } } + // 下面是经典归并的过程,为啥不排序了? + // 因为没有用到高级数据结构,复杂度可以做到O(n * log n) + // 那么就维持最好的复杂度,不用排序 p1 = l; p2 = m + 1; int i = l; @@ -117,7 +120,7 @@ public static void main(String[] args) throws IOException { addQuery(a - 1, d, -1, i); addQuery(c, b - 1, -1, i); } - Arrays.sort(arr, 1, cnt + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[0] - b[0]); + Arrays.sort(arr, 1, cnt + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[0] - b[0]); cdq(1, cnt); for (int i = 1; i <= m; i++) { out.println(ans[i]); diff --git a/src/class170/Code03_GardenerTrouble2.java b/src/class170/Code03_GardenerTrouble2.java index 7a80680b1..bdaf8ae38 100644 --- a/src/class170/Code03_GardenerTrouble2.java +++ b/src/class170/Code03_GardenerTrouble2.java @@ -22,9 +22,6 @@ // if (a.x != b.x) { // return a.x < b.x; // } -// if (a.y != b.y) { -// return a.y < b.y; -// } // return a.op < b.op; //} // diff --git a/src/class170/Code04_TaskOfC1.java b/src/class170/Code04_TaskOfC1.java index 909e69967..704cc2276 100644 --- a/src/class170/Code04_TaskOfC1.java +++ b/src/class170/Code04_TaskOfC1.java @@ -116,7 +116,7 @@ public static void main(String[] args) throws IOException { addQuery(a - 1, d, -1, i); addQuery(c, b - 1, -1, i); } - Arrays.sort(arr, 1, cnt + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] != b[2] ? a[2] - b[2] : a[0] - b[0]); + Arrays.sort(arr, 1, cnt + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[0] - b[0]); cdq(1, cnt); for (int i = 1; i <= m; i++) { out.println(ans[i]); diff --git a/src/class170/Code04_TaskOfC2.java b/src/class170/Code04_TaskOfC2.java index 6b00b2949..7830d8452 100644 --- a/src/class170/Code04_TaskOfC2.java +++ b/src/class170/Code04_TaskOfC2.java @@ -22,9 +22,6 @@ // if (a.x != b.x) { // return a.x < b.x; // } -// if (a.y != b.y) { -// return a.y < b.y; -// } // return a.op < b.op; //} // From e0307f88ceae3c203e8ab8f2e30ad347d7d0a3cf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 31 May 2025 21:24:06 +0800 Subject: [PATCH 0214/1170] modify code --- src/class170/Code03_GardenerTrouble1.java | 2 +- src/class170/Code04_TaskOfC1.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/class170/Code03_GardenerTrouble1.java b/src/class170/Code03_GardenerTrouble1.java index e448738e4..88450d940 100644 --- a/src/class170/Code03_GardenerTrouble1.java +++ b/src/class170/Code03_GardenerTrouble1.java @@ -70,7 +70,7 @@ public static void merge(int l, int m, int r) { ans[arr[p2][4]] += tree * arr[p2][3]; } } - // 下面是经典归并的过程,为啥不排序了? + // 下面是经典归并的过程,为啥不直接排序了? // 因为没有用到高级数据结构,复杂度可以做到O(n * log n) // 那么就维持最好的复杂度,不用排序 p1 = l; diff --git a/src/class170/Code04_TaskOfC1.java b/src/class170/Code04_TaskOfC1.java index 704cc2276..acb8db1f7 100644 --- a/src/class170/Code04_TaskOfC1.java +++ b/src/class170/Code04_TaskOfC1.java @@ -68,6 +68,9 @@ public static void merge(int l, int m, int r) { ans[arr[p2][4]] += sum * arr[p2][3]; } } + // 下面是经典归并的过程,为啥不直接排序了? + // 因为没有用到高级数据结构,复杂度可以做到O(n * log n) + // 那么就维持最好的复杂度,不用排序 p1 = l; p2 = m + 1; int i = l; From fa6e3488d2811caeae825347c122bd84292fb0c7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 1 Jun 2025 13:41:48 +0800 Subject: [PATCH 0215/1170] modify code --- src/class170/Code05_Mokia1.java | 1 + src/class170/Code06_AngelDoll1.java | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/class170/Code05_Mokia1.java b/src/class170/Code05_Mokia1.java index eb676313c..43696b7e4 100644 --- a/src/class170/Code05_Mokia1.java +++ b/src/class170/Code05_Mokia1.java @@ -29,6 +29,7 @@ public class Code05_Mokia1 { public static int cnte = 0; public static int cntq = 0; + // 树状数组 public static int[] tree = new int[MAXV]; public static int[] ans = new int[MAXN]; diff --git a/src/class170/Code06_AngelDoll1.java b/src/class170/Code06_AngelDoll1.java index f88efe12a..efc9a0ee3 100644 --- a/src/class170/Code06_AngelDoll1.java +++ b/src/class170/Code06_AngelDoll1.java @@ -31,6 +31,7 @@ public class Code06_AngelDoll1 { public static int cnte = 0; public static int cntq = 0; + // 树状数组,下标是y的值,维护前缀范围上的最大值 public static int[] tree = new int[MAXV]; public static int[] ans = new int[MAXN]; @@ -46,6 +47,7 @@ public static int lowbit(int i) { return i & -i; } + // i位置的值设置成num,类似累加和操作,这里变成取最大值操作即可 public static void update(int i, int num) { while (i <= v) { tree[i] = Math.max(tree[i], num); @@ -53,6 +55,7 @@ public static void update(int i, int num) { } } + // 查询1~i范围上的最大值 public static int query(int i) { int ret = -INF; while (i > 0) { @@ -62,6 +65,8 @@ public static int query(int i) { return ret; } + // 因为本题的特殊性,树状数组一定需要全部清空的 + // 所以当初更新时,i位置碰过哪些位置,一律设置无效值即可 public static void clear(int i) { while (i <= v) { tree[i] = -INF; @@ -165,9 +170,11 @@ public static void main(String[] args) throws IOException { v = Math.max(v, Math.max(x, y)); } v++; + // 初始化树状数组 for (int i = 1; i <= v; i++) { tree[i] = -INF; } + // 初始化答案数组 for (int i = 1; i <= cntq; i++) { ans[i] = INF; } From 654d0c6c661a59d33cb55535d35a495a04fb907d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 1 Jun 2025 13:46:09 +0800 Subject: [PATCH 0216/1170] modify code --- src/class170/Code06_AngelDoll1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class170/Code06_AngelDoll1.java b/src/class170/Code06_AngelDoll1.java index efc9a0ee3..1ac84cbe1 100644 --- a/src/class170/Code06_AngelDoll1.java +++ b/src/class170/Code06_AngelDoll1.java @@ -25,7 +25,7 @@ public class Code06_AngelDoll1 { // op == 1代表添加事件,x、y、空缺 // op == 1代表查询事件,x、y、查询编号q - // tim永远保持原始时序,每次执行cdq时,让arr去变动 + // tim永远保持原始时序,每次变换象限都拷贝给arr,然后执行cdq分治 public static int[][] tim = new int[MAXN << 1][4]; public static int[][] arr = new int[MAXN << 1][4]; public static int cnte = 0; @@ -65,7 +65,7 @@ public static int query(int i) { return ret; } - // 因为本题的特殊性,树状数组一定需要全部清空的 + // 因为本题的特殊性,树状数组一定全部清空 // 所以当初更新时,i位置碰过哪些位置,一律设置无效值即可 public static void clear(int i) { while (i <= v) { From 99f9a375351909b6dfadb5838a4882f1a177f13b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 1 Jun 2025 14:32:58 +0800 Subject: [PATCH 0217/1170] modify code --- src/class170/Code05_Mokia1.java | 6 +++--- src/class170/Code05_Mokia2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class170/Code05_Mokia1.java b/src/class170/Code05_Mokia1.java index 43696b7e4..f27f33352 100644 --- a/src/class170/Code05_Mokia1.java +++ b/src/class170/Code05_Mokia1.java @@ -19,20 +19,20 @@ public class Code05_Mokia1 { - public static int MAXN = 200001; + public static int MAXM = 200001; public static int MAXV = 2000002; public static int w; // op == 1表示增加事件,x、y、人数v // op == 1表示查询事件,x、y、效果v、查询编号q - public static int[][] arr = new int[MAXN][5]; + public static int[][] arr = new int[MAXM][5]; public static int cnte = 0; public static int cntq = 0; // 树状数组 public static int[] tree = new int[MAXV]; - public static int[] ans = new int[MAXN]; + public static int[] ans = new int[MAXM]; public static int lowbit(int i) { return i & -i; diff --git a/src/class170/Code05_Mokia2.java b/src/class170/Code05_Mokia2.java index 800255c5d..2070eed08 100644 --- a/src/class170/Code05_Mokia2.java +++ b/src/class170/Code05_Mokia2.java @@ -24,18 +24,18 @@ // return a.x < b.x; //} // -//const int MAXN = 200001; +//const int MAXM = 200001; //const int MAXV = 2000002; //const int INF = 1000000001; //int w; // -//Node arr[MAXN]; +//Node arr[MAXM]; //int cnte = 0; //int cntq = 0; // //int tree[MAXV]; // -//int ans[MAXN]; +//int ans[MAXM]; // //int lowbit(int i) { // return i & -i; From 535465ddb0854c44f348e9523d275313baf81da3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 1 Jun 2025 14:54:45 +0800 Subject: [PATCH 0218/1170] modify code --- src/class170/Code05_Mokia1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class170/Code05_Mokia1.java b/src/class170/Code05_Mokia1.java index f27f33352..f4c516973 100644 --- a/src/class170/Code05_Mokia1.java +++ b/src/class170/Code05_Mokia1.java @@ -24,7 +24,7 @@ public class Code05_Mokia1 { public static int w; // op == 1表示增加事件,x、y、人数v - // op == 1表示查询事件,x、y、效果v、查询编号q + // op == 2表示查询事件,x、y、效果v、查询编号q public static int[][] arr = new int[MAXM][5]; public static int cnte = 0; public static int cntq = 0; From bd63bc119a0fbb58b3b4d24d80f291d3b57a7f5a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 1 Jun 2025 17:17:38 +0800 Subject: [PATCH 0219/1170] modify code --- ...Q\345\210\206\346\262\273-\344\270\212.pptx" | Bin 0 -> 50348 bytes src/class170/Code06_AngelDoll1.java | 10 +++++----- src/class170/Code06_AngelDoll2.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243170\343\200\220\346\214\272\351\232\276\343\200\221CDQ\345\210\206\346\262\273-\344\270\212.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243170\343\200\220\346\214\272\351\232\276\343\200\221CDQ\345\210\206\346\262\273-\344\270\212.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243170\343\200\220\346\214\272\351\232\276\343\200\221CDQ\345\210\206\346\262\273-\344\270\212.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..8355427c2ddf14bbeed18b3b5fb4cae8a14746c6 GIT binary patch literal 50348 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

6;`!=yhr28pyVPH% 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 z 0) { @@ -80,7 +80,7 @@ public static void merge(int l, int m, int r) { while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][1]) { p1++; if (arr[p1][0] == 1) { - update(arr[p1][2], arr[p1][1] + arr[p1][2]); + more(arr[p1][2], arr[p1][1] + arr[p1][2]); } } if (arr[p2][0] == 2) { diff --git a/src/class170/Code06_AngelDoll2.java b/src/class170/Code06_AngelDoll2.java index 05bcce6ec..33a106e6e 100644 --- a/src/class170/Code06_AngelDoll2.java +++ b/src/class170/Code06_AngelDoll2.java @@ -41,7 +41,7 @@ // return i & -i; //} // -//void update(int i, int num) { +//void more(int i, int num) { // while (i <= v) { // tree[i] = max(tree[i], num); // i += lowbit(i); @@ -70,7 +70,7 @@ // while (p1 + 1 <= m && arr[p1 + 1].x <= arr[p2].x) { // p1++; // if (arr[p1].op == 1) { -// update(arr[p1].y, arr[p1].x + arr[p1].y); +// more(arr[p1].y, arr[p1].x + arr[p1].y); // } // } // if (arr[p2].op == 2) { From 3265e832076a2660da648936685c1e3ca1cf470a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Jun 2025 15:17:39 +0800 Subject: [PATCH 0220/1170] modify code --- src/class171/Code01_MooFest1.java | 120 ++++++++++++++++++++++++++++++ src/class171/Code01_MooFest2.java | 75 +++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 src/class171/Code01_MooFest1.java create mode 100644 src/class171/Code01_MooFest2.java diff --git a/src/class171/Code01_MooFest1.java b/src/class171/Code01_MooFest1.java new file mode 100644 index 000000000..868c4fe27 --- /dev/null +++ b/src/class171/Code01_MooFest1.java @@ -0,0 +1,120 @@ +package class171; + +// 奶牛音量和,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2345 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_MooFest1 { + + public static int MAXN = 20001; + public static int n; + // 听力v、位置x + public static int[][] arr = new int[MAXN][2]; + // 归并排序需要 + public static int[][] tmp = new int[MAXN][2]; + + public static void clone(int[] a, int[] b) { + a[0] = b[0]; + a[1] = b[1]; + } + + public static long merge(int l, int m, int r) { + int p1, p2; + long sum1 = 0, sum2 = 0, ans = 0; + for (p1 = l; p1 <= m; p1++) { + sum1 += arr[p1][1]; + } + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][1] < arr[p2][1]) { + p1++; + sum1 -= arr[p1][1]; + sum2 += arr[p1][1]; + } + ans += (1L * (p1 - l + 1) * arr[p2][1] - sum2 + sum1 - 1L * (m - p1) * arr[p2][1]) * arr[p2][0]; + } + p1 = l; + p2 = m + 1; + int i = l; + while (p1 <= m && p2 <= r) { + clone(tmp[i++], arr[p1][1] <= arr[p2][1] ? arr[p1++] : arr[p2++]); + } + while (p1 <= m) { + clone(tmp[i++], arr[p1++]); + } + while (p2 <= r) { + clone(tmp[i++], arr[p2++]); + } + for (i = l; i <= r; i++) { + clone(arr[i], tmp[i]); + } + return ans; + } + + public static long cdq(int l, int r) { + if (l == r) { + return 0; + } + int mid = (l + r) / 2; + return cdq(l, mid) + cdq(mid + 1, r) + merge(l, mid, r); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i][0] = in.nextInt(); + arr[i][1] = in.nextInt(); + } + Arrays.sort(arr, 1, n + 1, (a, b) -> a[0] - b[0]); + out.println(cdq(1, n)); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class171/Code01_MooFest2.java b/src/class171/Code01_MooFest2.java new file mode 100644 index 000000000..4f0508bf6 --- /dev/null +++ b/src/class171/Code01_MooFest2.java @@ -0,0 +1,75 @@ +package class171; + +// 奶牛音量和,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2345 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int v, x; +//}; +// +//bool NodeCmp(Node a, Node b) { +// return a.v < b.v; +//} +// +//const int MAXN = 20001; +//int n; +//Node arr[MAXN]; +//Node tmp[MAXN]; +// +//long long merge(int l, int m, int r) { +// int p1, p2; +// long long sum1 = 0, sum2 = 0, ans = 0; +// for (p1 = l; p1 <= m; p1++) { +// sum1 += arr[p1].x; +// } +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].x < arr[p2].x) { +// p1++; +// sum1 -= arr[p1].x; +// sum2 += arr[p1].x; +// } +// ans += (1LL * (p1 - l + 1) * arr[p2].x - sum2 + sum1 - 1LL * (m - p1) * arr[p2].x) * arr[p2].v; +// } +// p1 = l; +// p2 = m + 1; +// int i = l; +// while (p1 <= m && p2 <= r) { +// tmp[i++] = arr[p1].x <= arr[p2].x ? arr[p1++] : arr[p2++]; +// } +// while (p1 <= m) { +// tmp[i++] = arr[p1++]; +// } +// while (p2 <= r) { +// tmp[i++] = arr[p2++]; +// } +// for (i = l; i <= r; i++) { +// arr[i] = tmp[i]; +// } +// return ans; +//} +// +//long long cdq(int l, int r) { +// if (l == r) { +// return 0; +// } +// int mid = (l + r) / 2; +// return cdq(l, mid) + cdq(mid + 1, r) + merge(l, mid, r); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i].v >> arr[i].x; +// } +// sort(arr + 1, arr + n + 1, NodeCmp); +// cout << cdq(1, n) << '\n'; +// return 0; +//} \ No newline at end of file From 278122ca3a6de848579245bdb84163b3f10d9398 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Jun 2025 15:26:02 +0800 Subject: [PATCH 0221/1170] modify code --- src/class171/Code01_MooFest1.java | 4 ++-- src/class171/Code01_MooFest2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class171/Code01_MooFest1.java b/src/class171/Code01_MooFest1.java index 868c4fe27..9924e6958 100644 --- a/src/class171/Code01_MooFest1.java +++ b/src/class171/Code01_MooFest1.java @@ -1,7 +1,7 @@ package class171; // 奶牛音量和,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P2345 +// 测试链接 : https://www.luogu.com.cn/problem/P5094 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; @@ -12,7 +12,7 @@ public class Code01_MooFest1 { - public static int MAXN = 20001; + public static int MAXN = 50001; public static int n; // 听力v、位置x public static int[][] arr = new int[MAXN][2]; diff --git a/src/class171/Code01_MooFest2.java b/src/class171/Code01_MooFest2.java index 4f0508bf6..c5dab7ed3 100644 --- a/src/class171/Code01_MooFest2.java +++ b/src/class171/Code01_MooFest2.java @@ -1,7 +1,7 @@ package class171; // 奶牛音量和,C++版 -// 测试链接 : https://www.luogu.com.cn/problem/P2345 +// 测试链接 : https://www.luogu.com.cn/problem/P5094 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -17,7 +17,7 @@ // return a.v < b.v; //} // -//const int MAXN = 20001; +//const int MAXN = 50001; //int n; //Node arr[MAXN]; //Node tmp[MAXN]; From eb6cd4d8317e7358ed74ca5acdee20c7b92240a9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Jun 2025 22:02:02 +0800 Subject: [PATCH 0222/1170] modify code --- src/class171/Code02_AiRobots1.java | 180 +++++++++++++++++++++++++++++ src/class171/Code02_AiRobots2.java | 141 ++++++++++++++++++++++ 2 files changed, 321 insertions(+) create mode 100644 src/class171/Code02_AiRobots1.java create mode 100644 src/class171/Code02_AiRobots2.java diff --git a/src/class171/Code02_AiRobots1.java b/src/class171/Code02_AiRobots1.java new file mode 100644 index 000000000..8b7384fd3 --- /dev/null +++ b/src/class171/Code02_AiRobots1.java @@ -0,0 +1,180 @@ +package class171; + +// 机器人可见对,java版 +// 测试链接 : https://codeforces.com/problemset/problem/1045/G +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code02_AiRobots1 { + + public static int MAXN = 100001; + public static int n, k, s; + + // 位置x、视野y、智商q、左边界l、右边界r + public static int[][] arr = new int[MAXN][5]; + // 所有x坐标组成的数组 + public static int[] x = new int[MAXN]; + + public static int[] tree = new int[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= s) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static int query(int l, int r) { + return sum(r) - sum(l - 1); + } + + public static long merge(int l, int m, int r) { + int winl = l, winr = l - 1; + long ans = 0; + for (int i = m + 1; i <= r; i++) { + while (winl <= m && arr[winl][2] < arr[i][2] - k) { + add(arr[winl][0], -1); + winl++; + } + while (winr + 1 <= m && arr[winr + 1][2] <= arr[i][2] + k) { + winr++; + add(arr[winr][0], 1); + } + ans += query(arr[i][3], arr[i][4]); + } + for (int i = winl; i <= winr; i++) { + add(arr[i][0], -1); + } + Arrays.sort(arr, l, r + 1, (a, b) -> a[2] - b[2]); + return ans; + } + + public static long cdq(int l, int r) { + if (l == r) { + return 0; + } + int mid = (l + r) / 2; + return cdq(l, mid) + cdq(mid + 1, r) + merge(l, mid, r); + } + + public static int lower(int num) { + int l = 1, r = s, m, ans = 1; + while (l <= r) { + m = (l + r) / 2; + if (x[m] >= num) { + ans = m; + r = m - 1; + } else { + l = m + 1; + } + } + return ans; + } + + public static int upper(int num) { + int l = 1, r = s, m, ans = s + 1; + while (l <= r) { + m = (l + r) / 2; + if (x[m] > num) { + ans = m; + r = m - 1; + } else { + l = m + 1; + } + } + return ans; + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + x[i] = arr[i][0]; + } + Arrays.sort(x, 1, n + 1); + s = 1; + for (int i = 2; i <= n; i++) { + if (x[s] != x[i]) { + x[++s] = x[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i][3] = lower(arr[i][0] - arr[i][1]); + arr[i][4] = upper(arr[i][0] + arr[i][1]) - 1; + arr[i][0] = lower(arr[i][0]); + } + Arrays.sort(arr, 1, n + 1, (a, b) -> b[1] - a[1]); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + k = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i][0] = in.nextInt(); + arr[i][1] = in.nextInt(); + arr[i][2] = in.nextInt(); + } + prepare(); + out.println(cdq(1, n)); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class171/Code02_AiRobots2.java b/src/class171/Code02_AiRobots2.java new file mode 100644 index 000000000..5f3640bcc --- /dev/null +++ b/src/class171/Code02_AiRobots2.java @@ -0,0 +1,141 @@ +package class171; + +// 机器人可见对,C++版 +// 测试链接 : https://codeforces.com/problemset/problem/1045/G +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int x, y, q, l, r; +//}; +// +//bool CmpY(Node a, Node b) { +// return a.y > b.y; +//} +// +//bool CmpQ(Node a, Node b) { +// return a.q < b.q; +//} +// +//const int MAXN = 100001; +//int n, k, s; +// +//Node arr[MAXN]; +//int x[MAXN]; +//int tree[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= s) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//int query(int l, int r) { +// return sum(r) - sum(l - 1); +//} +// +//long long merge(int l, int m, int r) { +// int winl = l, winr = l - 1; +// long long ans = 0; +// for (int i = m + 1; i <= r; i++) { +// while (winl <= m && arr[winl].q < arr[i].q - k) { +// add(arr[winl].x, -1); +// winl++; +// } +// while (winr + 1 <= m && arr[winr + 1].q <= arr[i].q + k) { +// winr++; +// add(arr[winr].x, 1); +// } +// ans += query(arr[i].l, arr[i].r); +// } +// for (int i = winl; i <= winr; i++) { +// add(arr[i].x, -1); +// } +// sort(arr + l, arr + r + 1, CmpQ); +// return ans; +//} +// +//long long cdq(int l, int r) { +// if (l == r) { +// return 0; +// } +// int mid = (l + r) / 2; +// return cdq(l, mid) + cdq(mid + 1, r) + merge(l, mid, r); +//} +// +//int lower(int num) { +// int l = 1, r = s, m, ans = 1; +// while (l <= r) { +// m = (l + r) / 2; +// if (x[m] >= num) { +// ans = m; +// r = m - 1; +// } else { +// l = m + 1; +// } +// } +// return ans; +//} +// +//int upper(int num) { +// int l = 1, r = s, m, ans = s + 1; +// while (l <= r) { +// m = (l + r) / 2; +// if (x[m] > num) { +// ans = m; +// r = m - 1; +// } else { +// l = m + 1; +// } +// } +// return ans; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// x[i] = arr[i].x; +// } +// sort(x + 1, x + n + 1); +// s = 1; +// for (int i = 2; i <= n; i++) { +// if (x[s] != x[i]) { +// x[++s] = x[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i].l = lower(arr[i].x - arr[i].y); +// arr[i].r = upper(arr[i].x + arr[i].y) - 1; +// arr[i].x = lower(arr[i].x); +// } +// sort(arr + 1, arr + n + 1, CmpY); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> k; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i].x >> arr[i].y >> arr[i].q; +// } +// prepare(); +// cout << cdq(1, n) << '\n'; +// return 0; +//} \ No newline at end of file From 5eaa4960c652e0f183caa322d1cccb0ee5e2c963 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Jun 2025 22:03:29 +0800 Subject: [PATCH 0223/1170] modify code --- src/class171/Code02_AiRobots1.java | 1 + src/class171/Code02_AiRobots2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class171/Code02_AiRobots1.java b/src/class171/Code02_AiRobots1.java index 8b7384fd3..204696710 100644 --- a/src/class171/Code02_AiRobots1.java +++ b/src/class171/Code02_AiRobots1.java @@ -1,6 +1,7 @@ package class171; // 机器人可见对,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1045G // 测试链接 : https://codeforces.com/problemset/problem/1045/G // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class171/Code02_AiRobots2.java b/src/class171/Code02_AiRobots2.java index 5f3640bcc..fd64540fd 100644 --- a/src/class171/Code02_AiRobots2.java +++ b/src/class171/Code02_AiRobots2.java @@ -1,6 +1,7 @@ package class171; // 机器人可见对,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1045G // 测试链接 : https://codeforces.com/problemset/problem/1045/G // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 44e981f9c7da2252f73510d4d1eaac7c89ed04cb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 14:39:35 +0800 Subject: [PATCH 0224/1170] modify code --- src/class171/Code03_Sequence1.java | 146 +++++++++++++++++++++++++++++ src/class171/Code03_Sequence2.java | 111 ++++++++++++++++++++++ 2 files changed, 257 insertions(+) create mode 100644 src/class171/Code03_Sequence1.java create mode 100644 src/class171/Code03_Sequence2.java diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java new file mode 100644 index 000000000..f719ebeca --- /dev/null +++ b/src/class171/Code03_Sequence1.java @@ -0,0 +1,146 @@ +package class171; + +// 序列,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4093 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code03_Sequence1 { + + public static int MAXN = 100001; + public static int n, m; + // 位置i、数值v、最小值minv、最大值maxv + public static int[][] arr = new int[MAXN][4]; + public static int[] tree = new int[MAXN]; + public static int[] dp = new int[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void more(int i, int num) { + while (i <= n) { + tree[i] = Math.max(tree[i], num); + i += lowbit(i); + } + } + + public static int query(int i) { + int ret = 0; + while (i > 0) { + ret = Math.max(ret, tree[i]); + i -= lowbit(i); + } + return ret; + } + + public static void clear(int i) { + while (i <= n) { + tree[i] = 0; + i += lowbit(i); + } + } + + public static void merge(int l, int m, int r) { + Arrays.sort(arr, l, m + 1, (a, b) -> a[1] - b[1]); + Arrays.sort(arr, m + 1, r + 1, (a, b) -> a[2] - b[2]); + int p1, p2; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][2]) { + p1++; + more(arr[p1][3], dp[arr[p1][0]]); + } + dp[arr[p2][0]] = Math.max(dp[arr[p2][0]], query(arr[p2][1]) + 1); + } + for (int i = l; i <= p1; i++) { + clear(arr[i][3]); + } + Arrays.sort(arr, l, r + 1, (a, b) -> a[0] - b[0]); + } + + public static void cdq(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + // 为什么不是经典顺序,左、右、整合左右 + // 因为右侧dp需要先获得左侧dp的值,获得部分的可能性 + // 然后才能在右侧范围上把剩下的可能性算完 + cdq(l, mid); + merge(l, mid, r); + cdq(mid + 1, r); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i][0] = i; + arr[i][1] = in.nextInt(); + arr[i][2] = arr[i][1]; + arr[i][3] = arr[i][1]; + dp[i] = 1; + } + for (int i = 1, idx, num; i <= m; i++) { + idx = in.nextInt(); + num = in.nextInt(); + arr[idx][2] = Math.min(arr[idx][2], num); + arr[idx][3] = Math.max(arr[idx][3], num); + } + cdq(1, n); + int ans = 0; + for (int i = 1; i <= n; i++) { + ans = Math.max(ans, dp[i]); + } + out.println(ans); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class171/Code03_Sequence2.java b/src/class171/Code03_Sequence2.java new file mode 100644 index 000000000..35c4ebcb1 --- /dev/null +++ b/src/class171/Code03_Sequence2.java @@ -0,0 +1,111 @@ +package class171; + +// 序列,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4093 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int i, v, minv, maxv; +//}; +// +//bool CmpI(Node a, Node b) { +// return a.i < b.i; +//} +// +//bool CmpV(Node a, Node b) { +// return a.v < b.v; +//} +// +//bool CmpMinv(Node a, Node b) { +// return a.minv < b.minv; +//} +// +//const int MAXN = 100001; +//int n, m; +//Node arr[MAXN]; +//int tree[MAXN]; +//int dp[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void more(int i, int num) { +// while (i <= n) { +// tree[i] = max(tree[i], num); +// i += lowbit(i); +// } +//} +// +//int query(int i) { +// int ret = 0; +// while (i > 0) { +// ret = max(ret, tree[i]); +// i -= lowbit(i); +// } +// return ret; +//} +// +//void clear(int i) { +// while (i <= n) { +// tree[i] = 0; +// i += lowbit(i); +// } +//} +// +//void merge(int l, int m, int r) { +// sort(arr + l, arr + m + 1, CmpV); +// sort(arr + m + 1, arr + r + 1, CmpMinv); +// int p1 = l - 1, p2 = m + 1; +// for (; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].v <= arr[p2].minv) { +// p1++; +// more(arr[p1].maxv, dp[arr[p1].i]); +// } +// dp[arr[p2].i] = max(dp[arr[p2].i], query(arr[p2].v) + 1); +// } +// for (int i = l; i <= p1; i++) { +// clear(arr[i].maxv); +// } +// sort(arr + l, arr + r + 1, CmpI); +//} +// +//void cdq(int l, int r) { +// if (l == r) { +// return; +// } +// int mid = (l + r) / 2; +// cdq(l, mid); +// merge(l, mid, r); +// cdq(mid + 1, r); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// arr[i].i = i; +// cin >> arr[i].v; +// arr[i].minv = arr[i].v; +// arr[i].maxv = arr[i].v; +// dp[i] = 1; +// } +// for (int i = 1, idx, num; i <= m; i++) { +// cin >> idx >> num; +// arr[idx].minv = min(arr[idx].minv, num); +// arr[idx].maxv = max(arr[idx].maxv, num); +// } +// cdq(1, n); +// int ans = 0; +// for (int i = 1; i <= n; i++) { +// ans = max(ans, dp[i]); +// } +// cout << ans << '\n'; +// return 0; +//} \ No newline at end of file From 00c3cb2289c9ee1a814c000717418885ea75de42 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 14:59:32 +0800 Subject: [PATCH 0225/1170] modify code --- src/class171/Code03_Sequence1.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index f719ebeca..7599fdaec 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -68,9 +68,11 @@ public static void cdq(int l, int r) { return; } int mid = (l + r) / 2; - // 为什么不是经典顺序,左、右、整合左右 - // 因为右侧dp需要先获得左侧dp的值,获得部分的可能性 - // 然后才能在右侧范围上把剩下的可能性算完 + // 为什么不是经典顺序,左、右、再整合? + // 因为右侧dp的计算依赖左侧dp的结果 + // 需要先处理左侧范围,得到部分状态转移的可能性 + // 然后左右范围合并时,先把左边dp的影响传递到右边 + // 需要再处理右侧范围,才能彻底把右侧dp计算正确 cdq(l, mid); merge(l, mid, r); cdq(mid + 1, r); From 48dcea508798e0e6b0a296b7c7c2952ae2dcc34d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 15:01:45 +0800 Subject: [PATCH 0226/1170] modify code --- src/class171/Code03_Sequence1.java | 1 + src/class171/Code03_Sequence2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index 7599fdaec..f899a2cb9 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -14,6 +14,7 @@ public class Code03_Sequence1 { public static int MAXN = 100001; public static int n, m; + // 位置i、数值v、最小值minv、最大值maxv public static int[][] arr = new int[MAXN][4]; public static int[] tree = new int[MAXN]; diff --git a/src/class171/Code03_Sequence2.java b/src/class171/Code03_Sequence2.java index 35c4ebcb1..00159322a 100644 --- a/src/class171/Code03_Sequence2.java +++ b/src/class171/Code03_Sequence2.java @@ -27,6 +27,7 @@ // //const int MAXN = 100001; //int n, m; +// //Node arr[MAXN]; //int tree[MAXN]; //int dp[MAXN]; From 5db71b8019abce20ccdb097b061273fd9a11f7c9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 15:08:35 +0800 Subject: [PATCH 0227/1170] modify code --- src/class171/Code03_Sequence1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index f899a2cb9..d38e0a5fc 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -72,8 +72,8 @@ public static void cdq(int l, int r) { // 为什么不是经典顺序,左、右、再整合? // 因为右侧dp的计算依赖左侧dp的结果 // 需要先处理左侧范围,得到部分状态转移的可能性 - // 然后左右范围合并时,先把左边dp的影响传递到右边 - // 需要再处理右侧范围,才能彻底把右侧dp计算正确 + // 然后再进行左右合并,把左边dp的影响传递到右边 + // 最后再处理右侧范围,才能彻底把右侧dp计算正确 cdq(l, mid); merge(l, mid, r); cdq(mid + 1, r); From 1baf4cacebfe96356be600b29f9898726f71392f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 15:10:31 +0800 Subject: [PATCH 0228/1170] modify code --- src/class171/Code03_Sequence1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index d38e0a5fc..3d828d00d 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -72,7 +72,7 @@ public static void cdq(int l, int r) { // 为什么不是经典顺序,左、右、再整合? // 因为右侧dp的计算依赖左侧dp的结果 // 需要先处理左侧范围,得到部分状态转移的可能性 - // 然后再进行左右合并,把左边dp的影响传递到右边 + // 然后把左侧dp结果推送到右侧,右侧先获得这些结果 // 最后再处理右侧范围,才能彻底把右侧dp计算正确 cdq(l, mid); merge(l, mid, r); From 2af58e3ef9389be88007bee49565ad15c28e5de1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 15:12:25 +0800 Subject: [PATCH 0229/1170] modify code --- src/class171/Code03_Sequence1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index 3d828d00d..d8bfd7e61 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -69,7 +69,7 @@ public static void cdq(int l, int r) { return; } int mid = (l + r) / 2; - // 为什么不是经典顺序,左、右、再整合? + // 为什么顺序是左、merge、右,而不是经典顺序,左、右、merge? // 因为右侧dp的计算依赖左侧dp的结果 // 需要先处理左侧范围,得到部分状态转移的可能性 // 然后把左侧dp结果推送到右侧,右侧先获得这些结果 From 64fcdb7936cf988cdfc35a4aef8486a6563be2f4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 15:13:07 +0800 Subject: [PATCH 0230/1170] modify code --- src/class171/Code03_Sequence1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index d8bfd7e61..5369a1865 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -73,7 +73,7 @@ public static void cdq(int l, int r) { // 因为右侧dp的计算依赖左侧dp的结果 // 需要先处理左侧范围,得到部分状态转移的可能性 // 然后把左侧dp结果推送到右侧,右侧先获得这些结果 - // 最后再处理右侧范围,才能彻底把右侧dp计算正确 + // 在此基础上,最后处理右侧范围,才能把右侧dp计算正确 cdq(l, mid); merge(l, mid, r); cdq(mid + 1, r); From cea60ae6d88c84dacf1dec9d2b777eb7e7276a80 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 16:19:31 +0800 Subject: [PATCH 0231/1170] modify code --- src/class171/Code03_Sequence1.java | 2 +- src/class171/Code03_Sequence2.java | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index 5369a1865..893eb5b91 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -15,7 +15,7 @@ public class Code03_Sequence1 { public static int MAXN = 100001; public static int n, m; - // 位置i、数值v、最小值minv、最大值maxv + // 位置i、数值v、最小值min、最大值max public static int[][] arr = new int[MAXN][4]; public static int[] tree = new int[MAXN]; public static int[] dp = new int[MAXN]; diff --git a/src/class171/Code03_Sequence2.java b/src/class171/Code03_Sequence2.java index 00159322a..16c3669ad 100644 --- a/src/class171/Code03_Sequence2.java +++ b/src/class171/Code03_Sequence2.java @@ -10,7 +10,7 @@ //using namespace std; // //struct Node { -// int i, v, minv, maxv; +// int i, v, min, max; //}; // //bool CmpI(Node a, Node b) { @@ -21,8 +21,8 @@ // return a.v < b.v; //} // -//bool CmpMinv(Node a, Node b) { -// return a.minv < b.minv; +//bool CmpMin(Node a, Node b) { +// return a.min < b.min; //} // //const int MAXN = 100001; @@ -61,17 +61,17 @@ // //void merge(int l, int m, int r) { // sort(arr + l, arr + m + 1, CmpV); -// sort(arr + m + 1, arr + r + 1, CmpMinv); +// sort(arr + m + 1, arr + r + 1, CmpMin); // int p1 = l - 1, p2 = m + 1; // for (; p2 <= r; p2++) { -// while (p1 + 1 <= m && arr[p1 + 1].v <= arr[p2].minv) { +// while (p1 + 1 <= m && arr[p1 + 1].v <= arr[p2].min) { // p1++; -// more(arr[p1].maxv, dp[arr[p1].i]); +// more(arr[p1].max, dp[arr[p1].i]); // } // dp[arr[p2].i] = max(dp[arr[p2].i], query(arr[p2].v) + 1); // } // for (int i = l; i <= p1; i++) { -// clear(arr[i].maxv); +// clear(arr[i].max); // } // sort(arr + l, arr + r + 1, CmpI); //} @@ -93,14 +93,14 @@ // for (int i = 1; i <= n; i++) { // arr[i].i = i; // cin >> arr[i].v; -// arr[i].minv = arr[i].v; -// arr[i].maxv = arr[i].v; +// arr[i].min = arr[i].v; +// arr[i].max = arr[i].v; // dp[i] = 1; // } // for (int i = 1, idx, num; i <= m; i++) { // cin >> idx >> num; -// arr[idx].minv = min(arr[idx].minv, num); -// arr[idx].maxv = max(arr[idx].maxv, num); +// arr[idx].min = min(arr[idx].min, num); +// arr[idx].max = max(arr[idx].max, num); // } // cdq(1, n); // int ans = 0; From 8ccd9d40e6902d558911d3198deaffeac6b329e1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 20:43:20 +0800 Subject: [PATCH 0232/1170] modify code --- .../Code04_MinimumCostToCutAStick.java | 4 +- src/class093/Code02_MinimumTaps.java | 2 +- src/class127/Code06_FrogCrossRiver.java | 2 +- src/class151/Code06_RemovingBlocks.java | 2 +- src/class152/Code05_PersistentFHQTreap2.java | 2 +- src/class155/Code04_Blocks2.java | 10 +- src/class165/Code04_TeamBuilding1.java | 2 +- src/class165/Code04_TeamBuilding2.java | 2 +- src/class167/Code04_ShortestPathQueries2.java | 4 +- .../Code05_EightVerticalHorizontal2.java | 8 +- src/class171/Code04_Interceptor1.java | 127 ++++++++++++++++++ 11 files changed, 146 insertions(+), 19 deletions(-) create mode 100644 src/class171/Code04_Interceptor1.java diff --git a/src/class076/Code04_MinimumCostToCutAStick.java b/src/class076/Code04_MinimumCostToCutAStick.java index a3ac6ad08..97e640704 100644 --- a/src/class076/Code04_MinimumCostToCutAStick.java +++ b/src/class076/Code04_MinimumCostToCutAStick.java @@ -19,7 +19,7 @@ public static int minCost1(int n, int[] cuts) { Arrays.sort(cuts); int[] arr = new int[m + 2]; arr[0] = 0; - for (int i = 1; i <= m; ++i) { + for (int i = 1; i <= m; i++) { arr[i] = cuts[i - 1]; } arr[m + 1] = n; @@ -59,7 +59,7 @@ public static int minCost2(int n, int[] cuts) { Arrays.sort(cuts); int[] arr = new int[m + 2]; arr[0] = 0; - for (int i = 1; i <= m; ++i) { + for (int i = 1; i <= m; i++) { arr[i] = cuts[i - 1]; } arr[m + 1] = n; diff --git a/src/class093/Code02_MinimumTaps.java b/src/class093/Code02_MinimumTaps.java index b9256c4ef..00ce7c044 100644 --- a/src/class093/Code02_MinimumTaps.java +++ b/src/class093/Code02_MinimumTaps.java @@ -15,7 +15,7 @@ public static int minTaps(int n, int[] ranges) { // right[i] = j // 所有左边界在i的水龙头里,影响到的最右右边界是j int[] right = new int[n + 1]; - for (int i = 0, start; i <= n; ++i) { + for (int i = 0, start; i <= n; i++) { start = Math.max(0, i - ranges[i]); right[start] = Math.max(right[start], i + ranges[i]); } diff --git a/src/class127/Code06_FrogCrossRiver.java b/src/class127/Code06_FrogCrossRiver.java index c324ab1b5..9b473eb5c 100644 --- a/src/class127/Code06_FrogCrossRiver.java +++ b/src/class127/Code06_FrogCrossRiver.java @@ -51,7 +51,7 @@ public static void main(String[] args) throws IOException { t = (int) in.nval; in.nextToken(); m = (int) in.nval; - for (int i = 1; i <= m; ++i) { + for (int i = 1; i <= m; i++) { in.nextToken(); arr[i] = (int) in.nval; } diff --git a/src/class151/Code06_RemovingBlocks.java b/src/class151/Code06_RemovingBlocks.java index 346fda77e..c992c896b 100644 --- a/src/class151/Code06_RemovingBlocks.java +++ b/src/class151/Code06_RemovingBlocks.java @@ -53,7 +53,7 @@ public static long compute() { for (int i = 1; i <= n; i++) { ans = (ans + (long) (sum[i] + sum[n - i + 1] - 1) * arr[i]) % MOD; } - for (int i = 1; i <= n; ++i) { + for (int i = 1; i <= n; i++) { ans = ans * i % MOD; } return ans; diff --git a/src/class152/Code05_PersistentFHQTreap2.java b/src/class152/Code05_PersistentFHQTreap2.java index 04e262a99..6ae238d6f 100644 --- a/src/class152/Code05_PersistentFHQTreap2.java +++ b/src/class152/Code05_PersistentFHQTreap2.java @@ -155,7 +155,7 @@ // srand(time(0)); // int n; // cin >> n; -// for (int i = 1; i <= n; ++i) { +// for (int i = 1; i <= n; i++) { // int version, op, x; // cin >> version >> op >> x; // if (op == 1) { diff --git a/src/class155/Code04_Blocks2.java b/src/class155/Code04_Blocks2.java index c4011e9ba..96001b00c 100644 --- a/src/class155/Code04_Blocks2.java +++ b/src/class155/Code04_Blocks2.java @@ -113,13 +113,13 @@ // //void compute() { // int first = 0; -// for (int i = 1; i <= n; ++i) { +// for (int i = 1; i <= n; i++) { // sort(arr + start[i], arr + boundary[i]); // first += arr[start[i]]; // } // dist[0] = -1; // int head = 0; -// for (int i = 1; i <= n; ++i) { +// for (int i = 1; i <= n; i++) { // head = merge(head, init(i, start[i])); // } // pre[head] = first; @@ -146,17 +146,17 @@ // cin.tie(nullptr); // cin >> n >> k; // int ai = 0; -// for (int i = 1; i <= n; ++i) { +// for (int i = 1; i <= n; i++) { // int m; // cin >> m; // start[i] = ai + 1; -// for (int j = 1; j <= m; ++j) { +// for (int j = 1; j <= m; j++) { // cin >> arr[++ai]; // } // boundary[i] = start[i] + m; // } // compute(); -// for (int i = 1; i <= k; ++i) { +// for (int i = 1; i <= k; i++) { // cout << ans[i] << " "; // } // cout << endl; diff --git a/src/class165/Code04_TeamBuilding1.java b/src/class165/Code04_TeamBuilding1.java index 06632f782..b17811682 100644 --- a/src/class165/Code04_TeamBuilding1.java +++ b/src/class165/Code04_TeamBuilding1.java @@ -74,7 +74,7 @@ public static void undo() { } public static void filter() { - for (int i = 1; i <= 2 * n; ++i) { + for (int i = 1; i <= 2 * n; i++) { father[i] = i; siz[i] = 1; } diff --git a/src/class165/Code04_TeamBuilding2.java b/src/class165/Code04_TeamBuilding2.java index f7f9d83e5..8d020b931 100644 --- a/src/class165/Code04_TeamBuilding2.java +++ b/src/class165/Code04_TeamBuilding2.java @@ -74,7 +74,7 @@ //} // //void filter() { -// for (int i = 1; i <= 2 * n; ++i) { +// for (int i = 1; i <= 2 * n; i++) { // father[i] = i; // siz[i] = 1; // } diff --git a/src/class167/Code04_ShortestPathQueries2.java b/src/class167/Code04_ShortestPathQueries2.java index dc4999a8a..492aa380c 100644 --- a/src/class167/Code04_ShortestPathQueries2.java +++ b/src/class167/Code04_ShortestPathQueries2.java @@ -64,7 +64,7 @@ //int ans[MAXN]; // //void insert(int num) { -// for (int i = BIT; i >= 0; --i) { +// for (int i = BIT; i >= 0; i--) { // if (num >> i == 1) { // if (basis[i] == 0) { // basis[i] = num; @@ -77,7 +77,7 @@ //} // //int minEor(int num) { -// for (int i = BIT; i >= 0; --i) { +// for (int i = BIT; i >= 0; i--) { // num = min(num, num ^ basis[i]); // } // return num; diff --git a/src/class167/Code05_EightVerticalHorizontal2.java b/src/class167/Code05_EightVerticalHorizontal2.java index 762f79888..d7e950199 100644 --- a/src/class167/Code05_EightVerticalHorizontal2.java +++ b/src/class167/Code05_EightVerticalHorizontal2.java @@ -48,7 +48,7 @@ //bs ans[MAXQ]; // //void insert(bs& num) { -// for (int i = BIT; i >= 0; --i) { +// for (int i = BIT; i >= 0; i--) { // if (num[i] == 1) { // if (basis[i][i] == 0) { // basis[i] = num; @@ -159,16 +159,16 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m >> q; -// for (int i = 0; i <= BIT; ++i) { +// for (int i = 0; i <= BIT; i++) { // basis[i].reset(); // } -// for (int i = 1; i <= n; ++i) { +// for (int i = 1; i <= n; i++) { // father[i] = i; // eor[i].reset(); // } // int u, v; // bs weight; -// for (int i = 1; i <= m; ++i) { +// for (int i = 1; i <= m; i++) { // cin >> u >> v >> weight; // Union(u, v, weight); // } diff --git a/src/class171/Code04_Interceptor1.java b/src/class171/Code04_Interceptor1.java new file mode 100644 index 000000000..b98d14222 --- /dev/null +++ b/src/class171/Code04_Interceptor1.java @@ -0,0 +1,127 @@ +package class171; + +// 拦截导弹,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2487 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code04_Interceptor1 { + + public static int MAXN = 50001; + + public static int n, s; + + // 位置i、高度h、速度v + public static int[][] arr = new int[MAXN][3]; + public static int[] sortv = new int[MAXN]; + + public static int[] max1 = new int[MAXN]; + public static double[] cnt1 = new double[MAXN]; + + public static int[] max2 = new int[MAXN]; + public static double[] cnt2 = new double[MAXN]; + + public static int[] treemax = new int[MAXN]; + public static double[] treecnt = new double[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int max, double cnt) { + while (i <= s) { + if (max > treemax[i]) { + treemax[i] = max; + treecnt[i] = cnt; + } else if (max == treemax[i]) { + treecnt[i] += cnt; + } + i += lowbit(i); + } + } + + public static int querymax; + + public static double querycnt; + + public static void query(int i) { + querymax = 0; + querycnt = 0; + while (i > 0) { + if (treemax[i] > querymax) { + querymax = treemax[i]; + querycnt = treecnt[i]; + } else if (treemax[i] == querymax) { + querycnt += treecnt[i]; + } + i -= lowbit(i); + } + } + + public static void clear(int i) { + while (i <= s) { + treemax[i] = 0; + treecnt[i] = 0; + i += lowbit(i); + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for(int i = 1; i <= n; i++) { + arr[i][0] = i; + arr[i][1] = in.nextInt(); + arr[i][2] = in.nextInt(); + sortv[i] = arr[i][2]; + } + + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From e9ee87a117ad24f45b32e378c47cdcb2bd3d20d8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 23:38:27 +0800 Subject: [PATCH 0233/1170] modify code --- src/class171/Code04_Interceptor1.java | 204 +++++++++++++++++++---- src/class171/Code04_Interceptor2.java | 230 ++++++++++++++++++++++++++ 2 files changed, 406 insertions(+), 28 deletions(-) create mode 100644 src/class171/Code04_Interceptor2.java diff --git a/src/class171/Code04_Interceptor1.java b/src/class171/Code04_Interceptor1.java index b98d14222..05c3e1872 100644 --- a/src/class171/Code04_Interceptor1.java +++ b/src/class171/Code04_Interceptor1.java @@ -8,54 +8,56 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.util.Arrays; public class Code04_Interceptor1 { public static int MAXN = 50001; - public static int n, s; + public static int[] h = new int[MAXN]; + public static int[] v = new int[MAXN]; + public static int[] sortv = new int[MAXN]; // 位置i、高度h、速度v public static int[][] arr = new int[MAXN][3]; - public static int[] sortv = new int[MAXN]; - public static int[] max1 = new int[MAXN]; - public static double[] cnt1 = new double[MAXN]; + // 树状数组,维护最大长度、最大长度出现的次数 + public static int[] treelen = new int[MAXN]; + public static double[] treecnt = new double[MAXN]; - public static int[] max2 = new int[MAXN]; - public static double[] cnt2 = new double[MAXN]; + public static int[] f1 = new int[MAXN]; + public static double[] g1 = new double[MAXN]; - public static int[] treemax = new int[MAXN]; - public static double[] treecnt = new double[MAXN]; + public static int[] f2 = new int[MAXN]; + public static double[] g2 = new double[MAXN]; - public static int lowbit(int i) { - return i & -i; + public static int lowbit(int x) { + return x & -x; } - public static void add(int i, int max, double cnt) { + public static void add(int i, int len, double cnt) { while (i <= s) { - if (max > treemax[i]) { - treemax[i] = max; + if (len > treelen[i]) { + treelen[i] = len; treecnt[i] = cnt; - } else if (max == treemax[i]) { + } else if (len == treelen[i]) { treecnt[i] += cnt; } i += lowbit(i); } } - public static int querymax; - + public static int querylen; public static double querycnt; public static void query(int i) { - querymax = 0; + querylen = 0; querycnt = 0; while (i > 0) { - if (treemax[i] > querymax) { - querymax = treemax[i]; + if (treelen[i] > querylen) { + querylen = treelen[i]; querycnt = treecnt[i]; - } else if (treemax[i] == querymax) { + } else if (treelen[i] == querylen) { querycnt += treecnt[i]; } i -= lowbit(i); @@ -64,25 +66,171 @@ public static void query(int i) { public static void clear(int i) { while (i <= s) { - treemax[i] = 0; + treelen[i] = 0; treecnt[i] = 0; i += lowbit(i); } } + public static void merge1(int l, int m, int r) { + for (int i = l; i <= r; i++) { + arr[i][0] = i; + arr[i][1] = h[i]; + arr[i][2] = v[i]; + } + Arrays.sort(arr, l, m + 1, (a, b) -> b[1] - a[1]); + Arrays.sort(arr, m + 1, r + 1, (a, b) -> b[1] - a[1]); + int p1, p2; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][1] >= arr[p2][1]) { + p1++; + add(s - arr[p1][2] + 1, f1[arr[p1][0]], g1[arr[p1][0]]); + } + query(s - arr[p2][2] + 1); + if (querylen + 1 > f1[arr[p2][0]]) { + f1[arr[p2][0]] = querylen + 1; + g1[arr[p2][0]] = querycnt; + } else if (querylen + 1 == f1[arr[p2][0]]) { + g1[arr[p2][0]] += querycnt; + } + } + for (int i = l; i <= p1; i++) { + clear(s - arr[i][2] + 1); + } + } + + public static void cdq1(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + cdq1(l, mid); + merge1(l, mid, r); + cdq1(mid + 1, r); + } + + public static void merge2(int l, int m, int r) { + for (int i = l; i <= r; i++) { + arr[i][0] = i; + arr[i][1] = h[i]; + arr[i][2] = v[i]; + } + Arrays.sort(arr, l, m + 1, (a, b) -> a[1] - b[1]); + Arrays.sort(arr, m + 1, r + 1, (a, b) -> a[1] - b[1]); + int p1, p2; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][1]) { + p1++; + add(arr[p1][2], f2[arr[p1][0]], g2[arr[p1][0]]); + } + query(arr[p2][2]); + if (querylen + 1 > f2[arr[p2][0]]) { + f2[arr[p2][0]] = querylen + 1; + g2[arr[p2][0]] = querycnt; + } else if (querylen + 1 == f2[arr[p2][0]]) { + g2[arr[p2][0]] += querycnt; + } + } + for (int i = l; i <= p1; i++) { + clear(arr[i][2]); + } + } + + public static void cdq2(int l, int r) { + if (l == r) { + return; + } + int m = (l + r) / 2; + cdq2(l, m); + merge2(l, m, r); + cdq2(m + 1, r); + } + + public static int lower(int num) { + int l = 1, r = s, ans = 1; + while (l <= r) { + int mid = (l + r) / 2; + if (sortv[mid] >= num) { + ans = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + return ans; + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sortv[i] = v[i]; + } + Arrays.sort(sortv, 1, n + 1); + s = 1; + for (int i = 2; i <= n; i++) { + if (sortv[s] != sortv[i]) { + sortv[++s] = sortv[i]; + } + } + for (int i = 1; i <= n; i++) { + v[i] = lower(v[i]); + } + for (int i = 1; i <= n; i++) { + f1[i] = f2[i] = 1; + g1[i] = g2[i] = 1.0; + } + } + + public static void compute() { + cdq1(1, n); + for (int l = 1, r = n; l < r; l++, r--) { + int a = h[l]; + h[l] = h[r]; + h[r] = a; + int b = v[l]; + v[l] = v[r]; + v[r] = b; + } + cdq2(1, n); + for (int l = 1, r = n; l < r; l++, r--) { + int a = f2[l]; + f2[l] = f2[r]; + f2[r] = a; + double b = g2[l]; + g2[l] = g2[r]; + g2[r] = b; + } + } + public static void main(String[] args) throws IOException { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); - for(int i = 1; i <= n; i++) { - arr[i][0] = i; - arr[i][1] = in.nextInt(); - arr[i][2] = in.nextInt(); - sortv[i] = arr[i][2]; + for (int i = 1; i <= n; i++) { + h[i] = in.nextInt(); + v[i] = in.nextInt(); + } + prepare(); + compute(); + int len = 0; + double cnt = 0; + for (int i = 1; i <= n; i++) { + len = Math.max(len, f1[i]); + } + for (int i = 1; i <= n; i++) { + if (f1[i] == len) { + cnt += g1[i]; + } + } + out.println(len); + for (int i = 1; i <= n; i++) { + if (f1[i] + f2[i] - 1 < len) { + out.print("0 "); + } else { + out.printf("%.5f ", g1[i] * g2[i] / cnt); + } } - + out.println(); out.flush(); - out.close(); } // 读写工具类 diff --git a/src/class171/Code04_Interceptor2.java b/src/class171/Code04_Interceptor2.java new file mode 100644 index 000000000..e5b3b2148 --- /dev/null +++ b/src/class171/Code04_Interceptor2.java @@ -0,0 +1,230 @@ +package class171; + +// 拦截导弹,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2487 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int i, h, v; +//}; +// +//bool Cmp1(Node a, Node b) { +// return a.h > b.h; +//} +// +//bool Cmp2(Node a, Node b) { +// return a.h < b.h; +//} +// +//const int MAXN = 50001; +//int n, s; +//int h[MAXN]; +//int v[MAXN]; +//int sortv[MAXN]; +// +//Node arr[MAXN]; +// +//int treelen[MAXN]; +//double treecnt[MAXN]; +// +//int f1[MAXN]; +//double g1[MAXN]; +// +//int f2[MAXN]; +//double g2[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int len, double cnt) { +// while (i <= s) { +// if (len > treelen[i]) { +// treelen[i] = len; +// treecnt[i] = cnt; +// } else if (len == treelen[i]) { +// treecnt[i] += cnt; +// } +// i += lowbit(i); +// } +//} +// +//int querylen; +//double querycnt; +// +//void query(int i) { +// querylen = 0; +// querycnt = 0; +// while (i > 0) { +// if (treelen[i] > querylen) { +// querylen = treelen[i]; +// querycnt = treecnt[i]; +// } else if (treelen[i] == querylen) { +// querycnt += treecnt[i]; +// } +// i -= lowbit(i); +// } +//} +// +//void clear(int i) { +// while (i <= s) { +// treelen[i] = 0; +// treecnt[i] = 0; +// i += lowbit(i); +// } +//} +// +//void merge1(int l, int m, int r) { +// for (int i = l; i <= r; i++) { +// arr[i].i = i; +// arr[i].h = h[i]; +// arr[i].v = v[i]; +// } +// sort(arr + l, arr + m + 1, Cmp1); +// sort(arr + m + 1, arr + r + 1, Cmp1); +// int p1, p2; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].h >= arr[p2].h) { +// p1++; +// add(s - arr[p1].v + 1, f1[arr[p1].i], g1[arr[p1].i]); +// } +// query(s - arr[p2].v + 1); +// if (querylen + 1 > f1[arr[p2].i]) { +// f1[arr[p2].i] = querylen + 1; +// g1[arr[p2].i] = querycnt; +// } else if (querylen + 1 == f1[arr[p2].i]) { +// g1[arr[p2].i] += querycnt; +// } +// } +// for (int i = l; i <= p1; i++) { +// clear(s - arr[i].v + 1); +// } +//} +// +//void cdq1(int l, int r) { +// if (l == r) { +// return; +// } +// int m = (l + r) / 2; +// cdq1(l, m); +// merge1(l, m, r); +// cdq1(m + 1, r); +//} +// +//void merge2(int l, int m, int r) { +// for (int i = l; i <= r; i++) { +// arr[i].i = i; +// arr[i].h = h[i]; +// arr[i].v = v[i]; +// } +// sort(arr + l, arr + m + 1, Cmp2); +// sort(arr + m + 1, arr + r + 1, Cmp2); +// int p1, p2; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].h <= arr[p2].h) { +// p1++; +// add(arr[p1].v, f2[arr[p1].i], g2[arr[p1].i]); +// } +// query(arr[p2].v); +// if (querylen + 1 > f2[arr[p2].i]) { +// f2[arr[p2].i] = querylen + 1; +// g2[arr[p2].i] = querycnt; +// } else if (querylen + 1 == f2[arr[p2].i]) { +// g2[arr[p2].i] += querycnt; +// } +// } +// for (int i = l; i <= p1; i++) { +// clear(arr[i].v); +// } +//} +// +//void cdq2(int l, int r) { +// if (l == r) { +// return; +// } +// int m = (l + r) / 2; +// cdq2(l, m); +// merge2(l, m, r); +// cdq2(m + 1, r); +//} +// +//int lower(int num) { +// int l = 1, r = s, ans = 1; +// while (l <= r) { +// int mid = (l + r) / 2; +// if (sortv[mid] >= num) { +// ans = mid; +// r = mid - 1; +// } else { +// l = mid + 1; +// } +// } +// return ans; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sortv[i] = v[i]; +// } +// sort(sortv + 1, sortv + n + 1); +// s = 1; +// for (int i = 2; i <= n; i++) { +// if (sortv[s] != sortv[i]) { +// sortv[++s] = sortv[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// v[i] = lower(v[i]); +// } +// for (int i = 1; i <= n; i++) { +// f1[i] = f2[i] = 1; +// g1[i] = g2[i] = 1.0; +// } +//} +// +//void compute() { +// cdq1(1, n); +// for (int l = 1, r = n; l < r; l++, r--) { +// swap(h[l], h[r]); +// swap(v[l], v[r]); +// } +// cdq2(1, n); +// for (int l = 1, r = n; l < r; l++, r--) { +// swap(f2[l], f2[r]); +// swap(g2[l], g2[r]); +// } +//} +// +//int main() { +// scanf("%d", &n); +// for (int i = 1; i <= n; i++) { +// scanf("%d%d", &h[i], &v[i]); +// } +// prepare(); +// compute(); +// int len = 0; +// double cnt = 0.0; +// for (int i = 1; i <= n; i++) { +// len = max(len, f1[i]); +// } +// for (int i = 1; i <= n; i++) { +// if (f1[i] == len) { +// cnt += g1[i]; +// } +// } +// printf("%d\n", len); +// for (int i = 1; i <= n; i++) { +// if (f1[i] + f2[i] - 1 < len) { +// printf("0 "); +// } else { +// printf("%.5f ", g1[i] * g2[i] / cnt); +// } +// } +// printf("\n"); +// return 0; +//} \ No newline at end of file From a834493b32c2ae7c56d879249a627eea6bae2efa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Jun 2025 23:42:41 +0800 Subject: [PATCH 0234/1170] modify code --- src/class171/Code04_Interceptor1.java | 58 +++++++++++++-------------- src/class171/Code04_Interceptor2.java | 50 +++++++++++------------ 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/class171/Code04_Interceptor1.java b/src/class171/Code04_Interceptor1.java index 05c3e1872..290ef225a 100644 --- a/src/class171/Code04_Interceptor1.java +++ b/src/class171/Code04_Interceptor1.java @@ -25,11 +25,11 @@ public class Code04_Interceptor1 { public static int[] treelen = new int[MAXN]; public static double[] treecnt = new double[MAXN]; - public static int[] f1 = new int[MAXN]; - public static double[] g1 = new double[MAXN]; + public static int[] len1 = new int[MAXN]; + public static double[] cnt1 = new double[MAXN]; - public static int[] f2 = new int[MAXN]; - public static double[] g2 = new double[MAXN]; + public static int[] len2 = new int[MAXN]; + public static double[] cnt2 = new double[MAXN]; public static int lowbit(int x) { return x & -x; @@ -84,14 +84,14 @@ public static void merge1(int l, int m, int r) { for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && arr[p1 + 1][1] >= arr[p2][1]) { p1++; - add(s - arr[p1][2] + 1, f1[arr[p1][0]], g1[arr[p1][0]]); + add(s - arr[p1][2] + 1, len1[arr[p1][0]], cnt1[arr[p1][0]]); } query(s - arr[p2][2] + 1); - if (querylen + 1 > f1[arr[p2][0]]) { - f1[arr[p2][0]] = querylen + 1; - g1[arr[p2][0]] = querycnt; - } else if (querylen + 1 == f1[arr[p2][0]]) { - g1[arr[p2][0]] += querycnt; + if (querylen + 1 > len1[arr[p2][0]]) { + len1[arr[p2][0]] = querylen + 1; + cnt1[arr[p2][0]] = querycnt; + } else if (querylen + 1 == len1[arr[p2][0]]) { + cnt1[arr[p2][0]] += querycnt; } } for (int i = l; i <= p1; i++) { @@ -121,14 +121,14 @@ public static void merge2(int l, int m, int r) { for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][1]) { p1++; - add(arr[p1][2], f2[arr[p1][0]], g2[arr[p1][0]]); + add(arr[p1][2], len2[arr[p1][0]], cnt2[arr[p1][0]]); } query(arr[p2][2]); - if (querylen + 1 > f2[arr[p2][0]]) { - f2[arr[p2][0]] = querylen + 1; - g2[arr[p2][0]] = querycnt; - } else if (querylen + 1 == f2[arr[p2][0]]) { - g2[arr[p2][0]] += querycnt; + if (querylen + 1 > len2[arr[p2][0]]) { + len2[arr[p2][0]] = querylen + 1; + cnt2[arr[p2][0]] = querycnt; + } else if (querylen + 1 == len2[arr[p2][0]]) { + cnt2[arr[p2][0]] += querycnt; } } for (int i = l; i <= p1; i++) { @@ -175,8 +175,8 @@ public static void prepare() { v[i] = lower(v[i]); } for (int i = 1; i <= n; i++) { - f1[i] = f2[i] = 1; - g1[i] = g2[i] = 1.0; + len1[i] = len2[i] = 1; + cnt1[i] = cnt2[i] = 1.0; } } @@ -192,12 +192,12 @@ public static void compute() { } cdq2(1, n); for (int l = 1, r = n; l < r; l++, r--) { - int a = f2[l]; - f2[l] = f2[r]; - f2[r] = a; - double b = g2[l]; - g2[l] = g2[r]; - g2[r] = b; + int a = len2[l]; + len2[l] = len2[r]; + len2[r] = a; + double b = cnt2[l]; + cnt2[l] = cnt2[r]; + cnt2[r] = b; } } @@ -214,19 +214,19 @@ public static void main(String[] args) throws IOException { int len = 0; double cnt = 0; for (int i = 1; i <= n; i++) { - len = Math.max(len, f1[i]); + len = Math.max(len, len1[i]); } for (int i = 1; i <= n; i++) { - if (f1[i] == len) { - cnt += g1[i]; + if (len1[i] == len) { + cnt += cnt1[i]; } } out.println(len); for (int i = 1; i <= n; i++) { - if (f1[i] + f2[i] - 1 < len) { + if (len1[i] + len2[i] - 1 < len) { out.print("0 "); } else { - out.printf("%.5f ", g1[i] * g2[i] / cnt); + out.printf("%.5f ", cnt1[i] * cnt2[i] / cnt); } } out.println(); diff --git a/src/class171/Code04_Interceptor2.java b/src/class171/Code04_Interceptor2.java index e5b3b2148..a97774069 100644 --- a/src/class171/Code04_Interceptor2.java +++ b/src/class171/Code04_Interceptor2.java @@ -32,11 +32,11 @@ //int treelen[MAXN]; //double treecnt[MAXN]; // -//int f1[MAXN]; -//double g1[MAXN]; +//int len1[MAXN]; +//double cnt1[MAXN]; // -//int f2[MAXN]; -//double g2[MAXN]; +//int len2[MAXN]; +//double cnt2[MAXN]; // //int lowbit(int i) { // return i & -i; @@ -91,14 +91,14 @@ // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { // while (p1 + 1 <= m && arr[p1 + 1].h >= arr[p2].h) { // p1++; -// add(s - arr[p1].v + 1, f1[arr[p1].i], g1[arr[p1].i]); +// add(s - arr[p1].v + 1, len1[arr[p1].i], cnt1[arr[p1].i]); // } // query(s - arr[p2].v + 1); -// if (querylen + 1 > f1[arr[p2].i]) { -// f1[arr[p2].i] = querylen + 1; -// g1[arr[p2].i] = querycnt; -// } else if (querylen + 1 == f1[arr[p2].i]) { -// g1[arr[p2].i] += querycnt; +// if (querylen + 1 > len1[arr[p2].i]) { +// len1[arr[p2].i] = querylen + 1; +// cnt1[arr[p2].i] = querycnt; +// } else if (querylen + 1 == len1[arr[p2].i]) { +// cnt1[arr[p2].i] += querycnt; // } // } // for (int i = l; i <= p1; i++) { @@ -128,14 +128,14 @@ // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { // while (p1 + 1 <= m && arr[p1 + 1].h <= arr[p2].h) { // p1++; -// add(arr[p1].v, f2[arr[p1].i], g2[arr[p1].i]); +// add(arr[p1].v, len2[arr[p1].i], cnt2[arr[p1].i]); // } // query(arr[p2].v); -// if (querylen + 1 > f2[arr[p2].i]) { -// f2[arr[p2].i] = querylen + 1; -// g2[arr[p2].i] = querycnt; -// } else if (querylen + 1 == f2[arr[p2].i]) { -// g2[arr[p2].i] += querycnt; +// if (querylen + 1 > len2[arr[p2].i]) { +// len2[arr[p2].i] = querylen + 1; +// cnt2[arr[p2].i] = querycnt; +// } else if (querylen + 1 == len2[arr[p2].i]) { +// cnt2[arr[p2].i] += querycnt; // } // } // for (int i = l; i <= p1; i++) { @@ -182,8 +182,8 @@ // v[i] = lower(v[i]); // } // for (int i = 1; i <= n; i++) { -// f1[i] = f2[i] = 1; -// g1[i] = g2[i] = 1.0; +// len1[i] = len2[i] = 1; +// cnt1[i] = cnt2[i] = 1.0; // } //} // @@ -195,8 +195,8 @@ // } // cdq2(1, n); // for (int l = 1, r = n; l < r; l++, r--) { -// swap(f2[l], f2[r]); -// swap(g2[l], g2[r]); +// swap(len2[l], len2[r]); +// swap(cnt2[l], cnt2[r]); // } //} // @@ -210,19 +210,19 @@ // int len = 0; // double cnt = 0.0; // for (int i = 1; i <= n; i++) { -// len = max(len, f1[i]); +// len = max(len, len1[i]); // } // for (int i = 1; i <= n; i++) { -// if (f1[i] == len) { -// cnt += g1[i]; +// if (len1[i] == len) { +// cnt += cnt1[i]; // } // } // printf("%d\n", len); // for (int i = 1; i <= n; i++) { -// if (f1[i] + f2[i] - 1 < len) { +// if (len1[i] + len2[i] - 1 < len) { // printf("0 "); // } else { -// printf("%.5f ", g1[i] * g2[i] / cnt); +// printf("%.5f ", cnt1[i] * cnt2[i] / cnt); // } // } // printf("\n"); From 655e60487953d23f990db569b3f5d59b74d869b6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Jun 2025 14:40:49 +0800 Subject: [PATCH 0235/1170] modify code --- src/class171/Code03_Sequence1.java | 31 ++++++++++------ src/class171/Code03_Sequence2.java | 59 ++++++++++++++++-------------- 2 files changed, 52 insertions(+), 38 deletions(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index 893eb5b91..2bd55e3bc 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -14,8 +14,11 @@ public class Code03_Sequence1 { public static int MAXN = 100001; public static int n, m; + public static int[] num = new int[MAXN]; + public static int[] lv = new int[MAXN]; + public static int[] rv = new int[MAXN]; - // 位置i、数值v、最小值min、最大值max + // 位置i、数值num、最小值lv、最大值rv public static int[][] arr = new int[MAXN][4]; public static int[] tree = new int[MAXN]; public static int[] dp = new int[MAXN]; @@ -48,6 +51,12 @@ public static void clear(int i) { } public static void merge(int l, int m, int r) { + for (int i = l; i <= r; i++) { + arr[i][0] = i; + arr[i][1] = num[i]; + arr[i][2] = lv[i]; + arr[i][3] = rv[i]; + } Arrays.sort(arr, l, m + 1, (a, b) -> a[1] - b[1]); Arrays.sort(arr, m + 1, r + 1, (a, b) -> a[2] - b[2]); int p1, p2; @@ -61,7 +70,6 @@ public static void merge(int l, int m, int r) { for (int i = l; i <= p1; i++) { clear(arr[i][3]); } - Arrays.sort(arr, l, r + 1, (a, b) -> a[0] - b[0]); } public static void cdq(int l, int r) { @@ -85,17 +93,18 @@ public static void main(String[] args) throws IOException { n = in.nextInt(); m = in.nextInt(); for (int i = 1; i <= n; i++) { - arr[i][0] = i; - arr[i][1] = in.nextInt(); - arr[i][2] = arr[i][1]; - arr[i][3] = arr[i][1]; - dp[i] = 1; + num[i] = in.nextInt(); + lv[i] = num[i]; + rv[i] = num[i]; } - for (int i = 1, idx, num; i <= m; i++) { + for (int i = 1, idx, val; i <= m; i++) { idx = in.nextInt(); - num = in.nextInt(); - arr[idx][2] = Math.min(arr[idx][2], num); - arr[idx][3] = Math.max(arr[idx][3], num); + val = in.nextInt(); + lv[idx] = Math.min(lv[idx], val); + rv[idx] = Math.max(rv[idx], val); + } + for (int i = 1; i <= n; i++) { + dp[i] = 1; } cdq(1, n); int ans = 0; diff --git a/src/class171/Code03_Sequence2.java b/src/class171/Code03_Sequence2.java index 16c3669ad..e8f9472b4 100644 --- a/src/class171/Code03_Sequence2.java +++ b/src/class171/Code03_Sequence2.java @@ -10,23 +10,22 @@ //using namespace std; // //struct Node { -// int i, v, min, max; +// int i, num, lv, rv; //}; // -//bool CmpI(Node a, Node b) { -// return a.i < b.i; +//bool CmpNum(Node a, Node b) { +// return a.num < b.num; //} // -//bool CmpV(Node a, Node b) { -// return a.v < b.v; -//} -// -//bool CmpMin(Node a, Node b) { -// return a.min < b.min; +//bool CmpLv(Node a, Node b) { +// return a.lv < b.lv; //} // //const int MAXN = 100001; //int n, m; +//int num[MAXN]; +//int lv[MAXN]; +//int rv[MAXN]; // //Node arr[MAXN]; //int tree[MAXN]; @@ -60,20 +59,25 @@ //} // //void merge(int l, int m, int r) { -// sort(arr + l, arr + m + 1, CmpV); -// sort(arr + m + 1, arr + r + 1, CmpMin); -// int p1 = l - 1, p2 = m + 1; -// for (; p2 <= r; p2++) { -// while (p1 + 1 <= m && arr[p1 + 1].v <= arr[p2].min) { +// for (int i = l; i <= r; i++) { +// arr[i].i = i; +// arr[i].num = num[i]; +// arr[i].lv = lv[i]; +// arr[i].rv = rv[i]; +// } +// sort(arr + l, arr + m + 1, CmpNum); +// sort(arr + m + 1, arr + r + 1, CmpLv); +// int p1, p2; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && arr[p1 + 1].num <= arr[p2].lv) { // p1++; -// more(arr[p1].max, dp[arr[p1].i]); +// more(arr[p1].rv, dp[arr[p1].i]); // } -// dp[arr[p2].i] = max(dp[arr[p2].i], query(arr[p2].v) + 1); +// dp[arr[p2].i] = max(dp[arr[p2].i], query(arr[p2].num) + 1); // } // for (int i = l; i <= p1; i++) { -// clear(arr[i].max); +// clear(arr[i].rv); // } -// sort(arr + l, arr + r + 1, CmpI); //} // //void cdq(int l, int r) { @@ -91,16 +95,17 @@ // cin.tie(nullptr); // cin >> n >> m; // for (int i = 1; i <= n; i++) { -// arr[i].i = i; -// cin >> arr[i].v; -// arr[i].min = arr[i].v; -// arr[i].max = arr[i].v; -// dp[i] = 1; +// cin >> num[i]; +// lv[i] = num[i]; +// rv[i] = num[i]; +// } +// for (int i = 1, idx, val; i <= m; i++) { +// cin >> idx >> val; +// lv[idx] = min(lv[idx], val); +// rv[idx] = max(rv[idx], val); // } -// for (int i = 1, idx, num; i <= m; i++) { -// cin >> idx >> num; -// arr[idx].min = min(arr[idx].min, num); -// arr[idx].max = max(arr[idx].max, num); +// for (int i = 1; i <= n; i++) { +// dp[i] = 1; // } // cdq(1, n); // int ans = 0; From 5ffe74a1e8fdaedd8be0ec406590a209f4c2e5c5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Jun 2025 14:47:01 +0800 Subject: [PATCH 0236/1170] modify code --- src/class171/Code03_Sequence1.java | 12 ++++++------ src/class171/Code03_Sequence2.java | 22 +++++++++++----------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index 2bd55e3bc..3339e48f4 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -14,11 +14,11 @@ public class Code03_Sequence1 { public static int MAXN = 100001; public static int n, m; - public static int[] num = new int[MAXN]; + public static int[] v = new int[MAXN]; public static int[] lv = new int[MAXN]; public static int[] rv = new int[MAXN]; - // 位置i、数值num、最小值lv、最大值rv + // 位置i、数值v、最小值lv、最大值rv public static int[][] arr = new int[MAXN][4]; public static int[] tree = new int[MAXN]; public static int[] dp = new int[MAXN]; @@ -53,7 +53,7 @@ public static void clear(int i) { public static void merge(int l, int m, int r) { for (int i = l; i <= r; i++) { arr[i][0] = i; - arr[i][1] = num[i]; + arr[i][1] = v[i]; arr[i][2] = lv[i]; arr[i][3] = rv[i]; } @@ -93,9 +93,9 @@ public static void main(String[] args) throws IOException { n = in.nextInt(); m = in.nextInt(); for (int i = 1; i <= n; i++) { - num[i] = in.nextInt(); - lv[i] = num[i]; - rv[i] = num[i]; + v[i] = in.nextInt(); + lv[i] = v[i]; + rv[i] = v[i]; } for (int i = 1, idx, val; i <= m; i++) { idx = in.nextInt(); diff --git a/src/class171/Code03_Sequence2.java b/src/class171/Code03_Sequence2.java index e8f9472b4..a830ec707 100644 --- a/src/class171/Code03_Sequence2.java +++ b/src/class171/Code03_Sequence2.java @@ -10,11 +10,11 @@ //using namespace std; // //struct Node { -// int i, num, lv, rv; +// int i, v, lv, rv; //}; // -//bool CmpNum(Node a, Node b) { -// return a.num < b.num; +//bool CmpV(Node a, Node b) { +// return a.v < b.v; //} // //bool CmpLv(Node a, Node b) { @@ -23,7 +23,7 @@ // //const int MAXN = 100001; //int n, m; -//int num[MAXN]; +//int v[MAXN]; //int lv[MAXN]; //int rv[MAXN]; // @@ -61,19 +61,19 @@ //void merge(int l, int m, int r) { // for (int i = l; i <= r; i++) { // arr[i].i = i; -// arr[i].num = num[i]; +// arr[i].v = v[i]; // arr[i].lv = lv[i]; // arr[i].rv = rv[i]; // } -// sort(arr + l, arr + m + 1, CmpNum); +// sort(arr + l, arr + m + 1, CmpV); // sort(arr + m + 1, arr + r + 1, CmpLv); // int p1, p2; // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { -// while (p1 + 1 <= m && arr[p1 + 1].num <= arr[p2].lv) { +// while (p1 + 1 <= m && arr[p1 + 1].v <= arr[p2].lv) { // p1++; // more(arr[p1].rv, dp[arr[p1].i]); // } -// dp[arr[p2].i] = max(dp[arr[p2].i], query(arr[p2].num) + 1); +// dp[arr[p2].i] = max(dp[arr[p2].i], query(arr[p2].v) + 1); // } // for (int i = l; i <= p1; i++) { // clear(arr[i].rv); @@ -95,9 +95,9 @@ // cin.tie(nullptr); // cin >> n >> m; // for (int i = 1; i <= n; i++) { -// cin >> num[i]; -// lv[i] = num[i]; -// rv[i] = num[i]; +// cin >> v[i]; +// lv[i] = v[i]; +// rv[i] = v[i]; // } // for (int i = 1, idx, val; i <= m; i++) { // cin >> idx >> val; From 0946188fcc9cd28d06222efcac2ec7aa9ada372b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Jun 2025 17:58:45 +0800 Subject: [PATCH 0237/1170] modify code --- src/class171/Code05_Theresa1.java | 284 ++++++++++++++++++++++++++++++ src/class171/Code05_Theresa2.java | 192 ++++++++++++++++++++ 2 files changed, 476 insertions(+) create mode 100644 src/class171/Code05_Theresa1.java create mode 100644 src/class171/Code05_Theresa2.java diff --git a/src/class171/Code05_Theresa1.java b/src/class171/Code05_Theresa1.java new file mode 100644 index 000000000..d79d3e178 --- /dev/null +++ b/src/class171/Code05_Theresa1.java @@ -0,0 +1,284 @@ +package class171; + +// 德丽莎世界第一可爱,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5621 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是有两个测试用例超时 +// 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code05_Theresa2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code05_Theresa1 { + + public static class Node { + int a, b, c, d; + int i; + long v; + boolean left; + + public Node(int a_, int b_, int c_, int d_, long v_) { + a = a_; + b = b_; + c = c_; + d = d_; + v = v_; + } + } + + public static class CmpAbcdv implements Comparator { + @Override + public int compare(Node x, Node y) { + if (x.a != y.a) { + return x.a - y.a; + } + if (x.b != y.b) { + return x.b - y.b; + } + if (x.c != y.c) { + return x.c - y.c; + } + if (x.d != y.d) { + return x.d - y.d; + } + return Long.compare(y.v, x.v); + } + } + + public static class CmpB implements Comparator { + @Override + public int compare(Node x, Node y) { + return x.b - y.b; + } + } + + public static class CmpC implements Comparator { + @Override + public int compare(Node x, Node y) { + return x.c - y.c; + } + } + + public static CmpAbcdv cmpAbcdv = new CmpAbcdv(); + public static CmpB cmpB = new CmpB(); + public static CmpC cmpC = new CmpC(); + + public static int MAXN = 100001; + public static int n, s; + public static long INF = 1000000000000000001L; + + public static Node[] arr = new Node[MAXN]; + public static int[] abcd = new int[MAXN << 2]; + + public static Node[] tmp1 = new Node[MAXN]; + public static Node[] tmp2 = new Node[MAXN]; + + public static long[] tree = new long[MAXN << 2]; + public static long[] dp = new long[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void more(int i, long num) { + while (i <= s) { + tree[i] = Math.max(tree[i], num); + i += lowbit(i); + } + } + + public static long query(int i) { + long ret = -INF; + while (i > 0) { + ret = Math.max(ret, tree[i]); + i -= lowbit(i); + } + return ret; + } + + public static void clear(int i) { + while (i <= s) { + tree[i] = -INF; + i += lowbit(i); + } + } + + public static void merge(int l, int m, int r) { + for (int i = l; i <= r; i++) { + tmp2[i] = tmp1[i]; + } + Arrays.sort(tmp2, l, m + 1, cmpC); + Arrays.sort(tmp2, m + 1, r + 1, cmpC); + int p1, p2; + for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + while (p1 + 1 <= m && tmp2[p1 + 1].c <= tmp2[p2].c) { + p1++; + if (tmp2[p1].left) { + more(tmp2[p1].d, dp[tmp2[p1].i]); + } + } + if (!tmp2[p2].left) { + dp[tmp2[p2].i] = Math.max(dp[tmp2[p2].i], query(tmp2[p2].d) + tmp2[p2].v); + } + } + for (int i = l; i <= p1; i++) { + if (tmp2[i].left) { + clear(tmp2[i].d); + } + } + } + + public static void cdq2(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + cdq2(l, mid); + merge(l, mid, r); + cdq2(mid + 1, r); + } + + public static void cdq1(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + cdq1(l, mid); + for (int i = l; i <= r; i++) { + tmp1[i] = arr[i]; + tmp1[i].left = i <= mid; + } + Arrays.sort(tmp1, l, r + 1, cmpB); + cdq2(l, r); + cdq1(mid + 1, r); + } + + public static int lower(long num) { + int l = 1, r = s, m, ans = 1; + while (l <= r) { + m = (l + r) / 2; + if (abcd[m] >= num) { + ans = m; + r = m - 1; + } else { + l = m + 1; + } + } + return ans; + } + + public static void prepare() { + // a、b、c、d离散化 + for (int i = 1; i <= n; i++) { + abcd[++s] = arr[i].a; + abcd[++s] = arr[i].b; + abcd[++s] = arr[i].c; + abcd[++s] = arr[i].d; + } + Arrays.sort(abcd, 1, s + 1); + int m = 1; + for (int i = 2; i <= s; i++) { + if (abcd[m] != abcd[i]) { + abcd[++m] = abcd[i]; + } + } + s = m; + for (int i = 1; i <= n; i++) { + arr[i].a = lower(arr[i].a); + arr[i].b = lower(arr[i].b); + arr[i].c = lower(arr[i].c); + arr[i].d = lower(arr[i].d); + } + // 合并a、b、c、d都相等的对象成为一组对象 + Arrays.sort(arr, 1, n + 1, cmpAbcdv); + m = 1; + for (int i = 2; i <= n; i++) { + if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && arr[m].c == arr[i].c && arr[m].d == arr[i].d) { + if (arr[i].v > 0) { + arr[m].v += arr[i].v; + } + } else { + arr[++m] = arr[i]; + } + } + n = m; + // 设置组号i、dp初始值 + for (int i = 1; i <= n; i++) { + arr[i].i = i; + dp[i] = arr[i].v; + } + // 初始化树状数组 + for (int i = 1; i <= s; i++) { + tree[i] = -INF; + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, a, b, c, d, v; i <= n; i++) { + a = in.nextInt(); + b = in.nextInt(); + c = in.nextInt(); + d = in.nextInt(); + v = in.nextInt(); + arr[i] = new Node(a, b, c, d, v); + } + prepare(); + cdq1(1, n); + long ans = -INF; + for (int i = 1; i <= n; i++) { + ans = Math.max(ans, dp[i]); + } + out.println(ans); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class171/Code05_Theresa2.java b/src/class171/Code05_Theresa2.java new file mode 100644 index 000000000..66fb8954c --- /dev/null +++ b/src/class171/Code05_Theresa2.java @@ -0,0 +1,192 @@ +package class171; + +// 德丽莎世界第一可爱,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5621 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int a, b, c, d; +// long long v; +// int i; +// bool left; +//}; +// +//bool CmpAbcdv(Node x, Node y) { +// if (x.a != y.a) return x.a < y.a; +// if (x.b != y.b) return x.b < y.b; +// if (x.c != y.c) return x.c < y.c; +// if (x.d != y.d) return x.d < y.d; +// return x.v > y.v; +//} +// +//bool CmpB(Node x, Node y) { +// return x.b < y.b; +//} +// +//bool CmpC(Node x, Node y) { +// return x.c < y.c; +//} +// +//const int MAXN = 100001; +//const long long INF = 1e18 + 1; +//int n, s; +// +//Node arr[MAXN]; +//int abcd[MAXN << 2]; +// +//Node tmp1[MAXN]; +//Node tmp2[MAXN]; +//long long tree[MAXN << 2]; +//long long dp[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void more(int i, long long num) { +// while (i <= s) { +// tree[i] = max(tree[i], num); +// i += lowbit(i); +// } +//} +// +//long long query(int i) { +// long long ret = -INF; +// while (i > 0) { +// ret = max(ret, tree[i]); +// i -= lowbit(i); +// } +// return ret; +//} +// +//void clear(int i) { +// while (i <= s) { +// tree[i] = -INF; +// i += lowbit(i); +// } +//} +// +//void merge(int l, int m, int r) { +// for (int i = l; i <= r; i++) { +// tmp2[i] = tmp1[i]; +// } +// sort(tmp2 + l, tmp2 + m + 1, CmpC); +// sort(tmp2 + m + 1, tmp2 + r + 1, CmpC); +// int p1, p2; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && tmp2[p1 + 1].c <= tmp2[p2].c) { +// p1++; +// if (tmp2[p1].left) { +// more(tmp2[p1].d, dp[tmp2[p1].i]); +// } +// } +// if (!tmp2[p2].left) { +// dp[tmp2[p2].i] = max(dp[tmp2[p2].i], query(tmp2[p2].d) + tmp2[p2].v); +// } +// } +// for (int i = l; i <= p1; i++) { +// if (tmp2[i].left) { +// clear(tmp2[i].d); +// } +// } +//} +// +//void cdq2(int l, int r) { +// if (l == r) return; +// int mid = (l + r) / 2; +// cdq2(l, mid); +// merge(l, mid, r); +// cdq2(mid + 1, r); +//} +// +//void cdq1(int l, int r) { +// if (l == r) return; +// int mid = (l + r) / 2; +// cdq1(l, mid); +// for (int i = l; i <= r; i++) { +// tmp1[i] = arr[i]; +// tmp1[i].left = i <= mid; +// } +// sort(tmp1 + l, tmp1 + r + 1, CmpB); +// cdq2(l, r); +// cdq1(mid + 1, r); +//} +// +//int lower(long long num) { +// int l = 1, r = s, ans = 1; +// while (l <= r) { +// int m = (l + r) / 2; +// if (abcd[m] >= num) { +// ans = m; +// r = m - 1; +// } else { +// l = m + 1; +// } +// } +// return ans; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// abcd[++s] = arr[i].a; +// abcd[++s] = arr[i].b; +// abcd[++s] = arr[i].c; +// abcd[++s] = arr[i].d; +// } +// sort(abcd + 1, abcd + s + 1); +// int m = 1; +// for (int i = 2; i <= s; i++) { +// if (abcd[m] != abcd[i]) { +// abcd[++m] = abcd[i]; +// } +// } +// s = m; +// for (int i = 1; i <= n; i++) { +// arr[i].a = lower(arr[i].a); +// arr[i].b = lower(arr[i].b); +// arr[i].c = lower(arr[i].c); +// arr[i].d = lower(arr[i].d); +// } +// sort(arr + 1, arr + n + 1, CmpAbcdv); +// m = 1; +// for (int i = 2; i <= n; i++) { +// if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && +// arr[m].c == arr[i].c && arr[m].d == arr[i].d) { +// if (arr[i].v > 0) { +// arr[m].v += arr[i].v; +// } +// } else { +// arr[++m] = arr[i]; +// } +// } +// n = m; +// for (int i = 1; i <= n; i++) { +// arr[i].i = i; +// dp[i] = arr[i].v; +// } +// for (int i = 1; i <= s; i++) { +// tree[i] = -INF; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i].a >> arr[i].b >> arr[i].c >> arr[i].d >> arr[i].v; +// } +// prepare(); +// cdq1(1, n); +// long long ans = -INF; +// for (int i = 1; i <= n; i++) { +// ans = max(ans, dp[i]); +// } +// cout << ans << '\n'; +// return 0; +//} \ No newline at end of file From 17cad14a06d69c4f8faa28fd0139bfa439dac39a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Jun 2025 18:13:18 +0800 Subject: [PATCH 0238/1170] modify code --- src/class171/{Code05_Theresa1.java => Code05_Cute1.java} | 4 ++-- src/class171/{Code05_Theresa2.java => Code05_Cute2.java} | 0 src/class171/Code06_Treasure1.java | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) rename src/class171/{Code05_Theresa1.java => Code05_Cute1.java} (98%) rename src/class171/{Code05_Theresa2.java => Code05_Cute2.java} (100%) create mode 100644 src/class171/Code06_Treasure1.java diff --git a/src/class171/Code05_Theresa1.java b/src/class171/Code05_Cute1.java similarity index 98% rename from src/class171/Code05_Theresa1.java rename to src/class171/Code05_Cute1.java index d79d3e178..678bb4a54 100644 --- a/src/class171/Code05_Theresa1.java +++ b/src/class171/Code05_Cute1.java @@ -5,7 +5,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是有两个测试用例超时 // 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 -// 想通过用C++实现,本节课Code05_Theresa2文件就是C++的实现 +// 想通过用C++实现,本节课Code05_Cute2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -15,7 +15,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code05_Theresa1 { +public class Code05_Cute1 { public static class Node { int a, b, c, d; diff --git a/src/class171/Code05_Theresa2.java b/src/class171/Code05_Cute2.java similarity index 100% rename from src/class171/Code05_Theresa2.java rename to src/class171/Code05_Cute2.java diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java new file mode 100644 index 000000000..f75412060 --- /dev/null +++ b/src/class171/Code06_Treasure1.java @@ -0,0 +1,9 @@ +package class171; + +// 寻找宝藏,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4849 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code06_Treasure1 { + +} From b52dacf9fb0a8cfbe71f1a5e73d9e0325af0705b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Jun 2025 21:31:34 +0800 Subject: [PATCH 0239/1170] modify code --- src/class171/Code05_Cute1.java | 55 ++--- src/class171/Code05_Cute2.java | 37 ++-- src/class171/Code06_Treasure1.java | 310 +++++++++++++++++++++++++++++ src/class171/Code06_Treasure2.java | 223 +++++++++++++++++++++ 4 files changed, 582 insertions(+), 43 deletions(-) create mode 100644 src/class171/Code06_Treasure2.java diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index 678bb4a54..0f8cfaef9 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -54,14 +54,32 @@ public int compare(Node x, Node y) { public static class CmpB implements Comparator { @Override public int compare(Node x, Node y) { - return x.b - y.b; + if (x.b != y.b) { + return x.b - y.b; + } + if (x.c != y.c) { + return x.c - y.c; + } + if (x.d != y.d) { + return x.d - y.d; + } + return x.a - y.a; } } public static class CmpC implements Comparator { @Override public int compare(Node x, Node y) { - return x.c - y.c; + if (x.c != y.c) { + return x.c - y.c; + } + if (x.d != y.d) { + return x.d - y.d; + } + if (x.a != y.a) { + return x.a - y.a; + } + return x.b - y.b; } } @@ -70,16 +88,16 @@ public int compare(Node x, Node y) { public static CmpC cmpC = new CmpC(); public static int MAXN = 100001; + public static long INF = (long) (1e18 + 1); public static int n, s; - public static long INF = 1000000000000000001L; public static Node[] arr = new Node[MAXN]; - public static int[] abcd = new int[MAXN << 2]; + public static int[] sortd = new int[MAXN]; public static Node[] tmp1 = new Node[MAXN]; public static Node[] tmp2 = new Node[MAXN]; - public static long[] tree = new long[MAXN << 2]; + public static long[] tree = new long[MAXN]; public static long[] dp = new long[MAXN]; public static int lowbit(int i) { @@ -163,7 +181,7 @@ public static int lower(long num) { int l = 1, r = s, m, ans = 1; while (l <= r) { m = (l + r) / 2; - if (abcd[m] >= num) { + if (sortd[m] >= num) { ans = m; r = m - 1; } else { @@ -174,30 +192,21 @@ public static int lower(long num) { } public static void prepare() { - // a、b、c、d离散化 for (int i = 1; i <= n; i++) { - abcd[++s] = arr[i].a; - abcd[++s] = arr[i].b; - abcd[++s] = arr[i].c; - abcd[++s] = arr[i].d; + sortd[i] = arr[i].d; } - Arrays.sort(abcd, 1, s + 1); - int m = 1; - for (int i = 2; i <= s; i++) { - if (abcd[m] != abcd[i]) { - abcd[++m] = abcd[i]; + Arrays.sort(sortd, 1, n + 1); + s = 1; + for (int i = 2; i <= n; i++) { + if (sortd[s] != sortd[i]) { + sortd[++s] = sortd[i]; } } - s = m; for (int i = 1; i <= n; i++) { - arr[i].a = lower(arr[i].a); - arr[i].b = lower(arr[i].b); - arr[i].c = lower(arr[i].c); arr[i].d = lower(arr[i].d); } - // 合并a、b、c、d都相等的对象成为一组对象 Arrays.sort(arr, 1, n + 1, cmpAbcdv); - m = 1; + int m = 1; for (int i = 2; i <= n; i++) { if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && arr[m].c == arr[i].c && arr[m].d == arr[i].d) { if (arr[i].v > 0) { @@ -208,12 +217,10 @@ public static void prepare() { } } n = m; - // 设置组号i、dp初始值 for (int i = 1; i <= n; i++) { arr[i].i = i; dp[i] = arr[i].v; } - // 初始化树状数组 for (int i = 1; i <= s; i++) { tree[i] = -INF; } diff --git a/src/class171/Code05_Cute2.java b/src/class171/Code05_Cute2.java index 66fb8954c..40f1054ab 100644 --- a/src/class171/Code05_Cute2.java +++ b/src/class171/Code05_Cute2.java @@ -25,11 +25,17 @@ //} // //bool CmpB(Node x, Node y) { -// return x.b < y.b; +// if (x.b != y.b) return x.b < y.b; +// if (x.c != y.c) return x.c < y.c; +// if (x.d != y.d) return x.d < y.d; +// return x.a < y.a; //} // //bool CmpC(Node x, Node y) { -// return x.c < y.c; +// if (x.c != y.c) return x.c < y.c; +// if (x.d != y.d) return x.d < y.d; +// if (x.a != y.a) return x.a < y.a; +// return x.b < y.b; //} // //const int MAXN = 100001; @@ -37,11 +43,11 @@ //int n, s; // //Node arr[MAXN]; -//int abcd[MAXN << 2]; +//int sortd[MAXN]; // //Node tmp1[MAXN]; //Node tmp2[MAXN]; -//long long tree[MAXN << 2]; +//long long tree[MAXN]; //long long dp[MAXN]; // //int lowbit(int i) { @@ -121,7 +127,7 @@ // int l = 1, r = s, ans = 1; // while (l <= r) { // int m = (l + r) / 2; -// if (abcd[m] >= num) { +// if (sortd[m] >= num) { // ans = m; // r = m - 1; // } else { @@ -133,27 +139,20 @@ // //void prepare() { // for (int i = 1; i <= n; i++) { -// abcd[++s] = arr[i].a; -// abcd[++s] = arr[i].b; -// abcd[++s] = arr[i].c; -// abcd[++s] = arr[i].d; +// sortd[i] = arr[i].d; // } -// sort(abcd + 1, abcd + s + 1); -// int m = 1; -// for (int i = 2; i <= s; i++) { -// if (abcd[m] != abcd[i]) { -// abcd[++m] = abcd[i]; +// sort(sortd + 1, sortd + n + 1); +// s = 1; +// for (int i = 2; i <= n; i++) { +// if (sortd[s] != sortd[i]) { +// sortd[++s] = sortd[i]; // } // } -// s = m; // for (int i = 1; i <= n; i++) { -// arr[i].a = lower(arr[i].a); -// arr[i].b = lower(arr[i].b); -// arr[i].c = lower(arr[i].c); // arr[i].d = lower(arr[i].d); // } // sort(arr + 1, arr + n + 1, CmpAbcdv); -// m = 1; +// int m = 1; // for (int i = 2; i <= n; i++) { // if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && // arr[m].c == arr[i].c && arr[m].d == arr[i].d) { diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index f75412060..25808b928 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -4,6 +4,316 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4849 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + public class Code06_Treasure1 { + public static int MAXN = 80001; + public static long INF = (long) (1e18 + 1); + public static int MOD = 998244353; + + public static class Node { + int a, b, c, d; + int i; + long v; + boolean left; + + public Node(int a_, int b_, int c_, int d_, long v_) { + a = a_; + b = b_; + c = c_; + d = d_; + v = v_; + } + } + + public static class CmpAbcdv implements Comparator { + @Override + public int compare(Node x, Node y) { + if (x.a != y.a) { + return x.a - y.a; + } + if (x.b != y.b) { + return x.b - y.b; + } + if (x.c != y.c) { + return x.c - y.c; + } + if (x.d != y.d) { + return x.d - y.d; + } + return Long.compare(y.v, x.v); + } + } + + public static class CmpB implements Comparator { + @Override + public int compare(Node x, Node y) { + if (x.b != y.b) { + return x.b - y.b; + } + if (x.c != y.c) { + return x.c - y.c; + } + if (x.d != y.d) { + return x.d - y.d; + } + return x.a - y.a; + } + } + + public static class CmpC implements Comparator { + @Override + public int compare(Node x, Node y) { + if (x.c != y.c) { + return x.c - y.c; + } + if (x.d != y.d) { + return x.d - y.d; + } + if (x.a != y.a) { + return x.a - y.a; + } + return x.b - y.b; + } + } + + public static CmpAbcdv cmpAbcdv = new CmpAbcdv(); + public static CmpB cmpB = new CmpB(); + public static CmpC cmpC = new CmpC(); + + public static int n, s; + public static Node[] arr = new Node[MAXN]; + public static Node[] tmp1 = new Node[MAXN]; + public static Node[] tmp2 = new Node[MAXN]; + public static int[] sortd = new int[MAXN]; + + public static long[] treeVal = new long[MAXN]; + public static int[] treeCnt = new int[MAXN]; + + public static long[] dp = new long[MAXN]; + public static int[] cnt = new int[MAXN]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, long v, int c) { + while (i <= s) { + if (v > treeVal[i]) { + treeVal[i] = v; + treeCnt[i] = c % MOD; + } else if (v == treeVal[i]) { + treeCnt[i] = (treeCnt[i] + c) % MOD; + } + i += lowbit(i); + } + } + + public static long queryVal; + public static int queryCnt; + + public static void query(int i) { + queryVal = -INF; + queryCnt = 0; + while (i > 0) { + if (treeVal[i] > queryVal) { + queryVal = treeVal[i]; + queryCnt = treeCnt[i]; + } else if (treeVal[i] == queryVal) { + queryCnt = (queryCnt + treeCnt[i]) % MOD; + } + i -= lowbit(i); + } + } + + public static void clear(int i) { + while (i <= s) { + treeVal[i] = -INF; + treeCnt[i] = 0; + i += lowbit(i); + } + } + + public static void merge(int l, int mid, int r) { + for (int i = l; i <= r; i++) { + tmp2[i] = tmp1[i]; + } + Arrays.sort(tmp2, l, mid + 1, cmpC); + Arrays.sort(tmp2, mid + 1, r + 1, cmpC); + int p1, p2, id; + for (p1 = l - 1, p2 = mid + 1; p2 <= r; p2++) { + while (p1 + 1 <= mid && tmp2[p1 + 1].c <= tmp2[p2].c) { + p1++; + if (tmp2[p1].left) { + add(tmp2[p1].d, dp[tmp2[p1].i], cnt[tmp2[p1].i]); + } + } + if (!tmp2[p2].left) { + query(tmp2[p2].d); + id = tmp2[p2].i; + if (queryVal + tmp2[p2].v > dp[id]) { + dp[id] = queryVal + tmp2[p2].v; + cnt[id] = queryCnt; + } else if (queryVal + tmp2[p2].v == dp[id]) { + cnt[id] = (cnt[id] + queryCnt) % MOD; + } + } + } + for (int i = l; i <= p1; i++) { + if (tmp2[i].left) { + clear(tmp2[i].d); + } + } + } + + public static void cdq2(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + cdq2(l, mid); + merge(l, mid, r); + cdq2(mid + 1, r); + } + + public static void cdq1(int l, int r) { + if (l == r) { + return; + } + int mid = (l + r) / 2; + cdq1(l, mid); + for (int i = l; i <= r; i++) { + tmp1[i] = arr[i]; + tmp1[i].left = (i <= mid); + } + Arrays.sort(tmp1, l, r + 1, cmpB); + cdq2(l, r); + cdq1(mid + 1, r); + } + + public static int lower(int x) { + int l = 1, r = s, ans = 1; + while (l <= r) { + int mid = (l + r) / 2; + if (sortd[mid] >= x) { + ans = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + return ans; + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sortd[i] = arr[i].d; + } + Arrays.sort(sortd, 1, n + 1); + s = 1; + for (int i = 2; i <= n; i++) { + if (sortd[s] != sortd[i]) { + sortd[++s] = sortd[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i].d = lower(arr[i].d); + } + Arrays.sort(arr, 1, n + 1, cmpAbcdv); + int m = 1; + for (int i = 2; i <= n; i++) { + if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && arr[m].c == arr[i].c && arr[m].d == arr[i].d) { + arr[m].v += arr[i].v; + } else { + arr[++m] = arr[i]; + } + } + n = m; + for (int i = 1; i <= n; i++) { + arr[i].i = i; + dp[i] = arr[i].v; + cnt[i] = 1; + } + for (int i = 1; i <= s; i++) { + treeVal[i] = -INF; + treeCnt[i] = 0; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + in.nextInt(); + for (int i = 1, a, b, c, d, v; i <= n; i++) { + a = in.nextInt(); + b = in.nextInt(); + c = in.nextInt(); + d = in.nextInt(); + v = in.nextInt(); + arr[i] = new Node(a, b, c, d, v); + } + prepare(); + cdq1(1, n); + long best = 0; + int ways = 0; + for (int i = 1; i <= n; i++) { + best = Math.max(best, dp[i]); + } + for (int i = 1; i <= n; i++) { + if (dp[i] == best) { + ways = (ways + cnt[i]) % MOD; + } + } + out.println(best); + out.println(ways % MOD); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 12]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class171/Code06_Treasure2.java b/src/class171/Code06_Treasure2.java new file mode 100644 index 000000000..e78c4f559 --- /dev/null +++ b/src/class171/Code06_Treasure2.java @@ -0,0 +1,223 @@ +package class171; + +// 寻找宝藏,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4849 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int a, b, c, d; +// long long v; +// int i; +// bool left; +//}; +// +//bool CmpAbcdv(Node x, Node y) { +// if (x.a != y.a) return x.a < y.a; +// if (x.b != y.b) return x.b < y.b; +// if (x.c != y.c) return x.c < y.c; +// if (x.d != y.d) return x.d < y.d; +// return x.v > y.v; +//} +// +//bool CmpB(Node x, Node y) { +// if (x.b != y.b) return x.b < y.b; +// if (x.c != y.c) return x.c < y.c; +// if (x.d != y.d) return x.d < y.d; +// return x.a < y.a; +//} +// +//bool CmpC(Node x, Node y) { +// if (x.c != y.c) return x.c < y.c; +// if (x.d != y.d) return x.d < y.d; +// if (x.a != y.a) return x.a < y.a; +// return x.b < y.b; +//} +// +//const int MAXN = 80001; +//const long long INF = 1e18 + 1; +//const int MOD = 998244353; +//int n, s; +// +//Node arr[MAXN]; +//Node tmp1[MAXN]; +//Node tmp2[MAXN]; +//int sortd[MAXN]; +// +//long long treeVal[MAXN]; +//int treeCnt[MAXN]; +// +//long long dp[MAXN]; +//int cnt[MAXN]; +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, long long v, int c) { +// while (i <= s) { +// if (v > treeVal[i]) { +// treeVal[i] = v; +// treeCnt[i] = c % MOD; +// } else if (v == treeVal[i]) { +// treeCnt[i] = (treeCnt[i] + c) % MOD; +// } +// i += lowbit(i); +// } +//} +// +//long long queryVal; +//int queryCnt; +// +//void query(int i) { +// queryVal = -INF; +// queryCnt = 0; +// while (i > 0) { +// if (treeVal[i] > queryVal) { +// queryVal = treeVal[i]; +// queryCnt = treeCnt[i]; +// } else if (treeVal[i] == queryVal) { +// queryCnt = (queryCnt + treeCnt[i]) % MOD; +// } +// i -= lowbit(i); +// } +//} +// +//void clear(int i) { +// while (i <= s) { +// treeVal[i] = -INF; +// treeCnt[i] = 0; +// i += lowbit(i); +// } +//} +// +//void merge(int l, int m, int r) { +// for (int i = l; i <= r; i++) { +// tmp2[i] = tmp1[i]; +// } +// sort(tmp2 + l, tmp2 + m + 1, CmpC); +// sort(tmp2 + m + 1, tmp2 + r + 1, CmpC); +// int p1, p2, id; +// for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { +// while (p1 + 1 <= m && tmp2[p1 + 1].c <= tmp2[p2].c) { +// p1++; +// if (tmp2[p1].left) { +// add(tmp2[p1].d, dp[tmp2[p1].i], cnt[tmp2[p1].i]); +// } +// } +// if (!tmp2[p2].left) { +// query(tmp2[p2].d); +// id = tmp2[p2].i; +// if (queryVal + tmp2[p2].v > dp[id]) { +// dp[id] = queryVal + tmp2[p2].v; +// cnt[id] = queryCnt; +// } else if (queryVal + tmp2[p2].v == dp[id]) { +// cnt[id] = (cnt[id] + queryCnt) % MOD; +// } +// } +// } +// for (int i = l; i <= p1; i++) { +// if (tmp2[i].left) { +// clear(tmp2[i].d); +// } +// } +//} +// +//void cdq2(int l, int r) { +// if (l == r) return; +// int mid = (l + r) / 2; +// cdq2(l, mid); +// merge(l, mid, r); +// cdq2(mid + 1, r); +//} +// +//void cdq1(int l, int r) { +// if (l == r) return; +// int mid = (l + r) / 2; +// cdq1(l, mid); +// for (int i = l; i <= r; i++) { +// tmp1[i] = arr[i]; +// tmp1[i].left = (i <= mid); +// } +// sort(tmp1 + l, tmp1 + r + 1, CmpB); +// cdq2(l, r); +// cdq1(mid + 1, r); +//} +// +//int lower(int num) { +// int l = 1, r = s, ans = 1; +// while (l <= r) { +// int mid = (l + r) / 2; +// if (sortd[mid] >= num) { +// ans = mid; +// r = mid - 1; +// } else { +// l = mid + 1; +// } +// } +// return ans; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sortd[i] = arr[i].d; +// } +// sort(sortd + 1, sortd + n + 1); +// s = 1; +// for (int i = 2; i <= n; i++) { +// if (sortd[s] != sortd[i]) { +// sortd[++s] = sortd[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i].d = lower(arr[i].d); +// } +// sort(arr + 1, arr + n + 1, CmpAbcdv); +// int m = 1; +// for (int i = 2; i <= n; i++) { +// if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && +// arr[m].c == arr[i].c && arr[m].d == arr[i].d) { +// arr[m].v += arr[i].v; +// } else { +// arr[++m] = arr[i]; +// } +// } +// n = m; +// for (int i = 1; i <= n; i++) { +// arr[i].i = i; +// dp[i] = arr[i].v; +// cnt[i] = 1; +// } +// for (int i = 1; i <= s; i++) { +// treeVal[i] = -INF; +// treeCnt[i] = 0; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int m; +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i].a >> arr[i].b >> arr[i].c >> arr[i].d >> arr[i].v; +// } +// prepare(); +// cdq1(1, n); +// long long best = 0; +// int ways = 0; +// for (int i = 1; i <= n; i++) { +// best = max(best, dp[i]); +// } +// for (int i = 1; i <= n; i++) { +// if (dp[i] == best) { +// ways = (ways + cnt[i]) % MOD; +// } +// } +// cout << best << '\n' << ways << '\n'; +// return 0; +//} \ No newline at end of file From 4d7870926608033a31899b838f0101079cb9fdd6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Jun 2025 12:04:27 +0800 Subject: [PATCH 0240/1170] modify code --- src/class171/Code05_Cute1.java | 20 ++++++++++---------- src/class171/Code05_Cute2.java | 14 +++++++------- src/class171/Code06_Treasure1.java | 22 +++++++++++----------- src/class171/Code06_Treasure2.java | 17 +++++++++-------- 4 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index 0f8cfaef9..5b985315b 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -32,7 +32,7 @@ public Node(int a_, int b_, int c_, int d_, long v_) { } } - public static class CmpAbcdv implements Comparator { + public static class Cmp1 implements Comparator { @Override public int compare(Node x, Node y) { if (x.a != y.a) { @@ -51,7 +51,7 @@ public int compare(Node x, Node y) { } } - public static class CmpB implements Comparator { + public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { if (x.b != y.b) { @@ -67,7 +67,7 @@ public int compare(Node x, Node y) { } } - public static class CmpC implements Comparator { + public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { if (x.c != y.c) { @@ -83,9 +83,9 @@ public int compare(Node x, Node y) { } } - public static CmpAbcdv cmpAbcdv = new CmpAbcdv(); - public static CmpB cmpB = new CmpB(); - public static CmpC cmpC = new CmpC(); + public static Cmp1 cmp1 = new Cmp1(); + public static Cmp2 cmp2 = new Cmp2(); + public static Cmp3 cmp3 = new Cmp3(); public static int MAXN = 100001; public static long INF = (long) (1e18 + 1); @@ -131,8 +131,8 @@ public static void merge(int l, int m, int r) { for (int i = l; i <= r; i++) { tmp2[i] = tmp1[i]; } - Arrays.sort(tmp2, l, m + 1, cmpC); - Arrays.sort(tmp2, m + 1, r + 1, cmpC); + Arrays.sort(tmp2, l, m + 1, cmp3); + Arrays.sort(tmp2, m + 1, r + 1, cmp3); int p1, p2; for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && tmp2[p1 + 1].c <= tmp2[p2].c) { @@ -172,7 +172,7 @@ public static void cdq1(int l, int r) { tmp1[i] = arr[i]; tmp1[i].left = i <= mid; } - Arrays.sort(tmp1, l, r + 1, cmpB); + Arrays.sort(tmp1, l, r + 1, cmp2); cdq2(l, r); cdq1(mid + 1, r); } @@ -205,7 +205,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { arr[i].d = lower(arr[i].d); } - Arrays.sort(arr, 1, n + 1, cmpAbcdv); + Arrays.sort(arr, 1, n + 1, cmp1); int m = 1; for (int i = 2; i <= n; i++) { if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && arr[m].c == arr[i].c && arr[m].d == arr[i].d) { diff --git a/src/class171/Code05_Cute2.java b/src/class171/Code05_Cute2.java index 40f1054ab..92286cf41 100644 --- a/src/class171/Code05_Cute2.java +++ b/src/class171/Code05_Cute2.java @@ -16,7 +16,7 @@ // bool left; //}; // -//bool CmpAbcdv(Node x, Node y) { +//bool Cmp1(Node x, Node y) { // if (x.a != y.a) return x.a < y.a; // if (x.b != y.b) return x.b < y.b; // if (x.c != y.c) return x.c < y.c; @@ -24,14 +24,14 @@ // return x.v > y.v; //} // -//bool CmpB(Node x, Node y) { +//bool Cmp2(Node x, Node y) { // if (x.b != y.b) return x.b < y.b; // if (x.c != y.c) return x.c < y.c; // if (x.d != y.d) return x.d < y.d; // return x.a < y.a; //} // -//bool CmpC(Node x, Node y) { +//bool Cmp3(Node x, Node y) { // if (x.c != y.c) return x.c < y.c; // if (x.d != y.d) return x.d < y.d; // if (x.a != y.a) return x.a < y.a; @@ -81,8 +81,8 @@ // for (int i = l; i <= r; i++) { // tmp2[i] = tmp1[i]; // } -// sort(tmp2 + l, tmp2 + m + 1, CmpC); -// sort(tmp2 + m + 1, tmp2 + r + 1, CmpC); +// sort(tmp2 + l, tmp2 + m + 1, Cmp3); +// sort(tmp2 + m + 1, tmp2 + r + 1, Cmp3); // int p1, p2; // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { // while (p1 + 1 <= m && tmp2[p1 + 1].c <= tmp2[p2].c) { @@ -118,7 +118,7 @@ // tmp1[i] = arr[i]; // tmp1[i].left = i <= mid; // } -// sort(tmp1 + l, tmp1 + r + 1, CmpB); +// sort(tmp1 + l, tmp1 + r + 1, Cmp2); // cdq2(l, r); // cdq1(mid + 1, r); //} @@ -151,7 +151,7 @@ // for (int i = 1; i <= n; i++) { // arr[i].d = lower(arr[i].d); // } -// sort(arr + 1, arr + n + 1, CmpAbcdv); +// sort(arr + 1, arr + n + 1, Cmp1); // int m = 1; // for (int i = 2; i <= n; i++) { // if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index 25808b928..b5433acfa 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -2,7 +2,7 @@ // 寻找宝藏,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4849 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 提交以下的code,提交时请把类名改成"Main",多提交几次,可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; @@ -32,7 +32,7 @@ public Node(int a_, int b_, int c_, int d_, long v_) { } } - public static class CmpAbcdv implements Comparator { + public static class Cmp1 implements Comparator { @Override public int compare(Node x, Node y) { if (x.a != y.a) { @@ -51,7 +51,7 @@ public int compare(Node x, Node y) { } } - public static class CmpB implements Comparator { + public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { if (x.b != y.b) { @@ -67,7 +67,7 @@ public int compare(Node x, Node y) { } } - public static class CmpC implements Comparator { + public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { if (x.c != y.c) { @@ -83,9 +83,9 @@ public int compare(Node x, Node y) { } } - public static CmpAbcdv cmpAbcdv = new CmpAbcdv(); - public static CmpB cmpB = new CmpB(); - public static CmpC cmpC = new CmpC(); + public static Cmp1 cmp1 = new Cmp1(); + public static Cmp2 cmp2 = new Cmp2(); + public static Cmp3 cmp3 = new Cmp3(); public static int n, s; public static Node[] arr = new Node[MAXN]; @@ -144,8 +144,8 @@ public static void merge(int l, int mid, int r) { for (int i = l; i <= r; i++) { tmp2[i] = tmp1[i]; } - Arrays.sort(tmp2, l, mid + 1, cmpC); - Arrays.sort(tmp2, mid + 1, r + 1, cmpC); + Arrays.sort(tmp2, l, mid + 1, cmp3); + Arrays.sort(tmp2, mid + 1, r + 1, cmp3); int p1, p2, id; for (p1 = l - 1, p2 = mid + 1; p2 <= r; p2++) { while (p1 + 1 <= mid && tmp2[p1 + 1].c <= tmp2[p2].c) { @@ -192,7 +192,7 @@ public static void cdq1(int l, int r) { tmp1[i] = arr[i]; tmp1[i].left = (i <= mid); } - Arrays.sort(tmp1, l, r + 1, cmpB); + Arrays.sort(tmp1, l, r + 1, cmp2); cdq2(l, r); cdq1(mid + 1, r); } @@ -225,7 +225,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { arr[i].d = lower(arr[i].d); } - Arrays.sort(arr, 1, n + 1, cmpAbcdv); + Arrays.sort(arr, 1, n + 1, cmp1); int m = 1; for (int i = 2; i <= n; i++) { if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && arr[m].c == arr[i].c && arr[m].d == arr[i].d) { diff --git a/src/class171/Code06_Treasure2.java b/src/class171/Code06_Treasure2.java index e78c4f559..5882975b9 100644 --- a/src/class171/Code06_Treasure2.java +++ b/src/class171/Code06_Treasure2.java @@ -16,7 +16,7 @@ // bool left; //}; // -//bool CmpAbcdv(Node x, Node y) { +//bool Cmp1(Node x, Node y) { // if (x.a != y.a) return x.a < y.a; // if (x.b != y.b) return x.b < y.b; // if (x.c != y.c) return x.c < y.c; @@ -24,14 +24,14 @@ // return x.v > y.v; //} // -//bool CmpB(Node x, Node y) { +//bool Cmp2(Node x, Node y) { // if (x.b != y.b) return x.b < y.b; // if (x.c != y.c) return x.c < y.c; // if (x.d != y.d) return x.d < y.d; // return x.a < y.a; //} // -//bool CmpC(Node x, Node y) { +//bool Cmp3(Node x, Node y) { // if (x.c != y.c) return x.c < y.c; // if (x.d != y.d) return x.d < y.d; // if (x.a != y.a) return x.a < y.a; @@ -99,8 +99,8 @@ // for (int i = l; i <= r; i++) { // tmp2[i] = tmp1[i]; // } -// sort(tmp2 + l, tmp2 + m + 1, CmpC); -// sort(tmp2 + m + 1, tmp2 + r + 1, CmpC); +// sort(tmp2 + l, tmp2 + m + 1, Cmp3); +// sort(tmp2 + m + 1, tmp2 + r + 1, Cmp3); // int p1, p2, id; // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { // while (p1 + 1 <= m && tmp2[p1 + 1].c <= tmp2[p2].c) { @@ -143,7 +143,7 @@ // tmp1[i] = arr[i]; // tmp1[i].left = (i <= mid); // } -// sort(tmp1 + l, tmp1 + r + 1, CmpB); +// sort(tmp1 + l, tmp1 + r + 1, Cmp2); // cdq2(l, r); // cdq1(mid + 1, r); //} @@ -176,7 +176,7 @@ // for (int i = 1; i <= n; i++) { // arr[i].d = lower(arr[i].d); // } -// sort(arr + 1, arr + n + 1, CmpAbcdv); +// sort(arr + 1, arr + n + 1, Cmp1); // int m = 1; // for (int i = 2; i <= n; i++) { // if (arr[m].a == arr[i].a && arr[m].b == arr[i].b && @@ -218,6 +218,7 @@ // ways = (ways + cnt[i]) % MOD; // } // } -// cout << best << '\n' << ways << '\n'; +// cout << best << '\n'; +// cout << ways << '\n'; // return 0; //} \ No newline at end of file From 1e482d0a0dddd09270f18c48027b74af12001d9f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Jun 2025 18:10:46 +0800 Subject: [PATCH 0241/1170] modify code --- src/class171/Code01_MooFest1.java | 4 ++++ src/class171/Code01_MooFest2.java | 4 ++++ src/class171/Code02_AiRobots1.java | 9 ++++++++- src/class171/Code02_AiRobots2.java | 9 ++++++++- src/class171/Code03_Sequence1.java | 5 +++++ src/class171/Code03_Sequence2.java | 5 +++++ src/class171/Code04_Interceptor1.java | 7 +++++++ src/class171/Code04_Interceptor2.java | 7 +++++++ src/class171/Code05_Cute1.java | 8 +++++++- src/class171/Code05_Cute2.java | 8 +++++++- src/class171/Code06_Treasure1.java | 5 +++++ src/class171/Code06_Treasure2.java | 5 +++++ 12 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/class171/Code01_MooFest1.java b/src/class171/Code01_MooFest1.java index 9924e6958..0705956d0 100644 --- a/src/class171/Code01_MooFest1.java +++ b/src/class171/Code01_MooFest1.java @@ -1,6 +1,10 @@ package class171; // 奶牛音量和,java版 +// 一共有n只奶牛,每只奶牛给定,听力v、坐标x +// 任何一对奶牛产生的音量 = max(vi, vj) * 两只奶牛的距离 +// 一共有n * (n - 1) / 2对奶牛,打印音量总和 +// 1 <= n、v、x <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P5094 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class171/Code01_MooFest2.java b/src/class171/Code01_MooFest2.java index c5dab7ed3..f101326c0 100644 --- a/src/class171/Code01_MooFest2.java +++ b/src/class171/Code01_MooFest2.java @@ -1,6 +1,10 @@ package class171; // 奶牛音量和,C++版 +// 一共有n只奶牛,每只奶牛给定,听力v、坐标x +// 任何一对奶牛产生的音量 = max(vi, vj) * 两只奶牛的距离 +// 一共有n * (n - 1) / 2对奶牛,打印音量总和 +// 1 <= n、v、x <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P5094 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class171/Code02_AiRobots1.java b/src/class171/Code02_AiRobots1.java index 204696710..ed44087e0 100644 --- a/src/class171/Code02_AiRobots1.java +++ b/src/class171/Code02_AiRobots1.java @@ -1,6 +1,13 @@ package class171; -// 机器人可见对,java版 +// 机器人聊天对,java版 +// 一共有n个机器人,每个机器人给定,位置x、视野y、智商q +// 第i个机器人可以看见的范围是[xi − yi, xi + yi] +// 如果两个机器人相互之间可以看见,并且智商差距不大于k,那么它们会开始聊天 +// 打印有多少对机器人可以聊天 +// 1 <= n <= 10^5 +// 0 <= k <= 20 +// 0 <= x、y、q <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF1045G // 测试链接 : https://codeforces.com/problemset/problem/1045/G // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class171/Code02_AiRobots2.java b/src/class171/Code02_AiRobots2.java index fd64540fd..fdf28ca16 100644 --- a/src/class171/Code02_AiRobots2.java +++ b/src/class171/Code02_AiRobots2.java @@ -1,6 +1,13 @@ package class171; -// 机器人可见对,C++版 +// 机器人聊天对,C++版 +// 一共有n个机器人,每个机器人给定,位置x、视野y、智商q +// 第i个机器人可以看见的范围是[xi − yi, xi + yi] +// 如果两个机器人相互之间可以看见,并且智商差距不大于k,那么它们会开始聊天 +// 打印有多少对机器人可以聊天 +// 1 <= n <= 10^5 +// 0 <= k <= 20 +// 0 <= x、y、q <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF1045G // 测试链接 : https://codeforces.com/problemset/problem/1045/G // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index 3339e48f4..0988f7609 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -1,6 +1,11 @@ package class171; // 序列,java版 +// 给定一个长度为n的数组arr,一共有m条操作,格式为 x v 表示x位置的数变成v +// 你可以选择不执行任何操作,或者只选择一个操作来执行,然后arr不再变动 +// 请在原始的arr中选出一组下标序列,不管你做出什么选择,下标序列上的数字都是不下降的 +// 打印序列能达到的最大长度 +// 1 <= 所有数字 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4093 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class171/Code03_Sequence2.java b/src/class171/Code03_Sequence2.java index a830ec707..58b303c73 100644 --- a/src/class171/Code03_Sequence2.java +++ b/src/class171/Code03_Sequence2.java @@ -1,6 +1,11 @@ package class171; // 序列,C++版 +// 给定一个长度为n的数组arr,一共有m条操作,格式为 x v 表示x位置的数变成v +// 你可以选择不执行任何操作,或者只选择一个操作来执行,然后arr不再变动 +// 请在原始的arr中选出一组下标序列,不管你做出什么选择,下标序列上的数字都是不下降的 +// 打印序列能达到的最大长度 +// 1 <= 所有数字 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4093 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class171/Code04_Interceptor1.java b/src/class171/Code04_Interceptor1.java index 290ef225a..c45b7630e 100644 --- a/src/class171/Code04_Interceptor1.java +++ b/src/class171/Code04_Interceptor1.java @@ -1,6 +1,13 @@ package class171; // 拦截导弹,java版 +// 一共有n个导弹,编号1~n,表示导弹从早到晚依次到达,每个导弹给定,高度h、速度v +// 你有导弹拦截系统,第1次可以拦截任意参数的导弹 +// 但是之后拦截的导弹,高度和速度都不能比前一次拦截的导弹大 +// 你的目的是尽可能多的拦截导弹,如果有多个最优方案,会随机选一个执行 +// 打印最多能拦截几个导弹,并且打印每个导弹被拦截的概率 +// 1 <= n <= 5 * 10^4 +// 1 <= h、v <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P2487 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class171/Code04_Interceptor2.java b/src/class171/Code04_Interceptor2.java index a97774069..f78d843e7 100644 --- a/src/class171/Code04_Interceptor2.java +++ b/src/class171/Code04_Interceptor2.java @@ -1,6 +1,13 @@ package class171; // 拦截导弹,C++版 +// 一共有n个导弹,编号1~n,表示导弹从早到晚依次到达,每个导弹给定,高度h、速度v +// 你有导弹拦截系统,第1次可以拦截任意参数的导弹 +// 但是之后拦截的导弹,高度和速度都不能比前一次拦截的导弹大 +// 你的目的是尽可能多的拦截导弹,如果有多个最优方案,会随机选一个执行 +// 打印最多能拦截几个导弹,并且打印每个导弹被拦截的概率 +// 1 <= n <= 5 * 10^4 +// 1 <= h、v <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P2487 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index 5b985315b..cdc55994b 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -1,6 +1,12 @@ package class171; // 德丽莎世界第一可爱,java版 +// 一共有n个怪兽,每个怪兽有a、b、c、d四个能力值,以及打败之后的收益v +// 你可以选择任意顺序打怪兽,每次打的怪兽的四种能力值都不能小于上次打的怪兽 +// 打印你能获得的最大收益 +// 1 <= n <= 5 * 10^4 +// -10^5 <= a、b、c、d <= +10^5 +// -10^9 <= v <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5621 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是有两个测试用例超时 @@ -87,7 +93,7 @@ public int compare(Node x, Node y) { public static Cmp2 cmp2 = new Cmp2(); public static Cmp3 cmp3 = new Cmp3(); - public static int MAXN = 100001; + public static int MAXN = 50001; public static long INF = (long) (1e18 + 1); public static int n, s; diff --git a/src/class171/Code05_Cute2.java b/src/class171/Code05_Cute2.java index 92286cf41..78be3fa0f 100644 --- a/src/class171/Code05_Cute2.java +++ b/src/class171/Code05_Cute2.java @@ -1,6 +1,12 @@ package class171; // 德丽莎世界第一可爱,C++版 +// 一共有n个怪兽,每个怪兽有a、b、c、d四个能力值,以及打败之后的收益v +// 你可以选择任意顺序打怪兽,每次打的怪兽的四种能力值都不能小于上次打的怪兽 +// 打印你能获得的最大收益 +// 1 <= n <= 5 * 10^4 +// -10^5 <= a、b、c、d <= +10^5 +// -10^9 <= v <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5621 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -38,7 +44,7 @@ // return x.b < y.b; //} // -//const int MAXN = 100001; +//const int MAXN = 50001; //const long long INF = 1e18 + 1; //int n, s; // diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index b5433acfa..c0473dd64 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -1,6 +1,11 @@ package class171; // 寻找宝藏,java版 +// 一共有n个宝藏,每个宝藏有a、b、c、d四个属性值,以及拿取之后的收益v +// 你可以选择任意顺序拿取宝藏,每次拿的宝藏的四种属性值都不能小于上次拿的宝藏 +// 打印你能获得的最大收益,打印有多少种拿取方法能获得最大的收益 +// 1 <= n <= 8 * 10^4 +// 1 <= a、b、c、d、v <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4849 // 提交以下的code,提交时请把类名改成"Main",多提交几次,可以通过所有测试用例 diff --git a/src/class171/Code06_Treasure2.java b/src/class171/Code06_Treasure2.java index 5882975b9..d9ac462e3 100644 --- a/src/class171/Code06_Treasure2.java +++ b/src/class171/Code06_Treasure2.java @@ -1,6 +1,11 @@ package class171; // 寻找宝藏,C++版 +// 一共有n个宝藏,每个宝藏有a、b、c、d四个属性值,以及拿取之后的收益v +// 你可以选择任意顺序拿取宝藏,每次拿的宝藏的四种属性值都不能小于上次拿的宝藏 +// 打印你能获得的最大收益,打印有多少种拿取方法能获得最大的收益 +// 1 <= n <= 8 * 10^4 +// 1 <= a、b、c、d、v <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4849 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 288f3d7c07804fe24617be34253cbc9bb20bc2e7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Jun 2025 18:15:07 +0800 Subject: [PATCH 0242/1170] modify code --- src/class171/Code03_Sequence1.java | 2 +- src/class171/Code03_Sequence2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index 0988f7609..8ddf9073f 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -3,7 +3,7 @@ // 序列,java版 // 给定一个长度为n的数组arr,一共有m条操作,格式为 x v 表示x位置的数变成v // 你可以选择不执行任何操作,或者只选择一个操作来执行,然后arr不再变动 -// 请在原始的arr中选出一组下标序列,不管你做出什么选择,下标序列上的数字都是不下降的 +// 请在arr中选出一组下标序列,不管你做出什么选择,下标序列所代表的数字都是不下降的 // 打印序列能达到的最大长度 // 1 <= 所有数字 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4093 diff --git a/src/class171/Code03_Sequence2.java b/src/class171/Code03_Sequence2.java index 58b303c73..f9dd1f9c7 100644 --- a/src/class171/Code03_Sequence2.java +++ b/src/class171/Code03_Sequence2.java @@ -3,7 +3,7 @@ // 序列,C++版 // 给定一个长度为n的数组arr,一共有m条操作,格式为 x v 表示x位置的数变成v // 你可以选择不执行任何操作,或者只选择一个操作来执行,然后arr不再变动 -// 请在原始的arr中选出一组下标序列,不管你做出什么选择,下标序列上的数字都是不下降的 +// 请在arr中选出一组下标序列,不管你做出什么选择,下标序列所代表的数字都是不下降的 // 打印序列能达到的最大长度 // 1 <= 所有数字 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4093 From 39184a9d7967bfcfd1793e956d5c5fbdc9f732ef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Jun 2025 18:20:52 +0800 Subject: [PATCH 0243/1170] modify code --- src/class171/Code06_Treasure1.java | 2 +- src/class171/Code06_Treasure2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index c0473dd64..768a2ac0c 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -3,7 +3,7 @@ // 寻找宝藏,java版 // 一共有n个宝藏,每个宝藏有a、b、c、d四个属性值,以及拿取之后的收益v // 你可以选择任意顺序拿取宝藏,每次拿的宝藏的四种属性值都不能小于上次拿的宝藏 -// 打印你能获得的最大收益,打印有多少种拿取方法能获得最大的收益 +// 打印你能获得的最大收益,打印有多少种最佳拿取方法,方法数对 998244353 取余 // 1 <= n <= 8 * 10^4 // 1 <= a、b、c、d、v <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4849 diff --git a/src/class171/Code06_Treasure2.java b/src/class171/Code06_Treasure2.java index d9ac462e3..e16344c81 100644 --- a/src/class171/Code06_Treasure2.java +++ b/src/class171/Code06_Treasure2.java @@ -3,7 +3,7 @@ // 寻找宝藏,C++版 // 一共有n个宝藏,每个宝藏有a、b、c、d四个属性值,以及拿取之后的收益v // 你可以选择任意顺序拿取宝藏,每次拿的宝藏的四种属性值都不能小于上次拿的宝藏 -// 打印你能获得的最大收益,打印有多少种拿取方法能获得最大的收益 +// 打印你能获得的最大收益,打印有多少种最佳拿取方法,方法数对 998244353 取余 // 1 <= n <= 8 * 10^4 // 1 <= a、b、c、d、v <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4849 From c3be1d6e39316f1338047c9ea2b1ef26cf5f2696 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Jun 2025 18:31:06 +0800 Subject: [PATCH 0244/1170] modify code --- src/class171/Code04_Interceptor1.java | 63 +++++++++++++-------------- src/class171/Code04_Interceptor2.java | 58 ++++++++++++------------ src/class171/Code06_Treasure1.java | 8 ++-- 3 files changed, 64 insertions(+), 65 deletions(-) diff --git a/src/class171/Code04_Interceptor1.java b/src/class171/Code04_Interceptor1.java index c45b7630e..2b6e9b73b 100644 --- a/src/class171/Code04_Interceptor1.java +++ b/src/class171/Code04_Interceptor1.java @@ -28,9 +28,8 @@ public class Code04_Interceptor1 { // 位置i、高度h、速度v public static int[][] arr = new int[MAXN][3]; - // 树状数组,维护最大长度、最大长度出现的次数 - public static int[] treelen = new int[MAXN]; - public static double[] treecnt = new double[MAXN]; + public static int[] treeVal = new int[MAXN]; + public static double[] treeCnt = new double[MAXN]; public static int[] len1 = new int[MAXN]; public static double[] cnt1 = new double[MAXN]; @@ -38,34 +37,34 @@ public class Code04_Interceptor1 { public static int[] len2 = new int[MAXN]; public static double[] cnt2 = new double[MAXN]; - public static int lowbit(int x) { - return x & -x; + public static int lowbit(int i) { + return i & -i; } - public static void add(int i, int len, double cnt) { + public static void add(int i, int val, double cnt) { while (i <= s) { - if (len > treelen[i]) { - treelen[i] = len; - treecnt[i] = cnt; - } else if (len == treelen[i]) { - treecnt[i] += cnt; + if (val > treeVal[i]) { + treeVal[i] = val; + treeCnt[i] = cnt; + } else if (val == treeVal[i]) { + treeCnt[i] += cnt; } i += lowbit(i); } } - public static int querylen; - public static double querycnt; + public static int queryVal; + public static double queryCnt; public static void query(int i) { - querylen = 0; - querycnt = 0; + queryVal = 0; + queryCnt = 0; while (i > 0) { - if (treelen[i] > querylen) { - querylen = treelen[i]; - querycnt = treecnt[i]; - } else if (treelen[i] == querylen) { - querycnt += treecnt[i]; + if (treeVal[i] > queryVal) { + queryVal = treeVal[i]; + queryCnt = treeCnt[i]; + } else if (treeVal[i] == queryVal) { + queryCnt += treeCnt[i]; } i -= lowbit(i); } @@ -73,8 +72,8 @@ public static void query(int i) { public static void clear(int i) { while (i <= s) { - treelen[i] = 0; - treecnt[i] = 0; + treeVal[i] = 0; + treeCnt[i] = 0; i += lowbit(i); } } @@ -94,11 +93,11 @@ public static void merge1(int l, int m, int r) { add(s - arr[p1][2] + 1, len1[arr[p1][0]], cnt1[arr[p1][0]]); } query(s - arr[p2][2] + 1); - if (querylen + 1 > len1[arr[p2][0]]) { - len1[arr[p2][0]] = querylen + 1; - cnt1[arr[p2][0]] = querycnt; - } else if (querylen + 1 == len1[arr[p2][0]]) { - cnt1[arr[p2][0]] += querycnt; + if (queryVal + 1 > len1[arr[p2][0]]) { + len1[arr[p2][0]] = queryVal + 1; + cnt1[arr[p2][0]] = queryCnt; + } else if (queryVal + 1 == len1[arr[p2][0]]) { + cnt1[arr[p2][0]] += queryCnt; } } for (int i = l; i <= p1; i++) { @@ -131,11 +130,11 @@ public static void merge2(int l, int m, int r) { add(arr[p1][2], len2[arr[p1][0]], cnt2[arr[p1][0]]); } query(arr[p2][2]); - if (querylen + 1 > len2[arr[p2][0]]) { - len2[arr[p2][0]] = querylen + 1; - cnt2[arr[p2][0]] = querycnt; - } else if (querylen + 1 == len2[arr[p2][0]]) { - cnt2[arr[p2][0]] += querycnt; + if (queryVal + 1 > len2[arr[p2][0]]) { + len2[arr[p2][0]] = queryVal + 1; + cnt2[arr[p2][0]] = queryCnt; + } else if (queryVal + 1 == len2[arr[p2][0]]) { + cnt2[arr[p2][0]] += queryCnt; } } for (int i = l; i <= p1; i++) { diff --git a/src/class171/Code04_Interceptor2.java b/src/class171/Code04_Interceptor2.java index f78d843e7..3587c55ff 100644 --- a/src/class171/Code04_Interceptor2.java +++ b/src/class171/Code04_Interceptor2.java @@ -36,8 +36,8 @@ // //Node arr[MAXN]; // -//int treelen[MAXN]; -//double treecnt[MAXN]; +//int treeVal[MAXN]; +//double treeCnt[MAXN]; // //int len1[MAXN]; //double cnt1[MAXN]; @@ -49,30 +49,30 @@ // return i & -i; //} // -//void add(int i, int len, double cnt) { +//void add(int i, int val, double cnt) { // while (i <= s) { -// if (len > treelen[i]) { -// treelen[i] = len; -// treecnt[i] = cnt; -// } else if (len == treelen[i]) { -// treecnt[i] += cnt; +// if (val > treeVal[i]) { +// treeVal[i] = val; +// treeCnt[i] = cnt; +// } else if (val == treeVal[i]) { +// treeCnt[i] += cnt; // } // i += lowbit(i); // } //} // -//int querylen; -//double querycnt; +//int queryVal; +//double queryCnt; // //void query(int i) { -// querylen = 0; -// querycnt = 0; +// queryVal = 0; +// queryCnt = 0; // while (i > 0) { -// if (treelen[i] > querylen) { -// querylen = treelen[i]; -// querycnt = treecnt[i]; -// } else if (treelen[i] == querylen) { -// querycnt += treecnt[i]; +// if (treeVal[i] > queryVal) { +// queryVal = treeVal[i]; +// queryCnt = treeCnt[i]; +// } else if (treeVal[i] == queryVal) { +// queryCnt += treeCnt[i]; // } // i -= lowbit(i); // } @@ -80,8 +80,8 @@ // //void clear(int i) { // while (i <= s) { -// treelen[i] = 0; -// treecnt[i] = 0; +// treeVal[i] = 0; +// treeCnt[i] = 0; // i += lowbit(i); // } //} @@ -101,11 +101,11 @@ // add(s - arr[p1].v + 1, len1[arr[p1].i], cnt1[arr[p1].i]); // } // query(s - arr[p2].v + 1); -// if (querylen + 1 > len1[arr[p2].i]) { -// len1[arr[p2].i] = querylen + 1; -// cnt1[arr[p2].i] = querycnt; -// } else if (querylen + 1 == len1[arr[p2].i]) { -// cnt1[arr[p2].i] += querycnt; +// if (queryVal + 1 > len1[arr[p2].i]) { +// len1[arr[p2].i] = queryVal + 1; +// cnt1[arr[p2].i] = queryCnt; +// } else if (queryVal + 1 == len1[arr[p2].i]) { +// cnt1[arr[p2].i] += queryCnt; // } // } // for (int i = l; i <= p1; i++) { @@ -138,11 +138,11 @@ // add(arr[p1].v, len2[arr[p1].i], cnt2[arr[p1].i]); // } // query(arr[p2].v); -// if (querylen + 1 > len2[arr[p2].i]) { -// len2[arr[p2].i] = querylen + 1; -// cnt2[arr[p2].i] = querycnt; -// } else if (querylen + 1 == len2[arr[p2].i]) { -// cnt2[arr[p2].i] += querycnt; +// if (queryVal + 1 > len2[arr[p2].i]) { +// len2[arr[p2].i] = queryVal + 1; +// cnt2[arr[p2].i] = queryCnt; +// } else if (queryVal + 1 == len2[arr[p2].i]) { +// cnt2[arr[p2].i] += queryCnt; // } // } // for (int i = l; i <= p1; i++) { diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index 768a2ac0c..7359a3bef 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -18,10 +18,6 @@ public class Code06_Treasure1 { - public static int MAXN = 80001; - public static long INF = (long) (1e18 + 1); - public static int MOD = 998244353; - public static class Node { int a, b, c, d; int i; @@ -92,7 +88,11 @@ public int compare(Node x, Node y) { public static Cmp2 cmp2 = new Cmp2(); public static Cmp3 cmp3 = new Cmp3(); + public static int MAXN = 80001; + public static long INF = (long) (1e18 + 1); + public static int MOD = 998244353; public static int n, s; + public static Node[] arr = new Node[MAXN]; public static Node[] tmp1 = new Node[MAXN]; public static Node[] tmp2 = new Node[MAXN]; From 1ca240977ce1934ceb657eac383fb6d7f73cc762 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 7 Jun 2025 13:51:43 +0800 Subject: [PATCH 0245/1170] modify code --- src/class171/Code05_Cute1.java | 6 ++++-- src/class171/Code05_Cute2.java | 4 ++-- src/class171/Code06_Treasure1.java | 11 +++++------ src/class171/Code06_Treasure2.java | 7 +++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index cdc55994b..a7f244961 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -2,8 +2,8 @@ // 德丽莎世界第一可爱,java版 // 一共有n个怪兽,每个怪兽有a、b、c、d四个能力值,以及打败之后的收益v -// 你可以选择任意顺序打怪兽,每次打的怪兽的四种能力值都不能小于上次打的怪兽 -// 打印你能获得的最大收益 +// 可以选择任意顺序打怪兽,每次打的怪兽的四种能力值都不能小于上次打的怪兽 +// 打印能获得的最大收益,可能所有怪兽收益都是负数,那也需要至少打一只怪兽 // 1 <= n <= 5 * 10^4 // -10^5 <= a、b、c、d <= +10^5 // -10^9 <= v <= +10^9 @@ -57,6 +57,7 @@ public int compare(Node x, Node y) { } } + // 需要排序的稳定性 public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { @@ -73,6 +74,7 @@ public int compare(Node x, Node y) { } } + // 需要排序的稳定性 public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { diff --git a/src/class171/Code05_Cute2.java b/src/class171/Code05_Cute2.java index 78be3fa0f..1e65b770c 100644 --- a/src/class171/Code05_Cute2.java +++ b/src/class171/Code05_Cute2.java @@ -2,8 +2,8 @@ // 德丽莎世界第一可爱,C++版 // 一共有n个怪兽,每个怪兽有a、b、c、d四个能力值,以及打败之后的收益v -// 你可以选择任意顺序打怪兽,每次打的怪兽的四种能力值都不能小于上次打的怪兽 -// 打印你能获得的最大收益 +// 可以选择任意顺序打怪兽,每次打的怪兽的四种能力值都不能小于上次打的怪兽 +// 打印能获得的最大收益,可能所有怪兽收益都是负数,那也需要至少打一只怪兽 // 1 <= n <= 5 * 10^4 // -10^5 <= a、b、c、d <= +10^5 // -10^9 <= v <= +10^9 diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index 7359a3bef..c3caea7da 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -2,8 +2,8 @@ // 寻找宝藏,java版 // 一共有n个宝藏,每个宝藏有a、b、c、d四个属性值,以及拿取之后的收益v -// 你可以选择任意顺序拿取宝藏,每次拿的宝藏的四种属性值都不能小于上次拿的宝藏 -// 打印你能获得的最大收益,打印有多少种最佳拿取方法,方法数对 998244353 取余 +// 可以选择任意顺序拿取宝藏,每次拿的宝藏的四种属性值都不能小于上次拿的宝藏 +// 打印能获得的最大收益,打印有多少种最佳拿取方法,方法数对 998244353 取余 // 1 <= n <= 8 * 10^4 // 1 <= a、b、c、d、v <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4849 @@ -45,13 +45,11 @@ public int compare(Node x, Node y) { if (x.c != y.c) { return x.c - y.c; } - if (x.d != y.d) { - return x.d - y.d; - } - return Long.compare(y.v, x.v); + return x.d - y.d; } } + // 需要排序的稳定性 public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { @@ -68,6 +66,7 @@ public int compare(Node x, Node y) { } } + // 需要排序的稳定性 public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { diff --git a/src/class171/Code06_Treasure2.java b/src/class171/Code06_Treasure2.java index e16344c81..a4bc32ee9 100644 --- a/src/class171/Code06_Treasure2.java +++ b/src/class171/Code06_Treasure2.java @@ -2,8 +2,8 @@ // 寻找宝藏,C++版 // 一共有n个宝藏,每个宝藏有a、b、c、d四个属性值,以及拿取之后的收益v -// 你可以选择任意顺序拿取宝藏,每次拿的宝藏的四种属性值都不能小于上次拿的宝藏 -// 打印你能获得的最大收益,打印有多少种最佳拿取方法,方法数对 998244353 取余 +// 可以选择任意顺序拿取宝藏,每次拿的宝藏的四种属性值都不能小于上次拿的宝藏 +// 打印能获得的最大收益,打印有多少种最佳拿取方法,方法数对 998244353 取余 // 1 <= n <= 8 * 10^4 // 1 <= a、b、c、d、v <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4849 @@ -25,8 +25,7 @@ // if (x.a != y.a) return x.a < y.a; // if (x.b != y.b) return x.b < y.b; // if (x.c != y.c) return x.c < y.c; -// if (x.d != y.d) return x.d < y.d; -// return x.v > y.v; +// return x.d < y.d; //} // //bool Cmp2(Node x, Node y) { From ac14b0565bbb29295ffdcf8c0364e03ee984884c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 7 Jun 2025 13:54:58 +0800 Subject: [PATCH 0246/1170] modify code --- src/class171/Code06_Treasure1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index c3caea7da..93d819986 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -7,7 +7,7 @@ // 1 <= n <= 8 * 10^4 // 1 <= a、b、c、d、v <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4849 -// 提交以下的code,提交时请把类名改成"Main",多提交几次,可以通过所有测试用例 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; From f77282149949c1296ba2bc40e63f82c5b6a5afcf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 7 Jun 2025 14:18:38 +0800 Subject: [PATCH 0247/1170] modify code --- src/class171/Code04_Interceptor1.java | 6 +++--- src/class171/Code04_Interceptor2.java | 6 +++--- src/class171/Code06_Treasure1.java | 4 ++-- src/class171/Code06_Treasure2.java | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class171/Code04_Interceptor1.java b/src/class171/Code04_Interceptor1.java index 2b6e9b73b..60955ea10 100644 --- a/src/class171/Code04_Interceptor1.java +++ b/src/class171/Code04_Interceptor1.java @@ -41,7 +41,7 @@ public static int lowbit(int i) { return i & -i; } - public static void add(int i, int val, double cnt) { + public static void more(int i, int val, double cnt) { while (i <= s) { if (val > treeVal[i]) { treeVal[i] = val; @@ -90,7 +90,7 @@ public static void merge1(int l, int m, int r) { for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && arr[p1 + 1][1] >= arr[p2][1]) { p1++; - add(s - arr[p1][2] + 1, len1[arr[p1][0]], cnt1[arr[p1][0]]); + more(s - arr[p1][2] + 1, len1[arr[p1][0]], cnt1[arr[p1][0]]); } query(s - arr[p2][2] + 1); if (queryVal + 1 > len1[arr[p2][0]]) { @@ -127,7 +127,7 @@ public static void merge2(int l, int m, int r) { for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][1]) { p1++; - add(arr[p1][2], len2[arr[p1][0]], cnt2[arr[p1][0]]); + more(arr[p1][2], len2[arr[p1][0]], cnt2[arr[p1][0]]); } query(arr[p2][2]); if (queryVal + 1 > len2[arr[p2][0]]) { diff --git a/src/class171/Code04_Interceptor2.java b/src/class171/Code04_Interceptor2.java index 3587c55ff..c2d253fb4 100644 --- a/src/class171/Code04_Interceptor2.java +++ b/src/class171/Code04_Interceptor2.java @@ -49,7 +49,7 @@ // return i & -i; //} // -//void add(int i, int val, double cnt) { +//void more(int i, int val, double cnt) { // while (i <= s) { // if (val > treeVal[i]) { // treeVal[i] = val; @@ -98,7 +98,7 @@ // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { // while (p1 + 1 <= m && arr[p1 + 1].h >= arr[p2].h) { // p1++; -// add(s - arr[p1].v + 1, len1[arr[p1].i], cnt1[arr[p1].i]); +// more(s - arr[p1].v + 1, len1[arr[p1].i], cnt1[arr[p1].i]); // } // query(s - arr[p2].v + 1); // if (queryVal + 1 > len1[arr[p2].i]) { @@ -135,7 +135,7 @@ // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { // while (p1 + 1 <= m && arr[p1 + 1].h <= arr[p2].h) { // p1++; -// add(arr[p1].v, len2[arr[p1].i], cnt2[arr[p1].i]); +// more(arr[p1].v, len2[arr[p1].i], cnt2[arr[p1].i]); // } // query(arr[p2].v); // if (queryVal + 1 > len2[arr[p2].i]) { diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index 93d819986..b3a3a9c6a 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -107,7 +107,7 @@ public static int lowbit(int i) { return i & -i; } - public static void add(int i, long v, int c) { + public static void more(int i, long v, int c) { while (i <= s) { if (v > treeVal[i]) { treeVal[i] = v; @@ -155,7 +155,7 @@ public static void merge(int l, int mid, int r) { while (p1 + 1 <= mid && tmp2[p1 + 1].c <= tmp2[p2].c) { p1++; if (tmp2[p1].left) { - add(tmp2[p1].d, dp[tmp2[p1].i], cnt[tmp2[p1].i]); + more(tmp2[p1].d, dp[tmp2[p1].i], cnt[tmp2[p1].i]); } } if (!tmp2[p2].left) { diff --git a/src/class171/Code06_Treasure2.java b/src/class171/Code06_Treasure2.java index a4bc32ee9..c39740ccc 100644 --- a/src/class171/Code06_Treasure2.java +++ b/src/class171/Code06_Treasure2.java @@ -62,7 +62,7 @@ // return i & -i; //} // -//void add(int i, long long v, int c) { +//void more(int i, long long v, int c) { // while (i <= s) { // if (v > treeVal[i]) { // treeVal[i] = v; @@ -110,7 +110,7 @@ // while (p1 + 1 <= m && tmp2[p1 + 1].c <= tmp2[p2].c) { // p1++; // if (tmp2[p1].left) { -// add(tmp2[p1].d, dp[tmp2[p1].i], cnt[tmp2[p1].i]); +// more(tmp2[p1].d, dp[tmp2[p1].i], cnt[tmp2[p1].i]); // } // } // if (!tmp2[p2].left) { From 41d0c8c5369bddfc136044d6a54ae5d3a9b2605e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 7 Jun 2025 15:35:35 +0800 Subject: [PATCH 0248/1170] modify code --- src/class171/Code05_Cute1.java | 20 ++++++++++++-------- src/class171/Code05_Cute2.java | 20 ++++++++++++-------- src/class171/Code06_Treasure1.java | 20 ++++++++++++-------- src/class171/Code06_Treasure2.java | 18 +++++++++++------- 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index a7f244961..6de375ca3 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -135,7 +135,7 @@ public static void clear(int i) { } } - public static void merge(int l, int m, int r) { + public static void merge2(int l, int m, int r) { for (int i = l; i <= r; i++) { tmp2[i] = tmp1[i]; } @@ -166,22 +166,26 @@ public static void cdq2(int l, int r) { } int mid = (l + r) / 2; cdq2(l, mid); - merge(l, mid, r); + merge2(l, mid, r); cdq2(mid + 1, r); } + public static void merge1(int l, int m, int r) { + for (int i = l; i <= r; i++) { + tmp1[i] = arr[i]; + tmp1[i].left = i <= m; + } + Arrays.sort(tmp1, l, r + 1, cmp2); + cdq2(l, r); + } + public static void cdq1(int l, int r) { if (l == r) { return; } int mid = (l + r) / 2; cdq1(l, mid); - for (int i = l; i <= r; i++) { - tmp1[i] = arr[i]; - tmp1[i].left = i <= mid; - } - Arrays.sort(tmp1, l, r + 1, cmp2); - cdq2(l, r); + merge1(l, mid, r); cdq1(mid + 1, r); } diff --git a/src/class171/Code05_Cute2.java b/src/class171/Code05_Cute2.java index 1e65b770c..805ed1d22 100644 --- a/src/class171/Code05_Cute2.java +++ b/src/class171/Code05_Cute2.java @@ -83,7 +83,7 @@ // } //} // -//void merge(int l, int m, int r) { +//void merge2(int l, int m, int r) { // for (int i = l; i <= r; i++) { // tmp2[i] = tmp1[i]; // } @@ -112,20 +112,24 @@ // if (l == r) return; // int mid = (l + r) / 2; // cdq2(l, mid); -// merge(l, mid, r); +// merge2(l, mid, r); // cdq2(mid + 1, r); //} // -//void cdq1(int l, int r) { -// if (l == r) return; -// int mid = (l + r) / 2; -// cdq1(l, mid); +//void merge1(int l, int m, int r) { // for (int i = l; i <= r; i++) { // tmp1[i] = arr[i]; -// tmp1[i].left = i <= mid; -// } +// tmp1[i].left = i <= m; +// } // sort(tmp1 + l, tmp1 + r + 1, Cmp2); // cdq2(l, r); +//} +// +//void cdq1(int l, int r) { +// if (l == r) return; +// int mid = (l + r) / 2; +// cdq1(l, mid); +// merge1(l, mid, r); // cdq1(mid + 1, r); //} // diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index b3a3a9c6a..306ab1ab2 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -144,7 +144,7 @@ public static void clear(int i) { } } - public static void merge(int l, int mid, int r) { + public static void merge2(int l, int mid, int r) { for (int i = l; i <= r; i++) { tmp2[i] = tmp1[i]; } @@ -182,22 +182,26 @@ public static void cdq2(int l, int r) { } int mid = (l + r) / 2; cdq2(l, mid); - merge(l, mid, r); + merge2(l, mid, r); cdq2(mid + 1, r); } + public static void merge1(int l, int m, int r) { + for (int i = l; i <= r; i++) { + tmp1[i] = arr[i]; + tmp1[i].left = (i <= m); + } + Arrays.sort(tmp1, l, r + 1, cmp2); + cdq2(l, r); + } + public static void cdq1(int l, int r) { if (l == r) { return; } int mid = (l + r) / 2; cdq1(l, mid); - for (int i = l; i <= r; i++) { - tmp1[i] = arr[i]; - tmp1[i].left = (i <= mid); - } - Arrays.sort(tmp1, l, r + 1, cmp2); - cdq2(l, r); + merge1(l, mid, r); cdq1(mid + 1, r); } diff --git a/src/class171/Code06_Treasure2.java b/src/class171/Code06_Treasure2.java index c39740ccc..0e62a0fea 100644 --- a/src/class171/Code06_Treasure2.java +++ b/src/class171/Code06_Treasure2.java @@ -99,7 +99,7 @@ // } //} // -//void merge(int l, int m, int r) { +//void merge2(int l, int m, int r) { // for (int i = l; i <= r; i++) { // tmp2[i] = tmp1[i]; // } @@ -135,20 +135,24 @@ // if (l == r) return; // int mid = (l + r) / 2; // cdq2(l, mid); -// merge(l, mid, r); +// merge2(l, mid, r); // cdq2(mid + 1, r); //} // -//void cdq1(int l, int r) { -// if (l == r) return; -// int mid = (l + r) / 2; -// cdq1(l, mid); +//void merge1(int l, int m, int r) { // for (int i = l; i <= r; i++) { // tmp1[i] = arr[i]; -// tmp1[i].left = (i <= mid); +// tmp1[i].left = (i <= m); // } // sort(tmp1 + l, tmp1 + r + 1, Cmp2); // cdq2(l, r); +//} +// +//void cdq1(int l, int r) { +// if (l == r) return; +// int mid = (l + r) / 2; +// cdq1(l, mid); +// merge1(l, mid, r); // cdq1(mid + 1, r); //} // From c64b9510cd16538b5c5b0c54b9080c6243bcbf96 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 7 Jun 2025 15:51:25 +0800 Subject: [PATCH 0249/1170] modify code --- src/class171/Code05_Cute1.java | 24 ++++++++++++------------ src/class171/Code05_Cute2.java | 18 +++++++----------- src/class171/Code06_Treasure1.java | 20 ++++++++------------ src/class171/Code06_Treasure2.java | 18 +++++++----------- 4 files changed, 34 insertions(+), 46 deletions(-) diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index 6de375ca3..c477bca37 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -135,7 +135,7 @@ public static void clear(int i) { } } - public static void merge2(int l, int m, int r) { + public static void merge(int l, int m, int r) { for (int i = l; i <= r; i++) { tmp2[i] = tmp1[i]; } @@ -160,32 +160,32 @@ public static void merge2(int l, int m, int r) { } } + // tmp1[l..r]中所有对象根据b属性值稳定排序了 + // 有些对象的dp值已经计算,left = true + // 有些对象的dp值还没计算,left = false + // 计算过的对象,去更新,还没计算出的对象dp值 public static void cdq2(int l, int r) { if (l == r) { return; } int mid = (l + r) / 2; cdq2(l, mid); - merge2(l, mid, r); + merge(l, mid, r); cdq2(mid + 1, r); } - public static void merge1(int l, int m, int r) { - for (int i = l; i <= r; i++) { - tmp1[i] = arr[i]; - tmp1[i].left = i <= m; - } - Arrays.sort(tmp1, l, r + 1, cmp2); - cdq2(l, r); - } - public static void cdq1(int l, int r) { if (l == r) { return; } int mid = (l + r) / 2; cdq1(l, mid); - merge1(l, mid, r); + for (int i = l; i <= r; i++) { + tmp1[i] = arr[i]; + tmp1[i].left = i <= mid; + } + Arrays.sort(tmp1, l, r + 1, cmp2); + cdq2(l, r); cdq1(mid + 1, r); } diff --git a/src/class171/Code05_Cute2.java b/src/class171/Code05_Cute2.java index 805ed1d22..1d724d843 100644 --- a/src/class171/Code05_Cute2.java +++ b/src/class171/Code05_Cute2.java @@ -83,7 +83,7 @@ // } //} // -//void merge2(int l, int m, int r) { +//void merge(int l, int m, int r) { // for (int i = l; i <= r; i++) { // tmp2[i] = tmp1[i]; // } @@ -112,24 +112,20 @@ // if (l == r) return; // int mid = (l + r) / 2; // cdq2(l, mid); -// merge2(l, mid, r); +// merge(l, mid, r); // cdq2(mid + 1, r); //} // -//void merge1(int l, int m, int r) { +//void cdq1(int l, int r) { +// if (l == r) return; +// int mid = (l + r) / 2; +// cdq1(l, mid); // for (int i = l; i <= r; i++) { // tmp1[i] = arr[i]; -// tmp1[i].left = i <= m; +// tmp1[i].left = i <= mid; // } // sort(tmp1 + l, tmp1 + r + 1, Cmp2); // cdq2(l, r); -//} -// -//void cdq1(int l, int r) { -// if (l == r) return; -// int mid = (l + r) / 2; -// cdq1(l, mid); -// merge1(l, mid, r); // cdq1(mid + 1, r); //} // diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index 306ab1ab2..5968be915 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -144,7 +144,7 @@ public static void clear(int i) { } } - public static void merge2(int l, int mid, int r) { + public static void merge(int l, int mid, int r) { for (int i = l; i <= r; i++) { tmp2[i] = tmp1[i]; } @@ -182,26 +182,22 @@ public static void cdq2(int l, int r) { } int mid = (l + r) / 2; cdq2(l, mid); - merge2(l, mid, r); + merge(l, mid, r); cdq2(mid + 1, r); } - public static void merge1(int l, int m, int r) { - for (int i = l; i <= r; i++) { - tmp1[i] = arr[i]; - tmp1[i].left = (i <= m); - } - Arrays.sort(tmp1, l, r + 1, cmp2); - cdq2(l, r); - } - public static void cdq1(int l, int r) { if (l == r) { return; } int mid = (l + r) / 2; cdq1(l, mid); - merge1(l, mid, r); + for (int i = l; i <= r; i++) { + tmp1[i] = arr[i]; + tmp1[i].left = i <= mid; + } + Arrays.sort(tmp1, l, r + 1, cmp2); + cdq2(l, r); cdq1(mid + 1, r); } diff --git a/src/class171/Code06_Treasure2.java b/src/class171/Code06_Treasure2.java index 0e62a0fea..c2c8335c2 100644 --- a/src/class171/Code06_Treasure2.java +++ b/src/class171/Code06_Treasure2.java @@ -99,7 +99,7 @@ // } //} // -//void merge2(int l, int m, int r) { +//void merge(int l, int m, int r) { // for (int i = l; i <= r; i++) { // tmp2[i] = tmp1[i]; // } @@ -135,24 +135,20 @@ // if (l == r) return; // int mid = (l + r) / 2; // cdq2(l, mid); -// merge2(l, mid, r); +// merge(l, mid, r); // cdq2(mid + 1, r); //} // -//void merge1(int l, int m, int r) { +//void cdq1(int l, int r) { +// if (l == r) return; +// int mid = (l + r) / 2; +// cdq1(l, mid); // for (int i = l; i <= r; i++) { // tmp1[i] = arr[i]; -// tmp1[i].left = (i <= m); +// tmp1[i].left = i <= mid; // } // sort(tmp1 + l, tmp1 + r + 1, Cmp2); // cdq2(l, r); -//} -// -//void cdq1(int l, int r) { -// if (l == r) return; -// int mid = (l + r) / 2; -// cdq1(l, mid); -// merge1(l, mid, r); // cdq1(mid + 1, r); //} // From dc3a900be66fc5d18d2d1841f73a2d4f57a115bf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 7 Jun 2025 21:00:10 +0800 Subject: [PATCH 0250/1170] modify code --- src/class171/Code05_Cute1.java | 4 ++-- src/class171/Code06_Treasure1.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index c477bca37..5334aee96 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -57,7 +57,7 @@ public int compare(Node x, Node y) { } } - // 需要排序的稳定性 + // 需要稳定排序 public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { @@ -74,7 +74,7 @@ public int compare(Node x, Node y) { } } - // 需要排序的稳定性 + // 需要稳定排序 public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index 5968be915..c157adff6 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -49,7 +49,7 @@ public int compare(Node x, Node y) { } } - // 需要排序的稳定性 + // 需要稳定排序 public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { @@ -66,7 +66,7 @@ public int compare(Node x, Node y) { } } - // 需要排序的稳定性 + // 需要稳定排序 public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { From 5331885e002de18e10cb2454a722460f513491ec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 8 Jun 2025 15:04:04 +0800 Subject: [PATCH 0251/1170] modify code --- src/class171/Code05_Cute1.java | 26 +++++++------------------- src/class171/Code05_Cute2.java | 8 ++------ src/class171/Code06_Treasure1.java | 20 ++++---------------- src/class171/Code06_Treasure2.java | 8 ++------ 4 files changed, 15 insertions(+), 47 deletions(-) diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index 5334aee96..39747a188 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -57,37 +57,25 @@ public int compare(Node x, Node y) { } } - // 需要稳定排序 + // 根据属性b进行稳定排序 public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { if (x.b != y.b) { return x.b - y.b; } - if (x.c != y.c) { - return x.c - y.c; - } - if (x.d != y.d) { - return x.d - y.d; - } - return x.a - y.a; + return x.i - y.i; } } - // 需要稳定排序 + // 根据属性c进行稳定排序 public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { if (x.c != y.c) { return x.c - y.c; } - if (x.d != y.d) { - return x.d - y.d; - } - if (x.a != y.a) { - return x.a - y.a; - } - return x.b - y.b; + return x.i - y.i; } } @@ -161,9 +149,9 @@ public static void merge(int l, int m, int r) { } // tmp1[l..r]中所有对象根据b属性值稳定排序了 - // 有些对象的dp值已经计算,left = true - // 有些对象的dp值还没计算,left = false - // 计算过的对象,去更新,还没计算出的对象dp值 + // dp值已经计算过的对象,left = true + // dp值还没计算过的对象,left = false + // 计算过的对象,去更新,还没还没计算过对象的dp值 public static void cdq2(int l, int r) { if (l == r) { return; diff --git a/src/class171/Code05_Cute2.java b/src/class171/Code05_Cute2.java index 1d724d843..21cc5e3c4 100644 --- a/src/class171/Code05_Cute2.java +++ b/src/class171/Code05_Cute2.java @@ -32,16 +32,12 @@ // //bool Cmp2(Node x, Node y) { // if (x.b != y.b) return x.b < y.b; -// if (x.c != y.c) return x.c < y.c; -// if (x.d != y.d) return x.d < y.d; -// return x.a < y.a; +// return x.i < y.i; //} // //bool Cmp3(Node x, Node y) { // if (x.c != y.c) return x.c < y.c; -// if (x.d != y.d) return x.d < y.d; -// if (x.a != y.a) return x.a < y.a; -// return x.b < y.b; +// return x.i < y.i; //} // //const int MAXN = 50001; diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index c157adff6..ab4d6615d 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -49,37 +49,25 @@ public int compare(Node x, Node y) { } } - // 需要稳定排序 + // 根据属性b进行稳定排序 public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { if (x.b != y.b) { return x.b - y.b; } - if (x.c != y.c) { - return x.c - y.c; - } - if (x.d != y.d) { - return x.d - y.d; - } - return x.a - y.a; + return x.i - y.i; } } - // 需要稳定排序 + // 根据属性c进行稳定排序 public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { if (x.c != y.c) { return x.c - y.c; } - if (x.d != y.d) { - return x.d - y.d; - } - if (x.a != y.a) { - return x.a - y.a; - } - return x.b - y.b; + return x.i - y.i; } } diff --git a/src/class171/Code06_Treasure2.java b/src/class171/Code06_Treasure2.java index c2c8335c2..a586e54b8 100644 --- a/src/class171/Code06_Treasure2.java +++ b/src/class171/Code06_Treasure2.java @@ -30,16 +30,12 @@ // //bool Cmp2(Node x, Node y) { // if (x.b != y.b) return x.b < y.b; -// if (x.c != y.c) return x.c < y.c; -// if (x.d != y.d) return x.d < y.d; -// return x.a < y.a; +// return x.i < y.i; //} // //bool Cmp3(Node x, Node y) { // if (x.c != y.c) return x.c < y.c; -// if (x.d != y.d) return x.d < y.d; -// if (x.a != y.a) return x.a < y.a; -// return x.b < y.b; +// return x.i < y.i; //} // //const int MAXN = 80001; From a9a4c31de5a709b88f08a9081f1ea7c751353ef9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 8 Jun 2025 15:15:22 +0800 Subject: [PATCH 0252/1170] modify code --- src/class171/Code05_Cute1.java | 4 ++-- src/class171/Code06_Treasure1.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index 39747a188..5559690ad 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -57,7 +57,7 @@ public int compare(Node x, Node y) { } } - // 根据属性b进行稳定排序 + // 根据属性c进行排序,b一样的对象,保持原始次序 public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { @@ -68,7 +68,7 @@ public int compare(Node x, Node y) { } } - // 根据属性c进行稳定排序 + // 根据属性c进行排序,c一样的对象,保持原始次序 public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { diff --git a/src/class171/Code06_Treasure1.java b/src/class171/Code06_Treasure1.java index ab4d6615d..db7b9c61f 100644 --- a/src/class171/Code06_Treasure1.java +++ b/src/class171/Code06_Treasure1.java @@ -49,7 +49,7 @@ public int compare(Node x, Node y) { } } - // 根据属性b进行稳定排序 + // 根据属性b进行排序,b一样的对象,保持原始次序 public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { @@ -60,7 +60,7 @@ public int compare(Node x, Node y) { } } - // 根据属性c进行稳定排序 + // 根据属性c进行排序,c一样的对象,保持原始次序 public static class Cmp3 implements Comparator { @Override public int compare(Node x, Node y) { From a6e420fe3b0d0cfc183191003e179f202684eb76 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 8 Jun 2025 16:27:25 +0800 Subject: [PATCH 0253/1170] modify code --- src/class171/Code01_MooFest1.java | 10 +++++----- src/class171/Code01_MooFest2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class171/Code01_MooFest1.java b/src/class171/Code01_MooFest1.java index 0705956d0..0a41b927d 100644 --- a/src/class171/Code01_MooFest1.java +++ b/src/class171/Code01_MooFest1.java @@ -30,17 +30,17 @@ public static void clone(int[] a, int[] b) { public static long merge(int l, int m, int r) { int p1, p2; - long sum1 = 0, sum2 = 0, ans = 0; + long rsum = 0, lsum = 0, ans = 0; for (p1 = l; p1 <= m; p1++) { - sum1 += arr[p1][1]; + rsum += arr[p1][1]; } for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && arr[p1 + 1][1] < arr[p2][1]) { p1++; - sum1 -= arr[p1][1]; - sum2 += arr[p1][1]; + rsum -= arr[p1][1]; + lsum += arr[p1][1]; } - ans += (1L * (p1 - l + 1) * arr[p2][1] - sum2 + sum1 - 1L * (m - p1) * arr[p2][1]) * arr[p2][0]; + ans += (1L * (p1 - l + 1) * arr[p2][1] - lsum + rsum - 1L * (m - p1) * arr[p2][1]) * arr[p2][0]; } p1 = l; p2 = m + 1; diff --git a/src/class171/Code01_MooFest2.java b/src/class171/Code01_MooFest2.java index f101326c0..e32af0716 100644 --- a/src/class171/Code01_MooFest2.java +++ b/src/class171/Code01_MooFest2.java @@ -28,17 +28,17 @@ // //long long merge(int l, int m, int r) { // int p1, p2; -// long long sum1 = 0, sum2 = 0, ans = 0; +// long long rsum = 0, lsum = 0, ans = 0; // for (p1 = l; p1 <= m; p1++) { -// sum1 += arr[p1].x; +// rsum += arr[p1].x; // } // for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { // while (p1 + 1 <= m && arr[p1 + 1].x < arr[p2].x) { // p1++; -// sum1 -= arr[p1].x; -// sum2 += arr[p1].x; +// rsum -= arr[p1].x; +// lsum += arr[p1].x; // } -// ans += (1LL * (p1 - l + 1) * arr[p2].x - sum2 + sum1 - 1LL * (m - p1) * arr[p2].x) * arr[p2].v; +// ans += (1LL * (p1 - l + 1) * arr[p2].x - lsum + rsum - 1LL * (m - p1) * arr[p2].x) * arr[p2].v; // } // p1 = l; // p2 = m + 1; From d3713c4a5c96745115a1c8949253f86f47463439 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 8 Jun 2025 18:17:03 +0800 Subject: [PATCH 0254/1170] modify code --- src/class171/Code02_AiRobots1.java | 2 +- src/class171/Code02_AiRobots2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class171/Code02_AiRobots1.java b/src/class171/Code02_AiRobots1.java index ed44087e0..3309d66d7 100644 --- a/src/class171/Code02_AiRobots1.java +++ b/src/class171/Code02_AiRobots1.java @@ -1,7 +1,7 @@ package class171; // 机器人聊天对,java版 -// 一共有n个机器人,每个机器人给定,位置x、视野y、智商q +// 一共有n个机器人,给定一个整数k,每个机器人给定,位置x、视野y、智商q // 第i个机器人可以看见的范围是[xi − yi, xi + yi] // 如果两个机器人相互之间可以看见,并且智商差距不大于k,那么它们会开始聊天 // 打印有多少对机器人可以聊天 diff --git a/src/class171/Code02_AiRobots2.java b/src/class171/Code02_AiRobots2.java index fdf28ca16..dd7f45f1a 100644 --- a/src/class171/Code02_AiRobots2.java +++ b/src/class171/Code02_AiRobots2.java @@ -1,7 +1,7 @@ package class171; // 机器人聊天对,C++版 -// 一共有n个机器人,每个机器人给定,位置x、视野y、智商q +// 一共有n个机器人,给定一个整数k,每个机器人给定,位置x、视野y、智商q // 第i个机器人可以看见的范围是[xi − yi, xi + yi] // 如果两个机器人相互之间可以看见,并且智商差距不大于k,那么它们会开始聊天 // 打印有多少对机器人可以聊天 From 7f488624af18a5fe3472f159fba056a575f460d4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 8 Jun 2025 18:40:56 +0800 Subject: [PATCH 0255/1170] modify code --- src/class171/Code02_AiRobots1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class171/Code02_AiRobots1.java b/src/class171/Code02_AiRobots1.java index 3309d66d7..dc6c1f18d 100644 --- a/src/class171/Code02_AiRobots1.java +++ b/src/class171/Code02_AiRobots1.java @@ -23,7 +23,7 @@ public class Code02_AiRobots1 { public static int MAXN = 100001; public static int n, k, s; - // 位置x、视野y、智商q、左边界l、右边界r + // 位置x、视野y、智商q、能看到的最左位置l、能看到的最右位置r public static int[][] arr = new int[MAXN][5]; // 所有x坐标组成的数组 public static int[] x = new int[MAXN]; From dadcf3b303a6da5b27266ddc32755723db8a821c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 8 Jun 2025 20:13:28 +0800 Subject: [PATCH 0256/1170] modify code --- src/class171/Code03_Sequence1.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index 8ddf9073f..e134f70a7 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -82,11 +82,6 @@ public static void cdq(int l, int r) { return; } int mid = (l + r) / 2; - // 为什么顺序是左、merge、右,而不是经典顺序,左、右、merge? - // 因为右侧dp的计算依赖左侧dp的结果 - // 需要先处理左侧范围,得到部分状态转移的可能性 - // 然后把左侧dp结果推送到右侧,右侧先获得这些结果 - // 在此基础上,最后处理右侧范围,才能把右侧dp计算正确 cdq(l, mid); merge(l, mid, r); cdq(mid + 1, r); From c5461f4db6bafc6e317b1d9dd78bbf3c57706740 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 8 Jun 2025 22:41:46 +0800 Subject: [PATCH 0257/1170] modify code --- src/class171/Code03_Sequence1.java | 9 +++++++++ src/class171/Code04_Interceptor1.java | 3 +++ 2 files changed, 12 insertions(+) diff --git a/src/class171/Code03_Sequence1.java b/src/class171/Code03_Sequence1.java index e134f70a7..4ee27515e 100644 --- a/src/class171/Code03_Sequence1.java +++ b/src/class171/Code03_Sequence1.java @@ -25,6 +25,7 @@ public class Code03_Sequence1 { // 位置i、数值v、最小值lv、最大值rv public static int[][] arr = new int[MAXN][4]; + // 树状数组维护前缀最大值 public static int[] tree = new int[MAXN]; public static int[] dp = new int[MAXN]; @@ -56,22 +57,30 @@ public static void clear(int i) { } public static void merge(int l, int m, int r) { + // 辅助数组arr拷贝l..r所有的对象 + // 接下来的排序都发生在arr中,不影响原始的次序 for (int i = l; i <= r; i++) { arr[i][0] = i; arr[i][1] = v[i]; arr[i][2] = lv[i]; arr[i][3] = rv[i]; } + // 左侧根据v排序 Arrays.sort(arr, l, m + 1, (a, b) -> a[1] - b[1]); + // 右侧根据lv排序 Arrays.sort(arr, m + 1, r + 1, (a, b) -> a[2] - b[2]); int p1, p2; for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { + // 左侧对象.v <= 右侧对象.lv 窗口扩充 while (p1 + 1 <= m && arr[p1 + 1][1] <= arr[p2][2]) { p1++; + // 树状数组中,下标是rv,加入的值是左侧对象的dp值 more(arr[p1][3], dp[arr[p1][0]]); } + // 右侧对象更新dp值,查出1..v范围上最大的dp值 + 1 dp[arr[p2][0]] = Math.max(dp[arr[p2][0]], query(arr[p2][1]) + 1); } + // 清空树状数组 for (int i = l; i <= p1; i++) { clear(arr[i][3]); } diff --git a/src/class171/Code04_Interceptor1.java b/src/class171/Code04_Interceptor1.java index 60955ea10..a0dcc28cc 100644 --- a/src/class171/Code04_Interceptor1.java +++ b/src/class171/Code04_Interceptor1.java @@ -28,12 +28,15 @@ public class Code04_Interceptor1 { // 位置i、高度h、速度v public static int[][] arr = new int[MAXN][3]; + // 树状数组维护前缀最大值、最大值出现的次数 public static int[] treeVal = new int[MAXN]; public static double[] treeCnt = new double[MAXN]; + // i位置结尾的情况下,最长不上升子序列的长度 及其 子序列个数 public static int[] len1 = new int[MAXN]; public static double[] cnt1 = new double[MAXN]; + // i位置开头的情况下,最长不上升子序列的长度 及其 子序列个数 public static int[] len2 = new int[MAXN]; public static double[] cnt2 = new double[MAXN]; From 894dea001441be04c0f446f17a4c8b8d10f6ebe6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 9 Jun 2025 16:43:27 +0800 Subject: [PATCH 0258/1170] modify code --- src/class171/Code04_Interceptor1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class171/Code04_Interceptor1.java b/src/class171/Code04_Interceptor1.java index a0dcc28cc..22a4ba8a6 100644 --- a/src/class171/Code04_Interceptor1.java +++ b/src/class171/Code04_Interceptor1.java @@ -90,6 +90,7 @@ public static void merge1(int l, int m, int r) { Arrays.sort(arr, l, m + 1, (a, b) -> b[1] - a[1]); Arrays.sort(arr, m + 1, r + 1, (a, b) -> b[1] - a[1]); int p1, p2; + // 为了防止出现0下标,(s - v + 1)是树状数组的下标 for (p1 = l - 1, p2 = m + 1; p2 <= r; p2++) { while (p1 + 1 <= m && arr[p1 + 1][1] >= arr[p2][1]) { p1++; @@ -108,6 +109,7 @@ public static void merge1(int l, int m, int r) { } } + // 最长不上升子序列的长度 及其 个数 public static void cdq1(int l, int r) { if (l == r) { return; @@ -145,6 +147,7 @@ public static void merge2(int l, int m, int r) { } } + // 最长不下降子序列的长度 及其 个数 public static void cdq2(int l, int r) { if (l == r) { return; From dc828378ee3ebfee13a3841eafc3381ebced281d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 9 Jun 2025 19:13:50 +0800 Subject: [PATCH 0259/1170] modify code --- src/class171/Code05_Cute1.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/class171/Code05_Cute1.java b/src/class171/Code05_Cute1.java index 5559690ad..bbc6b82e7 100644 --- a/src/class171/Code05_Cute1.java +++ b/src/class171/Code05_Cute1.java @@ -27,7 +27,7 @@ public static class Node { int a, b, c, d; int i; long v; - boolean left; + boolean left; // 是否是原左组的对象 public Node(int a_, int b_, int c_, int d_, long v_) { a = a_; @@ -57,7 +57,7 @@ public int compare(Node x, Node y) { } } - // 根据属性c进行排序,b一样的对象,保持原始次序 + // 根据属性b进行排序,b一样的对象,保持原始次序 public static class Cmp2 implements Comparator { @Override public int compare(Node x, Node y) { @@ -88,12 +88,19 @@ public int compare(Node x, Node y) { public static int n, s; public static Node[] arr = new Node[MAXN]; + public static int[] sortd = new int[MAXN]; + // 根据b重排时,准备的辅助数组,不改变原始次序 public static Node[] tmp1 = new Node[MAXN]; + + // 根据c重排时,准备的辅助数组,不改变原始次序 public static Node[] tmp2 = new Node[MAXN]; + // 树状数组,维护前缀最大值 public static long[] tree = new long[MAXN]; + + // dp[i]表示i号怪兽最后杀死的情况下,最大的收益 public static long[] dp = new long[MAXN]; public static int lowbit(int i) { @@ -149,9 +156,7 @@ public static void merge(int l, int m, int r) { } // tmp1[l..r]中所有对象根据b属性值稳定排序了 - // dp值已经计算过的对象,left = true - // dp值还没计算过的对象,left = false - // 计算过的对象,去更新,还没还没计算过对象的dp值 + // 让每个原左组的对象影响到后面每个原右组对象(更新dp) public static void cdq2(int l, int r) { if (l == r) { return; From 489ddd9d2f479fe0b04d7f07372e9bf54ac249ff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 9 Jun 2025 19:42:20 +0800 Subject: [PATCH 0260/1170] modify code --- ...Q\345\210\206\346\262\273-\344\270\213.pptx" | Bin 0 -> 50426 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243171\343\200\220\346\214\272\351\232\276\343\200\221CDQ\345\210\206\346\262\273-\344\270\213.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243171\343\200\220\346\214\272\351\232\276\343\200\221CDQ\345\210\206\346\262\273-\344\270\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243171\343\200\220\346\214\272\351\232\276\343\200\221CDQ\345\210\206\346\262\273-\344\270\213.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..2418474b4b6b46a1b7c4c9fe0c81af608534c8de GIT binary patch literal 50426 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

6;`!=yhr28pyVPH% zH6Gsjd8zE7TzuIY*)9fYzNpNRzXvuDb27n(ri#uO6rzlgoG9>ToLi|Wqc1$su%LpW zb_Dq4r@5!`@L()elW6A3ba=1AsE{Q4n0Ay`;;VKAw7g7FZkRTCo%Gp<2Y*6Q^B?M) zKD!~+7a7|jh9B8$C?%8!qdj1Rwbu@TgF{GjTD9+i9Jg}UM(UE$5Zd0@rpKCPvUt+EjPZif&Q8Vj zmiDPof@mG+=CMYQDq)VsI&PHvc2==Nqq&zy!g-wG{P77z&jr`KO@esJ{@ei_ug`b1 z7Od!r6CE2&~ zIUn6kBb#oqgPk0cf^68#G0m55N2!nl@!UANyX@ovLF`P-7`q<>x>lCrKSX-5o_U`o z-StX+eF(ZcXSb|yWphsinOotYNg2YS%$d`XW?0h)rbC>5ko|fGgySB)q?AS?))>m7nL2Sig#}yC z^(}!LWIs(q#pGwJZ=kTA$K(FLh~EG2i2VaE|AB}_D=sou_|OO1Kji;Eovr^@=KqKA z|Mwf#ze4Q1>ZrpCJNnuI4WqWxm%zLtQ&Lls=3%FSYPS3*P!!md^lcT8oO~y)*~+7k zJ!uC}AX*}2`JPdn8!^}>FZ8`Oe$V}0DS>HG&T@j{Sim7Q0t!aTnDiARypLY{QB9~!=aC7LWwb!<76l(8oJ9Xfk{F(_^fUox7njnrk0nWRL5msszp zj5I07Z|e9q12ao-1ck*sgZuCauvYk3s@)y#Z?yAN5)m!%quceA&01~2hQo?Uq=JA= z)qG?0SCOVCobkp;1xv3`1sd66ys+bP)nZMHn6}a++{EU>N*u7&HnSc(#B1;u*q3Yq z;E_#kvu6NfT^gi*cKdU`P1HH<$Z`K^Q!2*2>9^YLWR~fsH4s;J=aS=HzU276^2~%p zPSFl}Xmk3{OKaNa>6d{*_sXK4V4wZrzF}$^lIvLvCt7dY!*{Kn$tuC;M|n$=i`y{5 zvyNMBE=W3CT9p?dULh28w?Vf$e zc}U)|3Pee>JOX5um}O&c0H3%JzT2mM@&9c?_=l(d2hu8teFi-7qZ9t}9`lJv?5uVD&~k4mYRbB&}^n(bCz$ z7?=S3o9iutV~IKU7Sp9fzk4<&r5c`mzGE3-^|6;p&o=1f7sST`YjE>M(5?6dnXLv) zNQYaAH5;jNwvg4OoUJZ4Tudk!n1;9|mVD78Z%%d>4}hM=!_`Hhi_%_EB5@y`njc_7 zcq&I|RbcgR2=3aw-b2EZz8lfNJB3bq%%^NZo>*&$#TfPLTHTrfGFiyN;N2Bb-O(tl znbj*w6VzOk=0k~MQsSYDoJFuBvSn2X_;&qlCC{9<9DiL)0d)q`S+RP-c*HKJBa)3h z%^~vz#7bX(g|1P!2d%qTxF|urUzl)Pe3Ue90Bx+xLEwRTI=MSo$Px$DDy;eayOHlz zXV3cVCq6FMKrEPp6=r@lkfDBeq=9j6YpMft7E{dJ(6(r|ivg{Os(NbB{)1A6<c$N9-tY zMOW+$J9*rJ+hjBYn+7Z=H@mlU)|>>#UtseMpO8vJsNHrAk> zpt*i}S!^!eg`bzgGA4g-KcA%je1ZDkdi)=6`+uOvFMdZX z1OF%ijS>I7$Fu*H$N#Ma{LtgPH!6v4rwRcr>Pbef8KS37SdcYg3ax|!(#m8Bjlf$v zQGXv<{xZE8V)Dls=UT~Fx?^ZhkqHFT34FxC3w|pcQOg`Bx`#!025@B5%!r(QWW$St z{z2V+?IfuXpIlQt5B6KP`Dkak7NU__o0=uUYz@J#Hx zTp|gtV9WFR-^ZN4b7)V}S3|w}VK|~biBhtolvh|3bK72XuIG{9t^!URiK~AFL!_x3 zK!jXj*{EmGWQ&^9J9cX#6R>X*BP=tH$pNcP8$Qn@E_w|tqp*d{_3V7ta2~fb!K%!n zeN4v;HH31BSeAG2r=XDvn?B?o+r2kag(XcdNP-s)O?-HY2Rd>pO?0n$6v*o|DdCD| zZrIdW_!#a&yc6ytXM~EcC^9|6KW3jTf>WHGHroCgTF7eC7(*^~clH(IsPqBkp1DFl zh=(kfrEYe}e1UE8+OMOBNv%v8AgP<2NF}Px2rVD?{+aihsG=2-Pw4{kwzK%`{2e3f z!ryi(2BZw`KP=e-j*m)SUnwp~YRy%K-g3x(cVcU%Q&c zR^TV4&u^VMi2F&=rA5H5aHW{QCAsu*=i3R#cE)C3nBCJ?l*JnN6e1WbAy1J{&ZLCK zq-)8!yq}w|Q%aTSHQ;wnaV?LC&a>{gJ@^D?UZqWCr|2|3g`aaip2YC$4bQ^O){q~q zII>1>TcPxQwL`Z^BYU+Ko%z)B`1P0B(Gw9f%6$d!5QpIwt5kaT*Ke2F!-6 zEm&pBM8q(9vm)^1E~x&Xnfj#dBxjmt5gREtE8ma-X@*i#?g$&ImvMNeY0D5B87i=h z(0iqV6Jh7=v0~{Q-&NLfy#H<_w8m!ABAr+CTur6T*8`kh*XxxHYhTMXj!`1S`u;VU z9xMy7XY+kZ6w`Kge`i)|wR{oHBrG`rY~Qwui#x)r9s3>CfqX27eQl%0h%4;Nl`KPs z?!9L(QM9KO?lDW!y=5|~?Xoi7Jjox0Bz_=`%jjL!@R_!oI=At4F4n-YDwhC%QQc1Rz?jLp zsV+=Xz5I6LmD=oonQi`2Ox@bg-7($8Xu;M?MO%l-5`<1g*?SxbubJk_nT%k0qsEsj zvyG(`rb2nyhRvkCP_;9v^uRMIEmR3uV$?io2+hM-D9}<#5W1W1qnZ!O8%eM~HKePK zX)vsR2Ov0GzeD`552)J;zKFr9Xn$v<&?$$f6no+KZVtsf1rlP$- zUOU{(iCI&@EN^JyW+_$1oUFR7plFfX(j51VPIV^xA}tZZcwef4Hnatg0HK}?D~sdy zfUmFCnm(l+mq|ZO$S^JARg_)45jU1y^0$T}4}Ldr`v#Tun9xs`cdo=D&6B~D`S7R! zKSv|ze1NW0Euc_N=#otna}qbq{Ee*G%t_>z!)JDyL9M|dMRRf2H&(~#DmIU1!Jr#^4DDC&GwHEyUK z`r^n|V=oJ5qsx(Fyds)^t9e0vyj^h3jfykgiTe=G4M#2kCoYKnO$8X6-BnN(CYMB#B2^iN#8sPE3I%Hk`~;) zm~lB*+zK<`KpVK3jWWs&tT(Y41H!i7_lLppa$E=F(lSiGJkW$CN0_1NL{W^6+Ogi{ zm?g+;_ftyt^aEPtwug6*Iq-vx3$&3x13YxiI&l?RdDhI8uaP1`2BM;x=~|tr46vNw z*Mwyh!Yoy|N}YcGR7&pHWKf3FZDAO!x=&>MhBHporBPcZb?x2h9DH&9GE4Zs&C&kw zpZ`FHKp|8nV0>suPakt+|BfMmzhX$c>WV|!2SX;+7(HAe*x5H>hx_E>k7QEa!kjX~Mi)k=KP$^AAi(86pbMp7{vdK60Tg&JmU@$>0VlEho)E2yNuErA>x+nsrEYWlSuK5;xL#|2AmAqwVrLF~?dN~IJER0a*WGj(rOw}8$wPoscH!U?X zTuC`|RXf==Z}yLJ8#J4>dAg0^s#0-`J0cp`c}10-i&{0jafomkzdg`7CU7}gOD%Is zZqFCLlb_QSZ@vA6`1rHqLK_)I_}&tbGWn9?%LcQboGZBd^hSh0Q7ecYZDRP&l@8H8 z&rxMqpd`e`@!;UFFxasE$N8%ziHQ=?I?6e{;hjzB7Q;yp;6h#*m zoWZ<>vPkE}GN1Do< z&Z$}f6Tj72_%n8N_Np+EgU3B6Y?yma5od3hijM+@$k)u$x;)7ge>l|dtxf$Z!DD6m zmeJKoB~JvVuv+%HUOJTkN@l}qP{C3iv-vV8BZw2|2kS36k3OSeKGgL3gu*Ip(66>f zoNdWO))cco?Blj#PO~pDsMe(`UAR^y8f+81d7nftby2!nV#)a&W4q(Q8E57;8;|lxWzBJ?G9p1HX9qWVTgKSw z-^8s| zEKQ`J*#Uff8KfjAUlWB^Cm(IDXzs4Wmu@n90L+$KhYEL1u3T^J6gYX(J|Ft4&H_&E z>`j5Q!F+;gPXy&wi&dB7+HagxbXjHAw_-MBZN50zk4Ae3ZB_Z!r4uA;0xUoE@u z@aUUocu&~rrxT&#emgV>{z^pBmRz2>(amLspvaZ@E3x4*{0(0!qqfXQeyM>gA=4+t z#RuLr{dCz~v1w_8Pw8$s6;w2eOb(g9DYM2J#FtQCA^be4ySOnn-|;s4xVIh*(i233 zyYHf{<_ZU?e)(G@pj+I|?s2R^AoD*rl$cLBb&AaH_2@k$$J@DY$(l4=e9f_I`5_Y5 z2=mf7&5FR#*+a^L0hF?@_4%w_YRgwvz|E9R^9bE%W6>M;gWbfu;K#Wi?!2xj&R!AP z_w(77xAS5hj9k|rESf(SP8Zc-3x?3r1^sF~G%%0!UfaE_tS0rmq5rq!`@`%11Ifqp zntSN^K|ZgKmI#u69@qJA&g+;M{|bF)YSIoL4ZR-{IOVzV<(Du;Q8`fupvFTkt~(M) zVAe3)70${$0cSs*gih~a`r=FALU31r)^(|ZA_wF~}JGelexmHs7?Q2HJa zlwfz=>Os-V!Pf%?Os^)dd)+aW482_54GVp2nek~7%6d#k7z}z?(c=L4o-y5Sa?xe4 z#2Cip!(pQww#Z&PFsc&usp~x|FI{vD3N?INDud-Oad~3P%B3SxMf7O^^0Ziy6xL{7 zWwh5$@|5u!>42PDQCv-fVGM>_$o;zUDR)C=5d*E@b@&>XTY8X^-LD)H<|G_qnoez1 z^!zp9%l*=hv>!tYe#91Tc)5{_Ijg~F_dpc9>ir0Gyy_$*-<2}*B8TL;8?Z&2I>tju zdcXG^ei!1@3pmNM!Z>i3h%O$0r{{NMagO>DFMEc) zu^PEa;DM)|EUsc8x7gd;<1fK1W6*Z3>x@L-DRX|&rIvU7#es9%eG~;92#QAVK(yj{ zRdcytK&9*zh^kSLm{P@FOi_CPPKd4-S41zZY~~7vc&#~la5=IhyKFqA_dZlAeDN(- z4^>q+Ni4+5jhN${HqBW!L7z(ga%$PBmu;MC_7y0Tw!;nPH#%>O`Wd|T%CLwut{M{s zvdXn?Wm=A}N$?7Wce1EJ<4h~UfN^v0R=CBuNz^tn`COA)UM$pHaeIS5%VVe5vADS#@E6QM}=cdx|bDr6!2O6B$wE+ zq4!~f9_oX3>w|99AQm}rt4Mc!ZnP}f(UYkW{Scj}9 zG2dJGxz!l%%De*@COR1DS`wdm)5?;LnA>q>)d=IKX=P>=*fVIwHIirtj}EMuGjv~J zkVYcOPe0lqQ{kWa2%j{%G}K1%$j)&K<65!}_L71!IC$zpe&nGssVo&2r4`6!7(n=v zC|-^r3WYF;kf7%!8pR;yDWDBQ7D1UY)M)877$BR8oRkH%QJOwBZmG10paO+*zUnk?~4 zS<>xcAG#EGa6D6fXJT8V{jf3oHOmm?_`D4ACD|DI;kUzSv2kSigTi2yJ#AzH+c}if ztJ_WOX#%?RG~nC)WT$vA)c)aXKbtcxEN_+XF#=8ONFsWuxEI28lD6hyfck;vy)oWLiQ(UCl3-ho}$ zq0%X4r(U2@c{Um(G6kR+3D(v2_Rq=k^k!e@mony_h^drH)hk$bRy2%0uke=iS?Vg%6ga(N z0qROz{D_oXQA9SQT0)9MGd5H*e~|^~q8Xq=uUqP))yV|6%MAEncfe8fCP^-i_7M)e z9jeH~YEdijCz443)db0Fl&5;z8BTjMAKkvC96JKy*Kv8R>uDknsk!yb`A}oBK7n*A zf%bk(1n7avdot$~l)RKR^vPN?-C-=WS-@mPxrv!GNnblhkSAQXOh7Q`nF00DAHwcy zg;+iZ+i$;Ca4EfLPqUG_$q4!y5uK+CCP zeV)(%A-!AowKeFUv+JMqTFt4E#uc^C4D-pA6+4{^hG z*o+U}bgQ2z(-#|QKo=Vc=*EgiHf)FaJ$aZin&HhQW{il8+)kK3n%-i?Oxbyv-RWbT zqZQ{y9qu6?BDubl@`H|Y;<>b zr9IX08O#rC-~NZ>?*Ed3f4KjDAOm-otl5q~7)bT;pZ)$V1OIaT;7o1hqaEvSQkvZZ z{f*D8$b`B}yvsn+{KzXvD1@vWEEuGKhEyTTTkLN(!hMEeFfvijY(viYHVx!mG@jN~ zUI4o5M#lhar z_la0*#rf9W5$EdP|J|H{>G@8ox` zhQ@3SUS*6Gv)~w(L0$B7l8d$PG2a+j>7zljDkcv zC>twmds!RPVfcC?NplV!q_bT>z@RH&HnTt2*k0wA5KVSpQ(-wJlZ8;v)l-N>1sX{E z4mwr&rq{OBV2YL@S_a9_F)1)BZ>jS3KfM);;#iAlm(88w#cP>J&LIj>7ZbpL&gcIq zSh`U~H)uL)4NZJo-eL{W3`qh_Gq^wM;k0DR z9!-j3$|QF3A1aY)Ct&f3e#fwM&pU&!+X6=#5UmOAkd~f`>=CK~&qbSEbyM5HGbSN- zSPeP=X|-6uO_lW(rzn!i1Zr(kMYa6Ny8<6=9B>GZnNMmI8dh*vmsJ@H!x@ze=};Pm z)_rqdeglgao8`BD9`M7zXWJYQhb~O_3wRgNw^}pOm|Mu#@fr_T>96hqnk*b=H&QZ%` zW4_=SD0ujIVIQ0w((mvZLqpC^zvnCLqdMmTOsw7LUjsZpbMCymGJjP+D&*4qY*Lv7 zoV)u$w7Fkak}(PB`|@s*u&atjr*qnhGU(|dS1GvtXPI4ddyJi%Y~T>(*F-keB-Tvw znAoA71#2O_6RJHP^#AXXm*iHcZ$f8PPlOgj*lG&;q zls?CmBE@L8G(^$@deEQiX8O9R=(;keqt*n$AOx&1zCZ#P*BLMW4O}A4(hV>ZoS#(W z(YR1HW#h#uI&J_B`&9C|A>!BVrAdlr0Vc2E5?iTL2YZi0xoyY0 zk5#GA5xr6OG8=wec3V+`tXscCUU`**9-*K;kG8u9#-BIyI?xVXXFFb<`dF)Va%xET z0Qb%0b(M40!ySru)MgYefE7sUq-p>!EL8Jm=R5d7b9n_Vm7!9vCx@~L7Lm!TlbWig zx>q&HFL$=T+AzUqoneE#bhmA3n0mlN76_gw28pyb{jtf+Wr;)zh+z|Q!2&^MBA>#`>sbW<9rST3Hu64dWYt;1bB4RjB#u{nSZa0NNJoVzNq5xHc< zCn}G%$J*FyDnMRNF5_o^8}lEIIm@0ZORj4?X4g`YN+OD%J3?ZQ1Y{fLj<2T{|1Iv6 zBZm3IO`qP%j-yDPPw~}P0fU#TINf|wsyBF>zA5J6JzxUThwp5$mw{7I5Sg(e|xE`+(Htp;0ge^rLPu2q@NG`ajP<3WcHwSZUMc-V}zJ7A)fbB10 zE({3W@V4z^L#ib^Yh0utFRoZj9%+;Yylv;()ek1eFG%BCbVe(kKE?C1kN6?gaXSnh z*@W`(6=JA9y9Cl3hlJvKW8^OJJ>u5Sa9b)MG0c(+1gFsrLz&l~-GMTxa8kajE-YhJ z>@BB4t4}DMCs`1{EETnlS3W~kC#9VcDx5YAW$htHP1?1X5y>4rVJK@<0M$o5c#2atQdzZ97+~oD zqtwzyl75|``?|MYNncMstR$yn#{1-Zw$_4kNiY>LOjRl?3P>f?2Yd%oY7nMr^B|4* zr!3+u8-NM~V!YrYg}EIA(cM0=-4l%2HJoWykSeQ~LQMQLLY59yQjx`*fyK;BKlVCh zgO%Pb#q3g>@tLDO{V3e>i{jHd#f<*oH?02$XFN|?nz zPuh^6>2DMQjlwLfY2%n=KBZ9Tf9Kecpyk)IXz3VZmX=TaYfLTMi=|o#`(|4u`Dd~` zSFasG&>Ecmcw9ZfM$3eGg2#>?JvylKXXj209{WyM-6tD*2>*=TA2?BYdWaZ`JjL&( zzFr-l4U*v`Vq{jfN={Uzv?dZ>s(D{sdz#eKlmiGAJsD35>Ci8I=9ZwvI{{|wQ2gV| z(K5%~4oUa+TE@LeZI)C{_#xU09r~Pv+nl!84k1{CxTX|aWv68oCknT*nYm&$25%*z z{cD%1G+9+BQdGCzxfk3$TdcC3i-v_a&zn!Q@xt+_EmcCROELAw)=dlu@l8j9j@+g4 z)|rxg!l9?nr3Sv?DC~7{uq15V#Ztg56M72lW?s^Q7wU9j*Up=Fmzj3x{F0v-u_m3P zM)X)BPlwX)5+5{*Y%c{%45-;tM__k7Aw)0>hgNk znP9D_fhzSg#mRa454WglSG%nc%EE+Nl~Ke{KSD%mA?1-nM*h`RY#{Ikoz3O_y2=X^ zdr4O04}y!#!V)K$X@;f-qk!eSS*bpqyeNFw6q86t!N(qAN-m7(Vl{YL`Ou$B+sg8G zV=57sz=>5P3>Ad1WsM|DO{R0-0Ofw_8Q}Y(gn_RV;0$9~fuS2-<^aWl3d;33%0CSE zn?L&9=970|(~Cw}$m@z$yW!7LSNs}o-1W41#Av>}RBR6bo&> zbzF9SgI9Z;DlJhSDExa} z+;kOvuG8@7L6=55>TLF4QJ|o3cs67JTrVCzC5p$Xr*;?gn!H+Yyl@6@@YAI0`4iSn zba#i1I5H}I3JMr&gaVqX;^g>!8Ew1=e;4;!D}tO+-U-}m;xI?dc#p%+cG<7ZD?-L$ z64E?Pm;0tH@qku7PM8h$M{;z5mGf8Vu}6sM&{4_ow!ih8eiaN({+kBWe^b8yr`FVg zU$>cnzWoO7KNJ#dY@Li9{|}<}AHMu;c733#ExSgK?ERPB$m)5q$WQ_%Zh#>L5Ttqo zsM=#j2;W;NwtRVLmoZ3iSr~X^Mj=@EdE~R7ZTLo+scUlzS=l;kOr&t0S!Zbo1bh-z*+i8F59MeP@ywD0?Uujs^6eo| zz!)?mI6jv}mVvah0FFpo!7{G%KAGvnE3tgFY6fPt5Z%Sc(l>nYc?f^e--=KD=7Eoz ziU%i*^b*AAUSYh<^72O(xl0f#NHVs155roXv8pQLhH8WFCv3IADhP#?J%m+ddqEXkrt7F!FWXk@A>=q5JpEsMF}wzwv;4Ob&p zRq3Y2cu6%)9VZ?0diu49X1KbKlgDarLP1n}%un%ABi+$`7>QLI`dK=P&l@R}bw}uh z3MF3}n_W@)YHQ@at*#a%Ix#>p8(>X@FWudQoyYhcfjWr|`S27f-oa%5HB(kSV_7{K zRsTW2NDx$@NJh{-078#`0)IgrLxIpB*l=t_cB9?6aKU2OGy^52BDa7%L$s*d;5msJ)KJD)R3ydZ0#&x&k8%u-q4_KOi_#-*e{m1FpKP>$>gJB-w<#zG4 zZ!FD;aF9+B51&}GdCdz!c)qP|E*cbW2ld3%M6=ae=ea;Odg4utpfnZ!aS~qi9JWor zv2T#f`6?AH<1evvX|X~ltzG&fY?&w$mV)H)SHCK@#8{O>!U7ZiviA9r^fHc`=gA+n z`UyV!@Nc!Cj2%Fq{f~1-$l0A9YECc15Gj&qP;w&CX+TA1CRs2vTzdJ&8CwIF{{rVZ zV9`q<_nhQDt!Gv2`FEKw|!j-rioi6)NZp*0Jyo0m&cDV!tL?G`-6 z9SzSQ-9Y7pg}-wc!GMJe-Icq}X#PpTRAo+(5Je~T_AtOq4p&FNlM(!~ba1;c;pKV1 zhUGwRn63acqlKLij3JqZr;!4ln;N#HF2g=AtR9aDv0`8t4DtfmSvcW9npm2g5R{?( zW{~r!j!Xi;JsMyw(MrupK~99ojAEYvHMdP%1T|Otz<@(ql1&BEQZy!iz8 zId%Wd-LbX%o5*dNy~)!JCPKZhTEw)bRt6}X@lhYSOUq@OX6zKc#A^D0$Vp=KSA`nj z_ef)xf_2OK8v)|Sr+=L#WuhN?&T$H*{eE16=nsE4c)g9pG}8BBs+qBdHkDacNjxU? zBzhMDTMTX_4fFU~Vl9EZspFm-V z;FKl!?pPRf5FU=;-?+XfJwI!7{M>zED?bl! z9zW$qa3|P@K(JqtP+eFfuzhg#l3m$x2i4yyUK5p_-o6RbI8RN-ILKB!|;u$=@E~$ zkwq(CI1|mrzdbXC7FaUR4YvlrC+)0Ze$@ad1}!G_H{}{`9{jW;^hu)cA$$JyH$y z)kt}adAFhki%Qjv?NXr9+>0h@b2o>EqQtz0w?$5oehz7V5_w~yEn{cx-g~HlFgHs^ zy_?IVd zbLW}WKmtQK%VXVCk*L(f<>gCEWSbw^65zJWRv%E^+}sV5Pa@k%OQ)En4;6<>WhCmV zN`X2uG>@2t;ARo9rs>*Vbp%uFGobpU4nCPg+M zgoR@B|3!+lWZxwcjr%4=-e|^1#S@MEMT*pn!N&jJYk!d<1!M64B1KxVGm8Glr|GkA zQY7^$@ZJ$KW5RXuU!+L8?!QQp0cjbG)_xMxhs8Cm^m^}`ll)}!-FvXlr6DW!ldn`d z6g{_2M-RyXM|jJ3uM&A>>aLbuCldUyw8(D7w8;5KZE}3PcfPkw=w+f2dL_8*0eK$# z;322+MBfWB|FkfI0KGsY>T@XPjgxTERqiGdq|F5T=8bsB79HiT;(6S3GX4 zL@ufB;3Huwl_nwo=G9|tk5S#oFd>tfEkneY5N`q2fF$R)HV2U|V#SXzL;iix-B7#4 zb%W+%V&d8f3YMP&HopwV$z(c}$=+;h!sU3soNy*)9U0VgwP0i|kW4b(-(~K3$MUkb za-yZq!|J|oCI^F~2&h9>k)OVv&s;(&5vG|E*$2T}!*y)=Iv|XkZluEip#h9hRdD=` ztk*K~bl}RyHtN{2T3zPY*#lX+ErA!H29uv*vRdI!6@!8$q`_AKH+Vjlr)>RFAvv}p z5r{MCARKCBxDo6YC#$&{LPXs11D1|n0N4E7r9f7QWbVPIkxVsT;9fHx5C;dcVI!sL z*Go}DEqA|2BsK$P3Uc*b&L&8(cEG@Os7$A(vKO5w4&(30?_l=gDa}7sNNlM9&MGQO zhjy=>=z=UzmsIKt2m@1E=im-NYu?1_tt3VwPZLj57HCB{L{jW#l#NjP@+LBv2(&+1Ig&XDy$wF1%qXVJ1vgPGFU=9fJ4t%c7r zLYoSOd6@+`lrzdIiuH($5{#IbtVS1At%NiwYB6I$!6O&}N(BUzDrJ!ai^S|GVR64OEThNTW!2bSjnX zM?3_iFflh~mMsAAgZ82Kmw{AnCNr4nXmHS+20mLUiza+ zq3z_s2+s}FQ6PsvBqWr-W1fpmz3G5MRHmfenK$v*MYmc3xwjl3b$N^cia&sy%C6PM z2Je6Hg=e}itA=x7W-;uekK7KXqQ1sh%dExpV;T9_j1lxXTChq9T3vC_E53Jt$Q>%m zRcS?kE=P2=Z~402RM*385;8|i1PdxwCyg0vJVaD^{3$G6NzSmiWmSex+|p?FgXg6C;iNNXeRP6)|+|^ci{_mB`tv3rb0Z z?*`62yXCR|bt2jmo|NdZwH2n4^VsE%>`WWgnRp{34svA#r(7Po${oszgMa<8aQ6}F zTi4EY^&A!wm1CVYmLKc(>$Y272*P)l-ght!FwCoz9ti?u^^ z+Fw>r)R9aXOW(w$u}#{9O6_7je9~HH)8nrx6?N>VLt%Ck{i}W(c0_~0b{`3kSh3?A zfkc_2-Q;rfM5oml6yB_sb_f9nQZF5is6Sh_-zKX6^D^|~)B3r1$EVh_sJ%AcCPV(n zav3qP&`l6EEEjF|8f}>KczILM&fwX)-c=vQk7=2N-NK{!Qe>$Mc^TmuQ0j-K?Z^A( z3^J#MP?m8?J;-XN4lDt^C-w zJ0#~mGNep%>m{x4aQZH>%N4QBE+aL55#e&NJM0Vo;^LG6Yox%Ug5B2`_K#+Po?3Xp9@JFr z=TtuIyKIC0&E`}bk7E5O(X(gd-aI%>NvdTulfow7IOS9nb_Ai9uiwy;_xhK!Zm#2H z(zkE5qQ&~ZtJUATqHndD7x_!AqTc2B7osmZuTo$%1OnqE#8<90Mr%7Q(YBbgI}4SI z@a6kxf+Phg(DxE|>4C!#uk)yR-}RuHTjL?u0OpWv!U~+nHjh)MpsE9fImzXSy-3F zN%MwGOV%~F`qV&^KyHvlzFz{#X*ne|sj$L~s+dS)eW9%M^i8YL<_va6qQ-^- z`1~Gb?#|G9Q>DRO?TH@-i+hatZ7Ur(OQb?5er~$7RvM+fOOpht%u*E7z=|)BTG-?{ zWR0ujS!fu=P7K#7m0>K#d~Qfw4Ybj~{QktVUTw*I)ckx{XE39;;w^9pTBLZ$i7le? z7chSm2O&c|oB_yG*^pl8K zQ`>fj*nHDpuzQ{|w_&k|)w!~C#B29)ugO>uqUCPuLjAZeYrH8XhTDg}3 z;_axENJ6U1c&QsD&2u(K0ph$IwVh~w_efVZa1<}J#o@AqKbvnrTNfjKTz^dkCFQpJ zj5G2=bgrDvOx`Qq@%7O~Jhy=r>l`h@fbM6j1IepUW9$fNr=3JwrRuVGC^+ZGxhX~1mJ}1e55mihUvnvjN z3|2|4Xh-rjB|X@12|4*Bt>kesNOtB*rD)Zsj3L9V*onwy>yl)X#uXU9e_zzeMfdkg z1f5SzGuHhwYE}k=cY41vf^Yn08;a)hx6iEGG&kw3g>g9KjM8i~*7Z{HeHasU`*4hK z?7YCuC}exd0#Ufs(y%JXV=P)yFK_`(6*M-u+Oey{fC}N4RZkfSVWbcy^u~pySKy>iSODd`?$p#=d zJ}J0ICpqkg}_#bGo;5NzAdn>(s2ZJt+~&<~a+_+grrvEU@mCdqqjvWgK)O(AC~fv`qZIh}Ya#Ei;@3v(9S>|;ZPRxd zGH+TnP1u=Qft%Os!pFfxzg?S=eO~AhO(+}xw#UTn=@Ola58hc2Q&b);CF~vbBT*7S!Xy?p+cw-!+)b1DzN1$6a0T>N_h z{r3f_%J^OhAcpU!7ri6m+DC0l^JlH-RLIH0=E1^7tyq~ygNV*g6TaEmy^fV@_ie{y9pnf)|O$U2_@MbV^(b#-0yRE%vUWw0axF|oWKGI(A-2{DC$_-gS$t^X%l zTf0p5D;mcyZBLjG5o^jk170_i>HiSl%oQfjdo^Xnv^r?&!5PI0`jPsm3P}-}KTs5p z>uM(WQ@B_>4)anP7BT!CZOO=rRtN%2qxLCENi2UbnWfZ44c&pv2!&#Edk*~6_!*g# zp>DjQ=7fYzJ72c(@1nhQ;`fn4lxB@^6bSfKgv0I|A|lLRW+wv0nEb5>7>r!#k{f)> z5HYD=1%wE0BhaPe{q!;1*~l@{$$E!D#o^s#Vam;vWFk?M_)#&4fguV88>-Aw*`k{G z$I95(H4f3^jMwMJ$^6q;L;)~93%MZCNkol~^GScJrQCsXvBt;{;#?M;fOJ!lmb>Tf zpq@-9DN^4?VtyXcOIHbq`L=*&^7A*-Tz~v?jqU9VcgrIg)U}Xk%RiKU|88K*6`&B??u+Stfr_!ISWYNI9a z4G9$GEfGEC2)g#7u8N$3&7f?m_P(0_8Jf(+%6fj&yO z3QMAdLW6?v!tMd?j*n5G!L)Szr8Z~uRS=b1y+auGpE;W$5S^ z^z`ys1iu1%?lae*xalN3fHyh8L)zEvE-Tiehc;i#O%KRS9h+mJnzpKBIkrB}X>}Ja zUJF>oe0e$-EjI00Q)cLk>1^5~HIc$jZKl9p$dU5brcE@bS<8H-vbQwbJA93+LOd?B zLh9XK#(AceKNt6gCE(djedcU<9xs#X?f=;DH098;%aUa^Vx(igx+O-rKZG!~2QvoN*X>);;_Crd1?5p+++&j5hVEeWUQ=dt#{w7 zXL*hgV`!zSl`xhnQ3hI!k|)^-Gm@WVLPXgsFSf)-^@!$^y=_1IsD?uRij^TRi{N3% zrkiZERmq$(H!Gb#8132-+qjQ3%0lbRBQ zxIr#Rh_Y2G=|M|n+S!8H)|&17s>}#q5gLCKm4dmGyU}QQQ>UYKy}h$N)P|1s_MmAn zpLmob3bD&Te8}}RhzA}{SWaA~5k)^VI}CEuxkY1^!-xPiCdhmHon&)Nbu78@0}oTi zaI>@fY|3V4cF<;uppB{Vz-qGHap@1aho;pQU3+u3oXM*}cv|xz0~4aN@#2R~q|A%$ z#y!p!YxQ!&+1y3*oD9F6<3?xqOuA11SBXLzW?GT z`B;L9j=pDs{eL?P{QK@K!{!8-}8l2Z;MzGk(*skgxu* zeoY8&{)#8$Lmwpd)Z=}Ati3Kq`JI@uf6~!IT1j#T;B{U7fiFi!YEl+VyRPoma-UWg zH^YQnJgJ8iyARuK@F~SWQ)^f6(cC`O844FJHImaia{M@ zrOcdIEic&=V=zuion;o{vApXt#pTiMD9=zOv~m>s8q*~-RgWpg(Ah4N#u!<GMF>@|eh+s0lFcMD9+*C;l zj#>Rjvz(h9@X*$G>KYRr2hN#4vX=KK5-klb+tqq6O3EY#BZ3E)@@L& z4e46d`4-U2fj)mhZL)4BN2JX=14(o1vO^qH{meY1L-@zeL*gzCj3JCBJ_QH4oKrJM ztd^J)tq+)sp-m_P9@Ow=r0)Mc3S0pb5)Z5aXUEFH335&B^}+HE!a}V~Q4G#waEaB3 z#bcvZN3Kj;ht`2o50J0@gm@!{Go12iNw7xZWL`UQ4q*w7s!#XJ`jxDdv%K}@9bgS7 zT)-vUU@1~fvg22VQmNk$xN695XV1)M zfW1DmmIfi`UT-r{128HKK1=WC42m@r$y)wRiW(zjgAj06CrR4AAPrf2qE|w!lj|T6 znGf&=hf-e*Kd}a?QY%j!SW+7c!v&ab@Ph2?8CgDov6N65m?RSg`*!L^SuDdshpIw^2IecJ0ha0S90#`1J_g@O zRu<(;6_#izxwdXeL1gwWpA46pk0qq~6ka@hih}l6KJ)L*nu|(v!Sn7itMoSd=5{ck zo&9xqWEV_oNsLQomIc|?(iZLprk+Kpo&`5Xn1DU~2mPo^up7R zD49yv<03i=_cP>0%#lZbo=94&_KP5DH-qc|OgJK=U7>_alN_bE%#n`4sleTpTei1~ ztX1}CLsN2dta0p6?Vz_M;|&B|!nSFBlD%wlvbv@9?eaF7bYl67K7118${>#;jSfxM zyiPxe#Q zQ3;^gVe%xPm4dltFP3)i*ka0tBwS|(UFVAO&#wRl^L4yqYqlEw=JIAfE~O^Y9q47L z@!WDHG}8^J*0ED`;yhwsS2fPD<1(+pMeX%bXES;Ys?6GbN533b%R;S*Rw68E@IX)n zT;B_wv^@AzNC_&QFj0&kdnZRY{~8!V8aevV(P05gs=gYP;S_wOJZzPr&F4vP`*}~7 z%?*!tmjZY2GG_$vZp=kCEr<}FnFj#PSZgLDI487g9cuTz7ZXSjl_KZ>9QQ{~d1rR= zAB+GBpC0lf);?kTt$owunVmEmri{W*I9@{Lgj25HP+o^hV?dG!|I{eIClEdtHg2KO zq_CIZk1LHXm0Z}0r)26m3!7lbPq~_ z?;oeU-}3A7H)png+x7h?FK#<}`D%j(mNt_sQB=s*p|W~jb%EkJcfM?|q3keDgC@mC z4sRBhkRll&Bp?rEo;mZSa8Z@@`!hH@ZKW~Gz)VR20_Cljlhbi3&9RGpYyI&#yv^K> z1*Wyl`oP^>X`g*k!AiM#%>DCyen2dQm%-({CD9Qk8AyG6a@4&mpf(W+Shduw_&jDc z#)MyURHQg+2PGKHOCJc?R8UUyS^tK(9^E9Tq zNEW3azrxRmQHkDJX$5xB{#<03WG-z}NOMdI^~Sjo3Xa4uR$rYAq0A};tQ0E?_iVJj z5IHG5i3a?4=}v5v1Fg;=saxQjR*&q^j_=J3uypP;RZ*>Iwp^Lg6l{btSr$|bN*+u= z_ct-+;kuul!U=iqjiT4A*r!q5_zc_a6`fl(;^`IF?O)l=LVAuY>IvN zLW)$f2ZswLG^RgdK^zAmwDGC)>V)htvK&?pQ+DIf(6%V@M%Wyg3Y(q2`F*g7 zP^NLEB=+=p0=zvE`|>C!?w@BjMjR?)Wc5U)0t%SoVg@FKa`1*kzeynt_@$(xOp(aC z0oF(-f?6?%IbkOp6m#LorO_SOrMfN)J&z&gl9GX-B8Y3v6WO70gk(=|HCy^Iax`d( z8&V0j_de0)zZf^Z2sI@JMVubDF%lt_tz?f0h9+(^#3-0B9 z8SL>X45N}(+$bTi(d%x*)Y8O?i>!o%9tDi3mje*`lAR`!t)S3QR%Y5P(M5k%JEm(W z({J>N_;t!i=J9e08eo151o0St0U3mh;waD=jsDp6_S1Xjl>A)JB0wenbUCZ)cAs9e zaa)sp{N?-PitE0{sq(g2r1zrU?kp~HJiTE#bFTZzu9o#P@a?R(vbeb!vaxrys=FO{ zS1YUBKI-uMS$AJBDBxwGkOla;qF=B!jIr+f*In^sYOX& z=RkowWWM|A%O7EJV|M7^i&c!5bD1_xKbJ;JygXw^8Zb9)9ig38SCL>3v2@Nv6Sk$9NfY`7bx3hgz@ov?y;p~x! z(pO^DR*u_4=15EI7#GR2crGYVW`~LP2y1u5D)K+c zOs{F*RBxzc=^1u%^MVbhf2FA4k)8{p$GQ<{wy)^8^~xw+EYkJ%0r_^VY+BcN$8Rkc zaZUwK^|@wMs-Bl*pIY%exm01F7E2v_gClxug&+fE#eV}NPXony38UvI9q#%s`(A~5 z$P;K($s~>Lr7vn!`C_;W2!5WVg#G05+84Ig2tLDQ8>2YyM4(4KW0;%w3`eGh|#4fjn8j>+NuixgGDvSY=ZMrtmv_@ zjGL6m%;M}e;v|9$wbj5BZDGAKq6=1J^Coyg8PUjK^D}=wq!>R-#b-)GB!mba6EFo6 z;||n7xTw`datQ`NnZdpELJBmJ74rj8lE6ZPE<@~DOf5jovHgwXZrh}?W4Qg1gOet1 zA&ibL?1kESDPxI55=&tfnUko;9r#7@hh75B{5|#E7^oxCN&y*1kgQCK>!=3?nO}~? zG8ls~Ms1TgDib`~Vk-)LW<=AW$hO-^NpxO@9_-0hT+HsDhc73LuZ~vb3@xiJa4`C| zOAQy1Z#plC-B&3Ce_Nwd=riZ(YwHUxiSsUT=gn<-67-Q7oFG3?rGyE;n9;!_5M&{{ z@f>=h@8o5pdb}euu{vBs3^JlCjMRz6(@U-n-iE?H3JW4wBq5~=c_sV~-zVlesSC&0 z=ym6+q-xMw1ljGVKqeg+egCb_iV{BTo^7!-*+CN@U?{nVXfl=$dwIQ&w!D<$cVo&o zNvur)|CEzkRR9fcq(BXo5A2p*CnaA8NIszIBsN9Gk!fCF3x}4zn{niM^sBw2=|uMj zm^KsFEE0y%kK+FKURGfip+u;_3+Hd^EI8%ewduvYwA}jnZJlwrvcXG;vxCG4DTR>2 zyAVj85t4&^K6OEm)lG{9Oe8@g&CR}BlN>7=2AwzX%K#bzkrHC#bve;PiSb&D*|-w> zyM1y}+lqp%*mxKmJSlsQ-@rd+9L`7fV^%$~38gr*wVHA19ydO7DYQub>&BlOK(?tN zI6D4-yRO(DDnw503E=YtJ9Of zGvEo;dwsarnTEF!-KM#Pi!bnQYo)v)$?Hy4Z(>OG<8b=btKMf#+l$sqU%=h>LEh1N z_{w4)wZqoO&Xl#2b3D59s)MXtZgXo5h{4vdwlYt>eUC>wWN2}Z#MM;$qu|xJ+yhPG z0N@z;e#6tRB{mr^VN%y(a#cIvJ&_F1-`T!E-gEnj#e(H(H~%l!*SMn9#TK?{gHPuv zi4}dp{!||PV+20e<-S#S`mJ}Vt!8bxt;tt^X|3gCN+)mxELRu(po$wCA1jF550DJ( z9cbY4kT!@|@2H91@?M7l?_l=W0{^TOKJ8Po&o;b8GLzqxL% zYzpvLNbhmy^Ys0PnFsOYrd_o)pphR=xHR4h)l*xuq3fHv;h72kO5^n9mhXCuuI-1H zy`X~&py$R2#9$!W`h*SPh?D2zK=;K1LV>zBr*5+>ea%aP7O}8GS zR9v|}USGd5%fnWA?ZhbtazO`0CxwuCIi_AwX`aX)`4oh}h9F}*gjj+vk(Az)BEv~i zVP(gf;9_&oVhdq84JC#JiK{JS#iKk50aId*+;b`;=uuX%HJu-4lmMcp$hTn`&C_ygqID!_XO;0D}F`E z)W?Ml1^#xAM|q){kI7&X_6c zz|N)>v`v)?MA~)tFI8biFky)QTJZn?^9Rj0+p85WhR?Wmov)6zQMS3i>^s z{=sj-*ZUj6|Jw%^{<7=;QCd^;DOt_`kJ1`s9=}*oA#sO_gVj}4ur1E?C21w4bqlh? zh5}@`82JpTe}0L$gqQ&BeRqSU?d^Q`43nWJUCm61U(lGymgo)K{hUuc!Res-*5TM1?bFD{NrN7`grg2QYQWSfDWEQA6xLSUAQ zPUAUWhBLY~s)CiAplCCb_*XS4zbTI#A><#l`Qx%6skMn++R=G$7y#B>{%voj^A2?m zqE$71pzXMs^_iS22Bj=!mwsk3pmeG1CYG>o#gE#hFoIG02y^k(ITwwhRKy7>p~6Tx zc!$-Ex&!?K__ThlC5JrMuU?o)_8pg-e#hkqx8w1w#^_85OXMsXMei%Dbqb$ztg~9z zfK?|&160#3te3&p@(Ipefccn8gn zY;jfJZl9Tvd3e)Mpe>jg1T`f-OTW(?mSm78VyzPSCK8f>yuWOShsU$sv5_v^R=?<* zhvFZktpFPwl|Cnk@Dz~pb^Iu>q*rE!|5e?2$5Z+LeVk-R$1bAGB72uT%U&5Jq~j?2 z7)M0*Dl;o&C!u3gRz^a0NcIXPdyneqzS8ga?K;PCfA4?q>pYy}oQKcT>-x<1`Hc7b zE1}tg9;r>g+)&+iLM2EItWW5aDMT{2wQ!RBS&FDF(Oqek`j$?bk2g)ajPOBzLwjQqEV_Dfk-=RcDK3=QT>KDEtSD9f-=Kg-Iv+pCz zb^%psSDKh?o1$!+f7%@z=enkSZoW5i2FiMzZEbL_$Lc|Qud+^fWT`8C7MPR`j&lf! z>oJnQim$lIrP%C49R}fjd7HzA-c6QLy51m85uH`5$dwmb>iLNY zt6i(W_BAi~kB=MIdxP9om``<;cFunq-`{jWEEp_(v9NQmtkQSox>#;w!{`(8>v+UP zo8_MgI%D@|;?G_(+})9UJJtt?nx& z^jB%`eM;#ev54=`$*z)EP#=%x;d|{uYai1ATgu$9pbUy`P7L=?MBFiNd*j?QWa?xv z5Yo|i9paB%Ukpx4goZ_q^J+|NSh=j26oxypea15e4(!Tucnh_Pg+;?wm4_0z|q&V=e%=-bP612TSV+}*~wBU@=KNG zeKiY7J*=oMO>byQJyn$Dq$D$DpV*t+-Yg1!5Pw}a3YNF|xzy3ls)5kV(BeJQOlBGh z(f(2r83)rIhS$dwh;8=2+YtYI$P^44!cPgXA@a1fA-N|ZF+;X@qlr~M*-eaJ2r-#! z@NWTp7d|~{St{jzMfw~pRPIB(NUW@Ojvc>WEhCe|^4u#kJJW_%T~_xpftV_)l5{BN zTIvQ;c~wv-3^H#~KLg8!2}-IWVhP*^gl$rJPnVhTx0;eBZC5>?fk&*;iIV&47b*O< zA=>`f5Z(XS5bgi5Ar}6zAzF^GAzm*Opju^~6>yz=ag6i5!<||;ox1PG(QSy^xy6fc zz=n9ih<*FrkpWhguG?vi7*HSh25Ky$^Idx9?)XXjxy!YfPjNKci0I;!cS#eL62!Ji z)Za^Jk6D-yx&+!UDP}y)qf~B}*sQayB=;OP8>}2~C9)eX&X3Czx!SOk>ao0bsavXh zYi+Aludzy*hGs-ZgH^+Mj9Y^<$f7Opv07gm`8I<6o1WBp%^RFoVmLpDB*!LXZxq-( zKh^wr{SoiwvFzuk_~S+FOk6T-zMdMQRlB7ykU-SleA?t1+2sU>vv+C_%!uaSW<*6T zg>jD}-A|YGyxD+H$Z4Ze+a_Eg3s;FJo8AkQC%!1Kvb4xRl?~ZPTsn{=Jc;*j0TTz@ zaNEhC7%{c4iY@w!xI`f~G@DO8WmdLnL@OSRE3i6?AK?un-?Gynpff6?LR1#jpj&4 zAB#7|!X%cjH+|$Bz1sJRrBXOPv?=n;fFYTFh@R#oWrPY-Ly`iVy`3XlxP=jZML4i5 zls?%1N!(((xbP}0NmKc@Ks@^=5omohysOKuu-h9QXKKE!P^=!(7{lj6FU&qAXCsj&a z5yaDiw+efgC~1@RSiH6HkZWTf;-CHS{r0ri^I8OIr8oSNm$bRIqqO5=x7g6;X*;1u z8$w*T(~H2#t(vZD#1lLe+<+zVMc&HIW-9WF!X%*)u@u*!b<%#GSbT^DB@k91^`WDQ zWD7^N;AzobL^fZerBQ96;iQ%~*(<~#u^zi|8Ta5Ufw^@0#}^MP&+R2WT`m?=H;Ijq z)E4iW5Pc9lMKBdt@$=ZS_Hb|z9&sm!z^=Vbi~Z7xa#ux#wx^;)Qg_o-68&tpbAjoD z*{=td#Le<=+lwbI1gp@76AHHcu_StnofY0BEwQ$|;_ag-A4o~i*snRRD|*(JP-eom zLn`c-sj25frzta=d-gt%)2V9F+HPa zn2h&&F7jopliwY9y^=9sVd(CcC$!Z`^4&GhaiL@fbpvW&GboohV}dv>d-+17dz{() z$Ov#Er(ukzOn*zjCUDFHP8Z;l#`i9~va-3?f@;NIt$HiG6{S|4W03El(J$7VmeebE zre!63Og2Wu$I9E9ajEljKr-L6Kz11(flrFK(F{DJ^5qLS0vA5sGeohkS&F{tw?Zn@ zkGqiZIOzICg{^uD(>{l1uk3&DrElrhaj;tcVbw-dpfYdr2r4rzF;|x9Y;iKsOdtwR zSDuhleyAl5HT%tt)czNO8y*ETi_|WGoIG?DD94>XP&~x zd25;$DjFv@8azr@C#t<)3%HV*hEEblF1%d2a<`0R>(myL{zT-g)|6 z8Q+Mt)ohn=y`FxutHIOV+mTws))%6In(36Oci>qF&8Z?$dq`8Dd0$AxVP4{=y>Rs> z&uP3Py+B^|VhC_t4e1JaGx^VHJs0!awlF;xcUzeAk#Rawj2)g{ zrS_TlaS^hj$17A1>CdeQFX^>6oVWZDu?AsvEXFyXZ-829Z*nY}&vNw$agIT(MM!AiKXx-eim$-gxo#Yr(8q&;?EU0$ml@k7CIcEJxRi`4U)v=V%BY;JN zmRqIoiD9|WNFLH!1{sg?95Zx!EmM;9<#{Z}kUB?Wuhn>@s5s2&bu#5Z{0m+Ks<*=* zIzp>>ONbq%aM|7CxOY1P1_=~VGf!F@9t-OX%!l@*d%Al|`>ewmzw24g|LS0s9-QM4G=3|gx84G~qbvU62@S6d4eyM4n&97{f{GSKrII4cR`W{BB)Jk;g<~ zFjLx5eXM_rv@2F;l)O)fU6L+@bE^23I&nAt9aT3`S-lASd*q3NbvjU-r<^0uceRg< z&sSdaHeM4Cqi-Bv-Ao-&p;k@XO;Yn-Q!45D9zHc?zM<65yuqn;;)Njh+K9Pdkp77I z{UH37V}jh`bm`^|L+8jOC`aXr=g5g*x5G|&aq`Qj5kKEdpBIqWVD=walh$vU@e_f2QKqBrAh$$mF?{VH{gHt$$1fA(b zKrB-mkC8&@kJF8Ab&8y6OuW@cC{CxYbrQ~lNysfL+cX(oVmi-^c5O0>sy%mw!&5-xZ(LXwg~? z779z7yhoRuHaUcY5~dyP@hY+F6c`l0RBri1JBIQkg_#hAfXJf@uTJZd`4ix7c+w_( z&L#i+Dz)w*O}+=x^}dcu=i?VU8>;=*5@Syoy6%5AW(`w7(bM^bDe$J!3G{~scGrp8 z-d{Rr|ML8`i`OouDl#uq-QO;rZj~Z^#=Sei&dk1+Ov3!UG^Auw%WKUoS*=QAM6ojX!E5 zWf-oQdl?svj`;LmTMaym51qhc3JqAdo%-dzE1IrQJR? z{Kl?gTXOTeN%-9>jW<&KZoVcGlN@@+@FogBhx_XsP26_{=eIEdwtT*V)n(@sMXs_H z8V>H?Z(@xpCmAs-e1G@G%OcbkNnbjDI7wm_PkH&Xt;-yuJeSWr|Byaf#^j$gMs1}E zy{cGad4X8l`^9@9J8qZ93!k%&^Uy>o7UG;}_g^1TM!hwQ$|QE%QA|t=$Z!Zr@?g(u z-Y7hGA;M&ML9TrMu_CK>(AyCmI}OE!X}lc+l2_KmY=o9-R`SSjWvfKElUM%)?&lJJ6WLakpi#i*Pm1W2SG6~6CP*&L{kO)H3M+GfdVZR9q@^T z1613|0q)EPb#Q|HuDqDZcOqi>!hmE0zz-0Z0(4OWO8!Z14u@k)&F-9SCk(hov;-zB ze&5UA>obrV4tL>$JHecR=40++jAvpY0kqa?{0_GZzK#R6;y1(D z*2)6*U(b`EHwWGzFmZMs!6~NzIUIlhZZHkUoDvHT>jUae$$?u}~+g>JB7!5tEM0L5DU z8>VZR2mqm-K>R>-p(r*iWRTE<(@+0*p$42-aEFBcJyL~9rp(Q;(gBM84Nxu7h2G-A zLIw#v*zJvpJ32>?^J2jr68d)wIVL$kv==W9=*d=rnvO1%oDT~bB=lfM9478)q1ysj zaEFBc-DZbL9tt2PW=lp(kXq z;0_7>J9~mjMvs>a7D_9Jg$xpU5JwdgceGFfB`ml@LjMM5#U!JLHw6oYC}Samg#HP3 zipc{j*aR1mE9gzi-bjJV;Bh5!jVx;H@gH3Oza z-$$bz2*TO{pdalABP@N<5FkNEw|VsQ?qFJ)9~$jI5Y}dXbdjBXh=u?OI=W?}p8y04 zVtRx|I}n7mF{2;f03))Z&=4R&N4H<}Lk(cs=wme6fgr4wCHnSKFd{Ai4FM8#v^9yo z=@LxqOhls{2*PSXqVH7!BZkt^5FkNETaD;DIKVWDOf=eoAgq?+(RJuO;4lB5ubcmM zkpCBiwI@SgoB|7K$^ApaSgOM8h0rHN!GPF892_juquOftz_%qF9BJS&49qf+l>C18 EKM^dxbpQYW literal 0 HcmV?d00001 From 1f6de205ca9a10ea5e1182b7dfd5ddd724fc34c5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Jun 2025 20:41:43 +0800 Subject: [PATCH 0261/1170] modify code --- src/class157/Code03_RangePersistentClassic1.java | 2 +- src/class157/Code03_RangePersistentClassic2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class157/Code03_RangePersistentClassic1.java b/src/class157/Code03_RangePersistentClassic1.java index 6fe9f1dfe..507235fc1 100644 --- a/src/class157/Code03_RangePersistentClassic1.java +++ b/src/class157/Code03_RangePersistentClassic1.java @@ -10,7 +10,7 @@ // 1 <= n、m <= 10^5 // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/SP11470 -// 测试链接 : https://www.spoj.com/problems/TTM/ +// 测试链接 : https://www.spoj.com/problems/TTM // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是通过不了 // 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 diff --git a/src/class157/Code03_RangePersistentClassic2.java b/src/class157/Code03_RangePersistentClassic2.java index 3ae4ab33d..fd08cae91 100644 --- a/src/class157/Code03_RangePersistentClassic2.java +++ b/src/class157/Code03_RangePersistentClassic2.java @@ -10,7 +10,7 @@ // 1 <= n、m <= 10^5 // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/SP11470 -// 测试链接 : https://www.spoj.com/problems/TTM/ +// 测试链接 : https://www.spoj.com/problems/TTM // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From afc0cb16c446540e25cf9dfbb9a3fef532b0e898 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Jun 2025 18:00:20 +0800 Subject: [PATCH 0262/1170] modify code --- src/class172/Code01_GiveAway1.java | 158 +++++++++++++++++++++++++++++ src/class172/Code01_GiveAway2.java | 111 ++++++++++++++++++++ 2 files changed, 269 insertions(+) create mode 100644 src/class172/Code01_GiveAway1.java create mode 100644 src/class172/Code01_GiveAway2.java diff --git a/src/class172/Code01_GiveAway1.java b/src/class172/Code01_GiveAway1.java new file mode 100644 index 000000000..c0e109428 --- /dev/null +++ b/src/class172/Code01_GiveAway1.java @@ -0,0 +1,158 @@ +package class172; + +// 区间内>=C的个数,java版 +// 测试链接 : https://www.luogu.com.cn/problem/SP18185 +// 测试链接 : https://www.spoj.com/problems/GIVEAWAY +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_GiveAway1 { + + public static int MAXN = 500001; + public static int MAXB = 1001; + public static int n, m; + public static int blen, bnum; + public static int[] arr = new int[MAXN]; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + public static int[] sortv = new int[MAXN]; + + public static void build() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1, l = 1, r = blen; i <= bnum; i++, l += blen, r += blen) { + r = Math.min(r, n); + for (int j = l; j <= r; j++) { + bi[j] = i; + } + bl[i] = l; + br[i] = r; + } + for (int i = 1; i <= n; i++) { + sortv[i] = arr[i]; + } + for (int i = 1; i <= bnum; i++) { + Arrays.sort(sortv, bl[i], br[i] + 1); + } + } + + public static int num(int bid, int v) { + int l = bl[bid], r = br[bid], m, ans = 0; + while (l <= r) { + m = (l + r) / 2; + if (sortv[m] >= v) { + ans += r - m + 1; + r = m - 1; + } else { + l = m + 1; + } + } + return ans; + } + + public static int query(int l, int r, int v) { + int ans = 0; + if (bi[l] == bi[r]) { + for (int i = l; i <= r; i++) { + if (arr[i] >= v) { + ans++; + } + } + } else { + for (int i = l; i <= br[bi[l]]; i++) { + if (arr[i] >= v) { + ans++; + } + } + for (int i = bl[bi[r]]; i <= r; i++) { + if (arr[i] >= v) { + ans++; + } + } + for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { + ans += num(i, v); + } + } + return ans; + } + + public static void update(int i, int v) { + int l = bl[bi[i]]; + int r = br[bi[i]]; + arr[i] = v; + for (int j = l; j <= r; j++) { + sortv[j] = arr[j]; + } + Arrays.sort(sortv, l, r + 1); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + build(); + m = in.nextInt(); + for (int i = 1, op, a, b, c; i <= m; i++) { + op = in.nextInt(); + a = in.nextInt(); + b = in.nextInt(); + if (op == 0) { + c = in.nextInt(); + out.println(query(a, b, c)); + } else { + update(a, b); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class172/Code01_GiveAway2.java b/src/class172/Code01_GiveAway2.java new file mode 100644 index 000000000..e7686555f --- /dev/null +++ b/src/class172/Code01_GiveAway2.java @@ -0,0 +1,111 @@ +package class172; + +// 区间内>=C的个数,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/SP18185 +// 测试链接 : https://www.spoj.com/problems/GIVEAWAY +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 500001; +//const int MAXB = 1001; +//int n, m; +//int blen, bnum; +//int arr[MAXN]; +//int bi[MAXN]; +//int bl[MAXB], br[MAXB]; +//int sortv[MAXN]; +// +//void build() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1, l = 1, r = blen; i <= bnum; i++, l += blen, r += blen) { +// r = min(r, n); +// for (int j = l; j <= r; j++) { +// bi[j] = i; +// } +// bl[i] = l; +// br[i] = r; +// } +// for (int i = 1; i <= n; i++) { +// sortv[i] = arr[i]; +// } +// for (int i = 1; i <= bnum; i++) { +// sort(sortv + bl[i], sortv + br[i] + 1); +// } +//} +// +//int num(int bid, int v) { +// int l = bl[bid], r = br[bid], m, ans = 0; +// while (l <= r) { +// m = (l + r) >> 1; +// if (sortv[m] >= v) { +// ans += r - m + 1; +// r = m - 1; +// } else { +// l = m + 1; +// } +// } +// return ans; +//} +// +//int query(int l, int r, int v) { +// int ans = 0; +// if (bi[l] == bi[r]) { +// for (int i = l; i <= r; i++) { +// if (arr[i] >= v) { +// ans++; +// } +// } +// } else { +// for (int i = l; i <= br[bi[l]]; i++) { +// if (arr[i] >= v) { +// ans++; +// } +// } +// for (int i = bl[bi[r]]; i <= r; i++) { +// if (arr[i] >= v) { +// ans++; +// } +// } +// for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { +// ans += num(i, v); +// } +// } +// return ans; +//} +// +//void update(int i, int v) { +// int l = bl[bi[i]]; +// int r = br[bi[i]]; +// arr[i] = v; +// for (int j = l; j <= r; j++) { +// sortv[j] = arr[j]; +// } +// sort(sortv + l, sortv + r + 1); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// build(); +// cin >> m; +// int op, a, b, c; +// for (int i = 1; i <= m; i++) { +// cin >> op >> a >> b; +// if (op == 0) { +// cin >> c; +// cout << query(a, b, c) << '\n'; +// } else { +// update(a, b); +// } +// } +// return 0; +//} \ No newline at end of file From 1a6188821dd40c7af7e38d91ccacbce1b0ca6b98 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Jun 2025 18:01:47 +0800 Subject: [PATCH 0263/1170] modify code --- src/class172/Code01_GiveAway1.java | 2 +- src/class172/Code01_GiveAway2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class172/Code01_GiveAway1.java b/src/class172/Code01_GiveAway1.java index c0e109428..4f0dbe3e0 100644 --- a/src/class172/Code01_GiveAway1.java +++ b/src/class172/Code01_GiveAway1.java @@ -1,6 +1,6 @@ package class172; -// 区间内>=C的个数,java版 +// 区间内>=的个数,java版 // 测试链接 : https://www.luogu.com.cn/problem/SP18185 // 测试链接 : https://www.spoj.com/problems/GIVEAWAY // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code01_GiveAway2.java b/src/class172/Code01_GiveAway2.java index e7686555f..cc4ca0052 100644 --- a/src/class172/Code01_GiveAway2.java +++ b/src/class172/Code01_GiveAway2.java @@ -1,6 +1,6 @@ package class172; -// 区间内>=C的个数,C++版 +// 区间内>=的个数,C++版 // 测试链接 : https://www.luogu.com.cn/problem/SP18185 // 测试链接 : https://www.spoj.com/problems/GIVEAWAY // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From feef84556f6e756d82471b9ec48f318828c2d93c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Jun 2025 18:03:21 +0800 Subject: [PATCH 0264/1170] modify code --- src/class172/Code01_GiveAway1.java | 2 +- src/class172/Code01_GiveAway2.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class172/Code01_GiveAway1.java b/src/class172/Code01_GiveAway1.java index 4f0dbe3e0..3f9163677 100644 --- a/src/class172/Code01_GiveAway1.java +++ b/src/class172/Code01_GiveAway1.java @@ -45,7 +45,7 @@ public static void build() { public static int num(int bid, int v) { int l = bl[bid], r = br[bid], m, ans = 0; while (l <= r) { - m = (l + r) / 2; + m = (l + r) >> 1; if (sortv[m] >= v) { ans += r - m + 1; r = m - 1; diff --git a/src/class172/Code01_GiveAway2.java b/src/class172/Code01_GiveAway2.java index cc4ca0052..e27d8e746 100644 --- a/src/class172/Code01_GiveAway2.java +++ b/src/class172/Code01_GiveAway2.java @@ -16,7 +16,8 @@ //int blen, bnum; //int arr[MAXN]; //int bi[MAXN]; -//int bl[MAXB], br[MAXB]; +//int bl[MAXB]; +//int br[MAXB]; //int sortv[MAXN]; // //void build() { From 2074a56a930d594e1b5660c45cfbeb581f7a846a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Jun 2025 21:57:44 +0800 Subject: [PATCH 0265/1170] modify code --- src/class172/Code01_GiveAway1.java | 26 ++-- src/class172/Code01_GiveAway2.java | 26 ++-- src/class172/Code02_Magic1.java | 197 +++++++++++++++++++++++++++++ src/class172/Code02_Magic2.java | 123 ++++++++++++++++++ 4 files changed, 346 insertions(+), 26 deletions(-) create mode 100644 src/class172/Code02_Magic1.java create mode 100644 src/class172/Code02_Magic2.java diff --git a/src/class172/Code01_GiveAway1.java b/src/class172/Code01_GiveAway1.java index 3f9163677..1e3a36673 100644 --- a/src/class172/Code01_GiveAway1.java +++ b/src/class172/Code01_GiveAway1.java @@ -1,6 +1,6 @@ package class172; -// 区间内>=的个数,java版 +// 单点修改区间查询,java版 // 测试链接 : https://www.luogu.com.cn/problem/SP18185 // 测试链接 : https://www.spoj.com/problems/GIVEAWAY // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -16,23 +16,23 @@ public class Code01_GiveAway1 { public static int MAXN = 500001; public static int MAXB = 1001; public static int n, m; - public static int blen, bnum; public static int[] arr = new int[MAXN]; + public static int[] sortv = new int[MAXN]; + + public static int blen, bnum; public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - public static int[] sortv = new int[MAXN]; public static void build() { blen = (int) Math.sqrt(n); bnum = (n + blen - 1) / blen; - for (int i = 1, l = 1, r = blen; i <= bnum; i++, l += blen, r += blen) { - r = Math.min(r, n); - for (int j = l; j <= r; j++) { - bi[j] = i; - } - bl[i] = l; - br[i] = r; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); } for (int i = 1; i <= n; i++) { sortv[i] = arr[i]; @@ -42,8 +42,8 @@ public static void build() { } } - public static int num(int bid, int v) { - int l = bl[bid], r = br[bid], m, ans = 0; + public static int num(int l, int r, int v) { + int m, ans = 0; while (l <= r) { m = (l + r) >> 1; if (sortv[m] >= v) { @@ -76,7 +76,7 @@ public static int query(int l, int r, int v) { } } for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { - ans += num(i, v); + ans += num(bl[i], br[i], v); } } return ans; diff --git a/src/class172/Code01_GiveAway2.java b/src/class172/Code01_GiveAway2.java index e27d8e746..014eb7cbc 100644 --- a/src/class172/Code01_GiveAway2.java +++ b/src/class172/Code01_GiveAway2.java @@ -1,6 +1,6 @@ package class172; -// 区间内>=的个数,C++版 +// 单点修改区间查询,C++版 // 测试链接 : https://www.luogu.com.cn/problem/SP18185 // 测试链接 : https://www.spoj.com/problems/GIVEAWAY // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -13,23 +13,23 @@ //const int MAXN = 500001; //const int MAXB = 1001; //int n, m; -//int blen, bnum; //int arr[MAXN]; +//int sortv[MAXN]; +// +//int blen, bnum; //int bi[MAXN]; //int bl[MAXB]; //int br[MAXB]; -//int sortv[MAXN]; // //void build() { // blen = (int)sqrt(n); // bnum = (n + blen - 1) / blen; -// for (int i = 1, l = 1, r = blen; i <= bnum; i++, l += blen, r += blen) { -// r = min(r, n); -// for (int j = l; j <= r; j++) { -// bi[j] = i; -// } -// bl[i] = l; -// br[i] = r; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); // } // for (int i = 1; i <= n; i++) { // sortv[i] = arr[i]; @@ -39,8 +39,8 @@ // } //} // -//int num(int bid, int v) { -// int l = bl[bid], r = br[bid], m, ans = 0; +//int num(int l, int r, int v) { +// int m, ans = 0; // while (l <= r) { // m = (l + r) >> 1; // if (sortv[m] >= v) { @@ -73,7 +73,7 @@ // } // } // for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { -// ans += num(i, v); +// ans += num(bl[i], br[i], v); // } // } // return ans; diff --git a/src/class172/Code02_Magic1.java b/src/class172/Code02_Magic1.java new file mode 100644 index 000000000..42236e5d4 --- /dev/null +++ b/src/class172/Code02_Magic1.java @@ -0,0 +1,197 @@ +package class172; + +// 范围修改区间查询,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2801 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code02_Magic1 { + + public static int MAXN = 1000001; + public static int MAXB = 1001; + public static int n, q; + public static int[] arr = new int[MAXN]; + public static int[] sortv = new int[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + public static int[] lazy = new int[MAXB]; + + public static void build() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + for (int i = 1; i <= n; i++) { + sortv[i] = arr[i]; + } + for (int i = 1; i <= bnum; i++) { + Arrays.sort(sortv, bl[i], br[i] + 1); + } + } + + public static int num(int l, int r, int v) { + v -= lazy[bi[l]]; + int m, ans = 0; + while (l <= r) { + m = (l + r) >> 1; + if (sortv[m] >= v) { + ans += r - m + 1; + r = m - 1; + } else { + l = m + 1; + } + } + return ans; + } + + public static int innerQuery(int l, int r, int v) { + v -= lazy[bi[l]]; + int ans = 0; + for (int i = l; i <= r; i++) { + if (arr[i] >= v) { + ans++; + } + } + return ans; + } + + public static int query(int l, int r, int v) { + int ans = 0; + if (bi[l] == bi[r]) { + ans = innerQuery(l, r, v); + } else { + ans += innerQuery(l, br[bi[l]], v); + ans += innerQuery(bl[bi[r]], r, v); + for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { + ans += num(bl[i], br[i], v); + } + } + return ans; + } + + public static void innerAdd(int l, int r, int v) { + for (int i = l; i <= r; i++) { + arr[i] += v; + } + for (int i = bl[bi[l]]; i <= br[bi[l]]; i++) { + sortv[i] = arr[i]; + } + Arrays.sort(sortv, bl[bi[l]], br[bi[l]] + 1); + } + + public static void add(int l, int r, int v) { + if (bi[l] == bi[r]) { + innerAdd(l, r, v); + } else { + innerAdd(l, br[bi[l]], v); + innerAdd(bl[bi[r]], r, v); + for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { + lazy[i] += v; + } + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + q = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + build(); + char op; + int l, r, v; + for (int i = 1; i <= q; i++) { + op = in.nextChar(); + l = in.nextInt(); + r = in.nextInt(); + v = in.nextInt(); + if (op == 'A') { + out.println(query(l, r, v)); + } else { + add(l, r, v); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class172/Code02_Magic2.java b/src/class172/Code02_Magic2.java new file mode 100644 index 000000000..12470d0eb --- /dev/null +++ b/src/class172/Code02_Magic2.java @@ -0,0 +1,123 @@ +package class172; + +// 范围修改区间查询,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2801 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1000001; +//const int MAXB = 1001; +//int n, q; +//int arr[MAXN]; +//int sortv[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +//int lazy[MAXB]; +// +//void build() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } +// for (int i = 1; i <= n; i++) { +// sortv[i] = arr[i]; +// } +// for (int i = 1; i <= bnum; i++) { +// sort(sortv + bl[i], sortv + br[i] + 1); +// } +//} +// +//int num(int l, int r, int v) { +// v -= lazy[bi[l]]; +// int m, ans = 0; +// while (l <= r) { +// m = (l + r) >> 1; +// if (sortv[m] >= v) { +// ans += r - m + 1; +// r = m - 1; +// } else { +// l = m + 1; +// } +// } +// return ans; +//} +// +//int innerQuery(int l, int r, int v) { +// v -= lazy[bi[l]]; +// int ans = 0; +// for (int i = l; i <= r; i++) { +// if (arr[i] >= v) { +// ans++; +// } +// } +// return ans; +//} +// +//int query(int l, int r, int v) { +// int ans = 0; +// if (bi[l] == bi[r]) { +// ans = innerQuery(l, r, v); +// } else { +// ans += innerQuery(l, br[bi[l]], v); +// ans += innerQuery(bl[bi[r]], r, v); +// for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { +// ans += num(bl[b], br[b], v); +// } +// } +// return ans; +//} +// +//void innerAdd(int l, int r, int v) { +// for (int i = l; i <= r; i++) { +// arr[i] += v; +// } +// for (int i = bl[bi[l]]; i <= br[bi[l]]; i++) { +// sortv[i] = arr[i]; +// } +// sort(sortv + bl[bi[l]], sortv + br[bi[l]] + 1); +//} +// +//void add(int l, int r, int v) { +// if (bi[l] == bi[r]) { +// innerAdd(l, r, v); +// } else { +// innerAdd(l, br[bi[l]], v); +// innerAdd(bl[bi[r]], r, v); +// for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { +// lazy[b] += v; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// build(); +// char op; +// int l, r, v; +// for (int i = 0; i < q; i++) { +// cin >> op >> l >> r >> v; +// if (op == 'A') { +// cout << query(l, r, v) << '\n'; +// } else { +// add(l, r, v); +// } +// } +// return 0; +//} \ No newline at end of file From a0db7198ccb906e1b899b323d22a165afa9927e9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Jun 2025 16:27:21 +0800 Subject: [PATCH 0266/1170] modify code --- src/class172/Code01_GiveAway1.java | 2 +- src/class172/Code01_GiveAway2.java | 2 +- src/class172/Code02_Magic1.java | 2 +- src/class172/Code02_Magic2.java | 2 +- src/class172/Code03_Violet1.java | 9 +++++++++ 5 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 src/class172/Code03_Violet1.java diff --git a/src/class172/Code01_GiveAway1.java b/src/class172/Code01_GiveAway1.java index 1e3a36673..fd43ed62f 100644 --- a/src/class172/Code01_GiveAway1.java +++ b/src/class172/Code01_GiveAway1.java @@ -1,6 +1,6 @@ package class172; -// 单点修改区间查询,java版 +// Give Away,java版 // 测试链接 : https://www.luogu.com.cn/problem/SP18185 // 测试链接 : https://www.spoj.com/problems/GIVEAWAY // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code01_GiveAway2.java b/src/class172/Code01_GiveAway2.java index 014eb7cbc..3176ecb73 100644 --- a/src/class172/Code01_GiveAway2.java +++ b/src/class172/Code01_GiveAway2.java @@ -1,6 +1,6 @@ package class172; -// 单点修改区间查询,C++版 +// Give Away,C++版 // 测试链接 : https://www.luogu.com.cn/problem/SP18185 // 测试链接 : https://www.spoj.com/problems/GIVEAWAY // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class172/Code02_Magic1.java b/src/class172/Code02_Magic1.java index 42236e5d4..371842c32 100644 --- a/src/class172/Code02_Magic1.java +++ b/src/class172/Code02_Magic1.java @@ -1,6 +1,6 @@ package class172; -// 范围修改区间查询,java版 +// 教主的魔法,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2801 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code02_Magic2.java b/src/class172/Code02_Magic2.java index 12470d0eb..6f424af96 100644 --- a/src/class172/Code02_Magic2.java +++ b/src/class172/Code02_Magic2.java @@ -1,6 +1,6 @@ package class172; -// 范围修改区间查询,C++版 +// 教主的魔法,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P2801 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class172/Code03_Violet1.java b/src/class172/Code03_Violet1.java new file mode 100644 index 000000000..50a88f0e7 --- /dev/null +++ b/src/class172/Code03_Violet1.java @@ -0,0 +1,9 @@ +package class172; + +// 蒲公英,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4168 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code03_Violet1 { + +} From 5c0c9a5108fd5d26a868c2d5cffca50031291b7b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Jun 2025 21:11:15 +0800 Subject: [PATCH 0267/1170] modify code --- src/class172/Code03_Violet1.java | 203 +++++++++++++++++++++++++++++++ src/class172/Code03_Violet2.java | 159 ++++++++++++++++++++++++ 2 files changed, 362 insertions(+) create mode 100644 src/class172/Code03_Violet2.java diff --git a/src/class172/Code03_Violet1.java b/src/class172/Code03_Violet1.java index 50a88f0e7..d462a132f 100644 --- a/src/class172/Code03_Violet1.java +++ b/src/class172/Code03_Violet1.java @@ -4,6 +4,209 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4168 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + public class Code03_Violet1 { + public static int MAXN = 40001; + public static int MAXB = 201; + public static int n, m, s; + public static int[] arr = new int[MAXN]; + public static int[] sortv = new int[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + + // freq[i][j]表示前i块中j出现的次数 + public static int[][] freq = new int[MAXB][MAXN]; + + // mode[i][j]表示从i块到j块中的众数 + public static int[][] mode = new int[MAXB][MAXB]; + + // 数字词频统计 + public static int[] numCnt = new int[MAXN]; + + public static int lower(int num) { + int l = 1, r = s, m, ans = 0; + while (l <= r) { + m = (l + r) >> 1; + if (sortv[m] >= num) { + ans = m; + r = m - 1; + } else { + l = m + 1; + } + } + return ans; + } + + public static int getCnt(int l, int r, int v) { + return freq[r][v] - freq[l - 1][v]; + } + + public static void prepare() { + // 离散化 + for (int i = 1; i <= n; i++) { + sortv[i] = arr[i]; + } + Arrays.sort(sortv, 1, n + 1); + s = 1; + for (int i = 2; i <= n; i++) { + if (sortv[s] != sortv[i]) { + sortv[++s] = sortv[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = lower(arr[i]); + } + // 建块 + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + // 填好freq + for (int i = 1; i <= bnum; i++) { + for (int j = bl[i]; j <= br[i]; j++) { + freq[i][arr[j]]++; + } + for (int j = 1; j <= s; j++) { + freq[i][j] += freq[i - 1][j]; + } + } + // 填好mode + for (int i = 1; i <= bnum; i++) { + for (int j = i; j <= bnum; j++) { + int most = mode[i][j - 1]; + for (int k = bl[j]; k <= br[j]; k++) { + int cur = arr[k]; + int curCnt = getCnt(i, j, cur); + int mostCnt = getCnt(i, j, most); + if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { + most = cur; + } + } + mode[i][j] = most; + } + } + } + + public static int query(int l, int r) { + int most = 0; + if (bi[l] == bi[r]) { + for (int i = l; i <= r; i++) { + numCnt[arr[i]]++; + } + for (int i = l; i <= r; i++) { + if (numCnt[arr[i]] > numCnt[most] || (numCnt[arr[i]] == numCnt[most] && arr[i] < most)) { + most = arr[i]; + } + } + for (int i = l; i <= r; i++) { + numCnt[arr[i]] = 0; + } + } else { + for (int i = l; i <= br[bi[l]]; i++) { + numCnt[arr[i]]++; + } + for (int i = bl[bi[r]]; i <= r; i++) { + numCnt[arr[i]]++; + } + most = mode[bi[l] + 1][bi[r] - 1]; + for (int i = l; i <= br[bi[l]]; i++) { + int cur = arr[i]; + int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + numCnt[cur]; + int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; + if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { + most = cur; + } + } + for (int i = bl[bi[r]]; i <= r; i++) { + int cur = arr[i]; + int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + numCnt[cur]; + int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; + if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { + most = cur; + } + } + for (int i = l; i <= br[bi[l]]; i++) { + numCnt[arr[i]] = 0; + } + for (int i = bl[bi[r]]; i <= r; i++) { + numCnt[arr[i]] = 0; + } + } + return sortv[most]; + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + for (int i = 1, a, b, l, r, lastAns = 0; i <= m; i++) { + a = (in.nextInt() + lastAns - 1) % n + 1; + b = (in.nextInt() + lastAns - 1) % n + 1; + l = Math.min(a, b); + r = Math.max(a, b); + lastAns = query(l, r); + out.println(lastAns); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class172/Code03_Violet2.java b/src/class172/Code03_Violet2.java new file mode 100644 index 000000000..0fc7bcfc2 --- /dev/null +++ b/src/class172/Code03_Violet2.java @@ -0,0 +1,159 @@ +package class172; + +// 蒲公英,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4168 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 40001; +//const int MAXB = 201; +//int n, m, s; +//int arr[MAXN]; +//int sortv[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +// +//int freq[MAXB][MAXN]; +//int mode[MAXB][MAXB]; +//int numCnt[MAXN]; +// +//int lower(int num) { +// int l = 1, r = s, m, ans = 0; +// while (l <= r) { +// m = (l + r) >> 1; +// if (sortv[m] >= num) { +// ans = m; +// r = m - 1; +// } else { +// l = m + 1; +// } +// } +// return ans; +//} +// +//int getCnt(int l, int r, int v) { +// return freq[r][v] - freq[l - 1][v]; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sortv[i] = arr[i]; +// } +// sort(sortv + 1, sortv + n + 1); +// s = 1; +// for (int i = 2; i <= n; i++) { +// if (sortv[s] != sortv[i]) { +// sortv[++s] = sortv[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = lower(arr[i]); +// } +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } +// for (int i = 1; i <= bnum; i++) { +// for (int j = bl[i]; j <= br[i]; j++) { +// freq[i][arr[j]]++; +// } +// for (int j = 1; j <= s; j++) { +// freq[i][j] += freq[i - 1][j]; +// } +// } +// for (int i = 1; i <= bnum; i++) { +// for (int j = i; j <= bnum; j++) { +// int most = mode[i][j - 1]; +// for (int k = bl[j]; k <= br[j]; k++) { +// int cur = arr[k]; +// int curCnt = getCnt(i, j, cur); +// int mostCnt = getCnt(i, j, most); +// if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { +// most = cur; +// } +// } +// mode[i][j] = most; +// } +// } +//} +// +//int query(int l, int r) { +// int most = 0; +// if (bi[l] == bi[r]) { +// for (int i = l; i <= r; i++) { +// numCnt[arr[i]]++; +// } +// for (int i = l; i <= r; i++) { +// if (numCnt[arr[i]] > numCnt[most] || (numCnt[arr[i]] == numCnt[most] && arr[i] < most)) { +// most = arr[i]; +// } +// } +// for (int i = l; i <= r; i++) { +// numCnt[arr[i]] = 0; +// } +// } else { +// for (int i = l; i <= br[bi[l]]; i++) { +// numCnt[arr[i]]++; +// } +// for (int i = bl[bi[r]]; i <= r; i++) { +// numCnt[arr[i]]++; +// } +// most = mode[bi[l] + 1][bi[r] - 1]; +// for (int i = l; i <= br[bi[l]]; i++) { +// int cur = arr[i]; +// int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + numCnt[cur]; +// int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; +// if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { +// most = cur; +// } +// } +// for (int i = bl[bi[r]]; i <= r; i++) { +// int cur = arr[i]; +// int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + numCnt[cur]; +// int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; +// if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { +// most = cur; +// } +// } +// for (int i = l; i <= br[bi[l]]; i++) { +// numCnt[arr[i]] = 0; +// } +// for (int i = bl[bi[r]]; i <= r; i++) { +// numCnt[arr[i]] = 0; +// } +// } +// return sortv[most]; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// int lastAns = 0, a, b, l, r; +// for (int i = 0; i < m; i++) { +// cin >> a >> b; +// a = (a + lastAns - 1) % n + 1; +// b = (b + lastAns - 1) % n + 1; +// l = min(a, b); +// r = max(a, b); +// lastAns = query(l, r); +// cout << lastAns << '\n'; +// } +// return 0; +//} \ No newline at end of file From 87ff4b67d3b665532bff66c1f573fd0f094f27c7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Jun 2025 21:12:06 +0800 Subject: [PATCH 0268/1170] modify code --- src/class172/Code03_Violet1.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/class172/Code03_Violet1.java b/src/class172/Code03_Violet1.java index d462a132f..2a3981de4 100644 --- a/src/class172/Code03_Violet1.java +++ b/src/class172/Code03_Violet1.java @@ -25,10 +25,8 @@ public class Code03_Violet1 { // freq[i][j]表示前i块中j出现的次数 public static int[][] freq = new int[MAXB][MAXN]; - // mode[i][j]表示从i块到j块中的众数 public static int[][] mode = new int[MAXB][MAXB]; - // 数字词频统计 public static int[] numCnt = new int[MAXN]; From 0a7f694f677b9475c5cf524cc1a42b7e10661aa3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Jun 2025 12:46:59 +0800 Subject: [PATCH 0269/1170] modify code --- src/class172/Code03_Violet1.java | 20 ++-- src/class172/Code03_Violet2.java | 18 +-- src/class172/Code04_ModeCnt1.java | 186 ++++++++++++++++++++++++++++++ src/class172/Code04_ModeCnt2.java | 142 +++++++++++++++++++++++ 4 files changed, 347 insertions(+), 19 deletions(-) create mode 100644 src/class172/Code04_ModeCnt1.java create mode 100644 src/class172/Code04_ModeCnt2.java diff --git a/src/class172/Code03_Violet1.java b/src/class172/Code03_Violet1.java index 2a3981de4..84cc7f213 100644 --- a/src/class172/Code03_Violet1.java +++ b/src/class172/Code03_Violet1.java @@ -49,6 +49,16 @@ public static int getCnt(int l, int r, int v) { } public static void prepare() { + // 建块 + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } // 离散化 for (int i = 1; i <= n; i++) { sortv[i] = arr[i]; @@ -63,16 +73,6 @@ public static void prepare() { for (int i = 1; i <= n; i++) { arr[i] = lower(arr[i]); } - // 建块 - blen = (int) Math.sqrt(n); - bnum = (n + blen - 1) / blen; - for (int i = 1; i <= n; i++) { - bi[i] = (i - 1) / blen + 1; - } - for (int i = 1; i <= bnum; i++) { - bl[i] = (i - 1) * blen + 1; - br[i] = Math.min(i * blen, n); - } // 填好freq for (int i = 1; i <= bnum; i++) { for (int j = bl[i]; j <= br[i]; j++) { diff --git a/src/class172/Code03_Violet2.java b/src/class172/Code03_Violet2.java index 0fc7bcfc2..a9e054d1c 100644 --- a/src/class172/Code03_Violet2.java +++ b/src/class172/Code03_Violet2.java @@ -43,6 +43,15 @@ //} // //void prepare() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } // for (int i = 1; i <= n; i++) { // sortv[i] = arr[i]; // } @@ -56,15 +65,6 @@ // for (int i = 1; i <= n; i++) { // arr[i] = lower(arr[i]); // } -// blen = (int)sqrt(n); -// bnum = (n + blen - 1) / blen; -// for (int i = 1; i <= n; i++) { -// bi[i] = (i - 1) / blen + 1; -// } -// for (int i = 1; i <= bnum; i++) { -// bl[i] = (i - 1) * blen + 1; -// br[i] = min(i * blen, n); -// } // for (int i = 1; i <= bnum; i++) { // for (int j = bl[i]; j <= br[i]; j++) { // freq[i][arr[j]]++; diff --git a/src/class172/Code04_ModeCnt1.java b/src/class172/Code04_ModeCnt1.java new file mode 100644 index 000000000..c5c7480d7 --- /dev/null +++ b/src/class172/Code04_ModeCnt1.java @@ -0,0 +1,186 @@ +package class172; + +// 空间少求区间众数的次数,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5048 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是内存占用过大,无法通过测试用例 +// 因为这道题只考虑C++能通过的空间标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code04_ModeCnt2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code04_ModeCnt1 { + + public static int MAXN = 500001; + public static int MAXB = 801; + public static int n, m, s; + public static int[] arr = new int[MAXN]; + public static int[] sortv = new int[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + + // 值、下标 + public static int[][] bucket = new int[MAXN][2]; + // bucketIdx[i] = j,代表数组的i位置元素在bucket中的j位置 + public static int[] bucketIdx = new int[MAXN]; + + // modeCnt[i][j]表示从i块到j块中众数的出现次数 + public static int[][] modeCnt = new int[MAXB][MAXB]; + // 数字词频统计 + public static int[] numCnt = new int[MAXN]; + + public static int lower(int num) { + int l = 1, r = s, m, ans = 0; + while (l <= r) { + m = (l + r) >> 1; + if (sortv[m] >= num) { + ans = m; + r = m - 1; + } else { + l = m + 1; + } + } + return ans; + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + for (int i = 1; i <= n; i++) { + sortv[i] = arr[i]; + } + Arrays.sort(sortv, 1, n + 1); + s = 1; + for (int i = 2; i <= n; i++) { + if (sortv[s] != sortv[i]) { + sortv[++s] = sortv[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = lower(arr[i]); + } + for (int i = 1; i <= n; i++) { + bucket[i][0] = arr[i]; + bucket[i][1] = i; + } + Arrays.sort(bucket, 1, n + 1, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]); + for (int i = 1; i <= n; i++) { + bucketIdx[bucket[i][1]] = i; + } + for (int i = 1; i <= bnum; i++) { + for (int j = i; j <= bnum; j++) { + int cnt = modeCnt[i][j - 1]; + for (int k = bl[j]; k <= br[j]; k++) { + cnt = Math.max(cnt, ++numCnt[arr[k]]); + } + modeCnt[i][j] = cnt; + } + for (int j = 1; j <= n; j++) { + numCnt[j] = 0; + } + } + } + + public static int query(int l, int r) { + int ans = 0; + if (bi[l] == bi[r]) { + for (int i = l; i <= r; i++) { + ans = Math.max(ans, ++numCnt[arr[i]]); + } + for (int i = l; i <= r; i++) { + numCnt[arr[i]] = 0; + } + } else { + ans = modeCnt[bi[l] + 1][bi[r] - 1]; + for (int i = l, idx; i <= br[bi[l]]; i++) { + idx = bucketIdx[i]; + while (idx + ans <= n && bucket[idx + ans][0] == arr[i] && bucket[idx + ans][1] <= r) { + ans++; + } + } + for (int i = bl[bi[r]], idx; i <= r; i++) { + idx = bucketIdx[i]; + while (idx - ans >= 1 && bucket[idx - ans][0] == arr[i] && bucket[idx - ans][1] >= l) { + ans++; + } + } + } + return ans; + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + for (int i = 1, l, r, lastAns = 0; i <= m; i++) { + l = in.nextInt(); + r = in.nextInt(); + l ^= lastAns; + r ^= lastAns; + lastAns = query(l, r); + out.println(lastAns); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class172/Code04_ModeCnt2.java b/src/class172/Code04_ModeCnt2.java new file mode 100644 index 000000000..454891105 --- /dev/null +++ b/src/class172/Code04_ModeCnt2.java @@ -0,0 +1,142 @@ +package class172; + +// 空间少求区间众数的次数,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5048 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int v, i; +//}; +// +//bool NodeCmp(Node a, Node b) { +// if (a.v != b.v) { +// return a.v < b.v; +// } +// return a.i < b.i; +//} +// +//const int MAXN = 500001; +//const int MAXB = 801; +//int n, m, s; +//int arr[MAXN]; +//int sortv[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +// +//Node bucket[MAXN]; +//int bucketIdx[MAXN]; +// +//int modeCnt[MAXB][MAXB]; +//int numCnt[MAXN]; +// +//int lower(int x) { +// int l = 1, r = s, m, ans = 0; +// while (l <= r) { +// m = (l + r) >> 1; +// if (sortv[m] >= x) { +// ans = m; +// r = m - 1; +// } else { +// l = m + 1; +// } +// } +// return ans; +//} +// +//void prepare() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } +// for (int i = 1; i <= n; i++) { +// sortv[i] = arr[i]; +// } +// sort(sortv + 1, sortv + n + 1); +// s = 1; +// for (int i = 2; i <= n; i++) { +// if (sortv[s] != sortv[i]) { +// sortv[++s] = sortv[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = lower(arr[i]); +// } +// for (int i = 1; i <= n; i++) { +// bucket[i].v = arr[i]; +// bucket[i].i = i; +// } +// sort(bucket + 1, bucket + n + 1, NodeCmp); +// for (int i = 1; i <= n; i++) { +// bucketIdx[bucket[i].i] = i; +// } +// for (int i = 1; i <= bnum; i++) { +// for (int j = i; j <= bnum; j++) { +// int cnt = modeCnt[i][j - 1]; +// for (int k = bl[j]; k <= br[j]; k++) { +// cnt = max(cnt, ++numCnt[arr[k]]); +// } +// modeCnt[i][j] = cnt; +// } +// for (int j = 1; j <= n; j++) { +// numCnt[j] = 0; +// } +// } +//} +// +//int query(int l, int r) { +// int ans = 0; +// if (bi[l] == bi[r]) { +// for (int i = l; i <= r; i++) { +// ans = max(ans, ++numCnt[arr[i]]); +// } +// for (int i = l; i <= r; i++) { +// numCnt[arr[i]] = 0; +// } +// } else { +// ans = modeCnt[bi[l] + 1][bi[r] - 1]; +// for (int i = l, idx; i <= br[bi[l]]; i++) { +// idx = bucketIdx[i]; +// while (idx + ans <= n && bucket[idx + ans].v == arr[i] && bucket[idx + ans].i <= r) { +// ans++; +// } +// } +// for (int i = bl[bi[r]], idx; i <= r; i++) { +// idx = bucketIdx[i]; +// while (idx - ans >= 1 && bucket[idx - ans].v == arr[i] && bucket[idx - ans].i >= l) { +// ans++; +// } +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// for (int i = 1, l, r, lastAns = 0; i <= m; i++) { +// cin >> l >> r; +// l ^= lastAns; +// r ^= lastAns; +// lastAns = query(l, r); +// cout << lastAns << '\n'; +// } +// return 0; +//} \ No newline at end of file From 6d378303a3f6590fcdf02e6756351c3edc3a63e2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Jun 2025 15:35:58 +0800 Subject: [PATCH 0270/1170] modify code --- src/class172/Code04_ModeCnt1.java | 38 +------ src/class172/Code04_ModeCnt2.java | 32 +----- src/class172/Code05_Poem1.java | 164 ++++++++++++++++++++++++++++++ src/class172/Code05_Poem2.java | 114 +++++++++++++++++++++ 4 files changed, 284 insertions(+), 64 deletions(-) create mode 100644 src/class172/Code05_Poem1.java create mode 100644 src/class172/Code05_Poem2.java diff --git a/src/class172/Code04_ModeCnt1.java b/src/class172/Code04_ModeCnt1.java index c5c7480d7..c59890259 100644 --- a/src/class172/Code04_ModeCnt1.java +++ b/src/class172/Code04_ModeCnt1.java @@ -1,6 +1,6 @@ package class172; -// 空间少求区间众数的次数,java版 +// 空间少求众数的次数,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5048 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是内存占用过大,无法通过测试用例 @@ -18,9 +18,8 @@ public class Code04_ModeCnt1 { public static int MAXN = 500001; public static int MAXB = 801; - public static int n, m, s; + public static int n, m; public static int[] arr = new int[MAXN]; - public static int[] sortv = new int[MAXN]; public static int blen, bnum; public static int[] bi = new int[MAXN]; @@ -37,20 +36,6 @@ public class Code04_ModeCnt1 { // 数字词频统计 public static int[] numCnt = new int[MAXN]; - public static int lower(int num) { - int l = 1, r = s, m, ans = 0; - while (l <= r) { - m = (l + r) >> 1; - if (sortv[m] >= num) { - ans = m; - r = m - 1; - } else { - l = m + 1; - } - } - return ans; - } - public static void prepare() { blen = (int) Math.sqrt(n); bnum = (n + blen - 1) / blen; @@ -61,19 +46,6 @@ public static void prepare() { bl[i] = (i - 1) * blen + 1; br[i] = Math.min(i * blen, n); } - for (int i = 1; i <= n; i++) { - sortv[i] = arr[i]; - } - Arrays.sort(sortv, 1, n + 1); - s = 1; - for (int i = 2; i <= n; i++) { - if (sortv[s] != sortv[i]) { - sortv[++s] = sortv[i]; - } - } - for (int i = 1; i <= n; i++) { - arr[i] = lower(arr[i]); - } for (int i = 1; i <= n; i++) { bucket[i][0] = arr[i]; bucket[i][1] = i; @@ -133,10 +105,8 @@ public static void main(String[] args) throws IOException { } prepare(); for (int i = 1, l, r, lastAns = 0; i <= m; i++) { - l = in.nextInt(); - r = in.nextInt(); - l ^= lastAns; - r ^= lastAns; + l = in.nextInt() ^ lastAns; + r = in.nextInt() ^ lastAns; lastAns = query(l, r); out.println(lastAns); } diff --git a/src/class172/Code04_ModeCnt2.java b/src/class172/Code04_ModeCnt2.java index 454891105..9805408f8 100644 --- a/src/class172/Code04_ModeCnt2.java +++ b/src/class172/Code04_ModeCnt2.java @@ -1,6 +1,6 @@ package class172; -// 空间少求区间众数的次数,C++版 +// 空间少求众数的次数,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P5048 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -22,9 +22,8 @@ // //const int MAXN = 500001; //const int MAXB = 801; -//int n, m, s; +//int n, m; //int arr[MAXN]; -//int sortv[MAXN]; // //int blen, bnum; //int bi[MAXN]; @@ -37,20 +36,6 @@ //int modeCnt[MAXB][MAXB]; //int numCnt[MAXN]; // -//int lower(int x) { -// int l = 1, r = s, m, ans = 0; -// while (l <= r) { -// m = (l + r) >> 1; -// if (sortv[m] >= x) { -// ans = m; -// r = m - 1; -// } else { -// l = m + 1; -// } -// } -// return ans; -//} -// //void prepare() { // blen = (int)sqrt(n); // bnum = (n + blen - 1) / blen; @@ -62,19 +47,6 @@ // br[i] = min(i * blen, n); // } // for (int i = 1; i <= n; i++) { -// sortv[i] = arr[i]; -// } -// sort(sortv + 1, sortv + n + 1); -// s = 1; -// for (int i = 2; i <= n; i++) { -// if (sortv[s] != sortv[i]) { -// sortv[++s] = sortv[i]; -// } -// } -// for (int i = 1; i <= n; i++) { -// arr[i] = lower(arr[i]); -// } -// for (int i = 1; i <= n; i++) { // bucket[i].v = arr[i]; // bucket[i].i = i; // } diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java new file mode 100644 index 000000000..a2f8eb92b --- /dev/null +++ b/src/class172/Code05_Poem1.java @@ -0,0 +1,164 @@ +package class172; + +// 作诗,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4135 +// 提交交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code05_Poem1 { + + public static int MAXN = 100001; + public static int MAXB = 401; + public static int n, c, m; + public static int[] arr = new int[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + + // freq[i][j]表示前i块中j出现的次数 + public static int[][] freq = new int[MAXB][MAXN]; + // even[i][j]表示从第i块到第j块出现正偶数次的数有几个 + public static int[][] even = new int[MAXB][MAXB]; + // 数字词频统计 + public static int[] numCnt = new int[MAXN]; + + // 返回从l块到r块中,数字v的次数 + public static int getCnt(int l, int r, int v) { + return freq[r][v] - freq[l - 1][v]; + } + + // 加1之前的词频是pre,返回加1之后,正偶数次的数的个数变化量 + public static int change(int pre) { + return pre != 0 ? ((pre & 1) == 0 ? -1 : 1) : 0; + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + for (int i = 1; i <= bnum; i++) { + for (int j = bl[i]; j <= br[i]; j++) { + freq[i][arr[j]]++; + } + for (int j = 1; j <= c; j++) { + freq[i][j] += freq[i - 1][j]; + } + } + for (int i = 1; i <= bnum; i++) { + for (int j = i; j <= bnum; j++) { + even[i][j] = even[i][j - 1]; + for (int k = bl[j]; k <= br[j]; k++) { + even[i][j] += change(numCnt[arr[k]]); + numCnt[arr[k]]++; + } + } + for (int j = 1; j <= c; j++) { + numCnt[j] = 0; + } + } + } + + public static int query(int l, int r) { + int ans = 0; + if (bi[l] == bi[r]) { + for (int i = l; i <= r; i++) { + ans += change(numCnt[arr[i]]); + numCnt[arr[i]]++; + } + for (int i = l; i <= r; i++) { + numCnt[arr[i]] = 0; + } + } else { + ans = even[bi[l] + 1][bi[r] - 1]; + for (int i = l; i <= br[bi[l]]; i++) { + ans += change(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); + numCnt[arr[i]]++; + } + for (int i = bl[bi[r]]; i <= r; i++) { + ans += change(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); + numCnt[arr[i]]++; + } + for (int i = l; i <= br[bi[l]]; i++) { + numCnt[arr[i]] = 0; + } + for (int i = bl[bi[r]]; i <= r; i++) { + numCnt[arr[i]] = 0; + } + } + return ans; + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + c = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + for (int i = 1, a, b, l, r, lastAns = 0; i <= m; i++) { + a = (in.nextInt() + lastAns) % n + 1; + b = (in.nextInt() + lastAns) % n + 1; + l = Math.min(a, b); + r = Math.max(a, b); + lastAns = query(l, r); + out.println(lastAns); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java new file mode 100644 index 000000000..a1fed9023 --- /dev/null +++ b/src/class172/Code05_Poem2.java @@ -0,0 +1,114 @@ +package class172; + +// 作诗,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4135 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXB = 401; +//int n, c, m; +//int arr[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +// +//int freq[MAXB][MAXN]; +//int even[MAXB][MAXB]; +//int numCnt[MAXN]; +// +//int getCnt(int l, int r, int v) { +// return freq[r][v] - freq[l - 1][v]; +//} +// +//int change(int pre) { +// return pre ? ((pre & 1) ? 1 : -1) : 0; +//} +// +//void prepare() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } +// for (int i = 1; i <= bnum; i++) { +// for (int j = bl[i]; j <= br[i]; j++) { +// freq[i][arr[j]]++; +// } +// for (int j = 1; j <= c; j++) { +// freq[i][j] += freq[i - 1][j]; +// } +// } +// for (int i = 1; i <= bnum; i++) { +// for (int j = i; j <= bnum; j++) { +// even[i][j] = even[i][j - 1]; +// for (int k = bl[j]; k <= br[j]; k++) { +// even[i][j] += change(numCnt[arr[k]]); +// numCnt[arr[k]]++; +// } +// } +// for (int j = 1; j <= c; j++) { +// numCnt[j] = 0; +// } +// } +//} +// +//int query(int l, int r) { +// int ans = 0; +// if (bi[l] == bi[r]) { +// for (int i = l; i <= r; i++) { +// ans += change(numCnt[arr[i]]); +// numCnt[arr[i]]++; +// } +// for (int i = l; i <= r; i++) { +// numCnt[arr[i]] = 0; +// } +// } else { +// ans = even[bi[l] + 1][bi[r] - 1]; +// for (int i = l; i <= br[bi[l]]; i++) { +// ans += change(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); +// numCnt[arr[i]]++; +// } +// for (int i = bl[bi[r]]; i <= r; i++) { +// ans += change(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); +// numCnt[arr[i]]++; +// } +// for (int i = l; i <= br[bi[l]]; i++) { +// numCnt[arr[i]] = 0; +// } +// for (int i = bl[bi[r]]; i <= r; i++) { +// numCnt[arr[i]] = 0; +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> c >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// for (int i = 1, a, b, l, r, lastAns = 0; i <= m; i++) { +// cin >> a >> b; +// a = (a + lastAns) % n + 1; +// b = (b + lastAns) % n + 1; +// l = min(a, b); +// r = max(a, b); +// lastAns = query(l, r); +// cout << lastAns << '\n'; +// } +// return 0; +//} \ No newline at end of file From f2ca6ed577659f9f22160288a00e3764b5f77933 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Jun 2025 15:38:47 +0800 Subject: [PATCH 0271/1170] modify code --- src/class172/Code05_Poem1.java | 10 +++++----- src/class172/Code05_Poem2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java index a2f8eb92b..8c12af1fc 100644 --- a/src/class172/Code05_Poem1.java +++ b/src/class172/Code05_Poem1.java @@ -34,7 +34,7 @@ public static int getCnt(int l, int r, int v) { } // 加1之前的词频是pre,返回加1之后,正偶数次的数的个数变化量 - public static int change(int pre) { + public static int delta(int pre) { return pre != 0 ? ((pre & 1) == 0 ? -1 : 1) : 0; } @@ -60,7 +60,7 @@ public static void prepare() { for (int j = i; j <= bnum; j++) { even[i][j] = even[i][j - 1]; for (int k = bl[j]; k <= br[j]; k++) { - even[i][j] += change(numCnt[arr[k]]); + even[i][j] += delta(numCnt[arr[k]]); numCnt[arr[k]]++; } } @@ -74,7 +74,7 @@ public static int query(int l, int r) { int ans = 0; if (bi[l] == bi[r]) { for (int i = l; i <= r; i++) { - ans += change(numCnt[arr[i]]); + ans += delta(numCnt[arr[i]]); numCnt[arr[i]]++; } for (int i = l; i <= r; i++) { @@ -83,11 +83,11 @@ public static int query(int l, int r) { } else { ans = even[bi[l] + 1][bi[r] - 1]; for (int i = l; i <= br[bi[l]]; i++) { - ans += change(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); + ans += delta(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); numCnt[arr[i]]++; } for (int i = bl[bi[r]]; i <= r; i++) { - ans += change(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); + ans += delta(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); numCnt[arr[i]]++; } for (int i = l; i <= br[bi[l]]; i++) { diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java index a1fed9023..c7bccb28b 100644 --- a/src/class172/Code05_Poem2.java +++ b/src/class172/Code05_Poem2.java @@ -27,7 +27,7 @@ // return freq[r][v] - freq[l - 1][v]; //} // -//int change(int pre) { +//int delta(int pre) { // return pre ? ((pre & 1) ? 1 : -1) : 0; //} // @@ -53,7 +53,7 @@ // for (int j = i; j <= bnum; j++) { // even[i][j] = even[i][j - 1]; // for (int k = bl[j]; k <= br[j]; k++) { -// even[i][j] += change(numCnt[arr[k]]); +// even[i][j] += delta(numCnt[arr[k]]); // numCnt[arr[k]]++; // } // } @@ -67,7 +67,7 @@ // int ans = 0; // if (bi[l] == bi[r]) { // for (int i = l; i <= r; i++) { -// ans += change(numCnt[arr[i]]); +// ans += delta(numCnt[arr[i]]); // numCnt[arr[i]]++; // } // for (int i = l; i <= r; i++) { @@ -76,11 +76,11 @@ // } else { // ans = even[bi[l] + 1][bi[r] - 1]; // for (int i = l; i <= br[bi[l]]; i++) { -// ans += change(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); +// ans += delta(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); // numCnt[arr[i]]++; // } // for (int i = bl[bi[r]]; i <= r; i++) { -// ans += change(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); +// ans += delta(getCnt(bi[l] + 1, bi[r] - 1, arr[i]) + numCnt[arr[i]]); // numCnt[arr[i]]++; // } // for (int i = l; i <= br[bi[l]]; i++) { From 22759c3bd54cfed790dcdefeb3e36b31322343e3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Jun 2025 20:49:01 +0800 Subject: [PATCH 0272/1170] modify code --- src/class152/Code03_TextEditor1.java | 176 ++++++++++++++++++--------- src/class172/Code06_TextEditor1.java | 95 +++++++++++++++ 2 files changed, 213 insertions(+), 58 deletions(-) create mode 100644 src/class172/Code06_TextEditor1.java diff --git a/src/class152/Code03_TextEditor1.java b/src/class152/Code03_TextEditor1.java index 929823b3c..24b8a0cbd 100644 --- a/src/class152/Code03_TextEditor1.java +++ b/src/class152/Code03_TextEditor1.java @@ -16,9 +16,8 @@ // C++版本是Code03_TextEditor2文件,可以通过所有测试用例 // 在真正笔试、比赛时,一定是兼顾各种语言的,该实现是一定正确的 -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; +import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; @@ -90,75 +89,136 @@ public static void inorder(int i) { // 以下风格只是其中一种,无所谓了,逻辑是对的 // 想通过这个题看C++版本吧,完全一样的逻辑 public static void main(String[] args) throws IOException { - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + FastReader in = new FastReader(); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - int n = Integer.valueOf(in.readLine()); + int n = in.nextInt(); int pos = 0; - String str; String op; int x; for (int i = 1; i <= n; i++) { - str = in.readLine(); - if (str.equals("Prev")) { + op = in.nextString(); + if (op.equals("Prev")) { pos--; - } else if (str.equals("Next")) { + } else if (op.equals("Next")) { pos++; + } else if (op.equals("Move")) { + pos = in.nextInt(); + } else if (op.equals("Delete")) { + x = in.nextInt(); + split(0, 0, head, pos + x); + int r = left[0]; + int lm = right[0]; + left[0] = right[0] = 0; + split(0, 0, lm, pos); + int l = right[0]; + left[0] = right[0] = 0; + head = merge(l, r); + } else if (op.equals("Insert")) { + x = in.nextInt(); + split(0, 0, head, pos); + int l = right[0]; + int r = left[0]; + left[0] = right[0] = 0; + for (int j = 1; j <= x; j++) { + key[++cnt] = in.nextChar(); + size[cnt] = 1; + priority[cnt] = Math.random(); + l = merge(l, cnt); + } + head = merge(l, r); } else { - String[] input = str.split(" "); - op = input[0]; - x = Integer.valueOf(input[1]); - if (op.equals("Move")) { - pos = x; - } else if (op.equals("Insert")) { - split(0, 0, head, pos); - int l = right[0]; - int r = left[0]; - left[0] = right[0] = 0; - int add = 0; - while (add < x) { - char[] insert = in.readLine().toCharArray(); - for (int j = 0; j < insert.length; j++) { - if (insert[j] >= 32 && insert[j] <= 126) { - key[++cnt] = insert[j]; - size[cnt] = 1; - priority[cnt] = Math.random(); - l = merge(l, cnt); - add++; - } - } - } - head = merge(l, r); - } else if (op.equals("Delete")) { - split(0, 0, head, pos + x); - int r = left[0]; - int lm = right[0]; - left[0] = right[0] = 0; - split(0, 0, lm, pos); - int l = right[0]; - left[0] = right[0] = 0; - head = merge(l, r); - } else { - split(0, 0, head, pos + x); - int r = left[0]; - int lm = right[0]; - left[0] = right[0] = 0; - split(0, 0, lm, pos); - int l = right[0]; - int m = left[0]; - left[0] = right[0] = 0; - ansi = 0; - inorder(m); - head = merge(merge(l, m), r); - for (int j = 1; j <= ansi; j++) { - out.print((char) ans[j]); - } - out.println(); + x = in.nextInt(); + split(0, 0, head, pos + x); + int r = left[0]; + int lm = right[0]; + left[0] = right[0] = 0; + split(0, 0, lm, pos); + int l = right[0]; + int m = left[0]; + left[0] = right[0] = 0; + ansi = 0; + inorder(m); + head = merge(merge(l, m), r); + for (int j = 1; j <= ansi; j++) { + out.print((char) ans[j]); } + out.println(); } } out.flush(); out.close(); - in.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c < 32 || c > 126); + return (char) c; + } + + public String nextString() throws IOException { + byte b = readByte(); + while (isWhitespace(b)) { + b = readByte(); + } + StringBuilder sb = new StringBuilder(1000); + while (!isWhitespace(b) && b != -1) { + sb.append((char) b); + b = readByte(); + } + return sb.toString(); + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } } } diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java new file mode 100644 index 000000000..980fcfcdd --- /dev/null +++ b/src/class172/Code06_TextEditor1.java @@ -0,0 +1,95 @@ +package class172; + +// 文本编辑器,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4008 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code06_TextEditor1 { + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + // 读取下一个ASCII码在闭区间[32, 126]内的字符 + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c < 32 || c > 126); + return (char) c; + } + + public String nextString() throws IOException { + byte b = readByte(); + while (isWhitespace(b)) { + b = readByte(); + } + StringBuilder sb = new StringBuilder(1000); + while (!isWhitespace(b) && b != -1) { + sb.append((char) b); + b = readByte(); + } + return sb.toString(); + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} From e081a152291d88136f711b6235ee4c9df3cde8d9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Jun 2025 21:02:12 +0800 Subject: [PATCH 0273/1170] modify code --- src/class152/Code03_TextEditor1.java | 13 +- src/class152/Code03_TextEditor3.java | 337 +++++++++++++++++++++++++++ 2 files changed, 342 insertions(+), 8 deletions(-) create mode 100644 src/class152/Code03_TextEditor3.java diff --git a/src/class152/Code03_TextEditor1.java b/src/class152/Code03_TextEditor1.java index 24b8a0cbd..ee89c34f8 100644 --- a/src/class152/Code03_TextEditor1.java +++ b/src/class152/Code03_TextEditor1.java @@ -10,11 +10,11 @@ // Next : 光标后移一个字符,操作保证光标不会到非法位置 // Insert操作时,字符串s中ASCII码在[32,126]范围上的字符一定有n个,其他字符请过滤掉 // 测试链接 : https://www.luogu.com.cn/problem/P4008 -// 如下实现是正确的,但java的版本无法通过所有测试用例 -// 这是洛谷平台没有照顾各种语言的实现所导致的 -// java的实现空间就是无法达标,C++的实现完全一样的逻辑,就是可以达标 -// C++版本是Code03_TextEditor2文件,可以通过所有测试用例 -// 在真正笔试、比赛时,一定是兼顾各种语言的,该实现是一定正确的 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是内存占用过大,无法通过测试用例 +// 因为这道题只考虑C++能通过的空间标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code03_TextEditor2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; import java.io.InputStream; @@ -85,9 +85,6 @@ public static void inorder(int i) { } } - // 我做了很多个版本的IO尝试,空间都无法达标 - // 以下风格只是其中一种,无所谓了,逻辑是对的 - // 想通过这个题看C++版本吧,完全一样的逻辑 public static void main(String[] args) throws IOException { FastReader in = new FastReader(); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); diff --git a/src/class152/Code03_TextEditor3.java b/src/class152/Code03_TextEditor3.java new file mode 100644 index 000000000..30a6f4e21 --- /dev/null +++ b/src/class152/Code03_TextEditor3.java @@ -0,0 +1,337 @@ +package class152; + +// 文本编辑器,能通过的java版本 +// 一开始文本为空,光标在文本开头,也就是1位置,请实现如下6种操作 +// Move k : 将光标移动到第k个字符之后,操作保证光标不会到非法位置 +// Insert n s : 在光标处插入长度为n的字符串s,光标位置不变 +// Delete n : 删除光标后的n个字符,光标位置不变,操作保证有足够字符 +// Get n : 输出光标后的n个字符,光标位置不变,操作保证有足够字符 +// Prev : 光标前移一个字符,操作保证光标不会到非法位置 +// Next : 光标后移一个字符,操作保证光标不会到非法位置 +// Insert操作时,字符串s中ASCII码在[32,126]范围上的字符一定有n个,其他字符请过滤掉 +// 测试链接 : https://www.luogu.com.cn/problem/P4008 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 一个能通过的版本,连数组都自己去扩容,IO彻底重写,看看就好 + +import java.util.Arrays; + +public class Code03_TextEditor3 { + + static java.io.InputStream is = System.in; + static byte[] inbuf = new byte[1024]; + static char[] str = new char[16]; + static int lenbuf, ptrbuf, b; + static FastWriter out = new FastWriter(); + + static byte[] key; + static int[] lc, rc, sz; + static double[] priority; + static int head, no; + + static int create(byte k) { + if (++no == key.length) { + key = Arrays.copyOf(key, no << 1); + lc = Arrays.copyOf(lc, no << 1); + rc = Arrays.copyOf(rc, no << 1); + sz = Arrays.copyOf(sz, no << 1); + priority = Arrays.copyOf(priority, no << 1); + } + key[no] = k; + sz[no] = 1; + priority[no] = Math.random(); + return no; + } + + static void up(int i) { + sz[i] = sz[lc[i]] + sz[rc[i]] + 1; + } + + static void split(int l, int r, int i, int rk) { + if (i == 0) { + rc[l] = lc[r] = 0; + return; + } + if (sz[lc[i]] + 1 <= rk) { + rc[l] = i; + split(i, r, rc[i], rk - sz[lc[i]] - 1); + } else { + lc[r] = i; + split(l, i, lc[i], rk); + } + up(i); + } + + static int merge(int l, int r) { + if (l == 0 || r == 0) { + return l + r; + } + if (priority[l] >= priority[r]) { + rc[l] = merge(rc[l], r); + up(l); + return l; + } else { + lc[r] = merge(l, lc[r]); + up(r); + return r; + } + } + + static void inorder(int i) { + if (i == 0) { + return; + } + inorder(lc[i]); + out.write(key[i]); + inorder(rc[i]); + } + + public static void main(String[] args) { + key = new byte[1]; + lc = new int[1]; + rc = new int[1]; + sz = new int[1]; + priority = new double[1]; + int i = 0, n, l, r, lx, mx, rx; + byte c; + int op = nextInt(); + while (op-- > 0) { + switch (next()) { + case 'M': + i = nextInt(); + break; + case 'I': + split(0, 0, head, i); + l = rc[0]; + r = lc[0]; + n = nextInt(); + while (n > 0) { + c = readByte(); + if (c < 32) { + continue; + } + l = merge(l, create(c)); + n--; + } + head = merge(l, r); + break; + case 'D': + n = nextInt(); + l = i + 1; + r = i + n; + split(0, 0, head, i); + lx = rc[0]; + mx = lc[0]; + split(0, 0, mx, n); + mx = rc[0]; + rx = lc[0]; + head = merge(lx, rx); + break; + case 'G': + n = nextInt(); + l = i + 1; + r = i + n; + split(0, 0, head, i); + lx = rc[0]; + mx = lc[0]; + split(0, 0, mx, n); + mx = rc[0]; + rx = lc[0]; + inorder(mx); + out.writeln(); + head = merge(merge(lx, mx), rx); + break; + case 'P': + i--; + break; + default: + i++; + break; + } + } + out.flush(); + } + + static byte readByte() { + if (ptrbuf == lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (Exception e) { + } + if (lenbuf <= 0) + return -1; + } + return inbuf[ptrbuf++]; + } + + static char next() { + while ((b = readByte()) < 33) + ; + int i = 0; + while (b > 32) { + str[i++] = (char) b; + b = readByte(); + } + return str[0]; + } + + static int nextInt() { + while ((b = readByte()) < 33) + ; + int num = b - '0'; + while ((b = readByte()) > 32) + num = num * 10 + (b - '0'); + return num; + } + + static class FastWriter { + java.io.OutputStream out = System.out; + int tr = 0, BUF_SIZE = 8192; + byte[] buf = new byte[BUF_SIZE]; + + int countDigits(int v) { + return v >= 100000 ? v >= 10000000 ? v >= 100000000 ? v >= 1000000000 ? 10 : 9 : 8 : v >= 1000000 ? 7 : 6 + : v >= 1000 ? v >= 10000 ? 5 : 4 : v >= 100 ? 3 : v >= 10 ? 2 : 1; + } + + int countDigits(long v) { + return v >= 10000000000L ? 10 + countDigits((int) (v / 10000000000L)) + : v >= 1000000000 ? 10 : countDigits((int) v); + } + + FastWriter write(byte b) { + buf[tr++] = b; + if (tr == BUF_SIZE) + innerflush(); + return this; + } + + FastWriter write(char c) { + return write((byte) c); + } + + FastWriter write(int x) { + if (x == Integer.MIN_VALUE) { + return write((long) x); + } + if (tr + 12 >= BUF_SIZE) + innerflush(); + if (x < 0) { + write((byte) '-'); + x = -x; + } + int d = countDigits(x); + for (int i = tr + d - 1; i >= tr; i--) { + buf[i] = (byte) ('0' + x % 10); + x /= 10; + } + tr += d; + return this; + } + + FastWriter write(long x) { + if (x == Long.MIN_VALUE) { + return write("" + x); + } + if (tr + 21 >= BUF_SIZE) + innerflush(); + if (x < 0) { + write((byte) '-'); + x = -x; + } + int d = countDigits(x); + for (int i = tr + d - 1; i >= tr; i--) { + buf[i] = (byte) ('0' + x % 10); + x /= 10; + } + tr += d; + return this; + } + + FastWriter write(double x, int precision) { + if (x < 0) { + write('-'); + x = -x; + } + x += Math.pow(10, -precision) / 2; + write((long) x).write("."); + x -= (long) x; + for (int i = 0; i < precision; i++) { + x *= 10; + write((char) ('0' + (int) x)); + x -= (int) x; + } + return this; + } + + FastWriter write(String s) { + for (int i = 0; i < s.length(); i++) { + buf[tr++] = (byte) s.charAt(i); + if (tr == BUF_SIZE) + innerflush(); + } + return this; + } + + void print(char c) { + write(c); + } + + void print(String s) { + write(s); + } + + void print(int x) { + write(x); + } + + void print(long x) { + write(x); + } + + void print(double x, int precision) { + write(x, precision); + } + + void writeln() { + write((byte) '\n'); + } + + void println(char c) { + write(c).writeln(); + } + + void println(int x) { + write(x).writeln(); + } + + void println(long x) { + write(x).writeln(); + } + + void println(double x, int precision) { + write(x, precision).writeln(); + } + + void println(String s) { + write(s).writeln(); + } + + private void innerflush() { + try { + out.write(buf, 0, tr); + tr = 0; + } catch (Exception e) { + } + } + + void flush() { + innerflush(); + try { + out.flush(); + } catch (Exception e) { + } + } + } + +} \ No newline at end of file From 948ac4c60038ae21d8679f390246a6cdeb976b18 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Jun 2025 21:03:06 +0800 Subject: [PATCH 0274/1170] modify code --- src/class152/Code03_TextEditor3.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class152/Code03_TextEditor3.java b/src/class152/Code03_TextEditor3.java index 30a6f4e21..3bc940299 100644 --- a/src/class152/Code03_TextEditor3.java +++ b/src/class152/Code03_TextEditor3.java @@ -11,7 +11,7 @@ // Insert操作时,字符串s中ASCII码在[32,126]范围上的字符一定有n个,其他字符请过滤掉 // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -// 一个能通过的版本,连数组都自己去扩容,IO彻底重写,看看就好 +// 一个能通过的版本,连数组都自己写扩容逻辑,IO彻底重写,看看就好 import java.util.Arrays; From 9af463df079237b26124c92ec9e2f1f17b8d8400 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Jun 2025 13:41:58 +0800 Subject: [PATCH 0275/1170] modify code --- src/class148/Code01_AVL2.java | 16 ++++++++-------- src/class148/FollowUp2.java | 16 ++++++++-------- src/class150/Code02_ScapeGoat2.java | 18 +++++++++--------- src/class150/FollowUp2.java | 18 +++++++++--------- src/class151/Code02_Treap2.java | 16 ++++++++-------- src/class151/FollowUp2.java | 16 ++++++++-------- src/class152/Code01_FHQTreapWithCount2.java | 14 +++++++------- src/class152/Code02_FHQTreapWithoutCount2.java | 14 +++++++------- src/class152/Code03_TextEditor2.java | 10 +++++----- src/class152/Code04_LiteraryTree2.java | 10 +++++----- src/class152/Code05_PersistentFHQTreap2.java | 16 ++++++++-------- .../Code06_PersistentLiteraryTree2.java | 12 ++++++------ src/class152/FollowUp2.java | 14 +++++++------- src/class153/Code01_Splay2.java | 14 +++++++------- src/class153/Code02_FrustratedCashier2.java | 18 +++++++++--------- src/class153/Code03_LiteraryTree2.java | 12 ++++++------ src/class153/Code04_Bookcase2.java | 14 +++++++------- src/class153/Code05_MaintainSequence2.java | 14 +++++++------- src/class153/FollowUp2.java | 14 +++++++------- src/class157/Code02_PointPersistent2.java | 12 ++++++------ src/class158/Code04_CountOnTree2.java | 12 ++++++------ src/class159/Code03_PathDfnXor2.java | 8 ++++---- src/class159/Code04_Yummy2.java | 8 ++++---- src/class160/Code07_NetworkManagement2.java | 12 ++++++------ 24 files changed, 164 insertions(+), 164 deletions(-) diff --git a/src/class148/Code01_AVL2.java b/src/class148/Code01_AVL2.java index 4202633de..4a953d651 100644 --- a/src/class148/Code01_AVL2.java +++ b/src/class148/Code01_AVL2.java @@ -30,10 +30,10 @@ //int ls[MAXN]; //int rs[MAXN]; //int key_count[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// siz[i] = siz[ls[i]] + siz[rs[i]] + key_count[i]; // height[i] = max(height[ls[i]], height[rs[i]]) + 1; //} // @@ -79,7 +79,7 @@ //int add(int i, int num) { // if (i == 0) { // key[++cnt] = num; -// key_count[cnt] = size[cnt] = height[cnt] = 1; +// key_count[cnt] = siz[cnt] = height[cnt] = 1; // return cnt; // } // if (key[i] == num) { @@ -104,7 +104,7 @@ // if (key[i] >= num) { // return getRank(ls[i], num); // } else { -// return size[ls[i]] + key_count[i] + getRank(rs[i], num); +// return siz[ls[i]] + key_count[i] + getRank(rs[i], num); // } //} // @@ -160,10 +160,10 @@ //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + key_count[i] < x) { -// return index(rs[i], x - size[ls[i]] - key_count[i]); +// } else if (siz[ls[i]] + key_count[i] < x) { +// return index(rs[i], x - siz[ls[i]] - key_count[i]); // } // return key[i]; //} @@ -208,7 +208,7 @@ // memset(ls + 1, 0, cnt * sizeof(int)); // memset(rs + 1, 0, cnt * sizeof(int)); // memset(key_count + 1, 0, cnt * sizeof(int)); -// memset(size + 1, 0, cnt * sizeof(int)); +// memset(siz + 1, 0, cnt * sizeof(int)); // cnt = 0; // head = 0; //} diff --git a/src/class148/FollowUp2.java b/src/class148/FollowUp2.java index eb9844f80..192218118 100644 --- a/src/class148/FollowUp2.java +++ b/src/class148/FollowUp2.java @@ -23,10 +23,10 @@ //int ls[MAXN]; //int rs[MAXN]; //int key_count[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// siz[i] = siz[ls[i]] + siz[rs[i]] + key_count[i]; // height[i] = max(height[ls[i]], height[rs[i]]) + 1; //} // @@ -72,7 +72,7 @@ //int add(int i, int num) { // if (i == 0) { // key[++cnt] = num; -// key_count[cnt] = size[cnt] = height[cnt] = 1; +// key_count[cnt] = siz[cnt] = height[cnt] = 1; // return cnt; // } // if (key[i] == num) { @@ -97,7 +97,7 @@ // if (key[i] >= num) { // return getRank(ls[i], num); // } else { -// return size[ls[i]] + key_count[i] + getRank(rs[i], num); +// return siz[ls[i]] + key_count[i] + getRank(rs[i], num); // } //} // @@ -153,10 +153,10 @@ //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + key_count[i] < x) { -// return index(rs[i], x - size[ls[i]] - key_count[i]); +// } else if (siz[ls[i]] + key_count[i] < x) { +// return index(rs[i], x - siz[ls[i]] - key_count[i]); // } // return key[i]; //} @@ -201,7 +201,7 @@ // memset(ls + 1, 0, cnt * sizeof(int)); // memset(rs + 1, 0, cnt * sizeof(int)); // memset(key_count + 1, 0, cnt * sizeof(int)); -// memset(size + 1, 0, cnt * sizeof(int)); +// memset(siz + 1, 0, cnt * sizeof(int)); // cnt = 0; // head = 0; //} diff --git a/src/class150/Code02_ScapeGoat2.java b/src/class150/Code02_ScapeGoat2.java index 16bfe5f75..6cd87753c 100644 --- a/src/class150/Code02_ScapeGoat2.java +++ b/src/class150/Code02_ScapeGoat2.java @@ -31,7 +31,7 @@ //int key_count[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //int diff[MAXN]; //int collect[MAXN]; //int ci; @@ -42,12 +42,12 @@ //int init(int num) { // key[++cnt] = num; // ls[cnt] = rs[cnt] = 0; -// key_count[cnt] = size[cnt] = diff[cnt] = 1; +// key_count[cnt] = siz[cnt] = diff[cnt] = 1; // return cnt; //} // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// siz[i] = siz[ls[i]] + siz[rs[i]] + key_count[i]; // diff[i] = diff[ls[i]] + diff[rs[i]] + (key_count[i] > 0 ? 1 : 0); //} // @@ -132,7 +132,7 @@ // if (key[i] >= num) { // return small(ls[i], num); // } else { -// return size[ls[i]] + key_count[i] + small(rs[i], num); +// return siz[ls[i]] + key_count[i] + small(rs[i], num); // } //} // @@ -141,10 +141,10 @@ //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + key_count[i] < x) { -// return index(rs[i], x - size[ls[i]] - key_count[i]); +// } else if (siz[ls[i]] + key_count[i] < x) { +// return index(rs[i], x - siz[ls[i]] - key_count[i]); // } // return key[i]; //} @@ -164,7 +164,7 @@ // //int post(int num) { // int kth = getRank(num + 1); -// if (kth == size[head] + 1) { +// if (kth == siz[head] + 1) { // return INT_MAX; // } else { // return index(kth); @@ -200,7 +200,7 @@ // memset(key_count, 0, sizeof(key_count)); // memset(ls, 0, sizeof(ls)); // memset(rs, 0, sizeof(rs)); -// memset(size, 0, sizeof(size)); +// memset(siz, 0, sizeof(siz)); // memset(diff, 0, sizeof(diff)); // cnt = 0; // head = 0; diff --git a/src/class150/FollowUp2.java b/src/class150/FollowUp2.java index 8fe8f4e6f..e3acc4376 100644 --- a/src/class150/FollowUp2.java +++ b/src/class150/FollowUp2.java @@ -24,7 +24,7 @@ //int key_count[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //int diff[MAXN]; //int collect[MAXN]; //int ci; @@ -35,12 +35,12 @@ //int init(int num) { // key[++cnt] = num; // ls[cnt] = rs[cnt] = 0; -// key_count[cnt] = size[cnt] = diff[cnt] = 1; +// key_count[cnt] = siz[cnt] = diff[cnt] = 1; // return cnt; //} // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// siz[i] = siz[ls[i]] + siz[rs[i]] + key_count[i]; // diff[i] = diff[ls[i]] + diff[rs[i]] + (key_count[i] > 0 ? 1 : 0); //} // @@ -125,7 +125,7 @@ // if (key[i] >= num) { // return small(ls[i], num); // } else { -// return size[ls[i]] + key_count[i] + small(rs[i], num); +// return siz[ls[i]] + key_count[i] + small(rs[i], num); // } //} // @@ -134,10 +134,10 @@ //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + key_count[i] < x) { -// return index(rs[i], x - size[ls[i]] - key_count[i]); +// } else if (siz[ls[i]] + key_count[i] < x) { +// return index(rs[i], x - siz[ls[i]] - key_count[i]); // } // return key[i]; //} @@ -157,7 +157,7 @@ // //int post(int num) { // int kth = getRank(num + 1); -// if (kth == size[head] + 1) { +// if (kth == siz[head] + 1) { // return INT_MAX; // } else { // return index(kth); @@ -193,7 +193,7 @@ // memset(key_count, 0, sizeof(key_count)); // memset(ls, 0, sizeof(ls)); // memset(rs, 0, sizeof(rs)); -// memset(size, 0, sizeof(size)); +// memset(siz, 0, sizeof(siz)); // memset(diff, 0, sizeof(diff)); // cnt = 0; // head = 0; diff --git a/src/class151/Code02_Treap2.java b/src/class151/Code02_Treap2.java index ef8b276da..00a4449bf 100644 --- a/src/class151/Code02_Treap2.java +++ b/src/class151/Code02_Treap2.java @@ -30,11 +30,11 @@ //int key_count[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //double priority[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// siz[i] = siz[ls[i]] + siz[rs[i]] + key_count[i]; //} // //int leftRotate(int i) { @@ -58,7 +58,7 @@ //int add(int i, int num) { // if (i == 0) { // key[++cnt] = num; -// key_count[cnt] = size[cnt] = 1; +// key_count[cnt] = siz[cnt] = 1; // priority[cnt] = static_cast(rand()) / RAND_MAX; // return cnt; // } @@ -90,7 +90,7 @@ // if (key[i] >= num) { // return small(ls[i], num); // } else { -// return size[ls[i]] + key_count[i] + small(rs[i], num); +// return siz[ls[i]] + key_count[i] + small(rs[i], num); // } //} // @@ -99,10 +99,10 @@ //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + key_count[i] < x) { -// return index(rs[i], x - size[ls[i]] - key_count[i]); +// } else if (siz[ls[i]] + key_count[i] < x) { +// return index(rs[i], x - siz[ls[i]] - key_count[i]); // } // return key[i]; //} @@ -182,7 +182,7 @@ // fill(key_count + 1, key_count + cnt + 1, 0); // fill(ls + 1, ls + cnt + 1, 0); // fill(rs + 1, rs + cnt + 1, 0); -// fill(size + 1, size + cnt + 1, 0); +// fill(siz + 1, siz + cnt + 1, 0); // fill(priority + 1, priority + cnt + 1, 0); // cnt = 0; // head = 0; diff --git a/src/class151/FollowUp2.java b/src/class151/FollowUp2.java index 6c8793e42..da9078481 100644 --- a/src/class151/FollowUp2.java +++ b/src/class151/FollowUp2.java @@ -23,11 +23,11 @@ //int key_count[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //double priority[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// siz[i] = siz[ls[i]] + siz[rs[i]] + key_count[i]; //} // //int leftRotate(int i) { @@ -51,7 +51,7 @@ //int add(int i, int num) { // if (i == 0) { // key[++cnt] = num; -// key_count[cnt] = size[cnt] = 1; +// key_count[cnt] = siz[cnt] = 1; // priority[cnt] = static_cast(rand()) / RAND_MAX; // return cnt; // } @@ -83,7 +83,7 @@ // if (key[i] >= num) { // return small(ls[i], num); // } else { -// return size[ls[i]] + key_count[i] + small(rs[i], num); +// return siz[ls[i]] + key_count[i] + small(rs[i], num); // } //} // @@ -92,10 +92,10 @@ //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + key_count[i] < x) { -// return index(rs[i], x - size[ls[i]] - key_count[i]); +// } else if (siz[ls[i]] + key_count[i] < x) { +// return index(rs[i], x - siz[ls[i]] - key_count[i]); // } // return key[i]; //} @@ -175,7 +175,7 @@ // fill(key_count + 1, key_count + cnt + 1, 0); // fill(ls + 1, ls + cnt + 1, 0); // fill(rs + 1, rs + cnt + 1, 0); -// fill(size + 1, size + cnt + 1, 0); +// fill(siz + 1, siz + cnt + 1, 0); // fill(priority + 1, priority + cnt + 1, 0); // cnt = 0; // head = 0; diff --git a/src/class152/Code01_FHQTreapWithCount2.java b/src/class152/Code01_FHQTreapWithCount2.java index dc5804004..f1e908a20 100644 --- a/src/class152/Code01_FHQTreapWithCount2.java +++ b/src/class152/Code01_FHQTreapWithCount2.java @@ -29,11 +29,11 @@ //int key_count[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //double priority[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// siz[i] = siz[ls[i]] + siz[rs[i]] + key_count[i]; //} // //void split(int l, int r, int i, int num) { @@ -96,7 +96,7 @@ // } else { // split(0, 0, head, num); // key[++cnt] = num; -// key_count[cnt] = size[cnt] = 1; +// key_count[cnt] = siz[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; // head = merge(merge(rs[0], cnt), ls[0]); // } @@ -125,7 +125,7 @@ // if (key[i] >= num) { // return small(ls[i], num); // } else { -// return size[ls[i]] + key_count[i] + small(rs[i], num); +// return siz[ls[i]] + key_count[i] + small(rs[i], num); // } //} // @@ -134,10 +134,10 @@ //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + key_count[i] < x) { -// return index(rs[i], x - size[ls[i]] - key_count[i]); +// } else if (siz[ls[i]] + key_count[i] < x) { +// return index(rs[i], x - siz[ls[i]] - key_count[i]); // } // return key[i]; //} diff --git a/src/class152/Code02_FHQTreapWithoutCount2.java b/src/class152/Code02_FHQTreapWithoutCount2.java index 9655a7fd3..b74f202c0 100644 --- a/src/class152/Code02_FHQTreapWithoutCount2.java +++ b/src/class152/Code02_FHQTreapWithoutCount2.java @@ -28,11 +28,11 @@ //int key[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //double priority[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //void split(int l, int r, int i, int num) { @@ -68,7 +68,7 @@ //void add(int num) { // split(0, 0, head, num); // key[++cnt] = num; -// size[cnt] = 1; +// siz[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; // head = merge(merge(rs[0], cnt), ls[0]); //} @@ -85,16 +85,16 @@ // //int getRank(int num) { // split(0, 0, head, num - 1); -// int ans = size[rs[0]] + 1; +// int ans = siz[rs[0]] + 1; // head = merge(rs[0], ls[0]); // return ans; //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + 1 < x) { -// return index(rs[i], x - size[ls[i]] - 1); +// } else if (siz[ls[i]] + 1 < x) { +// return index(rs[i], x - siz[ls[i]] - 1); // } else { // return key[i]; // } diff --git a/src/class152/Code03_TextEditor2.java b/src/class152/Code03_TextEditor2.java index cb3bd74ef..b3e6f98aa 100644 --- a/src/class152/Code03_TextEditor2.java +++ b/src/class152/Code03_TextEditor2.java @@ -27,22 +27,22 @@ //char key[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //double priority[MAXN]; //char ans[MAXN]; //int ansi; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //void split(int l, int r, int i, int rank) { // if (i == 0) { // rs[l] = ls[r] = 0; // } else { -// if (size[ls[i]] + 1 <= rank) { +// if (siz[ls[i]] + 1 <= rank) { // rs[l] = i; -// split(i, r, rs[i], rank - size[ls[i]] - 1); +// split(i, r, rs[i], rank - siz[ls[i]] - 1); // } else { // ls[r] = i; // split(l, i, ls[i], rank); @@ -99,7 +99,7 @@ // ch = getchar(); // } // key[++cnt] = ch; -// size[cnt] = 1; +// siz[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; // l = merge(l, cnt); // } diff --git a/src/class152/Code04_LiteraryTree2.java b/src/class152/Code04_LiteraryTree2.java index ce492e41e..2903de582 100644 --- a/src/class152/Code04_LiteraryTree2.java +++ b/src/class152/Code04_LiteraryTree2.java @@ -25,14 +25,14 @@ //int key[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //double priority[MAXN]; //bool rev[MAXN]; //int ans[MAXN]; //int ansi; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //void down(int i) { @@ -49,9 +49,9 @@ // rs[l] = ls[r] = 0; // } else { // down(i); -// if (size[ls[i]] + 1 <= rank) { +// if (siz[ls[i]] + 1 <= rank) { // rs[l] = i; -// split(i, r, rs[i], rank - size[ls[i]] - 1); +// split(i, r, rs[i], rank - siz[ls[i]] - 1); // } else { // ls[r] = i; // split(l, i, ls[i], rank); @@ -94,7 +94,7 @@ // cin >> n >> k; // for (int i = 1; i <= n; i++) { // key[++cnt] = i; -// size[cnt] = 1; +// siz[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; // head = merge(head, cnt); // } diff --git a/src/class152/Code05_PersistentFHQTreap2.java b/src/class152/Code05_PersistentFHQTreap2.java index 6ae238d6f..c0be77e6c 100644 --- a/src/class152/Code05_PersistentFHQTreap2.java +++ b/src/class152/Code05_PersistentFHQTreap2.java @@ -33,7 +33,7 @@ //int key[MAXM]; //int ls[MAXM]; //int rs[MAXM]; -//int size[MAXM]; +//int siz[MAXM]; //double priority[MAXM]; // //int copy(int i) { @@ -41,13 +41,13 @@ // key[cnt] = key[i]; // ls[cnt] = ls[i]; // rs[cnt] = rs[i]; -// size[cnt] = size[i]; +// siz[cnt] = siz[i]; // priority[cnt] = priority[i]; // return cnt; //} // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //void split(int l, int r, int i, int num) { @@ -90,7 +90,7 @@ // ls[0] = rs[0] = 0; // ++cnt; // key[cnt] = num; -// size[cnt] = 1; +// siz[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; // head[v] = merge(merge(l, cnt), r); //} @@ -113,15 +113,15 @@ // if (key[i] >= num) { // return small(ls[i], num); // } else { -// return size[ls[i]] + 1 + small(rs[i], num); +// return siz[ls[i]] + 1 + small(rs[i], num); // } //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + 1 < x) { -// return index(rs[i], x - size[ls[i]] - 1); +// } else if (siz[ls[i]] + 1 < x) { +// return index(rs[i], x - siz[ls[i]] - 1); // } else { // return key[i]; // } diff --git a/src/class152/Code06_PersistentLiteraryTree2.java b/src/class152/Code06_PersistentLiteraryTree2.java index 80a34595f..0793043fb 100644 --- a/src/class152/Code06_PersistentLiteraryTree2.java +++ b/src/class152/Code06_PersistentLiteraryTree2.java @@ -28,7 +28,7 @@ //int key[MAXM]; //int ls[MAXM]; //int rs[MAXM]; -//int size[MAXM]; +//int siz[MAXM]; //bool rev[MAXM]; //long long sum[MAXM]; //double priority[MAXM]; @@ -37,7 +37,7 @@ // key[++cnt] = key[i]; // ls[cnt] = ls[i]; // rs[cnt] = rs[i]; -// size[cnt] = size[i]; +// siz[cnt] = siz[i]; // rev[cnt] = rev[i]; // sum[cnt] = sum[i]; // priority[cnt] = priority[i]; @@ -45,7 +45,7 @@ //} // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; // sum[i] = sum[ls[i]] + sum[rs[i]] + key[i]; //} // @@ -70,9 +70,9 @@ // } else { // i = copy(i); // down(i); -// if (size[ls[i]] + 1 <= rank) { +// if (siz[ls[i]] + 1 <= rank) { // rs[l] = i; -// split(i, r, rs[i], rank - size[ls[i]] - 1); +// split(i, r, rs[i], rank - siz[ls[i]] - 1); // } else { // ls[r] = i; // split(l, i, ls[i], rank); @@ -123,7 +123,7 @@ // r = ls[0]; // ls[0] = rs[0] = 0; // key[++cnt] = y; -// size[cnt] = 1; +// siz[cnt] = 1; // sum[cnt] = y; // priority[cnt] = (double)rand() / RAND_MAX; // head[i] = merge(merge(l, cnt), r); diff --git a/src/class152/FollowUp2.java b/src/class152/FollowUp2.java index 1ac7e8b72..758bc8f5e 100644 --- a/src/class152/FollowUp2.java +++ b/src/class152/FollowUp2.java @@ -21,11 +21,11 @@ //int key[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //double priority[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //void split(int l, int r, int i, int num) { @@ -61,7 +61,7 @@ //void add(int num) { // split(0, 0, head, num); // key[++cnt] = num; -// size[cnt] = 1; +// siz[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; // head = merge(merge(rs[0], cnt), ls[0]); //} @@ -78,16 +78,16 @@ // //int getRank(int num) { // split(0, 0, head, num - 1); -// int ans = size[rs[0]] + 1; +// int ans = siz[rs[0]] + 1; // head = merge(rs[0], ls[0]); // return ans; //} // //int index(int i, int x) { -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // return index(ls[i], x); -// } else if (size[ls[i]] + 1 < x) { -// return index(rs[i], x - size[ls[i]] - 1); +// } else if (siz[ls[i]] + 1 < x) { +// return index(rs[i], x - siz[ls[i]] - 1); // } else { // return key[i]; // } diff --git a/src/class153/Code01_Splay2.java b/src/class153/Code01_Splay2.java index b00ee7ba7..c8a18e59a 100644 --- a/src/class153/Code01_Splay2.java +++ b/src/class153/Code01_Splay2.java @@ -29,10 +29,10 @@ //int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //int lr(int i) { @@ -89,12 +89,12 @@ //int find(int rank) { // int i = head; // while (i != 0) { -// if (size[ls[i]] + 1 == rank) { +// if (siz[ls[i]] + 1 == rank) { // return i; -// } else if (size[ls[i]] >= rank) { +// } else if (siz[ls[i]] >= rank) { // i = ls[i]; // } else { -// rank -= size[ls[i]] + 1; +// rank -= siz[ls[i]] + 1; // i = rs[i]; // } // } @@ -103,7 +103,7 @@ // //void add(int num) { // key[++cnt] = num; -// size[cnt] = 1; +// siz[cnt] = 1; // if (head == 0) { // head = cnt; // } else { @@ -136,7 +136,7 @@ // if (key[i] >= num) { // i = ls[i]; // } else { -// ans += size[ls[i]] + 1; +// ans += siz[ls[i]] + 1; // i = rs[i]; // } // } diff --git a/src/class153/Code02_FrustratedCashier2.java b/src/class153/Code02_FrustratedCashier2.java index 00850dfc5..4324c0dc7 100644 --- a/src/class153/Code02_FrustratedCashier2.java +++ b/src/class153/Code02_FrustratedCashier2.java @@ -24,13 +24,13 @@ //int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //int limit; //int change = 0; //int enter = 0; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //int lr(int i) { @@ -86,7 +86,7 @@ // //void add(int num) { // key[++cnt] = num; -// size[cnt] = 1; +// siz[cnt] = 1; // if (head == 0) { // head = cnt; // } else { @@ -115,10 +115,10 @@ // int i = head, last = head; // while (i != 0) { // last = i; -// if (size[ls[i]] >= x) { +// if (siz[ls[i]] >= x) { // i = ls[i]; -// } else if (size[ls[i]] + 1 < x) { -// x -= size[ls[i]] + 1; +// } else if (siz[ls[i]] + 1 < x) { +// x -= siz[ls[i]] + 1; // i = rs[i]; // } else { // i = 0; @@ -167,13 +167,13 @@ // change -= x; // departure(); // } else if (op == 'F') { -// if (x > size[head]) { +// if (x > siz[head]) { // cout << -1 << endl; // } else { -// cout << index(size[head] - x + 1) + change << endl; +// cout << index(siz[head] - x + 1) + change << endl; // } // } // } -// cout << enter - size[head] << endl; +// cout << enter - siz[head] << endl; // return 0; //} \ No newline at end of file diff --git a/src/class153/Code03_LiteraryTree2.java b/src/class153/Code03_LiteraryTree2.java index e1fc072c0..6732ac8e4 100644 --- a/src/class153/Code03_LiteraryTree2.java +++ b/src/class153/Code03_LiteraryTree2.java @@ -21,7 +21,7 @@ //int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //bool rev[MAXN]; //int sta[MAXN]; //int si; @@ -29,7 +29,7 @@ //int ai; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //int lr(int i) { @@ -98,12 +98,12 @@ // int i = head; // while (i != 0) { // down(i); -// if (size[ls[i]] + 1 == rank) { +// if (siz[ls[i]] + 1 == rank) { // return i; -// } else if (size[ls[i]] >= rank) { +// } else if (siz[ls[i]] >= rank) { // i = ls[i]; // } else { -// rank -= size[ls[i]] + 1; +// rank -= siz[ls[i]] + 1; // i = rs[i]; // } // } @@ -112,7 +112,7 @@ // //void add(int x) { // num[++cnt] = x; -// size[cnt] = 1; +// siz[cnt] = 1; // fa[cnt] = head; // rs[head] = cnt; // splay(cnt, 0); diff --git a/src/class153/Code04_Bookcase2.java b/src/class153/Code04_Bookcase2.java index d9a81bb32..820e1a07e 100644 --- a/src/class153/Code04_Bookcase2.java +++ b/src/class153/Code04_Bookcase2.java @@ -25,11 +25,11 @@ //int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //int pos[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //int lr(int i) { @@ -86,12 +86,12 @@ //int find(int rank) { // int i = head; // while (i != 0) { -// if (size[ls[i]] + 1 == rank) { +// if (siz[ls[i]] + 1 == rank) { // return i; -// } else if (size[ls[i]] >= rank) { +// } else if (siz[ls[i]] >= rank) { // i = ls[i]; // } else { -// rank -= size[ls[i]] + 1; +// rank -= siz[ls[i]] + 1; // i = rs[i]; // } // } @@ -101,7 +101,7 @@ //void add(int s) { // num[++cnt] = s; // pos[s] = cnt; -// size[cnt] = 1; +// siz[cnt] = 1; // fa[cnt] = head; // rs[head] = cnt; // splay(cnt, 0); @@ -110,7 +110,7 @@ //int ask(int s) { // int i = pos[s]; // splay(i, 0); -// return size[ls[i]]; +// return siz[ls[i]]; //} // //int query(int s) { diff --git a/src/class153/Code05_MaintainSequence2.java b/src/class153/Code05_MaintainSequence2.java index 8c4255941..5ae0341d5 100644 --- a/src/class153/Code05_MaintainSequence2.java +++ b/src/class153/Code05_MaintainSequence2.java @@ -27,7 +27,7 @@ //int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //int space[MAXN], si; //int sum[MAXN]; //int all[MAXN]; @@ -39,7 +39,7 @@ // //void up(int i) { // int l = ls[i], r = rs[i]; -// size[i] = size[l] + size[r] + 1; +// siz[i] = siz[l] + siz[r] + 1; // sum[i] = sum[l] + sum[r] + num[i]; // all[i] = max(max(all[l], all[r]), suf[l] + num[i] + pre[r]); // pre[i] = max(pre[l], sum[l] + num[i] + pre[r]); @@ -100,7 +100,7 @@ // update[i] = true; // change[i] = val; // num[i] = val; -// sum[i] = size[i] * val; +// sum[i] = siz[i] * val; // all[i] = max(sum[i], val); // pre[i] = max(sum[i], 0); // suf[i] = max(sum[i], 0); @@ -130,7 +130,7 @@ // //int init(int val) { // int i = space[si--]; -// size[i] = 1; +// siz[i] = 1; // num[i] = sum[i] = all[i] = val; // pre[i] = suf[i] = max(val, 0); // fa[i] = ls[i] = rs[i] = 0; @@ -157,12 +157,12 @@ // int i = head; // while (i != 0) { // down(i); -// if (size[ls[i]] + 1 == rank) { +// if (siz[ls[i]] + 1 == rank) { // return i; -// } else if (size[ls[i]] >= rank) { +// } else if (siz[ls[i]] >= rank) { // i = ls[i]; // } else { -// rank -= size[ls[i]] + 1; +// rank -= siz[ls[i]] + 1; // i = rs[i]; // } // } diff --git a/src/class153/FollowUp2.java b/src/class153/FollowUp2.java index 13f127ab1..aeabae2b5 100644 --- a/src/class153/FollowUp2.java +++ b/src/class153/FollowUp2.java @@ -22,10 +22,10 @@ //int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; +// siz[i] = siz[ls[i]] + siz[rs[i]] + 1; //} // //int lr(int i) { @@ -82,12 +82,12 @@ //int find(int rank) { // int i = head; // while (i != 0) { -// if (size[ls[i]] + 1 == rank) { +// if (siz[ls[i]] + 1 == rank) { // return i; -// } else if (size[ls[i]] >= rank) { +// } else if (siz[ls[i]] >= rank) { // i = ls[i]; // } else { -// rank -= size[ls[i]] + 1; +// rank -= siz[ls[i]] + 1; // i = rs[i]; // } // } @@ -96,7 +96,7 @@ // //void add(int num) { // key[++cnt] = num; -// size[cnt] = 1; +// siz[cnt] = 1; // if (head == 0) { // head = cnt; // } else { @@ -129,7 +129,7 @@ // if (key[i] >= num) { // i = ls[i]; // } else { -// ans += size[ls[i]] + 1; +// ans += siz[ls[i]] + 1; // i = rs[i]; // } // } diff --git a/src/class157/Code02_PointPersistent2.java b/src/class157/Code02_PointPersistent2.java index 31e5b9ca5..ca417a518 100644 --- a/src/class157/Code02_PointPersistent2.java +++ b/src/class157/Code02_PointPersistent2.java @@ -21,7 +21,7 @@ //int root[MAXN]; //int ls[MAXT]; //int rs[MAXT]; -//int size[MAXT]; +//int siz[MAXT]; //int cnt; // //int kth(int num) { @@ -40,7 +40,7 @@ // //int build(int l, int r) { // int rt = ++cnt; -// size[rt] = 0; +// siz[rt] = 0; // if (l < r) { // int mid = (l + r) / 2; // ls[rt] = build(l, mid); @@ -53,7 +53,7 @@ // int rt = ++cnt; // ls[rt] = ls[i]; // rs[rt] = rs[i]; -// size[rt] = size[i] + 1; +// siz[rt] = siz[i] + 1; // if (l < r) { // int mid = (l + r) / 2; // if (jobi <= mid) { @@ -69,12 +69,12 @@ // if (l == r) { // return l; // } -// int lsize = size[ls[v]] - size[ls[u]]; +// int lsiz = siz[ls[v]] - siz[ls[u]]; // int mid = (l + r) / 2; -// if (lsize >= jobk) { +// if (lsiz >= jobk) { // return query(jobk, l, mid, ls[u], ls[v]); // } else { -// return query(jobk - lsize, mid + 1, r, rs[u], rs[v]); +// return query(jobk - lsiz, mid + 1, r, rs[u], rs[v]); // } //} // diff --git a/src/class158/Code04_CountOnTree2.java b/src/class158/Code04_CountOnTree2.java index af273f7ed..02682b396 100644 --- a/src/class158/Code04_CountOnTree2.java +++ b/src/class158/Code04_CountOnTree2.java @@ -33,7 +33,7 @@ //int root[MAXN]; //int ls[MAXT]; //int rs[MAXT]; -//int size[MAXT]; +//int siz[MAXT]; //int cntt = 0; // //int deep[MAXN]; @@ -56,7 +56,7 @@ // //int build(int l, int r) { // int rt = ++cntt; -// size[rt] = 0; +// siz[rt] = 0; // if (l < r) { // int mid = (l + r) / 2; // ls[rt] = build(l, mid); @@ -89,7 +89,7 @@ // int rt = ++cntt; // ls[rt] = ls[i]; // rs[rt] = rs[i]; -// size[rt] = size[i] + 1; +// siz[rt] = siz[i] + 1; // if (l < r) { // int mid = (l + r) / 2; // if (jobi <= mid) { @@ -105,12 +105,12 @@ // if (l == r) { // return l; // } -// int lsize = size[ls[u]] + size[ls[v]] - size[ls[lca]] - size[ls[lcafa]]; +// int lsiz = siz[ls[u]] + siz[ls[v]] - siz[ls[lca]] - siz[ls[lcafa]]; // int mid = (l + r) / 2; -// if (lsize >= jobk) { +// if (lsiz >= jobk) { // return query(jobk, l, mid, ls[u], ls[v], ls[lca], ls[lcafa]); // } else { -// return query(jobk - lsize, mid + 1, r, rs[u], rs[v], rs[lca], rs[lcafa]); +// return query(jobk - lsiz, mid + 1, r, rs[u], rs[v], rs[lca], rs[lcafa]); // } //} // diff --git a/src/class159/Code03_PathDfnXor2.java b/src/class159/Code03_PathDfnXor2.java index e899a01a8..408cf9be3 100644 --- a/src/class159/Code03_PathDfnXor2.java +++ b/src/class159/Code03_PathDfnXor2.java @@ -28,7 +28,7 @@ //int cntg = 0; // //int deep[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //int stjump[MAXN][MAXH]; //int dfn[MAXN]; //int cntd = 0; @@ -81,7 +81,7 @@ // //void dfs1(int u, int fa) { // deep[u] = deep[fa] + 1; -// size[u] = 1; +// siz[u] = 1; // stjump[u][0] = fa; // dfn[u] = ++cntd; // for (int p = 1; p < MAXH; p++) { @@ -91,7 +91,7 @@ // v = to[ei]; // if (v != fa) { // dfs1(v, u); -// size[u] += size[v]; +// siz[u] += siz[v]; // } // } //} @@ -144,7 +144,7 @@ // for (int i = 1, op, x, y, z; i <= m; i++) { // cin >> op >> x >> y; // if (op == 1) { -// cout << query(y, root1[dfn[x] - 1], root1[dfn[x] + size[x] - 1]) << '\n'; +// cout << query(y, root1[dfn[x] - 1], root1[dfn[x] + siz[x] - 1]) << '\n'; // } else { // cin >> z; // int lcafa = stjump[lca(x, y)][0]; diff --git a/src/class159/Code04_Yummy2.java b/src/class159/Code04_Yummy2.java index 18a567473..c63f538c1 100644 --- a/src/class159/Code04_Yummy2.java +++ b/src/class159/Code04_Yummy2.java @@ -22,12 +22,12 @@ //int root[MAXN]; //int ls[MAXT]; //int rs[MAXT]; -//int size[MAXT]; +//int siz[MAXT]; //int cnt; // //int build(int l, int r) { // int rt = ++cnt; -// size[rt] = 0; +// siz[rt] = 0; // if (l < r) { // int mid = (l + r) / 2; // ls[rt] = build(l, mid); @@ -40,7 +40,7 @@ // int rt = ++cnt; // ls[rt] = ls[i]; // rs[rt] = rs[i]; -// size[rt] = size[i] + 1; +// siz[rt] = siz[i] + 1; // if (l < r) { // int mid = (l + r) / 2; // if (jobi <= mid) { @@ -57,7 +57,7 @@ // return 0; // } // if (jobl <= l && r <= jobr) { -// return size[v] - size[u]; +// return siz[v] - siz[u]; // } // int mid = (l + r) / 2; // int ans = 0; diff --git a/src/class160/Code07_NetworkManagement2.java b/src/class160/Code07_NetworkManagement2.java index b29cb49dd..95f26f8dd 100644 --- a/src/class160/Code07_NetworkManagement2.java +++ b/src/class160/Code07_NetworkManagement2.java @@ -37,7 +37,7 @@ //int cntt; // //int deep[MAXN]; -//int size[MAXN]; +//int siz[MAXN]; //int dfn[MAXN]; //int stjump[MAXN][MAXH]; //int cntd; @@ -69,7 +69,7 @@ // //void dfs(int u, int fa) { // deep[u] = deep[fa] + 1; -// size[u] = 1; +// siz[u] = 1; // dfn[u] = ++cntd; // stjump[u][0] = fa; // for (int p = 1; p < MAXH; p++) { @@ -79,7 +79,7 @@ // if (to[e] != fa) dfs(to[e], u); // } // for (int e = head[u]; e; e = nxt[e]) { -// if (to[e] != fa) size[u] += size[to[e]]; +// if (to[e] != fa) siz[u] += siz[to[e]]; // } //} // @@ -153,10 +153,10 @@ // //void update(int i, int v) { // add(dfn[i], arr[i], -1); -// add(dfn[i] + size[i], arr[i], 1); +// add(dfn[i] + siz[i], arr[i], 1); // arr[i] = kth(v); // add(dfn[i], arr[i], 1); -// add(dfn[i] + size[i], arr[i], -1); +// add(dfn[i] + siz[i], arr[i], -1); //} // //int query(int x, int y, int k) { @@ -192,7 +192,7 @@ // dfs(1, 0); // for (int i = 1; i <= n; i++) { // add(dfn[i], arr[i], 1); -// add(dfn[i] + size[i], arr[i], -1); +// add(dfn[i] + siz[i], arr[i], -1); // } //} // From f9560a41a3d88dc209d6304db8ff354a374a5368 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Jun 2025 17:57:21 +0800 Subject: [PATCH 0276/1170] modify code --- src/class172/Code06_TextEditor1.java | 187 ++++++++++++++++++++++++--- src/class172/Code06_TextEditor2.java | 172 ++++++++++++++++++++++++ 2 files changed, 342 insertions(+), 17 deletions(-) create mode 100644 src/class172/Code06_TextEditor2.java diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 980fcfcdd..ef25c9ef3 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -4,17 +4,172 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStreamWriter; import java.io.PrintWriter; public class Code06_TextEditor1 { - public static void main(String[] args) throws IOException { - FastReader in = new FastReader(); - PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + public static int MAXN = 3000001; + public static int BLEN = 4001; + public static int BNUM = (MAXN / BLEN) << 1; + + public static char[][] blocks = new char[BNUM][BLEN]; + public static int[] nxt = new int[BNUM]; + public static int[] siz = new int[BNUM]; + public static int[] pool = new int[BNUM]; + public static int psiz = 0; + + public static char[] str = new char[MAXN]; + + public static void prepare() { + for (int i = 1; i < BNUM; i++) { + pool[i] = i; + } + psiz = BNUM - 1; + siz[0] = 0; + nxt[0] = -1; + } + + public static int assign() { + return pool[psiz--]; + } + + public static void recycle(int i) { + pool[++psiz] = i; + } + + public static int bi, pi; + + public static void find(int pos) { + int cur = 0; + while (cur != -1 && pos > siz[cur]) { + pos -= siz[cur]; + cur = nxt[cur]; + } + bi = cur; + pi = pos; + } + + public static void flush(int cur, int next, int endLen, char[] src, int srcPos) { + nxt[next] = nxt[cur]; + nxt[cur] = next; + siz[next] = endLen; + System.arraycopy(src, srcPos, blocks[next], 0, endLen); + } + + public static void merge(int cur, int next) { + System.arraycopy(blocks[next], 0, blocks[cur], siz[cur], siz[next]); + siz[cur] += siz[next]; + nxt[cur] = nxt[next]; + recycle(next); + } + + public static void split(int cur, int pos) { + if (cur == -1 || pos == siz[cur]) { + return; + } + int next = assign(); + flush(cur, next, siz[cur] - pos, blocks[cur], pos); + siz[cur] = pos; + } + public static void maintain() { + for (int cur = 0, next; cur != -1; cur = nxt[cur]) { + next = nxt[cur]; + while (next != -1 && siz[cur] + siz[next] <= BLEN) { + merge(cur, next); + next = nxt[cur]; + } + } + } + + public static void insert(int pos, int len) { + find(pos); + split(bi, pi); + int cur = bi, newb, done = 0; + while (done + BLEN <= len) { + newb = assign(); + flush(cur, newb, BLEN, str, done); + done += BLEN; + cur = newb; + } + if (len > done) { + newb = assign(); + flush(cur, newb, len - done, str, done); + } + maintain(); + } + + public static void erase(int pos, int len) { + find(pos); + split(bi, pi); + int cur = bi, next = nxt[cur]; + while (next != -1 && len > siz[next]) { + len -= siz[next]; + recycle(next); + next = nxt[next]; + } + if (next != -1) { + split(next, len); + recycle(next); + nxt[cur] = nxt[next]; + } else { + nxt[cur] = -1; + } + maintain(); + } + + public static void get(int pos, int len) { + find(pos); + int cur = bi; + pos = pi; + int got = (len < siz[cur] - pos) ? len : (siz[cur] - pos); + System.arraycopy(blocks[cur], pos, str, 0, got); + cur = nxt[cur]; + while (cur != -1 && got + siz[cur] <= len) { + System.arraycopy(blocks[cur], 0, str, got, siz[cur]); + got += siz[cur]; + cur = nxt[cur]; + } + if (cur != -1 && got < len) { + System.arraycopy(blocks[cur], 0, str, got, len - got); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out)); + int n = in.nextInt(); + int pos = 0; + int len; + String op; + prepare(); + for (int i = 1; i <= n; i++) { + op = in.nextString(); + if (op.equals("Prev")) { + pos--; + } else if (op.equals("Next")) { + pos++; + } else if (op.equals("Move")) { + pos = in.nextInt(); + } else if (op.equals("Insert")) { + len = in.nextInt(); + for (int j = 0; j < len; j++) { + str[j] = in.nextChar(); + } + insert(pos, len); + } else if (op.equals("Delete")) { + len = in.nextInt(); + erase(pos, len); + } else { + len = in.nextInt(); + get(pos, len); + out.write(str, 0, len); + out.write('\n'); + } + } out.flush(); out.close(); } @@ -26,7 +181,7 @@ static class FastReader { private final byte[] buffer; private int ptr, len; - public FastReader() { + FastReader() { in = System.in; buffer = new byte[BUFFER_SIZE]; ptr = len = 0; @@ -46,8 +201,8 @@ private byte readByte() throws IOException { return buffer[ptr++]; } - // 读取下一个ASCII码在闭区间[32, 126]内的字符 - public char nextChar() throws IOException { + // 读取下一个ASCII码范围在[32,126]的字符 + char nextChar() throws IOException { byte c; do { c = readByte(); @@ -57,12 +212,11 @@ public char nextChar() throws IOException { return (char) c; } - public String nextString() throws IOException { + String nextString() throws IOException { byte b = readByte(); - while (isWhitespace(b)) { + while (isWhitespace(b)) b = readByte(); - } - StringBuilder sb = new StringBuilder(1000); + StringBuilder sb = new StringBuilder(16); while (!isWhitespace(b) && b != -1) { sb.append((char) b); b = readByte(); @@ -70,21 +224,20 @@ public String nextString() throws IOException { return sb.toString(); } - public int nextInt() throws IOException { - int num = 0; + int nextInt() throws IOException { + int num = 0, sign = 1; byte b = readByte(); while (isWhitespace(b)) b = readByte(); - boolean minus = false; if (b == '-') { - minus = true; + sign = -1; b = readByte(); } while (!isWhitespace(b) && b != -1) { num = num * 10 + (b - '0'); b = readByte(); } - return minus ? -num : num; + return sign * num; } private boolean isWhitespace(byte b) { @@ -92,4 +245,4 @@ private boolean isWhitespace(byte b) { } } -} +} \ No newline at end of file diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java new file mode 100644 index 000000000..690de8071 --- /dev/null +++ b/src/class172/Code06_TextEditor2.java @@ -0,0 +1,172 @@ +package class172; + +// 文本编辑器,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4008 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 3000001; +//const int BLEN = 4001; +//const int BNUM = (MAXN / BLEN) << 1; +// +//char blocks[BNUM][BLEN]; +//int nxt[BNUM]; +//int siz[BNUM]; +//int pool[BNUM]; +//int psiz = 0; +// +//char str[MAXN]; +// +//void prepare() { +// for (int i = 1; i < BNUM; i++) pool[i] = i; +// psiz = BNUM - 1; +// siz[0] = 0; +// nxt[0] = -1; +//} +// +//int assign() { +// return pool[psiz--]; +//} +// +//void recycle(int i) { +// pool[++psiz] = i; +//} +// +//int bi, pi; +// +//void find(int pos) { +// int cur = 0; +// while (cur != -1 && pos > siz[cur]) { +// pos -= siz[cur]; +// cur = nxt[cur]; +// } +// bi = cur; +// pi = pos; +//} +// +//void flush(int cur, int nextb, int endLen, char* src, int srcPos) { +// nxt[nextb] = nxt[cur]; +// nxt[cur] = nextb; +// siz[nextb] = endLen; +// memcpy(blocks[nextb], src + srcPos, endLen); +//} +// +//void merge(int cur, int nextb) { +// memcpy(blocks[cur] + siz[cur], blocks[nextb], siz[nextb]); +// siz[cur] += siz[nextb]; +// nxt[cur] = nxt[nextb]; +// recycle(nextb); +//} +// +//void split(int cur, int pos) { +// if (cur == -1 || pos == siz[cur]) return; +// int nextb = assign(); +// flush(cur, nextb, siz[cur] - pos, blocks[cur], pos); +// siz[cur] = pos; +//} +// +//void maintain() { +// for (int cur = 0, nextb; cur != -1; cur = nxt[cur]) { +// nextb = nxt[cur]; +// while (nextb != -1 && siz[cur] + siz[nextb] <= BLEN) { +// merge(cur, nextb); +// nextb = nxt[cur]; +// } +// } +//} +// +//void insert(int pos, int len) { +// find(pos); +// split(bi, pi); +// int cur = bi, newb, done = 0; +// while (done + BLEN <= len) { +// newb = assign(); +// flush(cur, newb, BLEN, str, done); +// done += BLEN; +// cur = newb; +// } +// if (len > done) { +// newb = assign(); +// flush(cur, newb, len - done, str, done); +// } +// maintain(); +//} +// +//void erase(int pos, int len) { +// find(pos); +// split(bi, pi); +// int cur = bi; +// int nextb = nxt[cur]; +// while (nextb != -1 && len > siz[nextb]) { +// len -= siz[nextb]; +// recycle(nextb); +// nextb = nxt[nextb]; +// } +// if (nextb != -1) { +// split(nextb, len); +// recycle(nextb); +// nxt[cur] = nxt[nextb]; +// } else { +// nxt[cur] = -1; +// } +// maintain(); +//} +// +//void get(int pos, int len) { +// find(pos); +// int cur = bi; +// pos = pi; +// int got = (len < siz[cur] - pos) ? len : (siz[cur] - pos); +// memcpy(str, blocks[cur] + pos, got); +// cur = nxt[cur]; +// while (cur != -1 && got + siz[cur] <= len) { +// memcpy(str + got, blocks[cur], siz[cur]); +// got += siz[cur]; +// cur = nxt[cur]; +// } +// if (cur != -1 && got < len) { +// memcpy(str + got, blocks[cur], len - got); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int n; +// cin >> n; +// int pos = 0, len; +// char op[10]; +// prepare(); +// for (int i = 1; i <= n; i++) { +// cin >> op; +// if (op[0] == 'P') { +// pos--; +// } else if (op[0] == 'N') { +// pos++; +// } else if (op[0] == 'M') { +// cin >> pos; +// } else if (op[0] == 'I') { +// cin >> len; +// for (int j = 0; j < len; ) { +// char ch = cin.get(); +// if (32 <= ch && ch <= 126) { +// str[j++] = ch; +// } +// } +// insert(pos, len); +// } else if (op[0] == 'D') { +// cin >> len; +// erase(pos, len); +// } else { +// cin >> len; +// get(pos, len); +// cout.write(str, len); +// cout.put('\n'); +// } +// } +// return 0; +//} \ No newline at end of file From 04b5d9b8e60c819849d0e09484d4fe09a478bc10 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Jun 2025 18:08:41 +0800 Subject: [PATCH 0277/1170] modify code --- src/class172/Code06_TextEditor1.java | 6 +++--- src/class172/Code06_TextEditor2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index ef25c9ef3..6f8d12270 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -52,11 +52,11 @@ public static void find(int pos) { pi = pos; } - public static void flush(int cur, int next, int endLen, char[] src, int srcPos) { + public static void flush(int cur, int next, int tailLen, char[] src, int srcPos) { nxt[next] = nxt[cur]; nxt[cur] = next; - siz[next] = endLen; - System.arraycopy(src, srcPos, blocks[next], 0, endLen); + siz[next] = tailLen; + System.arraycopy(src, srcPos, blocks[next], 0, tailLen); } public static void merge(int cur, int next) { diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index 690de8071..1c38802ee 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -48,11 +48,11 @@ // pi = pos; //} // -//void flush(int cur, int nextb, int endLen, char* src, int srcPos) { +//void flush(int cur, int nextb, int tailLen, char* src, int srcPos) { // nxt[nextb] = nxt[cur]; // nxt[cur] = nextb; -// siz[nextb] = endLen; -// memcpy(blocks[nextb], src + srcPos, endLen); +// siz[nextb] = tailLen; +// memcpy(blocks[nextb], src + srcPos, tailLen); //} // //void merge(int cur, int nextb) { From d0dee603fd285a988d2fd10944f762d9604cbea2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Jun 2025 18:12:00 +0800 Subject: [PATCH 0278/1170] modify code --- src/class172/Code06_TextEditor1.java | 2 +- src/class172/Code06_TextEditor2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 6f8d12270..5409f4610 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -1,6 +1,6 @@ package class172; -// 文本编辑器,java版 +// 文本编辑器,块状链表实现,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index 1c38802ee..65a6fa8f6 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -1,6 +1,6 @@ package class172; -// 文本编辑器,C++版 +// 文本编辑器,块状链表实现,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 22c6b5284f8ebf0d0bce31cfcac0ce379017478c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Jun 2025 18:21:36 +0800 Subject: [PATCH 0279/1170] modify code --- src/class172/Code06_TextEditor1.java | 102 +++++++++++++-------------- src/class172/Code06_TextEditor2.java | 78 ++++++++++---------- 2 files changed, 90 insertions(+), 90 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 5409f4610..533730acf 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -43,44 +43,44 @@ public static void recycle(int i) { public static int bi, pi; public static void find(int pos) { - int cur = 0; - while (cur != -1 && pos > siz[cur]) { - pos -= siz[cur]; - cur = nxt[cur]; + int curb = 0; + while (curb != -1 && pos > siz[curb]) { + pos -= siz[curb]; + curb = nxt[curb]; } - bi = cur; + bi = curb; pi = pos; } - public static void flush(int cur, int next, int tailLen, char[] src, int srcPos) { - nxt[next] = nxt[cur]; - nxt[cur] = next; - siz[next] = tailLen; - System.arraycopy(src, srcPos, blocks[next], 0, tailLen); + public static void flush(int curb, int nextb, int tailLen, char[] src, int srcPos) { + nxt[nextb] = nxt[curb]; + nxt[curb] = nextb; + siz[nextb] = tailLen; + System.arraycopy(src, srcPos, blocks[nextb], 0, tailLen); } - public static void merge(int cur, int next) { - System.arraycopy(blocks[next], 0, blocks[cur], siz[cur], siz[next]); - siz[cur] += siz[next]; - nxt[cur] = nxt[next]; - recycle(next); + public static void merge(int curb, int nextb) { + System.arraycopy(blocks[nextb], 0, blocks[curb], siz[curb], siz[nextb]); + siz[curb] += siz[nextb]; + nxt[curb] = nxt[nextb]; + recycle(nextb); } - public static void split(int cur, int pos) { - if (cur == -1 || pos == siz[cur]) { + public static void split(int curb, int pos) { + if (curb == -1 || pos == siz[curb]) { return; } - int next = assign(); - flush(cur, next, siz[cur] - pos, blocks[cur], pos); - siz[cur] = pos; + int nextb = assign(); + flush(curb, nextb, siz[curb] - pos, blocks[curb], pos); + siz[curb] = pos; } public static void maintain() { - for (int cur = 0, next; cur != -1; cur = nxt[cur]) { - next = nxt[cur]; - while (next != -1 && siz[cur] + siz[next] <= BLEN) { - merge(cur, next); - next = nxt[cur]; + for (int curb = 0, nextb; curb != -1; curb = nxt[curb]) { + nextb = nxt[curb]; + while (nextb != -1 && siz[curb] + siz[nextb] <= BLEN) { + merge(curb, nextb); + nextb = nxt[curb]; } } } @@ -88,16 +88,16 @@ public static void maintain() { public static void insert(int pos, int len) { find(pos); split(bi, pi); - int cur = bi, newb, done = 0; + int curb = bi, newb, done = 0; while (done + BLEN <= len) { newb = assign(); - flush(cur, newb, BLEN, str, done); + flush(curb, newb, BLEN, str, done); done += BLEN; - cur = newb; + curb = newb; } if (len > done) { newb = assign(); - flush(cur, newb, len - done, str, done); + flush(curb, newb, len - done, str, done); } maintain(); } @@ -105,36 +105,36 @@ public static void insert(int pos, int len) { public static void erase(int pos, int len) { find(pos); split(bi, pi); - int cur = bi, next = nxt[cur]; - while (next != -1 && len > siz[next]) { - len -= siz[next]; - recycle(next); - next = nxt[next]; - } - if (next != -1) { - split(next, len); - recycle(next); - nxt[cur] = nxt[next]; + int curb = bi, nextb = nxt[curb]; + while (nextb != -1 && len > siz[nextb]) { + len -= siz[nextb]; + recycle(nextb); + nextb = nxt[nextb]; + } + if (nextb != -1) { + split(nextb, len); + recycle(nextb); + nxt[curb] = nxt[nextb]; } else { - nxt[cur] = -1; + nxt[curb] = -1; } maintain(); } public static void get(int pos, int len) { find(pos); - int cur = bi; + int curb = bi; pos = pi; - int got = (len < siz[cur] - pos) ? len : (siz[cur] - pos); - System.arraycopy(blocks[cur], pos, str, 0, got); - cur = nxt[cur]; - while (cur != -1 && got + siz[cur] <= len) { - System.arraycopy(blocks[cur], 0, str, got, siz[cur]); - got += siz[cur]; - cur = nxt[cur]; - } - if (cur != -1 && got < len) { - System.arraycopy(blocks[cur], 0, str, got, len - got); + int got = (len < siz[curb] - pos) ? len : (siz[curb] - pos); + System.arraycopy(blocks[curb], pos, str, 0, got); + curb = nxt[curb]; + while (curb != -1 && got + siz[curb] <= len) { + System.arraycopy(blocks[curb], 0, str, got, siz[curb]); + got += siz[curb]; + curb = nxt[curb]; + } + if (curb != -1 && got < len) { + System.arraycopy(blocks[curb], 0, str, got, len - got); } } diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index 65a6fa8f6..7767401da 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -39,42 +39,42 @@ //int bi, pi; // //void find(int pos) { -// int cur = 0; -// while (cur != -1 && pos > siz[cur]) { -// pos -= siz[cur]; -// cur = nxt[cur]; +// int curb = 0; +// while (curb != -1 && pos > siz[curb]) { +// pos -= siz[curb]; +// curb = nxt[curb]; // } -// bi = cur; +// bi = curb; // pi = pos; //} // -//void flush(int cur, int nextb, int tailLen, char* src, int srcPos) { -// nxt[nextb] = nxt[cur]; -// nxt[cur] = nextb; +//void flush(int curb, int nextb, int tailLen, char* src, int srcPos) { +// nxt[nextb] = nxt[curb]; +// nxt[curb] = nextb; // siz[nextb] = tailLen; // memcpy(blocks[nextb], src + srcPos, tailLen); //} // -//void merge(int cur, int nextb) { -// memcpy(blocks[cur] + siz[cur], blocks[nextb], siz[nextb]); -// siz[cur] += siz[nextb]; -// nxt[cur] = nxt[nextb]; +//void merge(int curb, int nextb) { +// memcpy(blocks[curb] + siz[curb], blocks[nextb], siz[nextb]); +// siz[curb] += siz[nextb]; +// nxt[curb] = nxt[nextb]; // recycle(nextb); //} // -//void split(int cur, int pos) { -// if (cur == -1 || pos == siz[cur]) return; +//void split(int curb, int pos) { +// if (curb == -1 || pos == siz[curb]) return; // int nextb = assign(); -// flush(cur, nextb, siz[cur] - pos, blocks[cur], pos); -// siz[cur] = pos; +// flush(curb, nextb, siz[curb] - pos, blocks[curb], pos); +// siz[curb] = pos; //} // //void maintain() { -// for (int cur = 0, nextb; cur != -1; cur = nxt[cur]) { -// nextb = nxt[cur]; -// while (nextb != -1 && siz[cur] + siz[nextb] <= BLEN) { -// merge(cur, nextb); -// nextb = nxt[cur]; +// for (int curb = 0, nextb; curb != -1; curb = nxt[curb]) { +// nextb = nxt[curb]; +// while (nextb != -1 && siz[curb] + siz[nextb] <= BLEN) { +// merge(curb, nextb); +// nextb = nxt[curb]; // } // } //} @@ -82,16 +82,16 @@ //void insert(int pos, int len) { // find(pos); // split(bi, pi); -// int cur = bi, newb, done = 0; +// int curb = bi, newb, done = 0; // while (done + BLEN <= len) { // newb = assign(); -// flush(cur, newb, BLEN, str, done); +// flush(curb, newb, BLEN, str, done); // done += BLEN; -// cur = newb; +// curb = newb; // } // if (len > done) { // newb = assign(); -// flush(cur, newb, len - done, str, done); +// flush(curb, newb, len - done, str, done); // } // maintain(); //} @@ -99,8 +99,8 @@ //void erase(int pos, int len) { // find(pos); // split(bi, pi); -// int cur = bi; -// int nextb = nxt[cur]; +// int curb = bi; +// int nextb = nxt[curb]; // while (nextb != -1 && len > siz[nextb]) { // len -= siz[nextb]; // recycle(nextb); @@ -109,27 +109,27 @@ // if (nextb != -1) { // split(nextb, len); // recycle(nextb); -// nxt[cur] = nxt[nextb]; +// nxt[curb] = nxt[nextb]; // } else { -// nxt[cur] = -1; +// nxt[curb] = -1; // } // maintain(); //} // //void get(int pos, int len) { // find(pos); -// int cur = bi; +// int curb = bi; // pos = pi; -// int got = (len < siz[cur] - pos) ? len : (siz[cur] - pos); -// memcpy(str, blocks[cur] + pos, got); -// cur = nxt[cur]; -// while (cur != -1 && got + siz[cur] <= len) { -// memcpy(str + got, blocks[cur], siz[cur]); -// got += siz[cur]; -// cur = nxt[cur]; +// int got = (len < siz[curb] - pos) ? len : (siz[curb] - pos); +// memcpy(str, blocks[curb] + pos, got); +// curb = nxt[curb]; +// while (curb != -1 && got + siz[curb] <= len) { +// memcpy(str + got, blocks[curb], siz[curb]); +// got += siz[curb]; +// curb = nxt[curb]; // } -// if (cur != -1 && got < len) { -// memcpy(str + got, blocks[cur], len - got); +// if (curb != -1 && got < len) { +// memcpy(str + got, blocks[curb], len - got); // } //} // From dd0e0b0467a0bf73528a2750bcd7edd7f6798795 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Jun 2025 18:26:35 +0800 Subject: [PATCH 0280/1170] modify code --- src/class172/Code06_TextEditor1.java | 6 +++--- src/class172/Code06_TextEditor2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 533730acf..4dbd87df8 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -52,11 +52,11 @@ public static void find(int pos) { pi = pos; } - public static void flush(int curb, int nextb, int tailLen, char[] src, int srcPos) { + public static void flush(int curb, int nextb, int nextLen, char[] src, int srcPos) { nxt[nextb] = nxt[curb]; nxt[curb] = nextb; - siz[nextb] = tailLen; - System.arraycopy(src, srcPos, blocks[nextb], 0, tailLen); + siz[nextb] = nextLen; + System.arraycopy(src, srcPos, blocks[nextb], 0, nextLen); } public static void merge(int curb, int nextb) { diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index 7767401da..ef4649ecf 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -48,11 +48,11 @@ // pi = pos; //} // -//void flush(int curb, int nextb, int tailLen, char* src, int srcPos) { +//void flush(int curb, int nextb, int nextLen, char* src, int srcPos) { // nxt[nextb] = nxt[curb]; // nxt[curb] = nextb; -// siz[nextb] = tailLen; -// memcpy(blocks[nextb], src + srcPos, tailLen); +// siz[nextb] = nextLen; +// memcpy(blocks[nextb], src + srcPos, nextLen); //} // //void merge(int curb, int nextb) { From 1b5c9bdca61fe9b96b416529091a370209745122 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Jun 2025 18:29:40 +0800 Subject: [PATCH 0281/1170] modify code --- src/class172/Code06_TextEditor1.java | 8 ++++---- src/class172/Code06_TextEditor2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 4dbd87df8..7b19d30f0 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -52,7 +52,7 @@ public static void find(int pos) { pi = pos; } - public static void flush(int curb, int nextb, int nextLen, char[] src, int srcPos) { + public static void link(int curb, int nextb, int nextLen, char[] src, int srcPos) { nxt[nextb] = nxt[curb]; nxt[curb] = nextb; siz[nextb] = nextLen; @@ -71,7 +71,7 @@ public static void split(int curb, int pos) { return; } int nextb = assign(); - flush(curb, nextb, siz[curb] - pos, blocks[curb], pos); + link(curb, nextb, siz[curb] - pos, blocks[curb], pos); siz[curb] = pos; } @@ -91,13 +91,13 @@ public static void insert(int pos, int len) { int curb = bi, newb, done = 0; while (done + BLEN <= len) { newb = assign(); - flush(curb, newb, BLEN, str, done); + link(curb, newb, BLEN, str, done); done += BLEN; curb = newb; } if (len > done) { newb = assign(); - flush(curb, newb, len - done, str, done); + link(curb, newb, len - done, str, done); } maintain(); } diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index ef4649ecf..9c1a94023 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -48,7 +48,7 @@ // pi = pos; //} // -//void flush(int curb, int nextb, int nextLen, char* src, int srcPos) { +//void link(int curb, int nextb, int nextLen, char* src, int srcPos) { // nxt[nextb] = nxt[curb]; // nxt[curb] = nextb; // siz[nextb] = nextLen; @@ -65,7 +65,7 @@ //void split(int curb, int pos) { // if (curb == -1 || pos == siz[curb]) return; // int nextb = assign(); -// flush(curb, nextb, siz[curb] - pos, blocks[curb], pos); +// link(curb, nextb, siz[curb] - pos, blocks[curb], pos); // siz[curb] = pos; //} // @@ -85,13 +85,13 @@ // int curb = bi, newb, done = 0; // while (done + BLEN <= len) { // newb = assign(); -// flush(curb, newb, BLEN, str, done); +// link(curb, newb, BLEN, str, done); // done += BLEN; // curb = newb; // } // if (len > done) { // newb = assign(); -// flush(curb, newb, len - done, str, done); +// link(curb, newb, len - done, str, done); // } // maintain(); //} From 5e7a8660cbd4a5b3e3e4639dac6d10e3247d04ae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Jun 2025 18:33:29 +0800 Subject: [PATCH 0282/1170] modify code --- src/class152/Code03_TextEditor1.java | 1 + src/class152/Code03_TextEditor3.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class152/Code03_TextEditor1.java b/src/class152/Code03_TextEditor1.java index ee89c34f8..0b6930314 100644 --- a/src/class152/Code03_TextEditor1.java +++ b/src/class152/Code03_TextEditor1.java @@ -15,6 +15,7 @@ // 因为这道题只考虑C++能通过的空间标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code03_TextEditor2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 +// 讲解172,讲解块状链表时,本题又讲了一遍,可以通过所有测试用例,更有学习意义 import java.io.IOException; import java.io.InputStream; diff --git a/src/class152/Code03_TextEditor3.java b/src/class152/Code03_TextEditor3.java index 3bc940299..f141ffe99 100644 --- a/src/class152/Code03_TextEditor3.java +++ b/src/class152/Code03_TextEditor3.java @@ -12,6 +12,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 // 一个能通过的版本,连数组都自己写扩容逻辑,IO彻底重写,看看就好 +// 讲解172,讲解块状链表时,本题又讲了一遍,可以通过所有测试用例,更有学习意义 import java.util.Arrays; From 6d1574f8be19e3aaf9e55669aa56b9ba3278575d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Jun 2025 20:49:54 +0800 Subject: [PATCH 0283/1170] modify code --- src/class172/Code06_TextEditor1.java | 2 +- src/class172/Code06_TextEditor2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 7b19d30f0..724b65320 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -12,7 +12,7 @@ public class Code06_TextEditor1 { public static int MAXN = 3000001; - public static int BLEN = 4001; + public static int BLEN = 3001; public static int BNUM = (MAXN / BLEN) << 1; public static char[][] blocks = new char[BNUM][BLEN]; diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index 9c1a94023..ccaa291ee 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -10,7 +10,7 @@ //using namespace std; // //const int MAXN = 3000001; -//const int BLEN = 4001; +//const int BLEN = 3001; //const int BNUM = (MAXN / BLEN) << 1; // //char blocks[BNUM][BLEN]; From d76c36afd389667db2366f9f85a4261398b6e853 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 16 Jun 2025 11:48:21 +0800 Subject: [PATCH 0284/1170] modify code --- src/class172/Code01_GiveAway1.java | 6 +++--- src/class172/Code01_GiveAway2.java | 6 +++--- src/class172/Code02_Magic1.java | 8 ++++---- src/class172/Code02_Magic2.java | 10 +++++----- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/class172/Code01_GiveAway1.java b/src/class172/Code01_GiveAway1.java index fd43ed62f..be03ee2da 100644 --- a/src/class172/Code01_GiveAway1.java +++ b/src/class172/Code01_GiveAway1.java @@ -42,8 +42,8 @@ public static void build() { } } - public static int num(int l, int r, int v) { - int m, ans = 0; + public static int getCnt(int i, int v) { + int l = bl[i], r = br[i], m, ans = 0; while (l <= r) { m = (l + r) >> 1; if (sortv[m] >= v) { @@ -76,7 +76,7 @@ public static int query(int l, int r, int v) { } } for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { - ans += num(bl[i], br[i], v); + ans += getCnt(i, v); } } return ans; diff --git a/src/class172/Code01_GiveAway2.java b/src/class172/Code01_GiveAway2.java index 3176ecb73..bd5ac53f3 100644 --- a/src/class172/Code01_GiveAway2.java +++ b/src/class172/Code01_GiveAway2.java @@ -39,8 +39,8 @@ // } //} // -//int num(int l, int r, int v) { -// int m, ans = 0; +//int getCnt(int i, int v) { +// int l = bl[i], r = br[i], m, ans = 0; // while (l <= r) { // m = (l + r) >> 1; // if (sortv[m] >= v) { @@ -73,7 +73,7 @@ // } // } // for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { -// ans += num(bl[i], br[i], v); +// ans += getCnt(i, v); // } // } // return ans; diff --git a/src/class172/Code02_Magic1.java b/src/class172/Code02_Magic1.java index 371842c32..313badcd1 100644 --- a/src/class172/Code02_Magic1.java +++ b/src/class172/Code02_Magic1.java @@ -42,9 +42,9 @@ public static void build() { } } - public static int num(int l, int r, int v) { - v -= lazy[bi[l]]; - int m, ans = 0; + public static int getCnt(int i, int v) { + v -= lazy[i]; + int l = bl[i], r = br[i], m, ans = 0; while (l <= r) { m = (l + r) >> 1; if (sortv[m] >= v) { @@ -76,7 +76,7 @@ public static int query(int l, int r, int v) { ans += innerQuery(l, br[bi[l]], v); ans += innerQuery(bl[bi[r]], r, v); for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { - ans += num(bl[i], br[i], v); + ans += getCnt(i, v); } } return ans; diff --git a/src/class172/Code02_Magic2.java b/src/class172/Code02_Magic2.java index 6f424af96..9a4c109ce 100644 --- a/src/class172/Code02_Magic2.java +++ b/src/class172/Code02_Magic2.java @@ -39,9 +39,9 @@ // } //} // -//int num(int l, int r, int v) { -// v -= lazy[bi[l]]; -// int m, ans = 0; +//int getCnt(int i, int v) { +// v -= lazy[i]; +// int l = bl[i], r = br[i], m, ans = 0; // while (l <= r) { // m = (l + r) >> 1; // if (sortv[m] >= v) { @@ -72,8 +72,8 @@ // } else { // ans += innerQuery(l, br[bi[l]], v); // ans += innerQuery(bl[bi[r]], r, v); -// for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { -// ans += num(bl[b], br[b], v); +// for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { +// ans += getCnt(i, v); // } // } // return ans; From b595f6051e7c008fa83c50da0b02d0cbbdf56349 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 16 Jun 2025 13:42:07 +0800 Subject: [PATCH 0285/1170] modify code --- src/class152/Code03_TextEditor1.java | 2 +- src/class152/Code03_TextEditor3.java | 2 +- src/class172/Code01_GiveAway1.java | 6 ++++++ src/class172/Code01_GiveAway2.java | 6 ++++++ src/class172/Code02_Magic1.java | 12 +++++++++--- src/class172/Code02_Magic2.java | 12 +++++++++--- src/class172/Code03_Violet1.java | 6 ++++++ src/class172/Code03_Violet2.java | 8 +++++++- src/class172/Code04_ModeCnt1.java | 4 ++++ src/class172/Code04_ModeCnt2.java | 4 ++++ src/class172/Code05_Poem1.java | 4 ++++ src/class172/Code05_Poem2.java | 4 ++++ src/class172/Code06_TextEditor1.java | 8 ++++++++ src/class172/Code06_TextEditor2.java | 8 ++++++++ 14 files changed, 77 insertions(+), 9 deletions(-) diff --git a/src/class152/Code03_TextEditor1.java b/src/class152/Code03_TextEditor1.java index 0b6930314..66b98c531 100644 --- a/src/class152/Code03_TextEditor1.java +++ b/src/class152/Code03_TextEditor1.java @@ -15,7 +15,7 @@ // 因为这道题只考虑C++能通过的空间标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code03_TextEditor2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 -// 讲解172,讲解块状链表时,本题又讲了一遍,可以通过所有测试用例,更有学习意义 +// 讲解172,讲解块状链表时,本题又讲了一遍,分块的方法,可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; diff --git a/src/class152/Code03_TextEditor3.java b/src/class152/Code03_TextEditor3.java index f141ffe99..253f73287 100644 --- a/src/class152/Code03_TextEditor3.java +++ b/src/class152/Code03_TextEditor3.java @@ -12,7 +12,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 // 一个能通过的版本,连数组都自己写扩容逻辑,IO彻底重写,看看就好 -// 讲解172,讲解块状链表时,本题又讲了一遍,可以通过所有测试用例,更有学习意义 +// 讲解172,讲解块状链表时,本题又讲了一遍,分块的方法,可以通过所有测试用例,更有学习意义 import java.util.Arrays; diff --git a/src/class172/Code01_GiveAway1.java b/src/class172/Code01_GiveAway1.java index be03ee2da..b60c84881 100644 --- a/src/class172/Code01_GiveAway1.java +++ b/src/class172/Code01_GiveAway1.java @@ -1,6 +1,12 @@ package class172; // Give Away,java版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作是如下两种类型中的一种 +// 操作 0 a b c : 打印arr[a..b]范围上>=c的数字个数 +// 操作 1 a b : 把arr[a]的值改成b +// 1 <= n <= 5 * 10^5 +// 1 <= m <= 10^5 +// 1 <= 数组中的值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/SP18185 // 测试链接 : https://www.spoj.com/problems/GIVEAWAY // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code01_GiveAway2.java b/src/class172/Code01_GiveAway2.java index bd5ac53f3..2f2c19dd1 100644 --- a/src/class172/Code01_GiveAway2.java +++ b/src/class172/Code01_GiveAway2.java @@ -1,6 +1,12 @@ package class172; // Give Away,C++版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作是如下两种类型中的一种 +// 操作 0 a b c : 打印arr[a..b]范围上>=c的数字个数 +// 操作 1 a b : 把arr[a]的值改成b +// 1 <= n <= 5 * 10^5 +// 1 <= m <= 10^5 +// 1 <= 数组中的值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/SP18185 // 测试链接 : https://www.spoj.com/problems/GIVEAWAY // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class172/Code02_Magic1.java b/src/class172/Code02_Magic1.java index 313badcd1..f4751f781 100644 --- a/src/class172/Code02_Magic1.java +++ b/src/class172/Code02_Magic1.java @@ -1,6 +1,12 @@ package class172; // 教主的魔法,java版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作是如下两种类型中的一种 +// 操作 A l r v : 打印arr[l..r]范围上>=v的数字个数 +// 操作 M l r v : 把arr[l..r]范围上每个值都加上v +// 1 <= n <= 10^6 +// 1 <= m <= 3000 +// 1 <= 数组中的值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P2801 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,7 +20,7 @@ public class Code02_Magic1 { public static int MAXN = 1000001; public static int MAXB = 1001; - public static int n, q; + public static int n, m; public static int[] arr = new int[MAXN]; public static int[] sortv = new int[MAXN]; @@ -108,14 +114,14 @@ public static void main(String[] args) throws IOException { FastReader in = new FastReader(); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); - q = in.nextInt(); + m = in.nextInt(); for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } build(); char op; int l, r, v; - for (int i = 1; i <= q; i++) { + for (int i = 1; i <= m; i++) { op = in.nextChar(); l = in.nextInt(); r = in.nextInt(); diff --git a/src/class172/Code02_Magic2.java b/src/class172/Code02_Magic2.java index 9a4c109ce..3d61366d8 100644 --- a/src/class172/Code02_Magic2.java +++ b/src/class172/Code02_Magic2.java @@ -1,6 +1,12 @@ package class172; // 教主的魔法,C++版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作是如下两种类型中的一种 +// 操作 A l r v : 打印arr[l..r]范围上>=v的数字个数 +// 操作 M l r v : 把arr[l..r]范围上每个值都加上v +// 1 <= n <= 10^6 +// 1 <= m <= 3000 +// 1 <= 数组中的值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P2801 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -11,7 +17,7 @@ // //const int MAXN = 1000001; //const int MAXB = 1001; -//int n, q; +//int n, m; //int arr[MAXN]; //int sortv[MAXN]; // @@ -104,14 +110,14 @@ //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); -// cin >> n >> q; +// cin >> n >> m; // for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } // build(); // char op; // int l, r, v; -// for (int i = 0; i < q; i++) { +// for (int i = 1; i <= m; i++) { // cin >> op >> l >> r >> v; // if (op == 'A') { // cout << query(l, r, v) << '\n'; diff --git a/src/class172/Code03_Violet1.java b/src/class172/Code03_Violet1.java index 84cc7f213..359684a99 100644 --- a/src/class172/Code03_Violet1.java +++ b/src/class172/Code03_Violet1.java @@ -1,6 +1,12 @@ package class172; // 蒲公英,java版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 操作 l r : 打印arr[l..r]范围上的众数,如果有多个众数,打印值最小的 +// 1 <= n <= 4 * 10^4 +// 1 <= m <= 5 * 10^4 +// 1 <= 数组中的值 <= 10^9 +// 题目要求强制在线,强制在线的方式,可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4168 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code03_Violet2.java b/src/class172/Code03_Violet2.java index a9e054d1c..68d1cdcdf 100644 --- a/src/class172/Code03_Violet2.java +++ b/src/class172/Code03_Violet2.java @@ -1,6 +1,12 @@ package class172; // 蒲公英,C++版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 操作 l r : 打印arr[l..r]范围上的众数,如果有多个众数,打印值最小的 +// 1 <= n <= 4 * 10^4 +// 1 <= m <= 5 * 10^4 +// 1 <= 数组中的值 <= 10^9 +// 题目要求强制在线,强制在线的方式,可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4168 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -146,7 +152,7 @@ // } // prepare(); // int lastAns = 0, a, b, l, r; -// for (int i = 0; i < m; i++) { +// for (int i = 1; i <= m; i++) { // cin >> a >> b; // a = (a + lastAns - 1) % n + 1; // b = (b + lastAns - 1) % n + 1; diff --git a/src/class172/Code04_ModeCnt1.java b/src/class172/Code04_ModeCnt1.java index c59890259..a429f02b6 100644 --- a/src/class172/Code04_ModeCnt1.java +++ b/src/class172/Code04_ModeCnt1.java @@ -1,6 +1,10 @@ package class172; // 空间少求众数的次数,java版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 操作 l r : 打印arr[l..r]范围上,众数到底出现了几次 +// 1 <= 所有数值 <= 5 * 10^5 +// 内存空间只有64MB,题目要求强制在线,强制在线的方式,可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P5048 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是内存占用过大,无法通过测试用例 diff --git a/src/class172/Code04_ModeCnt2.java b/src/class172/Code04_ModeCnt2.java index 9805408f8..455dc6759 100644 --- a/src/class172/Code04_ModeCnt2.java +++ b/src/class172/Code04_ModeCnt2.java @@ -1,6 +1,10 @@ package class172; // 空间少求众数的次数,C++版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 操作 l r : 打印arr[l..r]范围上,众数到底出现了几次 +// 1 <= 所有数值 <= 5 * 10^5 +// 内存空间只有64MB,题目要求强制在线,强制在线的方式,可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P5048 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java index 8c12af1fc..c4e6116f0 100644 --- a/src/class172/Code05_Poem1.java +++ b/src/class172/Code05_Poem1.java @@ -1,6 +1,10 @@ package class172; // 作诗,java版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 操作 l r : 打印arr[l..r]范围上,有多少个数出现正偶数次 +// 1 <= 所有数值 <= 10^5 +// 题目要求强制在线,强制在线的方式,可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4135 // 提交交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java index c7bccb28b..3e4fd0948 100644 --- a/src/class172/Code05_Poem2.java +++ b/src/class172/Code05_Poem2.java @@ -1,6 +1,10 @@ package class172; // 作诗,C++版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 操作 l r : 打印arr[l..r]范围上,有多少个数出现正偶数次 +// 1 <= 所有数值 <= 10^5 +// 题目要求强制在线,强制在线的方式,可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4135 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 724b65320..1c0de7246 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -1,6 +1,14 @@ package class172; // 文本编辑器,块状链表实现,java版 +// 一开始文本为空,光标在文本开头,也就是1位置,请实现如下6种操作 +// Move k : 将光标移动到第k个字符之后,操作保证光标不会到非法位置 +// Insert n s : 在光标处插入长度为n的字符串s,光标位置不变 +// Delete n : 删除光标后的n个字符,光标位置不变,操作保证有足够字符 +// Get n : 输出光标后的n个字符,光标位置不变,操作保证有足够字符 +// Prev : 光标前移一个字符,操作保证光标不会到非法位置 +// Next : 光标后移一个字符,操作保证光标不会到非法位置 +// Insert操作时,字符串s中ASCII码在[32,126]范围上的字符一定有n个,其他字符请过滤掉 // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index ccaa291ee..e622bd50d 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -1,6 +1,14 @@ package class172; // 文本编辑器,块状链表实现,C++版 +// 一开始文本为空,光标在文本开头,也就是1位置,请实现如下6种操作 +// Move k : 将光标移动到第k个字符之后,操作保证光标不会到非法位置 +// Insert n s : 在光标处插入长度为n的字符串s,光标位置不变 +// Delete n : 删除光标后的n个字符,光标位置不变,操作保证有足够字符 +// Get n : 输出光标后的n个字符,光标位置不变,操作保证有足够字符 +// Prev : 光标前移一个字符,操作保证光标不会到非法位置 +// Next : 光标后移一个字符,操作保证光标不会到非法位置 +// Insert操作时,字符串s中ASCII码在[32,126]范围上的字符一定有n个,其他字符请过滤掉 // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 5cdc8f9c3bb4b40d71810571a6a706f9d11647d5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 16 Jun 2025 14:58:08 +0800 Subject: [PATCH 0286/1170] modify code --- src/class172/Code03_Violet1.java | 2 +- src/class172/Code03_Violet2.java | 2 +- src/class172/Code04_ModeCnt1.java | 2 +- src/class172/Code04_ModeCnt2.java | 2 +- src/class172/Code05_Poem1.java | 2 +- src/class172/Code05_Poem2.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class172/Code03_Violet1.java b/src/class172/Code03_Violet1.java index 359684a99..fea0f50f3 100644 --- a/src/class172/Code03_Violet1.java +++ b/src/class172/Code03_Violet1.java @@ -6,7 +6,7 @@ // 1 <= n <= 4 * 10^4 // 1 <= m <= 5 * 10^4 // 1 <= 数组中的值 <= 10^9 -// 题目要求强制在线,强制在线的方式,可以打开测试链接查看 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4168 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code03_Violet2.java b/src/class172/Code03_Violet2.java index 68d1cdcdf..f3bb0b42a 100644 --- a/src/class172/Code03_Violet2.java +++ b/src/class172/Code03_Violet2.java @@ -6,7 +6,7 @@ // 1 <= n <= 4 * 10^4 // 1 <= m <= 5 * 10^4 // 1 <= 数组中的值 <= 10^9 -// 题目要求强制在线,强制在线的方式,可以打开测试链接查看 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4168 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class172/Code04_ModeCnt1.java b/src/class172/Code04_ModeCnt1.java index a429f02b6..a1bd1e875 100644 --- a/src/class172/Code04_ModeCnt1.java +++ b/src/class172/Code04_ModeCnt1.java @@ -4,7 +4,7 @@ // 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 // 操作 l r : 打印arr[l..r]范围上,众数到底出现了几次 // 1 <= 所有数值 <= 5 * 10^5 -// 内存空间只有64MB,题目要求强制在线,强制在线的方式,可以打开测试链接查看 +// 内存空间只有64MB,题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P5048 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是内存占用过大,无法通过测试用例 diff --git a/src/class172/Code04_ModeCnt2.java b/src/class172/Code04_ModeCnt2.java index 455dc6759..79bdb24da 100644 --- a/src/class172/Code04_ModeCnt2.java +++ b/src/class172/Code04_ModeCnt2.java @@ -4,7 +4,7 @@ // 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 // 操作 l r : 打印arr[l..r]范围上,众数到底出现了几次 // 1 <= 所有数值 <= 5 * 10^5 -// 内存空间只有64MB,题目要求强制在线,强制在线的方式,可以打开测试链接查看 +// 内存空间只有64MB,题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P5048 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java index c4e6116f0..04e37aaeb 100644 --- a/src/class172/Code05_Poem1.java +++ b/src/class172/Code05_Poem1.java @@ -4,7 +4,7 @@ // 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 // 操作 l r : 打印arr[l..r]范围上,有多少个数出现正偶数次 // 1 <= 所有数值 <= 10^5 -// 题目要求强制在线,强制在线的方式,可以打开测试链接查看 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4135 // 提交交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java index 3e4fd0948..d81faeb5b 100644 --- a/src/class172/Code05_Poem2.java +++ b/src/class172/Code05_Poem2.java @@ -4,7 +4,7 @@ // 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 // 操作 l r : 打印arr[l..r]范围上,有多少个数出现正偶数次 // 1 <= 所有数值 <= 10^5 -// 题目要求强制在线,强制在线的方式,可以打开测试链接查看 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4135 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From b29e3f2653dca397ea5c6cf0d449df09469e8001 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 16 Jun 2025 17:09:15 +0800 Subject: [PATCH 0287/1170] modify code --- src/class172/Code02_Magic1.java | 1 + src/class172/Code02_Magic2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class172/Code02_Magic1.java b/src/class172/Code02_Magic1.java index f4751f781..11ba3e514 100644 --- a/src/class172/Code02_Magic1.java +++ b/src/class172/Code02_Magic1.java @@ -28,6 +28,7 @@ public class Code02_Magic1 { public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; + public static int[] lazy = new int[MAXB]; public static void build() { diff --git a/src/class172/Code02_Magic2.java b/src/class172/Code02_Magic2.java index 3d61366d8..8105fa6ad 100644 --- a/src/class172/Code02_Magic2.java +++ b/src/class172/Code02_Magic2.java @@ -25,6 +25,7 @@ //int bi[MAXN]; //int bl[MAXB]; //int br[MAXB]; +// //int lazy[MAXB]; // //void build() { From 609932daad52d3ece0071a419997ad3c5404c865 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 16 Jun 2025 21:42:54 +0800 Subject: [PATCH 0288/1170] modify code --- src/class172/Code03_Violet1.java | 14 +++++++++----- src/class172/Code03_Violet2.java | 8 +++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/class172/Code03_Violet1.java b/src/class172/Code03_Violet1.java index fea0f50f3..4ac62d389 100644 --- a/src/class172/Code03_Violet1.java +++ b/src/class172/Code03_Violet1.java @@ -22,6 +22,8 @@ public class Code03_Violet1 { public static int MAXB = 201; public static int n, m, s; public static int[] arr = new int[MAXN]; + + // 数字做离散化 public static int[] sortv = new int[MAXN]; public static int blen, bnum; @@ -31,9 +33,9 @@ public class Code03_Violet1 { // freq[i][j]表示前i块中j出现的次数 public static int[][] freq = new int[MAXB][MAXN]; - // mode[i][j]表示从i块到j块中的众数 + // mode[i][j]表示从i块到j块中的众数(最小) public static int[][] mode = new int[MAXB][MAXB]; - // 数字词频统计 + // 数字的词频统计 public static int[] numCnt = new int[MAXN]; public static int lower(int num) { @@ -92,12 +94,13 @@ public static void prepare() { for (int i = 1; i <= bnum; i++) { for (int j = i; j <= bnum; j++) { int most = mode[i][j - 1]; + int mostCnt = getCnt(i, j, most); for (int k = bl[j]; k <= br[j]; k++) { int cur = arr[k]; int curCnt = getCnt(i, j, cur); - int mostCnt = getCnt(i, j, most); if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { most = cur; + mostCnt = curCnt; } } mode[i][j] = most; @@ -127,20 +130,21 @@ public static int query(int l, int r) { numCnt[arr[i]]++; } most = mode[bi[l] + 1][bi[r] - 1]; + int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; for (int i = l; i <= br[bi[l]]; i++) { int cur = arr[i]; int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + numCnt[cur]; - int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { most = cur; + mostCnt = curCnt; } } for (int i = bl[bi[r]]; i <= r; i++) { int cur = arr[i]; int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + numCnt[cur]; - int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { most = cur; + mostCnt = curCnt; } } for (int i = l; i <= br[bi[l]]; i++) { diff --git a/src/class172/Code03_Violet2.java b/src/class172/Code03_Violet2.java index f3bb0b42a..26b5d4d92 100644 --- a/src/class172/Code03_Violet2.java +++ b/src/class172/Code03_Violet2.java @@ -82,12 +82,13 @@ // for (int i = 1; i <= bnum; i++) { // for (int j = i; j <= bnum; j++) { // int most = mode[i][j - 1]; +// int mostCnt = getCnt(i, j, most); // for (int k = bl[j]; k <= br[j]; k++) { // int cur = arr[k]; // int curCnt = getCnt(i, j, cur); -// int mostCnt = getCnt(i, j, most); // if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { // most = cur; +// mostCnt = curCnt; // } // } // mode[i][j] = most; @@ -117,20 +118,21 @@ // numCnt[arr[i]]++; // } // most = mode[bi[l] + 1][bi[r] - 1]; +// int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; // for (int i = l; i <= br[bi[l]]; i++) { // int cur = arr[i]; // int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + numCnt[cur]; -// int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; // if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { // most = cur; +// mostCnt = curCnt; // } // } // for (int i = bl[bi[r]]; i <= r; i++) { // int cur = arr[i]; // int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + numCnt[cur]; -// int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + numCnt[most]; // if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { // most = cur; +// mostCnt = curCnt; // } // } // for (int i = l; i <= br[bi[l]]; i++) { From 665a3ff1ec1b136d885994b5419df2c9f9b93d2d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 16 Jun 2025 21:47:33 +0800 Subject: [PATCH 0289/1170] modify code --- src/class172/Code04_ModeCnt1.java | 23 +++++++++++------------ src/class172/Code04_ModeCnt2.java | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/class172/Code04_ModeCnt1.java b/src/class172/Code04_ModeCnt1.java index a1bd1e875..f3557fa69 100644 --- a/src/class172/Code04_ModeCnt1.java +++ b/src/class172/Code04_ModeCnt1.java @@ -31,10 +31,9 @@ public class Code04_ModeCnt1 { public static int[] br = new int[MAXB]; // 值、下标 - public static int[][] bucket = new int[MAXN][2]; - // bucketIdx[i] = j,代表数组的i位置元素在bucket中的j位置 - public static int[] bucketIdx = new int[MAXN]; - + public static int[][] sortList = new int[MAXN][2]; + // listIdx[i] = j,代表数组的i位置元素在sortList中的j位置 + public static int[] listIdx = new int[MAXN]; // modeCnt[i][j]表示从i块到j块中众数的出现次数 public static int[][] modeCnt = new int[MAXB][MAXB]; // 数字词频统计 @@ -51,12 +50,12 @@ public static void prepare() { br[i] = Math.min(i * blen, n); } for (int i = 1; i <= n; i++) { - bucket[i][0] = arr[i]; - bucket[i][1] = i; + sortList[i][0] = arr[i]; + sortList[i][1] = i; } - Arrays.sort(bucket, 1, n + 1, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]); + Arrays.sort(sortList, 1, n + 1, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]); for (int i = 1; i <= n; i++) { - bucketIdx[bucket[i][1]] = i; + listIdx[sortList[i][1]] = i; } for (int i = 1; i <= bnum; i++) { for (int j = i; j <= bnum; j++) { @@ -84,14 +83,14 @@ public static int query(int l, int r) { } else { ans = modeCnt[bi[l] + 1][bi[r] - 1]; for (int i = l, idx; i <= br[bi[l]]; i++) { - idx = bucketIdx[i]; - while (idx + ans <= n && bucket[idx + ans][0] == arr[i] && bucket[idx + ans][1] <= r) { + idx = listIdx[i]; + while (idx + ans <= n && sortList[idx + ans][0] == arr[i] && sortList[idx + ans][1] <= r) { ans++; } } for (int i = bl[bi[r]], idx; i <= r; i++) { - idx = bucketIdx[i]; - while (idx - ans >= 1 && bucket[idx - ans][0] == arr[i] && bucket[idx - ans][1] >= l) { + idx = listIdx[i]; + while (idx - ans >= 1 && sortList[idx - ans][0] == arr[i] && sortList[idx - ans][1] >= l) { ans++; } } diff --git a/src/class172/Code04_ModeCnt2.java b/src/class172/Code04_ModeCnt2.java index 79bdb24da..097990812 100644 --- a/src/class172/Code04_ModeCnt2.java +++ b/src/class172/Code04_ModeCnt2.java @@ -34,8 +34,8 @@ //int bl[MAXB]; //int br[MAXB]; // -//Node bucket[MAXN]; -//int bucketIdx[MAXN]; +//Node sortList[MAXN]; +//int listIdx[MAXN]; // //int modeCnt[MAXB][MAXB]; //int numCnt[MAXN]; @@ -51,12 +51,12 @@ // br[i] = min(i * blen, n); // } // for (int i = 1; i <= n; i++) { -// bucket[i].v = arr[i]; -// bucket[i].i = i; +// sortList[i].v = arr[i]; +// sortList[i].i = i; // } -// sort(bucket + 1, bucket + n + 1, NodeCmp); +// sort(sortList + 1, sortList + n + 1, NodeCmp); // for (int i = 1; i <= n; i++) { -// bucketIdx[bucket[i].i] = i; +// listIdx[sortList[i].i] = i; // } // for (int i = 1; i <= bnum; i++) { // for (int j = i; j <= bnum; j++) { @@ -84,14 +84,14 @@ // } else { // ans = modeCnt[bi[l] + 1][bi[r] - 1]; // for (int i = l, idx; i <= br[bi[l]]; i++) { -// idx = bucketIdx[i]; -// while (idx + ans <= n && bucket[idx + ans].v == arr[i] && bucket[idx + ans].i <= r) { +// idx = listIdx[i]; +// while (idx + ans <= n && sortList[idx + ans].v == arr[i] && sortList[idx + ans].i <= r) { // ans++; // } // } // for (int i = bl[bi[r]], idx; i <= r; i++) { -// idx = bucketIdx[i]; -// while (idx - ans >= 1 && bucket[idx - ans].v == arr[i] && bucket[idx - ans].i >= l) { +// idx = listIdx[i]; +// while (idx - ans >= 1 && sortList[idx - ans].v == arr[i] && sortList[idx - ans].i >= l) { // ans++; // } // } From 10520dc229c41426f9e4c42d4690a4194e14d33a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 16 Jun 2025 21:54:47 +0800 Subject: [PATCH 0290/1170] modify code --- src/class172/Code04_ModeCnt1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class172/Code04_ModeCnt1.java b/src/class172/Code04_ModeCnt1.java index f3557fa69..75b50a94a 100644 --- a/src/class172/Code04_ModeCnt1.java +++ b/src/class172/Code04_ModeCnt1.java @@ -30,9 +30,9 @@ public class Code04_ModeCnt1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - // 值、下标 + // (值、下标),用来收集同一种数的下标列表 public static int[][] sortList = new int[MAXN][2]; - // listIdx[i] = j,代表数组的i位置元素在sortList中的j位置 + // listIdx[i] = j,表示arr[i]这个元素在sortList里的j位置 public static int[] listIdx = new int[MAXN]; // modeCnt[i][j]表示从i块到j块中众数的出现次数 public static int[][] modeCnt = new int[MAXB][MAXB]; From 3824c1f08c54c16998e3b22689864f7ff06bee8b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 11:13:49 +0800 Subject: [PATCH 0291/1170] modify code --- src/class172/Code05_Poem1.java | 10 ++++++++-- src/class172/Code05_Poem2.java | 8 +++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java index 04e37aaeb..a2a59e7d8 100644 --- a/src/class172/Code05_Poem1.java +++ b/src/class172/Code05_Poem1.java @@ -37,9 +37,15 @@ public static int getCnt(int l, int r, int v) { return freq[r][v] - freq[l - 1][v]; } - // 加1之前的词频是pre,返回加1之后,正偶数次的数的个数变化量 + // 加1之前的词频是pre,如果词频+1,返回 出现正偶数次的数的个数 变化量 public static int delta(int pre) { - return pre != 0 ? ((pre & 1) == 0 ? -1 : 1) : 0; + if (pre == 0) { + return 0; + } + if ((pre & 1) == 0) { + return -1; + } + return 1; } public static void prepare() { diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java index d81faeb5b..334432be0 100644 --- a/src/class172/Code05_Poem2.java +++ b/src/class172/Code05_Poem2.java @@ -32,7 +32,13 @@ //} // //int delta(int pre) { -// return pre ? ((pre & 1) ? 1 : -1) : 0; +// if (pre == 0) { +// return 0; +// } +// if ((pre & 1) == 0) { +// return -1; +// } +// return 1; //} // //void prepare() { From 9cb769112282ec70600112ad6dfa33b97f49e94d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 11:18:19 +0800 Subject: [PATCH 0292/1170] modify code --- src/class172/Code05_Poem1.java | 6 +++--- src/class172/Code05_Poem2.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java index a2a59e7d8..3386e48dd 100644 --- a/src/class172/Code05_Poem1.java +++ b/src/class172/Code05_Poem1.java @@ -2,7 +2,7 @@ // 作诗,java版 // 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 -// 操作 l r : 打印arr[l..r]范围上,有多少个数出现正偶数次 +// 操作 l r : 打印arr[l..r]范围上,有多少数的出现次数是正偶数 // 1 <= 所有数值 <= 10^5 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4135 @@ -27,7 +27,7 @@ public class Code05_Poem1 { // freq[i][j]表示前i块中j出现的次数 public static int[][] freq = new int[MAXB][MAXN]; - // even[i][j]表示从第i块到第j块出现正偶数次的数有几个 + // even[i][j]表示从第i块到第j块,有多少数的出现次数是正偶数 public static int[][] even = new int[MAXB][MAXB]; // 数字词频统计 public static int[] numCnt = new int[MAXN]; @@ -37,7 +37,7 @@ public static int getCnt(int l, int r, int v) { return freq[r][v] - freq[l - 1][v]; } - // 加1之前的词频是pre,如果词频+1,返回 出现正偶数次的数的个数 变化量 + // 加1之前的词频是pre,如果词频+1,返回 出现正偶数次的数字个数 的变化量 public static int delta(int pre) { if (pre == 0) { return 0; diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java index 334432be0..0ca905a6b 100644 --- a/src/class172/Code05_Poem2.java +++ b/src/class172/Code05_Poem2.java @@ -2,7 +2,7 @@ // 作诗,C++版 // 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 -// 操作 l r : 打印arr[l..r]范围上,有多少个数出现正偶数次 +// 操作 l r : 打印arr[l..r]范围上,有多少数的出现次数是正偶数 // 1 <= 所有数值 <= 10^5 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4135 From 48bcdbc76e6284bf5800c38136acaa5e3a1d99e5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 11:23:56 +0800 Subject: [PATCH 0293/1170] modify code --- src/class172/Code05_Poem1.java | 14 +++++++------- src/class172/Code05_Poem2.java | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java index 3386e48dd..f9b575a58 100644 --- a/src/class172/Code05_Poem1.java +++ b/src/class172/Code05_Poem1.java @@ -2,7 +2,7 @@ // 作诗,java版 // 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 -// 操作 l r : 打印arr[l..r]范围上,有多少数的出现次数是正偶数 +// 操作 l r : 打印arr[l..r]范围上,有多少个数出现正偶数次 // 1 <= 所有数值 <= 10^5 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4135 @@ -27,22 +27,22 @@ public class Code05_Poem1 { // freq[i][j]表示前i块中j出现的次数 public static int[][] freq = new int[MAXB][MAXN]; - // even[i][j]表示从第i块到第j块,有多少数的出现次数是正偶数 + // even[i][j]表示从第i块到第j块,有多少个数出现正偶数次 public static int[][] even = new int[MAXB][MAXB]; // 数字词频统计 public static int[] numCnt = new int[MAXN]; - // 返回从l块到r块中,数字v的次数 + // 返回从l块到r块,数字v的次数 public static int getCnt(int l, int r, int v) { return freq[r][v] - freq[l - 1][v]; } - // 加1之前的词频是pre,如果词频+1,返回 出现正偶数次的数字个数 的变化量 - public static int delta(int pre) { - if (pre == 0) { + // 之前某种数的词频是preCnt,如果词频加1,返回 出现正偶数次的数字个数 的变化量 + public static int delta(int preCnt) { + if (preCnt == 0) { return 0; } - if ((pre & 1) == 0) { + if ((preCnt & 1) == 0) { return -1; } return 1; diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java index 0ca905a6b..70ba3fa0b 100644 --- a/src/class172/Code05_Poem2.java +++ b/src/class172/Code05_Poem2.java @@ -2,7 +2,7 @@ // 作诗,C++版 // 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 -// 操作 l r : 打印arr[l..r]范围上,有多少数的出现次数是正偶数 +// 操作 l r : 打印arr[l..r]范围上,有多少个数出现正偶数次 // 1 <= 所有数值 <= 10^5 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4135 @@ -31,11 +31,11 @@ // return freq[r][v] - freq[l - 1][v]; //} // -//int delta(int pre) { -// if (pre == 0) { +//int delta(int preCnt) { +// if (preCnt == 0) { // return 0; // } -// if ((pre & 1) == 0) { +// if ((preCnt & 1) == 0) { // return -1; // } // return 1; From 768797cfc632ab7cf3160cca4b465ff3b1348f26 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 11:25:25 +0800 Subject: [PATCH 0294/1170] modify code --- src/class172/Code05_Poem1.java | 8 ++++---- src/class172/Code05_Poem2.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java index f9b575a58..d71daf428 100644 --- a/src/class172/Code05_Poem1.java +++ b/src/class172/Code05_Poem1.java @@ -37,12 +37,12 @@ public static int getCnt(int l, int r, int v) { return freq[r][v] - freq[l - 1][v]; } - // 之前某种数的词频是preCnt,如果词频加1,返回 出现正偶数次的数字个数 的变化量 - public static int delta(int preCnt) { - if (preCnt == 0) { + // 某种数的当前词频是curCnt,如果词频加1,返回 出现正偶数次的数字个数 的变化量 + public static int delta(int curCnt) { + if (curCnt == 0) { return 0; } - if ((preCnt & 1) == 0) { + if ((curCnt & 1) == 0) { return -1; } return 1; diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java index 70ba3fa0b..f8dcd1c58 100644 --- a/src/class172/Code05_Poem2.java +++ b/src/class172/Code05_Poem2.java @@ -31,11 +31,11 @@ // return freq[r][v] - freq[l - 1][v]; //} // -//int delta(int preCnt) { -// if (preCnt == 0) { +//int delta(int curCnt) { +// if (curCnt == 0) { // return 0; // } -// if ((preCnt & 1) == 0) { +// if ((curCnt & 1) == 0) { // return -1; // } // return 1; From a7cc366daf15df49618cc8d236d06ea7b45b5dbc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 11:26:29 +0800 Subject: [PATCH 0295/1170] modify code --- src/class172/Code05_Poem1.java | 8 ++++---- src/class172/Code05_Poem2.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java index d71daf428..c0b6038e5 100644 --- a/src/class172/Code05_Poem1.java +++ b/src/class172/Code05_Poem1.java @@ -37,12 +37,12 @@ public static int getCnt(int l, int r, int v) { return freq[r][v] - freq[l - 1][v]; } - // 某种数的当前词频是curCnt,如果词频加1,返回 出现正偶数次的数字个数 的变化量 - public static int delta(int curCnt) { - if (curCnt == 0) { + // 某种数的当前词频是cnt,如果词频加1,返回 出现正偶数次的数字个数 的变化量 + public static int delta(int cnt) { + if (cnt == 0) { return 0; } - if ((curCnt & 1) == 0) { + if ((cnt & 1) == 0) { return -1; } return 1; diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java index f8dcd1c58..e265e63c3 100644 --- a/src/class172/Code05_Poem2.java +++ b/src/class172/Code05_Poem2.java @@ -31,11 +31,11 @@ // return freq[r][v] - freq[l - 1][v]; //} // -//int delta(int curCnt) { -// if (curCnt == 0) { +//int delta(int cnt) { +// if (cnt == 0) { // return 0; // } -// if ((curCnt & 1) == 0) { +// if ((cnt & 1) == 0) { // return -1; // } // return 1; From cfc64403854b0c821a9debb2bd7a72c0e37c7537 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 12:07:26 +0800 Subject: [PATCH 0296/1170] modify code --- src/class172/Code05_Poem1.java | 9 +++++---- src/class172/Code05_Poem2.java | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/class172/Code05_Poem1.java b/src/class172/Code05_Poem1.java index c0b6038e5..0e7a9bef5 100644 --- a/src/class172/Code05_Poem1.java +++ b/src/class172/Code05_Poem1.java @@ -37,12 +37,13 @@ public static int getCnt(int l, int r, int v) { return freq[r][v] - freq[l - 1][v]; } - // 某种数的当前词频是cnt,如果词频加1,返回 出现正偶数次的数字个数 的变化量 - public static int delta(int cnt) { - if (cnt == 0) { + // 某种数的之前词频是pre,现在如果词频加1 + // 返回 出现正偶数次的数字个数 的变化量 + public static int delta(int pre) { + if (pre == 0) { return 0; } - if ((cnt & 1) == 0) { + if ((pre & 1) == 0) { return -1; } return 1; diff --git a/src/class172/Code05_Poem2.java b/src/class172/Code05_Poem2.java index e265e63c3..334432be0 100644 --- a/src/class172/Code05_Poem2.java +++ b/src/class172/Code05_Poem2.java @@ -31,11 +31,11 @@ // return freq[r][v] - freq[l - 1][v]; //} // -//int delta(int cnt) { -// if (cnt == 0) { +//int delta(int pre) { +// if (pre == 0) { // return 0; // } -// if ((cnt & 1) == 0) { +// if ((pre & 1) == 0) { // return -1; // } // return 1; From 24a44b1f63e984fe45113950be65e7b049def2e3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 13:18:51 +0800 Subject: [PATCH 0297/1170] modify code --- src/class172/Code06_TextEditor1.java | 65 +++++++++++++++++++--------- src/class172/Code06_TextEditor2.java | 40 +++++++++-------- 2 files changed, 65 insertions(+), 40 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 1c0de7246..833aec5d9 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -20,34 +20,49 @@ public class Code06_TextEditor1 { public static int MAXN = 3000001; + // 每块的最大容量,近似等于 2 * 根号n public static int BLEN = 3001; + // 块的最大数量 public static int BNUM = (MAXN / BLEN) << 1; - + // 所有空间 public static char[][] blocks = new char[BNUM][BLEN]; + // nxt[i]表示编号为i的块,下一块的编号 public static int[] nxt = new int[BNUM]; + // siz[i]表示编号为i的块,写入了多少长度的内容 public static int[] siz = new int[BNUM]; + // 编号分配池,其实是一个栈,分配编号从栈顶弹出,回收编号从栈顶压入 public static int[] pool = new int[BNUM]; - public static int psiz = 0; + // 分配池的栈顶 + public static int top = 0; + // 插入字符串时,先读入进str,然后写入到块 + // 获取字符串时,先从块里取出内容保留在str,然后打印str public static char[] str = new char[MAXN]; + // 准备好分配池,从栈顶到栈底,依次是1、2、... BNUM - 1 + // 准备好头块的配置 public static void prepare() { - for (int i = 1; i < BNUM; i++) { - pool[i] = i; + for (int i = 1, id = BNUM - 1; i < BNUM; i++, id--) { + pool[i] = id; } - psiz = BNUM - 1; + top = BNUM - 1; siz[0] = 0; nxt[0] = -1; } + // 分配编号 public static int assign() { - return pool[psiz--]; + return pool[top--]; } - public static void recycle(int i) { - pool[++psiz] = i; + // 回收编号 + public static void recycle(int id) { + pool[++top] = id; } + // 寻找整个文章中的pos位置 + // 找到所在块的编号 和 块内位置 + // 块编号设置给bi,块内位置设置给pi public static int bi, pi; public static void find(int pos) { @@ -60,13 +75,16 @@ public static void find(int pos) { pi = pos; } - public static void link(int curb, int nextb, int nextLen, char[] src, int srcPos) { + // 链表中让curb块和nextb块,连在一起,然后让nextb块从0位置开始,写入如下的内容 + // 从src[pos]开始,拿取长度为len的字符串 + public static void linkAndWrite(int curb, int nextb, char[] src, int pos, int len) { nxt[nextb] = nxt[curb]; nxt[curb] = nextb; - siz[nextb] = nextLen; - System.arraycopy(src, srcPos, blocks[nextb], 0, nextLen); + System.arraycopy(src, pos, blocks[nextb], 0, len); + siz[nextb] = len; } + // curb块里,在内容的后面,追加nextb块的内容,然后nextb块从链表中删掉 public static void merge(int curb, int nextb) { System.arraycopy(blocks[nextb], 0, blocks[curb], siz[curb], siz[nextb]); siz[curb] += siz[nextb]; @@ -74,15 +92,17 @@ public static void merge(int curb, int nextb) { recycle(nextb); } + // curb块的pos位置往后的内容,写入到新分裂出的块里 public static void split(int curb, int pos) { if (curb == -1 || pos == siz[curb]) { return; } int nextb = assign(); - link(curb, nextb, siz[curb] - pos, blocks[curb], pos); + linkAndWrite(curb, nextb, blocks[curb], pos, siz[curb] - pos); siz[curb] = pos; } + // 从头到尾遍历所有的块,任意相邻两块的大小累加和 <= BLEN,合并这两块 public static void maintain() { for (int curb = 0, nextb; curb != -1; curb = nxt[curb]) { nextb = nxt[curb]; @@ -93,23 +113,25 @@ public static void maintain() { } } + // 插入的字符串在str中,长度为len,从整个文章的pos位置插入 public static void insert(int pos, int len) { find(pos); split(bi, pi); int curb = bi, newb, done = 0; while (done + BLEN <= len) { newb = assign(); - link(curb, newb, BLEN, str, done); + linkAndWrite(curb, newb, str, done, BLEN); done += BLEN; curb = newb; } if (len > done) { newb = assign(); - link(curb, newb, len - done, str, done); + linkAndWrite(curb, newb, str, done, len - done); } maintain(); } + // 从整个文章的pos位置,往后len的长度,这些内容删掉 public static void erase(int pos, int len) { find(pos); split(bi, pi); @@ -129,20 +151,21 @@ public static void erase(int pos, int len) { maintain(); } + // 从整个文章的pos位置,往后len的长度,这些内容找到,写入进str public static void get(int pos, int len) { find(pos); int curb = bi; pos = pi; - int got = (len < siz[curb] - pos) ? len : (siz[curb] - pos); - System.arraycopy(blocks[curb], pos, str, 0, got); + int done = (len < siz[curb] - pos) ? len : (siz[curb] - pos); + System.arraycopy(blocks[curb], pos, str, 0, done); curb = nxt[curb]; - while (curb != -1 && got + siz[curb] <= len) { - System.arraycopy(blocks[curb], 0, str, got, siz[curb]); - got += siz[curb]; + while (curb != -1 && done + siz[curb] <= len) { + System.arraycopy(blocks[curb], 0, str, done, siz[curb]); + done += siz[curb]; curb = nxt[curb]; } - if (curb != -1 && got < len) { - System.arraycopy(blocks[curb], 0, str, got, len - got); + if (curb != -1 && done < len) { + System.arraycopy(blocks[curb], 0, str, done, len - done); } } diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index e622bd50d..3bb7898a8 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -25,23 +25,25 @@ //int nxt[BNUM]; //int siz[BNUM]; //int pool[BNUM]; -//int psiz = 0; +//int top = 0; // //char str[MAXN]; // //void prepare() { -// for (int i = 1; i < BNUM; i++) pool[i] = i; -// psiz = BNUM - 1; +// for (int i = 1, id = BNUM - 1; i < BNUM; i++, id--) { +// pool[i] = id; +// } +// top = BNUM - 1; // siz[0] = 0; // nxt[0] = -1; //} // //int assign() { -// return pool[psiz--]; +// return pool[top--]; //} // -//void recycle(int i) { -// pool[++psiz] = i; +//void recycle(int id) { +// pool[++top] = id; //} // //int bi, pi; @@ -56,11 +58,11 @@ // pi = pos; //} // -//void link(int curb, int nextb, int nextLen, char* src, int srcPos) { +//void linkAndWrite(int curb, int nextb, char* src, int pos, int len) { // nxt[nextb] = nxt[curb]; // nxt[curb] = nextb; -// siz[nextb] = nextLen; -// memcpy(blocks[nextb], src + srcPos, nextLen); +// memcpy(blocks[nextb], src + pos, len); +// siz[nextb] = len; //} // //void merge(int curb, int nextb) { @@ -73,7 +75,7 @@ //void split(int curb, int pos) { // if (curb == -1 || pos == siz[curb]) return; // int nextb = assign(); -// link(curb, nextb, siz[curb] - pos, blocks[curb], pos); +// linkAndWrite(curb, nextb, blocks[curb], pos, siz[curb] - pos); // siz[curb] = pos; //} // @@ -93,13 +95,13 @@ // int curb = bi, newb, done = 0; // while (done + BLEN <= len) { // newb = assign(); -// link(curb, newb, BLEN, str, done); +// linkAndWrite(curb, newb, str, done, BLEN); // done += BLEN; // curb = newb; // } // if (len > done) { // newb = assign(); -// link(curb, newb, len - done, str, done); +// linkAndWrite(curb, newb, str, done, len - done); // } // maintain(); //} @@ -128,16 +130,16 @@ // find(pos); // int curb = bi; // pos = pi; -// int got = (len < siz[curb] - pos) ? len : (siz[curb] - pos); -// memcpy(str, blocks[curb] + pos, got); +// int done = (len < siz[curb] - pos) ? len : (siz[curb] - pos); +// memcpy(str, blocks[curb] + pos, done); // curb = nxt[curb]; -// while (curb != -1 && got + siz[curb] <= len) { -// memcpy(str + got, blocks[curb], siz[curb]); -// got += siz[curb]; +// while (curb != -1 && done + siz[curb] <= len) { +// memcpy(str + done, blocks[curb], siz[curb]); +// done += siz[curb]; // curb = nxt[curb]; // } -// if (curb != -1 && got < len) { -// memcpy(str + got, blocks[curb], len - got); +// if (curb != -1 && done < len) { +// memcpy(str + done, blocks[curb], len - done); // } //} // From b829f0a49c5ebb5228c1c277b7f0f225410b2780 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 13:21:26 +0800 Subject: [PATCH 0298/1170] modify code --- src/class172/Code06_TextEditor1.java | 5 ++++- src/class172/Code06_TextEditor2.java | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 833aec5d9..245d6a04d 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -19,17 +19,20 @@ public class Code06_TextEditor1 { + // 整个文章能到达的最大长度 public static int MAXN = 3000001; - // 每块的最大容量,近似等于 2 * 根号n + // 每块的最大容量,近似等于 2 * 根号n,每块内容的大小不会超过该容量 public static int BLEN = 3001; // 块的最大数量 public static int BNUM = (MAXN / BLEN) << 1; + // 所有空间 public static char[][] blocks = new char[BNUM][BLEN]; // nxt[i]表示编号为i的块,下一块的编号 public static int[] nxt = new int[BNUM]; // siz[i]表示编号为i的块,写入了多少长度的内容 public static int[] siz = new int[BNUM]; + // 编号分配池,其实是一个栈,分配编号从栈顶弹出,回收编号从栈顶压入 public static int[] pool = new int[BNUM]; // 分配池的栈顶 diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index 3bb7898a8..503b4ccbe 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -24,6 +24,7 @@ //char blocks[BNUM][BLEN]; //int nxt[BNUM]; //int siz[BNUM]; +// //int pool[BNUM]; //int top = 0; // From 6b65ef8d0c1be327038fa62616e6889ae2ae36ca Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 13:22:27 +0800 Subject: [PATCH 0299/1170] modify code --- src/class172/Code06_TextEditor1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 245d6a04d..14f485e68 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -23,7 +23,7 @@ public class Code06_TextEditor1 { public static int MAXN = 3000001; // 每块的最大容量,近似等于 2 * 根号n,每块内容的大小不会超过该容量 public static int BLEN = 3001; - // 块的最大数量 + // 块的数量上限 public static int BNUM = (MAXN / BLEN) << 1; // 所有空间 From 33ea9b88509b067ad2df5f6699e321d0ec16fe14 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 13:24:48 +0800 Subject: [PATCH 0300/1170] modify code --- src/class172/Code06_TextEditor1.java | 4 ++-- src/class172/Code06_TextEditor2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 14f485e68..da4576813 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -26,13 +26,13 @@ public class Code06_TextEditor1 { // 块的数量上限 public static int BNUM = (MAXN / BLEN) << 1; - // 所有空间 - public static char[][] blocks = new char[BNUM][BLEN]; // nxt[i]表示编号为i的块,下一块的编号 public static int[] nxt = new int[BNUM]; // siz[i]表示编号为i的块,写入了多少长度的内容 public static int[] siz = new int[BNUM]; + // 所有空间,编号为i的块,内容就写入到blocks[i] + public static char[][] blocks = new char[BNUM][BLEN]; // 编号分配池,其实是一个栈,分配编号从栈顶弹出,回收编号从栈顶压入 public static int[] pool = new int[BNUM]; // 分配池的栈顶 diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index 503b4ccbe..414306960 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -21,10 +21,10 @@ //const int BLEN = 3001; //const int BNUM = (MAXN / BLEN) << 1; // -//char blocks[BNUM][BLEN]; //int nxt[BNUM]; //int siz[BNUM]; // +//char blocks[BNUM][BLEN]; //int pool[BNUM]; //int top = 0; // From ef664d1b6da7d5261766610d36238dbd3cb4a78d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 13:25:42 +0800 Subject: [PATCH 0301/1170] modify code --- src/class172/Code06_TextEditor1.java | 10 +++++----- src/class172/Code06_TextEditor2.java | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index da4576813..ffc7960c7 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -26,11 +26,6 @@ public class Code06_TextEditor1 { // 块的数量上限 public static int BNUM = (MAXN / BLEN) << 1; - // nxt[i]表示编号为i的块,下一块的编号 - public static int[] nxt = new int[BNUM]; - // siz[i]表示编号为i的块,写入了多少长度的内容 - public static int[] siz = new int[BNUM]; - // 所有空间,编号为i的块,内容就写入到blocks[i] public static char[][] blocks = new char[BNUM][BLEN]; // 编号分配池,其实是一个栈,分配编号从栈顶弹出,回收编号从栈顶压入 @@ -38,6 +33,11 @@ public class Code06_TextEditor1 { // 分配池的栈顶 public static int top = 0; + // nxt[i]表示编号为i的块,下一块的编号 + public static int[] nxt = new int[BNUM]; + // siz[i]表示编号为i的块,写入了多少长度的内容 + public static int[] siz = new int[BNUM]; + // 插入字符串时,先读入进str,然后写入到块 // 获取字符串时,先从块里取出内容保留在str,然后打印str public static char[] str = new char[MAXN]; diff --git a/src/class172/Code06_TextEditor2.java b/src/class172/Code06_TextEditor2.java index 414306960..5da39ee59 100644 --- a/src/class172/Code06_TextEditor2.java +++ b/src/class172/Code06_TextEditor2.java @@ -21,13 +21,13 @@ //const int BLEN = 3001; //const int BNUM = (MAXN / BLEN) << 1; // -//int nxt[BNUM]; -//int siz[BNUM]; -// //char blocks[BNUM][BLEN]; //int pool[BNUM]; //int top = 0; // +//int nxt[BNUM]; +//int siz[BNUM]; +// //char str[MAXN]; // //void prepare() { From 9c490293e7de2887966d1234af7c631e8a41c341 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 13:26:40 +0800 Subject: [PATCH 0302/1170] modify code --- src/class172/Code06_TextEditor1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index ffc7960c7..002f470ed 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -26,7 +26,7 @@ public class Code06_TextEditor1 { // 块的数量上限 public static int BNUM = (MAXN / BLEN) << 1; - // 所有空间,编号为i的块,内容就写入到blocks[i] + // 写入内容的空间,编号为i的块,内容写入到blocks[i] public static char[][] blocks = new char[BNUM][BLEN]; // 编号分配池,其实是一个栈,分配编号从栈顶弹出,回收编号从栈顶压入 public static int[] pool = new int[BNUM]; From 4d4988eb9ec13c198d8d48d52edbae88c495e85d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 13:54:22 +0800 Subject: [PATCH 0303/1170] modify code --- src/class172/Code06_TextEditor1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 002f470ed..59abd6684 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -21,7 +21,7 @@ public class Code06_TextEditor1 { // 整个文章能到达的最大长度 public static int MAXN = 3000001; - // 每块的最大容量,近似等于 2 * 根号n,每块内容的大小不会超过该容量 + // 块内容量,近似等于 2 * 根号n,每块内容大小不会超过容量 public static int BLEN = 3001; // 块的数量上限 public static int BNUM = (MAXN / BLEN) << 1; @@ -105,7 +105,7 @@ public static void split(int curb, int pos) { siz[curb] = pos; } - // 从头到尾遍历所有的块,任意相邻两块的大小累加和 <= BLEN,合并这两块 + // 从头到尾遍历所有的块,任意相邻两块的内容大小累加和 <= 块内容量,就合并两块 public static void maintain() { for (int curb = 0, nextb; curb != -1; curb = nxt[curb]) { nextb = nxt[curb]; From 16c60cb3c79f57af7820e4e72cfd17ebfa4409ec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 14:02:12 +0800 Subject: [PATCH 0304/1170] modify code --- src/class172/Code06_TextEditor1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class172/Code06_TextEditor1.java b/src/class172/Code06_TextEditor1.java index 59abd6684..338d4a479 100644 --- a/src/class172/Code06_TextEditor1.java +++ b/src/class172/Code06_TextEditor1.java @@ -105,7 +105,7 @@ public static void split(int curb, int pos) { siz[curb] = pos; } - // 从头到尾遍历所有的块,任意相邻两块的内容大小累加和 <= 块内容量,就合并两块 + // 从头到尾遍历所有的块,检查任意相邻两块,内容大小的累加和 <= 块内容量,就合并 public static void maintain() { for (int curb = 0, nextb; curb != -1; curb = nxt[curb]) { nextb = nxt[curb]; From 32b026f1394ce58b65adf603ace94d8e79076af7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Jun 2025 15:25:00 +0800 Subject: [PATCH 0305/1170] modify code --- ...\347\212\266\351\223\276\350\241\250.pptx" | Bin 0 -> 54183 bytes src/class172/Code06_TextEditor1.java | 18 +++++++++--------- src/class172/Code06_TextEditor2.java | 14 +++++++------- 3 files changed, 16 insertions(+), 16 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243172\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2301-\345\235\227\347\212\266\346\225\260\347\273\204\343\200\201\345\235\227\347\212\266\351\223\276\350\241\250.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243172\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2301-\345\235\227\347\212\266\346\225\260\347\273\204\343\200\201\345\235\227\347\212\266\351\223\276\350\241\250.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243172\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2301-\345\235\227\347\212\266\346\225\260\347\273\204\343\200\201\345\235\227\347\212\266\351\223\276\350\241\250.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..8fc03065a10e9d01e2f2896e6b416b64a69abc1a GIT binary patch literal 54183 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%0Acyg93)bHT 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 ou6Mhp29F+t0 Date: Wed, 18 Jun 2025 19:34:33 +0800 Subject: [PATCH 0306/1170] modify code --- src/class173/Code01_Sequence1.java | 215 +++++++++++++++++++++++++++++ src/class173/Code01_Sequence2.java | 166 ++++++++++++++++++++++ 2 files changed, 381 insertions(+) create mode 100644 src/class173/Code01_Sequence1.java create mode 100644 src/class173/Code01_Sequence2.java diff --git a/src/class173/Code01_Sequence1.java b/src/class173/Code01_Sequence1.java new file mode 100644 index 000000000..bb7dfc358 --- /dev/null +++ b/src/class173/Code01_Sequence1.java @@ -0,0 +1,215 @@ +package class173; + +// 序列,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3863 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_Sequence1 { + + public static int MAXN = 100001; + public static int MAXB = 501; + public static int n, m; + public static int[] arr = new int[MAXN]; + + // op == 1,代表修改事件,位置x、时间t、修改效果v、空缺 + // op == 2,代表查询事件,位置x、时间t、查询标准v、问题编号q + public static int[][] event = new int[MAXN << 2][5]; + public static int cnte = 0; + public static int cntq = 0; + + public static long[] tim = new long[MAXN]; + public static long[] sort = new long[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + public static long[] lazy = new long[MAXB]; + + public static int[] ans = new int[MAXN]; + + public static void addChange(int x, int t, int v) { + event[++cnte][0] = 1; + event[cnte][1] = x; + event[cnte][2] = t; + event[cnte][3] = v; + } + + public static void addQuery(int x, int t, int v) { + event[++cnte][0] = 2; + event[cnte][1] = x; + event[cnte][2] = t; + event[cnte][3] = v; + event[cnte][4] = ++cntq; + } + + public static void innerAdd(int l, int r, long v) { + for (int i = l; i <= r; i++) { + tim[i] += v; + } + for (int i = bl[bi[l]]; i <= br[bi[l]]; i++) { + sort[i] = tim[i]; + } + Arrays.sort(sort, bl[bi[l]], br[bi[l]] + 1); + } + + public static void add(int l, int r, long v) { + if (l > r) { + return; + } + if (bi[l] == bi[r]) { + innerAdd(l, r, v); + } else { + innerAdd(l, br[bi[l]], v); + innerAdd(bl[bi[r]], r, v); + for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { + lazy[i] += v; + } + } + } + + public static int innerQuery(int l, int r, long v) { + v -= lazy[bi[l]]; + int ans = 0; + for (int i = l; i <= r; i++) { + if (tim[i] >= v) { + ans++; + } + } + return ans; + } + + public static int getCnt(int i, long v) { + v -= lazy[i]; + int l = bl[i], r = br[i], m, pos = br[i] + 1; + while (l <= r) { + m = (l + r) >> 1; + if (sort[m] >= v) { + pos = m; + r = m - 1; + } else { + l = m + 1; + } + } + return br[i] - pos + 1; + } + + public static int query(int l, int r, long v) { + if (l > r) { + return 0; + } + int ans = 0; + if (bi[l] == bi[r]) { + ans += innerQuery(l, r, v); + } else { + ans += innerQuery(l, br[bi[l]], v); + ans += innerQuery(bl[bi[r]], r, v); + for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { + ans += getCnt(i, v); + } + } + return ans; + } + + public static void prepare() { + blen = (int) Math.sqrt(m); + bnum = (m + blen - 1) / blen; + for (int i = 1; i <= m; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, m); + } + Arrays.sort(event, 1, cnte + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + m++; // 时间轴重新定义,1是初始时刻、2、3 ... m+1 + for (int t = 2, op, l, r, v, x; t <= m; t++) { + op = in.nextInt(); + if (op == 1) { + l = in.nextInt(); + r = in.nextInt(); + v = in.nextInt(); + addChange(l, t, v); + addChange(r + 1, t, -v); + } else { + x = in.nextInt(); + v = in.nextInt(); + addQuery(x, t, v); + } + } + prepare(); + for (int i = 1, op, x, t, v, q; i <= cnte; i++) { + op = event[i][0]; + x = event[i][1]; + t = event[i][2]; + v = event[i][3]; + q = event[i][4]; + if (op == 1) { + add(t, m, v); + } else { + ans[q] = query(1, t - 1, v - arr[x]); + } + } + for (int i = 1; i <= cntq; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class173/Code01_Sequence2.java b/src/class173/Code01_Sequence2.java new file mode 100644 index 000000000..cd88f2bd1 --- /dev/null +++ b/src/class173/Code01_Sequence2.java @@ -0,0 +1,166 @@ +package class173; + +// 序列,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3863 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Event { +// int op, x, t, v, q; +//}; +// +//bool EventCmp(Event a, Event b) { +// return a.x != b.x ? a.x < b.x : a.t < b.t; +//} +// +//const int MAXN = 100001; +//const int MAXB = 501; +//int n, m; +//int arr[MAXN]; +// +//Event event[MAXN << 2]; +//int cnte, cntq; +// +//long long tim[MAXN]; +//long long sortv[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +//long long lazy[MAXB]; +// +//int ans[MAXN]; +// +//void addChange(int x, int t, int v) { +// event[++cnte].op = 1; +// event[cnte].x = x; +// event[cnte].t = t; +// event[cnte].v = v; +//} +// +//void addQuery(int x, int t, int v) { +// event[++cnte].op = 2; +// event[cnte].x = x; +// event[cnte].t = t; +// event[cnte].v = v; +// event[cnte].q = ++cntq; +//} +// +//void innerAdd(int l, int r, long long v) { +// for (int i = l; i <= r; i++) { +// tim[i] += v; +// } +// for (int i = bl[bi[l]]; i <= br[bi[l]]; i++) { +// sortv[i] = tim[i]; +// } +// sort(sortv + bl[bi[l]], sortv + br[bi[l]] + 1); +//} +// +//void add(int l, int r, long long v) { +// if (l > r) { +// return; +// } +// if (bi[l] == bi[r]) { +// innerAdd(l, r, v); +// } else { +// innerAdd(l, br[bi[l]], v); +// innerAdd(bl[bi[r]], r, v); +// for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { +// lazy[i] += v; +// } +// } +//} +// +//int innerQuery(int l, int r, long long v) { +// v -= lazy[bi[l]]; +// int ans = 0; +// for (int i = l; i <= r; i++) { +// if (tim[i] >= v) { +// ans++; +// } +// } +// return ans; +//} +// +//int getCnt(int i, long long v) { +// v -= lazy[i]; +// int l = bl[i], r = br[i], m, pos = br[i] + 1; +// while (l <= r) { +// m = (l + r) >> 1; +// if (sortv[m] >= v) { +// pos = m; +// r = m - 1; +// } else { +// l = m + 1; +// } +// } +// return br[i] - pos + 1; +//} +// +//int query(int l, int r, long long v) { +// if (l > r) { +// return 0; +// } +// int ans = 0; +// if (bi[l] == bi[r]) { +// ans = innerQuery(l, r, v); +// } else { +// ans += innerQuery(l, br[bi[l]], v); +// ans += innerQuery(bl[bi[r]], r, v); +// for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { +// ans += getCnt(i, v); +// } +// } +// return ans; +//} +// +//void prepare() { +// blen = (int)sqrt(m); +// bnum = (m + blen - 1) / blen; +// for (int i = 1; i <= m; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, m); +// } +// sort(event + 1, event + cnte + 1, EventCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// m++; +// for (int t = 2, op, l, r, v, x; t <= m; t++) { +// cin >> op; +// if (op == 1) { +// cin >> l >> r >> v; +// addChange(l, t, v); +// addChange(r + 1, t, -v); +// } else { +// cin >> x >> v; +// addQuery(x, t, v); +// } +// } +// prepare(); +// for (int i = 1; i <= cnte; i++) { +// if (event[i].op == 1) { +// add(event[i].t, m, event[i].v); +// } else { +// ans[event[i].q] = query(1, event[i].t - 1, 1LL * event[i].v - arr[event[i].x]); +// } +// } +// for (int i = 1; i <= cntq; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 12d2ec1a1ca8c33a884f0009e2166e183e7e5683 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Jun 2025 16:17:14 +0800 Subject: [PATCH 0307/1170] modify code --- src/class173/{Code01_Sequence1.java => Code02_Sequence1.java} | 2 +- src/class173/{Code01_Sequence2.java => Code02_Sequence2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class173/{Code01_Sequence1.java => Code02_Sequence1.java} (99%) rename src/class173/{Code01_Sequence2.java => Code02_Sequence2.java} (100%) diff --git a/src/class173/Code01_Sequence1.java b/src/class173/Code02_Sequence1.java similarity index 99% rename from src/class173/Code01_Sequence1.java rename to src/class173/Code02_Sequence1.java index bb7dfc358..f7c04ff29 100644 --- a/src/class173/Code01_Sequence1.java +++ b/src/class173/Code02_Sequence1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code01_Sequence1 { +public class Code02_Sequence1 { public static int MAXN = 100001; public static int MAXB = 501; diff --git a/src/class173/Code01_Sequence2.java b/src/class173/Code02_Sequence2.java similarity index 100% rename from src/class173/Code01_Sequence2.java rename to src/class173/Code02_Sequence2.java From 06197e514e958f9d1577cbc83238840665b5eb82 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Jun 2025 16:17:40 +0800 Subject: [PATCH 0308/1170] modify code --- src/class173/{Code02_Sequence1.java => Code01_Sequence1.java} | 2 +- src/class173/{Code02_Sequence2.java => Code01_Sequence2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class173/{Code02_Sequence1.java => Code01_Sequence1.java} (99%) rename src/class173/{Code02_Sequence2.java => Code01_Sequence2.java} (100%) diff --git a/src/class173/Code02_Sequence1.java b/src/class173/Code01_Sequence1.java similarity index 99% rename from src/class173/Code02_Sequence1.java rename to src/class173/Code01_Sequence1.java index f7c04ff29..bb7dfc358 100644 --- a/src/class173/Code02_Sequence1.java +++ b/src/class173/Code01_Sequence1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_Sequence1 { +public class Code01_Sequence1 { public static int MAXN = 100001; public static int MAXB = 501; diff --git a/src/class173/Code02_Sequence2.java b/src/class173/Code01_Sequence2.java similarity index 100% rename from src/class173/Code02_Sequence2.java rename to src/class173/Code01_Sequence2.java From b5452b47a36a85c0b7d987669c2cac191ab3720b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Jun 2025 18:22:38 +0800 Subject: [PATCH 0309/1170] modify code --- src/class173/Code02_Poker1.java | 240 ++++++++++++++++++++++++++++++++ src/class173/Code02_Poker2.java | 190 +++++++++++++++++++++++++ 2 files changed, 430 insertions(+) create mode 100644 src/class173/Code02_Poker1.java create mode 100644 src/class173/Code02_Poker2.java diff --git a/src/class173/Code02_Poker1.java b/src/class173/Code02_Poker1.java new file mode 100644 index 000000000..381d4eeac --- /dev/null +++ b/src/class173/Code02_Poker1.java @@ -0,0 +1,240 @@ +package class173; + +// 由乃打扑克,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5356 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code02_Poker1 { + + public static int MAXN = 100001; + public static int MAXB = 1001; + public static int INF = Integer.MAX_VALUE; + public static int n, m; + + public static int[] arr = new int[MAXN]; + public static int[] sort = new int[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + public static int[] lazy = new int[MAXB]; + + public static void innerAdd(int l, int r, int v) { + for (int i = l; i <= r; i++) { + arr[i] += v; + } + for (int i = bl[bi[l]]; i <= br[bi[l]]; i++) { + sort[i] = arr[i]; + } + Arrays.sort(sort, bl[bi[l]], br[bi[l]] + 1); + } + + public static void add(int l, int r, int v) { + if (bi[l] == bi[r]) { + innerAdd(l, r, v); + } else { + innerAdd(l, br[bi[l]], v); + innerAdd(bl[bi[r]], r, v); + for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { + lazy[i] += v; + } + } + } + + public static int getMin(int l, int r) { + int lb = bi[l], rb = bi[r], ans = INF; + if (lb == rb) { + for (int i = l; i <= r; i++) { + ans = Math.min(ans, arr[i] + lazy[lb]); + } + } else { + for (int i = l; i <= br[lb]; i++) { + ans = Math.min(ans, arr[i] + lazy[lb]); + } + for (int i = bl[rb]; i <= r; i++) { + ans = Math.min(ans, arr[i] + lazy[rb]); + } + for (int i = lb + 1; i <= rb - 1; i++) { + ans = Math.min(ans, sort[bl[i]] + lazy[i]); + } + } + return ans; + } + + public static int getMax(int l, int r) { + int lb = bi[l], rb = bi[r], ans = -INF; + if (lb == rb) { + for (int i = l; i <= r; i++) { + ans = Math.max(ans, arr[i] + lazy[lb]); + } + } else { + for (int i = l; i <= br[lb]; i++) { + ans = Math.max(ans, arr[i] + lazy[lb]); + } + for (int i = bl[rb]; i <= r; i++) { + ans = Math.max(ans, arr[i] + lazy[rb]); + } + for (int i = lb + 1; i <= rb - 1; i++) { + ans = Math.max(ans, sort[br[i]] + lazy[i]); + } + } + return ans; + } + + public static int getCnt(int i, int v) { + v -= lazy[i]; + int l = bl[i], r = br[i]; + if (sort[l] > v) { + return 0; + } + if (sort[r] <= v) { + return r - l + 1; + } + int m, find = l; + while (l <= r) { + m = (l + r) / 2; + if (sort[m] <= v) { + find = m; + l = m + 1; + } else { + r = m - 1; + } + } + return find - bl[i] + 1; + } + + public static int num(int l, int r, int v) { + int lb = bi[l], rb = bi[r], ans = 0; + if (lb == rb) { + for (int i = l; i <= r; i++) { + if (arr[i] + lazy[lb] <= v) { + ans++; + } + } + } else { + for (int i = l; i <= br[lb]; i++) { + if (arr[i] + lazy[lb] <= v) { + ans++; + } + } + for (int i = bl[rb]; i <= r; i++) { + if (arr[i] + lazy[rb] <= v) { + ans++; + } + } + for (int i = lb + 1; i <= rb - 1; i++) { + ans += getCnt(i, v); + } + } + return ans; + } + + public static int query(int l, int r, int v) { + if (v < 1 || v > r - l + 1) { + return -1; + } + int minv = getMin(l, r); + int maxv = getMax(l, r); + int midv; + int ans = -1; + while (minv <= maxv) { + midv = minv + (maxv - minv) / 2; + if (num(l, r, midv) >= v) { + ans = midv; + maxv = midv - 1; + } else { + minv = midv + 1; + } + } + return ans; + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + for (int i = 1; i <= n; i++) { + sort[i] = arr[i]; + } + for (int i = 1; i <= bnum; i++) { + Arrays.sort(sort, bl[i], br[i] + 1); + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + for (int i = 1, op, l, r, v; i <= m; i++) { + op = in.nextInt(); + l = in.nextInt(); + r = in.nextInt(); + v = in.nextInt(); + if (op == 1) { + out.println(query(l, r, v)); + } else { + add(l, r, v); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file diff --git a/src/class173/Code02_Poker2.java b/src/class173/Code02_Poker2.java new file mode 100644 index 000000000..3cc0466c9 --- /dev/null +++ b/src/class173/Code02_Poker2.java @@ -0,0 +1,190 @@ +package class173; + +// 由乃打扑克,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5356 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXB = 1001; +//const int INF = 2147483647; +// +//int n, m; +//int arr[MAXN]; +//int sortv[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +//int lazy[MAXB]; +// +//void innerAdd(int l, int r, int v) { +// for (int i = l; i <= r; i++) { +// arr[i] += v; +// } +// for (int i = bl[bi[l]]; i <= br[bi[l]]; i++) { +// sortv[i] = arr[i]; +// } +// sort(sortv + bl[bi[l]], sortv + br[bi[l]] + 1); +//} +// +//void add(int l, int r, int v) { +// if (bi[l] == bi[r]) { +// innerAdd(l, r, v); +// } else { +// innerAdd(l, br[bi[l]], v); +// innerAdd(bl[bi[r]], r, v); +// for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { +// lazy[i] += v; +// } +// } +//} +// +//int getMin(int l, int r) { +// int lb = bi[l], rb = bi[r], ans = INF; +// if (lb == rb) { +// for (int i = l; i <= r; i++) { +// ans = min(ans, arr[i] + lazy[lb]); +// } +// } else { +// for (int i = l; i <= br[lb]; i++) { +// ans = min(ans, arr[i] + lazy[lb]); +// } +// for (int i = bl[rb]; i <= r; i++) { +// ans = min(ans, arr[i] + lazy[rb]); +// } +// for (int i = lb + 1; i <= rb - 1; i++) { +// ans = min(ans, sortv[bl[i]] + lazy[i]); +// } +// } +// return ans; +//} +// +//int getMax(int l, int r) { +// int lb = bi[l], rb = bi[r], ans = -INF; +// if (lb == rb) { +// for (int i = l; i <= r; i++) { +// ans = max(ans, arr[i] + lazy[lb]); +// } +// } else { +// for (int i = l; i <= br[lb]; i++) { +// ans = max(ans, arr[i] + lazy[lb]); +// } +// for (int i = bl[rb]; i <= r; i++) { +// ans = max(ans, arr[i] + lazy[rb]); +// } +// for (int i = lb + 1; i <= rb - 1; i++) { +// ans = max(ans, sortv[br[i]] + lazy[i]); +// } +// } +// return ans; +//} +// +//int getCnt(int i, int v) { +// v -= lazy[i]; +// int l = bl[i], r = br[i]; +// if (sortv[l] > v) { +// return 0; +// } +// if (sortv[r] <= v) { +// return r - l + 1; +// } +// int find = l; +// while (l <= r) { +// int m = (l + r) >> 1; +// if (sortv[m] <= v) { +// find = m; +// l = m + 1; +// } else { +// r = m - 1; +// } +// } +// return find - bl[i] + 1; +//} +// +//int num(int l, int r, int v) { +// int lb = bi[l], rb = bi[r], ans = 0; +// if (lb == rb) { +// for (int i = l; i <= r; i++) { +// if (arr[i] + lazy[lb] <= v) { +// ans++; +// } +// } +// } else { +// for (int i = l; i <= br[lb]; i++) { +// if (arr[i] + lazy[lb] <= v) { +// ans++; +// } +// } +// for (int i = bl[rb]; i <= r; i++) { +// if (arr[i] + lazy[rb] <= v) { +// ans++; +// } +// } +// for (int i = lb + 1; i <= rb - 1; i++) { +// ans += getCnt(i, v); +// } +// } +// return ans; +//} +// +//int query(int l, int r, int v) { +// if (v < 1 || v > r - l + 1) { +// return -1; +// } +// int minv = getMin(l, r); +// int maxv = getMax(l, r); +// int ans = -1; +// while (minv <= maxv) { +// int midv = minv + (maxv - minv) / 2; +// if (num(l, r, midv) >= v) { +// ans = midv; +// maxv = midv - 1; +// } else { +// minv = midv + 1; +// } +// } +// return ans; +//} +// +//void prepare() { +// blen = (int)sqrt(m); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } +// for (int i = 1; i <= n; i++) { +// sortv[i] = arr[i]; +// } +// for (int i = 1; i <= bnum; i++) { +// sort(sortv + bl[i], sortv + br[i] + 1); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// for (int i = 1, op, l, r, v; i <= m; i++) { +// cin >> op >> l >> r >> v; +// if (op == 1) { +// cout << query(l, r, v) << '\n'; +// } else { +// add(l, r, v); +// } +// } +// return 0; +//} \ No newline at end of file From dc4d057ad7920704a72da99153086f420fbaca98 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Jun 2025 14:10:38 +0800 Subject: [PATCH 0310/1170] modify code --- src/class173/Code03_Inversion1.java | 209 ++++++++++++++++++++++++++++ src/class173/Code03_Inversion2.java | 176 +++++++++++++++++++++++ 2 files changed, 385 insertions(+) create mode 100644 src/class173/Code03_Inversion1.java create mode 100644 src/class173/Code03_Inversion2.java diff --git a/src/class173/Code03_Inversion1.java b/src/class173/Code03_Inversion1.java new file mode 100644 index 000000000..3049a2fc2 --- /dev/null +++ b/src/class173/Code03_Inversion1.java @@ -0,0 +1,209 @@ +package class173; + +// 区间逆序对,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5046 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是无法通过所有测试用例 +// 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 +// 甚至C++也需要考虑优化常数,想通过用C++实现,正式比赛不卡常 +// 本节课Code03_Inversion2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code03_Inversion1 { + + public static int MAXN = 100001; + public static int MAXB = 701; + public static int n, m; + + public static int[] arr = new int[MAXN]; + public static int[][] sortv = new int[MAXN][2]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + + public static int[] tree = new int[MAXN]; + public static int[] pre = new int[MAXN]; + public static int[] nxt = new int[MAXN]; + public static int[][] cnt = new int[MAXB][MAXN]; + public static long[][] dp = new long[MAXB][MAXB]; + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= n) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static int calc(int i, int j, int li, int ri, int lj, int rj) { + int ans = 0; + for (int p1 = bl[i], p2 = bl[j] - 1, tmp = 0; p1 <= br[i]; p1++) { + if (li <= sortv[p1][1] && sortv[p1][1] <= ri) { + while (p2 + 1 <= br[j] && sortv[p1][0] > sortv[p2 + 1][0]) { + p2++; + if (lj <= sortv[p2][1] && sortv[p2][1] <= rj) { + tmp++; + } + } + ans += tmp; + } + } + return ans; + } + + public static long query(int l, int r) { + long ans = 0; + int lb = bi[l]; + int rb = bi[r]; + if (lb == rb) { + if (l == bl[lb]) { + ans = pre[r]; + } else { + ans = pre[r] - pre[l - 1] - calc(lb, lb, 1, l - 1, l, r); + } + } else { + for (int i = l; i <= br[lb]; i++) { + ans += cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]; + } + for (int i = bl[rb]; i <= r; i++) { + ans += br[rb - 1] - bl[lb + 1] + 1 - cnt[rb - 1][arr[i]] + cnt[lb][arr[i]]; + } + ans += dp[lb + 1][rb - 1] + nxt[l] + pre[r] + calc(lb, rb, l, br[lb], bl[rb], r); + } + return ans; + } + + public static void prepare() { + // 注意调整块长 + blen = (int) (Math.sqrt(n) / 2); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + for (int i = 1; i <= n; i++) { + sortv[i][0] = arr[i]; + sortv[i][1] = i; + } + for (int i = 1; i <= bnum; i++) { + Arrays.sort(sortv, bl[i], br[i] + 1, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]); + } + for (int i = 1; i <= bnum; i++) { + for (int j = bl[i]; j <= br[i]; j++) { + cnt[i][arr[j]]++; + if (j != bl[i]) { + pre[j] = pre[j - 1] + sum(n) - sum(arr[j]); + } + add(arr[j], 1); + } + for (int j = bl[i]; j <= br[i]; j++) { + add(arr[j], -1); + } + for (int j = br[i]; j >= bl[i]; j--) { + if (j != br[i]) { + nxt[j] = nxt[j + 1] + sum(arr[j]); + } + add(arr[j], 1); + } + for (int j = bl[i]; j <= br[i]; j++) { + add(arr[j], -1); + } + int tmp = 0; + for (int j = 1; j <= n; j++) { + tmp += cnt[i][j]; + cnt[i][j] = tmp + cnt[i - 1][j]; + } + dp[i][i] = pre[br[i]]; + } + for (int len = 2; len <= bnum; len++) { + for (int l = 1, r = l + len - 1; r <= bnum; l++, r++) { + dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, r, bl[l], br[l], bl[r], br[r]); + } + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + long lastAns = 0; + for (int i = 1, l, r; i <= m; i++) { + l = in.nextInt(); + r = in.nextInt(); + l = (int) (lastAns ^ l); + r = (int) (lastAns ^ r); + lastAns = query(l, r); + out.println(lastAns); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class173/Code03_Inversion2.java b/src/class173/Code03_Inversion2.java new file mode 100644 index 000000000..de1612223 --- /dev/null +++ b/src/class173/Code03_Inversion2.java @@ -0,0 +1,176 @@ +package class173; + +// 区间逆序对,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5046 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 +// 注意本题需要优化常数,虽然程度不深,正式比赛不卡常 + +//#include +// +//using namespace std; +// +//char buf[1 << 20], *p1 = buf, *p2 = buf, obuf[1 << 20], *o = obuf; +// +//inline char gc() { +// return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; +//} +// +//inline int read() { +// int s = 0; +// char c = gc(); +// while (!isdigit(c)) c = gc(); +// while (isdigit(c)) { +// s = s * 10 + c - '0'; +// c = gc(); +// } +// return s; +//} +// +//struct Node { +// int v, i; +//}; +// +//bool NodeCmp(Node &a, Node &b) { +// return a.v != b.v ? a.v < b.v : a.i < b.i; +//} +// +//const int MAXN = 100001; +//const int MAXB = 701; +//int n, m; +//int arr[MAXN]; +//Node sortv[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +// +//int tree[MAXN]; +//int pre[MAXN]; +//int nxt[MAXN]; +//int cnt[MAXB][MAXN]; +//long long dp[MAXB][MAXB]; +// +//inline int lowbit(int i) { +// return i & -i; +//} +// +//inline void add(int i, int v) { +// while (i <= n) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//inline int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//inline int calc(int i, int j, int li, int ri, int lj, int rj) { +// int ans = 0; +// for (int p1 = bl[i], p2 = bl[j] - 1, tmp = 0; p1 <= br[i]; p1++) { +// if (li <= sortv[p1].i && sortv[p1].i <= ri) { +// while (p2 + 1 <= br[j] && sortv[p1].v > sortv[p2 + 1].v) { +// p2++; +// if (lj <= sortv[p2].i && sortv[p2].i <= rj) { +// tmp++; +// } +// } +// ans += tmp; +// } +// } +// return ans; +//} +// +//long long query(int l, int r) { +// long long ans = 0; +// int lb = bi[l], rb = bi[r]; +// if (lb == rb) { +// if (l == bl[lb]) { +// ans = pre[r]; +// } else { +// ans = pre[r] - pre[l - 1] - calc(lb, lb, 1, l - 1, l, r); +// } +// } else { +// for (int i = l; i <= br[lb]; i++) { +// ans += cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]; +// } +// for (int i = bl[rb]; i <= r; i++) { +// ans += br[rb - 1] - bl[lb + 1] + 1 - cnt[rb - 1][arr[i]] + cnt[lb][arr[i]]; +// } +// ans += dp[lb + 1][rb - 1] + nxt[l] + pre[r] + calc(lb, rb, l, br[lb], bl[rb], r); +// } +// return ans; +//} +// +//void prepare() { +// blen = (int)(sqrt(n) / 2); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) bi[i] = (i - 1) / blen + 1; +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } +// for (int i = 1; i <= n; i++) { +// sortv[i].v = arr[i]; +// sortv[i].i = i; +// } +// for (int i = 1; i <= bnum; i++) { +// sort(sortv + bl[i], sortv + br[i] + 1, NodeCmp); +// } +// for (int i = 1; i <= bnum; i++) { +// for (int j = bl[i]; j <= br[i]; j++) { +// cnt[i][arr[j]]++; +// if (j != bl[i]) { +// pre[j] = pre[j - 1] + sum(n) - sum(arr[j]); +// } +// add(arr[j], 1); +// } +// for (int j = bl[i]; j <= br[i]; j++) { +// add(arr[j], -1); +// } +// for (int j = br[i]; j >= bl[i]; j--) { +// if (j != br[i]) { +// nxt[j] = nxt[j + 1] + sum(arr[j]); +// } +// add(arr[j], 1); +// } +// for (int j = bl[i]; j <= br[i]; j++) { +// add(arr[j], -1); +// } +// int tmp = 0; +// for (int j = 1; j <= n; j++) { +// tmp += cnt[i][j]; +// cnt[i][j] = tmp + cnt[i - 1][j]; +// } +// dp[i][i] = pre[br[i]]; +// } +// for (int len = 2; len <= bnum; len++) { +// for (int l = 1, r = l + len - 1; r <= bnum; l++, r++) { +// dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, r, bl[l], br[l], bl[r], br[r]); +// } +// } +//} +// +//int main() { +// n = read(); +// m = read(); +// for (int i = 1; i <= n; i++) { +// arr[i] = read(); +// } +// prepare(); +// long long lastAns = 0; +// for (int i = 1, l, r; i <= m; i++) { +// l = read() ^ lastAns; +// r = read() ^ lastAns; +// lastAns = query(l, r); +// printf("%lld\n", lastAns); +// } +// return 0; +//} \ No newline at end of file From d0b7a34ec7992011333611beec12e0398c71b906 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Jun 2025 14:13:59 +0800 Subject: [PATCH 0311/1170] modify code --- src/class173/Code03_Inversion1.java | 7 ++++--- src/class173/Code03_Inversion2.java | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/class173/Code03_Inversion1.java b/src/class173/Code03_Inversion1.java index 3049a2fc2..590b500de 100644 --- a/src/class173/Code03_Inversion1.java +++ b/src/class173/Code03_Inversion1.java @@ -3,11 +3,12 @@ // 区间逆序对,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5046 // 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是无法通过所有测试用例 +// java实现的逻辑一定是正确的,但是无法通过测试 // 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 -// 甚至C++也需要考虑优化常数,想通过用C++实现,正式比赛不卡常 -// 本节课Code03_Inversion2文件就是C++的实现 +// 想通过用C++实现,本节课Code03_Inversion2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 +// 本题对C++来说,卡常的程度较浅,现在正式比赛是不卡常的 + import java.io.IOException; import java.io.InputStream; diff --git a/src/class173/Code03_Inversion2.java b/src/class173/Code03_Inversion2.java index de1612223..9260b6088 100644 --- a/src/class173/Code03_Inversion2.java +++ b/src/class173/Code03_Inversion2.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P5046 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -// 注意本题需要优化常数,虽然程度不深,正式比赛不卡常 +// 本题对C++来说,卡常的程度较浅,现在正式比赛是不卡常的 //#include // From e0078d5357f588b31af3c9f749c99d0ec2682a06 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 10:23:21 +0800 Subject: [PATCH 0312/1170] modify code --- src/class173/Code03_Inversion1.java | 20 +++++++++----------- src/class173/Code03_Inversion2.java | 19 ++++++++++--------- src/class173/Code04_FutureDiary1.java | 9 +++++++++ 3 files changed, 28 insertions(+), 20 deletions(-) create mode 100644 src/class173/Code04_FutureDiary1.java diff --git a/src/class173/Code03_Inversion1.java b/src/class173/Code03_Inversion1.java index 590b500de..eeff59197 100644 --- a/src/class173/Code03_Inversion1.java +++ b/src/class173/Code03_Inversion1.java @@ -7,8 +7,6 @@ // 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code03_Inversion2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 -// 本题对C++来说,卡常的程度较浅,现在正式比赛是不卡常的 - import java.io.IOException; import java.io.InputStream; @@ -56,13 +54,13 @@ public static int sum(int i) { return ret; } - public static int calc(int i, int j, int li, int ri, int lj, int rj) { + public static int calc(int x, int xl, int xr, int y, int yl, int yr) { int ans = 0; - for (int p1 = bl[i], p2 = bl[j] - 1, tmp = 0; p1 <= br[i]; p1++) { - if (li <= sortv[p1][1] && sortv[p1][1] <= ri) { - while (p2 + 1 <= br[j] && sortv[p1][0] > sortv[p2 + 1][0]) { + for (int p1 = bl[x], p2 = bl[y] - 1, tmp = 0; p1 <= br[x]; p1++) { + if (xl <= sortv[p1][1] && sortv[p1][1] <= xr) { + while (p2 + 1 <= br[y] && sortv[p1][0] > sortv[p2 + 1][0]) { p2++; - if (lj <= sortv[p2][1] && sortv[p2][1] <= rj) { + if (yl <= sortv[p2][1] && sortv[p2][1] <= yr) { tmp++; } } @@ -80,7 +78,7 @@ public static long query(int l, int r) { if (l == bl[lb]) { ans = pre[r]; } else { - ans = pre[r] - pre[l - 1] - calc(lb, lb, 1, l - 1, l, r); + ans = pre[r] - pre[l - 1] - calc(lb, 1, l - 1, lb, l, r); } } else { for (int i = l; i <= br[lb]; i++) { @@ -89,13 +87,13 @@ public static long query(int l, int r) { for (int i = bl[rb]; i <= r; i++) { ans += br[rb - 1] - bl[lb + 1] + 1 - cnt[rb - 1][arr[i]] + cnt[lb][arr[i]]; } - ans += dp[lb + 1][rb - 1] + nxt[l] + pre[r] + calc(lb, rb, l, br[lb], bl[rb], r); + ans += dp[lb + 1][rb - 1] + nxt[l] + pre[r] + calc(lb, l, br[lb], rb, bl[rb], r); } return ans; } + // 注意调整块长 public static void prepare() { - // 注意调整块长 blen = (int) (Math.sqrt(n) / 2); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { @@ -141,7 +139,7 @@ public static void prepare() { } for (int len = 2; len <= bnum; len++) { for (int l = 1, r = l + len - 1; r <= bnum; l++, r++) { - dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, r, bl[l], br[l], bl[r], br[r]); + dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, bl[l], br[l], r, bl[r], br[r]); } } } diff --git a/src/class173/Code03_Inversion2.java b/src/class173/Code03_Inversion2.java index 9260b6088..6085084c5 100644 --- a/src/class173/Code03_Inversion2.java +++ b/src/class173/Code03_Inversion2.java @@ -4,7 +4,8 @@ // 测试链接 : https://www.luogu.com.cn/problem/P5046 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -// 本题对C++来说,卡常的程度较浅,现在正式比赛是不卡常的 +// 这道题比较卡常,C++实现也需要优化常数,比如重写读入函数 +// 正式比赛不卡常! //#include // @@ -72,13 +73,13 @@ // return ret; //} // -//inline int calc(int i, int j, int li, int ri, int lj, int rj) { +//inline int calc(int x, int xl, int xr, int y, int yl, int yr) { // int ans = 0; -// for (int p1 = bl[i], p2 = bl[j] - 1, tmp = 0; p1 <= br[i]; p1++) { -// if (li <= sortv[p1].i && sortv[p1].i <= ri) { -// while (p2 + 1 <= br[j] && sortv[p1].v > sortv[p2 + 1].v) { +// for (int p1 = bl[x], p2 = bl[y] - 1, tmp = 0; p1 <= br[x]; p1++) { +// if (xl <= sortv[p1].i && sortv[p1].i <= xr) { +// while (p2 + 1 <= br[y] && sortv[p1].v > sortv[p2 + 1].v) { // p2++; -// if (lj <= sortv[p2].i && sortv[p2].i <= rj) { +// if (yl <= sortv[p2].i && sortv[p2].i <= yr) { // tmp++; // } // } @@ -95,7 +96,7 @@ // if (l == bl[lb]) { // ans = pre[r]; // } else { -// ans = pre[r] - pre[l - 1] - calc(lb, lb, 1, l - 1, l, r); +// ans = pre[r] - pre[l - 1] - calc(lb, 1, l - 1, lb, l, r); // } // } else { // for (int i = l; i <= br[lb]; i++) { @@ -104,7 +105,7 @@ // for (int i = bl[rb]; i <= r; i++) { // ans += br[rb - 1] - bl[lb + 1] + 1 - cnt[rb - 1][arr[i]] + cnt[lb][arr[i]]; // } -// ans += dp[lb + 1][rb - 1] + nxt[l] + pre[r] + calc(lb, rb, l, br[lb], bl[rb], r); +// ans += dp[lb + 1][rb - 1] + nxt[l] + pre[r] + calc(lb, l, br[lb], rb, bl[rb], r); // } // return ans; //} @@ -153,7 +154,7 @@ // } // for (int len = 2; len <= bnum; len++) { // for (int l = 1, r = l + len - 1; r <= bnum; l++, r++) { -// dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, r, bl[l], br[l], bl[r], br[r]); +// dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, bl[l], br[l], r, bl[r], br[r]); // } // } //} diff --git a/src/class173/Code04_FutureDiary1.java b/src/class173/Code04_FutureDiary1.java new file mode 100644 index 000000000..6d314a6a3 --- /dev/null +++ b/src/class173/Code04_FutureDiary1.java @@ -0,0 +1,9 @@ +package class173; + +// 未来日记,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4119 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code04_FutureDiary1 { + +} From cf0814cf2e2c958acd648d58683f2175eb59123f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 10:31:57 +0800 Subject: [PATCH 0313/1170] modify code --- src/class173/Code01_Sequence1.java | 8 ++++---- src/class173/Code02_Poker1.java | 20 ++++++++++---------- src/class173/Code03_Inversion1.java | 6 +++--- src/class173/Code03_Inversion2.java | 8 ++++---- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/class173/Code01_Sequence1.java b/src/class173/Code01_Sequence1.java index bb7dfc358..efb7bcf36 100644 --- a/src/class173/Code01_Sequence1.java +++ b/src/class173/Code01_Sequence1.java @@ -24,7 +24,7 @@ public class Code01_Sequence1 { public static int cntq = 0; public static long[] tim = new long[MAXN]; - public static long[] sort = new long[MAXN]; + public static long[] sortv = new long[MAXN]; public static int blen, bnum; public static int[] bi = new int[MAXN]; @@ -54,9 +54,9 @@ public static void innerAdd(int l, int r, long v) { tim[i] += v; } for (int i = bl[bi[l]]; i <= br[bi[l]]; i++) { - sort[i] = tim[i]; + sortv[i] = tim[i]; } - Arrays.sort(sort, bl[bi[l]], br[bi[l]] + 1); + Arrays.sort(sortv, bl[bi[l]], br[bi[l]] + 1); } public static void add(int l, int r, long v) { @@ -90,7 +90,7 @@ public static int getCnt(int i, long v) { int l = bl[i], r = br[i], m, pos = br[i] + 1; while (l <= r) { m = (l + r) >> 1; - if (sort[m] >= v) { + if (sortv[m] >= v) { pos = m; r = m - 1; } else { diff --git a/src/class173/Code02_Poker1.java b/src/class173/Code02_Poker1.java index 381d4eeac..481c23d55 100644 --- a/src/class173/Code02_Poker1.java +++ b/src/class173/Code02_Poker1.java @@ -18,7 +18,7 @@ public class Code02_Poker1 { public static int n, m; public static int[] arr = new int[MAXN]; - public static int[] sort = new int[MAXN]; + public static int[] sortv = new int[MAXN]; public static int blen, bnum; public static int[] bi = new int[MAXN]; @@ -31,9 +31,9 @@ public static void innerAdd(int l, int r, int v) { arr[i] += v; } for (int i = bl[bi[l]]; i <= br[bi[l]]; i++) { - sort[i] = arr[i]; + sortv[i] = arr[i]; } - Arrays.sort(sort, bl[bi[l]], br[bi[l]] + 1); + Arrays.sort(sortv, bl[bi[l]], br[bi[l]] + 1); } public static void add(int l, int r, int v) { @@ -62,7 +62,7 @@ public static int getMin(int l, int r) { ans = Math.min(ans, arr[i] + lazy[rb]); } for (int i = lb + 1; i <= rb - 1; i++) { - ans = Math.min(ans, sort[bl[i]] + lazy[i]); + ans = Math.min(ans, sortv[bl[i]] + lazy[i]); } } return ans; @@ -82,7 +82,7 @@ public static int getMax(int l, int r) { ans = Math.max(ans, arr[i] + lazy[rb]); } for (int i = lb + 1; i <= rb - 1; i++) { - ans = Math.max(ans, sort[br[i]] + lazy[i]); + ans = Math.max(ans, sortv[br[i]] + lazy[i]); } } return ans; @@ -91,16 +91,16 @@ public static int getMax(int l, int r) { public static int getCnt(int i, int v) { v -= lazy[i]; int l = bl[i], r = br[i]; - if (sort[l] > v) { + if (sortv[l] > v) { return 0; } - if (sort[r] <= v) { + if (sortv[r] <= v) { return r - l + 1; } int m, find = l; while (l <= r) { m = (l + r) / 2; - if (sort[m] <= v) { + if (sortv[m] <= v) { find = m; l = m + 1; } else { @@ -167,10 +167,10 @@ public static void prepare() { br[i] = Math.min(i * blen, n); } for (int i = 1; i <= n; i++) { - sort[i] = arr[i]; + sortv[i] = arr[i]; } for (int i = 1; i <= bnum; i++) { - Arrays.sort(sort, bl[i], br[i] + 1); + Arrays.sort(sortv, bl[i], br[i] + 1); } } diff --git a/src/class173/Code03_Inversion1.java b/src/class173/Code03_Inversion1.java index eeff59197..7972793a1 100644 --- a/src/class173/Code03_Inversion1.java +++ b/src/class173/Code03_Inversion1.java @@ -30,7 +30,7 @@ public class Code03_Inversion1 { public static int[] tree = new int[MAXN]; public static int[] pre = new int[MAXN]; - public static int[] nxt = new int[MAXN]; + public static int[] suf = new int[MAXN]; public static int[][] cnt = new int[MAXB][MAXN]; public static long[][] dp = new long[MAXB][MAXB]; @@ -87,7 +87,7 @@ public static long query(int l, int r) { for (int i = bl[rb]; i <= r; i++) { ans += br[rb - 1] - bl[lb + 1] + 1 - cnt[rb - 1][arr[i]] + cnt[lb][arr[i]]; } - ans += dp[lb + 1][rb - 1] + nxt[l] + pre[r] + calc(lb, l, br[lb], rb, bl[rb], r); + ans += dp[lb + 1][rb - 1] + suf[l] + pre[r] + calc(lb, l, br[lb], rb, bl[rb], r); } return ans; } @@ -123,7 +123,7 @@ public static void prepare() { } for (int j = br[i]; j >= bl[i]; j--) { if (j != br[i]) { - nxt[j] = nxt[j + 1] + sum(arr[j]); + suf[j] = suf[j + 1] + sum(arr[j]); } add(arr[j], 1); } diff --git a/src/class173/Code03_Inversion2.java b/src/class173/Code03_Inversion2.java index 6085084c5..9920e4477 100644 --- a/src/class173/Code03_Inversion2.java +++ b/src/class173/Code03_Inversion2.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P5046 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -// 这道题比较卡常,C++实现也需要优化常数,比如重写读入函数 +// 这道题比较卡常,C++实现也需要优化常数,比如快读 // 正式比赛不卡常! //#include @@ -49,7 +49,7 @@ // //int tree[MAXN]; //int pre[MAXN]; -//int nxt[MAXN]; +//int suf[MAXN]; //int cnt[MAXB][MAXN]; //long long dp[MAXB][MAXB]; // @@ -105,7 +105,7 @@ // for (int i = bl[rb]; i <= r; i++) { // ans += br[rb - 1] - bl[lb + 1] + 1 - cnt[rb - 1][arr[i]] + cnt[lb][arr[i]]; // } -// ans += dp[lb + 1][rb - 1] + nxt[l] + pre[r] + calc(lb, l, br[lb], rb, bl[rb], r); +// ans += dp[lb + 1][rb - 1] + suf[l] + pre[r] + calc(lb, l, br[lb], rb, bl[rb], r); // } // return ans; //} @@ -138,7 +138,7 @@ // } // for (int j = br[i]; j >= bl[i]; j--) { // if (j != br[i]) { -// nxt[j] = nxt[j + 1] + sum(arr[j]); +// suf[j] = suf[j + 1] + sum(arr[j]); // } // add(arr[j], 1); // } From 226700a0055af34a8c2cbdc0edd93bb53125bb7e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 12:31:57 +0800 Subject: [PATCH 0314/1170] modify code --- src/class173/Code03_Inversion2.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/class173/Code03_Inversion2.java b/src/class173/Code03_Inversion2.java index 9920e4477..67de915d9 100644 --- a/src/class173/Code03_Inversion2.java +++ b/src/class173/Code03_Inversion2.java @@ -11,19 +11,21 @@ // //using namespace std; // -//char buf[1 << 20], *p1 = buf, *p2 = buf, obuf[1 << 20], *o = obuf; +//char buf[1000000], *p1 = buf, *p2 = buf; // -//inline char gc() { -// return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; +//inline char getChar() { +// return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++; //} // //inline int read() { // int s = 0; -// char c = gc(); -// while (!isdigit(c)) c = gc(); +// char c = getChar(); +// while (!isdigit(c)) { +// c = getChar(); +// } // while (isdigit(c)) { // s = s * 10 + c - '0'; -// c = gc(); +// c = getChar(); // } // return s; //} From 0c651a58cfaa367722bd40aaa735b18250dd137c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 14:13:36 +0800 Subject: [PATCH 0315/1170] modify code --- ...\347\212\266\351\223\276\350\241\250.pptx" | Bin 54183 -> 54184 bytes src/class173/Code04_FutureDiary1.java | 9 --------- 2 files changed, 9 deletions(-) delete mode 100644 src/class173/Code04_FutureDiary1.java diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243172\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2301-\345\235\227\347\212\266\346\225\260\347\273\204\343\200\201\345\235\227\347\212\266\351\223\276\350\241\250.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243172\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2301-\345\235\227\347\212\266\346\225\260\347\273\204\343\200\201\345\235\227\347\212\266\351\223\276\350\241\250.pptx" index 8fc03065a10e9d01e2f2896e6b416b64a69abc1a..158b950809c1bebcefda8132bba40e5418d5ddda 100644 GIT binary patch delta 2962 zcmZWrc|4SB8-5vEqK$>mfecs=5KNJe;KNOUpoi&O}6oMc= zC^MwLL{O9i#fq>3$1)OSIosDGb%yg23K@j)WFri!5Z`7nz-~eT&367Zgrd0Fl@}RY z5e@^CWf6ZK1o4rQ=UN}Y>ZaOo^|n3)gt4(~u(N?5UN)p76EfSK*b@(x0sHdKyGSL7 z1-6MFjyew5n(FU4H@t1M09#)B=uZ}UKP>e1*cP7+0oY>X2Ue(V$_uJCF#9i?=6(Rs zv@JRiFcqf*>mCA_p!LEAw&w`IgzOBF#Opj0J8n49k%6qq^;iMIEyeMHESp``H^d>w zf!N9;99hb`_)G^syy69xNcTR9aH%qWD2`36_vre5w^zDss;Csz!hb)H;5t%{dUJiA z3xaU422lbo4w5FE6|oeJnRI@*@Yhh%fb*D)NTB0=Wue1_THil{9`A`_b_|BN%5q;( z5>zrRc#tT*J-F#WV4Tuc_pGNY>cJoNkNgwYV8+tH)64-EZf8Q|G-4#>~Rit^{MbZ6sy+P|Yia zs_OZ~vH;=JLS|{%DMc-n@7CNhmV8w-Id@H}YCq>aXw|@zed#XN%__7()y4lKPjFoO zT&&jqDI*ybRf0>vF%(0h9v36<GkPe6){LZsQG5pjyinbM2BAf7l;*<%4kJ2KD9 z=Oy+Flv(|8O)p&!R#UowX_Qc1#7#Se-$)Ysa+XhWN=tC3tn@+e>3a0>!DX*&Fj9t(k=T1 z=|Xou8u4GW4d1!P?B?J5w(P;$lO09G{uaG{Tv)SGWnUPPHv5~IjnXgWj~4A$G~658ZrfrsVU`#8~FI#CN^E(P{NiZR^?Lif4h9l_{Es zDW(&p95Rf_Xf%Xwz7HkXm`1j89sknOg(j-djm2`ODET+udFE`1@DEzx%Sn81BV|vP zyZu&yX2IE5FdDFRY-xOKM*3YH`>%s*K8cGN_IXBuVoSmz#=erv$H^yaeDNk(vqD7f#@i0GLtajw zbX4`93IS-%*qbI+?+QJNt~dTgO*?tDyg~L+HFuDL`um4VP9n6GltKE*+@RD7-=qsd z-uwi&m(#gXmc!XKBb5gD*`UuKEQ`G6V%Dne@Sb*F^+e}&_!yiDib2Jf$KKr)kw18` zq>Kx9-c}n`hMTp|+jm&zZSS4RBJ%!`k*o*)^WUO74lJ_eQBT%&Lnui&GJV zxw=)_fCD~+j5nynhv<7OyFHGid7R7qdMB7bIhT?>enM(SXJm1iBQUCfK%icT%I$ql zqrQp?H@~@-Ou0ONXJO{d&Rn7g9$j!@rTN3WNu%$!{StdZPkP2EX2Nn`T8lkS6gpPe zb8=1*Cr92<+X@+<>?^KWiAK&QwS0&=@Xje5TltJydpdk(vKX(Eurz;NV~AZ|APQWBFvGtg|Mn)`;pU>o~>vm!~;REVP>cVwd|4( z=wlxf^uX!8gV^)0iz2Mn%@6NN1`TsLIT}zS(su)DNd^YAMMmBagqI|VaFC3L$o*T^ z&u@n=Qf(hAqq#J!Nff7=Qx@4A-(pa^(c@uYjw#m#=8iNvQU_JGCI)oD{1>{&@?O6% zLZVcyArf6`O^}#XdkBe>wP1cn9f*E)W(a=2&IXA~b zW0VGfO>AJ&uze%Qo!rRgeQN|f{U$b+-vqF+4GiSI+RWyBZ3Z0e7B-gK01^JYADCwQznBZ+HN5eRfh{|LE};X| z_Ob)iuhD7pOK*c8 z?Z-o~7hV>2WeOm=67=%5HP$!t?Dt=F=J1oBbi~+oodhhv5Jz+yU-$pzON7lB3djv3 z=V)Ew2UwOVh8j%(>f9gdkhrwhH(1qlpG*I$ z`vm)REAXwq3FxcT3s{CJjtWi(Vp2Nmrq?VWyFU4w^PANHmO&);SA%;Q5L}lb4ht{^ zke7vFVo(ivz`>5?#!|zlm>7=la2%6epadB(4w3oc=^x5v7E2r!?_skvivcUN2lynh zwoU`4^lV358LVyDS`HXoy%Gqvtrx>#1@GyVL!LZ)F(|Pb2-d6-6}PkIX4MZt`&j=~ L5eQ0qvHtWw5(GE{ delta 2944 zcmZXWc|4R|8^>pibr>T1*e1(_WX+N-B)e$JR>G&yLSAD@$um^eM7f10OBh)yP0~h> z%-EN~3@KYFC3>?&O(A ziDp(|M3E>~gp`oWaKv$RuE*+GjyM!N2;dLjjL6dJRVK{9Zip;G#$v zK$bTLaKp+GX+_TU0i?N07y3u;IV?i*v23xs5e+RHcfbn@%5Ln1JF0-bpjHHT0;f=D zMnlowfY#O==h(>Yr~_z4UBYiE41T6CG+?LrYz)L!6MwKn&0Rd8Ya@$kHWu8*?n`$M z9bU-r)PwZxfgR)Ubwk^^7ihvR#&Gd<&fJ9yO4{E8@5}1|8D{T$@`6hIUYZ-`P;X$i zJsb{iXWbk^M?>Fz!8SYm2ryf%;EzJ`v7V*Z_zvGJT!yGLtpHHVY!UkN`fC+@3PZXOh?bgz@hD$5FuF#Wdex2f-+A}y9pVtL!N_AD9shulkBXD)!M~#mVKG9*4!EF|t-c++7Lr;s z_~0|bPIs)|d0gTx9!bqJ?NDADt!?5tm@MpT6p}M%YHKO2KOidbeZVpUdy1xW#Ne3v zp**fk+`b8<=W!D4&~53cXPcbA1jj~9rKn&2z-L)37QP)Sm+KNXTJ;M|J650`%t^Ho z^EMcZ^XPJcjy6UGpVd8np7_|}T7K zGq_Tp7jID;A4&QT@j~obp_yrl$t>whIB8--sX%+tQaufe4!9^`H7=XYHNvM zR!8!j&(=U79=(gBo+mfnwW&2N5yXoJMPu6sJdz;$Y zwZ^Gg^=YWsqjFP7efD0GZ$`qX(ALDqo}%r69|i4Bi}%WIqPp20)nJNIZUu|K_{XrdV?I=r>q+}; z&2IUw{+!tJ#KCjh$hfZ~*AuIzu6$?^P*DpDIGdYRUbm>{^uI8430=_k+c>6ssc!mV zqx{S)#b-7+rr)P-Wn!L8cwbIXvr8MgX<2nFS5ftZIw>XV{x_Mxri}ixZ72x%Po~LgZRLht+GFAY*gr=O^uL?oM@*&r7L_giQa} zc#nNNR#~C2AZpRc*|{YqCcVLWcQFG>lxtMH)K)oZMvTBb$(Nd3X6dw8<+7G{r+lUEV@U7t*wF(O^XRP4c3#RH~0d+0z0Jy-W6Ai#C8=u_! z%ZGF>E{4?Hfsk`aQ#iZ$$j+4OKt?>tUOd0Ctlr`y$k?G!48m%w@?aJ z;F1od{jh6acOmsT%Vi}4yLOi?u^Ionpe<9%2uLOKNFSs+@VEnRt9nb_U*I+**XzUk z8>u&eBbI6mM^CCb9CNAmaGa!qbvzBk0Gb7?-=aCf@f*z@j)Vr_yVd}7?G`Mw)&M+a zjcl#F5oi+|nhdnB3DmyQ#O9Wp0B6+9*2v938{5!8?Mp3eX0Zh@daZ1&pcQDZe$#B) zfR@na1ot1;j)mshOyRM1`!CG{o{wzIv5-v%U=lliF<5B+r>4`%*77?6_v$yzmJYNe zI_T{s9rUl=W&X$A9Mc8<9kX66>S-tf@{5vS9ZfW()+`{ues%<_UpQNGArLKC1VW5; zfZ4xVNTFK^?t0y86}9fgZTPArms8hRr>9o-PoE`J^_wp#7SzP_h{N?da`6_zEZ^|| z)k}mddz9esjXVOaWD>f{5JQb70(ZercW8X(a2l)IG3h_6N~3e$fKQVFs%{-1 zPz+gBpUM2`n}&`ulz7*l1Y$wD9>OujQ9)V2Ol63}+aF|LktNU~1EiN>Vo?nRfN*8e zEGu+^iA63$2~2ha;-!FaC`Ch4OaYi$VNqg`L@%4tx(leVUXUl1^`JE=2*`;dA>`tK uusI+)(}c-}o;eMC*|N diff --git a/src/class173/Code04_FutureDiary1.java b/src/class173/Code04_FutureDiary1.java deleted file mode 100644 index 6d314a6a3..000000000 --- a/src/class173/Code04_FutureDiary1.java +++ /dev/null @@ -1,9 +0,0 @@ -package class173; - -// 未来日记,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P4119 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -public class Code04_FutureDiary1 { - -} From f315b6efaa97d6c48359232ea1550dfc62d96f1a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 17:54:45 +0800 Subject: [PATCH 0316/1170] modify code --- src/class173/Code04_Magnet1.java | 176 +++++++++++++++++++++++++++++++ src/class173/Code04_Magnet2.java | 118 +++++++++++++++++++++ 2 files changed, 294 insertions(+) create mode 100644 src/class173/Code04_Magnet1.java create mode 100644 src/class173/Code04_Magnet2.java diff --git a/src/class173/Code04_Magnet1.java b/src/class173/Code04_Magnet1.java new file mode 100644 index 000000000..ff11f2be0 --- /dev/null +++ b/src/class173/Code04_Magnet1.java @@ -0,0 +1,176 @@ +package class173; + +// 磁力块,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P10590 +// java实现的逻辑一定是正确的,但是无法通过测试 +// 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code04_Magnet2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code04_Magnet1 { + + public static class Node { + int x, y, m, p; + long range; + long dist; + + public Node(int x_, int y_, int m_, int p_, int range_) { + x = x_; + y = y_; + m = m_; + p = p_; + range = range_; + } + } + + public static long pow2(long x) { + return x * x; + } + + public static long dist(Node a, Node b) { + return pow2(a.x - b.x) + pow2(a.y - b.y); + } + + public static int MAXN = 300001; + public static int MAXB = 1001; + public static int n; + + public static Node[] arr = new Node[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + public static int[] maxm = new int[MAXB]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] que = new int[MAXN]; + + public static void prepare() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + Arrays.sort(arr, 1, n + 1, (a, b) -> a.m - b.m); + for (int i = 1; i <= bnum; i++) { + maxm[i] = arr[br[i]].m; + Arrays.sort(arr, bl[i], br[i] + 1, (a, b) -> a.dist <= b.dist ? -1 : 1); + } + } + + public static int bfs() { + int ans = 0; + vis[0] = true; + int l = 1, r = 1; + que[r++] = 0; + while (l < r) { + int cur = que[l++]; + int block = bnum + 1; + for (int i = 1; i <= bnum; i++) { + if (maxm[i] > arr[cur].p) { + block = i; + break; + } + } + for (int i = 1; i < block; i++) { + while (bl[i] <= br[i] && dist(arr[0], arr[bl[i]]) <= arr[cur].range) { + if (!vis[bl[i]]) { + ans++; + que[r++] = bl[i]; + vis[bl[i]] = true; + } + bl[i]++; + } + } + if (block <= bnum) { + for (int i = bl[block]; i <= br[block]; i++) { + if (arr[i].m <= arr[cur].p && dist(arr[0], arr[i]) <= arr[cur].range && !vis[i]) { + ans++; + que[r++] = i; + vis[i] = true; + } + } + } + } + return ans; + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + int x = in.nextInt(); + int y = in.nextInt(); + int m = 0; + int p = in.nextInt(); + int range = in.nextInt(); + arr[0] = new Node(x, y, 0, p, range); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + x = in.nextInt(); + y = in.nextInt(); + m = in.nextInt(); + p = in.nextInt(); + range = in.nextInt(); + arr[i] = new Node(x, y, m, p, range); + } + for (int i = 0; i <= n; i++) { + arr[i].range = pow2(arr[i].range); + arr[i].dist = dist(arr[0], arr[i]); + } + prepare(); + out.println(bfs()); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class173/Code04_Magnet2.java b/src/class173/Code04_Magnet2.java new file mode 100644 index 000000000..183378ed4 --- /dev/null +++ b/src/class173/Code04_Magnet2.java @@ -0,0 +1,118 @@ +package class173; + +// 磁力块,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P10590 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int x, y, m, p; +// long long range, dist; +//}; +// +//bool cmp1(Node a, Node b) { +// return a.m < b.m; +//} +// +//bool cmp2(Node a, Node b) { +// return a.dist < b.dist; +//} +// +//const int MAXN = 300001; +//const int MAXB = 1001; +//int n; +//Node arr[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +//int maxm[MAXB]; +// +//bool vis[MAXN]; +//int que[MAXN]; +// +//inline long long pow2(long long x) { +// return x * x; +//} +// +//inline long long dist(Node a, Node b) { +// return pow2(1L * a.x - b.x) + pow2(1L * a.y - b.y); +//} +// +//void prepare() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } +// sort(arr + 1, arr + n + 1, cmp1); +// for (int i = 1; i <= bnum; i++) { +// maxm[i] = arr[br[i]].m; +// sort(arr + bl[i], arr + br[i] + 1, cmp2); +// } +//} +// +//int bfs() { +// int ans = 0; +// vis[0] = true; +// int l = 1, r = 1; +// que[r++] = 0; +// while (l < r) { +// int cur = que[l++]; +// int block = bnum + 1; +// for (int i = 1; i <= bnum; i++) { +// if (maxm[i] > arr[cur].p) { +// block = i; +// break; +// } +// } +// for (int i = 1; i < block; i++) { +// while (bl[i] <= br[i] && dist(arr[0], arr[bl[i]]) <= arr[cur].range) { +// if (!vis[bl[i]]) { +// ans++; +// que[r++] = bl[i]; +// vis[bl[i]] = true; +// } +// bl[i]++; +// } +// } +// if (block <= bnum) { +// for (int i = bl[block]; i <= br[block]; i++) { +// if (arr[i].m <= arr[cur].p && dist(arr[0], arr[i]) <= arr[cur].range && !vis[i]) { +// ans++; +// que[r++] = i; +// vis[i] = true; +// } +// } +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int x, y, m, p, range; +// cin >> x >> y >> p >> range >> n; +// arr[0] = {x, y, 0, p, range, 0}; +// for (int i = 1; i <= n; i++) { +// cin >> x >> y >> m >> p >> range; +// arr[i] = {x, y, m, p, range, 0}; +// } +// for (int i = 0; i <= n; i++) { +// arr[i].range = pow2(arr[i].range); +// arr[i].dist = dist(arr[0], arr[i]); +// } +// prepare(); +// cout << bfs(); +// return 0; +//} \ No newline at end of file From 635195122165b5f1b41f4d0d4195545a2f42c2aa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 18:14:37 +0800 Subject: [PATCH 0317/1170] modify code --- src/class173/Code04_Magnet1.java | 36 +++++++++++++------------------ src/class173/Code04_Magnet2.java | 37 ++++++++++++++------------------ 2 files changed, 31 insertions(+), 42 deletions(-) diff --git a/src/class173/Code04_Magnet1.java b/src/class173/Code04_Magnet1.java index ff11f2be0..973434922 100644 --- a/src/class173/Code04_Magnet1.java +++ b/src/class173/Code04_Magnet1.java @@ -40,7 +40,6 @@ public static long dist(Node a, Node b) { public static int MAXN = 300001; public static int MAXB = 1001; public static int n; - public static Node[] arr = new Node[MAXN]; public static int blen, bnum; @@ -76,29 +75,24 @@ public static int bfs() { que[r++] = 0; while (l < r) { int cur = que[l++]; - int block = bnum + 1; for (int i = 1; i <= bnum; i++) { if (maxm[i] > arr[cur].p) { - block = i; - break; - } - } - for (int i = 1; i < block; i++) { - while (bl[i] <= br[i] && dist(arr[0], arr[bl[i]]) <= arr[cur].range) { - if (!vis[bl[i]]) { - ans++; - que[r++] = bl[i]; - vis[bl[i]] = true; + for (int j = bl[i]; j <= br[i]; j++) { + if (arr[j].dist <= arr[cur].range && arr[j].m <= arr[cur].p && !vis[j]) { + vis[j] = true; + que[r++] = j; + ans++; + } } - bl[i]++; - } - } - if (block <= bnum) { - for (int i = bl[block]; i <= br[block]; i++) { - if (arr[i].m <= arr[cur].p && dist(arr[0], arr[i]) <= arr[cur].range && !vis[i]) { - ans++; - que[r++] = i; - vis[i] = true; + break; + } else { + while (bl[i] <= br[i] && dist(arr[0], arr[bl[i]]) <= arr[cur].range) { + if (!vis[bl[i]]) { + vis[bl[i]] = true; + que[r++] = bl[i]; + ans++; + } + bl[i]++; } } } diff --git a/src/class173/Code04_Magnet2.java b/src/class173/Code04_Magnet2.java index 183378ed4..15f4ca532 100644 --- a/src/class173/Code04_Magnet2.java +++ b/src/class173/Code04_Magnet2.java @@ -68,29 +68,24 @@ // que[r++] = 0; // while (l < r) { // int cur = que[l++]; -// int block = bnum + 1; // for (int i = 1; i <= bnum; i++) { // if (maxm[i] > arr[cur].p) { -// block = i; -// break; -// } -// } -// for (int i = 1; i < block; i++) { -// while (bl[i] <= br[i] && dist(arr[0], arr[bl[i]]) <= arr[cur].range) { -// if (!vis[bl[i]]) { -// ans++; -// que[r++] = bl[i]; -// vis[bl[i]] = true; +// for (int j = bl[i]; j <= br[i]; j++) { +// if (arr[j].dist <= arr[cur].range && arr[j].m <= arr[cur].p && !vis[j]) { +// vis[j] = true; +// que[r++] = j; +// ans++; +// } // } -// bl[i]++; -// } -// } -// if (block <= bnum) { -// for (int i = bl[block]; i <= br[block]; i++) { -// if (arr[i].m <= arr[cur].p && dist(arr[0], arr[i]) <= arr[cur].range && !vis[i]) { -// ans++; -// que[r++] = i; -// vis[i] = true; +// break; +// } else { +// while (bl[i] <= br[i] && dist(arr[0], arr[bl[i]]) <= arr[cur].range) { +// if (!vis[bl[i]]) { +// vis[bl[i]] = true; +// que[r++] = bl[i]; +// ans++; +// } +// bl[i]++; // } // } // } @@ -113,6 +108,6 @@ // arr[i].dist = dist(arr[0], arr[i]); // } // prepare(); -// cout << bfs(); +// cout << bfs() << '\n'; // return 0; //} \ No newline at end of file From 67db4be3abf271e565e8cc2f7f2f538c5afb3cd1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 18:19:42 +0800 Subject: [PATCH 0318/1170] modify code --- src/class173/Code04_Magnet1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class173/Code04_Magnet1.java b/src/class173/Code04_Magnet1.java index 973434922..e12990bef 100644 --- a/src/class173/Code04_Magnet1.java +++ b/src/class173/Code04_Magnet1.java @@ -2,6 +2,7 @@ // 磁力块,java版 // 测试链接 : https://www.luogu.com.cn/problem/P10590 +// 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是无法通过测试 // 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code04_Magnet2文件就是C++的实现 From 91462ab0fe6dc13bad763dcd99c654daba609cf1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 19:16:33 +0800 Subject: [PATCH 0319/1170] modify code --- src/class173/Code04_Magnet1.java | 36 +++++++++++++++++++++----------- src/class173/Code04_Magnet2.java | 24 +++++++++------------ 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/class173/Code04_Magnet1.java b/src/class173/Code04_Magnet1.java index e12990bef..93de5a3ba 100644 --- a/src/class173/Code04_Magnet1.java +++ b/src/class173/Code04_Magnet1.java @@ -2,7 +2,6 @@ // 磁力块,java版 // 测试链接 : https://www.luogu.com.cn/problem/P10590 -// 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是无法通过测试 // 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code04_Magnet2文件就是C++的实现 @@ -13,6 +12,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Arrays; +import java.util.Comparator; public class Code04_Magnet1 { @@ -30,16 +30,25 @@ public Node(int x_, int y_, int m_, int p_, int range_) { } } - public static long pow2(long x) { - return x * x; + public static class Cmp1 implements Comparator { + @Override + public int compare(Node a, Node b) { + return a.m - b.m; + } } - public static long dist(Node a, Node b) { - return pow2(a.x - b.x) + pow2(a.y - b.y); + public static class Cmp2 implements Comparator { + @Override + public int compare(Node a, Node b) { + return a.dist <= b.dist ? -1 : 1; + } } - public static int MAXN = 300001; - public static int MAXB = 1001; + public static Cmp1 cmp1 = new Cmp1(); + public static Cmp2 cmp2 = new Cmp2(); + + public static int MAXN = 250001; + public static int MAXB = 501; public static int n; public static Node[] arr = new Node[MAXN]; @@ -62,10 +71,10 @@ public static void prepare() { bl[i] = (i - 1) * blen + 1; br[i] = Math.min(i * blen, n); } - Arrays.sort(arr, 1, n + 1, (a, b) -> a.m - b.m); + Arrays.sort(arr, 1, n + 1, cmp1); for (int i = 1; i <= bnum; i++) { maxm[i] = arr[br[i]].m; - Arrays.sort(arr, bl[i], br[i] + 1, (a, b) -> a.dist <= b.dist ? -1 : 1); + Arrays.sort(arr, bl[i], br[i] + 1, cmp2); } } @@ -87,7 +96,7 @@ public static int bfs() { } break; } else { - while (bl[i] <= br[i] && dist(arr[0], arr[bl[i]]) <= arr[cur].range) { + while (bl[i] <= br[i] && arr[bl[i]].dist <= arr[cur].range) { if (!vis[bl[i]]) { vis[bl[i]] = true; que[r++] = bl[i]; @@ -119,9 +128,12 @@ public static void main(String[] args) throws IOException { range = in.nextInt(); arr[i] = new Node(x, y, m, p, range); } + long xd, yd; for (int i = 0; i <= n; i++) { - arr[i].range = pow2(arr[i].range); - arr[i].dist = dist(arr[0], arr[i]); + arr[i].range = arr[i].range * arr[i].range; + xd = arr[0].x - arr[i].x; + yd = arr[0].y - arr[i].y; + arr[i].dist = xd * xd + yd * yd; } prepare(); out.println(bfs()); diff --git a/src/class173/Code04_Magnet2.java b/src/class173/Code04_Magnet2.java index 15f4ca532..79314355a 100644 --- a/src/class173/Code04_Magnet2.java +++ b/src/class173/Code04_Magnet2.java @@ -11,7 +11,8 @@ // //struct Node { // int x, y, m, p; -// long long range, dist; +// long long range; +// long long dist; //}; // //bool cmp1(Node a, Node b) { @@ -22,8 +23,8 @@ // return a.dist < b.dist; //} // -//const int MAXN = 300001; -//const int MAXB = 1001; +//const int MAXN = 250001; +//const int MAXB = 501; //int n; //Node arr[MAXN]; // @@ -36,14 +37,6 @@ //bool vis[MAXN]; //int que[MAXN]; // -//inline long long pow2(long long x) { -// return x * x; -//} -// -//inline long long dist(Node a, Node b) { -// return pow2(1L * a.x - b.x) + pow2(1L * a.y - b.y); -//} -// //void prepare() { // blen = (int)sqrt(n); // bnum = (n + blen - 1) / blen; @@ -79,7 +72,7 @@ // } // break; // } else { -// while (bl[i] <= br[i] && dist(arr[0], arr[bl[i]]) <= arr[cur].range) { +// while (bl[i] <= br[i] && arr[bl[i]].dist <= arr[cur].range) { // if (!vis[bl[i]]) { // vis[bl[i]] = true; // que[r++] = bl[i]; @@ -103,9 +96,12 @@ // cin >> x >> y >> m >> p >> range; // arr[i] = {x, y, m, p, range, 0}; // } +// long long xd, yd; // for (int i = 0; i <= n; i++) { -// arr[i].range = pow2(arr[i].range); -// arr[i].dist = dist(arr[0], arr[i]); +// arr[i].range = arr[i].range * arr[i].range; +// xd = arr[0].x - arr[i].x; +// yd = arr[0].y - arr[i].y; +// arr[i].dist = xd * xd + yd * yd; // } // prepare(); // cout << bfs() << '\n'; From ab070af6b48a059df05419176b3fa4bce5c3d040 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 19:19:30 +0800 Subject: [PATCH 0320/1170] modify code --- src/class173/Code04_Magnet1.java | 4 ++-- src/class173/Code04_Magnet2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class173/Code04_Magnet1.java b/src/class173/Code04_Magnet1.java index 93de5a3ba..54ce758cb 100644 --- a/src/class173/Code04_Magnet1.java +++ b/src/class173/Code04_Magnet1.java @@ -47,8 +47,8 @@ public int compare(Node a, Node b) { public static Cmp1 cmp1 = new Cmp1(); public static Cmp2 cmp2 = new Cmp2(); - public static int MAXN = 250001; - public static int MAXB = 501; + public static int MAXN = 300001; + public static int MAXB = 601; public static int n; public static Node[] arr = new Node[MAXN]; diff --git a/src/class173/Code04_Magnet2.java b/src/class173/Code04_Magnet2.java index 79314355a..99604c0ea 100644 --- a/src/class173/Code04_Magnet2.java +++ b/src/class173/Code04_Magnet2.java @@ -23,8 +23,8 @@ // return a.dist < b.dist; //} // -//const int MAXN = 250001; -//const int MAXB = 501; +//const int MAXN = 300001; +//const int MAXB = 601; //int n; //Node arr[MAXN]; // From 66a8124c6b4e005a5c63ae7b0b55ed11cdb576ae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 19:24:33 +0800 Subject: [PATCH 0321/1170] modify code --- src/class173/Code01_Sequence2.java | 2 +- src/class173/Code04_Magnet1.java | 15 +++++++-------- src/class173/Code04_Magnet2.java | 19 +++++++++---------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/class173/Code01_Sequence2.java b/src/class173/Code01_Sequence2.java index cd88f2bd1..006c649d2 100644 --- a/src/class173/Code01_Sequence2.java +++ b/src/class173/Code01_Sequence2.java @@ -13,7 +13,7 @@ // int op, x, t, v, q; //}; // -//bool EventCmp(Event a, Event b) { +//bool EventCmp(Event &a, Event &b) { // return a.x != b.x ? a.x < b.x : a.t < b.t; //} // diff --git a/src/class173/Code04_Magnet1.java b/src/class173/Code04_Magnet1.java index 54ce758cb..7dc61a940 100644 --- a/src/class173/Code04_Magnet1.java +++ b/src/class173/Code04_Magnet1.java @@ -95,15 +95,14 @@ public static int bfs() { } } break; - } else { - while (bl[i] <= br[i] && arr[bl[i]].dist <= arr[cur].range) { - if (!vis[bl[i]]) { - vis[bl[i]] = true; - que[r++] = bl[i]; - ans++; - } - bl[i]++; + } + while (bl[i] <= br[i] && arr[bl[i]].dist <= arr[cur].range) { + if (!vis[bl[i]]) { + vis[bl[i]] = true; + que[r++] = bl[i]; + ans++; } + bl[i]++; } } } diff --git a/src/class173/Code04_Magnet2.java b/src/class173/Code04_Magnet2.java index 99604c0ea..38148ac8a 100644 --- a/src/class173/Code04_Magnet2.java +++ b/src/class173/Code04_Magnet2.java @@ -15,11 +15,11 @@ // long long dist; //}; // -//bool cmp1(Node a, Node b) { +//bool cmp1(Node &a, Node &b) { // return a.m < b.m; //} // -//bool cmp2(Node a, Node b) { +//bool cmp2(Node &a, Node &b) { // return a.dist < b.dist; //} // @@ -71,15 +71,14 @@ // } // } // break; -// } else { -// while (bl[i] <= br[i] && arr[bl[i]].dist <= arr[cur].range) { -// if (!vis[bl[i]]) { -// vis[bl[i]] = true; -// que[r++] = bl[i]; -// ans++; -// } -// bl[i]++; +// } +// while (bl[i] <= br[i] && arr[bl[i]].dist <= arr[cur].range) { +// if (!vis[bl[i]]) { +// vis[bl[i]] = true; +// que[r++] = bl[i]; +// ans++; // } +// bl[i]++; // } // } // } From f6017735f14dd45a3f5d39f656d295543385be97 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Jun 2025 22:54:08 +0800 Subject: [PATCH 0322/1170] modify code --- src/class173/Code03_Magnet1.java | 205 ++++++++++++++++++ ...ode04_Magnet2.java => Code03_Magnet2.java} | 24 +- ...Inversion1.java => Code04_Inversion1.java} | 4 +- ...Inversion2.java => Code04_Inversion2.java} | 2 +- src/class173/Code04_Magnet1.java | 182 ---------------- 5 files changed, 221 insertions(+), 196 deletions(-) create mode 100644 src/class173/Code03_Magnet1.java rename src/class173/{Code04_Magnet2.java => Code03_Magnet2.java} (78%) rename src/class173/{Code03_Inversion1.java => Code04_Inversion1.java} (98%) rename src/class173/{Code03_Inversion2.java => Code04_Inversion2.java} (99%) delete mode 100644 src/class173/Code04_Magnet1.java diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java new file mode 100644 index 000000000..782f0edf7 --- /dev/null +++ b/src/class173/Code03_Magnet1.java @@ -0,0 +1,205 @@ +package class173; + +// 磁力块,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P10590 +// 测试链接 : https://codeforces.com/problemset/problem/198/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 为了这道题能用java通过,我没有把数据封装到一起,组成一个磁块对象 +// 自己手撸了双指针快排优化常数时间,其实并不需要这么做,因为正式比赛不卡常 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code03_Magnet1 { + + public static int MAXN = 300001; + public static int MAXB = 601; + public static int n; + public static int[] x = new int[MAXN]; + public static int[] y = new int[MAXN]; + public static int[] m = new int[MAXN]; + public static int[] p = new int[MAXN]; + public static long[] range = new long[MAXN]; + public static long[] dist = new long[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + public static int[] maxm = new int[MAXB]; + + public static int[] que = new int[MAXN]; + public static boolean[] vis = new boolean[MAXN]; + + // 下标为i的磁块和下标为j的磁块交换 + public static void swap(int i, int j) { + int tmp1; + tmp1 = x[i]; x[i] = x[j]; x[j] = tmp1; + tmp1 = y[i]; y[i] = y[j]; y[j] = tmp1; + tmp1 = m[i]; m[i] = m[j]; m[j] = tmp1; + tmp1 = p[i]; p[i] = p[j]; p[j] = tmp1; + long tmp2; + tmp2 = range[i]; range[i] = range[j]; range[j] = tmp2; + tmp2 = dist[i]; dist[i] = dist[j]; dist[j] = tmp2; + } + + // 所有磁块根据m值排序,手写双指针快排 + public static void sortByM(int l, int r) { + if (l >= r) { + return; + } + int i = l, j = r, pivot = m[(l + r) >>> 1]; + while (i <= j) { + while (m[i] < pivot) { + i++; + } + while (m[j] > pivot) { + j--; + } + if (i <= j) { + swap(i++, j--); + } + } + sortByM(l, j); + sortByM(i, r); + } + + // 所有磁块根据dist值排序,手写双指针快排 + public static void sortByDist(int l, int r) { + if (l >= r) { + return; + } + int i = l, j = r; + long pivot = dist[(l + r) >>> 1]; + while (i <= j) { + while (dist[i] < pivot) { + i++; + } + while (dist[j] > pivot) { + j--; + } + if (i <= j) { + swap(i++, j--); + } + } + sortByDist(l, j); + sortByDist(i, r); + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + sortByM(1, n); + for (int i = 1; i <= bnum; i++) { + maxm[i] = m[br[i]]; + sortByDist(bl[i], br[i]); + } + } + + public static int bfs() { + int ans = 0; + vis[0] = true; + int l = 1, r = 1; + que[r++] = 0; + while (l < r) { + int cur = que[l++]; + for (int b = 1; b <= bnum; b++) { + if (maxm[b] > p[cur]) { + for (int j = bl[b]; j <= br[b]; j++) { + if (dist[j] <= range[cur] && m[j] <= p[cur] && !vis[j]) { + vis[j] = true; + que[r++] = j; + ans++; + } + } + break; + } + while (bl[b] <= br[b] && dist[bl[b]] <= range[cur]) { + int i = bl[b]; + if (!vis[i]) { + vis[i] = true; + que[r++] = i; + ans++; + } + bl[b]++; + } + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + x[0] = in.nextInt(); + y[0] = in.nextInt(); + p[0] = in.nextInt(); + range[0] = in.nextInt(); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + x[i] = in.nextInt(); + y[i] = in.nextInt(); + m[i] = in.nextInt(); + p[i] = in.nextInt(); + range[i] = in.nextInt(); + } + for (int i = 0; i <= n; i++) { + range[i] *= range[i]; + long dx = x[0] - x[i]; + long dy = y[0] - y[i]; + dist[i] = dx * dx + dy * dy; + } + prepare(); + out.println(bfs()); + out.flush(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buf = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buf); + ptr = 0; + if (len <= 0) + return -1; + } + return buf[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class173/Code04_Magnet2.java b/src/class173/Code03_Magnet2.java similarity index 78% rename from src/class173/Code04_Magnet2.java rename to src/class173/Code03_Magnet2.java index 38148ac8a..922ff1ebb 100644 --- a/src/class173/Code04_Magnet2.java +++ b/src/class173/Code03_Magnet2.java @@ -2,6 +2,7 @@ // 磁力块,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P10590 +// 测试链接 : https://codeforces.com/problemset/problem/198/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -61,24 +62,25 @@ // que[r++] = 0; // while (l < r) { // int cur = que[l++]; -// for (int i = 1; i <= bnum; i++) { -// if (maxm[i] > arr[cur].p) { -// for (int j = bl[i]; j <= br[i]; j++) { -// if (arr[j].dist <= arr[cur].range && arr[j].m <= arr[cur].p && !vis[j]) { -// vis[j] = true; -// que[r++] = j; +// for (int b = 1; b <= bnum; b++) { +// if (maxm[b] > arr[cur].p) { +// for (int i = bl[b]; i <= br[b]; i++) { +// if (arr[i].dist <= arr[cur].range && arr[i].m <= arr[cur].p && !vis[i]) { +// vis[i] = true; +// que[r++] = i; // ans++; // } // } // break; // } -// while (bl[i] <= br[i] && arr[bl[i]].dist <= arr[cur].range) { -// if (!vis[bl[i]]) { -// vis[bl[i]] = true; -// que[r++] = bl[i]; +// while (bl[b] <= br[b] && arr[bl[b]].dist <= arr[cur].range) { +// int i = bl[b]; +// if (!vis[i]) { +// vis[i] = true; +// que[r++] = i; // ans++; // } -// bl[i]++; +// bl[b]++; // } // } // } diff --git a/src/class173/Code03_Inversion1.java b/src/class173/Code04_Inversion1.java similarity index 98% rename from src/class173/Code03_Inversion1.java rename to src/class173/Code04_Inversion1.java index 7972793a1..b50a47af2 100644 --- a/src/class173/Code03_Inversion1.java +++ b/src/class173/Code04_Inversion1.java @@ -5,7 +5,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是无法通过测试 // 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 -// 想通过用C++实现,本节课Code03_Inversion2文件就是C++的实现 +// 想通过用C++实现,本节课Code04_Inversion2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code03_Inversion1 { +public class Code04_Inversion1 { public static int MAXN = 100001; public static int MAXB = 701; diff --git a/src/class173/Code03_Inversion2.java b/src/class173/Code04_Inversion2.java similarity index 99% rename from src/class173/Code03_Inversion2.java rename to src/class173/Code04_Inversion2.java index 67de915d9..a6fe80adf 100644 --- a/src/class173/Code03_Inversion2.java +++ b/src/class173/Code04_Inversion2.java @@ -5,7 +5,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 // 这道题比较卡常,C++实现也需要优化常数,比如快读 -// 正式比赛不卡常! +// 正式比赛不卡常 //#include // diff --git a/src/class173/Code04_Magnet1.java b/src/class173/Code04_Magnet1.java deleted file mode 100644 index 7dc61a940..000000000 --- a/src/class173/Code04_Magnet1.java +++ /dev/null @@ -1,182 +0,0 @@ -package class173; - -// 磁力块,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P10590 -// java实现的逻辑一定是正确的,但是无法通过测试 -// 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 -// 想通过用C++实现,本节课Code04_Magnet2文件就是C++的实现 -// 两个版本的逻辑完全一样,C++版本可以通过所有测试 - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.util.Arrays; -import java.util.Comparator; - -public class Code04_Magnet1 { - - public static class Node { - int x, y, m, p; - long range; - long dist; - - public Node(int x_, int y_, int m_, int p_, int range_) { - x = x_; - y = y_; - m = m_; - p = p_; - range = range_; - } - } - - public static class Cmp1 implements Comparator { - @Override - public int compare(Node a, Node b) { - return a.m - b.m; - } - } - - public static class Cmp2 implements Comparator { - @Override - public int compare(Node a, Node b) { - return a.dist <= b.dist ? -1 : 1; - } - } - - public static Cmp1 cmp1 = new Cmp1(); - public static Cmp2 cmp2 = new Cmp2(); - - public static int MAXN = 300001; - public static int MAXB = 601; - public static int n; - public static Node[] arr = new Node[MAXN]; - - public static int blen, bnum; - public static int[] bi = new int[MAXN]; - public static int[] bl = new int[MAXB]; - public static int[] br = new int[MAXB]; - public static int[] maxm = new int[MAXB]; - - public static boolean[] vis = new boolean[MAXN]; - public static int[] que = new int[MAXN]; - - public static void prepare() { - blen = (int) Math.sqrt(n); - bnum = (n + blen - 1) / blen; - for (int i = 1; i <= n; i++) { - bi[i] = (i - 1) / blen + 1; - } - for (int i = 1; i <= bnum; i++) { - bl[i] = (i - 1) * blen + 1; - br[i] = Math.min(i * blen, n); - } - Arrays.sort(arr, 1, n + 1, cmp1); - for (int i = 1; i <= bnum; i++) { - maxm[i] = arr[br[i]].m; - Arrays.sort(arr, bl[i], br[i] + 1, cmp2); - } - } - - public static int bfs() { - int ans = 0; - vis[0] = true; - int l = 1, r = 1; - que[r++] = 0; - while (l < r) { - int cur = que[l++]; - for (int i = 1; i <= bnum; i++) { - if (maxm[i] > arr[cur].p) { - for (int j = bl[i]; j <= br[i]; j++) { - if (arr[j].dist <= arr[cur].range && arr[j].m <= arr[cur].p && !vis[j]) { - vis[j] = true; - que[r++] = j; - ans++; - } - } - break; - } - while (bl[i] <= br[i] && arr[bl[i]].dist <= arr[cur].range) { - if (!vis[bl[i]]) { - vis[bl[i]] = true; - que[r++] = bl[i]; - ans++; - } - bl[i]++; - } - } - } - return ans; - } - - public static void main(String[] args) throws IOException { - FastReader in = new FastReader(System.in); - PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - int x = in.nextInt(); - int y = in.nextInt(); - int m = 0; - int p = in.nextInt(); - int range = in.nextInt(); - arr[0] = new Node(x, y, 0, p, range); - n = in.nextInt(); - for (int i = 1; i <= n; i++) { - x = in.nextInt(); - y = in.nextInt(); - m = in.nextInt(); - p = in.nextInt(); - range = in.nextInt(); - arr[i] = new Node(x, y, m, p, range); - } - long xd, yd; - for (int i = 0; i <= n; i++) { - arr[i].range = arr[i].range * arr[i].range; - xd = arr[0].x - arr[i].x; - yd = arr[0].y - arr[i].y; - arr[i].dist = xd * xd + yd * yd; - } - prepare(); - out.println(bfs()); - out.flush(); - out.close(); - } - - // 读写工具类 - static class FastReader { - private final byte[] buffer = new byte[1 << 20]; - private int ptr = 0, len = 0; - private final InputStream in; - - FastReader(InputStream in) { - this.in = in; - } - - private int readByte() throws IOException { - if (ptr >= len) { - len = in.read(buffer); - ptr = 0; - if (len <= 0) - return -1; - } - return buffer[ptr++]; - } - - int nextInt() throws IOException { - int c; - do { - c = readByte(); - } while (c <= ' ' && c != -1); - boolean neg = false; - if (c == '-') { - neg = true; - c = readByte(); - } - int val = 0; - while (c > ' ' && c != -1) { - val = val * 10 + (c - '0'); - c = readByte(); - } - return neg ? -val : val; - } - } - -} From 68deca3f8b630745e8132432655ac201efa67939 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 14:28:07 +0800 Subject: [PATCH 0323/1170] modify code --- src/class173/Code05_TreeBlock1.java | 334 ++++++++++++++++++++++++++++ src/class173/Code05_TreeBlock2.java | 165 ++++++++++++++ 2 files changed, 499 insertions(+) create mode 100644 src/class173/Code05_TreeBlock1.java create mode 100644 src/class173/Code05_TreeBlock2.java diff --git a/src/class173/Code05_TreeBlock1.java b/src/class173/Code05_TreeBlock1.java new file mode 100644 index 000000000..ff3763e35 --- /dev/null +++ b/src/class173/Code05_TreeBlock1.java @@ -0,0 +1,334 @@ +package class173; + +// 树上分块模版题,重链剖分后序列分块,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3603 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code05_TreeBlock1 { + + public static int MAXN = 100001; + public static int MAXB = 1001; + public static int MAXV = 30001; + public static int MAXS = (MAXV + 31) / 32; + public static int n, m, f, k; + public static int[] arr = new int[MAXN]; + + // 链式前向星 + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg = 0; + + // 重链剖分 + public static int[] fa = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[] top = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int[] val = new int[MAXN]; + public static int cntd = 0; + + // 分块 + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + public static int[][] bitSet = new int[MAXB][MAXS]; + + public static int[] tmp = new int[MAXS]; + public static int[] ans = new int[MAXS]; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void dfs1(int u, int f) { + fa[u] = f; + dep[u] = dep[f] + 1; + siz[u] = 1; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != f) { + dfs1(v, u); + } + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + + public static void dfs2(int u, int t) { + top[u] = t; + dfn[u] = ++cntd; + val[cntd] = arr[u]; + if (son[u] == 0) { + return; + } + dfs2(son[u], t); + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, v); + } + } + } + + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + public static int[][] fse = new int[MAXN][3]; + + public static int stacksize, first, second, edge; + + public static void push(int fir, int sec, int edg) { + fse[stacksize][0] = fir; + fse[stacksize][1] = sec; + fse[stacksize][2] = edg; + stacksize++; + } + + public static void pop() { + --stacksize; + first = fse[stacksize][0]; + second = fse[stacksize][1]; + edge = fse[stacksize][2]; + } + + // dfs1的迭代版 + public static void dfs3() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { + fa[first] = second; + dep[first] = dep[second] + 1; + siz[first] = 1; + edge = head[first]; + } else { + edge = next[edge]; + } + if (edge != 0) { + push(first, second, edge); + if (to[edge] != second) { + push(to[edge], first, -1); + } + } else { + for (int e = head[first], v; e > 0; e = next[e]) { + v = to[e]; + if (v != second) { + siz[first] += siz[v]; + if (son[first] == 0 || siz[son[first]] < siz[v]) { + son[first] = v; + } + } + } + } + } + } + + // dfs2的迭代版 + public static void dfs4() { + stacksize = 0; + push(1, 1, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { + top[first] = second; + dfn[first] = ++cntd; + val[cntd] = arr[first]; + if (son[first] == 0) { + continue; + } + push(first, second, -2); + push(son[first], second, -1); + continue; + } else if (edge == -2) { + edge = head[first]; + } else { + edge = next[edge]; + } + if (edge != 0) { + push(first, second, edge); + if (to[edge] != fa[first] && to[edge] != son[first]) { + push(to[edge], to[edge], -1); + } + } + } + } + + public static void setOne(int[] cur, int v) { + cur[v / 32] |= 1 << (v % 32); + } + + public static void clear(int[] cur) { + for (int i = 0; i < MAXS; i++) { + cur[i] = 0; + } + } + + public static void or(int[] a, int[] b) { + for (int i = 0; i < MAXS; i++) { + a[i] |= b[i]; + } + } + + public static int getOnes(int[] cur) { + int ans = 0; + for (int x : cur) { + ans += Integer.bitCount(x); + } + return ans; + } + + public static int firstMiss(int[] cur) { + for (int i = 0, inv; i < MAXS; i++) { + inv = ~cur[i]; + if (inv != 0) { + return i * 32 + Integer.numberOfTrailingZeros(inv); + } + } + return -1; + } + + public static void query(int l, int r) { + clear(tmp); + if (bi[l] == bi[r]) { + for (int i = l; i <= r; i++) { + setOne(tmp, val[i]); + } + } else { + for (int i = l; i <= br[bi[l]]; i++) { + setOne(tmp, val[i]); + } + for (int i = bl[bi[r]]; i <= r; i++) { + setOne(tmp, val[i]); + } + for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { + or(tmp, bitSet[i]); + } + } + } + + public static void updateAns(int x, int y) { + while (top[x] != top[y]) { + if (dep[top[x]] < dep[top[y]]) { + int tmp = x; + x = y; + y = tmp; + } + query(dfn[top[x]], dfn[x]); + or(ans, tmp); + x = fa[top[x]]; + } + query(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y])); + or(ans, tmp); + } + + public static void prepare() { + dfs3(); + dfs4(); + // 调整块长 + blen = (int) Math.sqrt(n * 20); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + for (int j = bl[i]; j <= br[i]; j++) { + setOne(bitSet[i], val[j]); + } + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + f = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + prepare(); + for (int i = 1, last = 0; i <= m; i++) { + clear(ans); + k = in.nextInt(); + for (int j = 1, x, y; j <= k; j++) { + x = in.nextInt(); + y = in.nextInt(); + if (f > 0) { + x = x ^ last; + y = y ^ last; + } + updateAns(x, y); + } + int ans1 = getOnes(ans); + int ans2 = firstMiss(ans); + out.println(ans1 + " " + ans2); + last = ans1 + ans2; + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class173/Code05_TreeBlock2.java b/src/class173/Code05_TreeBlock2.java new file mode 100644 index 000000000..a515710af --- /dev/null +++ b/src/class173/Code05_TreeBlock2.java @@ -0,0 +1,165 @@ +package class173; + +// 树上分块模版题,重链剖分后序列分块,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3603 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXB = 1001; +//const int MAXV = 30001; +//int n, m, f, k; +//int arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int val[MAXN]; +//int cntd; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +//bitset bitSet[MAXB]; +// +//bitset tmp; +//bitset ans; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs1(int u, int f) { +// fa[u] = f; +// dep[u] = dep[f] + 1; +// siz[u] = 1; +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != f) { +// siz[u] += siz[v]; +// if (!son[u] || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +// } +//} +// +//void dfs2(int u, int t) { +// top[u] = t; +// dfn[u] = ++cntd; +// val[cntd] = arr[u]; +// if (!son[u]) { +// return; +// } +// dfs2(son[u], t); +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void query(int l, int r) { +// tmp.reset(); +// if (bi[l] == bi[r]) { +// for (int i = l; i <= r; i++) { +// tmp[val[i]] = 1; +// } +// } else { +// for (int i = l; i <= br[bi[l]]; i++) { +// tmp[val[i]] = 1; +// } +// for (int i = bl[bi[r]]; i <= r; i++) { +// tmp[val[i]] = 1; +// } +// for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { +// tmp |= bitSet[i]; +// } +// } +//} +// +//void updateAns(int x, int y) { +// while (top[x] != top[y]) { +// if (dep[top[x]] < dep[top[y]]) { +// swap(x, y); +// } +// query(dfn[top[x]], dfn[x]); +// ans |= tmp; +// x = fa[top[x]]; +// } +// query(min(dfn[x], dfn[y]), max(dfn[x], dfn[y])); +// ans |= tmp; +//} +// +//void prepare() { +// dfs1(1, 0); +// dfs2(1, 1); +// blen = (int)sqrt(n * 20); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// for (int j = bl[i]; j <= br[i]; j++) { +// bitSet[i][val[j]] = 1; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> f; +// for (int i = 1; i <= n; ++i) { +// cin >> arr[i]; +// } +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// prepare(); +// int last = 0; +// for (int i = 1; i <= m; i++) { +// ans.reset(); +// cin >> k; +// for (int j = 1, x, y; j <= k; j++) { +// cin >> x >> y; +// if (f) { +// x ^= last; +// y ^= last; +// } +// updateAns(x, y); +// } +// int ans1 = ans.count(); +// ans.flip(); +// int ans2 = ans._Find_first(); +// cout << ans1 << ' ' << ans2 << '\n'; +// last = ans1 + ans2; +// } +// return 0; +//} \ No newline at end of file From 2e6211c98ba549c3b7ce3877dd10a72d7b037eb5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 14:31:13 +0800 Subject: [PATCH 0324/1170] modify code --- src/class173/Code05_TreeBlock2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class173/Code05_TreeBlock2.java b/src/class173/Code05_TreeBlock2.java index a515710af..55bf04a86 100644 --- a/src/class173/Code05_TreeBlock2.java +++ b/src/class173/Code05_TreeBlock2.java @@ -157,7 +157,7 @@ // } // int ans1 = ans.count(); // ans.flip(); -// int ans2 = ans._Find_first(); +// int ans2 = ans._Find_first(); // cout << ans1 << ' ' << ans2 << '\n'; // last = ans1 + ans2; // } From 1405e3fa1e26c1690af8cc92339c5daeaedde418 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 14:34:34 +0800 Subject: [PATCH 0325/1170] modify code --- src/class173/{Code05_TreeBlock1.java => Code05_TreeHld1.java} | 2 +- src/class173/{Code05_TreeBlock2.java => Code05_TreeHld2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class173/{Code05_TreeBlock1.java => Code05_TreeHld1.java} (99%) rename src/class173/{Code05_TreeBlock2.java => Code05_TreeHld2.java} (100%) diff --git a/src/class173/Code05_TreeBlock1.java b/src/class173/Code05_TreeHld1.java similarity index 99% rename from src/class173/Code05_TreeBlock1.java rename to src/class173/Code05_TreeHld1.java index ff3763e35..03fa44a0e 100644 --- a/src/class173/Code05_TreeBlock1.java +++ b/src/class173/Code05_TreeHld1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_TreeBlock1 { +public class Code05_TreeHld1 { public static int MAXN = 100001; public static int MAXB = 1001; diff --git a/src/class173/Code05_TreeBlock2.java b/src/class173/Code05_TreeHld2.java similarity index 100% rename from src/class173/Code05_TreeBlock2.java rename to src/class173/Code05_TreeHld2.java From 43b07ea653bca05246c678dcc9be99c79f4c0e39 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 14:35:58 +0800 Subject: [PATCH 0326/1170] modify code --- src/class173/Code05_TreeHld1.java | 2 +- src/class173/Code05_TreeHld2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code05_TreeHld1.java b/src/class173/Code05_TreeHld1.java index 03fa44a0e..4ac986098 100644 --- a/src/class173/Code05_TreeHld1.java +++ b/src/class173/Code05_TreeHld1.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,重链剖分后序列分块,java版 +// 树上分块模版题,重链序列分块,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class173/Code05_TreeHld2.java b/src/class173/Code05_TreeHld2.java index 55bf04a86..9bf9dfb31 100644 --- a/src/class173/Code05_TreeHld2.java +++ b/src/class173/Code05_TreeHld2.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,重链剖分后序列分块,C++版 +// 树上分块模版题,重链序列分块,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 2d00be49ec404bf9b9213171b308d3772f668462 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 14:38:43 +0800 Subject: [PATCH 0327/1170] modify code --- .../{Code05_TreeHld1.java => Code05_TreeBlockHld1.java} | 2 +- .../{Code05_TreeHld2.java => Code05_TreeBlockHld2.java} | 0 src/class173/Code06_TreeBlockRandom1.java | 9 +++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) rename src/class173/{Code05_TreeHld1.java => Code05_TreeBlockHld1.java} (99%) rename src/class173/{Code05_TreeHld2.java => Code05_TreeBlockHld2.java} (100%) create mode 100644 src/class173/Code06_TreeBlockRandom1.java diff --git a/src/class173/Code05_TreeHld1.java b/src/class173/Code05_TreeBlockHld1.java similarity index 99% rename from src/class173/Code05_TreeHld1.java rename to src/class173/Code05_TreeBlockHld1.java index 4ac986098..9b1ccc95e 100644 --- a/src/class173/Code05_TreeHld1.java +++ b/src/class173/Code05_TreeBlockHld1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_TreeHld1 { +public class Code05_TreeBlockHld1 { public static int MAXN = 100001; public static int MAXB = 1001; diff --git a/src/class173/Code05_TreeHld2.java b/src/class173/Code05_TreeBlockHld2.java similarity index 100% rename from src/class173/Code05_TreeHld2.java rename to src/class173/Code05_TreeBlockHld2.java diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java new file mode 100644 index 000000000..6b494531d --- /dev/null +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -0,0 +1,9 @@ +package class173; + +// 树上分块模版题,随机撒点分块,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3603 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code06_TreeBlockRandom1 { + +} From 42d94b02af7f6d16026cbd1d3241c2a939b908e4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 15:20:08 +0800 Subject: [PATCH 0328/1170] modify code --- ...\347\240\201\350\257\246\350\247\243.pptx" | Bin 59044 -> 58992 bytes ...\345\210\253\344\277\256\346\224\271.pptx" | Bin 47568 -> 47513 bytes ...\347\232\204\344\277\241\346\201\257.pptx" | Bin 43916 -> 43864 bytes ...\347\232\204\351\227\256\351\242\230.pptx" | Bin 45764 -> 45715 bytes ...\345\217\262\346\234\200\345\200\274.pptx" | Bin 50239 -> 50187 bytes ...\347\232\204\351\242\230\347\233\256.pptx" | Bin 44912 -> 44863 bytes ...4\347\276\216\346\264\227\347\211\214.pdf" | Bin 152273 -> 150620 bytes ...344\272\214\345\210\206-\344\270\213.pptx" | Bin 48349 -> 48399 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243110\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2301-\347\272\277\346\256\265\346\240\221\345\216\237\347\220\206\345\222\214\344\273\243\347\240\201\350\257\246\350\247\243.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243110\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2301-\347\272\277\346\256\265\346\240\221\345\216\237\347\220\206\345\222\214\344\273\243\347\240\201\350\257\246\350\247\243.pptx" index 04729721e8aa5521d30a53bde27e632b01d03c39..cd37be837a512508a5574c85b44f5175cc9a2060 100644 GIT binary patch delta 3604 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 diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243111\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2302-\347\272\277\346\256\265\346\240\221\347\232\204\347\246\273\346\225\243\345\214\226\343\200\201\344\272\214\345\210\206\346\220\234\347\264\242\343\200\201\347\211\271\345\210\253\344\277\256\346\224\271.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243111\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2302-\347\272\277\346\256\265\346\240\221\347\232\204\347\246\273\346\225\243\345\214\226\343\200\201\344\272\214\345\210\206\346\220\234\347\264\242\343\200\201\347\211\271\345\210\253\344\277\256\346\224\271.pptx" index 02eab704315f73b17238ce6bb1d34ad1af7e48ca..4e90dd0d8f8cdfa34d71f2a0079cc7ff1d72021e 100644 GIT binary patch delta 3272 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 Hm@DwV#xp;7 diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243112\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2303-\347\272\277\346\256\265\346\240\221\347\273\264\346\212\244\346\233\264\345\244\232\347\261\273\345\236\213\347\232\204\344\277\241\346\201\257.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243112\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2303-\347\272\277\346\256\265\346\240\221\347\273\264\346\212\244\346\233\264\345\244\232\347\261\273\345\236\213\347\232\204\344\277\241\346\201\257.pptx" index bc3c30c4c9adc525ee86bf47cb1465cfaaafbeda..11cbba761b962e6a61928116495aaac8910536b3 100644 GIT binary patch delta 3155 zcmai%c|6qlAIHZyhEc3*lVc4HZ5GoYlq0uj2oWlB4eRBe!pMeCbJ*@{25%t{xC0} zBn$=oqLh79$9IBiX`V86@ zkZuT2*@>TqZ1*Ja0w7bDQR3TDz=FCaFkFlT&i?>Sa#tX5Es3Lh!HP+=GZ&8917Ta$ zOHi%_bpdG1n#LRWx8_oskab4Wk*kCHWh6k*g=X67>406f;?(Oy6*&gJT$oUX1Tw@W zfxYOPVw-pARG?scF)s`zA_{{k0$67SHpb*GmtWZeYV*mW6T(mIw16+x5bn2G1Tp)G z9Ri9zaO41#anp)(>J{0X^fos(*KuQ#FA{idvy1KE9L3e|lPhSdYta1i3J!zuA~sC` zfzHoH9AAfS#AY`F{jdC6U89#%Lw9WywDE0qJ?LS{Wj^S^4`3MlUoRMZ1{b^>p~REE z&;w`B<9!6SZ-#uL^<`K_00v_Lp21p#Pzfu^#0i(GrNQa8smicyq3tXun{z!1d)=;% zI&Rvle<~xUKXwH3v1__bHtc6}<~fW!?aRGP^N3teYlv%VtF4iySqmen$^R_N!14vKs-WPl?yJLXut ztI@Dyk^R;zan>d}%K^^#R^*kPY1jSo$^3qY<`OlS3X|g6$INz-Bwk^u9c9cDacxE# zlYyR!_XO0!f`?O``xxCyowyh^nHTm%e>F(=mx&a7oeLXWfo=x2Z2dNv&)>vdw8h;uktySo>bvw$J|8aFm;S z{@9UW$aFRAw{odUd}dWBgz)rE9&uagUM#RvrDWf#ow}JAGv_`P{PH;=e%?n@OsHw8 zA$}|;-hVK*X1e)j{e$j{xtQqaxkh%781lI`{z&Ol2G&wcdO5&pPyBtNnE8Ml5Mohg zMherHi0PUQu;ZyI*>)C@IdOVt7M@>0s3avWYak8LAxp=X=0sj>Nr8vh zl-c_1XC-+3c{{MewCDx_o;P3Aq2(GOSK=G%;BkGLY)CysJ9$*kVC9C>PP5VSP-JB8 zk#g5uSC<;H;>cM%iCSjcmksanTENU>o)SM#{NAPK=3vh$^{n>aMxu+U{d9=W;PIr4 z_#zA$X`KAC{1eYd6$vNupGXZE5~36L>jWjQ^M_^cW2YJYc=nnXp)j9=zzVJ^PU57S z=7hbBws}qTu{a+C{ij|WOi_+lu4^40ts7mABp;^tBVHbvXX8I1&Ku)w*@&|PZ zwFcEzKZ`wQD#e%DZHE!ALWUIWG5DvMFxA!_TFjG5?znKFBp-IVcg~mu!zv>aYTGg{Sp0aLq96R(G^px!It;oSki?Bfw4B|r0F zB#Iqrp>h5}hN;N>ZBEo zp4}-H_`V*e)5%UKc(~TprQEXz)k35wq*F{)TgOawR;8+_CLU>SE;%8rvY=>d^9)J( zGm`tKx(|<8|Dh5aF8I9hrSFKM%(bH{3OBR_XR`@d*2l}kV&=4gxIYu#XG>{1ot+Hs zRXiW&QCqZ9PtYB(jTy_Ey(m0bD}QKTlm3-AuWXtd53KpEWeuf`y1tdbqqEs92i&Nj0r%9Bso z`*gNgwRfXl#v3EUQ9Qf-XLT9%wK4I7Zj>0EFEAA6KevoA0=}n-r$p~a4o?L4Hwzbv zWn9x*{*KV_QxxO&_O)vE-U+qaA1kq_6rOBDRL_F(bg)|8Z~n6*N{5=3wv#O6NNDHG z*LgBDqLn^Bx*cntsulAvpe@T&Q9eajG#JQqn*i0)FjYUnHf8z36^=wmN8kjZdKwLU;y3|i-X#|I>tz;>EAI$xH9vPSc%^jJTh+7IoT5B>)$Fz5 z8?QTIJF%-5d}SJN)!)VMAX?TNS2`BZ?dx@_9*p$=-fo$CvROoaP4@4H51=?n1rU$u z19zIKh%SC`3*W@AVkZ1I(P%1J8m;8zj zgQB+R7$`)Gp>l^}Xz5Zhw6yw-$N)Yi24DfT$86BE7V*?f`5H^__s37-rYvoKp8j}?~>6&r^wH~D|| zX#}!ZU>_=Hw&?%&VF7=zFk2UlWi?KdHu6+O!(bAB%QKP#pehx&hKWQGf8D)tQ2cS@ TufpF=R{_sT6#-ewX61hY?Mq=Cv{>CDC@2kYfJ2p&$Zw!Fjq(ry zlY>k!q}9uwK!8jegA@9ZfN5_J!HN;Q8z26bi2}&#P=&n) z9hz-g8v(Ui+V%ndtAP_81t<|AeVpjRw^P{fPy>4-LvWWLBe6{&oMKAi!&kn*m*Xxx`w>q14D!m(`9W6fm$)h2`uP#=m|zh z(2viWI&mB!zBcS>P19)y1PoRMcn9c__jm7+i?W^NeYAUws6T+40Nd*YSe6=k=>k^Fa& z-~5!vLtl?`lGb;2JG(~A-potX_%B-DazLAjQE}~i-((Sw+plH+oBE|R*MF3P6i-#V ztNjrh;UK#Q?ObL`h*O)De{))%&@1+6xTzyg;U3bjrz6A8#jFcIq=ncQ5f|l{j6=qq z^b;PvNms9lgDG&HacVZ7bXIu$jFw9F6?-0g+qceQJ7XUzaO~2bQizYHG1RZum9JFh zq_!)3rJH$I_V(XIi0y89Z0zbO&BEI(Vrw>i6b}~dG^yJgi|g0()RkKnqFtWWLdI;T zd{^&Ly?XfKdjr(C``w5K7mA#gA70Q$+gVtvHWbbzjh3ccRc>XJ2Oaocs-$IDP7W&D z(wp4$9Krb3QZrv)vw+&^aW<3J@rsvmOEY;Te*S}d0^HsH;NYpUvq{by5HTax?A zL@hB6Z!6yn!}T~?i|d(W*O!LgXwB)J3$fYe&?G6?NW3Fw$xV+JvbEe5-X zViUS?1s0}prcaWst5B(X?#ZWsBSD?=-Y$zJow1?Fq|cG+LyYgY z27Sm|8>a%)$y_ut7Ogz!)PS8==$GKg9Mt#w!(%4C#_CF2uFRc-#5C_?ik6JyY{j<5 z_PNhPifwZXCn{Oyv4O%kvj3~wwWG#XZOWS@)#h546DD(fq|C!%?hykVfd*aAP4i-L z$XJH|jEK>m7hd_QMrIj}?+s&d9b zfpkiKsk5Gx^xKNzejqpcDZVwZVbkUbKwNT%ag}|1z1d&z_~k{R9CA{8PEpU9KG%#T zN7`X7`4-Pi*??`=n5#;&$>nPGrrarNdb#@8FkEQ<;$>zt!NpG1JNrN_QR73{?J(hH z9E$2Ej;hv*6WKD58J1SR%=BhQo`tdCpcZG^S|o6UlV_mr3*so?~ztH9_Krb zknKX$aeMU3Td(h>lX-6Xdgn_`{7b%dRfn_LWg_`;Atjig;#8VHAo6&jdb^lq-ECdL zT_Fn@mrjR-jWZG^F(LjL%mX z((-;-ioZ(Jo|Fq4v8Rdy`(u($PF8C>8v3!MYQ`?PeSWRNG$!A|>dzKE@G2v}yZo$q zx#G-!>~@I>d=%d0T6|ISfFgRDhp5<@dUA&mZ>MfVVQ;35?l;j&(}G8|JEZhPktG?s z>BR|`WzIJ2N-XBByrF4$)kGiSMj{+(bayz-x4i4nxl8gVIqg|6l7BubSbFQ=(dBnv z2r%glfC>|7jvqSPd^sN{m{5;57YzXbX4EQP0&dIUf(;O@Wr^SM%0wIf+t+R1OKKz*RZ zy7tM3vri+2-`(~dqJHpHFV_*8i%xZ|H?^5sbji{}_Ae?asV``hFC;z{`1j=nI89Ln z`hs7Br&C49OJVT%U&F8r;QYYX5LAkWG>_Y}O2tky1pb-u9#=!TM# zpbwqP&6h_ZR(XA$O{Fx0`?H>;`9a5|Ce;9JNurv7A)9Iph5@P>7*uFBU^qjAoRal0 zL9+mti0QUqprpHlp*tNa$7VoFQgjRumthJnH}X@ROo#?$^0{x;>830`O38xU+FulE z=||`DxOB*qy~{_V??SYipAzmt^u#?rw|$*TWZQv5d*xz)i0qx<2R1)d$$=;-htF+a zr;@op=>f31>KDNP_&likMBYyi1H4+NQVeJ+FNQmE?W*$8z&lkLc%P02xD5RNU0#Hk zhF}Npe2idUFbtq4Y+U`1p@3+n7`Twc#0c~P3?}}UR~!j?#gQmLJRkC~`51vBz$l;3 zyG8-MYZMfax$fOx^{xWV>)!Ng--?7aPZ`iDfc7#kzz9qNhYIk@Yx8F>Or(EWy~4i} vfWfw|zW;jlU55s~jsl*o7jp_QaQPd+Sb;J)v2-CuU=YwMR7E&a*Gm5fXJtJN diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243113\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2304-\347\272\277\346\256\265\346\240\221\350\247\243\345\206\263\345\214\272\351\227\264\345\220\210\345\271\266\347\232\204\351\227\256\351\242\230.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243113\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2304-\347\272\277\346\256\265\346\240\221\350\247\243\345\206\263\345\214\272\351\227\264\345\220\210\345\271\266\347\232\204\351\227\256\351\242\230.pptx" index fbd5176424392536a1df9d1f46b59d83f3e0ba4b..c62cbd7fa0c76642a751c2774a4e9f66f4638b5b 100644 GIT binary patch delta 3090 zcmZXWc|25Y8^^~scG;P!s0k&q6e`;&WTz}i4-Xn+^cYGbJCh}4D%(+r!C135qx9O^ zq$#x6mm&t05V9}nG0sum_np6f=X?Kt*SYR9_vdq8FGg5_5mtedW^C-DFc^#rW)jqO zmMS2^!p;9m_0oks+EGX!(eX&03l^m z1xi*PDqtnQS-@d`7TDuP0cE9j@C}^G!>pj1RNb^L9kkwzAKqjRM>Mv?L+|kb@3f%Z zleOKpEFIQ^DsMYB4t89mnO9*^A}bFSA}o+B)rGn9P?)eLxTEtk{Q^xnU|D#c48t@CzR96Dw+@NzNo75_};jsZR$`yT^`4`-wtQgVo@bVKe zw7vWR5guvvv{GYVE}`!@MvMdb6eB?6fZHLrwc}@vX|L<9OgmOy!#F%Mioj9GBl82{ zLHunrE0b!|!L%J-rr8!4t^Gty&tuQ8#}jE0NmJ=OKsSNNUgj2fs{CA!{(LSfVTJa5 z@U=uPLj{Rg-fe_iv?XCpd=0lBGzh^U7+D@R*xaYSXI3SKB?6x=RtUOBmF)Y^ial4C z0Q`6x*BwI{){KJ7{4qf=j@|bIxH*G}fBNLzOY){X0sy}TWl1P`P}&Im-t1=6QSWs=Pcv<}A2q;|3W z94DfrKC`LEW_F4wR`0KOHnyDEY{h8Oee?Dr8tz{l^_t4N(BB2T{e&};P&K~KR;P(JTi8hq9? z#`p4V<0_XKS@5`N{kT(cmu}j#fe+KshzmDgY&RA$t2XgN^x8XyHFt6j!!YO{VGP5@ zed%p-eGU!bYE(&J^r`zO$x$+1?5bLGOF~$~YyxJe=>dI$AaOA_Q(q8!PjH@6r$bZERM3JA-Tb+uI+_vcUCs!36`qg;h zrJz`~US+sB9ns^MM!;p%%*?n5`C^eodeAtR zc&m_8z)6gY1#XW*l9BqCIfZi7$#&ews^Tz2&+VbV#OBipqlLVSI!7nXop1R{QYI9M z&4IThv~F|we@>nGv1~a)3ZBefI9FU1{qFMO=w}^rU)`A*q}9_moYlOl8R)Xt(x3QZ zNlRjnG&&rgz+~N5xx#?-enj}<^zkQ|^w=m76AZeJg823W@{APNos!NJA66ma1_^Li5n9)(YVmf{Fe_=bfyMB*CLl1OFVkD>r)4CGje`OX1)C*stgD^)hZ z9hx`dk~bMW%J7EnM>s`&BMP7?TA&D{Xo8}aq6>;OiU}ypvLO#?Q@qaB1DE)7 z%s}Coa~c$tIZ%9Yb7?9U3ApBJgUgg$C@_@^1x)jP6C_ZP2l-~UQpbFVrsr?*auh(+ zuwV-<+oa#OQu}+5H~HQlZ(<Fx+1*z7d>k{>oL( zu|B^^{%=qh5V|5l8|RuCj=H`PPNa&1 z-5{w*mRdla3N`0MMY5H}f%RKTAx|+C$@)1Spi}pNneXeSlgUieZa|U72SRNclI1#J WPeXx^q3e%!KnhI`-jK!o4F3W)oOzD` delta 3224 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 L$G1RQJ-ELCUp=p= diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243114\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2305-\345\274\200\347\202\271\347\272\277\346\256\265\346\240\221\343\200\201\345\214\272\351\227\264\346\234\200\345\200\274\345\222\214\345\216\206\345\217\262\346\234\200\345\200\274.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243114\343\200\220\346\211\251\345\261\225\343\200\221\347\272\277\346\256\265\346\240\221\344\270\223\351\242\2305-\345\274\200\347\202\271\347\272\277\346\256\265\346\240\221\343\200\201\345\214\272\351\227\264\346\234\200\345\200\274\345\222\214\345\216\206\345\217\262\346\234\200\345\200\274.pptx" index da196ecd665694de5b651034f834e914455fc656..f1619596b9379db297460baf84525248edfeb581 100644 GIT binary patch delta 3509 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 SJbxFJfr7nCY~pphng0b~WX)^< delta 3289 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 P>r?@Ft7PFs{9f%p752Ie diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243146\343\200\220\346\211\251\345\261\225\343\200\221\345\272\267\346\211\230\345\261\225\345\274\200\343\200\201\347\272\246\347\221\237\345\244\253\347\216\257\343\200\201\345\256\214\347\276\216\346\264\227\347\211\214.pdf" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243146\343\200\220\346\211\251\345\261\225\343\200\221\345\272\267\346\211\230\345\261\225\345\274\200\343\200\201\347\272\246\347\221\237\345\244\253\347\216\257\343\200\201\345\256\214\347\276\216\346\264\227\347\211\214.pdf" index c2b78d93b257e931d73ab2f8bc591abddf1cb8e7..c74235a7db51cdd6970912b6b56cbcde20ccfbc2 100644 GIT binary patch delta 58905 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 delta 61028 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�go=-+YoP>1mIv+qy1NTr`G;kMj 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 diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243169\343\200\220\346\214\272\351\232\276\343\200\221\346\225\264\344\275\223\344\272\214\345\210\206-\344\270\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243169\343\200\220\346\214\272\351\232\276\343\200\221\346\225\264\344\275\223\344\272\214\345\210\206-\344\270\213.pptx" index 9b01581dc1d378f2330b68b63b00b9022c063423..c0eb0cf562a015da005395dfe00495f2c76402b7 100644 GIT binary patch delta 3215 zcmZXWdpy(oAICRy%M7_iTUZ>qpoZtR=fA;*m-mmxj``LGo_h)cX;L=wC)Lv(Vpezgq z6NUA}ykw$e;fS>esKLL25i8Kni>!|V5eRTW6ix&ctWP3HXt5%SfN})IRzZm{(nkbb z1V~3hl2@FBE;I)T;6Kz%_N zjJO`uL7;A0}zO028He(?VR=3e<~%iI=pF@e7DC!~lGvJP<~x z1P!G0#sq%2Y8yfZoOo0zVy$u@3N+Besq>5c&g6HvJ1SnED*%JhMR+=Z!4v{)?POWB z?bCeEr+BE-Tjqh#;YnDEKnJ2=^`74s-WHNc+jT&)5l2x-_Ri^_^BHk80_c@sb+GkM zd+<t@7EeL z_Pv4yhGjOgehIP>1`Cr&OG4n8g+?ra2j0ugy8N3k327}mo>igdGZs$wwMrxzD0!RI{0Tnn{0FA_oH7ho)7No zTBSQa^ImuPk=v57aqTVN?rqN0JqA$+txu!=NVORjXZ!a)Z6|MY4TodWn^4vnbp?}^ zOy#EQvU}5Z91c||(b}q5#o}mrS!YF&eb7x;J&0!F-ky=>dJCHxvRE22$=J{et1e_M7G>@vQjGpNg!slwGycDz5-Yy&ChMPvLt+>&FfVB zm)HRAk$|_=IC8i}7w0Mo?_eKJoU1f-8a(>VG2bIzH9%h6LsY3()NS!zY@Z&5TggVK z*ftZ*fuOQxU^+_yf8N%;jjHCF9J|}jmKID!l(l&y`$tO;O<}f2JP&|754T^RMMLSzqQ^U}$zh9yCI3wv0vsh|=Ga5E; zwlzNN_}7Ove*R5YpRd9VmPhArb6Hg6^pLgwz(o|dlk)A4`vi8EHRbCt2Xmr~UV}8b zI1Xq^W;GrdI_??N*E2p}$6Auwn9J_&d`HFwhu&V`F36>Z-8y1aZ8FfDDNjF2!rzfc z=iZs;e!Q+!N$Sq^I{HqBvahqgQOT~FY1&g;+wIfX+s9ttBFQ*jMmO0;4psf2n{0CY zR<2~@Vf#llE8>OH9uoD37Z1QBMyrQ7OU>Tb!Z)a2%XZ9p+&?Ro(9-GtQY!A=%85|& zhXJjNlE{=J8>cwIecWdV`{Z#zZX(ru&Aop5E98P^n?@8h14 zeBI__i?)BU)&5GGz{=Taz19_ayd_kGtgShSNLv48kr*0yWc5QCei@fJCUIJNDH@^W zfYX&!ajEGT(XmJ!iL~7=86vzulhgAHlil61!rqQywiBgdGt)2zE;dF<^4d8ryUbfs zHp$V&o!aG^Dl1~Q^k~Q@`*R6H`MGo50f{JX`pNpCgyNtYr>Cl?E?~Vl7^`Bku6Q%x zKUbd;@^tvlT&7Y?PjzcWAx+p(zs70*%`XF`7U?N1Bd4dlwSnES>e$6E4`{_Fa&8iJ zl#r*9x1u*>p6Q)A61vD_N0e8^R>jQ5`D{^r%ds8Z znxgrcbfj@md}jj}#ZW)FJWg;pXJe^(1@+sFZ$Y18W@%r-u6TPg0}s7xCvw?^LTFl< zyq}3~?-G6gOyj9nzJDh+!vA$)@o9a1-)4O6`qBr7!Bk+Z$ryELbV|prd>>R>0JFFr zaC%9f`3#ORAT(kNV2}vGbr*z1M0w**@JLY!FdVa)Wtt`dnK-43KsOopY-5Nd=bRNr z@x&z6u@LTB-BI8`_9g&d$D7TvfM>xpSjf4s4Xn;mphZBF_G0liaBj8~n}boP1P?~* zlAU0TFL456R|&Mgz7&dkORYeDxpWs8-;{cS(Si=;k?9auDMtg7bSOuojL*``AolzR zgYr+7^EIR8kVcikXBQa|>-fPifC&@oIf}{G4KpE~QU#x#uYg$VPt1S?u`rek*#G@1 zG|PSrh}L{o`ZxM+-TN-x>>m MS*I?{DCQ;p4~-|t(*OVf delta 3264 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 From 076669b0a36e1bf0aa8a3b38b4830c68692cfb08 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 15:26:58 +0800 Subject: [PATCH 0329/1170] modify code --- src/class146/Code02_InverseCantorExpansion.java | 2 ++ src/class169/Code01_Juice1.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/class146/Code02_InverseCantorExpansion.java b/src/class146/Code02_InverseCantorExpansion.java index ccbfb3419..b801cbec7 100644 --- a/src/class146/Code02_InverseCantorExpansion.java +++ b/src/class146/Code02_InverseCantorExpansion.java @@ -23,6 +23,8 @@ public class Code02_InverseCantorExpansion { public static long[] arr = new long[MAXN]; // 线段树 + // 这种使用线段树的方式叫线段树二分 + // 讲解169的题目1,也涉及线段树二分 public static int[] sum = new int[MAXN << 2]; public static int n; diff --git a/src/class169/Code01_Juice1.java b/src/class169/Code01_Juice1.java index 0d6cf24fa..94d92c8de 100644 --- a/src/class169/Code01_Juice1.java +++ b/src/class169/Code01_Juice1.java @@ -29,6 +29,8 @@ public class Code01_Juice1 { // 小朋友至少的果汁量 public static long[] least = new long[MAXN]; + // 这种使用线段树的方式叫线段树二分 + // 讲解146的题目2,也涉及线段树二分 // 果汁单价作为下标的线段树 // maxp为最大的果汁单价 public static int maxp = 0; From 95e27ea384b507eb2e943eac0931ae96c0ec31bd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 15:40:42 +0800 Subject: [PATCH 0330/1170] modify code --- src/class173/Code06_TreeBlockRandom1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index 6b494531d..af715fa23 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,随机撒点分块,java版 +// 树上分块模版题,随机分块,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 524150a1a272c1abf19605813843a003bc3f462f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 15:59:18 +0800 Subject: [PATCH 0331/1170] modify code --- src/class173/Code06_TreeBlockRandom1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index af715fa23..6b494531d 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,随机分块,java版 +// 树上分块模版题,随机撒点分块,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From fa11cbe6931629aec868568bd6fc82d4b1d49e4b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 21:28:45 +0800 Subject: [PATCH 0332/1170] modify code --- src/class173/Code05_TreeBlockHld1.java | 118 ++++---- src/class173/Code05_TreeBlockHld2.java | 6 +- src/class173/Code06_TreeBlockRandom1.java | 349 +++++++++++++++++++++- src/class173/Code06_TreeBlockRandom2.java | 175 +++++++++++ 4 files changed, 592 insertions(+), 56 deletions(-) create mode 100644 src/class173/Code06_TreeBlockRandom2.java diff --git a/src/class173/Code05_TreeBlockHld1.java b/src/class173/Code05_TreeBlockHld1.java index 9b1ccc95e..15c42f67b 100644 --- a/src/class173/Code05_TreeBlockHld1.java +++ b/src/class173/Code05_TreeBlockHld1.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,重链序列分块,java版 +// 树上分块模版题,重链剖分 + 序列分块,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,9 +12,8 @@ public class Code05_TreeBlockHld1 { public static int MAXN = 100001; - public static int MAXB = 1001; + public static int MAXB = 301; public static int MAXV = 30001; - public static int MAXS = (MAXV + 31) / 32; public static int n, m, f, k; public static int[] arr = new int[MAXN]; @@ -39,10 +38,58 @@ public class Code05_TreeBlockHld1 { public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - public static int[][] bitSet = new int[MAXB][MAXS]; + public static BitSet[] bitSet = new BitSet[MAXB]; - public static int[] tmp = new int[MAXS]; - public static int[] ans = new int[MAXS]; + // 答案 + public static BitSet tmp = new BitSet(); + public static BitSet ans = new BitSet(); + + static class BitSet { + + int len; + + public int[] set; + + public BitSet() { + len = (MAXV + 31) / 32; + set = new int[len]; + } + + public void clear() { + for (int i = 0; i < len; i++) { + set[i] = 0; + } + } + + public void setOne(int v) { + set[v / 32] |= 1 << (v % 32); + } + + public void or(BitSet obj) { + for (int i = 0; i < len; i++) { + set[i] |= obj.set[i]; + } + } + + public int getOnes() { + int ans = 0; + for (int x : set) { + ans += Integer.bitCount(x); + } + return ans; + } + + public int mex() { + for (int i = 0, inv; i < len; i++) { + inv = ~set[i]; + if (inv != 0) { + return i * 32 + Integer.numberOfTrailingZeros(inv); + } + } + return -1; + } + + } public static void addEdge(int u, int v) { next[++cntg] = head[u]; @@ -169,55 +216,21 @@ public static void dfs4() { } } - public static void setOne(int[] cur, int v) { - cur[v / 32] |= 1 << (v % 32); - } - - public static void clear(int[] cur) { - for (int i = 0; i < MAXS; i++) { - cur[i] = 0; - } - } - - public static void or(int[] a, int[] b) { - for (int i = 0; i < MAXS; i++) { - a[i] |= b[i]; - } - } - - public static int getOnes(int[] cur) { - int ans = 0; - for (int x : cur) { - ans += Integer.bitCount(x); - } - return ans; - } - - public static int firstMiss(int[] cur) { - for (int i = 0, inv; i < MAXS; i++) { - inv = ~cur[i]; - if (inv != 0) { - return i * 32 + Integer.numberOfTrailingZeros(inv); - } - } - return -1; - } - public static void query(int l, int r) { - clear(tmp); + tmp.clear(); if (bi[l] == bi[r]) { for (int i = l; i <= r; i++) { - setOne(tmp, val[i]); + tmp.setOne(val[i]); } } else { for (int i = l; i <= br[bi[l]]; i++) { - setOne(tmp, val[i]); + tmp.setOne(val[i]); } for (int i = bl[bi[r]]; i <= r; i++) { - setOne(tmp, val[i]); + tmp.setOne(val[i]); } for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { - or(tmp, bitSet[i]); + tmp.or(bitSet[i]); } } } @@ -230,18 +243,18 @@ public static void updateAns(int x, int y) { y = tmp; } query(dfn[top[x]], dfn[x]); - or(ans, tmp); + ans.or(tmp); x = fa[top[x]]; } query(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y])); - or(ans, tmp); + ans.or(tmp); } public static void prepare() { dfs3(); dfs4(); // 调整块长 - blen = (int) Math.sqrt(n * 20); + blen = (int) Math.sqrt(20.0 * n); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; @@ -249,8 +262,9 @@ public static void prepare() { for (int i = 1; i <= bnum; i++) { bl[i] = (i - 1) * blen + 1; br[i] = Math.min(i * blen, n); + bitSet[i] = new BitSet(); for (int j = bl[i]; j <= br[i]; j++) { - setOne(bitSet[i], val[j]); + bitSet[i].setOne(val[j]); } } } @@ -272,7 +286,7 @@ public static void main(String[] args) throws IOException { } prepare(); for (int i = 1, last = 0; i <= m; i++) { - clear(ans); + ans.clear(); k = in.nextInt(); for (int j = 1, x, y; j <= k; j++) { x = in.nextInt(); @@ -283,8 +297,8 @@ public static void main(String[] args) throws IOException { } updateAns(x, y); } - int ans1 = getOnes(ans); - int ans2 = firstMiss(ans); + int ans1 = ans.getOnes(); + int ans2 = ans.mex(); out.println(ans1 + " " + ans2); last = ans1 + ans2; } diff --git a/src/class173/Code05_TreeBlockHld2.java b/src/class173/Code05_TreeBlockHld2.java index 9bf9dfb31..490ea2f81 100644 --- a/src/class173/Code05_TreeBlockHld2.java +++ b/src/class173/Code05_TreeBlockHld2.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,重链序列分块,C++版 +// 树上分块模版题,重链剖分 + 序列分块,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -10,7 +10,7 @@ //using namespace std; // //const int MAXN = 100001; -//const int MAXB = 1001; +//const int MAXB = 301; //const int MAXV = 30001; //int n, m, f, k; //int arr[MAXN]; @@ -116,7 +116,7 @@ //void prepare() { // dfs1(1, 0); // dfs2(1, 1); -// blen = (int)sqrt(n * 20); +// blen = (int)sqrt(20.0 * n); // bnum = (n + blen - 1) / blen; // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index 6b494531d..10c82ae59 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -1,9 +1,356 @@ package class173; -// 树上分块模版题,随机撒点分块,java版 +// 树上分块模版题,重链剖分 + 随机撒点,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + public class Code06_TreeBlockRandom1 { + public static int MAXN = 100001; + public static int MAXB = 301; + public static int MAXV = 30001; + public static int n, m, f, k; + public static int[] arr = new int[MAXN]; + + // 链式前向星 + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg = 0; + + // 重链剖分 + public static int[] fa = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[] top = new int[MAXN]; + + // 随机撒点 + public static int bnum; + public static int[] tag = new int[MAXN]; + public static int[] spe = new int[MAXN]; + public static int[] up = new int[MAXN]; + public static boolean[] vis = new boolean[MAXN]; + public static BitSet[][] bitSet = new BitSet[MAXB][MAXB]; + + public static BitSet tmp = new BitSet(); + public static BitSet ans = new BitSet(); + + static class BitSet { + + int len; + + public int[] set; + + public BitSet() { + len = (MAXV + 31) / 32; + set = new int[len]; + } + + public void clear() { + for (int i = 0; i < len; i++) { + set[i] = 0; + } + } + + public void setOne(int v) { + set[v / 32] |= 1 << (v % 32); + } + + public void or(BitSet obj) { + for (int i = 0; i < len; i++) { + set[i] |= obj.set[i]; + } + } + + public int getOnes() { + int ans = 0; + for (int x : set) { + ans += Integer.bitCount(x); + } + return ans; + } + + public int mex() { + for (int i = 0, inv; i < len; i++) { + inv = ~set[i]; + if (inv != 0) { + return i * 32 + Integer.numberOfTrailingZeros(inv); + } + } + return -1; + } + + } + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void dfs1(int u, int f) { + fa[u] = f; + dep[u] = dep[f] + 1; + siz[u] = 1; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != f) { + dfs1(v, u); + } + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + + public static void dfs2(int u, int t) { + top[u] = t; + if (son[u] == 0) { + return; + } + dfs2(son[u], t); + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, v); + } + } + } + + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + public static int[][] fse = new int[MAXN][3]; + + public static int stacksize, first, second, edge; + + public static void push(int fir, int sec, int edg) { + fse[stacksize][0] = fir; + fse[stacksize][1] = sec; + fse[stacksize][2] = edg; + stacksize++; + } + + public static void pop() { + --stacksize; + first = fse[stacksize][0]; + second = fse[stacksize][1]; + edge = fse[stacksize][2]; + } + + // dfs1的迭代版 + public static void dfs3() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { + fa[first] = second; + dep[first] = dep[second] + 1; + siz[first] = 1; + edge = head[first]; + } else { + edge = next[edge]; + } + if (edge != 0) { + push(first, second, edge); + if (to[edge] != second) { + push(to[edge], first, -1); + } + } else { + for (int e = head[first], v; e > 0; e = next[e]) { + v = to[e]; + if (v != second) { + siz[first] += siz[v]; + if (son[first] == 0 || siz[son[first]] < siz[v]) { + son[first] = v; + } + } + } + } + } + } + + // dfs2的迭代版 + public static void dfs4() { + stacksize = 0; + push(1, 1, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { + top[first] = second; + if (son[first] == 0) { + continue; + } + push(first, second, -2); + push(son[first], second, -1); + continue; + } else if (edge == -2) { + edge = head[first]; + } else { + edge = next[edge]; + } + if (edge != 0) { + push(first, second, edge); + if (to[edge] != fa[first] && to[edge] != son[first]) { + push(to[edge], to[edge], -1); + } + } + } + } + + public static int lca(int a, int b) { + while (top[a] != top[b]) { + if (dep[top[a]] <= dep[top[b]]) { + b = fa[top[b]]; + } else { + a = fa[top[a]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + public static void query(int x, int xylca) { + while (spe[x] == 0 && x != xylca) { + ans.setOne(arr[x]); + x = fa[x]; + } + int backup = x; + while (up[x] > 0 && dep[up[x]] > dep[xylca]) { + x = up[x]; + } + ans.or(bitSet[spe[backup]][spe[x]]); + while (x != xylca) { + ans.setOne(arr[x]); + x = fa[x]; + } + } + + public static void updateAns(int x, int y) { + int xylca = lca(x, y); + ans.setOne(arr[xylca]); + query(x, xylca); + query(y, xylca); + } + + public static void prepare() { + dfs3(); + dfs4(); + int blen = (int) Math.sqrt(20.0 * n); + bnum = (n + blen - 1) / blen; + for (int i = 1, pick; i <= bnum; i++) { + do { + pick = (int) (Math.random() * n) + 1; + } while (vis[pick]); + vis[pick] = true; + tag[i] = pick; + spe[pick] = i; + } + for (int i = 0; i <= bnum; i++) { + for (int j = 0; j <= bnum; j++) { + bitSet[i][j] = new BitSet(); + } + } + for (int i = 1, cur; i <= bnum; i++) { + cur = tag[i]; + tmp.clear(); + do { + tmp.setOne(arr[cur]); + if (cur != tag[i] && spe[cur] > 0) { + bitSet[i][spe[cur]].or(tmp); + if (up[tag[i]] == 0) { + up[tag[i]] = cur; + } + } + cur = fa[cur]; + } while (cur != 0); + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + f = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + prepare(); + for (int i = 1, last = 0; i <= m; i++) { + ans.clear(); + k = in.nextInt(); + for (int j = 1, x, y; j <= k; j++) { + x = in.nextInt(); + y = in.nextInt(); + if (f > 0) { + x = x ^ last; + y = y ^ last; + } + updateAns(x, y); + } + int ans1 = ans.getOnes(); + int ans2 = ans.mex(); + out.println(ans1 + " " + ans2); + last = ans1 + ans2; + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_TreeBlockRandom2.java new file mode 100644 index 000000000..f8df20c15 --- /dev/null +++ b/src/class173/Code06_TreeBlockRandom2.java @@ -0,0 +1,175 @@ +package class173; + +// 树上分块模版题,重链剖分 + 随机撒点,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3603 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXB = 301; +//const int MAXV = 30001; +//int n, m, f, k; +//int arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +// +//int bnum; +//int tag[MAXN]; +//int spe[MAXN]; +//int up[MAXN]; +//bool vis[MAXN]; +//bitset bitSet[MAXB][MAXB]; +// +//bitset tmp; +//bitset ans; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs1(int u, int f) { +// fa[u] = f; +// dep[u] = dep[f] + 1; +// siz[u] = 1; +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +// } +//} +// +//void dfs2(int u, int t) { +// top[u] = t; +// if (!son[u]) { +// return; +// } +// dfs2(son[u], t); +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//int lca(int a, int b) { +// while (top[a] != top[b]) { +// if (dep[top[a]] <= dep[top[b]]) { +// b = fa[top[b]]; +// } else { +// a = fa[top[a]]; +// } +// } +// return dep[a] <= dep[b] ? a : b; +//} +// +//void query(int x, int xylca) { +// while (spe[x] == 0 && x != xylca) { +// ans[arr[x]] = 1; +// x = fa[x]; +// } +// int backup = x; +// while (up[x] && dep[up[x]] > dep[xylca]) { +// x = up[x]; +// } +// ans |= bitSet[spe[backup]][spe[x]]; +// while (x != xylca) { +// ans[arr[x]] = 1; +// x = fa[x]; +// } +//} +// +//void updateAns(int x, int y) { +// int xylca = lca(x, y); +// ans[arr[xylca]] = 1; +// query(x, xylca); +// query(y, xylca); +//} +// +//void prepare() { +// dfs1(1, 0); +// dfs2(1, 1); +// int blen = (int)sqrt(20.0 * n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1, pick; i <= bnum; i++) { +// do { +// pick = rand() % n + 1; +// } while (vis[pick]); +// vis[pick] = true; +// tag[i] = pick; +// spe[pick] = i; +// } +// for (int i = 1; i <= bnum; i++) { +// int cur = tag[i]; +// tmp.reset(); +// do { +// tmp[arr[cur]] = 1; +// if (cur != tag[i] && spe[cur] > 0) { +// bitSet[i][spe[cur]] |= tmp; +// if (up[tag[i]] == 0) { +// up[tag[i]] = cur; +// } +// } +// cur = fa[cur]; +// } while (cur != 0); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// srand(time(0)); +// cin >> n >> m >> f; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// prepare(); +// for (int i = 1, last = 0; i <= m; i++) { +// ans.reset(); +// cin >> k; +// for (int j = 1, x, y; j <= k; j++) { +// cin >> x >> y; +// if (f) { +// x ^= last; +// y ^= last; +// } +// updateAns(x, y); +// } +// int ans1 = ans.count(); +// ans.flip(); +// int ans2 = ans._Find_first(); +// cout << ans1 << ' ' << ans2 << '\n'; +// last = ans1 + ans2; +// } +// return 0; +//} \ No newline at end of file From 83ef40caf4763a8bd06df43b1e41e549c46744de Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 21:33:24 +0800 Subject: [PATCH 0333/1170] modify code --- src/class173/Code07_TreeBlockWithModify1.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/class173/Code07_TreeBlockWithModify1.java diff --git a/src/class173/Code07_TreeBlockWithModify1.java b/src/class173/Code07_TreeBlockWithModify1.java new file mode 100644 index 000000000..1c9aa41c7 --- /dev/null +++ b/src/class173/Code07_TreeBlockWithModify1.java @@ -0,0 +1,10 @@ +package class173; + +// 带修改的树上分块,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1491H +// 测试链接 : https://codeforces.com/problemset/problem/1491/H +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code07_TreeBlockWithModify1 { + +} From 0258f7173dfe5e872273a58a4f90c2b956f6fade Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 21:51:06 +0800 Subject: [PATCH 0334/1170] modify code --- src/class173/Code07_Royal1.java | 9 +++++++++ src/class173/Code07_TreeBlockWithModify1.java | 10 ---------- 2 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 src/class173/Code07_Royal1.java delete mode 100644 src/class173/Code07_TreeBlockWithModify1.java diff --git a/src/class173/Code07_Royal1.java b/src/class173/Code07_Royal1.java new file mode 100644 index 000000000..d8d4c74f0 --- /dev/null +++ b/src/class173/Code07_Royal1.java @@ -0,0 +1,9 @@ +package class173; + +// 王室联邦,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2325 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code07_Royal1 { + +} diff --git a/src/class173/Code07_TreeBlockWithModify1.java b/src/class173/Code07_TreeBlockWithModify1.java deleted file mode 100644 index 1c9aa41c7..000000000 --- a/src/class173/Code07_TreeBlockWithModify1.java +++ /dev/null @@ -1,10 +0,0 @@ -package class173; - -// 带修改的树上分块,java版 -// 测试链接 : https://www.luogu.com.cn/problem/CF1491H -// 测试链接 : https://codeforces.com/problemset/problem/1491/H -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -public class Code07_TreeBlockWithModify1 { - -} From f37237330206d75b251899d46c87f95c8ac09ba5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Jun 2025 21:53:19 +0800 Subject: [PATCH 0335/1170] modify code --- src/class173/Code06_TreeBlockRandom1.java | 2 +- src/class173/Code06_TreeBlockRandom2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index 10c82ae59..b4c33ec6a 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -32,10 +32,10 @@ public class Code06_TreeBlockRandom1 { // 随机撒点 public static int bnum; + public static boolean[] vis = new boolean[MAXN]; public static int[] tag = new int[MAXN]; public static int[] spe = new int[MAXN]; public static int[] up = new int[MAXN]; - public static boolean[] vis = new boolean[MAXN]; public static BitSet[][] bitSet = new BitSet[MAXB][MAXB]; public static BitSet tmp = new BitSet(); diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_TreeBlockRandom2.java index f8df20c15..dc6962ed1 100644 --- a/src/class173/Code06_TreeBlockRandom2.java +++ b/src/class173/Code06_TreeBlockRandom2.java @@ -27,10 +27,10 @@ //int top[MAXN]; // //int bnum; +//bool vis[MAXN]; //int tag[MAXN]; //int spe[MAXN]; //int up[MAXN]; -//bool vis[MAXN]; //bitset bitSet[MAXB][MAXB]; // //bitset tmp; From 892ea1c8e311653c72673f7a253dd1ae91f8700a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Jun 2025 13:03:00 +0800 Subject: [PATCH 0336/1170] modify code --- src/class173/Code07_Royal1.java | 112 ++++++++++++++++++++++++++++++++ src/class173/Code07_Royal2.java | 75 +++++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 src/class173/Code07_Royal2.java diff --git a/src/class173/Code07_Royal1.java b/src/class173/Code07_Royal1.java index d8d4c74f0..ed7e7ae56 100644 --- a/src/class173/Code07_Royal1.java +++ b/src/class173/Code07_Royal1.java @@ -4,6 +4,118 @@ // 测试链接 : https://www.luogu.com.cn/problem/P2325 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + public class Code07_Royal1 { + public static int MAXN = 1001; + public static int n, b; + + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static int[] root = new int[MAXN]; + public static int[] belong = new int[MAXN]; + public static int[] stack = new int[MAXN]; + public static int siz; + public static int cntb; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void dfs(int u, int f) { + int tmp = siz; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != f) { + dfs(v, u); + if (siz - tmp >= b) { + root[++cntb] = u; + while (siz > tmp) { + belong[stack[siz--]] = cntb; + } + } + } + } + stack[++siz] = u; + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + b = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + dfs(1, 0); + if (cntb == 0) { + root[++cntb] = 1; + } + while (siz > 0) { + belong[stack[siz--]] = cntb; + } + out.println(cntb); + for (int i = 1; i <= n; i++) { + out.print(belong[i] + " "); + } + out.println(); + for (int i = 1; i <= cntb; i++) { + out.print(root[i] + " "); + } + out.println(); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class173/Code07_Royal2.java b/src/class173/Code07_Royal2.java new file mode 100644 index 000000000..6028d2e1d --- /dev/null +++ b/src/class173/Code07_Royal2.java @@ -0,0 +1,75 @@ +package class173; + +// 王室联邦,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2325 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1001; +//int n, b; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int root[MAXN]; +//int belong[MAXN]; +//int sta[MAXN]; +//int siz; +//int cntb; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs(int u, int f) { +// int tmp = siz; +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs(v, u); +// if (siz - tmp >= b) { +// root[++cntb] = u; +// while (siz > tmp) { +// belong[sta[siz--]] = cntb; +// } +// } +// } +// } +// sta[++siz] = u; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> b; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs(1, 0); +// if (cntb == 0) { +// root[++cntb] = 1; +// } +// while (siz > 0) { +// belong[sta[siz--]] = cntb; +// } +// cout << cntb << '\n'; +// for (int i = 1; i <= n; i++) { +// cout << belong[i] << ' '; +// } +// cout << '\n'; +// for (int i = 1; i <= cntb; i++) { +// cout << root[i] << ' '; +// } +// cout << '\n'; +// return 0; +//} \ No newline at end of file From 183df604c74d1866af62049ca3941bad98b4904a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Jun 2025 14:45:45 +0800 Subject: [PATCH 0337/1170] modify code --- src/class173/Code03_Magnet1.java | 2 +- src/class173/Code08_RangeFatherMinus1.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/class173/Code08_RangeFatherMinus1.java diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index 782f0edf7..cdeb09f55 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -5,7 +5,7 @@ // 测试链接 : https://codeforces.com/problemset/problem/198/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 // 为了这道题能用java通过,我没有把数据封装到一起,组成一个磁块对象 -// 自己手撸了双指针快排优化常数时间,其实并不需要这么做,因为正式比赛不卡常 +// 手写了双指针快排优化常数时间,一般不需要这么做,正式比赛不卡常 import java.io.IOException; import java.io.InputStream; diff --git a/src/class173/Code08_RangeFatherMinus1.java b/src/class173/Code08_RangeFatherMinus1.java new file mode 100644 index 000000000..72d53d55e --- /dev/null +++ b/src/class173/Code08_RangeFatherMinus1.java @@ -0,0 +1,10 @@ +package class173; + +// 区间父变小,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1491H +// 测试链接 : http://codeforces.com/problemset/problem/1491/H +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code08_RangeFatherMinus1 { + +} From 63947bf06739b1515f5d764b7864c24678f68be7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Jun 2025 15:35:38 +0800 Subject: [PATCH 0338/1170] modify code --- src/class173/Code06_TreeBlockRandom1.java | 9 +++++---- src/class173/Code06_TreeBlockRandom2.java | 13 +++++++------ src/class173/Code08_RangeFatherMinus1.java | 10 ---------- 3 files changed, 12 insertions(+), 20 deletions(-) delete mode 100644 src/class173/Code08_RangeFatherMinus1.java diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index b4c33ec6a..fbe307c70 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -262,18 +262,19 @@ public static void prepare() { } } for (int i = 1, cur; i <= bnum; i++) { - cur = tag[i]; tmp.clear(); - do { + tmp.setOne(arr[tag[i]]); + cur = fa[tag[i]]; + while (cur != 0) { tmp.setOne(arr[cur]); - if (cur != tag[i] && spe[cur] > 0) { + if (spe[cur] > 0) { bitSet[i][spe[cur]].or(tmp); if (up[tag[i]] == 0) { up[tag[i]] = cur; } } cur = fa[cur]; - } while (cur != 0); + } } } diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_TreeBlockRandom2.java index dc6962ed1..81c659e87 100644 --- a/src/class173/Code06_TreeBlockRandom2.java +++ b/src/class173/Code06_TreeBlockRandom2.java @@ -124,20 +124,21 @@ // tag[i] = pick; // spe[pick] = i; // } -// for (int i = 1; i <= bnum; i++) { -// int cur = tag[i]; +// for (int i = 1, cur; i <= bnum; i++) { // tmp.reset(); -// do { +// tmp[arr[tag[i]]] = 1; +// cur = fa[tag[i]]; +// while (cur != 0) { // tmp[arr[cur]] = 1; -// if (cur != tag[i] && spe[cur] > 0) { +// if (spe[cur] > 0) { // bitSet[i][spe[cur]] |= tmp; // if (up[tag[i]] == 0) { // up[tag[i]] = cur; // } // } // cur = fa[cur]; -// } while (cur != 0); -// } +// } +// } //} // //int main() { diff --git a/src/class173/Code08_RangeFatherMinus1.java b/src/class173/Code08_RangeFatherMinus1.java deleted file mode 100644 index 72d53d55e..000000000 --- a/src/class173/Code08_RangeFatherMinus1.java +++ /dev/null @@ -1,10 +0,0 @@ -package class173; - -// 区间父变小,java版 -// 测试链接 : https://www.luogu.com.cn/problem/CF1491H -// 测试链接 : http://codeforces.com/problemset/problem/1491/H -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -public class Code08_RangeFatherMinus1 { - -} From 5405523fa58a2bc24f0f879a575edf289b423ceb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Jun 2025 18:38:27 +0800 Subject: [PATCH 0339/1170] modify code --- src/class173/Code08_RangeFatherMinus1.java | 172 +++++++++++++++++++++ src/class173/Code08_RangeFatherMinus2.java | 125 +++++++++++++++ 2 files changed, 297 insertions(+) create mode 100644 src/class173/Code08_RangeFatherMinus1.java create mode 100644 src/class173/Code08_RangeFatherMinus2.java diff --git a/src/class173/Code08_RangeFatherMinus1.java b/src/class173/Code08_RangeFatherMinus1.java new file mode 100644 index 000000000..ceed9de21 --- /dev/null +++ b/src/class173/Code08_RangeFatherMinus1.java @@ -0,0 +1,172 @@ +package class173; + +// 区间父变小,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1491H +// 测试链接 : https://codeforces.com/problemset/problem/1491/H +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code08_RangeFatherMinus1 { + + public static int MAXN = 100001; + public static int MAXB = 501; + public static int n, m; + public static int[] arr = new int[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + + public static int[] lazy = new int[MAXB]; + public static int[] outer = new int[MAXN]; + public static int[] cnt = new int[MAXB]; + + public static void innerUpdate(int b) { + for (int i = bl[b]; i <= br[b]; i++) { + arr[i] = Math.max(1, arr[i] - lazy[b]); + } + lazy[b] = 0; + for (int i = bl[b]; i <= br[b]; i++) { + if (arr[i] < bl[b]) { + outer[i] = arr[i]; + } else { + outer[i] = outer[arr[i]]; + } + } + } + + public static void update(int l, int r, int v) { + if (bi[l] == bi[r]) { + for (int i = l; i <= r; i++) { + arr[i] = Math.max(1, arr[i] - v); + } + innerUpdate(bi[l]); + } else { + for (int i = l; i <= br[bi[l]]; i++) { + arr[i] = Math.max(1, arr[i] - v); + } + innerUpdate(bi[l]); + for (int i = bl[bi[r]]; i <= r; i++) { + arr[i] = Math.max(1, arr[i] - v); + } + innerUpdate(bi[r]); + for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { + lazy[i] = Math.min(n, lazy[i] + v); + if (++cnt[i] <= blen) { + innerUpdate(i); + } + } + } + } + + public static int jumpFa(int i) { + return Math.max(1, arr[i] - lazy[bi[i]]); + } + + public static int jumpOut(int i) { + return Math.max(1, outer[i] - lazy[bi[i]]); + } + + public static int lca(int x, int y) { + while (bi[x] != bi[y] || jumpOut(x) != jumpOut(y)) { + if (bi[x] == bi[y]) { + x = jumpOut(x); + y = jumpOut(y); + } else { + if (bi[x] < bi[y]) { + int tmp = x; x = y; y = tmp; + } + x = jumpOut(x); + } + } + while (x != y) { + if (x < y) { + int tmp = x; x = y; y = tmp; + } + x = jumpFa(x); + } + return x; + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + innerUpdate(i); + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 2; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + for (int i = 1, op, x, y, z; i <= m; i++) { + op = in.nextInt(); + x = in.nextInt(); + y = in.nextInt(); + if (op == 1) { + z = in.nextInt(); + update(x, y, z); + } else { + out.println(lca(x, y)); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class173/Code08_RangeFatherMinus2.java b/src/class173/Code08_RangeFatherMinus2.java new file mode 100644 index 000000000..ad04273aa --- /dev/null +++ b/src/class173/Code08_RangeFatherMinus2.java @@ -0,0 +1,125 @@ +package class173; + +// 区间父变小,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1491H +// 测试链接 : https://codeforces.com/problemset/problem/1491/H +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXB = 501; +//int n, m; +//int arr[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +// +//int lazy[MAXB]; +//int outer[MAXN]; +//int cnt[MAXB]; +// +//void innerUpdate(int b) { +// for (int i = bl[b]; i <= br[b]; i++) { +// arr[i] = max(1, arr[i] - lazy[b]); +// } +// lazy[b] = 0; +// for (int i = bl[b]; i <= br[b]; i++) { +// if (arr[i] < bl[b]) { +// outer[i] = arr[i]; +// } else { +// outer[i] = outer[arr[i]]; +// } +// } +//} +// +//void update(int l, int r, int v) { +// if (bi[l] == bi[r]) { +// for (int i = l; i <= r; i++) { +// arr[i] = max(1, arr[i] - v); +// } +// innerUpdate(bi[l]); +// } else { +// for (int i = l; i <= br[bi[l]]; i++) { +// arr[i] = max(1, arr[i] - v); +// } +// innerUpdate(bi[l]); +// for (int i = bl[bi[r]]; i <= r; i++) { +// arr[i] = max(1, arr[i] - v); +// } +// innerUpdate(bi[r]); +// for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { +// lazy[i] = min(n, lazy[i] + v); +// if (++cnt[i] <= blen) { +// innerUpdate(i); +// } +// } +// } +//} +// +//int jumpFa(int i) { +// return max(1, arr[i] - lazy[bi[i]]); +//} +// +//int jumpOut(int i) { +// return max(1, outer[i] - lazy[bi[i]]); +//} +// +//int lca(int x, int y) { +// while (bi[x] != bi[y] || jumpOut(x) != jumpOut(y)) { +// if (bi[x] == bi[y]) { +// x = jumpOut(x); +// y = jumpOut(y); +// } else { +// if (bi[x] < bi[y]) { +// swap(x, y); +// } +// x = jumpOut(x); +// } +// } +// while (x != y) { +// if (x < y) { +// swap(x, y); +// } +// x = jumpFa(x); +// } +// return x; +//} +// +//void prepare() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// innerUpdate(i); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 2; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// for (int i = 1, op, x, y, z; i <= m; i++) { +// cin >> op >> x >> y; +// if (op == 1) { +// cin >> z; +// update(x, y, z); +// } else { +// cout << lca(x, y) << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 71e6f98ab6f6dbca3611d94b77f8caa83e08c386 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Jun 2025 20:08:48 +0800 Subject: [PATCH 0340/1170] modify code --- src/class173/Code01_Sequence1.java | 6 ++++ src/class173/Code01_Sequence2.java | 6 ++++ src/class173/Code02_Poker1.java | 5 ++++ src/class173/Code02_Poker2.java | 5 ++++ src/class173/Code03_Magnet1.java | 34 ++++++++++++++++++---- src/class173/Code03_Magnet2.java | 10 +++++++ src/class173/Code04_Inversion1.java | 4 +++ src/class173/Code04_Inversion2.java | 4 +++ src/class173/Code05_TreeBlockHld1.java | 7 +++++ src/class173/Code05_TreeBlockHld2.java | 7 +++++ src/class173/Code06_TreeBlockRandom1.java | 7 +++++ src/class173/Code06_TreeBlockRandom2.java | 7 +++++ src/class173/Code07_Royal1.java | 9 ++++++ src/class173/Code07_Royal2.java | 9 ++++++ src/class173/Code08_RangeFatherMinus1.java | 13 +++++++-- src/class173/Code08_RangeFatherMinus2.java | 5 ++++ 16 files changed, 130 insertions(+), 8 deletions(-) diff --git a/src/class173/Code01_Sequence1.java b/src/class173/Code01_Sequence1.java index efb7bcf36..1ace32076 100644 --- a/src/class173/Code01_Sequence1.java +++ b/src/class173/Code01_Sequence1.java @@ -1,6 +1,12 @@ package class173; // 序列,java版 +// 给定一个长度为n的数组arr,初始时刻认为是第0秒 +// 接下来发生m条操作,第i条操作发生在第i秒,操作类型如下 +// 操作 1 l r v : arr[l..r]范围上每个数加v,v可能是负数 +// 操作 2 x v : 不包括当前这一秒,查询过去多少秒内,arr[x] >= v +// 2 <= n、m <= 10^5 +// -10^9 <= 数组中的值 <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3863 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class173/Code01_Sequence2.java b/src/class173/Code01_Sequence2.java index 006c649d2..f01340edb 100644 --- a/src/class173/Code01_Sequence2.java +++ b/src/class173/Code01_Sequence2.java @@ -1,6 +1,12 @@ package class173; // 序列,C++版 +// 给定一个长度为n的数组arr,初始时刻认为是第0秒 +// 接下来发生m条操作,第i条操作发生在第i秒,操作类型如下 +// 操作 1 l r v : arr[l..r]范围上每个数加v,v可能是负数 +// 操作 2 x v : 不包括当前这一秒,查询过去多少秒内,arr[x] >= v +// 2 <= n、m <= 10^5 +// -10^9 <= 数组中的值 <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3863 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class173/Code02_Poker1.java b/src/class173/Code02_Poker1.java index 481c23d55..b9f96a845 100644 --- a/src/class173/Code02_Poker1.java +++ b/src/class173/Code02_Poker1.java @@ -1,6 +1,11 @@ package class173; // 由乃打扑克,java版 +// 给定一个长度为n的数组arr,接下来有m条操作,操作类型如下 +// 操作 1 l r v : 查询arr[l..r]范围上,第v小的数 +// 操作 2 l r v : arr[l..r]范围上每个数加v,v可能是负数 +// 1 <= n、m <= 10^5 +// -2 * 10^4 <= 数组中的值 <= +2 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P5356 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class173/Code02_Poker2.java b/src/class173/Code02_Poker2.java index 3cc0466c9..a2e381ee7 100644 --- a/src/class173/Code02_Poker2.java +++ b/src/class173/Code02_Poker2.java @@ -1,6 +1,11 @@ package class173; // 由乃打扑克,C++版 +// 给定一个长度为n的数组arr,接下来有m条操作,操作类型如下 +// 操作 1 l r v : 查询arr[l..r]范围上,第v小的数 +// 操作 2 l r v : arr[l..r]范围上每个数加v,v可能是负数 +// 1 <= n、m <= 10^5 +// -2 * 10^4 <= 数组中的值 <= +2 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P5356 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index cdeb09f55..c2ece0584 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -1,6 +1,16 @@ package class173; // 磁力块,java版 +// 每个磁块有五个属性值,x、y、m、p、range +// 表示磁块在(x, y)位置、质量为m、磁力为p、吸引半径range +// 磁块A可以把磁块B吸到磁块A的位置,需要满足如下的条件 +// A与B的距离不大于A的吸引半径,并且B的质量不大于A的磁力 +// 你有一个初始磁块,给定初始磁块属性值,你永远在初始磁块的位置 +// 接下来给定n个磁块各自的属性值,你可以用初始磁块,吸过来其中的磁块 +// 吸过来的磁块可以被你随意使用,返回你最多能吸过来多少磁块 +// 1 <= n <= 3 * 10^5 +// -10^9 <= x、y <= +10^9 +// 1 <= m、p、range <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P10590 // 测试链接 : https://codeforces.com/problemset/problem/198/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -36,13 +46,25 @@ public class Code03_Magnet1 { // 下标为i的磁块和下标为j的磁块交换 public static void swap(int i, int j) { int tmp1; - tmp1 = x[i]; x[i] = x[j]; x[j] = tmp1; - tmp1 = y[i]; y[i] = y[j]; y[j] = tmp1; - tmp1 = m[i]; m[i] = m[j]; m[j] = tmp1; - tmp1 = p[i]; p[i] = p[j]; p[j] = tmp1; + tmp1 = x[i]; + x[i] = x[j]; + x[j] = tmp1; + tmp1 = y[i]; + y[i] = y[j]; + y[j] = tmp1; + tmp1 = m[i]; + m[i] = m[j]; + m[j] = tmp1; + tmp1 = p[i]; + p[i] = p[j]; + p[j] = tmp1; long tmp2; - tmp2 = range[i]; range[i] = range[j]; range[j] = tmp2; - tmp2 = dist[i]; dist[i] = dist[j]; dist[j] = tmp2; + tmp2 = range[i]; + range[i] = range[j]; + range[j] = tmp2; + tmp2 = dist[i]; + dist[i] = dist[j]; + dist[j] = tmp2; } // 所有磁块根据m值排序,手写双指针快排 diff --git a/src/class173/Code03_Magnet2.java b/src/class173/Code03_Magnet2.java index 922ff1ebb..2cc692a9d 100644 --- a/src/class173/Code03_Magnet2.java +++ b/src/class173/Code03_Magnet2.java @@ -1,6 +1,16 @@ package class173; // 磁力块,C++版 +// 每个磁块有五个属性值,x、y、m、p、range +// 表示磁块在(x, y)位置、质量为m、磁力为p、吸引半径range +// 磁块A可以把磁块B吸到磁块A的位置,需要满足如下的条件 +// A与B的距离不大于A的吸引半径,并且B的质量不大于A的磁力 +// 你有一个初始磁块,给定初始磁块属性值,你永远在初始磁块的位置 +// 接下来给定n个磁块各自的属性值,你可以用初始磁块,吸过来其中的磁块 +// 吸过来的磁块可以被你随意使用,返回你最多能吸过来多少磁块 +// 1 <= n <= 3 * 10^5 +// -10^9 <= x、y <= +10^9 +// 1 <= m、p、range <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P10590 // 测试链接 : https://codeforces.com/problemset/problem/198/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class173/Code04_Inversion1.java b/src/class173/Code04_Inversion1.java index b50a47af2..a8c1c8531 100644 --- a/src/class173/Code04_Inversion1.java +++ b/src/class173/Code04_Inversion1.java @@ -1,6 +1,10 @@ package class173; // 区间逆序对,java版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 操作 l r : 打印arr[l..r]范围上的逆序对数量 +// 1 <= n、m <= 10^5 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P5046 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是无法通过测试 diff --git a/src/class173/Code04_Inversion2.java b/src/class173/Code04_Inversion2.java index a6fe80adf..824f4ae6a 100644 --- a/src/class173/Code04_Inversion2.java +++ b/src/class173/Code04_Inversion2.java @@ -1,6 +1,10 @@ package class173; // 区间逆序对,C++版 +// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 操作 l r : 打印arr[l..r]范围上的逆序对数量 +// 1 <= n、m <= 10^5 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P5046 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class173/Code05_TreeBlockHld1.java b/src/class173/Code05_TreeBlockHld1.java index 15c42f67b..cbe247e3d 100644 --- a/src/class173/Code05_TreeBlockHld1.java +++ b/src/class173/Code05_TreeBlockHld1.java @@ -1,6 +1,13 @@ package class173; // 树上分块模版题,重链剖分 + 序列分块,java版 +// 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 +// 接下来由m条操作,每条操作都要打印两个答案,操作类型如下 +// 操作 k x1 y1 x2 y2 ..(一共k个点对) +// 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 +// 先打印k条路径总共有多少个不同的点权,再打印其中没有出现的最小非负整数(mex) +// 1 <= n、m <= 10^5 点权 <= 30000 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class173/Code05_TreeBlockHld2.java b/src/class173/Code05_TreeBlockHld2.java index 490ea2f81..60576d590 100644 --- a/src/class173/Code05_TreeBlockHld2.java +++ b/src/class173/Code05_TreeBlockHld2.java @@ -1,6 +1,13 @@ package class173; // 树上分块模版题,重链剖分 + 序列分块,C++版 +// 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 +// 接下来由m条操作,每条操作都要打印两个答案,操作类型如下 +// 操作 k x1 y1 x2 y2 ..(一共k个点对) +// 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 +// 先打印k条路径总共有多少个不同的点权,再打印其中没有出现的最小非负整数(mex) +// 1 <= n、m <= 10^5 点权 <= 30000 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index fbe307c70..ce05a56c8 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -1,6 +1,13 @@ package class173; // 树上分块模版题,重链剖分 + 随机撒点,java版 +// 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 +// 接下来由m条操作,每条操作都要打印两个答案,操作类型如下 +// 操作 k x1 y1 x2 y2 ..(一共k个点对) +// 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 +// 先打印k条路径总共有多少个不同的点权,再打印其中没有出现的最小非负整数(mex) +// 1 <= n、m <= 10^5 点权 <= 30000 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_TreeBlockRandom2.java index 81c659e87..39bf30da9 100644 --- a/src/class173/Code06_TreeBlockRandom2.java +++ b/src/class173/Code06_TreeBlockRandom2.java @@ -1,6 +1,13 @@ package class173; // 树上分块模版题,重链剖分 + 随机撒点,C++版 +// 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 +// 接下来由m条操作,每条操作都要打印两个答案,操作类型如下 +// 操作 k x1 y1 x2 y2 ..(一共k个点对) +// 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 +// 先打印k条路径总共有多少个不同的点权,再打印其中没有出现的最小非负整数(mex) +// 1 <= n、m <= 10^5 点权 <= 30000 +// 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class173/Code07_Royal1.java b/src/class173/Code07_Royal1.java index ed7e7ae56..992cbbf91 100644 --- a/src/class173/Code07_Royal1.java +++ b/src/class173/Code07_Royal1.java @@ -1,6 +1,15 @@ package class173; // 王室联邦,java版 +// 一共有n个城市,编号1~n,给定n-1条边,所有城市连成一棵树 +// 给定数值b,希望你把树划分成若干个联通区,也叫省,划分要求如下 +// 每个省至少要有b个城市,最多有3 * b个城市,每个省必须有一个省会 +// 省会可在省内也可在省外,一个城市可以是多个省的省会 +// 一个省里,任何城市到达省会的路径上,除了省会之外,其他的城市必须都在省内 +// 根据要求完成一种有效划分即可,先打印你划分了多少个省,假设数量为k +// 然后打印n个数字,范围[1, k],表示每个城市被划分给了哪个省 +// 最后打印k个数字,表示每个省会的城市编号 +// 1 <= n、b <= 10^3 // 测试链接 : https://www.luogu.com.cn/problem/P2325 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class173/Code07_Royal2.java b/src/class173/Code07_Royal2.java index 6028d2e1d..c3dbe210d 100644 --- a/src/class173/Code07_Royal2.java +++ b/src/class173/Code07_Royal2.java @@ -1,6 +1,15 @@ package class173; // 王室联邦,C++版 +// 一共有n个城市,编号1~n,给定n-1条边,所有城市连成一棵树 +// 给定数值b,希望你把树划分成若干个联通区,也叫省,划分要求如下 +// 每个省至少要有b个城市,最多有3 * b个城市,每个省必须有一个省会 +// 省会可在省内也可在省外,一个城市可以是多个省的省会 +// 一个省里,任何城市到达省会的路径上,除了省会之外,其他的城市必须都在省内 +// 根据要求完成一种有效划分即可,先打印你划分了多少个省,假设数量为k +// 然后打印n个数字,范围[1, k],表示每个城市被划分给了哪个省 +// 最后打印k个数字,表示每个省会的城市编号 +// 1 <= n、b <= 10^3 // 测试链接 : https://www.luogu.com.cn/problem/P2325 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class173/Code08_RangeFatherMinus1.java b/src/class173/Code08_RangeFatherMinus1.java index ceed9de21..580c3e348 100644 --- a/src/class173/Code08_RangeFatherMinus1.java +++ b/src/class173/Code08_RangeFatherMinus1.java @@ -1,6 +1,11 @@ package class173; // 区间父变小,java版 +// 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],2 <= i <= n +// 接下来有m条操作,每种操作是如下两种类型中的一种 +// 操作 x y z : [x..y]范围上任何一点i,arr[i] = max(1, arr[i] - z) +// 操作 x y : 查询点x和点y的最低公共祖先 +// 2 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1491H // 测试链接 : https://codeforces.com/problemset/problem/1491/H // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -79,14 +84,18 @@ public static int lca(int x, int y) { y = jumpOut(y); } else { if (bi[x] < bi[y]) { - int tmp = x; x = y; y = tmp; + int tmp = x; + x = y; + y = tmp; } x = jumpOut(x); } } while (x != y) { if (x < y) { - int tmp = x; x = y; y = tmp; + int tmp = x; + x = y; + y = tmp; } x = jumpFa(x); } diff --git a/src/class173/Code08_RangeFatherMinus2.java b/src/class173/Code08_RangeFatherMinus2.java index ad04273aa..08b6f0a1d 100644 --- a/src/class173/Code08_RangeFatherMinus2.java +++ b/src/class173/Code08_RangeFatherMinus2.java @@ -1,6 +1,11 @@ package class173; // 区间父变小,C++版 +// 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],2 <= i <= n +// 接下来有m条操作,每种操作是如下两种类型中的一种 +// 操作 x y z : [x..y]范围上任何一点i,arr[i] = max(1, arr[i] - z) +// 操作 x y : 查询点x和点y的最低公共祖先 +// 2 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1491H // 测试链接 : https://codeforces.com/problemset/problem/1491/H // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From cb3ee6608648da2fe3b70410257cdf29320d60cd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Jun 2025 20:10:27 +0800 Subject: [PATCH 0341/1170] modify code --- src/class173/Code08_RangeFatherMinus1.java | 2 +- src/class173/Code08_RangeFatherMinus2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code08_RangeFatherMinus1.java b/src/class173/Code08_RangeFatherMinus1.java index 580c3e348..6a9ef3778 100644 --- a/src/class173/Code08_RangeFatherMinus1.java +++ b/src/class173/Code08_RangeFatherMinus1.java @@ -1,7 +1,7 @@ package class173; // 区间父变小,java版 -// 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],2 <= i <= n +// 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],给定arr[2..n] // 接下来有m条操作,每种操作是如下两种类型中的一种 // 操作 x y z : [x..y]范围上任何一点i,arr[i] = max(1, arr[i] - z) // 操作 x y : 查询点x和点y的最低公共祖先 diff --git a/src/class173/Code08_RangeFatherMinus2.java b/src/class173/Code08_RangeFatherMinus2.java index 08b6f0a1d..6f85ac6b1 100644 --- a/src/class173/Code08_RangeFatherMinus2.java +++ b/src/class173/Code08_RangeFatherMinus2.java @@ -1,7 +1,7 @@ package class173; // 区间父变小,C++版 -// 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],2 <= i <= n +// 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],给定arr[2..n] // 接下来有m条操作,每种操作是如下两种类型中的一种 // 操作 x y z : [x..y]范围上任何一点i,arr[i] = max(1, arr[i] - z) // 操作 x y : 查询点x和点y的最低公共祖先 From 1525cd278b8a0fd8e9f6ea055684589b3b238527 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Jun 2025 20:12:52 +0800 Subject: [PATCH 0342/1170] modify code --- src/class173/Code07_Royal1.java | 2 +- src/class173/Code07_Royal2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code07_Royal1.java b/src/class173/Code07_Royal1.java index 992cbbf91..9554a8f75 100644 --- a/src/class173/Code07_Royal1.java +++ b/src/class173/Code07_Royal1.java @@ -5,7 +5,7 @@ // 给定数值b,希望你把树划分成若干个联通区,也叫省,划分要求如下 // 每个省至少要有b个城市,最多有3 * b个城市,每个省必须有一个省会 // 省会可在省内也可在省外,一个城市可以是多个省的省会 -// 一个省里,任何城市到达省会的路径上,除了省会之外,其他的城市必须都在省内 +// 一个省里,任何城市到达省会的路径上,除了省会之外的其他城市,必须都在省内 // 根据要求完成一种有效划分即可,先打印你划分了多少个省,假设数量为k // 然后打印n个数字,范围[1, k],表示每个城市被划分给了哪个省 // 最后打印k个数字,表示每个省会的城市编号 diff --git a/src/class173/Code07_Royal2.java b/src/class173/Code07_Royal2.java index c3dbe210d..47e0fa9f8 100644 --- a/src/class173/Code07_Royal2.java +++ b/src/class173/Code07_Royal2.java @@ -5,7 +5,7 @@ // 给定数值b,希望你把树划分成若干个联通区,也叫省,划分要求如下 // 每个省至少要有b个城市,最多有3 * b个城市,每个省必须有一个省会 // 省会可在省内也可在省外,一个城市可以是多个省的省会 -// 一个省里,任何城市到达省会的路径上,除了省会之外,其他的城市必须都在省内 +// 一个省里,任何城市到达省会的路径上,除了省会之外的其他城市,必须都在省内 // 根据要求完成一种有效划分即可,先打印你划分了多少个省,假设数量为k // 然后打印n个数字,范围[1, k],表示每个城市被划分给了哪个省 // 最后打印k个数字,表示每个省会的城市编号 From 1257702edf377ab89220fc20469a72fcc620ac22 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Jun 2025 20:16:54 +0800 Subject: [PATCH 0343/1170] modify code --- src/class173/Code05_TreeBlockHld1.java | 6 +++--- src/class173/Code05_TreeBlockHld2.java | 6 +++--- src/class173/Code06_TreeBlockRandom1.java | 6 +++--- src/class173/Code06_TreeBlockRandom2.java | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class173/Code05_TreeBlockHld1.java b/src/class173/Code05_TreeBlockHld1.java index cbe247e3d..5068e3357 100644 --- a/src/class173/Code05_TreeBlockHld1.java +++ b/src/class173/Code05_TreeBlockHld1.java @@ -2,10 +2,10 @@ // 树上分块模版题,重链剖分 + 序列分块,java版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 -// 接下来由m条操作,每条操作都要打印两个答案,操作类型如下 -// 操作 k x1 y1 x2 y2 ..(一共k个点对) +// 接下来有m条操作,每条操作都要打印两个答案,描述如下 +// 操作 k x1 y1 x2 y2 .. (一共k个点对) // 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 -// 先打印k条路径总共有多少个不同的点权,再打印其中没有出现的最小非负整数(mex) +// 先打印k条路径上不同点权的数量,再打印点权集合中没有出现的最小非负数(mex) // 1 <= n、m <= 10^5 点权 <= 30000 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 diff --git a/src/class173/Code05_TreeBlockHld2.java b/src/class173/Code05_TreeBlockHld2.java index 60576d590..e26bf2c2b 100644 --- a/src/class173/Code05_TreeBlockHld2.java +++ b/src/class173/Code05_TreeBlockHld2.java @@ -2,10 +2,10 @@ // 树上分块模版题,重链剖分 + 序列分块,C++版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 -// 接下来由m条操作,每条操作都要打印两个答案,操作类型如下 -// 操作 k x1 y1 x2 y2 ..(一共k个点对) +// 接下来有m条操作,每条操作都要打印两个答案,描述如下 +// 操作 k x1 y1 x2 y2 .. (一共k个点对) // 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 -// 先打印k条路径总共有多少个不同的点权,再打印其中没有出现的最小非负整数(mex) +// 先打印k条路径上不同点权的数量,再打印点权集合中没有出现的最小非负数(mex) // 1 <= n、m <= 10^5 点权 <= 30000 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index ce05a56c8..0a58275c9 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -2,10 +2,10 @@ // 树上分块模版题,重链剖分 + 随机撒点,java版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 -// 接下来由m条操作,每条操作都要打印两个答案,操作类型如下 -// 操作 k x1 y1 x2 y2 ..(一共k个点对) +// 接下来有m条操作,每条操作都要打印两个答案,描述如下 +// 操作 k x1 y1 x2 y2 .. (一共k个点对) // 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 -// 先打印k条路径总共有多少个不同的点权,再打印其中没有出现的最小非负整数(mex) +// 先打印k条路径上不同点权的数量,再打印点权集合中没有出现的最小非负数(mex) // 1 <= n、m <= 10^5 点权 <= 30000 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_TreeBlockRandom2.java index 39bf30da9..9c6606b1a 100644 --- a/src/class173/Code06_TreeBlockRandom2.java +++ b/src/class173/Code06_TreeBlockRandom2.java @@ -2,10 +2,10 @@ // 树上分块模版题,重链剖分 + 随机撒点,C++版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 -// 接下来由m条操作,每条操作都要打印两个答案,操作类型如下 -// 操作 k x1 y1 x2 y2 ..(一共k个点对) +// 接下来有m条操作,每条操作都要打印两个答案,描述如下 +// 操作 k x1 y1 x2 y2 .. (一共k个点对) // 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 -// 先打印k条路径总共有多少个不同的点权,再打印其中没有出现的最小非负整数(mex) +// 先打印k条路径上不同点权的数量,再打印点权集合中没有出现的最小非负数(mex) // 1 <= n、m <= 10^5 点权 <= 30000 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 From 7ba34feaff806dbb0526537ee9000533220f50df Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Jun 2025 20:50:18 +0800 Subject: [PATCH 0344/1170] modify code --- src/class173/Code05_TreeBlockHld1.java | 2 +- src/class173/Code05_TreeBlockHld2.java | 2 +- src/class173/Code06_TreeBlockRandom1.java | 167 ++++++++-------------- src/class173/Code06_TreeBlockRandom2.java | 75 ++++------ 4 files changed, 91 insertions(+), 155 deletions(-) diff --git a/src/class173/Code05_TreeBlockHld1.java b/src/class173/Code05_TreeBlockHld1.java index 5068e3357..3460b05ae 100644 --- a/src/class173/Code05_TreeBlockHld1.java +++ b/src/class173/Code05_TreeBlockHld1.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,重链剖分 + 序列分块,java版 +// 树上分块模版题,重链序列分块,java版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 // 接下来有m条操作,每条操作都要打印两个答案,描述如下 // 操作 k x1 y1 x2 y2 .. (一共k个点对) diff --git a/src/class173/Code05_TreeBlockHld2.java b/src/class173/Code05_TreeBlockHld2.java index e26bf2c2b..66f1790f3 100644 --- a/src/class173/Code05_TreeBlockHld2.java +++ b/src/class173/Code05_TreeBlockHld2.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,重链剖分 + 序列分块,C++版 +// 树上分块模版题,重链序列分块,C++版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 // 接下来有m条操作,每条操作都要打印两个答案,描述如下 // 操作 k x1 y1 x2 y2 .. (一共k个点对) diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index 0a58275c9..d49c23c16 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,重链剖分 + 随机撒点,java版 +// 树上分块模版题,随机撒点分块,java版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 // 接下来有m条操作,每条操作都要打印两个答案,描述如下 // 操作 k x1 y1 x2 y2 .. (一共k个点对) @@ -21,6 +21,7 @@ public class Code06_TreeBlockRandom1 { public static int MAXN = 100001; public static int MAXB = 301; public static int MAXV = 30001; + public static int LIMIT = 17; public static int n, m, f, k; public static int[] arr = new int[MAXN]; @@ -30,12 +31,9 @@ public class Code06_TreeBlockRandom1 { public static int[] to = new int[MAXN << 1]; public static int cntg = 0; - // 重链剖分 - public static int[] fa = new int[MAXN]; + // 树上倍增 public static int[] dep = new int[MAXN]; - public static int[] siz = new int[MAXN]; - public static int[] son = new int[MAXN]; - public static int[] top = new int[MAXN]; + public static int[][] stjump = new int[MAXN][LIMIT]; // 随机撒点 public static int bnum; @@ -101,136 +99,90 @@ public static void addEdge(int u, int v) { head[u] = cntg; } - public static void dfs1(int u, int f) { - fa[u] = f; - dep[u] = dep[f] + 1; - siz[u] = 1; - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - if (v != f) { - dfs1(v, u); - } - } - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - if (v != f) { - siz[u] += siz[v]; - if (son[u] == 0 || siz[son[u]] < siz[v]) { - son[u] = v; - } - } - } - } - - public static void dfs2(int u, int t) { - top[u] = t; - if (son[u] == 0) { - return; + // 树上倍增递归版 + public static void dfs1(int u, int fa) { + dep[u] = dep[fa] + 1; + stjump[u][0] = fa; + for (int p = 1; p < LIMIT; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; } - dfs2(son[u], t); - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - if (v != fa[u] && v != son[u]) { - dfs2(v, v); + for (int e = head[u]; e != 0; e = next[e]) { + if (to[e] != fa) { + dfs1(to[e], u); } } } - // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 - public static int[][] fse = new int[MAXN][3]; + // 树上倍增迭代版 + public static int[][] ufe = new int[MAXN][3]; - public static int stacksize, first, second, edge; + public static int stackSize, cur, fath, edge; - public static void push(int fir, int sec, int edg) { - fse[stacksize][0] = fir; - fse[stacksize][1] = sec; - fse[stacksize][2] = edg; - stacksize++; + public static void push(int u, int f, int e) { + ufe[stackSize][0] = u; + ufe[stackSize][1] = f; + ufe[stackSize][2] = e; + stackSize++; } public static void pop() { - --stacksize; - first = fse[stacksize][0]; - second = fse[stacksize][1]; - edge = fse[stacksize][2]; + --stackSize; + cur = ufe[stackSize][0]; + fath = ufe[stackSize][1]; + edge = ufe[stackSize][2]; } - // dfs1的迭代版 - public static void dfs3() { - stacksize = 0; + public static void dfs2() { + stackSize = 0; push(1, 0, -1); - while (stacksize > 0) { - pop(); - if (edge == -1) { - fa[first] = second; - dep[first] = dep[second] + 1; - siz[first] = 1; - edge = head[first]; - } else { - edge = next[edge]; - } - if (edge != 0) { - push(first, second, edge); - if (to[edge] != second) { - push(to[edge], first, -1); - } - } else { - for (int e = head[first], v; e > 0; e = next[e]) { - v = to[e]; - if (v != second) { - siz[first] += siz[v]; - if (son[first] == 0 || siz[son[first]] < siz[v]) { - son[first] = v; - } - } - } - } - } - } - - // dfs2的迭代版 - public static void dfs4() { - stacksize = 0; - push(1, 1, -1); - while (stacksize > 0) { + while (stackSize > 0) { pop(); if (edge == -1) { - top[first] = second; - if (son[first] == 0) { - continue; + dep[cur] = dep[fath] + 1; + stjump[cur][0] = fath; + for (int p = 1; p < LIMIT; p++) { + stjump[cur][p] = stjump[stjump[cur][p - 1]][p - 1]; } - push(first, second, -2); - push(son[first], second, -1); - continue; - } else if (edge == -2) { - edge = head[first]; + edge = head[cur]; } else { edge = next[edge]; } if (edge != 0) { - push(first, second, edge); - if (to[edge] != fa[first] && to[edge] != son[first]) { - push(to[edge], to[edge], -1); + push(cur, fath, edge); + if (to[edge] != fath) { + push(to[edge], cur, -1); } } } } public static int lca(int a, int b) { - while (top[a] != top[b]) { - if (dep[top[a]] <= dep[top[b]]) { - b = fa[top[b]]; - } else { - a = fa[top[a]]; + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = LIMIT - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = LIMIT - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; } } - return dep[a] <= dep[b] ? a : b; + return stjump[a][0]; } public static void query(int x, int xylca) { while (spe[x] == 0 && x != xylca) { ans.setOne(arr[x]); - x = fa[x]; + x = stjump[x][0]; } int backup = x; while (up[x] > 0 && dep[up[x]] > dep[xylca]) { @@ -239,7 +191,7 @@ public static void query(int x, int xylca) { ans.or(bitSet[spe[backup]][spe[x]]); while (x != xylca) { ans.setOne(arr[x]); - x = fa[x]; + x = stjump[x][0]; } } @@ -251,8 +203,7 @@ public static void updateAns(int x, int y) { } public static void prepare() { - dfs3(); - dfs4(); + dfs2(); int blen = (int) Math.sqrt(20.0 * n); bnum = (n + blen - 1) / blen; for (int i = 1, pick; i <= bnum; i++) { @@ -271,7 +222,7 @@ public static void prepare() { for (int i = 1, cur; i <= bnum; i++) { tmp.clear(); tmp.setOne(arr[tag[i]]); - cur = fa[tag[i]]; + cur = stjump[tag[i]][0]; while (cur != 0) { tmp.setOne(arr[cur]); if (spe[cur] > 0) { @@ -280,7 +231,7 @@ public static void prepare() { up[tag[i]] = cur; } } - cur = fa[cur]; + cur = stjump[cur][0]; } } } diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_TreeBlockRandom2.java index 9c6606b1a..e1e4e7161 100644 --- a/src/class173/Code06_TreeBlockRandom2.java +++ b/src/class173/Code06_TreeBlockRandom2.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,重链剖分 + 随机撒点,C++版 +// 树上分块模版题,随机撒点分块,C++版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 // 接下来有m条操作,每条操作都要打印两个答案,描述如下 // 操作 k x1 y1 x2 y2 .. (一共k个点对) @@ -19,6 +19,7 @@ //const int MAXN = 100001; //const int MAXB = 301; //const int MAXV = 30001; +//const int LIMIT = 17; //int n, m, f, k; //int arr[MAXN]; // @@ -27,11 +28,8 @@ //int to[MAXN << 1]; //int cntg; // -//int fa[MAXN]; //int dep[MAXN]; -//int siz[MAXN]; -//int son[MAXN]; -//int top[MAXN]; +//int stjump[MAXN][LIMIT]; // //int bnum; //bool vis[MAXN]; @@ -49,56 +47,44 @@ // head[u] = cntg; //} // -//void dfs1(int u, int f) { -// fa[u] = f; -// dep[u] = dep[f] + 1; -// siz[u] = 1; -// for (int e = head[u], v; e; e = nxt[e]) { -// v = to[e]; -// if (v != f) { -// dfs1(v, u); -// } +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// stjump[u][0] = fa; +// for (int p = 1; p < LIMIT; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; // } -// for (int e = head[u], v; e; e = nxt[e]) { -// v = to[e]; -// if (v != f) { -// siz[u] += siz[v]; -// if (son[u] == 0 || siz[son[u]] < siz[v]) { -// son[u] = v; -// } +// for (int e = head[u]; e; e = nxt[e]) { +// if (to[e] != fa) { +// dfs(to[e], u); // } // } //} // -//void dfs2(int u, int t) { -// top[u] = t; -// if (!son[u]) { -// return; +//int lca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); // } -// dfs2(son[u], t); -// for (int e = head[u], v; e; e = nxt[e]) { -// v = to[e]; -// if (v != fa[u] && v != son[u]) { -// dfs2(v, v); +// for (int p = LIMIT - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; // } // } -//} -// -//int lca(int a, int b) { -// while (top[a] != top[b]) { -// if (dep[top[a]] <= dep[top[b]]) { -// b = fa[top[b]]; -// } else { -// a = fa[top[a]]; +// if (a == b) { +// return a; +// } +// for (int p = LIMIT - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; // } // } -// return dep[a] <= dep[b] ? a : b; +// return stjump[a][0]; //} // //void query(int x, int xylca) { // while (spe[x] == 0 && x != xylca) { // ans[arr[x]] = 1; -// x = fa[x]; +// x = stjump[x][0]; // } // int backup = x; // while (up[x] && dep[up[x]] > dep[xylca]) { @@ -107,7 +93,7 @@ // ans |= bitSet[spe[backup]][spe[x]]; // while (x != xylca) { // ans[arr[x]] = 1; -// x = fa[x]; +// x = stjump[x][0]; // } //} // @@ -119,8 +105,7 @@ //} // //void prepare() { -// dfs1(1, 0); -// dfs2(1, 1); +// dfs(1, 0); // int blen = (int)sqrt(20.0 * n); // bnum = (n + blen - 1) / blen; // for (int i = 1, pick; i <= bnum; i++) { @@ -134,7 +119,7 @@ // for (int i = 1, cur; i <= bnum; i++) { // tmp.reset(); // tmp[arr[tag[i]]] = 1; -// cur = fa[tag[i]]; +// cur = stjump[tag[i]][0]; // while (cur != 0) { // tmp[arr[cur]] = 1; // if (spe[cur] > 0) { @@ -143,7 +128,7 @@ // up[tag[i]] = cur; // } // } -// cur = fa[cur]; +// cur = stjump[cur][0]; // } // } //} From 0d82a145185ccd794ee6c53f99307617ec6b1e64 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Jun 2025 21:05:21 +0800 Subject: [PATCH 0345/1170] modify code --- src/class173/Code06_TreeBlockRandom1.java | 30 +++++++++++------------ src/class173/Code06_TreeBlockRandom2.java | 30 +++++++++++------------ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index d49c23c16..3cd48254e 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -38,9 +38,9 @@ public class Code06_TreeBlockRandom1 { // 随机撒点 public static int bnum; public static boolean[] vis = new boolean[MAXN]; - public static int[] tag = new int[MAXN]; - public static int[] spe = new int[MAXN]; - public static int[] up = new int[MAXN]; + public static int[] capital = new int[MAXN]; + public static int[] belong = new int[MAXN]; + public static int[] top = new int[MAXN]; public static BitSet[][] bitSet = new BitSet[MAXB][MAXB]; public static BitSet tmp = new BitSet(); @@ -180,15 +180,15 @@ public static int lca(int a, int b) { } public static void query(int x, int xylca) { - while (spe[x] == 0 && x != xylca) { + while (belong[x] == 0 && x != xylca) { ans.setOne(arr[x]); x = stjump[x][0]; } int backup = x; - while (up[x] > 0 && dep[up[x]] > dep[xylca]) { - x = up[x]; + while (top[x] > 0 && dep[top[x]] > dep[xylca]) { + x = top[x]; } - ans.or(bitSet[spe[backup]][spe[x]]); + ans.or(bitSet[belong[backup]][belong[x]]); while (x != xylca) { ans.setOne(arr[x]); x = stjump[x][0]; @@ -211,8 +211,8 @@ public static void prepare() { pick = (int) (Math.random() * n) + 1; } while (vis[pick]); vis[pick] = true; - tag[i] = pick; - spe[pick] = i; + capital[i] = pick; + belong[pick] = i; } for (int i = 0; i <= bnum; i++) { for (int j = 0; j <= bnum; j++) { @@ -221,14 +221,14 @@ public static void prepare() { } for (int i = 1, cur; i <= bnum; i++) { tmp.clear(); - tmp.setOne(arr[tag[i]]); - cur = stjump[tag[i]][0]; + tmp.setOne(arr[capital[i]]); + cur = stjump[capital[i]][0]; while (cur != 0) { tmp.setOne(arr[cur]); - if (spe[cur] > 0) { - bitSet[i][spe[cur]].or(tmp); - if (up[tag[i]] == 0) { - up[tag[i]] = cur; + if (belong[cur] > 0) { + bitSet[i][belong[cur]].or(tmp); + if (top[capital[i]] == 0) { + top[capital[i]] = cur; } } cur = stjump[cur][0]; diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_TreeBlockRandom2.java index e1e4e7161..26b61f3ef 100644 --- a/src/class173/Code06_TreeBlockRandom2.java +++ b/src/class173/Code06_TreeBlockRandom2.java @@ -33,9 +33,9 @@ // //int bnum; //bool vis[MAXN]; -//int tag[MAXN]; -//int spe[MAXN]; -//int up[MAXN]; +//int capital[MAXN]; +//int belong[MAXN]; +//int top[MAXN]; //bitset bitSet[MAXB][MAXB]; // //bitset tmp; @@ -82,15 +82,15 @@ //} // //void query(int x, int xylca) { -// while (spe[x] == 0 && x != xylca) { +// while (belong[x] == 0 && x != xylca) { // ans[arr[x]] = 1; // x = stjump[x][0]; // } // int backup = x; -// while (up[x] && dep[up[x]] > dep[xylca]) { -// x = up[x]; +// while (top[x] && dep[top[x]] > dep[xylca]) { +// x = top[x]; // } -// ans |= bitSet[spe[backup]][spe[x]]; +// ans |= bitSet[belong[backup]][belong[x]]; // while (x != xylca) { // ans[arr[x]] = 1; // x = stjump[x][0]; @@ -113,19 +113,19 @@ // pick = rand() % n + 1; // } while (vis[pick]); // vis[pick] = true; -// tag[i] = pick; -// spe[pick] = i; +// capital[i] = pick; +// belong[pick] = i; // } // for (int i = 1, cur; i <= bnum; i++) { // tmp.reset(); -// tmp[arr[tag[i]]] = 1; -// cur = stjump[tag[i]][0]; +// tmp[arr[capital[i]]] = 1; +// cur = stjump[capital[i]][0]; // while (cur != 0) { // tmp[arr[cur]] = 1; -// if (spe[cur] > 0) { -// bitSet[i][spe[cur]] |= tmp; -// if (up[tag[i]] == 0) { -// up[tag[i]] = cur; +// if (belong[cur] > 0) { +// bitSet[i][belong[cur]] |= tmp; +// if (top[capital[i]] == 0) { +// top[capital[i]] = cur; // } // } // cur = stjump[cur][0]; From 66571cd8436b94e3157b935d36c3a904f77e5a36 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Jun 2025 09:19:35 +0800 Subject: [PATCH 0346/1170] modify code --- src/class173/Code06_TreeBlockRandom1.java | 47 ++++++++++++++--------- src/class173/Code06_TreeBlockRandom2.java | 35 +++++++++-------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index 3cd48254e..5ad75b0d8 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -35,12 +35,21 @@ public class Code06_TreeBlockRandom1 { public static int[] dep = new int[MAXN]; public static int[][] stjump = new int[MAXN][LIMIT]; - // 随机撒点 + // 随机撒点,预处理过程需要 + // bnum表示块的数量,也表示会有几个点被选为代表点 public static int bnum; + // vis[i]表示i号点是否已经选为某个块的代表点 public static boolean[] vis = new boolean[MAXN]; - public static int[] capital = new int[MAXN]; - public static int[] belong = new int[MAXN]; - public static int[] top = new int[MAXN]; + // capital[i]表示第i块的代表节点 + public static int[] capital = new int[MAXB]; + + // 随机撒点,预处理之后生成的信息 + // repBlock[i] = j,表示i号节点是第j块的代表 + // repBlock[i] = 0,表示i号节点不是任何块的代表 + public static int[] repBlock = new int[MAXN]; + // up[i] = j,表示i号节点是某块的代表,它往上跳到最近的代表点是j + public static int[] up = new int[MAXN]; + // bitSet[i][j],表示第i块代表点往上走到第j块的代表点,沿途所有点权组成的位图 public static BitSet[][] bitSet = new BitSet[MAXB][MAXB]; public static BitSet tmp = new BitSet(); @@ -180,15 +189,15 @@ public static int lca(int a, int b) { } public static void query(int x, int xylca) { - while (belong[x] == 0 && x != xylca) { + while (repBlock[x] == 0 && x != xylca) { ans.setOne(arr[x]); x = stjump[x][0]; } - int backup = x; - while (top[x] > 0 && dep[top[x]] > dep[xylca]) { - x = top[x]; + int from = x; + while (up[x] > 0 && dep[up[x]] > dep[xylca]) { + x = up[x]; } - ans.or(bitSet[belong[backup]][belong[x]]); + ans.or(bitSet[repBlock[from]][repBlock[x]]); while (x != xylca) { ans.setOne(arr[x]); x = stjump[x][0]; @@ -206,29 +215,29 @@ public static void prepare() { dfs2(); int blen = (int) Math.sqrt(20.0 * n); bnum = (n + blen - 1) / blen; - for (int i = 1, pick; i <= bnum; i++) { + for (int b = 1, pick; b <= bnum; b++) { do { pick = (int) (Math.random() * n) + 1; } while (vis[pick]); vis[pick] = true; - capital[i] = pick; - belong[pick] = i; + capital[b] = pick; + repBlock[pick] = b; } for (int i = 0; i <= bnum; i++) { for (int j = 0; j <= bnum; j++) { bitSet[i][j] = new BitSet(); } } - for (int i = 1, cur; i <= bnum; i++) { + for (int b = 1, cur; b <= bnum; b++) { tmp.clear(); - tmp.setOne(arr[capital[i]]); - cur = stjump[capital[i]][0]; + tmp.setOne(arr[capital[b]]); + cur = stjump[capital[b]][0]; while (cur != 0) { tmp.setOne(arr[cur]); - if (belong[cur] > 0) { - bitSet[i][belong[cur]].or(tmp); - if (top[capital[i]] == 0) { - top[capital[i]] = cur; + if (repBlock[cur] > 0) { + bitSet[b][repBlock[cur]].or(tmp); + if (up[capital[b]] == 0) { + up[capital[b]] = cur; } } cur = stjump[cur][0]; diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_TreeBlockRandom2.java index 26b61f3ef..a4129b606 100644 --- a/src/class173/Code06_TreeBlockRandom2.java +++ b/src/class173/Code06_TreeBlockRandom2.java @@ -34,8 +34,9 @@ //int bnum; //bool vis[MAXN]; //int capital[MAXN]; -//int belong[MAXN]; -//int top[MAXN]; +// +//int repBlock[MAXN]; +//int up[MAXN]; //bitset bitSet[MAXB][MAXB]; // //bitset tmp; @@ -82,15 +83,15 @@ //} // //void query(int x, int xylca) { -// while (belong[x] == 0 && x != xylca) { +// while (repBlock[x] == 0 && x != xylca) { // ans[arr[x]] = 1; // x = stjump[x][0]; // } -// int backup = x; -// while (top[x] && dep[top[x]] > dep[xylca]) { -// x = top[x]; +// int from = x; +// while (up[x] && dep[up[x]] > dep[xylca]) { +// x = up[x]; // } -// ans |= bitSet[belong[backup]][belong[x]]; +// ans |= bitSet[repBlock[from]][repBlock[x]]; // while (x != xylca) { // ans[arr[x]] = 1; // x = stjump[x][0]; @@ -108,24 +109,24 @@ // dfs(1, 0); // int blen = (int)sqrt(20.0 * n); // bnum = (n + blen - 1) / blen; -// for (int i = 1, pick; i <= bnum; i++) { +// for (int b = 1, pick; b <= bnum; b++) { // do { // pick = rand() % n + 1; // } while (vis[pick]); // vis[pick] = true; -// capital[i] = pick; -// belong[pick] = i; +// capital[b] = pick; +// repBlock[pick] = b; // } -// for (int i = 1, cur; i <= bnum; i++) { +// for (int b = 1, cur; b <= bnum; b++) { // tmp.reset(); -// tmp[arr[capital[i]]] = 1; -// cur = stjump[capital[i]][0]; +// tmp[arr[capital[b]]] = 1; +// cur = stjump[capital[b]][0]; // while (cur != 0) { // tmp[arr[cur]] = 1; -// if (belong[cur] > 0) { -// bitSet[i][belong[cur]] |= tmp; -// if (top[capital[i]] == 0) { -// top[capital[i]] = cur; +// if (repBlock[cur] > 0) { +// bitSet[b][repBlock[cur]] |= tmp; +// if (up[capital[b]] == 0) { +// up[capital[b]] = cur; // } // } // cur = stjump[cur][0]; From b948ac5d8f70b3ca00cfecbc4b7222ff51d31fd0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Jun 2025 09:37:31 +0800 Subject: [PATCH 0347/1170] modify code --- src/class173/Code05_TreeBlockHld1.java | 2 +- src/class173/Code05_TreeBlockHld2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code05_TreeBlockHld1.java b/src/class173/Code05_TreeBlockHld1.java index 3460b05ae..e6f7080a4 100644 --- a/src/class173/Code05_TreeBlockHld1.java +++ b/src/class173/Code05_TreeBlockHld1.java @@ -6,7 +6,7 @@ // 操作 k x1 y1 x2 y2 .. (一共k个点对) // 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 // 先打印k条路径上不同点权的数量,再打印点权集合中没有出现的最小非负数(mex) -// 1 <= n、m <= 10^5 点权 <= 30000 +// 1 <= n、点对总数 <= 10^5 点权 <= 30000 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class173/Code05_TreeBlockHld2.java b/src/class173/Code05_TreeBlockHld2.java index 66f1790f3..03d539faf 100644 --- a/src/class173/Code05_TreeBlockHld2.java +++ b/src/class173/Code05_TreeBlockHld2.java @@ -6,7 +6,7 @@ // 操作 k x1 y1 x2 y2 .. (一共k个点对) // 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 // 先打印k条路径上不同点权的数量,再打印点权集合中没有出现的最小非负数(mex) -// 1 <= n、m <= 10^5 点权 <= 30000 +// 1 <= n、点对总数 <= 10^5 点权 <= 30000 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From bf03507b6a5f9e08a49784d1ead5385a058f8613 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Jun 2025 11:13:22 +0800 Subject: [PATCH 0348/1170] modify code --- src/class173/Code03_Magnet1.java | 24 ++++++------------------ src/class173/Code07_Royal1.java | 8 ++++---- src/class173/Code07_Royal2.java | 8 ++++---- 3 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index c2ece0584..2f586d221 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -46,25 +46,13 @@ public class Code03_Magnet1 { // 下标为i的磁块和下标为j的磁块交换 public static void swap(int i, int j) { int tmp1; - tmp1 = x[i]; - x[i] = x[j]; - x[j] = tmp1; - tmp1 = y[i]; - y[i] = y[j]; - y[j] = tmp1; - tmp1 = m[i]; - m[i] = m[j]; - m[j] = tmp1; - tmp1 = p[i]; - p[i] = p[j]; - p[j] = tmp1; + tmp1 = x[i]; x[i] = x[j]; x[j] = tmp1; + tmp1 = y[i]; y[i] = y[j]; y[j] = tmp1; + tmp1 = m[i]; m[i] = m[j]; m[j] = tmp1; + tmp1 = p[i]; p[i] = p[j]; p[j] = tmp1; long tmp2; - tmp2 = range[i]; - range[i] = range[j]; - range[j] = tmp2; - tmp2 = dist[i]; - dist[i] = dist[j]; - dist[j] = tmp2; + tmp2 = range[i]; range[i] = range[j]; range[j] = tmp2; + tmp2 = dist[i]; dist[i] = dist[j]; dist[j] = tmp2; } // 所有磁块根据m值排序,手写双指针快排 diff --git a/src/class173/Code07_Royal1.java b/src/class173/Code07_Royal1.java index 9554a8f75..601d6ae09 100644 --- a/src/class173/Code07_Royal1.java +++ b/src/class173/Code07_Royal1.java @@ -28,7 +28,7 @@ public class Code07_Royal1 { public static int[] to = new int[MAXN << 1]; public static int cntg; - public static int[] root = new int[MAXN]; + public static int[] capital = new int[MAXN]; public static int[] belong = new int[MAXN]; public static int[] stack = new int[MAXN]; public static int siz; @@ -47,7 +47,7 @@ public static void dfs(int u, int f) { if (v != f) { dfs(v, u); if (siz - tmp >= b) { - root[++cntb] = u; + capital[++cntb] = u; while (siz > tmp) { belong[stack[siz--]] = cntb; } @@ -70,7 +70,7 @@ public static void main(String[] args) throws IOException { } dfs(1, 0); if (cntb == 0) { - root[++cntb] = 1; + capital[++cntb] = 1; } while (siz > 0) { belong[stack[siz--]] = cntb; @@ -81,7 +81,7 @@ public static void main(String[] args) throws IOException { } out.println(); for (int i = 1; i <= cntb; i++) { - out.print(root[i] + " "); + out.print(capital[i] + " "); } out.println(); out.flush(); diff --git a/src/class173/Code07_Royal2.java b/src/class173/Code07_Royal2.java index 47e0fa9f8..9e67bbd8e 100644 --- a/src/class173/Code07_Royal2.java +++ b/src/class173/Code07_Royal2.java @@ -26,7 +26,7 @@ //int to[MAXN << 1]; //int cntg; // -//int root[MAXN]; +//int capital[MAXN]; //int belong[MAXN]; //int sta[MAXN]; //int siz; @@ -45,7 +45,7 @@ // if (v != f) { // dfs(v, u); // if (siz - tmp >= b) { -// root[++cntb] = u; +// capital[++cntb] = u; // while (siz > tmp) { // belong[sta[siz--]] = cntb; // } @@ -66,7 +66,7 @@ // } // dfs(1, 0); // if (cntb == 0) { -// root[++cntb] = 1; +// capital[++cntb] = 1; // } // while (siz > 0) { // belong[sta[siz--]] = cntb; @@ -77,7 +77,7 @@ // } // cout << '\n'; // for (int i = 1; i <= cntb; i++) { -// cout << root[i] << ' '; +// cout << capital[i] << ' '; // } // cout << '\n'; // return 0; From 089b28a162d1d6811b88a2d0bee93d0c386dfe98 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Jun 2025 13:53:05 +0800 Subject: [PATCH 0349/1170] modify code --- src/class173/Code05_TreeBlockHld2.java | 9 ++++-- src/class173/Code06_TreeBlockRandom1.java | 33 +++++++++------------ src/class173/Code06_TreeBlockRandom2.java | 35 ++++++++++++----------- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src/class173/Code05_TreeBlockHld2.java b/src/class173/Code05_TreeBlockHld2.java index 03d539faf..7e69b18de 100644 --- a/src/class173/Code05_TreeBlockHld2.java +++ b/src/class173/Code05_TreeBlockHld2.java @@ -163,8 +163,13 @@ // updateAns(x, y); // } // int ans1 = ans.count(); -// ans.flip(); -// int ans2 = ans._Find_first(); +// int ans2 = MAXV; +// for (int i = 0; i < MAXV; i++) { +// if (ans[i] == 0) { +// ans2 = i; +// break; +// } +// } // cout << ans1 << ' ' << ans2 << '\n'; // last = ans1 + ans2; // } diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_TreeBlockRandom1.java index 5ad75b0d8..7a964b13c 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_TreeBlockRandom1.java @@ -6,7 +6,7 @@ // 操作 k x1 y1 x2 y2 .. (一共k个点对) // 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 // 先打印k条路径上不同点权的数量,再打印点权集合中没有出现的最小非负数(mex) -// 1 <= n、m <= 10^5 点权 <= 30000 +// 1 <= n、点对总数 <= 10^5 点权 <= 30000 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -31,7 +31,7 @@ public class Code06_TreeBlockRandom1 { public static int[] to = new int[MAXN << 1]; public static int cntg = 0; - // 树上倍增 + // 树上倍增求LCA public static int[] dep = new int[MAXN]; public static int[][] stjump = new int[MAXN][LIMIT]; @@ -49,10 +49,10 @@ public class Code06_TreeBlockRandom1 { public static int[] repBlock = new int[MAXN]; // up[i] = j,表示i号节点是某块的代表,它往上跳到最近的代表点是j public static int[] up = new int[MAXN]; - // bitSet[i][j],表示第i块代表点往上走到第j块的代表点,沿途所有点权组成的位图 - public static BitSet[][] bitSet = new BitSet[MAXB][MAXB]; + // downSet[i],表示第i块的代表点往上走到最近的代表点 + // 但是路径不包括上方最近的代表点,沿途所有点权组成的位图 + public static BitSet[] downSet = new BitSet[MAXB]; - public static BitSet tmp = new BitSet(); public static BitSet ans = new BitSet(); static class BitSet { @@ -193,11 +193,10 @@ public static void query(int x, int xylca) { ans.setOne(arr[x]); x = stjump[x][0]; } - int from = x; while (up[x] > 0 && dep[up[x]] > dep[xylca]) { + ans.or(downSet[repBlock[x]]); x = up[x]; } - ans.or(bitSet[repBlock[from]][repBlock[x]]); while (x != xylca) { ans.setOne(arr[x]); x = stjump[x][0]; @@ -223,24 +222,20 @@ public static void prepare() { capital[b] = pick; repBlock[pick] = b; } - for (int i = 0; i <= bnum; i++) { - for (int j = 0; j <= bnum; j++) { - bitSet[i][j] = new BitSet(); - } + for (int b = 0; b <= bnum; b++) { + downSet[b] = new BitSet(); } for (int b = 1, cur; b <= bnum; b++) { - tmp.clear(); - tmp.setOne(arr[capital[b]]); + downSet[b].setOne(arr[capital[b]]); cur = stjump[capital[b]][0]; while (cur != 0) { - tmp.setOne(arr[cur]); if (repBlock[cur] > 0) { - bitSet[b][repBlock[cur]].or(tmp); - if (up[capital[b]] == 0) { - up[capital[b]] = cur; - } + up[capital[b]] = cur; + break; + } else { + downSet[b].setOne(arr[cur]); + cur = stjump[cur][0]; } - cur = stjump[cur][0]; } } } diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_TreeBlockRandom2.java index a4129b606..0de6c9fe7 100644 --- a/src/class173/Code06_TreeBlockRandom2.java +++ b/src/class173/Code06_TreeBlockRandom2.java @@ -6,7 +6,7 @@ // 操作 k x1 y1 x2 y2 .. (一共k个点对) // 每个点对(x, y),在树上都有从x到y的路径,那么k个点对就有k条路径 // 先打印k条路径上不同点权的数量,再打印点权集合中没有出现的最小非负数(mex) -// 1 <= n、m <= 10^5 点权 <= 30000 +// 1 <= n、点对总数 <= 10^5 点权 <= 30000 // 题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3603 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -37,9 +37,8 @@ // //int repBlock[MAXN]; //int up[MAXN]; -//bitset bitSet[MAXB][MAXB]; +//bitset downSet[MAXB]; // -//bitset tmp; //bitset ans; // //void addEdge(int u, int v) { @@ -84,16 +83,15 @@ // //void query(int x, int xylca) { // while (repBlock[x] == 0 && x != xylca) { -// ans[arr[x]] = 1; +// ans[arr[x]] = 1; // x = stjump[x][0]; // } -// int from = x; // while (up[x] && dep[up[x]] > dep[xylca]) { +// ans |= downSet[repBlock[x]]; // x = up[x]; // } -// ans |= bitSet[repBlock[from]][repBlock[x]]; // while (x != xylca) { -// ans[arr[x]] = 1; +// ans[arr[x]] = 1; // x = stjump[x][0]; // } //} @@ -118,18 +116,16 @@ // repBlock[pick] = b; // } // for (int b = 1, cur; b <= bnum; b++) { -// tmp.reset(); -// tmp[arr[capital[b]]] = 1; +// downSet[b][arr[capital[b]]] = 1; // cur = stjump[capital[b]][0]; // while (cur != 0) { -// tmp[arr[cur]] = 1; // if (repBlock[cur] > 0) { -// bitSet[b][repBlock[cur]] |= tmp; -// if (up[capital[b]] == 0) { -// up[capital[b]] = cur; -// } +// up[capital[b]] = cur; +// break; +// } else { +// downSet[b][arr[cur]] = 1; +// cur = stjump[cur][0]; // } -// cur = stjump[cur][0]; // } // } //} @@ -160,8 +156,13 @@ // updateAns(x, y); // } // int ans1 = ans.count(); -// ans.flip(); -// int ans2 = ans._Find_first(); +// int ans2 = MAXV; +// for (int i = 0; i < MAXV; i++) { +// if (ans[i] == 0) { +// ans2 = i; +// break; +// } +// } // cout << ans1 << ' ' << ans2 << '\n'; // last = ans1 + ans2; // } From 6c3258ec4ddbfbe2cc2b3477b8fbe877f9eab572 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Jun 2025 15:11:38 +0800 Subject: [PATCH 0350/1170] modify code --- src/class173/Code03_Magnet1.java | 7 ++----- src/class173/Code03_Magnet2.java | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index 2f586d221..6cbbf3249 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -1,16 +1,13 @@ package class173; // 磁力块,java版 -// 每个磁块有五个属性值,x、y、m、p、range -// 表示磁块在(x, y)位置、质量为m、磁力为p、吸引半径range +// 磁块有五个属性值,x、y、m、p、range,磁块在(x, y)位置、质量为m、磁力为p、吸引半径range // 磁块A可以把磁块B吸到磁块A的位置,需要满足如下的条件 // A与B的距离不大于A的吸引半径,并且B的质量不大于A的磁力 // 你有一个初始磁块,给定初始磁块属性值,你永远在初始磁块的位置 // 接下来给定n个磁块各自的属性值,你可以用初始磁块,吸过来其中的磁块 // 吸过来的磁块可以被你随意使用,返回你最多能吸过来多少磁块 -// 1 <= n <= 3 * 10^5 -// -10^9 <= x、y <= +10^9 -// 1 <= m、p、range <= 10^9 +// 1 <= n <= 3 * 10^5 -10^9 <= x、y <= +10^9 1 <= m、p、range <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P10590 // 测试链接 : https://codeforces.com/problemset/problem/198/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class173/Code03_Magnet2.java b/src/class173/Code03_Magnet2.java index 2cc692a9d..4e4d3fbcc 100644 --- a/src/class173/Code03_Magnet2.java +++ b/src/class173/Code03_Magnet2.java @@ -1,16 +1,13 @@ package class173; // 磁力块,C++版 -// 每个磁块有五个属性值,x、y、m、p、range -// 表示磁块在(x, y)位置、质量为m、磁力为p、吸引半径range +// 磁块有五个属性值,x、y、m、p、range,磁块在(x, y)位置、质量为m、磁力为p、吸引半径range // 磁块A可以把磁块B吸到磁块A的位置,需要满足如下的条件 // A与B的距离不大于A的吸引半径,并且B的质量不大于A的磁力 // 你有一个初始磁块,给定初始磁块属性值,你永远在初始磁块的位置 // 接下来给定n个磁块各自的属性值,你可以用初始磁块,吸过来其中的磁块 // 吸过来的磁块可以被你随意使用,返回你最多能吸过来多少磁块 -// 1 <= n <= 3 * 10^5 -// -10^9 <= x、y <= +10^9 -// 1 <= m、p、range <= 10^9 +// 1 <= n <= 3 * 10^5 -10^9 <= x、y <= +10^9 1 <= m、p、range <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P10590 // 测试链接 : https://codeforces.com/problemset/problem/198/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 80da7821d9a7b60d9227c764b07d4488f94e8730 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Jun 2025 15:30:34 +0800 Subject: [PATCH 0351/1170] modify code --- src/class173/{Code05_TreeBlockHld1.java => Code05_HLD1.java} | 2 +- src/class173/{Code05_TreeBlockHld2.java => Code05_HLD2.java} | 0 .../{Code06_TreeBlockRandom1.java => Code06_Random1.java} | 2 +- .../{Code06_TreeBlockRandom2.java => Code06_Random2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class173/{Code05_TreeBlockHld1.java => Code05_HLD1.java} (99%) rename src/class173/{Code05_TreeBlockHld2.java => Code05_HLD2.java} (100%) rename src/class173/{Code06_TreeBlockRandom1.java => Code06_Random1.java} (99%) rename src/class173/{Code06_TreeBlockRandom2.java => Code06_Random2.java} (100%) diff --git a/src/class173/Code05_TreeBlockHld1.java b/src/class173/Code05_HLD1.java similarity index 99% rename from src/class173/Code05_TreeBlockHld1.java rename to src/class173/Code05_HLD1.java index e6f7080a4..b711002ed 100644 --- a/src/class173/Code05_TreeBlockHld1.java +++ b/src/class173/Code05_HLD1.java @@ -16,7 +16,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_TreeBlockHld1 { +public class Code05_HLD1 { public static int MAXN = 100001; public static int MAXB = 301; diff --git a/src/class173/Code05_TreeBlockHld2.java b/src/class173/Code05_HLD2.java similarity index 100% rename from src/class173/Code05_TreeBlockHld2.java rename to src/class173/Code05_HLD2.java diff --git a/src/class173/Code06_TreeBlockRandom1.java b/src/class173/Code06_Random1.java similarity index 99% rename from src/class173/Code06_TreeBlockRandom1.java rename to src/class173/Code06_Random1.java index 7a964b13c..8baeccd26 100644 --- a/src/class173/Code06_TreeBlockRandom1.java +++ b/src/class173/Code06_Random1.java @@ -16,7 +16,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code06_TreeBlockRandom1 { +public class Code06_Random1 { public static int MAXN = 100001; public static int MAXB = 301; diff --git a/src/class173/Code06_TreeBlockRandom2.java b/src/class173/Code06_Random2.java similarity index 100% rename from src/class173/Code06_TreeBlockRandom2.java rename to src/class173/Code06_Random2.java From 118193dddcdde0888de76f2a7b3f561dc4be1120 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Jun 2025 16:06:01 +0800 Subject: [PATCH 0352/1170] modify code --- src/class173/Code06_Random1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index 8baeccd26..88ffb00e7 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -49,8 +49,8 @@ public class Code06_Random1 { public static int[] repBlock = new int[MAXN]; // up[i] = j,表示i号节点是某块的代表,它往上跳到最近的代表点是j public static int[] up = new int[MAXN]; - // downSet[i],表示第i块的代表点往上走到最近的代表点 - // 但是路径不包括上方最近的代表点,沿途所有点权组成的位图 + // downSet[i],表示下方第i块的代表点往上走到最近的代表点 + // 路径不包括上方代表点,沿途所有点权组成的位图 public static BitSet[] downSet = new BitSet[MAXB]; public static BitSet ans = new BitSet(); From 1633d6c092a20482e4691a2382cc7180bbf878b1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 13:56:31 +0800 Subject: [PATCH 0353/1170] modify code --- src/class173/Code01_Sequence1.java | 7 +++++-- src/class173/Code04_Inversion1.java | 2 +- src/class173/Code04_Inversion2.java | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/class173/Code01_Sequence1.java b/src/class173/Code01_Sequence1.java index 1ace32076..3b2578b55 100644 --- a/src/class173/Code01_Sequence1.java +++ b/src/class173/Code01_Sequence1.java @@ -23,15 +23,18 @@ public class Code01_Sequence1 { public static int n, m; public static int[] arr = new int[MAXN]; - // op == 1,代表修改事件,位置x、时间t、修改效果v、空缺 - // op == 2,代表查询事件,位置x、时间t、查询标准v、问题编号q + // op == 1,代表修改事件,位置x、时刻t、修改效果v、空缺 + // op == 2,代表查询事件,位置x、时刻t、查询标准v、问题编号q public static int[][] event = new int[MAXN << 2][5]; public static int cnte = 0; public static int cntq = 0; + // 时间块内的值 public static long[] tim = new long[MAXN]; + // 每块的值排序 public static long[] sortv = new long[MAXN]; + // 时间分块 public static int blen, bnum; public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; diff --git a/src/class173/Code04_Inversion1.java b/src/class173/Code04_Inversion1.java index a8c1c8531..b978413b9 100644 --- a/src/class173/Code04_Inversion1.java +++ b/src/class173/Code04_Inversion1.java @@ -23,7 +23,6 @@ public class Code04_Inversion1 { public static int MAXN = 100001; public static int MAXB = 701; public static int n, m; - public static int[] arr = new int[MAXN]; public static int[][] sortv = new int[MAXN][2]; @@ -33,6 +32,7 @@ public class Code04_Inversion1 { public static int[] br = new int[MAXB]; public static int[] tree = new int[MAXN]; + public static int[] pre = new int[MAXN]; public static int[] suf = new int[MAXN]; public static int[][] cnt = new int[MAXB][MAXN]; diff --git a/src/class173/Code04_Inversion2.java b/src/class173/Code04_Inversion2.java index 824f4ae6a..5d4c7b8a7 100644 --- a/src/class173/Code04_Inversion2.java +++ b/src/class173/Code04_Inversion2.java @@ -54,6 +54,7 @@ //int br[MAXB]; // //int tree[MAXN]; +// //int pre[MAXN]; //int suf[MAXN]; //int cnt[MAXB][MAXN]; From 2bae720aab0d133b0145a92da8121396dba9bad7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 14:58:49 +0800 Subject: [PATCH 0354/1170] modify code --- src/class173/Code03_Magnet1.java | 4 ++-- src/class173/Code03_Magnet2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index 6cbbf3249..3aa7e3d39 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -4,8 +4,8 @@ // 磁块有五个属性值,x、y、m、p、range,磁块在(x, y)位置、质量为m、磁力为p、吸引半径range // 磁块A可以把磁块B吸到磁块A的位置,需要满足如下的条件 // A与B的距离不大于A的吸引半径,并且B的质量不大于A的磁力 -// 你有一个初始磁块,给定初始磁块属性值,你永远在初始磁块的位置 -// 接下来给定n个磁块各自的属性值,你可以用初始磁块,吸过来其中的磁块 +// 你有一个初始磁块,给定初始磁块的4个属性值(不给质量,因为没用),你永远在初始磁块的位置 +// 接下来给定n个磁块各自的5个属性值,你可以用初始磁块,吸过来其中的磁块 // 吸过来的磁块可以被你随意使用,返回你最多能吸过来多少磁块 // 1 <= n <= 3 * 10^5 -10^9 <= x、y <= +10^9 1 <= m、p、range <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P10590 diff --git a/src/class173/Code03_Magnet2.java b/src/class173/Code03_Magnet2.java index 4e4d3fbcc..26cb94ba9 100644 --- a/src/class173/Code03_Magnet2.java +++ b/src/class173/Code03_Magnet2.java @@ -4,8 +4,8 @@ // 磁块有五个属性值,x、y、m、p、range,磁块在(x, y)位置、质量为m、磁力为p、吸引半径range // 磁块A可以把磁块B吸到磁块A的位置,需要满足如下的条件 // A与B的距离不大于A的吸引半径,并且B的质量不大于A的磁力 -// 你有一个初始磁块,给定初始磁块属性值,你永远在初始磁块的位置 -// 接下来给定n个磁块各自的属性值,你可以用初始磁块,吸过来其中的磁块 +// 你有一个初始磁块,给定初始磁块的4个属性值(不给质量,因为没用),你永远在初始磁块的位置 +// 接下来给定n个磁块各自的5个属性值,你可以用初始磁块,吸过来其中的磁块 // 吸过来的磁块可以被你随意使用,返回你最多能吸过来多少磁块 // 1 <= n <= 3 * 10^5 -10^9 <= x、y <= +10^9 1 <= m、p、range <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P10590 From 260e0a42ab4c81d512bc2cfe17b8a4f555f7dc2c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 16:07:29 +0800 Subject: [PATCH 0355/1170] modify code --- src/class173/Code04_Inversion1.java | 4 ++-- src/class173/Code04_Inversion2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class173/Code04_Inversion1.java b/src/class173/Code04_Inversion1.java index b978413b9..5c3fe492d 100644 --- a/src/class173/Code04_Inversion1.java +++ b/src/class173/Code04_Inversion1.java @@ -141,8 +141,8 @@ public static void prepare() { } dp[i][i] = pre[br[i]]; } - for (int len = 2; len <= bnum; len++) { - for (int l = 1, r = l + len - 1; r <= bnum; l++, r++) { + for (int l = bnum; l >= 1; l--) { + for (int r = l + 1; r <= bnum; r++) { dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, bl[l], br[l], r, bl[r], br[r]); } } diff --git a/src/class173/Code04_Inversion2.java b/src/class173/Code04_Inversion2.java index 5d4c7b8a7..be90c2894 100644 --- a/src/class173/Code04_Inversion2.java +++ b/src/class173/Code04_Inversion2.java @@ -159,8 +159,8 @@ // } // dp[i][i] = pre[br[i]]; // } -// for (int len = 2; len <= bnum; len++) { -// for (int l = 1, r = l + len - 1; r <= bnum; l++, r++) { +// for (int l = bnum; l >= 1; l--) { +// for (int r = l + 1; r <= bnum; r++) { // dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, bl[l], br[l], r, bl[r], br[r]); // } // } From ee79b825825c20b3617ffe619f1d05b63f586129 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 16:14:25 +0800 Subject: [PATCH 0356/1170] modify code --- src/class173/Code06_Random1.java | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index 88ffb00e7..da316fe52 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -82,7 +82,7 @@ public void or(BitSet obj) { } } - public int getOnes() { + public int count() { int ans = 0; for (int x : set) { ans += Integer.bitCount(x); @@ -122,29 +122,29 @@ public static void dfs1(int u, int fa) { } } - // 树上倍增迭代版 + // 树上倍增迭代版,讲解118进行了详细讲述 public static int[][] ufe = new int[MAXN][3]; - public static int stackSize, cur, fath, edge; + public static int stacksize, cur, fath, edge; public static void push(int u, int f, int e) { - ufe[stackSize][0] = u; - ufe[stackSize][1] = f; - ufe[stackSize][2] = e; - stackSize++; + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; } public static void pop() { - --stackSize; - cur = ufe[stackSize][0]; - fath = ufe[stackSize][1]; - edge = ufe[stackSize][2]; + --stacksize; + cur = ufe[stacksize][0]; + fath = ufe[stacksize][1]; + edge = ufe[stacksize][2]; } public static void dfs2() { - stackSize = 0; + stacksize = 0; push(1, 0, -1); - while (stackSize > 0) { + while (stacksize > 0) { pop(); if (edge == -1) { dep[cur] = dep[fath] + 1; @@ -268,7 +268,7 @@ public static void main(String[] args) throws IOException { } updateAns(x, y); } - int ans1 = ans.getOnes(); + int ans1 = ans.count(); int ans2 = ans.mex(); out.println(ans1 + " " + ans2); last = ans1 + ans2; From 9e414cc81f9032c19379dd8fc92e929913bb2f43 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 16:17:51 +0800 Subject: [PATCH 0357/1170] modify code --- src/class173/Code06_Random1.java | 12 ++++++------ src/class173/Code06_Random2.java | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index da316fe52..303ac360a 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -21,7 +21,7 @@ public class Code06_Random1 { public static int MAXN = 100001; public static int MAXB = 301; public static int MAXV = 30001; - public static int LIMIT = 17; + public static int MAXP = 17; public static int n, m, f, k; public static int[] arr = new int[MAXN]; @@ -33,7 +33,7 @@ public class Code06_Random1 { // 树上倍增求LCA public static int[] dep = new int[MAXN]; - public static int[][] stjump = new int[MAXN][LIMIT]; + public static int[][] stjump = new int[MAXN][MAXP]; // 随机撒点,预处理过程需要 // bnum表示块的数量,也表示会有几个点被选为代表点 @@ -112,7 +112,7 @@ public static void addEdge(int u, int v) { public static void dfs1(int u, int fa) { dep[u] = dep[fa] + 1; stjump[u][0] = fa; - for (int p = 1; p < LIMIT; p++) { + for (int p = 1; p < MAXP; p++) { stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; } for (int e = head[u]; e != 0; e = next[e]) { @@ -149,7 +149,7 @@ public static void dfs2() { if (edge == -1) { dep[cur] = dep[fath] + 1; stjump[cur][0] = fath; - for (int p = 1; p < LIMIT; p++) { + for (int p = 1; p < MAXP; p++) { stjump[cur][p] = stjump[stjump[cur][p - 1]][p - 1]; } edge = head[cur]; @@ -171,7 +171,7 @@ public static int lca(int a, int b) { a = b; b = tmp; } - for (int p = LIMIT - 1; p >= 0; p--) { + for (int p = MAXP - 1; p >= 0; p--) { if (dep[stjump[a][p]] >= dep[b]) { a = stjump[a][p]; } @@ -179,7 +179,7 @@ public static int lca(int a, int b) { if (a == b) { return a; } - for (int p = LIMIT - 1; p >= 0; p--) { + for (int p = MAXP - 1; p >= 0; p--) { if (stjump[a][p] != stjump[b][p]) { a = stjump[a][p]; b = stjump[b][p]; diff --git a/src/class173/Code06_Random2.java b/src/class173/Code06_Random2.java index 0de6c9fe7..27f41235e 100644 --- a/src/class173/Code06_Random2.java +++ b/src/class173/Code06_Random2.java @@ -19,7 +19,7 @@ //const int MAXN = 100001; //const int MAXB = 301; //const int MAXV = 30001; -//const int LIMIT = 17; +//const int MAXP = 17; //int n, m, f, k; //int arr[MAXN]; // @@ -29,7 +29,7 @@ //int cntg; // //int dep[MAXN]; -//int stjump[MAXN][LIMIT]; +//int stjump[MAXN][MAXP]; // //int bnum; //bool vis[MAXN]; @@ -50,7 +50,7 @@ //void dfs(int u, int fa) { // dep[u] = dep[fa] + 1; // stjump[u][0] = fa; -// for (int p = 1; p < LIMIT; p++) { +// for (int p = 1; p < MAXP; p++) { // stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; // } // for (int e = head[u]; e; e = nxt[e]) { @@ -64,7 +64,7 @@ // if (dep[a] < dep[b]) { // swap(a, b); // } -// for (int p = LIMIT - 1; p >= 0; p--) { +// for (int p = MAXP - 1; p >= 0; p--) { // if (dep[stjump[a][p]] >= dep[b]) { // a = stjump[a][p]; // } @@ -72,7 +72,7 @@ // if (a == b) { // return a; // } -// for (int p = LIMIT - 1; p >= 0; p--) { +// for (int p = MAXP - 1; p >= 0; p--) { // if (stjump[a][p] != stjump[b][p]) { // a = stjump[a][p]; // b = stjump[b][p]; From dcc11d77174d26b69dc0a9185e2e026c283ef8af Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 16:24:37 +0800 Subject: [PATCH 0358/1170] modify code --- src/class173/Code06_Random1.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index 303ac360a..4b8b6927a 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -82,7 +82,7 @@ public void or(BitSet obj) { } } - public int count() { + public int countOnes() { int ans = 0; for (int x : set) { ans += Integer.bitCount(x); @@ -222,10 +222,8 @@ public static void prepare() { capital[b] = pick; repBlock[pick] = b; } - for (int b = 0; b <= bnum; b++) { - downSet[b] = new BitSet(); - } for (int b = 1, cur; b <= bnum; b++) { + downSet[b] = new BitSet(); downSet[b].setOne(arr[capital[b]]); cur = stjump[capital[b]][0]; while (cur != 0) { @@ -268,7 +266,7 @@ public static void main(String[] args) throws IOException { } updateAns(x, y); } - int ans1 = ans.count(); + int ans1 = ans.countOnes(); int ans2 = ans.mex(); out.println(ans1 + " " + ans2); last = ans1 + ans2; From 416dec670aaaa579777eaf374786f4ec43d7d552 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 16:42:29 +0800 Subject: [PATCH 0359/1170] modify code --- src/class173/Code06_Random1.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index 4b8b6927a..d2f217115 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -35,22 +35,21 @@ public class Code06_Random1 { public static int[] dep = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXP]; - // 随机撒点,预处理过程需要 - // bnum表示块的数量,也表示会有几个点被选为代表点 + // 随机撒点,预处理阶段需要的信息 + // bnum表示关键点数量 public static int bnum; - // vis[i]表示i号点是否已经选为某个块的代表点 + // vis[i]表示i号节点是否已经是关键点 public static boolean[] vis = new boolean[MAXN]; - // capital[i]表示第i块的代表节点 + // capital[i]表示第i个关键点的节点编号 public static int[] capital = new int[MAXB]; - // 随机撒点,预处理之后生成的信息 - // repBlock[i] = j,表示i号节点是第j块的代表 - // repBlock[i] = 0,表示i号节点不是任何块的代表 + // 随机撒点,预处理阶段生成的信息 + // repBlock[i] = j 表示i号节点是第j个关键点 + // repBlock[i] = 0 表示i号节点是非关键点 public static int[] repBlock = new int[MAXN]; - // up[i] = j,表示i号节点是某块的代表,它往上跳到最近的代表点是j + // up[i] = j,表示i号节点是关键点,它往上跳到最近的关键点是j号节点 public static int[] up = new int[MAXN]; - // downSet[i],表示下方第i块的代表点往上走到最近的代表点 - // 路径不包括上方代表点,沿途所有点权组成的位图 + // downSet[i]的含义,路径是[第i个的关键点 .. 最近的上方关键点),沿途所有节点值组成的位图 public static BitSet[] downSet = new BitSet[MAXB]; public static BitSet ans = new BitSet(); From bc3c10eff8bb4dce83dd3889eb41948f42fdc25f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 16:43:10 +0800 Subject: [PATCH 0360/1170] modify code --- src/class173/Code06_Random1.java | 2 +- src/class173/Code06_Random2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index d2f217115..502e5d3bc 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,随机撒点分块,java版 +// 树上分块模版题,随机撒点,java版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 // 接下来有m条操作,每条操作都要打印两个答案,描述如下 // 操作 k x1 y1 x2 y2 .. (一共k个点对) diff --git a/src/class173/Code06_Random2.java b/src/class173/Code06_Random2.java index 27f41235e..ff4abb621 100644 --- a/src/class173/Code06_Random2.java +++ b/src/class173/Code06_Random2.java @@ -1,6 +1,6 @@ package class173; -// 树上分块模版题,随机撒点分块,C++版 +// 树上分块模版题,随机撒点,C++版 // 一共有n个节点,每个节点有点权,给定n-1条边,所有节点连成一棵树 // 接下来有m条操作,每条操作都要打印两个答案,描述如下 // 操作 k x1 y1 x2 y2 .. (一共k个点对) From f9f287707edaf6a72b8c88582e816f8444851a3e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 17:03:54 +0800 Subject: [PATCH 0361/1170] modify code --- src/class173/Code01_Sequence1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code01_Sequence1.java b/src/class173/Code01_Sequence1.java index 3b2578b55..162abc669 100644 --- a/src/class173/Code01_Sequence1.java +++ b/src/class173/Code01_Sequence1.java @@ -23,8 +23,8 @@ public class Code01_Sequence1 { public static int n, m; public static int[] arr = new int[MAXN]; - // op == 1,代表修改事件,位置x、时刻t、修改效果v、空缺 - // op == 2,代表查询事件,位置x、时刻t、查询标准v、问题编号q + // op == 1 表示修改事件、位置x、时刻t、修改效果v、空缺 + // op == 2 表示查询事件、位置x、时刻t、查询标准v、问题编号q public static int[][] event = new int[MAXN << 2][5]; public static int cnte = 0; public static int cntq = 0; From 3273575ae7b83e5d254b2ec02ef132f42da1c6aa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Jun 2025 17:21:18 +0800 Subject: [PATCH 0362/1170] modify code --- src/class173/Code06_Random1.java | 39 ++++++++++++++++---------------- src/class173/Code06_Random2.java | 30 ++++++++++++------------ 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index 502e5d3bc..b86e8d8b5 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -36,20 +36,19 @@ public class Code06_Random1 { public static int[][] stjump = new int[MAXN][MAXP]; // 随机撒点,预处理阶段需要的信息 - // bnum表示关键点数量 - public static int bnum; + // markNum表示关键点数量 + public static int markNum; // vis[i]表示i号节点是否已经是关键点 public static boolean[] vis = new boolean[MAXN]; - // capital[i]表示第i个关键点的节点编号 - public static int[] capital = new int[MAXB]; + // markNode[k] = i 表示第k个关键点是编号为i的节点 + public static int[] markNode = new int[MAXB]; // 随机撒点,预处理阶段生成的信息 - // repBlock[i] = j 表示i号节点是第j个关键点 - // repBlock[i] = 0 表示i号节点是非关键点 - public static int[] repBlock = new int[MAXN]; + // kthMark[i] = k 表示i号节点是第k个关键点,kthMark[i] = 0 表示i号节点是非关键点 + public static int[] kthMark = new int[MAXN]; // up[i] = j,表示i号节点是关键点,它往上跳到最近的关键点是j号节点 public static int[] up = new int[MAXN]; - // downSet[i]的含义,路径是[第i个的关键点 .. 最近的上方关键点),沿途所有节点值组成的位图 + // downSet[k]的含义,路径是[第k个的关键点 .. 最近的上方关键点),沿途所有节点值组成的位图 public static BitSet[] downSet = new BitSet[MAXB]; public static BitSet ans = new BitSet(); @@ -188,12 +187,12 @@ public static int lca(int a, int b) { } public static void query(int x, int xylca) { - while (repBlock[x] == 0 && x != xylca) { + while (kthMark[x] == 0 && x != xylca) { ans.setOne(arr[x]); x = stjump[x][0]; } while (up[x] > 0 && dep[up[x]] > dep[xylca]) { - ans.or(downSet[repBlock[x]]); + ans.or(downSet[kthMark[x]]); x = up[x]; } while (x != xylca) { @@ -211,23 +210,23 @@ public static void updateAns(int x, int y) { public static void prepare() { dfs2(); - int blen = (int) Math.sqrt(20.0 * n); - bnum = (n + blen - 1) / blen; - for (int b = 1, pick; b <= bnum; b++) { + int len = (int) Math.sqrt(20.0 * n); + markNum = (n + len - 1) / len; + for (int b = 1, pick; b <= markNum; b++) { do { pick = (int) (Math.random() * n) + 1; } while (vis[pick]); vis[pick] = true; - capital[b] = pick; - repBlock[pick] = b; + markNode[b] = pick; + kthMark[pick] = b; } - for (int b = 1, cur; b <= bnum; b++) { + for (int b = 1, cur; b <= markNum; b++) { downSet[b] = new BitSet(); - downSet[b].setOne(arr[capital[b]]); - cur = stjump[capital[b]][0]; + downSet[b].setOne(arr[markNode[b]]); + cur = stjump[markNode[b]][0]; while (cur != 0) { - if (repBlock[cur] > 0) { - up[capital[b]] = cur; + if (kthMark[cur] > 0) { + up[markNode[b]] = cur; break; } else { downSet[b].setOne(arr[cur]); diff --git a/src/class173/Code06_Random2.java b/src/class173/Code06_Random2.java index ff4abb621..dc7bfc7ab 100644 --- a/src/class173/Code06_Random2.java +++ b/src/class173/Code06_Random2.java @@ -31,11 +31,11 @@ //int dep[MAXN]; //int stjump[MAXN][MAXP]; // -//int bnum; +//int markNum; //bool vis[MAXN]; -//int capital[MAXN]; +//int markNode[MAXN]; // -//int repBlock[MAXN]; +//int kthMark[MAXN]; //int up[MAXN]; //bitset downSet[MAXB]; // @@ -82,12 +82,12 @@ //} // //void query(int x, int xylca) { -// while (repBlock[x] == 0 && x != xylca) { +// while (kthMark[x] == 0 && x != xylca) { // ans[arr[x]] = 1; // x = stjump[x][0]; // } // while (up[x] && dep[up[x]] > dep[xylca]) { -// ans |= downSet[repBlock[x]]; +// ans |= downSet[kthMark[x]]; // x = up[x]; // } // while (x != xylca) { @@ -105,22 +105,22 @@ // //void prepare() { // dfs(1, 0); -// int blen = (int)sqrt(20.0 * n); -// bnum = (n + blen - 1) / blen; -// for (int b = 1, pick; b <= bnum; b++) { +// int len = (int)sqrt(20.0 * n); +// markNum = (n + len - 1) / len; +// for (int b = 1, pick; b <= markNum; b++) { // do { // pick = rand() % n + 1; // } while (vis[pick]); // vis[pick] = true; -// capital[b] = pick; -// repBlock[pick] = b; +// markNode[b] = pick; +// kthMark[pick] = b; // } -// for (int b = 1, cur; b <= bnum; b++) { -// downSet[b][arr[capital[b]]] = 1; -// cur = stjump[capital[b]][0]; +// for (int b = 1, cur; b <= markNum; b++) { +// downSet[b][arr[markNode[b]]] = 1; +// cur = stjump[markNode[b]][0]; // while (cur != 0) { -// if (repBlock[cur] > 0) { -// up[capital[b]] = cur; +// if (kthMark[cur] > 0) { +// up[markNode[b]] = cur; // break; // } else { // downSet[b][arr[cur]] = 1; From 81de19638d79b2bd2c457df8b8b909a82b28ac38 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Jun 2025 13:23:46 +0800 Subject: [PATCH 0363/1170] modify code --- src/class173/Code05_HLD1.java | 3 +-- src/class173/Code05_HLD2.java | 2 +- src/class173/Code06_Random1.java | 4 ++-- src/class173/Code06_Random2.java | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/class173/Code05_HLD1.java b/src/class173/Code05_HLD1.java index b711002ed..609baef80 100644 --- a/src/class173/Code05_HLD1.java +++ b/src/class173/Code05_HLD1.java @@ -19,7 +19,7 @@ public class Code05_HLD1 { public static int MAXN = 100001; - public static int MAXB = 301; + public static int MAXB = 401; public static int MAXV = 30001; public static int n, m, f, k; public static int[] arr = new int[MAXN]; @@ -260,7 +260,6 @@ public static void updateAns(int x, int y) { public static void prepare() { dfs3(); dfs4(); - // 调整块长 blen = (int) Math.sqrt(20.0 * n); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { diff --git a/src/class173/Code05_HLD2.java b/src/class173/Code05_HLD2.java index 7e69b18de..63b13a67e 100644 --- a/src/class173/Code05_HLD2.java +++ b/src/class173/Code05_HLD2.java @@ -17,7 +17,7 @@ //using namespace std; // //const int MAXN = 100001; -//const int MAXB = 301; +//const int MAXB = 401; //const int MAXV = 30001; //int n, m, f, k; //int arr[MAXN]; diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index b86e8d8b5..594b682c7 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -19,7 +19,7 @@ public class Code06_Random1 { public static int MAXN = 100001; - public static int MAXB = 301; + public static int MAXB = 401; public static int MAXV = 30001; public static int MAXP = 17; public static int n, m, f, k; @@ -210,7 +210,7 @@ public static void updateAns(int x, int y) { public static void prepare() { dfs2(); - int len = (int) Math.sqrt(20.0 * n); + int len = (int) Math.sqrt(10.0 * n); markNum = (n + len - 1) / len; for (int b = 1, pick; b <= markNum; b++) { do { diff --git a/src/class173/Code06_Random2.java b/src/class173/Code06_Random2.java index dc7bfc7ab..1fc36616a 100644 --- a/src/class173/Code06_Random2.java +++ b/src/class173/Code06_Random2.java @@ -17,7 +17,7 @@ //using namespace std; // //const int MAXN = 100001; -//const int MAXB = 301; +//const int MAXB = 401; //const int MAXV = 30001; //const int MAXP = 17; //int n, m, f, k; @@ -105,7 +105,7 @@ // //void prepare() { // dfs(1, 0); -// int len = (int)sqrt(20.0 * n); +// int len = (int)sqrt(10.0 * n); // markNum = (n + len - 1) / len; // for (int b = 1, pick; b <= markNum; b++) { // do { From e003b8905bc4fc316f9fc2a7f4f6c191f5deee91 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Jun 2025 13:31:13 +0800 Subject: [PATCH 0364/1170] modify code --- src/class173/Code05_HLD1.java | 13 ++++--------- src/class173/Code05_HLD2.java | 12 ++++-------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/class173/Code05_HLD1.java b/src/class173/Code05_HLD1.java index 609baef80..1a427d88d 100644 --- a/src/class173/Code05_HLD1.java +++ b/src/class173/Code05_HLD1.java @@ -47,8 +47,6 @@ public class Code05_HLD1 { public static int[] br = new int[MAXB]; public static BitSet[] bitSet = new BitSet[MAXB]; - // 答案 - public static BitSet tmp = new BitSet(); public static BitSet ans = new BitSet(); static class BitSet { @@ -224,20 +222,19 @@ public static void dfs4() { } public static void query(int l, int r) { - tmp.clear(); if (bi[l] == bi[r]) { for (int i = l; i <= r; i++) { - tmp.setOne(val[i]); + ans.setOne(val[i]); } } else { for (int i = l; i <= br[bi[l]]; i++) { - tmp.setOne(val[i]); + ans.setOne(val[i]); } for (int i = bl[bi[r]]; i <= r; i++) { - tmp.setOne(val[i]); + ans.setOne(val[i]); } for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { - tmp.or(bitSet[i]); + ans.or(bitSet[i]); } } } @@ -250,11 +247,9 @@ public static void updateAns(int x, int y) { y = tmp; } query(dfn[top[x]], dfn[x]); - ans.or(tmp); x = fa[top[x]]; } query(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y])); - ans.or(tmp); } public static void prepare() { diff --git a/src/class173/Code05_HLD2.java b/src/class173/Code05_HLD2.java index 63b13a67e..da227684c 100644 --- a/src/class173/Code05_HLD2.java +++ b/src/class173/Code05_HLD2.java @@ -42,7 +42,6 @@ //int br[MAXB]; //bitset bitSet[MAXB]; // -//bitset tmp; //bitset ans; // //void addEdge(int u, int v) { @@ -89,20 +88,19 @@ //} // //void query(int l, int r) { -// tmp.reset(); // if (bi[l] == bi[r]) { // for (int i = l; i <= r; i++) { -// tmp[val[i]] = 1; +// ans[val[i]] = 1; // } // } else { // for (int i = l; i <= br[bi[l]]; i++) { -// tmp[val[i]] = 1; +// ans[val[i]] = 1; // } // for (int i = bl[bi[r]]; i <= r; i++) { -// tmp[val[i]] = 1; +// ans[val[i]] = 1; // } // for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { -// tmp |= bitSet[i]; +// ans |= bitSet[i]; // } // } //} @@ -113,11 +111,9 @@ // swap(x, y); // } // query(dfn[top[x]], dfn[x]); -// ans |= tmp; // x = fa[top[x]]; // } // query(min(dfn[x], dfn[y]), max(dfn[x], dfn[y])); -// ans |= tmp; //} // //void prepare() { From c02a85de99e41e9035cdceaabd81c4ed40725bd5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Jun 2025 13:34:20 +0800 Subject: [PATCH 0365/1170] modify code --- src/class173/Code05_HLD2.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class173/Code05_HLD2.java b/src/class173/Code05_HLD2.java index da227684c..9aa4aedce 100644 --- a/src/class173/Code05_HLD2.java +++ b/src/class173/Code05_HLD2.java @@ -90,17 +90,17 @@ //void query(int l, int r) { // if (bi[l] == bi[r]) { // for (int i = l; i <= r; i++) { -// ans[val[i]] = 1; +// ans[val[i]] = 1; // } // } else { // for (int i = l; i <= br[bi[l]]; i++) { -// ans[val[i]] = 1; +// ans[val[i]] = 1; // } // for (int i = bl[bi[r]]; i <= r; i++) { -// ans[val[i]] = 1; +// ans[val[i]] = 1; // } // for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { -// ans |= bitSet[i]; +// ans |= bitSet[i]; // } // } //} From 05ba96004315e33587fe75e0c445610c695b1c6e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Jun 2025 17:17:53 +0800 Subject: [PATCH 0366/1170] modify code --- src/class173/{Code02_Poker1.java => Code01_Poker1.java} | 2 +- src/class173/{Code02_Poker2.java => Code01_Poker2.java} | 0 src/class173/{Code01_Sequence1.java => Code02_Sequence1.java} | 2 +- src/class173/{Code01_Sequence2.java => Code02_Sequence2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class173/{Code02_Poker1.java => Code01_Poker1.java} (99%) rename src/class173/{Code02_Poker2.java => Code01_Poker2.java} (100%) rename src/class173/{Code01_Sequence1.java => Code02_Sequence1.java} (99%) rename src/class173/{Code01_Sequence2.java => Code02_Sequence2.java} (100%) diff --git a/src/class173/Code02_Poker1.java b/src/class173/Code01_Poker1.java similarity index 99% rename from src/class173/Code02_Poker1.java rename to src/class173/Code01_Poker1.java index b9f96a845..db04a25df 100644 --- a/src/class173/Code02_Poker1.java +++ b/src/class173/Code01_Poker1.java @@ -15,7 +15,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_Poker1 { +public class Code01_Poker1 { public static int MAXN = 100001; public static int MAXB = 1001; diff --git a/src/class173/Code02_Poker2.java b/src/class173/Code01_Poker2.java similarity index 100% rename from src/class173/Code02_Poker2.java rename to src/class173/Code01_Poker2.java diff --git a/src/class173/Code01_Sequence1.java b/src/class173/Code02_Sequence1.java similarity index 99% rename from src/class173/Code01_Sequence1.java rename to src/class173/Code02_Sequence1.java index 162abc669..f1fb2f6d2 100644 --- a/src/class173/Code01_Sequence1.java +++ b/src/class173/Code02_Sequence1.java @@ -16,7 +16,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code01_Sequence1 { +public class Code02_Sequence1 { public static int MAXN = 100001; public static int MAXB = 501; diff --git a/src/class173/Code01_Sequence2.java b/src/class173/Code02_Sequence2.java similarity index 100% rename from src/class173/Code01_Sequence2.java rename to src/class173/Code02_Sequence2.java From 3ec6f41e20dea1e7d20c1829af4bea2603255305 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Jun 2025 17:52:58 +0800 Subject: [PATCH 0367/1170] modify code --- src/class173/Code01_Poker1.java | 7 +++---- src/class173/Code01_Poker2.java | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/class173/Code01_Poker1.java b/src/class173/Code01_Poker1.java index db04a25df..f37453906 100644 --- a/src/class173/Code01_Poker1.java +++ b/src/class173/Code01_Poker1.java @@ -19,7 +19,6 @@ public class Code01_Poker1 { public static int MAXN = 100001; public static int MAXB = 1001; - public static int INF = Integer.MAX_VALUE; public static int n, m; public static int[] arr = new int[MAXN]; @@ -54,7 +53,7 @@ public static void add(int l, int r, int v) { } public static int getMin(int l, int r) { - int lb = bi[l], rb = bi[r], ans = INF; + int lb = bi[l], rb = bi[r], ans = 10000000; if (lb == rb) { for (int i = l; i <= r; i++) { ans = Math.min(ans, arr[i] + lazy[lb]); @@ -74,7 +73,7 @@ public static int getMin(int l, int r) { } public static int getMax(int l, int r) { - int lb = bi[l], rb = bi[r], ans = -INF; + int lb = bi[l], rb = bi[r], ans = -10000000; if (lb == rb) { for (int i = l; i <= r; i++) { ans = Math.max(ans, arr[i] + lazy[lb]); @@ -162,7 +161,7 @@ public static int query(int l, int r, int v) { } public static void prepare() { - blen = (int) Math.sqrt(n); + blen = (int) Math.sqrt(n / 2); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; diff --git a/src/class173/Code01_Poker2.java b/src/class173/Code01_Poker2.java index a2e381ee7..36c4f4755 100644 --- a/src/class173/Code01_Poker2.java +++ b/src/class173/Code01_Poker2.java @@ -16,7 +16,6 @@ // //const int MAXN = 100001; //const int MAXB = 1001; -//const int INF = 2147483647; // //int n, m; //int arr[MAXN]; @@ -51,7 +50,7 @@ //} // //int getMin(int l, int r) { -// int lb = bi[l], rb = bi[r], ans = INF; +// int lb = bi[l], rb = bi[r], ans = 10000000; // if (lb == rb) { // for (int i = l; i <= r; i++) { // ans = min(ans, arr[i] + lazy[lb]); @@ -71,7 +70,7 @@ //} // //int getMax(int l, int r) { -// int lb = bi[l], rb = bi[r], ans = -INF; +// int lb = bi[l], rb = bi[r], ans = -10000000; // if (lb == rb) { // for (int i = l; i <= r; i++) { // ans = max(ans, arr[i] + lazy[lb]); @@ -158,7 +157,7 @@ //} // //void prepare() { -// blen = (int)sqrt(m); +// blen = (int)sqrt(n / 2); // bnum = (n + blen - 1) / blen; // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; From 41568774b9a88ecc370b792b94543c9ea7d33701 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Jun 2025 18:15:16 +0800 Subject: [PATCH 0368/1170] modify code --- src/class173/Code04_Inversion1.java | 2 +- src/class173/Code04_Inversion2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code04_Inversion1.java b/src/class173/Code04_Inversion1.java index 5c3fe492d..c6e37799c 100644 --- a/src/class173/Code04_Inversion1.java +++ b/src/class173/Code04_Inversion1.java @@ -98,7 +98,7 @@ public static long query(int l, int r) { // 注意调整块长 public static void prepare() { - blen = (int) (Math.sqrt(n) / 2); + blen = (int) Math.sqrt(n / 4); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; diff --git a/src/class173/Code04_Inversion2.java b/src/class173/Code04_Inversion2.java index be90c2894..bf0c58041 100644 --- a/src/class173/Code04_Inversion2.java +++ b/src/class173/Code04_Inversion2.java @@ -118,7 +118,7 @@ //} // //void prepare() { -// blen = (int)(sqrt(n) / 2); +// blen = (int)sqrt(n / 4); // bnum = (n + blen - 1) / blen; // for (int i = 1; i <= n; i++) bi[i] = (i - 1) / blen + 1; // for (int i = 1; i <= bnum; i++) { From 53737b5466e7c14664425a128884f4c4fdecec65 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Jun 2025 19:03:27 +0800 Subject: [PATCH 0369/1170] modify code --- src/class173/Code05_HLD1.java | 2 +- src/class173/Code05_HLD2.java | 2 +- src/class173/Code06_Random1.java | 2 +- src/class173/Code06_Random2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class173/Code05_HLD1.java b/src/class173/Code05_HLD1.java index 1a427d88d..88fce56b9 100644 --- a/src/class173/Code05_HLD1.java +++ b/src/class173/Code05_HLD1.java @@ -255,7 +255,7 @@ public static void updateAns(int x, int y) { public static void prepare() { dfs3(); dfs4(); - blen = (int) Math.sqrt(20.0 * n); + blen = (int) Math.sqrt(n * 20); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; diff --git a/src/class173/Code05_HLD2.java b/src/class173/Code05_HLD2.java index 9aa4aedce..3870ff4c9 100644 --- a/src/class173/Code05_HLD2.java +++ b/src/class173/Code05_HLD2.java @@ -119,7 +119,7 @@ //void prepare() { // dfs1(1, 0); // dfs2(1, 1); -// blen = (int)sqrt(20.0 * n); +// blen = (int)sqrt(n * 20); // bnum = (n + blen - 1) / blen; // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index 594b682c7..623172587 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -210,7 +210,7 @@ public static void updateAns(int x, int y) { public static void prepare() { dfs2(); - int len = (int) Math.sqrt(10.0 * n); + int len = (int) Math.sqrt(n * 10); markNum = (n + len - 1) / len; for (int b = 1, pick; b <= markNum; b++) { do { diff --git a/src/class173/Code06_Random2.java b/src/class173/Code06_Random2.java index 1fc36616a..580c1b655 100644 --- a/src/class173/Code06_Random2.java +++ b/src/class173/Code06_Random2.java @@ -105,7 +105,7 @@ // //void prepare() { // dfs(1, 0); -// int len = (int)sqrt(10.0 * n); +// int len = (int)sqrt(n * 10); // markNum = (n + len - 1) / len; // for (int b = 1, pick; b <= markNum; b++) { // do { From 5fb494b460b79d0778fdf2b223ccb6cc6068199e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Jun 2025 19:21:48 +0800 Subject: [PATCH 0370/1170] modify code --- .../{Code08_RangeFatherMinus1.java => Code08_FatherMinus1.java} | 2 +- .../{Code08_RangeFatherMinus2.java => Code08_FatherMinus2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class173/{Code08_RangeFatherMinus1.java => Code08_FatherMinus1.java} (99%) rename src/class173/{Code08_RangeFatherMinus2.java => Code08_FatherMinus2.java} (100%) diff --git a/src/class173/Code08_RangeFatherMinus1.java b/src/class173/Code08_FatherMinus1.java similarity index 99% rename from src/class173/Code08_RangeFatherMinus1.java rename to src/class173/Code08_FatherMinus1.java index 6a9ef3778..55b88f287 100644 --- a/src/class173/Code08_RangeFatherMinus1.java +++ b/src/class173/Code08_FatherMinus1.java @@ -15,7 +15,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code08_RangeFatherMinus1 { +public class Code08_FatherMinus1 { public static int MAXN = 100001; public static int MAXB = 501; diff --git a/src/class173/Code08_RangeFatherMinus2.java b/src/class173/Code08_FatherMinus2.java similarity index 100% rename from src/class173/Code08_RangeFatherMinus2.java rename to src/class173/Code08_FatherMinus2.java From 2f93f66e59fd62b0236c28a1fa04cf27a7e13c0a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Jun 2025 19:51:06 +0800 Subject: [PATCH 0371/1170] modify code --- src/class173/Code06_Random1.java | 4 +--- src/class173/Code06_Random2.java | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index 623172587..718bcae72 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -35,15 +35,13 @@ public class Code06_Random1 { public static int[] dep = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXP]; - // 随机撒点,预处理阶段需要的信息 + // 随机撒点 // markNum表示关键点数量 public static int markNum; // vis[i]表示i号节点是否已经是关键点 public static boolean[] vis = new boolean[MAXN]; // markNode[k] = i 表示第k个关键点是编号为i的节点 public static int[] markNode = new int[MAXB]; - - // 随机撒点,预处理阶段生成的信息 // kthMark[i] = k 表示i号节点是第k个关键点,kthMark[i] = 0 表示i号节点是非关键点 public static int[] kthMark = new int[MAXN]; // up[i] = j,表示i号节点是关键点,它往上跳到最近的关键点是j号节点 diff --git a/src/class173/Code06_Random2.java b/src/class173/Code06_Random2.java index 580c1b655..86b4dca17 100644 --- a/src/class173/Code06_Random2.java +++ b/src/class173/Code06_Random2.java @@ -34,7 +34,6 @@ //int markNum; //bool vis[MAXN]; //int markNode[MAXN]; -// //int kthMark[MAXN]; //int up[MAXN]; //bitset downSet[MAXB]; From 4ba0435f894e27451175af04d8e11797c827aef1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 13:36:00 +0800 Subject: [PATCH 0372/1170] modify code --- src/class173/Code01_Poker1.java | 15 +++++++++------ src/class173/Code01_Poker2.java | 12 ++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/class173/Code01_Poker1.java b/src/class173/Code01_Poker1.java index f37453906..cc60e469e 100644 --- a/src/class173/Code01_Poker1.java +++ b/src/class173/Code01_Poker1.java @@ -92,7 +92,8 @@ public static int getMax(int l, int r) { return ans; } - public static int getCnt(int i, int v) { + // 返回第i块内<= v的数字个数 + public static int blockCnt(int i, int v) { v -= lazy[i]; int l = bl[i], r = br[i]; if (sortv[l] > v) { @@ -114,7 +115,8 @@ public static int getCnt(int i, int v) { return find - bl[i] + 1; } - public static int num(int l, int r, int v) { + // 返回[l..r]范围上<= v的数字个数 + public static int getCnt(int l, int r, int v) { int lb = bi[l], rb = bi[r], ans = 0; if (lb == rb) { for (int i = l; i <= r; i++) { @@ -134,14 +136,14 @@ public static int num(int l, int r, int v) { } } for (int i = lb + 1; i <= rb - 1; i++) { - ans += getCnt(i, v); + ans += blockCnt(i, v); } } return ans; } - public static int query(int l, int r, int v) { - if (v < 1 || v > r - l + 1) { + public static int query(int l, int r, int k) { + if (k < 1 || k > r - l + 1) { return -1; } int minv = getMin(l, r); @@ -150,7 +152,7 @@ public static int query(int l, int r, int v) { int ans = -1; while (minv <= maxv) { midv = minv + (maxv - minv) / 2; - if (num(l, r, midv) >= v) { + if (getCnt(l, r, midv) >= k) { ans = midv; maxv = midv - 1; } else { @@ -160,6 +162,7 @@ public static int query(int l, int r, int v) { return ans; } + // 注意调整块长 public static void prepare() { blen = (int) Math.sqrt(n / 2); bnum = (n + blen - 1) / blen; diff --git a/src/class173/Code01_Poker2.java b/src/class173/Code01_Poker2.java index 36c4f4755..44b7984a3 100644 --- a/src/class173/Code01_Poker2.java +++ b/src/class173/Code01_Poker2.java @@ -89,7 +89,7 @@ // return ans; //} // -//int getCnt(int i, int v) { +//int blockCnt(int i, int v) { // v -= lazy[i]; // int l = bl[i], r = br[i]; // if (sortv[l] > v) { @@ -111,7 +111,7 @@ // return find - bl[i] + 1; //} // -//int num(int l, int r, int v) { +//int getCnt(int l, int r, int v) { // int lb = bi[l], rb = bi[r], ans = 0; // if (lb == rb) { // for (int i = l; i <= r; i++) { @@ -131,14 +131,14 @@ // } // } // for (int i = lb + 1; i <= rb - 1; i++) { -// ans += getCnt(i, v); +// ans += blockCnt(i, v); // } // } // return ans; //} // -//int query(int l, int r, int v) { -// if (v < 1 || v > r - l + 1) { +//int query(int l, int r, int k) { +// if (k < 1 || k > r - l + 1) { // return -1; // } // int minv = getMin(l, r); @@ -146,7 +146,7 @@ // int ans = -1; // while (minv <= maxv) { // int midv = minv + (maxv - minv) / 2; -// if (num(l, r, midv) >= v) { +// if (getCnt(l, r, midv) >= k) { // ans = midv; // maxv = midv - 1; // } else { From aa7bd4236cf8415aed4b63ec2c69a6e136f44fb3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 15:42:26 +0800 Subject: [PATCH 0373/1170] modify code --- src/class173/Code01_Poker1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class173/Code01_Poker1.java b/src/class173/Code01_Poker1.java index cc60e469e..3930eb93b 100644 --- a/src/class173/Code01_Poker1.java +++ b/src/class173/Code01_Poker1.java @@ -115,7 +115,7 @@ public static int blockCnt(int i, int v) { return find - bl[i] + 1; } - // 返回[l..r]范围上<= v的数字个数 + // 返回arr[l..r]范围上<= v的数字个数 public static int getCnt(int l, int r, int v) { int lb = bi[l], rb = bi[r], ans = 0; if (lb == rb) { From c4361fb7cf773f8b496ad8cc7dc87ded733a58fc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 17:23:52 +0800 Subject: [PATCH 0374/1170] modify code --- src/class173/Code02_Sequence1.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class173/Code02_Sequence1.java b/src/class173/Code02_Sequence1.java index f1fb2f6d2..a9aa70e18 100644 --- a/src/class173/Code02_Sequence1.java +++ b/src/class173/Code02_Sequence1.java @@ -29,9 +29,9 @@ public class Code02_Sequence1 { public static int cnte = 0; public static int cntq = 0; - // 时间块内的值 + // tim[i] = v,表示在i号时间点,所有数字都增加v public static long[] tim = new long[MAXN]; - // 每块的值排序 + // 时间块内的所有值要排序,方便查询 >= v的数字个数 public static long[] sortv = new long[MAXN]; // 时间分块 @@ -41,6 +41,7 @@ public class Code02_Sequence1 { public static int[] br = new int[MAXB]; public static long[] lazy = new long[MAXB]; + // 每个查询的答案 public static int[] ans = new int[MAXN]; public static void addChange(int x, int t, int v) { @@ -94,6 +95,7 @@ public static int innerQuery(int l, int r, long v) { return ans; } + // 第i块内>= v的数字个数 public static int getCnt(int i, long v) { v -= lazy[i]; int l = bl[i], r = br[i], m, pos = br[i] + 1; From 715a392c5860a07ac4c4bec180d17747faec705c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 17:53:58 +0800 Subject: [PATCH 0375/1170] modify code --- src/class173/Code02_Sequence1.java | 31 +++++++++++++++--------------- src/class173/Code02_Sequence2.java | 30 ++++++++++++++--------------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/class173/Code02_Sequence1.java b/src/class173/Code02_Sequence1.java index a9aa70e18..38faa801d 100644 --- a/src/class173/Code02_Sequence1.java +++ b/src/class173/Code02_Sequence1.java @@ -44,21 +44,6 @@ public class Code02_Sequence1 { // 每个查询的答案 public static int[] ans = new int[MAXN]; - public static void addChange(int x, int t, int v) { - event[++cnte][0] = 1; - event[cnte][1] = x; - event[cnte][2] = t; - event[cnte][3] = v; - } - - public static void addQuery(int x, int t, int v) { - event[++cnte][0] = 2; - event[cnte][1] = x; - event[cnte][2] = t; - event[cnte][3] = v; - event[cnte][4] = ++cntq; - } - public static void innerAdd(int l, int r, long v) { for (int i = l; i <= r; i++) { tim[i] += v; @@ -128,6 +113,21 @@ public static int query(int l, int r, long v) { return ans; } + public static void addChange(int x, int t, int v) { + event[++cnte][0] = 1; + event[cnte][1] = x; + event[cnte][2] = t; + event[cnte][3] = v; + } + + public static void addQuery(int x, int t, int v) { + event[++cnte][0] = 2; + event[cnte][1] = x; + event[cnte][2] = t; + event[cnte][3] = v; + event[cnte][4] = ++cntq; + } + public static void prepare() { blen = (int) Math.sqrt(m); bnum = (m + blen - 1) / blen; @@ -138,6 +138,7 @@ public static void prepare() { bl[i] = (i - 1) * blen + 1; br[i] = Math.min(i * blen, m); } + // 所有事件根据位置x排序,位置一样的事件,修改事件先执行,查询事件后执行 Arrays.sort(event, 1, cnte + 1, (a, b) -> a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]); } diff --git a/src/class173/Code02_Sequence2.java b/src/class173/Code02_Sequence2.java index f01340edb..ea2ab6689 100644 --- a/src/class173/Code02_Sequence2.java +++ b/src/class173/Code02_Sequence2.java @@ -42,21 +42,6 @@ // //int ans[MAXN]; // -//void addChange(int x, int t, int v) { -// event[++cnte].op = 1; -// event[cnte].x = x; -// event[cnte].t = t; -// event[cnte].v = v; -//} -// -//void addQuery(int x, int t, int v) { -// event[++cnte].op = 2; -// event[cnte].x = x; -// event[cnte].t = t; -// event[cnte].v = v; -// event[cnte].q = ++cntq; -//} -// //void innerAdd(int l, int r, long long v) { // for (int i = l; i <= r; i++) { // tim[i] += v; @@ -125,6 +110,21 @@ // return ans; //} // +//void addChange(int x, int t, int v) { +// event[++cnte].op = 1; +// event[cnte].x = x; +// event[cnte].t = t; +// event[cnte].v = v; +//} +// +//void addQuery(int x, int t, int v) { +// event[++cnte].op = 2; +// event[cnte].x = x; +// event[cnte].t = t; +// event[cnte].v = v; +// event[cnte].q = ++cntq; +//} +// //void prepare() { // blen = (int)sqrt(m); // bnum = (m + blen - 1) / blen; From 5c13e376872fc3f361fdd14c8aa765992586bb4e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 18:05:22 +0800 Subject: [PATCH 0376/1170] modify code --- src/class173/Code03_Magnet1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index 3aa7e3d39..189d3c975 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -137,7 +137,7 @@ public static int bfs() { que[r++] = i; ans++; } - bl[b]++; + bl[b]++; // 重要剪枝逻辑 } } } From 59e6d0e7c256233e0db51d1ea09b31b9a7afde7c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 18:30:18 +0800 Subject: [PATCH 0377/1170] modify code --- src/class173/Code03_Magnet1.java | 23 ++++++++++++----------- src/class173/Code03_Magnet2.java | 21 +++++++++++---------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index 189d3c975..e76854128 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -11,7 +11,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P10590 // 测试链接 : https://codeforces.com/problemset/problem/198/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -// 为了这道题能用java通过,我没有把数据封装到一起,组成一个磁块对象 +// 为了这道题能用java通过,不把数据封装到一起组成一个磁块对象 // 手写了双指针快排优化常数时间,一般不需要这么做,正式比赛不卡常 import java.io.IOException; @@ -120,7 +120,17 @@ public static int bfs() { while (l < r) { int cur = que[l++]; for (int b = 1; b <= bnum; b++) { - if (maxm[b] > p[cur]) { + if (maxm[b] <= p[cur]) { + while (bl[b] <= br[b] && dist[bl[b]] <= range[cur]) { + int i = bl[b]; + if (!vis[i]) { + vis[i] = true; + que[r++] = i; + ans++; + } + bl[b]++; // 重要剪枝逻辑 + } + } else { for (int j = bl[b]; j <= br[b]; j++) { if (dist[j] <= range[cur] && m[j] <= p[cur] && !vis[j]) { vis[j] = true; @@ -130,15 +140,6 @@ public static int bfs() { } break; } - while (bl[b] <= br[b] && dist[bl[b]] <= range[cur]) { - int i = bl[b]; - if (!vis[i]) { - vis[i] = true; - que[r++] = i; - ans++; - } - bl[b]++; // 重要剪枝逻辑 - } } } return ans; diff --git a/src/class173/Code03_Magnet2.java b/src/class173/Code03_Magnet2.java index 26cb94ba9..5ae4d94fb 100644 --- a/src/class173/Code03_Magnet2.java +++ b/src/class173/Code03_Magnet2.java @@ -70,7 +70,17 @@ // while (l < r) { // int cur = que[l++]; // for (int b = 1; b <= bnum; b++) { -// if (maxm[b] > arr[cur].p) { +// if (maxm[b] <= arr[cur].p) { +// while (bl[b] <= br[b] && arr[bl[b]].dist <= arr[cur].range) { +// int i = bl[b]; +// if (!vis[i]) { +// vis[i] = true; +// que[r++] = i; +// ans++; +// } +// bl[b]++; +// } +// } else { // for (int i = bl[b]; i <= br[b]; i++) { // if (arr[i].dist <= arr[cur].range && arr[i].m <= arr[cur].p && !vis[i]) { // vis[i] = true; @@ -80,15 +90,6 @@ // } // break; // } -// while (bl[b] <= br[b] && arr[bl[b]].dist <= arr[cur].range) { -// int i = bl[b]; -// if (!vis[i]) { -// vis[i] = true; -// que[r++] = i; -// ans++; -// } -// bl[b]++; -// } // } // } // return ans; From 7b9d51c6ea8aa5bfa53d5be3326b03ce86a1e750 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 18:32:57 +0800 Subject: [PATCH 0378/1170] modify code --- src/class173/Code03_Magnet1.java | 34 ++++++++++++++++---------------- src/class173/Code03_Magnet2.java | 34 ++++++++++++++++---------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index e76854128..c7984292e 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -95,23 +95,6 @@ public static void sortByDist(int l, int r) { sortByDist(i, r); } - public static void prepare() { - blen = (int) Math.sqrt(n); - bnum = (n + blen - 1) / blen; - for (int i = 1; i <= n; i++) { - bi[i] = (i - 1) / blen + 1; - } - for (int i = 1; i <= bnum; i++) { - bl[i] = (i - 1) * blen + 1; - br[i] = Math.min(i * blen, n); - } - sortByM(1, n); - for (int i = 1; i <= bnum; i++) { - maxm[i] = m[br[i]]; - sortByDist(bl[i], br[i]); - } - } - public static int bfs() { int ans = 0; vis[0] = true; @@ -145,6 +128,23 @@ public static int bfs() { return ans; } + public static void prepare() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + sortByM(1, n); + for (int i = 1; i <= bnum; i++) { + maxm[i] = m[br[i]]; + sortByDist(bl[i], br[i]); + } + } + public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); diff --git a/src/class173/Code03_Magnet2.java b/src/class173/Code03_Magnet2.java index 5ae4d94fb..7e14a8bab 100644 --- a/src/class173/Code03_Magnet2.java +++ b/src/class173/Code03_Magnet2.java @@ -45,23 +45,6 @@ //bool vis[MAXN]; //int que[MAXN]; // -//void prepare() { -// blen = (int)sqrt(n); -// bnum = (n + blen - 1) / blen; -// for (int i = 1; i <= n; i++) { -// bi[i] = (i - 1) / blen + 1; -// } -// for (int i = 1; i <= bnum; i++) { -// bl[i] = (i - 1) * blen + 1; -// br[i] = min(i * blen, n); -// } -// sort(arr + 1, arr + n + 1, cmp1); -// for (int i = 1; i <= bnum; i++) { -// maxm[i] = arr[br[i]].m; -// sort(arr + bl[i], arr + br[i] + 1, cmp2); -// } -//} -// //int bfs() { // int ans = 0; // vis[0] = true; @@ -95,6 +78,23 @@ // return ans; //} // +//void prepare() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } +// sort(arr + 1, arr + n + 1, cmp1); +// for (int i = 1; i <= bnum; i++) { +// maxm[i] = arr[br[i]].m; +// sort(arr + bl[i], arr + br[i] + 1, cmp2); +// } +//} +// //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); From ac8a593ac2e971402cf41ddee3124b9956a199cf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 18:34:09 +0800 Subject: [PATCH 0379/1170] modify code --- src/class173/Code03_Magnet2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class173/Code03_Magnet2.java b/src/class173/Code03_Magnet2.java index 7e14a8bab..623bf0deb 100644 --- a/src/class173/Code03_Magnet2.java +++ b/src/class173/Code03_Magnet2.java @@ -42,8 +42,8 @@ //int br[MAXB]; //int maxm[MAXB]; // -//bool vis[MAXN]; //int que[MAXN]; +//bool vis[MAXN]; // //int bfs() { // int ans = 0; From ae36473d2538536d3d77f862f224c56cfc2d390d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 18:35:26 +0800 Subject: [PATCH 0380/1170] modify code --- src/class173/Code03_Magnet1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index c7984292e..990fee72d 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -57,7 +57,8 @@ public static void sortByM(int l, int r) { if (l >= r) { return; } - int i = l, j = r, pivot = m[(l + r) >>> 1]; + int i = l, j = r; + int pivot = m[(l + r) >>> 1]; while (i <= j) { while (m[i] < pivot) { i++; From 102d7a5933ae1e345b09f37084678f264c41cc51 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 18:38:02 +0800 Subject: [PATCH 0381/1170] modify code --- src/class173/Code03_Magnet1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index 990fee72d..a371117e4 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -11,7 +11,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P10590 // 测试链接 : https://codeforces.com/problemset/problem/198/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -// 为了这道题能用java通过,不把数据封装到一起组成一个磁块对象 +// 为了java的实现能通过,不把数据封装成一个磁块对象,然后去排序 // 手写了双指针快排优化常数时间,一般不需要这么做,正式比赛不卡常 import java.io.IOException; From 54dff74f2b21752b54308424729dcb69352a1df7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 21:07:26 +0800 Subject: [PATCH 0382/1170] modify code --- src/class173/Code04_Inversion1.java | 16 ++++++++++++---- src/class173/Code04_Inversion2.java | 8 ++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/class173/Code04_Inversion1.java b/src/class173/Code04_Inversion1.java index c6e37799c..64cffaa31 100644 --- a/src/class173/Code04_Inversion1.java +++ b/src/class173/Code04_Inversion1.java @@ -31,11 +31,16 @@ public class Code04_Inversion1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; + // 树状数组 public static int[] tree = new int[MAXN]; + // pre[i] : 从所在块最左位置到i位置,有多少逆序对 public static int[] pre = new int[MAXN]; + // suf[i] : 从i位置到所在块最右位置,有多少逆序对 public static int[] suf = new int[MAXN]; + // cnt[i][j] : 前i块里<=j的数字个数 public static int[][] cnt = new int[MAXB][MAXN]; + // dp[i][j] : 从第i块到第j块有多少逆序对 public static long[][] dp = new long[MAXB][MAXB]; public static int lowbit(int i) { @@ -58,17 +63,20 @@ public static int sum(int i) { return ret; } + // 更靠左的第x块,从xl到xr范围上,选第一个数 + // 更靠左的第y块,从yl到yr范围上,选第二个数 + // 这两个数一定要构成逆序对,返回这样的逆序对数量 public static int calc(int x, int xl, int xr, int y, int yl, int yr) { int ans = 0; - for (int p1 = bl[x], p2 = bl[y] - 1, tmp = 0; p1 <= br[x]; p1++) { + for (int p1 = bl[x], p2 = bl[y] - 1, cnt = 0; p1 <= br[x]; p1++) { if (xl <= sortv[p1][1] && sortv[p1][1] <= xr) { while (p2 + 1 <= br[y] && sortv[p1][0] > sortv[p2 + 1][0]) { p2++; if (yl <= sortv[p2][1] && sortv[p2][1] <= yr) { - tmp++; + cnt++; } } - ans += tmp; + ans += cnt; } } return ans; @@ -139,9 +147,9 @@ public static void prepare() { tmp += cnt[i][j]; cnt[i][j] = tmp + cnt[i - 1][j]; } - dp[i][i] = pre[br[i]]; } for (int l = bnum; l >= 1; l--) { + dp[l][l] = pre[br[l]]; for (int r = l + 1; r <= bnum; r++) { dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, bl[l], br[l], r, bl[r], br[r]); } diff --git a/src/class173/Code04_Inversion2.java b/src/class173/Code04_Inversion2.java index bf0c58041..f9f0776f2 100644 --- a/src/class173/Code04_Inversion2.java +++ b/src/class173/Code04_Inversion2.java @@ -82,15 +82,15 @@ // //inline int calc(int x, int xl, int xr, int y, int yl, int yr) { // int ans = 0; -// for (int p1 = bl[x], p2 = bl[y] - 1, tmp = 0; p1 <= br[x]; p1++) { +// for (int p1 = bl[x], p2 = bl[y] - 1, cnt = 0; p1 <= br[x]; p1++) { // if (xl <= sortv[p1].i && sortv[p1].i <= xr) { // while (p2 + 1 <= br[y] && sortv[p1].v > sortv[p2 + 1].v) { // p2++; // if (yl <= sortv[p2].i && sortv[p2].i <= yr) { -// tmp++; +// cnt++; // } // } -// ans += tmp; +// ans += cnt; // } // } // return ans; @@ -157,9 +157,9 @@ // tmp += cnt[i][j]; // cnt[i][j] = tmp + cnt[i - 1][j]; // } -// dp[i][i] = pre[br[i]]; // } // for (int l = bnum; l >= 1; l--) { +// dp[l][l] = pre[br[l]]; // for (int r = l + 1; r <= bnum; r++) { // dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, bl[l], br[l], r, bl[r], br[r]); // } From 5b4749f5cbda40107d60407b31ba29d247dd0ddc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 21:28:55 +0800 Subject: [PATCH 0383/1170] modify code --- src/class173/Code04_Inversion1.java | 12 ++++++------ src/class173/Code04_Inversion2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class173/Code04_Inversion1.java b/src/class173/Code04_Inversion1.java index 64cffaa31..7e9b90375 100644 --- a/src/class173/Code04_Inversion1.java +++ b/src/class173/Code04_Inversion1.java @@ -1,7 +1,7 @@ package class173; // 区间逆序对,java版 -// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 给定一个长度为n的排列,接下来有m条操作,每条操作格式如下 // 操作 l r : 打印arr[l..r]范围上的逆序对数量 // 1 <= n、m <= 10^5 // 题目要求强制在线,具体规则可以打开测试链接查看 @@ -66,7 +66,7 @@ public static int sum(int i) { // 更靠左的第x块,从xl到xr范围上,选第一个数 // 更靠左的第y块,从yl到yr范围上,选第二个数 // 这两个数一定要构成逆序对,返回这样的逆序对数量 - public static int calc(int x, int xl, int xr, int y, int yl, int yr) { + public static int f(int x, int xl, int xr, int y, int yl, int yr) { int ans = 0; for (int p1 = bl[x], p2 = bl[y] - 1, cnt = 0; p1 <= br[x]; p1++) { if (xl <= sortv[p1][1] && sortv[p1][1] <= xr) { @@ -90,16 +90,16 @@ public static long query(int l, int r) { if (l == bl[lb]) { ans = pre[r]; } else { - ans = pre[r] - pre[l - 1] - calc(lb, 1, l - 1, lb, l, r); + ans = pre[r] - pre[l - 1] - f(lb, 1, l - 1, lb, l, r); } } else { for (int i = l; i <= br[lb]; i++) { ans += cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]; } for (int i = bl[rb]; i <= r; i++) { - ans += br[rb - 1] - bl[lb + 1] + 1 - cnt[rb - 1][arr[i]] + cnt[lb][arr[i]]; + ans += br[rb - 1] - bl[lb + 1] + 1 - (cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]); } - ans += dp[lb + 1][rb - 1] + suf[l] + pre[r] + calc(lb, l, br[lb], rb, bl[rb], r); + ans += dp[lb + 1][rb - 1] + suf[l] + pre[r] + f(lb, l, br[lb], rb, bl[rb], r); } return ans; } @@ -151,7 +151,7 @@ public static void prepare() { for (int l = bnum; l >= 1; l--) { dp[l][l] = pre[br[l]]; for (int r = l + 1; r <= bnum; r++) { - dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, bl[l], br[l], r, bl[r], br[r]); + dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + f(l, bl[l], br[l], r, bl[r], br[r]); } } } diff --git a/src/class173/Code04_Inversion2.java b/src/class173/Code04_Inversion2.java index f9f0776f2..f6a5ff166 100644 --- a/src/class173/Code04_Inversion2.java +++ b/src/class173/Code04_Inversion2.java @@ -1,7 +1,7 @@ package class173; // 区间逆序对,C++版 -// 给定一个长度为n的数组arr,接下来有m条操作,每条操作格式如下 +// 给定一个长度为n的排列,接下来有m条操作,每条操作格式如下 // 操作 l r : 打印arr[l..r]范围上的逆序对数量 // 1 <= n、m <= 10^5 // 题目要求强制在线,具体规则可以打开测试链接查看 @@ -80,7 +80,7 @@ // return ret; //} // -//inline int calc(int x, int xl, int xr, int y, int yl, int yr) { +//inline int f(int x, int xl, int xr, int y, int yl, int yr) { // int ans = 0; // for (int p1 = bl[x], p2 = bl[y] - 1, cnt = 0; p1 <= br[x]; p1++) { // if (xl <= sortv[p1].i && sortv[p1].i <= xr) { @@ -103,16 +103,16 @@ // if (l == bl[lb]) { // ans = pre[r]; // } else { -// ans = pre[r] - pre[l - 1] - calc(lb, 1, l - 1, lb, l, r); +// ans = pre[r] - pre[l - 1] - f(lb, 1, l - 1, lb, l, r); // } // } else { // for (int i = l; i <= br[lb]; i++) { // ans += cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]; // } // for (int i = bl[rb]; i <= r; i++) { -// ans += br[rb - 1] - bl[lb + 1] + 1 - cnt[rb - 1][arr[i]] + cnt[lb][arr[i]]; +// ans += br[rb - 1] - bl[lb + 1] + 1 - (cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]); // } -// ans += dp[lb + 1][rb - 1] + suf[l] + pre[r] + calc(lb, l, br[lb], rb, bl[rb], r); +// ans += dp[lb + 1][rb - 1] + suf[l] + pre[r] + f(lb, l, br[lb], rb, bl[rb], r); // } // return ans; //} @@ -161,7 +161,7 @@ // for (int l = bnum; l >= 1; l--) { // dp[l][l] = pre[br[l]]; // for (int r = l + 1; r <= bnum; r++) { -// dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + calc(l, bl[l], br[l], r, bl[r], br[r]); +// dp[l][r] = dp[l + 1][r] + dp[l][r - 1] - dp[l + 1][r - 1] + f(l, bl[l], br[l], r, bl[r], br[r]); // } // } //} From 7000e81ab6f02e4c86b45bdca4678431508fc8a3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 21:43:13 +0800 Subject: [PATCH 0384/1170] modify code --- src/class173/Code04_Inversion1.java | 12 ++++++++++-- src/class173/Code04_Inversion2.java | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/class173/Code04_Inversion1.java b/src/class173/Code04_Inversion1.java index 7e9b90375..a6d4511e4 100644 --- a/src/class173/Code04_Inversion1.java +++ b/src/class173/Code04_Inversion1.java @@ -65,7 +65,7 @@ public static int sum(int i) { // 更靠左的第x块,从xl到xr范围上,选第一个数 // 更靠左的第y块,从yl到yr范围上,选第二个数 - // 这两个数一定要构成逆序对,返回这样的逆序对数量 + // 返回逆序对数量 public static int f(int x, int xl, int xr, int y, int yl, int yr) { int ans = 0; for (int p1 = bl[x], p2 = bl[y] - 1, cnt = 0; p1 <= br[x]; p1++) { @@ -90,15 +90,23 @@ public static long query(int l, int r) { if (l == bl[lb]) { ans = pre[r]; } else { - ans = pre[r] - pre[l - 1] - f(lb, 1, l - 1, lb, l, r); + ans = pre[r] - pre[l - 1] - f(lb, bl[lb], l - 1, lb, l, r); } } else { + // 左散块中的arr[i],作为第一个数 + // 中间整块中的某个数字,作为第二个数 + // 计算这样的逆序对数量 + // 注意因为题目给定的是排列!所以如下这么写没问题 for (int i = l; i <= br[lb]; i++) { ans += cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]; } + // 中间整块中的某个数字,作为第一个数 + // 右散块中的arr[i],作为第二个数 + // 计算这样的逆序对数量 for (int i = bl[rb]; i <= r; i++) { ans += br[rb - 1] - bl[lb + 1] + 1 - (cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]); } + // 中间整块的逆序对 + 左散块[l..]的逆序对 + 右散块[..r]的逆序对 + 左散块 结合 右散块 的逆序对 ans += dp[lb + 1][rb - 1] + suf[l] + pre[r] + f(lb, l, br[lb], rb, bl[rb], r); } return ans; diff --git a/src/class173/Code04_Inversion2.java b/src/class173/Code04_Inversion2.java index f6a5ff166..ece8fdc40 100644 --- a/src/class173/Code04_Inversion2.java +++ b/src/class173/Code04_Inversion2.java @@ -103,7 +103,7 @@ // if (l == bl[lb]) { // ans = pre[r]; // } else { -// ans = pre[r] - pre[l - 1] - f(lb, 1, l - 1, lb, l, r); +// ans = pre[r] - pre[l - 1] - f(lb, bl[lb], l - 1, lb, l, r); // } // } else { // for (int i = l; i <= br[lb]; i++) { From e8a21a9ddb22f6e18a89d532ba6ec72a0ace5317 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Jul 2025 23:43:28 +0800 Subject: [PATCH 0385/1170] modify code --- src/class173/Code04_Inversion1.java | 12 ++++++++---- src/class173/Code04_Inversion2.java | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/class173/Code04_Inversion1.java b/src/class173/Code04_Inversion1.java index a6d4511e4..70774f398 100644 --- a/src/class173/Code04_Inversion1.java +++ b/src/class173/Code04_Inversion1.java @@ -24,6 +24,7 @@ public class Code04_Inversion1 { public static int MAXB = 701; public static int n, m; public static int[] arr = new int[MAXN]; + // (数值、位置) public static int[][] sortv = new int[MAXN][2]; public static int blen, bnum; @@ -31,7 +32,7 @@ public class Code04_Inversion1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - // 树状数组 + // 树状数组,为了快速生成pre数组和suf数组 public static int[] tree = new int[MAXN]; // pre[i] : 从所在块最左位置到i位置,有多少逆序对 @@ -64,7 +65,8 @@ public static int sum(int i) { } // 更靠左的第x块,从xl到xr范围上,选第一个数 - // 更靠左的第y块,从yl到yr范围上,选第二个数 + // 更靠右的第y块,从yl到yr范围上,选第二个数 + // x和y可以相等,但是xl..xr需要在yl..yr的左侧 // 返回逆序对数量 public static int f(int x, int xl, int xr, int y, int yl, int yr) { int ans = 0; @@ -93,6 +95,8 @@ public static long query(int l, int r) { ans = pre[r] - pre[l - 1] - f(lb, bl[lb], l - 1, lb, l, r); } } else { + // 左散块[l..]内部逆序对 + 右散块[..r]内部逆序对 + 左散块 结合 右散块 的逆序对 + ans = suf[l] + pre[r] + f(lb, l, br[lb], rb, bl[rb], r); // 左散块中的arr[i],作为第一个数 // 中间整块中的某个数字,作为第二个数 // 计算这样的逆序对数量 @@ -106,8 +110,8 @@ public static long query(int l, int r) { for (int i = bl[rb]; i <= r; i++) { ans += br[rb - 1] - bl[lb + 1] + 1 - (cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]); } - // 中间整块的逆序对 + 左散块[l..]的逆序对 + 右散块[..r]的逆序对 + 左散块 结合 右散块 的逆序对 - ans += dp[lb + 1][rb - 1] + suf[l] + pre[r] + f(lb, l, br[lb], rb, bl[rb], r); + // 中间整块的逆序对 + ans += dp[lb + 1][rb - 1]; } return ans; } diff --git a/src/class173/Code04_Inversion2.java b/src/class173/Code04_Inversion2.java index ece8fdc40..a259b839a 100644 --- a/src/class173/Code04_Inversion2.java +++ b/src/class173/Code04_Inversion2.java @@ -106,13 +106,14 @@ // ans = pre[r] - pre[l - 1] - f(lb, bl[lb], l - 1, lb, l, r); // } // } else { +// ans = suf[l] + pre[r] + f(lb, l, br[lb], rb, bl[rb], r); // for (int i = l; i <= br[lb]; i++) { // ans += cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]; // } // for (int i = bl[rb]; i <= r; i++) { // ans += br[rb - 1] - bl[lb + 1] + 1 - (cnt[rb - 1][arr[i]] - cnt[lb][arr[i]]); // } -// ans += dp[lb + 1][rb - 1] + suf[l] + pre[r] + f(lb, l, br[lb], rb, bl[rb], r); +// ans += dp[lb + 1][rb - 1]; // } // return ans; //} From 19be945c8f5511d6cde5b817f0d04bd165770098 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 10:02:13 +0800 Subject: [PATCH 0386/1170] modify code --- src/class173/Code07_Royal1.java | 4 ++-- src/class173/Code07_Royal2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class173/Code07_Royal1.java b/src/class173/Code07_Royal1.java index 601d6ae09..1dcf80273 100644 --- a/src/class173/Code07_Royal1.java +++ b/src/class173/Code07_Royal1.java @@ -46,9 +46,9 @@ public static void dfs(int u, int f) { v = to[e]; if (v != f) { dfs(v, u); - if (siz - tmp >= b) { + if (siz >= tmp + b) { capital[++cntb] = u; - while (siz > tmp) { + while (siz != tmp) { belong[stack[siz--]] = cntb; } } diff --git a/src/class173/Code07_Royal2.java b/src/class173/Code07_Royal2.java index 9e67bbd8e..11ac39804 100644 --- a/src/class173/Code07_Royal2.java +++ b/src/class173/Code07_Royal2.java @@ -44,9 +44,9 @@ // v = to[e]; // if (v != f) { // dfs(v, u); -// if (siz - tmp >= b) { +// if (siz >= tmp + b) { // capital[++cntb] = u; -// while (siz > tmp) { +// while (siz != tmp) { // belong[sta[siz--]] = cntb; // } // } From 000791207af204f05332818b55f9c5ce4f9a3322 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 10:37:30 +0800 Subject: [PATCH 0387/1170] modify code --- src/class173/Code08_FatherMinus1.java | 20 +++++++++++--------- src/class173/Code08_FatherMinus2.java | 18 +++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/class173/Code08_FatherMinus1.java b/src/class173/Code08_FatherMinus1.java index 55b88f287..194b27d71 100644 --- a/src/class173/Code08_FatherMinus1.java +++ b/src/class173/Code08_FatherMinus1.java @@ -2,7 +2,7 @@ // 区间父变小,java版 // 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],给定arr[2..n] -// 接下来有m条操作,每种操作是如下两种类型中的一种 +// 对于每个i > 1,都有arr[i] < i,下来有m条操作,操作类型如下 // 操作 x y z : [x..y]范围上任何一点i,arr[i] = max(1, arr[i] - z) // 操作 x y : 查询点x和点y的最低公共祖先 // 2 <= n、m <= 10^5 @@ -60,10 +60,12 @@ public static void update(int l, int r, int v) { arr[i] = Math.max(1, arr[i] - v); } innerUpdate(bi[r]); - for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { - lazy[i] = Math.min(n, lazy[i] + v); - if (++cnt[i] <= blen) { - innerUpdate(i); + for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { + // 减少的幅度最多到n,不会更大 + // 这样还可以让lazy保持int类型并且不溢出 + lazy[b] = Math.min(n, lazy[b] + v); + if (++cnt[b] <= blen) { + innerUpdate(b); } } } @@ -79,16 +81,16 @@ public static int jumpOut(int i) { public static int lca(int x, int y) { while (bi[x] != bi[y] || jumpOut(x) != jumpOut(y)) { - if (bi[x] == bi[y]) { - x = jumpOut(x); - y = jumpOut(y); - } else { + if (bi[x] != bi[y]) { if (bi[x] < bi[y]) { int tmp = x; x = y; y = tmp; } x = jumpOut(x); + } else { + x = jumpOut(x); + y = jumpOut(y); } } while (x != y) { diff --git a/src/class173/Code08_FatherMinus2.java b/src/class173/Code08_FatherMinus2.java index 6f85ac6b1..9dcc69c0b 100644 --- a/src/class173/Code08_FatherMinus2.java +++ b/src/class173/Code08_FatherMinus2.java @@ -2,7 +2,7 @@ // 区间父变小,C++版 // 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],给定arr[2..n] -// 接下来有m条操作,每种操作是如下两种类型中的一种 +// 对于每个i > 1,都有arr[i] < i,下来有m条操作,操作类型如下 // 操作 x y z : [x..y]范围上任何一点i,arr[i] = max(1, arr[i] - z) // 操作 x y : 查询点x和点y的最低公共祖先 // 2 <= n、m <= 10^5 @@ -58,10 +58,10 @@ // arr[i] = max(1, arr[i] - v); // } // innerUpdate(bi[r]); -// for (int i = bi[l] + 1; i <= bi[r] - 1; i++) { -// lazy[i] = min(n, lazy[i] + v); -// if (++cnt[i] <= blen) { -// innerUpdate(i); +// for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { +// lazy[b] = min(n, lazy[b] + v); +// if (++cnt[b] <= blen) { +// innerUpdate(b); // } // } // } @@ -77,14 +77,14 @@ // //int lca(int x, int y) { // while (bi[x] != bi[y] || jumpOut(x) != jumpOut(y)) { -// if (bi[x] == bi[y]) { -// x = jumpOut(x); -// y = jumpOut(y); -// } else { +// if (bi[x] != bi[y]) { // if (bi[x] < bi[y]) { // swap(x, y); // } // x = jumpOut(x); +// } else { +// x = jumpOut(x); +// y = jumpOut(y); // } // } // while (x != y) { From e4784ae58fbda3e8f103c3e376395a0a499be9d8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 10:56:04 +0800 Subject: [PATCH 0388/1170] modify code --- src/class173/Code08_FatherMinus1.java | 29 +++++++++++++-------------- src/class173/Code08_FatherMinus2.java | 29 +++++++++++++-------------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/class173/Code08_FatherMinus1.java b/src/class173/Code08_FatherMinus1.java index 194b27d71..473b05881 100644 --- a/src/class173/Code08_FatherMinus1.java +++ b/src/class173/Code08_FatherMinus1.java @@ -1,9 +1,9 @@ package class173; // 区间父变小,java版 -// 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],给定arr[2..n] -// 对于每个i > 1,都有arr[i] < i,下来有m条操作,操作类型如下 -// 操作 x y z : [x..y]范围上任何一点i,arr[i] = max(1, arr[i] - z) +// 一棵大小为n树,节点1是树头,给定fa[2..n]表示父亲节点编号 +// 对于每个i > 1,都有fa[i] < i,下来有m条操作,操作类型如下 +// 操作 x y z : [x..y]范围上任何一点i,fa[i] = max(1, fa[i] - z) // 操作 x y : 查询点x和点y的最低公共祖先 // 2 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1491H @@ -20,27 +20,26 @@ public class Code08_FatherMinus1 { public static int MAXN = 100001; public static int MAXB = 501; public static int n, m; - public static int[] arr = new int[MAXN]; + public static int[] fa = new int[MAXN]; + public static int[] outer = new int[MAXN]; public static int blen, bnum; public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - public static int[] lazy = new int[MAXB]; - public static int[] outer = new int[MAXN]; public static int[] cnt = new int[MAXB]; public static void innerUpdate(int b) { for (int i = bl[b]; i <= br[b]; i++) { - arr[i] = Math.max(1, arr[i] - lazy[b]); + fa[i] = Math.max(1, fa[i] - lazy[b]); } lazy[b] = 0; for (int i = bl[b]; i <= br[b]; i++) { - if (arr[i] < bl[b]) { - outer[i] = arr[i]; + if (fa[i] < bl[b]) { + outer[i] = fa[i]; } else { - outer[i] = outer[arr[i]]; + outer[i] = outer[fa[i]]; } } } @@ -48,16 +47,16 @@ public static void innerUpdate(int b) { public static void update(int l, int r, int v) { if (bi[l] == bi[r]) { for (int i = l; i <= r; i++) { - arr[i] = Math.max(1, arr[i] - v); + fa[i] = Math.max(1, fa[i] - v); } innerUpdate(bi[l]); } else { for (int i = l; i <= br[bi[l]]; i++) { - arr[i] = Math.max(1, arr[i] - v); + fa[i] = Math.max(1, fa[i] - v); } innerUpdate(bi[l]); for (int i = bl[bi[r]]; i <= r; i++) { - arr[i] = Math.max(1, arr[i] - v); + fa[i] = Math.max(1, fa[i] - v); } innerUpdate(bi[r]); for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { @@ -72,7 +71,7 @@ public static void update(int l, int r, int v) { } public static int jumpFa(int i) { - return Math.max(1, arr[i] - lazy[bi[i]]); + return Math.max(1, fa[i] - lazy[bi[i]]); } public static int jumpOut(int i) { @@ -123,7 +122,7 @@ public static void main(String[] args) throws IOException { n = in.nextInt(); m = in.nextInt(); for (int i = 2; i <= n; i++) { - arr[i] = in.nextInt(); + fa[i] = in.nextInt(); } prepare(); for (int i = 1, op, x, y, z; i <= m; i++) { diff --git a/src/class173/Code08_FatherMinus2.java b/src/class173/Code08_FatherMinus2.java index 9dcc69c0b..aa82db387 100644 --- a/src/class173/Code08_FatherMinus2.java +++ b/src/class173/Code08_FatherMinus2.java @@ -1,9 +1,9 @@ package class173; // 区间父变小,C++版 -// 一棵大小为n树,节点1是树头,节点i的父节点 = arr[i],给定arr[2..n] -// 对于每个i > 1,都有arr[i] < i,下来有m条操作,操作类型如下 -// 操作 x y z : [x..y]范围上任何一点i,arr[i] = max(1, arr[i] - z) +// 一棵大小为n树,节点1是树头,给定fa[2..n]表示父亲节点编号 +// 对于每个i > 1,都有fa[i] < i,下来有m条操作,操作类型如下 +// 操作 x y z : [x..y]范围上任何一点i,fa[i] = max(1, fa[i] - z) // 操作 x y : 查询点x和点y的最低公共祖先 // 2 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1491H @@ -18,27 +18,26 @@ //const int MAXN = 100001; //const int MAXB = 501; //int n, m; -//int arr[MAXN]; +//int fa[MAXN]; +//int outer[MAXN]; // //int blen, bnum; //int bi[MAXN]; //int bl[MAXB]; //int br[MAXB]; -// //int lazy[MAXB]; -//int outer[MAXN]; //int cnt[MAXB]; // //void innerUpdate(int b) { // for (int i = bl[b]; i <= br[b]; i++) { -// arr[i] = max(1, arr[i] - lazy[b]); +// fa[i] = max(1, fa[i] - lazy[b]); // } // lazy[b] = 0; // for (int i = bl[b]; i <= br[b]; i++) { -// if (arr[i] < bl[b]) { -// outer[i] = arr[i]; +// if (fa[i] < bl[b]) { +// outer[i] = fa[i]; // } else { -// outer[i] = outer[arr[i]]; +// outer[i] = outer[fa[i]]; // } // } //} @@ -46,16 +45,16 @@ //void update(int l, int r, int v) { // if (bi[l] == bi[r]) { // for (int i = l; i <= r; i++) { -// arr[i] = max(1, arr[i] - v); +// fa[i] = max(1, fa[i] - v); // } // innerUpdate(bi[l]); // } else { // for (int i = l; i <= br[bi[l]]; i++) { -// arr[i] = max(1, arr[i] - v); +// fa[i] = max(1, fa[i] - v); // } // innerUpdate(bi[l]); // for (int i = bl[bi[r]]; i <= r; i++) { -// arr[i] = max(1, arr[i] - v); +// fa[i] = max(1, fa[i] - v); // } // innerUpdate(bi[r]); // for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { @@ -68,7 +67,7 @@ //} // //int jumpFa(int i) { -// return max(1, arr[i] - lazy[bi[i]]); +// return max(1, fa[i] - lazy[bi[i]]); //} // //int jumpOut(int i) { @@ -114,7 +113,7 @@ // cin.tie(nullptr); // cin >> n >> m; // for (int i = 2; i <= n; i++) { -// cin >> arr[i]; +// cin >> fa[i]; // } // prepare(); // for (int i = 1, op, x, y, z; i <= m; i++) { From 53ea1f78a6dd9151fa83b3fbc1ef467e03dc45aa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 10:59:46 +0800 Subject: [PATCH 0389/1170] modify code --- src/class173/Code07_Royal1.java | 3 ++- src/class173/Code07_Royal2.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class173/Code07_Royal1.java b/src/class173/Code07_Royal1.java index 1dcf80273..0e9bad3e0 100644 --- a/src/class173/Code07_Royal1.java +++ b/src/class173/Code07_Royal1.java @@ -30,9 +30,10 @@ public class Code07_Royal1 { public static int[] capital = new int[MAXN]; public static int[] belong = new int[MAXN]; + public static int cntb; + public static int[] stack = new int[MAXN]; public static int siz; - public static int cntb; public static void addEdge(int u, int v) { next[++cntg] = head[u]; diff --git a/src/class173/Code07_Royal2.java b/src/class173/Code07_Royal2.java index 11ac39804..f9fffc55e 100644 --- a/src/class173/Code07_Royal2.java +++ b/src/class173/Code07_Royal2.java @@ -28,9 +28,10 @@ // //int capital[MAXN]; //int belong[MAXN]; +//int cntb; +// //int sta[MAXN]; //int siz; -//int cntb; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; From 67214cee5343b6874eecff3ab58505cbb90809eb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 11:11:41 +0800 Subject: [PATCH 0390/1170] modify code --- src/class173/Code08_FatherMinus1.java | 8 ++++---- src/class173/Code08_FatherMinus2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class173/Code08_FatherMinus1.java b/src/class173/Code08_FatherMinus1.java index 473b05881..b47133916 100644 --- a/src/class173/Code08_FatherMinus1.java +++ b/src/class173/Code08_FatherMinus1.java @@ -21,7 +21,7 @@ public class Code08_FatherMinus1 { public static int MAXB = 501; public static int n, m; public static int[] fa = new int[MAXN]; - public static int[] outer = new int[MAXN]; + public static int[] out = new int[MAXN]; public static int blen, bnum; public static int[] bi = new int[MAXN]; @@ -37,9 +37,9 @@ public static void innerUpdate(int b) { lazy[b] = 0; for (int i = bl[b]; i <= br[b]; i++) { if (fa[i] < bl[b]) { - outer[i] = fa[i]; + out[i] = fa[i]; } else { - outer[i] = outer[fa[i]]; + out[i] = out[fa[i]]; } } } @@ -75,7 +75,7 @@ public static int jumpFa(int i) { } public static int jumpOut(int i) { - return Math.max(1, outer[i] - lazy[bi[i]]); + return Math.max(1, out[i] - lazy[bi[i]]); } public static int lca(int x, int y) { diff --git a/src/class173/Code08_FatherMinus2.java b/src/class173/Code08_FatherMinus2.java index aa82db387..990e5040a 100644 --- a/src/class173/Code08_FatherMinus2.java +++ b/src/class173/Code08_FatherMinus2.java @@ -19,7 +19,7 @@ //const int MAXB = 501; //int n, m; //int fa[MAXN]; -//int outer[MAXN]; +//int out[MAXN]; // //int blen, bnum; //int bi[MAXN]; @@ -35,9 +35,9 @@ // lazy[b] = 0; // for (int i = bl[b]; i <= br[b]; i++) { // if (fa[i] < bl[b]) { -// outer[i] = fa[i]; +// out[i] = fa[i]; // } else { -// outer[i] = outer[fa[i]]; +// out[i] = out[fa[i]]; // } // } //} @@ -71,7 +71,7 @@ //} // //int jumpOut(int i) { -// return max(1, outer[i] - lazy[bi[i]]); +// return max(1, out[i] - lazy[bi[i]]); //} // //int lca(int x, int y) { From 1353fb6e303e3691842cba2bd5e80db06c92ce04 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 11:20:02 +0800 Subject: [PATCH 0391/1170] modify code --- src/class173/Code06_Random1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index 718bcae72..f7e565ab9 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -31,7 +31,7 @@ public class Code06_Random1 { public static int[] to = new int[MAXN << 1]; public static int cntg = 0; - // 树上倍增求LCA + // 树上倍增,就只是为了快速求出LCA public static int[] dep = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXP]; From 7ba0cd17d378134766d259c95f3d73291e4a614b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 11:26:10 +0800 Subject: [PATCH 0392/1170] modify code --- src/class173/Code05_HLD1.java | 8 ++++---- src/class173/Code05_HLD2.java | 9 ++++----- src/class173/Code06_Random1.java | 8 ++++---- src/class173/Code06_Random2.java | 8 ++++---- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/class173/Code05_HLD1.java b/src/class173/Code05_HLD1.java index 88fce56b9..f3b9c409c 100644 --- a/src/class173/Code05_HLD1.java +++ b/src/class173/Code05_HLD1.java @@ -286,22 +286,22 @@ public static void main(String[] args) throws IOException { addEdge(v, u); } prepare(); - for (int i = 1, last = 0; i <= m; i++) { + for (int i = 1, lastAns = 0; i <= m; i++) { ans.clear(); k = in.nextInt(); for (int j = 1, x, y; j <= k; j++) { x = in.nextInt(); y = in.nextInt(); if (f > 0) { - x = x ^ last; - y = y ^ last; + x = x ^ lastAns; + y = y ^ lastAns; } updateAns(x, y); } int ans1 = ans.getOnes(); int ans2 = ans.mex(); out.println(ans1 + " " + ans2); - last = ans1 + ans2; + lastAns = ans1 + ans2; } out.flush(); out.close(); diff --git a/src/class173/Code05_HLD2.java b/src/class173/Code05_HLD2.java index 3870ff4c9..36d2a4e83 100644 --- a/src/class173/Code05_HLD2.java +++ b/src/class173/Code05_HLD2.java @@ -146,15 +146,14 @@ // addEdge(v, u); // } // prepare(); -// int last = 0; -// for (int i = 1; i <= m; i++) { +// for (int i = 1, lastAns = 0; i <= m; i++) { // ans.reset(); // cin >> k; // for (int j = 1, x, y; j <= k; j++) { // cin >> x >> y; // if (f) { -// x ^= last; -// y ^= last; +// x ^= lastAns; +// y ^= lastAns; // } // updateAns(x, y); // } @@ -167,7 +166,7 @@ // } // } // cout << ans1 << ' ' << ans2 << '\n'; -// last = ans1 + ans2; +// lastAns = ans1 + ans2; // } // return 0; //} \ No newline at end of file diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index f7e565ab9..68dc2624a 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -250,22 +250,22 @@ public static void main(String[] args) throws IOException { addEdge(v, u); } prepare(); - for (int i = 1, last = 0; i <= m; i++) { + for (int i = 1, lastAns = 0; i <= m; i++) { ans.clear(); k = in.nextInt(); for (int j = 1, x, y; j <= k; j++) { x = in.nextInt(); y = in.nextInt(); if (f > 0) { - x = x ^ last; - y = y ^ last; + x = x ^ lastAns; + y = y ^ lastAns; } updateAns(x, y); } int ans1 = ans.countOnes(); int ans2 = ans.mex(); out.println(ans1 + " " + ans2); - last = ans1 + ans2; + lastAns = ans1 + ans2; } out.flush(); out.close(); diff --git a/src/class173/Code06_Random2.java b/src/class173/Code06_Random2.java index 86b4dca17..81260650d 100644 --- a/src/class173/Code06_Random2.java +++ b/src/class173/Code06_Random2.java @@ -143,14 +143,14 @@ // addEdge(v, u); // } // prepare(); -// for (int i = 1, last = 0; i <= m; i++) { +// for (int i = 1, lastAns = 0; i <= m; i++) { // ans.reset(); // cin >> k; // for (int j = 1, x, y; j <= k; j++) { // cin >> x >> y; // if (f) { -// x ^= last; -// y ^= last; +// x ^= lastAns; +// y ^= lastAns; // } // updateAns(x, y); // } @@ -163,7 +163,7 @@ // } // } // cout << ans1 << ' ' << ans2 << '\n'; -// last = ans1 + ans2; +// lastAns = ans1 + ans2; // } // return 0; //} \ No newline at end of file From c5e7f1f359bb5f9d7dbb4eb9741690465e99b63e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 14:11:58 +0800 Subject: [PATCH 0393/1170] modify code --- src/class173/Code08_FatherMinus1.java | 9 +++++++-- src/class173/Code08_FatherMinus2.java | 5 +++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/class173/Code08_FatherMinus1.java b/src/class173/Code08_FatherMinus1.java index b47133916..019baa24c 100644 --- a/src/class173/Code08_FatherMinus1.java +++ b/src/class173/Code08_FatherMinus1.java @@ -20,15 +20,20 @@ public class Code08_FatherMinus1 { public static int MAXN = 100001; public static int MAXB = 501; public static int n, m; + + // 节点的父亲节点 public static int[] fa = new int[MAXN]; + // 节点如果从所在块出去,会去往的最近节点 public static int[] out = new int[MAXN]; public static int blen, bnum; public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; + // 块内所有节点的父亲编号减少的幅度 public static int[] lazy = new int[MAXB]; - public static int[] cnt = new int[MAXB]; + // 块内所有节点的父亲编号被统一削减的次数 + public static int[] minusCnt = new int[MAXB]; public static void innerUpdate(int b) { for (int i = bl[b]; i <= br[b]; i++) { @@ -63,7 +68,7 @@ public static void update(int l, int r, int v) { // 减少的幅度最多到n,不会更大 // 这样还可以让lazy保持int类型并且不溢出 lazy[b] = Math.min(n, lazy[b] + v); - if (++cnt[b] <= blen) { + if (++minusCnt[b] <= blen) { innerUpdate(b); } } diff --git a/src/class173/Code08_FatherMinus2.java b/src/class173/Code08_FatherMinus2.java index 990e5040a..447e60682 100644 --- a/src/class173/Code08_FatherMinus2.java +++ b/src/class173/Code08_FatherMinus2.java @@ -18,6 +18,7 @@ //const int MAXN = 100001; //const int MAXB = 501; //int n, m; +// //int fa[MAXN]; //int out[MAXN]; // @@ -26,7 +27,7 @@ //int bl[MAXB]; //int br[MAXB]; //int lazy[MAXB]; -//int cnt[MAXB]; +//int minusCnt[MAXB]; // //void innerUpdate(int b) { // for (int i = bl[b]; i <= br[b]; i++) { @@ -59,7 +60,7 @@ // innerUpdate(bi[r]); // for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { // lazy[b] = min(n, lazy[b] + v); -// if (++cnt[b] <= blen) { +// if (++minusCnt[b] <= blen) { // innerUpdate(b); // } // } From 320079da4db387fec5073aabb64f50adf1f7e4ef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 14:12:59 +0800 Subject: [PATCH 0394/1170] modify code --- src/class173/Code08_FatherMinus1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code08_FatherMinus1.java b/src/class173/Code08_FatherMinus1.java index 019baa24c..70e1e94e7 100644 --- a/src/class173/Code08_FatherMinus1.java +++ b/src/class173/Code08_FatherMinus1.java @@ -30,9 +30,9 @@ public class Code08_FatherMinus1 { public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - // 块内所有节点的父亲编号减少的幅度 + // 块内所有节点的父亲编号,统一减少的幅度 public static int[] lazy = new int[MAXB]; - // 块内所有节点的父亲编号被统一削减的次数 + // 块内所有节点的父亲编号,统一削减的次数 public static int[] minusCnt = new int[MAXB]; public static void innerUpdate(int b) { From b296394145de51411c65909943ef4b76d475f119 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 15:58:53 +0800 Subject: [PATCH 0395/1170] modify code --- src/class173/Code06_Random1.java | 2 +- src/class173/Code06_Random2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class173/Code06_Random1.java b/src/class173/Code06_Random1.java index 68dc2624a..0f1ca9d83 100644 --- a/src/class173/Code06_Random1.java +++ b/src/class173/Code06_Random1.java @@ -201,9 +201,9 @@ public static void query(int x, int xylca) { public static void updateAns(int x, int y) { int xylca = lca(x, y); - ans.setOne(arr[xylca]); query(x, xylca); query(y, xylca); + ans.setOne(arr[xylca]); } public static void prepare() { diff --git a/src/class173/Code06_Random2.java b/src/class173/Code06_Random2.java index 81260650d..b478ea93f 100644 --- a/src/class173/Code06_Random2.java +++ b/src/class173/Code06_Random2.java @@ -97,9 +97,9 @@ // //void updateAns(int x, int y) { // int xylca = lca(x, y); -// ans[arr[xylca]] = 1; // query(x, xylca); // query(y, xylca); +// ans[arr[xylca]] = 1; //} // //void prepare() { From fe27487d18bd9bdf30ad1927e926e579bf347b1a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 17:05:26 +0800 Subject: [PATCH 0396/1170] modify code --- src/class173/Code07_Royal1.java | 4 ++-- src/class173/Code07_Royal2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class173/Code07_Royal1.java b/src/class173/Code07_Royal1.java index 0e9bad3e0..3c9114548 100644 --- a/src/class173/Code07_Royal1.java +++ b/src/class173/Code07_Royal1.java @@ -2,11 +2,11 @@ // 王室联邦,java版 // 一共有n个城市,编号1~n,给定n-1条边,所有城市连成一棵树 -// 给定数值b,希望你把树划分成若干个联通区,也叫省,划分要求如下 +// 给定数值b,请把树划分成若干个省,划分要求如下 // 每个省至少要有b个城市,最多有3 * b个城市,每个省必须有一个省会 // 省会可在省内也可在省外,一个城市可以是多个省的省会 // 一个省里,任何城市到达省会的路径上,除了省会之外的其他城市,必须都在省内 -// 根据要求完成一种有效划分即可,先打印你划分了多少个省,假设数量为k +// 根据要求完成一种有效划分即可,先打印划分了多少个省,假设数量为k // 然后打印n个数字,范围[1, k],表示每个城市被划分给了哪个省 // 最后打印k个数字,表示每个省会的城市编号 // 1 <= n、b <= 10^3 diff --git a/src/class173/Code07_Royal2.java b/src/class173/Code07_Royal2.java index f9fffc55e..6c7f3a0ec 100644 --- a/src/class173/Code07_Royal2.java +++ b/src/class173/Code07_Royal2.java @@ -2,11 +2,11 @@ // 王室联邦,C++版 // 一共有n个城市,编号1~n,给定n-1条边,所有城市连成一棵树 -// 给定数值b,希望你把树划分成若干个联通区,也叫省,划分要求如下 +// 给定数值b,请把树划分成若干个省,划分要求如下 // 每个省至少要有b个城市,最多有3 * b个城市,每个省必须有一个省会 // 省会可在省内也可在省外,一个城市可以是多个省的省会 // 一个省里,任何城市到达省会的路径上,除了省会之外的其他城市,必须都在省内 -// 根据要求完成一种有效划分即可,先打印你划分了多少个省,假设数量为k +// 根据要求完成一种有效划分即可,先打印划分了多少个省,假设数量为k // 然后打印n个数字,范围[1, k],表示每个城市被划分给了哪个省 // 最后打印k个数字,表示每个省会的城市编号 // 1 <= n、b <= 10^3 From bb09f7350535e8dff88e5c2f90d8fdf1ab6b57b2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 17:49:05 +0800 Subject: [PATCH 0397/1170] modify code --- src/class173/Code07_Royal1.java | 6 +++--- src/class173/Code07_Royal2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class173/Code07_Royal1.java b/src/class173/Code07_Royal1.java index 3c9114548..983f69508 100644 --- a/src/class173/Code07_Royal1.java +++ b/src/class173/Code07_Royal1.java @@ -42,14 +42,14 @@ public static void addEdge(int u, int v) { } public static void dfs(int u, int f) { - int tmp = siz; + int x = siz; for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != f) { dfs(v, u); - if (siz >= tmp + b) { + if (siz - x >= b) { capital[++cntb] = u; - while (siz != tmp) { + while (siz != x) { belong[stack[siz--]] = cntb; } } diff --git a/src/class173/Code07_Royal2.java b/src/class173/Code07_Royal2.java index 6c7f3a0ec..acbd7c90c 100644 --- a/src/class173/Code07_Royal2.java +++ b/src/class173/Code07_Royal2.java @@ -40,14 +40,14 @@ //} // //void dfs(int u, int f) { -// int tmp = siz; +// int x = siz; // for (int e = head[u], v; e; e = nxt[e]) { // v = to[e]; // if (v != f) { // dfs(v, u); -// if (siz >= tmp + b) { +// if (siz - x >= b) { // capital[++cntb] = u; -// while (siz != tmp) { +// while (siz != x) { // belong[sta[siz--]] = cntb; // } // } From 93477e7cf5d36307f01410b68b1dcee335e7d970 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 20:12:52 +0800 Subject: [PATCH 0398/1170] modify code --- src/class173/Code08_FatherMinus1.java | 4 ++-- src/class173/Code08_FatherMinus2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class173/Code08_FatherMinus1.java b/src/class173/Code08_FatherMinus1.java index 70e1e94e7..3a24e3a05 100644 --- a/src/class173/Code08_FatherMinus1.java +++ b/src/class173/Code08_FatherMinus1.java @@ -3,8 +3,8 @@ // 区间父变小,java版 // 一棵大小为n树,节点1是树头,给定fa[2..n]表示父亲节点编号 // 对于每个i > 1,都有fa[i] < i,下来有m条操作,操作类型如下 -// 操作 x y z : [x..y]范围上任何一点i,fa[i] = max(1, fa[i] - z) -// 操作 x y : 查询点x和点y的最低公共祖先 +// 操作 1 x y z : [x..y]范围上任何一点i,fa[i] = max(1, fa[i] - z) +// 操作 2 x y : 查询点x和点y的最低公共祖先 // 2 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1491H // 测试链接 : https://codeforces.com/problemset/problem/1491/H diff --git a/src/class173/Code08_FatherMinus2.java b/src/class173/Code08_FatherMinus2.java index 447e60682..78332d6a6 100644 --- a/src/class173/Code08_FatherMinus2.java +++ b/src/class173/Code08_FatherMinus2.java @@ -3,8 +3,8 @@ // 区间父变小,C++版 // 一棵大小为n树,节点1是树头,给定fa[2..n]表示父亲节点编号 // 对于每个i > 1,都有fa[i] < i,下来有m条操作,操作类型如下 -// 操作 x y z : [x..y]范围上任何一点i,fa[i] = max(1, fa[i] - z) -// 操作 x y : 查询点x和点y的最低公共祖先 +// 操作 1 x y z : [x..y]范围上任何一点i,fa[i] = max(1, fa[i] - z) +// 操作 2 x y : 查询点x和点y的最低公共祖先 // 2 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1491H // 测试链接 : https://codeforces.com/problemset/problem/1491/H From 23beb9e7f7b4137518fbf7c4e04e1aaf81aeecb1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Jul 2025 22:12:47 +0800 Subject: [PATCH 0399/1170] modify code --- ...21\344\270\212\345\210\206\345\235\227.pptx" | Bin 0 -> 60290 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243173\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2302-\345\210\206\345\235\227\347\232\204\345\207\240\351\201\223\345\245\275\351\242\230\343\200\201\346\240\221\344\270\212\345\210\206\345\235\227.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243173\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2302-\345\210\206\345\235\227\347\232\204\345\207\240\351\201\223\345\245\275\351\242\230\343\200\201\346\240\221\344\270\212\345\210\206\345\235\227.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243173\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2302-\345\210\206\345\235\227\347\232\204\345\207\240\351\201\223\345\245\275\351\242\230\343\200\201\346\240\221\344\270\212\345\210\206\345\235\227.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..066f41b0fe6106917711f3cce00a374f602a5fc6 GIT binary patch literal 60290 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 S5ReeyTZ0M&R5khY=>GxfB70T< literal 0 HcmV?d00001 From 0a9a74b80a03b2b4ee38864e59f8570ed441d856 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 5 Jul 2025 17:16:03 +0800 Subject: [PATCH 0400/1170] modify code --- src/class174/Code01_FutureDiary1.java | 257 ++++++++++++++++++++++++++ src/class174/Code01_FutureDiary2.java | 225 ++++++++++++++++++++++ 2 files changed, 482 insertions(+) create mode 100644 src/class174/Code01_FutureDiary1.java create mode 100644 src/class174/Code01_FutureDiary2.java diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java new file mode 100644 index 000000000..60960bccc --- /dev/null +++ b/src/class174/Code01_FutureDiary1.java @@ -0,0 +1,257 @@ +package class174; + +// 未来日记,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4119 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是无法通过测试 +// 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code01_FutureDiary2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_FutureDiary1 { + + public static int MAXN = 100001; + public static int MAXB = 318; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[] tmp = new int[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + + public static int[][] valRoot = new int[MAXB][MAXN]; + public static int[][] rootVal = new int[MAXB][MAXN]; + public static int[] idxRoot = new int[MAXN]; + + public static int[][] sum1 = new int[MAXB][MAXB]; + public static int[][] sum2 = new int[MAXB][MAXN]; + public static int[] cnt1 = new int[MAXB]; + public static int[] cnt2 = new int[MAXN]; + + public static void build(int b) { + for (int i = 1; i <= blen; i++) { + valRoot[b][rootVal[b][i]] = 0; + } + for (int i = bl[b], cnt = 0; i <= br[b]; i++) { + if (valRoot[b][arr[i]] == 0) { + cnt++; + valRoot[b][arr[i]] = cnt; + rootVal[b][cnt] = arr[i]; + } + idxRoot[i] = valRoot[b][arr[i]]; + } + } + + public static void down(int b) { + for (int i = bl[b]; i <= br[b]; i++) { + arr[i] = rootVal[b][idxRoot[i]]; + } + } + + public static void xToy(int b, int x, int y) { + valRoot[b][y] = valRoot[b][x]; + rootVal[b][valRoot[b][x]] = y; + valRoot[b][x] = 0; + } + + public static void innerUpdate(int l, int r, int x, int y) { + down(bi[l]); + for (int i = l; i <= r; i++) { + if (arr[i] == x) { + sum1[bi[i]][bi[x]]--; + sum1[bi[i]][bi[y]]++; + sum2[bi[i]][x]--; + sum2[bi[i]][y]++; + arr[i] = y; + } + } + build(bi[l]); + } + + public static void update(int l, int r, int x, int y) { + if (x == y || (sum2[bi[r]][x] - sum2[bi[l] - 1][x] == 0)) { + return; + } + for (int b = bi[n]; b >= bi[l]; b--) { + sum1[b][bi[x]] -= sum1[b - 1][bi[x]]; + sum1[b][bi[y]] -= sum1[b - 1][bi[y]]; + sum2[b][x] -= sum2[b - 1][x]; + sum2[b][y] -= sum2[b - 1][y]; + } + if (bi[l] == bi[r]) { + innerUpdate(l, r, x, y); + } else { + innerUpdate(l, br[bi[l]], x, y); + innerUpdate(bl[bi[r]], r, x, y); + for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { + if (sum2[b][x] != 0) { + if (sum2[b][y] != 0) { + innerUpdate(bl[b], br[b], x, y); + } else { + sum1[b][bi[y]] += sum2[b][x]; + sum1[b][bi[x]] -= sum2[b][x]; + sum2[b][y] += sum2[b][x]; + sum2[b][x] = 0; + xToy(b, x, y); + } + } + } + } + for (int b = bi[l]; b <= bi[n]; b++) { + sum1[b][bi[x]] += sum1[b - 1][bi[x]]; + sum1[b][bi[y]] += sum1[b - 1][bi[y]]; + sum2[b][x] += sum2[b - 1][x]; + sum2[b][y] += sum2[b - 1][y]; + } + } + + public static int query(int l, int r, int k) { + int ans = 0; + if (bi[l] == bi[r]) { + down(bi[l]); + for (int i = l; i <= r; i++) { + tmp[i] = arr[i]; + } + Arrays.sort(tmp, l, r + 1); + ans = tmp[l + k - 1]; + } else { + down(bi[l]); + down(bi[r]); + for (int i = l; i <= br[bi[l]]; i++) { + cnt1[bi[arr[i]]]++; + cnt2[arr[i]]++; + } + for (int i = bl[bi[r]]; i <= r; i++) { + cnt1[bi[arr[i]]]++; + cnt2[arr[i]]++; + } + int sumCnt = 0; + int vblock = 0; + for (int b = 1; b <= bi[MAXN - 1]; b++) { + int blockCnt = cnt1[b] + sum1[bi[r] - 1][b] - sum1[bi[l]][b]; + if (sumCnt + blockCnt < k) { + sumCnt += blockCnt; + } else { + vblock = b; + break; + } + } + for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { + int valCnt = cnt2[v] + sum2[bi[r] - 1][v] - sum2[bi[l]][v]; + if (sumCnt + valCnt >= k) { + ans = v; + break; + } else { + sumCnt += valCnt; + } + } + for (int i = l; i <= br[bi[l]]; i++) { + cnt1[bi[arr[i]]]--; + cnt2[arr[i]]--; + } + for (int i = bl[bi[r]]; i <= r; i++) { + cnt1[bi[arr[i]]]--; + cnt2[arr[i]]--; + } + } + return ans; + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i < MAXN; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + build(i); + } + for (int i = 1; i <= bnum; i++) { + for (int j = 1; j < MAXB; j++) { + sum1[i][j] = sum1[i - 1][j]; + } + for (int j = 1; j < MAXN; j++) { + sum2[i][j] = sum2[i - 1][j]; + } + for (int j = bl[i]; j <= br[i]; j++) { + sum1[i][bi[arr[j]]]++; + sum2[i][arr[j]]++; + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + for (int i = 1, op, l, r, x, y, k; i <= m; i++) { + op = in.nextInt(); + l = in.nextInt(); + r = in.nextInt(); + if (op == 1) { + x = in.nextInt(); + y = in.nextInt(); + update(l, r, x, y); + } else { + k = in.nextInt(); + out.println(query(l, r, k)); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } +} diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java new file mode 100644 index 000000000..beb28b9de --- /dev/null +++ b/src/class174/Code01_FutureDiary2.java @@ -0,0 +1,225 @@ +package class174; + +// 未来日记,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4119 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//char buf[1000000], *p1 = buf, *p2 = buf; +// +//inline char getChar() { +// return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++; +//} +// +//inline int read() { +// int s = 0; +// char c = getChar(); +// while (!isdigit(c)) { +// c = getChar(); +// } +// while (isdigit(c)) { +// s = s * 10 + c - '0'; +// c = getChar(); +// } +// return s; +//} +// +//const int MAXN = 100001; +//const int MAXB = 318; +//int n, m; +//int arr[MAXN]; +//int tmp[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +// +//int valRoot[MAXB][MAXN]; +//int rootVal[MAXB][MAXN]; +//int idxRoot[MAXN]; +// +//int sum1[MAXB][MAXB]; +//int sum2[MAXB][MAXN]; +//int cnt1[MAXB]; +//int cnt2[MAXN]; +// +//void build(int b) { +// for (int i = 1; i <= blen; i++) { +// valRoot[b][rootVal[b][i]] = 0; +// } +// int cnt = 0; +// for (int i = bl[b]; i <= br[b]; i++) { +// if (valRoot[b][arr[i]] == 0) { +// cnt++; +// valRoot[b][arr[i]] = cnt; +// rootVal[b][cnt] = arr[i]; +// } +// idxRoot[i] = valRoot[b][arr[i]]; +// } +//} +// +//void down(int b) { +// for (int i = bl[b]; i <= br[b]; i++) { +// arr[i] = rootVal[b][idxRoot[i]]; +// } +//} +// +//void xToy(int b, int x, int y) { +// valRoot[b][y] = valRoot[b][x]; +// rootVal[b][valRoot[b][x]] = y; +// valRoot[b][x] = 0; +//} +// +//void innerUpdate(int l, int r, int x, int y) { +// down(bi[l]); +// for (int i = l; i <= r; i++) { +// if (arr[i] == x) { +// sum1[bi[i]][bi[x]]--; +// sum1[bi[i]][bi[y]]++; +// sum2[bi[i]][x]--; +// sum2[bi[i]][y]++; +// arr[i] = y; +// } +// } +// build(bi[l]); +//} +// +//void update(int l, int r, int x, int y) { +// if (x == y || (sum2[bi[r]][x] - sum2[bi[l] - 1][x] == 0)) { +// return; +// } +// for (int b = bi[n]; b >= bi[l]; b--) { +// sum1[b][bi[x]] -= sum1[b - 1][bi[x]]; +// sum1[b][bi[y]] -= sum1[b - 1][bi[y]]; +// sum2[b][x] -= sum2[b - 1][x]; +// sum2[b][y] -= sum2[b - 1][y]; +// } +// if (bi[l] == bi[r]) { +// innerUpdate(l, r, x, y); +// } else { +// innerUpdate(l, br[bi[l]], x, y); +// innerUpdate(bl[bi[r]], r, x, y); +// for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { +// if (sum2[b][x] != 0) { +// if (sum2[b][y] != 0) { +// innerUpdate(bl[b], br[b], x, y); +// } else { +// sum1[b][bi[y]] += sum2[b][x]; +// sum1[b][bi[x]] -= sum2[b][x]; +// sum2[b][y] += sum2[b][x]; +// sum2[b][x] = 0; +// xToy(b, x, y); +// } +// } +// } +// } +// for (int b = bi[l]; b <= bi[n]; b++) { +// sum1[b][bi[x]] += sum1[b - 1][bi[x]]; +// sum1[b][bi[y]] += sum1[b - 1][bi[y]]; +// sum2[b][x] += sum2[b - 1][x]; +// sum2[b][y] += sum2[b - 1][y]; +// } +//} +// +//int query(int l, int r, int k) { +// int ans = 0; +// if (bi[l] == bi[r]) { +// down(bi[l]); +// for (int i = l; i <= r; i++) { +// tmp[i] = arr[i]; +// } +// sort(tmp + l, tmp + r + 1); +// ans = tmp[l + k - 1]; +// } else { +// down(bi[l]); +// down(bi[r]); +// for (int i = l; i <= br[bi[l]]; i++) { +// cnt1[bi[arr[i]]]++; +// cnt2[arr[i]]++; +// } +// for (int i = bl[bi[r]]; i <= r; i++) { +// cnt1[bi[arr[i]]]++; +// cnt2[arr[i]]++; +// } +// int sumCnt = 0, vblock = 0; +// for (int b = 1; b <= bi[MAXN - 1]; b++) { +// int blockCnt = cnt1[b] + sum1[bi[r] - 1][b] - sum1[bi[l]][b]; +// if (sumCnt + blockCnt < k) { +// sumCnt += blockCnt; +// } else { +// vblock = b; +// break; +// } +// } +// for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { +// int valCnt = cnt2[v] + sum2[bi[r] - 1][v] - sum2[bi[l]][v]; +// if (sumCnt + valCnt >= k) { +// ans = v; +// break; +// } +// sumCnt += valCnt; +// } +// for (int i = l; i <= br[bi[l]]; i++) { +// cnt1[bi[arr[i]]]--; +// cnt2[arr[i]]--; +// } +// for (int i = bl[bi[r]]; i <= r; i++) { +// cnt1[bi[arr[i]]]--; +// cnt2[arr[i]]--; +// } +// } +// return ans; +//} +// +//void prepare() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i < MAXN; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// build(i); +// } +// for (int i = 1; i <= bnum; i++) { +// for (int j = 1; j < MAXB; j++) { +// sum1[i][j] = sum1[i - 1][j]; +// } +// for (int j = 1; j < MAXN; j++) { +// sum2[i][j] = sum2[i - 1][j]; +// } +// for (int j = bl[i]; j <= br[i]; j++) { +// sum1[i][bi[arr[j]]]++; +// sum2[i][arr[j]]++; +// } +// } +//} +// +//int main() { +// n = read(); +// m = read(); +// for (int i = 1; i <= n; i++) { +// arr[i] = read(); +// } +// prepare(); +// for (int i = 1, op, l, r, x, y, k; i <= m; i++) { +// op = read(); +// l = read(); +// r = read(); +// if (op == 1) { +// x = read(); +// y = read(); +// update(l, r, x, y); +// } else { +// k = read(); +// printf("%d\n", query(l, r, k)); +// } +// } +// return 0; +//} \ No newline at end of file From ca02e726c15136667c60b8de66efcd7f477e6a1b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 5 Jul 2025 17:22:55 +0800 Subject: [PATCH 0401/1170] modify code --- src/class174/Code01_FutureDiary1.java | 6 ++---- src/class174/Code01_FutureDiary2.java | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 60960bccc..fd9c9a6e9 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -154,12 +154,10 @@ public static int query(int l, int r, int k) { } } for (int i = l; i <= br[bi[l]]; i++) { - cnt1[bi[arr[i]]]--; - cnt2[arr[i]]--; + cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; } for (int i = bl[bi[r]]; i <= r; i++) { - cnt1[bi[arr[i]]]--; - cnt2[arr[i]]--; + cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; } } return ans; diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index beb28b9de..c27ea3f3f 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -165,12 +165,10 @@ // sumCnt += valCnt; // } // for (int i = l; i <= br[bi[l]]; i++) { -// cnt1[bi[arr[i]]]--; -// cnt2[arr[i]]--; +// cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; // } // for (int i = bl[bi[r]]; i <= r; i++) { -// cnt1[bi[arr[i]]]--; -// cnt2[arr[i]]--; +// cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; // } // } // return ans; From abeca9bd961ca00ba5d962af47727ed50c2febee Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 6 Jul 2025 21:49:09 +0800 Subject: [PATCH 0402/1170] modify code --- src/class174/Code01_FutureDiary1.java | 5 +- src/class174/Code01_FutureDiary2.java | 2 +- src/class174/Code02_ColorfulWorld1.java | 215 ++++++++++++++++++++++++ src/class174/Code02_ColorfulWorld2.java | 162 ++++++++++++++++++ 4 files changed, 381 insertions(+), 3 deletions(-) create mode 100644 src/class174/Code02_ColorfulWorld1.java create mode 100644 src/class174/Code02_ColorfulWorld2.java diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index fd9c9a6e9..ad7f05459 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -3,7 +3,7 @@ // 未来日记,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4119 // 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是无法通过测试 +// java实现的逻辑一定是正确的,但是运行超时 // 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code01_FutureDiary2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 @@ -27,9 +27,9 @@ public class Code01_FutureDiary1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; + public static int[] idxRoot = new int[MAXN]; public static int[][] valRoot = new int[MAXB][MAXN]; public static int[][] rootVal = new int[MAXB][MAXN]; - public static int[] idxRoot = new int[MAXN]; public static int[][] sum1 = new int[MAXB][MAXB]; public static int[][] sum2 = new int[MAXB][MAXN]; @@ -252,4 +252,5 @@ int nextInt() throws IOException { return neg ? -val : val; } } + } diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index c27ea3f3f..88fd4a1fc 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -39,9 +39,9 @@ //int bl[MAXB]; //int br[MAXB]; // +//int idxRoot[MAXN]; //int valRoot[MAXB][MAXN]; //int rootVal[MAXB][MAXN]; -//int idxRoot[MAXN]; // //int sum1[MAXB][MAXB]; //int sum2[MAXB][MAXN]; diff --git a/src/class174/Code02_ColorfulWorld1.java b/src/class174/Code02_ColorfulWorld1.java new file mode 100644 index 000000000..62e8f4384 --- /dev/null +++ b/src/class174/Code02_ColorfulWorld1.java @@ -0,0 +1,215 @@ +package class174; + +// 五彩斑斓的世界,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4117 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是内存占用过大 +// 因为这道题只考虑C++能通过的空间标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code02_ColorfulWorld2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code02_ColorfulWorld1 { + + public static int MAXN = 1000001; + public static int n, m; + public static int blen, bnum; + public static int maxv, lazy; + public static int[] arr = new int[MAXN]; + + public static int[] op = new int[MAXN]; + public static int[] ql = new int[MAXN]; + public static int[] qr = new int[MAXN]; + public static int[] qx = new int[MAXN]; + + public static int[] fa = new int[MAXN]; + public static int[] sum = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + public static int find(int x) { + if (x != fa[x]) { + fa[x] = find(fa[x]); + } + return fa[x]; + } + + public static void union(int x, int y) { + fa[find(x)] = find(y); + } + + public static void down(int l, int r) { + for (int i = l; i <= r; i++) { + arr[i] = find(arr[i]); + } + } + + public static void update(int qi, int l, int r) { + int jobl = ql[qi], jobr = qr[qi], jobx = qx[qi]; + if (jobx > maxv - lazy || jobl > r || jobr < l) { + return; + } + if (jobl <= l && r <= jobr) { + if ((jobx << 1) <= maxv - lazy) { + for (int v = lazy + 1; v <= lazy + jobx; v++) { + sum[v + jobx] += sum[v]; + sum[v] = 0; + union(v, v + jobx); + } + lazy += jobx; + } else { + for (int v = maxv; v > lazy + jobx; v--) { + sum[v - jobx] += sum[v]; + sum[v] = 0; + union(v, v - jobx); + } + for (int v = maxv; v >= 0; v--) { + if (sum[v] != 0) { + maxv = v; + break; + } + } + } + } else { + down(l, r); + for (int i = Math.max(l, jobl); i <= Math.min(r, jobr); i++) { + if (arr[i] - lazy > jobx) { + sum[arr[i]]--; + arr[i] -= jobx; + sum[arr[i]]++; + } + } + for (int v = maxv; v >= 0; v--) { + if (sum[v] != 0) { + maxv = v; + break; + } + } + } + } + + public static void query(int qi, int l, int r) { + int jobl = ql[qi], jobr = qr[qi], jobx = qx[qi]; + if (jobx == 0) { + return; + } + if (jobx > maxv - lazy || jobl > r || jobr < l) { + return; + } + if (jobl <= l && r <= jobr) { + ans[qi] += sum[jobx + lazy]; + } else { + down(l, r); + for (int i = Math.max(l, jobl); i <= Math.min(r, jobr); i++) { + if (arr[i] - lazy == jobx) { + ans[qi]++; + } + } + } + } + + public static void compute(int l, int r) { + Arrays.fill(sum, 0); + maxv = lazy = 0; + for (int i = l; i <= r; i++) { + maxv = Math.max(maxv, arr[i]); + sum[arr[i]]++; + } + for (int v = 0; v <= maxv; v++) { + fa[v] = v; + } + for (int i = 1; i <= m; i++) { + if (op[i] == 1) { + update(i, l, r); + } else { + query(i, l, r); + } + } + } + + public static void prepare() { + blen = (int) Math.sqrt(n * 3.0); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + sum[i] = sum[i - 1] + (arr[i] == 0 ? 1 : 0); + } + for (int i = 1; i <= m; i++) { + if (op[i] == 2 && qx[i] == 0) { + ans[i] = sum[qr[i]] - sum[ql[i] - 1]; + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + op[i] = in.nextInt(); + ql[i] = in.nextInt(); + qr[i] = in.nextInt(); + qx[i] = in.nextInt(); + } + prepare(); + for (int i = 1, l, r; i <= bnum; i++) { + l = (i - 1) * blen + 1; + r = Math.min(i * blen, n); + compute(l, r); + } + for (int i = 1; i <= m; i++) { + if (op[i] == 2) { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class174/Code02_ColorfulWorld2.java b/src/class174/Code02_ColorfulWorld2.java new file mode 100644 index 000000000..661af14e2 --- /dev/null +++ b/src/class174/Code02_ColorfulWorld2.java @@ -0,0 +1,162 @@ +package class174; + +// 五彩斑斓的世界,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4117 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1000001; +//int n, m; +//int blen, bnum; +//int maxv, lazy; +//int arr[MAXN]; +// +//int op[MAXN]; +//int ql[MAXN]; +//int qr[MAXN]; +//int qx[MAXN]; +// +//int fa[MAXN]; +//int sum[MAXN]; +//int ans[MAXN]; +// +//int find(int x) { +// if (x != fa[x]) { +// fa[x] = find(fa[x]); +// } +// return fa[x]; +//} +// +//void Union(int x, int y) { +// fa[find(x)] = find(y); +//} +// +//void down(int l, int r) { +// for (int i = l; i <= r; i++) { +// arr[i] = find(arr[i]); +// } +//} +// +//void update(int qi, int l, int r) { +// int jobl = ql[qi], jobr = qr[qi], jobx = qx[qi]; +// if (jobx > maxv - lazy || jobl > r || jobr < l) { +// return; +// } +// if (jobl <= l && r <= jobr) { +// if ((jobx << 1) <= maxv - lazy) { +// for (int v = lazy + 1; v <= lazy + jobx; v++) { +// sum[v + jobx] += sum[v]; +// sum[v] = 0; +// Union(v, v + jobx); +// } +// lazy += jobx; +// } else { +// for (int v = maxv; v > lazy + jobx; v--) { +// sum[v - jobx] += sum[v]; +// sum[v] = 0; +// Union(v, v - jobx); +// } +// for (int v = maxv; v >= 0; v--) { +// if (sum[v] != 0) { +// maxv = v; +// break; +// } +// } +// } +// } else { +// down(l, r); +// for (int i = max(l, jobl); i <= min(r, jobr); i++) { +// if (arr[i] - lazy > jobx) { +// sum[arr[i]]--; +// arr[i] -= jobx; +// sum[arr[i]]++; +// } +// } +// for (int v = maxv; v >= 0; v--) { +// if (sum[v] != 0) { +// maxv = v; +// break; +// } +// } +// } +//} +// +//void query(int qi, int l, int r) { +// int jobl = ql[qi], jobr = qr[qi], jobx = qx[qi]; +// if (jobx == 0) { +// return; +// } +// if (jobx > maxv - lazy || jobl > r || jobr < l) { +// return; +// } +// if (jobl <= l && r <= jobr) { +// ans[qi] += sum[jobx + lazy]; +// } else { +// down(l, r); +// for (int i = max(l, jobl); i <= min(r, jobr); i++) { +// if (arr[i] - lazy == jobx) { +// ans[qi]++; +// } +// } +// } +//} +// +//void compute(int l, int r) { +// fill(sum, sum + MAXN, 0); +// maxv = lazy = 0; +// for (int i = l; i <= r; i++) { +// maxv = max(maxv, arr[i]); +// sum[arr[i]]++; +// } +// for (int v = 0; v <= maxv; v++) { +// fa[v] = v; +// } +// for (int i = 1; i <= m; i++) { +// if (op[i] == 1) { +// update(i, l, r); +// } else { +// query(i, l, r); +// } +// } +//} +// +//void prepare() { +// blen = (int)sqrt(n * 3.0); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// sum[i] = sum[i - 1] + (arr[i] == 0 ? 1 : 0); +// } +// for (int i = 1; i <= m; i++) { +// if (op[i] == 2 && qx[i] == 0) { +// ans[i] = sum[qr[i]] - sum[ql[i] - 1]; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> op[i] >> ql[i] >> qr[i] >> qx[i]; +// } +// prepare(); +// for (int i = 1, l, r; i <= bnum; i++) { +// l = (i - 1) * blen + 1; +// r = min(i * blen, n); +// compute(l, r); +// } +// for (int i = 1; i <= m; i++) { +// if (op[i] == 2) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 1abeed757a8e5749b20eda148d714c27c8ad0f3b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 8 Jul 2025 17:24:54 +0800 Subject: [PATCH 0403/1170] modify code --- src/class174/Code01_FutureDiary1.java | 4 +- src/class174/Code02_ColorfulWorld1.java | 4 +- src/class174/Code03_MagicGirl1.java | 273 ++++++++++++++++++++++++ src/class174/Code03_MagicGirl2.java | 221 +++++++++++++++++++ 4 files changed, 496 insertions(+), 6 deletions(-) create mode 100644 src/class174/Code03_MagicGirl1.java create mode 100644 src/class174/Code03_MagicGirl2.java diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index ad7f05459..01d957b1b 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -2,9 +2,7 @@ // 未来日记,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4119 -// 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是运行超时 -// 因为这道题只考虑C++能通过的时间标准,根本没考虑java的用户 +// 提交以下的code,提交时请把类名改成"Main",本题卡常,java实现无法通过 // 想通过用C++实现,本节课Code01_FutureDiary2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 diff --git a/src/class174/Code02_ColorfulWorld1.java b/src/class174/Code02_ColorfulWorld1.java index 62e8f4384..3b87236ec 100644 --- a/src/class174/Code02_ColorfulWorld1.java +++ b/src/class174/Code02_ColorfulWorld1.java @@ -2,9 +2,7 @@ // 五彩斑斓的世界,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4117 -// 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是内存占用过大 -// 因为这道题只考虑C++能通过的空间标准,根本没考虑java的用户 +// 提交以下的code,提交时请把类名改成"Main",本题卡常,java实现无法通过 // 想通过用C++实现,本节课Code02_ColorfulWorld2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code03_MagicGirl1.java new file mode 100644 index 000000000..1c40178ed --- /dev/null +++ b/src/class174/Code03_MagicGirl1.java @@ -0,0 +1,273 @@ +package class174; + +// 魔法少女网站,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P6578 +// 提交以下的code,提交时请把类名改成"Main",本题卡常,java实现无法通过 +// 想通过用C++实现,本节课Code03_MagicGirl2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code03_MagicGirl1 { + + static class Node { + int v, i; + + Node(int v_, int i_) { + v = v_; + i = i_; + } + } + + static class Answer { + int pre, suf, len; + long res; + + Answer(int p, int s, int l, long r) { + pre = p; + suf = s; + len = l; + res = r; + } + + void merge(Answer right) { + res += right.res + 1L * suf * right.pre; + if (pre == len) + pre += right.pre; + if (right.suf == right.len) { + suf += right.suf; + } else { + suf = right.suf; + } + len += right.len; + } + + } + + public static int MAXN = 300005; + public static int MAXB = 601; + public static int BLEN = 512; + public static int OFFSET = 0x1ff; + public static int POWER = 9; + public static int n, m; + + public static int[] arr = new int[MAXN]; + public static Node[] sortv = new Node[MAXN]; + + public static int[] op = new int[MAXN]; + public static int[] x = new int[MAXN]; + public static int[] y = new int[MAXN]; + public static int[] z = new int[MAXN]; + + public static int[] head1 = new int[MAXB]; + public static int[] head2 = new int[MAXB]; + public static int[] toq = new int[MAXN << 1]; + public static int[] nexte = new int[MAXN << 1]; + public static int cntg; + + public static int[] sortq = new int[MAXN]; + public static int cntq; + + public static int[] lst = new int[MAXN]; + public static int[] nxt = new int[MAXN]; + + public static Answer tmp = new Answer(0, 0, 0, 0); + public static Answer[] ans = new Answer[MAXN]; + + public static void swap(Node[] a, int i, int j) { + Node t = a[i]; + a[i] = a[j]; + a[j] = t; + } + + public static void swap(int[] a, int i, int j) { + int t = a[i]; + a[i] = a[j]; + a[j] = t; + } + + public static void addEdge(int[] head, int u, int v) { + nexte[++cntg] = head[u]; + toq[cntg] = v; + head[u] = cntg; + } + + public static void calc(int l, int r) { + for (int md = 0; md < BLEN; ++md) { + for (int e = head1[md]; e != 0; e = nexte[e]) { + addEdge(head2, z[toq[e]] >> POWER, toq[e]); + } + head1[md] = 0; + } + for (int tm = n / BLEN; tm >= 0; --tm) { + for (int e = head2[tm]; e != 0; e = nexte[e]) { + sortq[++cntq] = toq[e]; + } + head2[tm] = 0; + } + for (int left = 1, right = cntq; left < right; ++left, --right) { + swap(sortq, left, right); + } + for (int i = l; i <= r; ++i) { + lst[i] = i - 1; + nxt[i] = i + 1; + } + tmp.pre = tmp.suf = 0; + tmp.len = r - l + 1; + tmp.res = 0; + int k = 1; + for (int i = l; i <= r; ++i) { + int idx = sortv[i].i; + while (k <= cntq && z[sortq[k]] < arr[idx]) { + ans[sortq[k++]].merge(tmp); + } + if (lst[idx] == l - 1) { + tmp.pre += nxt[idx] - idx; + } + if (nxt[idx] == r + 1) { + tmp.suf += idx - lst[idx]; + } + tmp.res += 1L * (idx - lst[idx]) * (nxt[idx] - idx); + lst[nxt[idx]] = lst[idx]; + nxt[lst[idx]] = nxt[idx]; + } + while (k <= cntq) { + ans[sortq[k++]].merge(tmp); + } + cntg = cntq = 0; + } + + public static void update(int qi, int l, int r) { + int jobi = x[qi], jobv = y[qi]; + if (l <= jobi && jobi <= r) { + calc(l, r); + arr[jobi] = jobv; + int pos = 0; + for (int i = l; i <= r; ++i) { + if (sortv[i].i == jobi) { + sortv[i].v = jobv; + pos = i; + break; + } + } + for (int i = pos; i < r && sortv[i].v > sortv[i + 1].v; ++i) { + swap(sortv, i, i + 1); + } + for (int i = pos; i > l && sortv[i - 1].v > sortv[i].v; --i) { + swap(sortv, i - 1, i); + } + } + } + + public static void query(int qi, int l, int r) { + int jobl = x[qi], jobr = y[qi], jobv = z[qi]; + if (jobl <= l && r <= jobr) { + addEdge(head1, jobv & OFFSET, qi); + } else { + for (int i = Math.max(jobl, l); i <= Math.min(jobr, r); ++i) { + if (arr[i] <= jobv) { + tmp.pre = tmp.suf = tmp.len = 1; + tmp.res = 1; + } else { + tmp.pre = tmp.suf = 0; + tmp.len = 1; + tmp.res = 0; + } + ans[qi].merge(tmp); + } + } + } + + public static void compute(int l, int r) { + for (int i = l; i <= r; ++i) { + sortv[i] = new Node(arr[i], i); + } + Arrays.sort(sortv, l, r + 1, (a, b) -> a.v - b.v); + for (int qi = 1; qi <= m; ++qi) { + if (op[qi] == 1) { + update(qi, l, r); + } else { + query(qi, l, r); + } + } + calc(l, r); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; ++i) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; ++i) { + op[i] = in.nextInt(); + x[i] = in.nextInt(); + y[i] = in.nextInt(); + if (op[i] == 2) { + z[i] = in.nextInt(); + } + } + for (int i = 1; i <= m; ++i) { + ans[i] = new Answer(0, 0, 0, 0); + } + int BNUM = (n + BLEN - 1) / BLEN; + for (int b = 1, l, r; b <= BNUM; ++b) { + l = (b - 1) * BLEN + 1; + r = Math.min(b * BLEN, n); + compute(l, r); + } + for (int i = 1; i <= m; ++i) { + if (op[i] == 2) { + out.println(ans[i].res); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file diff --git a/src/class174/Code03_MagicGirl2.java b/src/class174/Code03_MagicGirl2.java new file mode 100644 index 000000000..5ec71e7d3 --- /dev/null +++ b/src/class174/Code03_MagicGirl2.java @@ -0,0 +1,221 @@ +package class174; + +// 魔法少女网站,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P6578 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//char buf[1000000], *p1 = buf, *p2 = buf; +// +//inline char gc() { +// if (p1 == p2) { +// p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin); +// if (p1 == p2) { +// return EOF; +// } +// } +// return *p1++; +//} +// +//inline int read() { +// int x = 0; +// char c = gc(); +// while (!isdigit(c)) { +// c = gc(); +// } +// while (isdigit(c)) { +// x = x * 10 + c - '0'; +// c = gc(); +// } +// return x; +//} +// +//struct Node { +// int v; +// int i; +//}; +// +//inline bool nodeCmp(const Node &a, const Node &b) { +// return a.v < b.v; +//} +// +//struct Answer { +// int pre, suf, len; +// long long res; +// inline void merge(const Answer &right) { +// res += right.res + 1LL * suf * right.pre; +// if (pre == len) { +// pre += right.pre; +// } +// if (right.suf == right.len) { +// suf += right.suf; +// } else { +// suf = right.suf; +// } +// len += right.len; +// } +//}; +// +//const int MAXN = 300005; +//const int MAXB = 601; +//const int BLEN = 512; +//const int OFFSET = 0x1ff; +//const int POWER = 9; +//int n, m; +// +//int arr[MAXN]; +//Node sortv[MAXN]; +// +//int op[MAXN]; +//int x[MAXN]; +//int y[MAXN]; +//int z[MAXN]; +// +//int head1[MAXB]; +//int head2[MAXB]; +//int toq[MAXN << 1]; +//int nexte[MAXN << 1]; +//int cntg; +// +//int sortq[MAXN]; +//int cntq; +// +//int lst[MAXN]; +//int nxt[MAXN]; +// +//Answer tmp; +//Answer ans[MAXN]; +// +//inline void addEdge(int *head, int u, int v) { +// nexte[++cntg] = head[u]; +// toq[cntg] = v; +// head[u] = cntg; +//} +// +//void calc(int l, int r) { +// for (int md = 0; md < BLEN; ++md) { +// for (int e = head1[md]; e; e = nexte[e]) { +// addEdge(head2, z[toq[e]] >> POWER, toq[e]); +// } +// head1[md] = 0; +// } +// for (int tm = n / BLEN; tm >= 0; --tm) { +// for (int e = head2[tm]; e; e = nexte[e]) { +// sortq[++cntq] = toq[e]; +// } +// head2[tm] = 0; +// } +// for (int left = 1, right = cntq; left < right; ++left, --right) { +// swap(sortq[left], sortq[right]); +// } +// for (int i = l; i <= r; ++i) { +// lst[i] = i - 1; +// nxt[i] = i + 1; +// } +// tmp = { 0, 0, r - l + 1, 0 }; +// int k = 1; +// for (int i = l, idx; i <= r; ++i) { +// idx = sortv[i].i; +// for(; k <= cntq && z[sortq[k]] < arr[idx]; ++k) { +// ans[sortq[k]].merge(tmp); +// } +// if (lst[idx] == l - 1) { +// tmp.pre += nxt[idx] - idx; +// } +// if (nxt[idx] == r + 1) { +// tmp.suf += idx - lst[idx]; +// } +// tmp.res += 1LL * (idx - lst[idx]) * (nxt[idx] - idx); +// lst[nxt[idx]] = lst[idx]; +// nxt[lst[idx]] = nxt[idx]; +// } +// for(; k <= cntq; ++k) { +// ans[sortq[k]].merge(tmp); +// } +// cntg = cntq = 0; +//} +// +//inline void update(int qi, int l, int r) { +// int jobi = x[qi], jobv = y[qi]; +// if (l <= jobi && jobi <= r) { +// calc(l, r); +// arr[jobi] = jobv; +// int pos = 0; +// for (int i = l; i <= r; ++i) { +// if (sortv[i].i == jobi) { +// sortv[i].v = jobv; +// pos = i; +// break; +// } +// } +// for (int i = pos; i < r && sortv[i].v > sortv[i + 1].v; ++i) { +// swap(sortv[i], sortv[i + 1]); +// } +// for (int i = pos; i > l && sortv[i - 1].v > sortv[i].v; --i) { +// swap(sortv[i - 1], sortv[i]); +// } +// } +//} +// +//inline void query(int qi, int l, int r) { +// int jobl = x[qi], jobr = y[qi], jobv = z[qi]; +// if (jobl <= l && r <= jobr) { +// addEdge(head1, jobv & OFFSET, qi); +// } else { +// for (int i = max(jobl, l); i <= min(jobr, r); ++i) { +// if (arr[i] <= jobv) { +// tmp = { 1, 1, 1, 1 }; +// }else { +// tmp = { 0, 0, 1, 0 }; +// } +// ans[qi].merge(tmp); +// } +// } +//} +// +//void compute(int l, int r) { +// for (int i = l; i <= r; ++i) { +// sortv[i] = { arr[i], i }; +// } +// sort(sortv + l, sortv + r + 1, nodeCmp); +// for (int qi = 1; qi <= m; ++qi) { +// if (op[qi] == 1) { +// update(qi, l, r); +// } else { +// query(qi, l, r); +// } +// } +// calc(l, r); +//} +// +//int main() { +// n = read(); +// m = read(); +// for (int i = 1; i <= n; ++i) { +// arr[i] = read(); +// } +// for (int i = 1; i <= m; ++i) { +// op[i] = read(); +// x[i] = read(); +// y[i] = read(); +// if (op[i] == 2) { +// z[i] = read(); +// } +// } +// int BNUM = (n + BLEN - 1) / BLEN; +// for (int i = 1, l, r; i <= BNUM; ++i) { +// l = (i - 1) * BLEN + 1; +// r = min(i * BLEN, n); +// compute(l, r); +// } +// for (int i = 1; i <= m; ++i) { +// if (op[i] == 2) { +// printf("%lld\n", ans[i].res); +// } +// } +// return 0; +//} \ No newline at end of file From afe361a6fa0a7030ed376cedd5d9186c511f5e24 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 8 Jul 2025 22:06:22 +0800 Subject: [PATCH 0404/1170] modify code --- src/class174/Code03_MagicGirl1.java | 101 ++++++++++++---------------- src/class174/Code03_MagicGirl2.java | 91 +++++++++++-------------- 2 files changed, 83 insertions(+), 109 deletions(-) diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code03_MagicGirl1.java index 1c40178ed..cfaa85e18 100644 --- a/src/class174/Code03_MagicGirl1.java +++ b/src/class174/Code03_MagicGirl1.java @@ -16,7 +16,6 @@ public class Code03_MagicGirl1 { static class Node { int v, i; - Node(int v_, int i_) { v = v_; i = i_; @@ -26,14 +25,12 @@ static class Node { static class Answer { int pre, suf, len; long res; - Answer(int p, int s, int l, long r) { pre = p; suf = s; len = l; res = r; } - void merge(Answer right) { res += right.res + 1L * suf * right.pre; if (pre == len) @@ -45,14 +42,13 @@ void merge(Answer right) { } len += right.len; } - } public static int MAXN = 300005; public static int MAXB = 601; - public static int BLEN = 512; - public static int OFFSET = 0x1ff; - public static int POWER = 9; + public static int POW2 = 9; + public static int BLEN = 1 << POW2; + public static int OFFSET = BLEN - 1; public static int n, m; public static int[] arr = new int[MAXN]; @@ -61,16 +57,12 @@ void merge(Answer right) { public static int[] op = new int[MAXN]; public static int[] x = new int[MAXN]; public static int[] y = new int[MAXN]; - public static int[] z = new int[MAXN]; - - public static int[] head1 = new int[MAXB]; - public static int[] head2 = new int[MAXB]; - public static int[] toq = new int[MAXN << 1]; - public static int[] nexte = new int[MAXN << 1]; - public static int cntg; + public static int[] v = new int[MAXN]; - public static int[] sortq = new int[MAXN]; - public static int cntq; + public static int[] arrq = new int[MAXN]; + public static int[] cntv = new int[MAXB]; + public static int[] help = new int[MAXN]; + public static int siz; public static int[] lst = new int[MAXN]; public static int[] nxt = new int[MAXN]; @@ -90,29 +82,22 @@ public static void swap(int[] a, int i, int j) { a[j] = t; } - public static void addEdge(int[] head, int u, int v) { - nexte[++cntg] = head[u]; - toq[cntg] = v; - head[u] = cntg; + public static void radixSort() { + Arrays.fill(cntv, 0); + for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] & OFFSET]++; + for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; + for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] & OFFSET]--] = arrq[i]; + for (int i = 1; i <= siz; i++) arrq[i] = help[i]; + Arrays.fill(cntv, 0); + for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] >> POW2]++; + for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; + for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] >> POW2]--] = arrq[i]; + for (int i = 1; i <= siz; i++) arrq[i] = help[i]; } public static void calc(int l, int r) { - for (int md = 0; md < BLEN; ++md) { - for (int e = head1[md]; e != 0; e = nexte[e]) { - addEdge(head2, z[toq[e]] >> POWER, toq[e]); - } - head1[md] = 0; - } - for (int tm = n / BLEN; tm >= 0; --tm) { - for (int e = head2[tm]; e != 0; e = nexte[e]) { - sortq[++cntq] = toq[e]; - } - head2[tm] = 0; - } - for (int left = 1, right = cntq; left < right; ++left, --right) { - swap(sortq, left, right); - } - for (int i = l; i <= r; ++i) { + radixSort(); + for (int i = l; i <= r; i++) { lst[i] = i - 1; nxt[i] = i + 1; } @@ -120,10 +105,10 @@ public static void calc(int l, int r) { tmp.len = r - l + 1; tmp.res = 0; int k = 1; - for (int i = l; i <= r; ++i) { + for (int i = l; i <= r; i++) { int idx = sortv[i].i; - while (k <= cntq && z[sortq[k]] < arr[idx]) { - ans[sortq[k++]].merge(tmp); + for (; k <= siz && v[arrq[k]] < arr[idx]; k++) { + ans[arrq[k]].merge(tmp); } if (lst[idx] == l - 1) { tmp.pre += nxt[idx] - idx; @@ -135,10 +120,10 @@ public static void calc(int l, int r) { lst[nxt[idx]] = lst[idx]; nxt[lst[idx]] = nxt[idx]; } - while (k <= cntq) { - ans[sortq[k++]].merge(tmp); + for (; k <= siz; k++) { + ans[arrq[k]].merge(tmp); } - cntg = cntq = 0; + siz = 0; } public static void update(int qi, int l, int r) { @@ -147,28 +132,28 @@ public static void update(int qi, int l, int r) { calc(l, r); arr[jobi] = jobv; int pos = 0; - for (int i = l; i <= r; ++i) { + for (int i = l; i <= r; i++) { if (sortv[i].i == jobi) { sortv[i].v = jobv; pos = i; break; } } - for (int i = pos; i < r && sortv[i].v > sortv[i + 1].v; ++i) { + for (int i = pos; i < r && sortv[i].v > sortv[i + 1].v; i++) { swap(sortv, i, i + 1); } - for (int i = pos; i > l && sortv[i - 1].v > sortv[i].v; --i) { + for (int i = pos; i > l && sortv[i - 1].v > sortv[i].v; i--) { swap(sortv, i - 1, i); } } } public static void query(int qi, int l, int r) { - int jobl = x[qi], jobr = y[qi], jobv = z[qi]; + int jobl = x[qi], jobr = y[qi], jobv = v[qi]; if (jobl <= l && r <= jobr) { - addEdge(head1, jobv & OFFSET, qi); + arrq[++siz] = qi; } else { - for (int i = Math.max(jobl, l); i <= Math.min(jobr, r); ++i) { + for (int i = Math.max(jobl, l); i <= Math.min(jobr, r); i++) { if (arr[i] <= jobv) { tmp.pre = tmp.suf = tmp.len = 1; tmp.res = 1; @@ -183,11 +168,11 @@ public static void query(int qi, int l, int r) { } public static void compute(int l, int r) { - for (int i = l; i <= r; ++i) { + for (int i = l; i <= r; i++) { sortv[i] = new Node(arr[i], i); } Arrays.sort(sortv, l, r + 1, (a, b) -> a.v - b.v); - for (int qi = 1; qi <= m; ++qi) { + for (int qi = 1; qi <= m; qi++) { if (op[qi] == 1) { update(qi, l, r); } else { @@ -202,27 +187,27 @@ public static void main(String[] args) throws Exception { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); m = in.nextInt(); - for (int i = 1; i <= n; ++i) { + for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } - for (int i = 1; i <= m; ++i) { + for (int i = 1; i <= m; i++) { op[i] = in.nextInt(); x[i] = in.nextInt(); y[i] = in.nextInt(); if (op[i] == 2) { - z[i] = in.nextInt(); + v[i] = in.nextInt(); } } - for (int i = 1; i <= m; ++i) { + for (int i = 1; i <= m; i++) { ans[i] = new Answer(0, 0, 0, 0); } int BNUM = (n + BLEN - 1) / BLEN; - for (int b = 1, l, r; b <= BNUM; ++b) { - l = (b - 1) * BLEN + 1; - r = Math.min(b * BLEN, n); + for (int i = 1, l, r; i <= BNUM; i++) { + l = (i - 1) * BLEN + 1; + r = Math.min(i * BLEN, n); compute(l, r); } - for (int i = 1; i <= m; ++i) { + for (int i = 1; i <= m; i++) { if (op[i] == 2) { out.println(ans[i].res); } diff --git a/src/class174/Code03_MagicGirl2.java b/src/class174/Code03_MagicGirl2.java index 5ec71e7d3..f0e5338f4 100644 --- a/src/class174/Code03_MagicGirl2.java +++ b/src/class174/Code03_MagicGirl2.java @@ -62,9 +62,9 @@ // //const int MAXN = 300005; //const int MAXB = 601; -//const int BLEN = 512; -//const int OFFSET = 0x1ff; -//const int POWER = 9; +//const int POW2 = 9; +//const int BLEN = 1 << POW2; +//const int OFFSET = BLEN - 1; //int n, m; // //int arr[MAXN]; @@ -73,16 +73,12 @@ //int op[MAXN]; //int x[MAXN]; //int y[MAXN]; -//int z[MAXN]; +//int v[MAXN]; // -//int head1[MAXB]; -//int head2[MAXB]; -//int toq[MAXN << 1]; -//int nexte[MAXN << 1]; -//int cntg; -// -//int sortq[MAXN]; -//int cntq; +//int arrq[MAXN]; +//int cntv[MAXB]; +//int help[MAXN]; +//int siz; // //int lst[MAXN]; //int nxt[MAXN]; @@ -90,38 +86,31 @@ //Answer tmp; //Answer ans[MAXN]; // -//inline void addEdge(int *head, int u, int v) { -// nexte[++cntg] = head[u]; -// toq[cntg] = v; -// head[u] = cntg; +//inline void radixSort() { +// fill(cntv, cntv + MAXB, 0); +// for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] & OFFSET]++; +// for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; +// for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] & OFFSET]--] = arrq[i]; +// for (int i = 1; i <= siz; i++) arrq[i] = help[i]; +// fill(cntv, cntv + MAXB, 0); +// for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] >> POW2]++; +// for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; +// for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] >> POW2]--] = arrq[i]; +// for (int i = 1; i <= siz; i++) arrq[i] = help[i]; //} // //void calc(int l, int r) { -// for (int md = 0; md < BLEN; ++md) { -// for (int e = head1[md]; e; e = nexte[e]) { -// addEdge(head2, z[toq[e]] >> POWER, toq[e]); -// } -// head1[md] = 0; -// } -// for (int tm = n / BLEN; tm >= 0; --tm) { -// for (int e = head2[tm]; e; e = nexte[e]) { -// sortq[++cntq] = toq[e]; -// } -// head2[tm] = 0; -// } -// for (int left = 1, right = cntq; left < right; ++left, --right) { -// swap(sortq[left], sortq[right]); -// } -// for (int i = l; i <= r; ++i) { +// radixSort(); +// for (int i = l; i <= r; i++) { // lst[i] = i - 1; // nxt[i] = i + 1; // } // tmp = { 0, 0, r - l + 1, 0 }; // int k = 1; -// for (int i = l, idx; i <= r; ++i) { +// for (int i = l, idx; i <= r; i++) { // idx = sortv[i].i; -// for(; k <= cntq && z[sortq[k]] < arr[idx]; ++k) { -// ans[sortq[k]].merge(tmp); +// for(; k <= siz && v[arrq[k]] < arr[idx]; k++) { +// ans[arrq[k]].merge(tmp); // } // if (lst[idx] == l - 1) { // tmp.pre += nxt[idx] - idx; @@ -133,10 +122,10 @@ // lst[nxt[idx]] = lst[idx]; // nxt[lst[idx]] = nxt[idx]; // } -// for(; k <= cntq; ++k) { -// ans[sortq[k]].merge(tmp); +// for(; k <= siz; k++) { +// ans[arrq[k]].merge(tmp); // } -// cntg = cntq = 0; +// siz = 0; //} // //inline void update(int qi, int l, int r) { @@ -145,28 +134,28 @@ // calc(l, r); // arr[jobi] = jobv; // int pos = 0; -// for (int i = l; i <= r; ++i) { +// for (int i = l; i <= r; i++) { // if (sortv[i].i == jobi) { // sortv[i].v = jobv; // pos = i; // break; // } // } -// for (int i = pos; i < r && sortv[i].v > sortv[i + 1].v; ++i) { +// for (int i = pos; i < r && sortv[i].v > sortv[i + 1].v; i++) { // swap(sortv[i], sortv[i + 1]); // } -// for (int i = pos; i > l && sortv[i - 1].v > sortv[i].v; --i) { +// for (int i = pos; i > l && sortv[i - 1].v > sortv[i].v; i--) { // swap(sortv[i - 1], sortv[i]); // } // } //} // //inline void query(int qi, int l, int r) { -// int jobl = x[qi], jobr = y[qi], jobv = z[qi]; +// int jobl = x[qi], jobr = y[qi], jobv = v[qi]; // if (jobl <= l && r <= jobr) { -// addEdge(head1, jobv & OFFSET, qi); +// arrq[++siz] = qi; // } else { -// for (int i = max(jobl, l); i <= min(jobr, r); ++i) { +// for (int i = max(jobl, l); i <= min(jobr, r); i++) { // if (arr[i] <= jobv) { // tmp = { 1, 1, 1, 1 }; // }else { @@ -178,11 +167,11 @@ //} // //void compute(int l, int r) { -// for (int i = l; i <= r; ++i) { +// for (int i = l; i <= r; i++) { // sortv[i] = { arr[i], i }; // } // sort(sortv + l, sortv + r + 1, nodeCmp); -// for (int qi = 1; qi <= m; ++qi) { +// for (int qi = 1; qi <= m; qi++) { // if (op[qi] == 1) { // update(qi, l, r); // } else { @@ -195,24 +184,24 @@ //int main() { // n = read(); // m = read(); -// for (int i = 1; i <= n; ++i) { +// for (int i = 1; i <= n; i++) { // arr[i] = read(); // } -// for (int i = 1; i <= m; ++i) { +// for (int i = 1; i <= m; i++) { // op[i] = read(); // x[i] = read(); // y[i] = read(); // if (op[i] == 2) { -// z[i] = read(); +// v[i] = read(); // } // } // int BNUM = (n + BLEN - 1) / BLEN; -// for (int i = 1, l, r; i <= BNUM; ++i) { +// for (int i = 1, l, r; i <= BNUM; i++) { // l = (i - 1) * BLEN + 1; // r = min(i * BLEN, n); // compute(l, r); // } -// for (int i = 1; i <= m; ++i) { +// for (int i = 1; i <= m; i++) { // if (op[i] == 2) { // printf("%lld\n", ans[i].res); // } From 54a81f3712209744578658030a448c260b5d9a71 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 8 Jul 2025 22:41:09 +0800 Subject: [PATCH 0405/1170] modify code --- src/class174/Code03_MagicGirl2.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class174/Code03_MagicGirl2.java b/src/class174/Code03_MagicGirl2.java index f0e5338f4..53465aee5 100644 --- a/src/class174/Code03_MagicGirl2.java +++ b/src/class174/Code03_MagicGirl2.java @@ -100,7 +100,7 @@ //} // //void calc(int l, int r) { -// radixSort(); +// radixSort(); // for (int i = l; i <= r; i++) { // lst[i] = i - 1; // nxt[i] = i + 1; @@ -155,13 +155,13 @@ // if (jobl <= l && r <= jobr) { // arrq[++siz] = qi; // } else { -// for (int i = max(jobl, l); i <= min(jobr, r); i++) { +// for (int i = max(jobl, l); i <= min(jobr, r); i++) { // if (arr[i] <= jobv) { // tmp = { 1, 1, 1, 1 }; -// }else { -// tmp = { 0, 0, 1, 0 }; +// } else { +// tmp = { 0, 0, 1, 0 }; // } -// ans[qi].merge(tmp); +// ans[qi].merge(tmp); // } // } //} @@ -192,7 +192,7 @@ // x[i] = read(); // y[i] = read(); // if (op[i] == 2) { -// v[i] = read(); +// v[i] = read(); // } // } // int BNUM = (n + BLEN - 1) / BLEN; From be75e0126af0393dd6488a1aabba2283bb0cd68e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 8 Jul 2025 22:57:18 +0800 Subject: [PATCH 0406/1170] modify code --- src/class174/Code03_MagicGirl1.java | 21 ++++---------- src/class174/Code03_MagicGirl2.java | 44 ++++++----------------------- 2 files changed, 14 insertions(+), 51 deletions(-) diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code03_MagicGirl1.java index cfaa85e18..d021863e9 100644 --- a/src/class174/Code03_MagicGirl1.java +++ b/src/class174/Code03_MagicGirl1.java @@ -70,18 +70,6 @@ void merge(Answer right) { public static Answer tmp = new Answer(0, 0, 0, 0); public static Answer[] ans = new Answer[MAXN]; - public static void swap(Node[] a, int i, int j) { - Node t = a[i]; - a[i] = a[j]; - a[j] = t; - } - - public static void swap(int[] a, int i, int j) { - int t = a[i]; - a[i] = a[j]; - a[j] = t; - } - public static void radixSort() { Arrays.fill(cntv, 0); for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] & OFFSET]++; @@ -139,11 +127,12 @@ public static void update(int qi, int l, int r) { break; } } + Node tmp; for (int i = pos; i < r && sortv[i].v > sortv[i + 1].v; i++) { - swap(sortv, i, i + 1); + tmp = sortv[i]; sortv[i] = sortv[i + 1]; sortv[i + 1] = tmp; } for (int i = pos; i > l && sortv[i - 1].v > sortv[i].v; i--) { - swap(sortv, i - 1, i); + tmp = sortv[i - 1]; sortv[i - 1] = sortv[i]; sortv[i] = tmp; } } } @@ -201,8 +190,8 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= m; i++) { ans[i] = new Answer(0, 0, 0, 0); } - int BNUM = (n + BLEN - 1) / BLEN; - for (int i = 1, l, r; i <= BNUM; i++) { + int bnum = (n + BLEN - 1) / BLEN; + for (int i = 1, l, r; i <= bnum; i++) { l = (i - 1) * BLEN + 1; r = Math.min(i * BLEN, n); compute(l, r); diff --git a/src/class174/Code03_MagicGirl2.java b/src/class174/Code03_MagicGirl2.java index 53465aee5..66fad9987 100644 --- a/src/class174/Code03_MagicGirl2.java +++ b/src/class174/Code03_MagicGirl2.java @@ -9,31 +9,6 @@ // //using namespace std; // -//char buf[1000000], *p1 = buf, *p2 = buf; -// -//inline char gc() { -// if (p1 == p2) { -// p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin); -// if (p1 == p2) { -// return EOF; -// } -// } -// return *p1++; -//} -// -//inline int read() { -// int x = 0; -// char c = gc(); -// while (!isdigit(c)) { -// c = gc(); -// } -// while (isdigit(c)) { -// x = x * 10 + c - '0'; -// c = gc(); -// } -// return x; -//} -// //struct Node { // int v; // int i; @@ -182,28 +157,27 @@ //} // //int main() { -// n = read(); -// m = read(); +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; // for (int i = 1; i <= n; i++) { -// arr[i] = read(); +// cin >> arr[i]; // } // for (int i = 1; i <= m; i++) { -// op[i] = read(); -// x[i] = read(); -// y[i] = read(); +// cin >> op[i] >> x[i] >> y[i]; // if (op[i] == 2) { -// v[i] = read(); +// cin >> v[i]; // } // } -// int BNUM = (n + BLEN - 1) / BLEN; -// for (int i = 1, l, r; i <= BNUM; i++) { +// int bnum = (n + BLEN - 1) / BLEN; +// for (int i = 1, l, r; i <= bnum; i++) { // l = (i - 1) * BLEN + 1; // r = min(i * BLEN, n); // compute(l, r); // } // for (int i = 1; i <= m; i++) { // if (op[i] == 2) { -// printf("%lld\n", ans[i].res); +// cout << ans[i].res << '\n'; // } // } // return 0; From f4947f06e226d7a883446b85a49d5f727461becf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 8 Jul 2025 23:45:27 +0800 Subject: [PATCH 0407/1170] modify code --- src/class174/Code03_MagicGirl1.java | 35 +++++++++++----------------- src/class174/Code03_MagicGirl2.java | 36 +++++++++++------------------ 2 files changed, 26 insertions(+), 45 deletions(-) diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code03_MagicGirl1.java index d021863e9..d4fc8fa72 100644 --- a/src/class174/Code03_MagicGirl1.java +++ b/src/class174/Code03_MagicGirl1.java @@ -14,14 +14,6 @@ public class Code03_MagicGirl1 { - static class Node { - int v, i; - Node(int v_, int i_) { - v = v_; - i = i_; - } - } - static class Answer { int pre, suf, len; long res; @@ -52,7 +44,7 @@ void merge(Answer right) { public static int n, m; public static int[] arr = new int[MAXN]; - public static Node[] sortv = new Node[MAXN]; + public static Integer[] pos = new Integer[MAXN]; public static int[] op = new int[MAXN]; public static int[] x = new int[MAXN]; @@ -93,8 +85,8 @@ public static void calc(int l, int r) { tmp.len = r - l + 1; tmp.res = 0; int k = 1; - for (int i = l; i <= r; i++) { - int idx = sortv[i].i; + for (int i = l, idx; i <= r; i++) { + idx = pos[i]; for (; k <= siz && v[arrq[k]] < arr[idx]; k++) { ans[arrq[k]].merge(tmp); } @@ -119,20 +111,19 @@ public static void update(int qi, int l, int r) { if (l <= jobi && jobi <= r) { calc(l, r); arr[jobi] = jobv; - int pos = 0; + int find = 0; for (int i = l; i <= r; i++) { - if (sortv[i].i == jobi) { - sortv[i].v = jobv; - pos = i; + if (pos[i] == jobi) { + find = i; break; } } - Node tmp; - for (int i = pos; i < r && sortv[i].v > sortv[i + 1].v; i++) { - tmp = sortv[i]; sortv[i] = sortv[i + 1]; sortv[i + 1] = tmp; + int tmp; + for (int i = find; i < r && arr[pos[i]] > arr[pos[i + 1]]; i++) { + tmp = pos[i]; pos[i] = pos[i + 1]; pos[i + 1] = tmp; } - for (int i = pos; i > l && sortv[i - 1].v > sortv[i].v; i--) { - tmp = sortv[i - 1]; sortv[i - 1] = sortv[i]; sortv[i] = tmp; + for (int i = find; i > l && arr[pos[i - 1]] > arr[pos[i]]; i--) { + tmp = pos[i - 1]; pos[i - 1] = pos[i]; pos[i] = tmp; } } } @@ -158,9 +149,9 @@ public static void query(int qi, int l, int r) { public static void compute(int l, int r) { for (int i = l; i <= r; i++) { - sortv[i] = new Node(arr[i], i); + pos[i] = i; } - Arrays.sort(sortv, l, r + 1, (a, b) -> a.v - b.v); + Arrays.sort(pos, l, r + 1, (a, b) -> arr[a] - arr[b]); for (int qi = 1; qi <= m; qi++) { if (op[qi] == 1) { update(qi, l, r); diff --git a/src/class174/Code03_MagicGirl2.java b/src/class174/Code03_MagicGirl2.java index 66fad9987..a762654df 100644 --- a/src/class174/Code03_MagicGirl2.java +++ b/src/class174/Code03_MagicGirl2.java @@ -9,15 +9,6 @@ // //using namespace std; // -//struct Node { -// int v; -// int i; -//}; -// -//inline bool nodeCmp(const Node &a, const Node &b) { -// return a.v < b.v; -//} -// //struct Answer { // int pre, suf, len; // long long res; @@ -43,7 +34,7 @@ //int n, m; // //int arr[MAXN]; -//Node sortv[MAXN]; +//int pos[MAXN]; // //int op[MAXN]; //int x[MAXN]; @@ -83,9 +74,9 @@ // tmp = { 0, 0, r - l + 1, 0 }; // int k = 1; // for (int i = l, idx; i <= r; i++) { -// idx = sortv[i].i; +// idx = pos[i]; // for(; k <= siz && v[arrq[k]] < arr[idx]; k++) { -// ans[arrq[k]].merge(tmp); +// ans[arrq[k]].merge(tmp); // } // if (lst[idx] == l - 1) { // tmp.pre += nxt[idx] - idx; @@ -98,7 +89,7 @@ // nxt[lst[idx]] = nxt[idx]; // } // for(; k <= siz; k++) { -// ans[arrq[k]].merge(tmp); +// ans[arrq[k]].merge(tmp); // } // siz = 0; //} @@ -108,19 +99,18 @@ // if (l <= jobi && jobi <= r) { // calc(l, r); // arr[jobi] = jobv; -// int pos = 0; +// int find = 0; // for (int i = l; i <= r; i++) { -// if (sortv[i].i == jobi) { -// sortv[i].v = jobv; -// pos = i; +// if (pos[i] == jobi) { +// find = i; // break; // } // } -// for (int i = pos; i < r && sortv[i].v > sortv[i + 1].v; i++) { -// swap(sortv[i], sortv[i + 1]); +// for (int i = find; i < r && arr[pos[i]] > arr[pos[i + 1]]; i++) { +// swap(pos[i], pos[i + 1]); // } -// for (int i = pos; i > l && sortv[i - 1].v > sortv[i].v; i--) { -// swap(sortv[i - 1], sortv[i]); +// for (int i = find; i > l && arr[pos[i - 1]] > arr[pos[i]]; i--) { +// swap(pos[i - 1], pos[i]); // } // } //} @@ -143,9 +133,9 @@ // //void compute(int l, int r) { // for (int i = l; i <= r; i++) { -// sortv[i] = { arr[i], i }; +// pos[i] = i; // } -// sort(sortv + l, sortv + r + 1, nodeCmp); +// sort(pos + l, pos + r + 1, [&](int a, int b) {return arr[a] < arr[b];}); // for (int qi = 1; qi <= m; qi++) { // if (op[qi] == 1) { // update(qi, l, r); From fd50bbfa272e216d8e955080eefb63e3c86180de Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 9 Jul 2025 13:57:02 +0800 Subject: [PATCH 0408/1170] modify code --- src/class173/Code03_Magnet1.java | 36 ++++++++--------------------- src/class174/Code03_MagicGirl1.java | 25 ++++++++++++++++++-- src/class174/Code03_MagicGirl2.java | 1 + 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/class173/Code03_Magnet1.java b/src/class173/Code03_Magnet1.java index a371117e4..ebb4c8d33 100644 --- a/src/class173/Code03_Magnet1.java +++ b/src/class173/Code03_Magnet1.java @@ -54,21 +54,13 @@ public static void swap(int i, int j) { // 所有磁块根据m值排序,手写双指针快排 public static void sortByM(int l, int r) { - if (l >= r) { - return; - } + if (l >= r) return; int i = l, j = r; - int pivot = m[(l + r) >>> 1]; + int pivot = m[(l + r) >> 1]; while (i <= j) { - while (m[i] < pivot) { - i++; - } - while (m[j] > pivot) { - j--; - } - if (i <= j) { - swap(i++, j--); - } + while (m[i] < pivot) i++; + while (m[j] > pivot) j--; + if (i <= j) swap(i++, j--); } sortByM(l, j); sortByM(i, r); @@ -76,21 +68,13 @@ public static void sortByM(int l, int r) { // 所有磁块根据dist值排序,手写双指针快排 public static void sortByDist(int l, int r) { - if (l >= r) { - return; - } + if (l >= r) return; int i = l, j = r; - long pivot = dist[(l + r) >>> 1]; + long pivot = dist[(l + r) >> 1]; while (i <= j) { - while (dist[i] < pivot) { - i++; - } - while (dist[j] > pivot) { - j--; - } - if (i <= j) { - swap(i++, j--); - } + while (dist[i] < pivot) i++; + while (dist[j] > pivot) j--; + if (i <= j) swap(i++, j--); } sortByDist(l, j); sortByDist(i, r); diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code03_MagicGirl1.java index d4fc8fa72..29b597cb5 100644 --- a/src/class174/Code03_MagicGirl1.java +++ b/src/class174/Code03_MagicGirl1.java @@ -17,12 +17,14 @@ public class Code03_MagicGirl1 { static class Answer { int pre, suf, len; long res; + Answer(int p, int s, int l, long r) { pre = p; suf = s; len = l; res = r; } + void merge(Answer right) { res += right.res + 1L * suf * right.pre; if (pre == len) @@ -44,7 +46,7 @@ void merge(Answer right) { public static int n, m; public static int[] arr = new int[MAXN]; - public static Integer[] pos = new Integer[MAXN]; + public static int[] pos = new int[MAXN]; public static int[] op = new int[MAXN]; public static int[] x = new int[MAXN]; @@ -61,7 +63,26 @@ void merge(Answer right) { public static Answer tmp = new Answer(0, 0, 0, 0); public static Answer[] ans = new Answer[MAXN]; + + // 根据arr[pos[i]]的值,对pos[l..r]进行双指针快排 + public static void quickSort(int l, int r) { + if (l >= r) { + return; + } + int i = l, j = r, pivot = arr[pos[(l + r) >> 1]], tmp; + while (i <= j) { + while (arr[pos[i]] < pivot) i++; + while (arr[pos[j]] > pivot) j--; + if (i <= j) { + tmp = pos[i]; pos[i] = pos[j]; pos[j] = tmp; + i++; j--; + } + } + quickSort(l, j); + quickSort(i, r); + } + // 根据查询任务的jobv,对查询任务的编号进行基数排序 public static void radixSort() { Arrays.fill(cntv, 0); for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] & OFFSET]++; @@ -151,7 +172,7 @@ public static void compute(int l, int r) { for (int i = l; i <= r; i++) { pos[i] = i; } - Arrays.sort(pos, l, r + 1, (a, b) -> arr[a] - arr[b]); + quickSort(l, r); for (int qi = 1; qi <= m; qi++) { if (op[qi] == 1) { update(qi, l, r); diff --git a/src/class174/Code03_MagicGirl2.java b/src/class174/Code03_MagicGirl2.java index a762654df..274888b7f 100644 --- a/src/class174/Code03_MagicGirl2.java +++ b/src/class174/Code03_MagicGirl2.java @@ -12,6 +12,7 @@ //struct Answer { // int pre, suf, len; // long long res; +// // inline void merge(const Answer &right) { // res += right.res + 1LL * suf * right.pre; // if (pre == len) { From c55f7cc0f52bdb34dc1b084f0995aee7344bd047 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 9 Jul 2025 14:13:46 +0800 Subject: [PATCH 0409/1170] modify code --- src/class174/Code01_FutureDiary1.java | 3 ++- src/class174/Code02_ColorfulWorld1.java | 3 ++- src/class174/Code03_MagicGirl1.java | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 01d957b1b..875d50289 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -2,7 +2,8 @@ // 未来日记,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4119 -// 提交以下的code,提交时请把类名改成"Main",本题卡常,java实现无法通过 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 // 想通过用C++实现,本节课Code01_FutureDiary2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 diff --git a/src/class174/Code02_ColorfulWorld1.java b/src/class174/Code02_ColorfulWorld1.java index 3b87236ec..171b8d5d6 100644 --- a/src/class174/Code02_ColorfulWorld1.java +++ b/src/class174/Code02_ColorfulWorld1.java @@ -2,7 +2,8 @@ // 五彩斑斓的世界,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4117 -// 提交以下的code,提交时请把类名改成"Main",本题卡常,java实现无法通过 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 // 想通过用C++实现,本节课Code02_ColorfulWorld2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code03_MagicGirl1.java index 29b597cb5..48970bca5 100644 --- a/src/class174/Code03_MagicGirl1.java +++ b/src/class174/Code03_MagicGirl1.java @@ -2,7 +2,8 @@ // 魔法少女网站,java版 // 测试链接 : https://www.luogu.com.cn/problem/P6578 -// 提交以下的code,提交时请把类名改成"Main",本题卡常,java实现无法通过 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 // 想通过用C++实现,本节课Code03_MagicGirl2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 From c423adb76169ca84bb149836e0f01f9723689370 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 9 Jul 2025 14:17:55 +0800 Subject: [PATCH 0410/1170] modify code --- src/class174/Code03_MagicGirl1.java | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code03_MagicGirl1.java index 48970bca5..bfffef54e 100644 --- a/src/class174/Code03_MagicGirl1.java +++ b/src/class174/Code03_MagicGirl1.java @@ -59,8 +59,8 @@ void merge(Answer right) { public static int[] help = new int[MAXN]; public static int siz; - public static int[] lst = new int[MAXN]; - public static int[] nxt = new int[MAXN]; + public static int[] last = new int[MAXN]; + public static int[] next = new int[MAXN]; public static Answer tmp = new Answer(0, 0, 0, 0); public static Answer[] ans = new Answer[MAXN]; @@ -83,7 +83,7 @@ public static void quickSort(int l, int r) { quickSort(i, r); } - // 根据查询任务的jobv,对查询任务的编号进行基数排序 + // 根据查询任务的v值,对查询任务的编号进行基数排序 public static void radixSort() { Arrays.fill(cntv, 0); for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] & OFFSET]++; @@ -100,8 +100,8 @@ public static void radixSort() { public static void calc(int l, int r) { radixSort(); for (int i = l; i <= r; i++) { - lst[i] = i - 1; - nxt[i] = i + 1; + last[i] = i - 1; + next[i] = i + 1; } tmp.pre = tmp.suf = 0; tmp.len = r - l + 1; @@ -112,15 +112,15 @@ public static void calc(int l, int r) { for (; k <= siz && v[arrq[k]] < arr[idx]; k++) { ans[arrq[k]].merge(tmp); } - if (lst[idx] == l - 1) { - tmp.pre += nxt[idx] - idx; + if (last[idx] == l - 1) { + tmp.pre += next[idx] - idx; } - if (nxt[idx] == r + 1) { - tmp.suf += idx - lst[idx]; + if (next[idx] == r + 1) { + tmp.suf += idx - last[idx]; } - tmp.res += 1L * (idx - lst[idx]) * (nxt[idx] - idx); - lst[nxt[idx]] = lst[idx]; - nxt[lst[idx]] = nxt[idx]; + tmp.res += 1L * (idx - last[idx]) * (next[idx] - idx); + last[next[idx]] = last[idx]; + next[last[idx]] = next[idx]; } for (; k <= siz; k++) { ans[arrq[k]].merge(tmp); From 7bf83b8e895447329a10868dd601f47d75dc957e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 9 Jul 2025 14:23:49 +0800 Subject: [PATCH 0411/1170] modify code --- src/class174/Code03_MagicGirl1.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code03_MagicGirl1.java index bfffef54e..cf9a17549 100644 --- a/src/class174/Code03_MagicGirl1.java +++ b/src/class174/Code03_MagicGirl1.java @@ -103,9 +103,7 @@ public static void calc(int l, int r) { last[i] = i - 1; next[i] = i + 1; } - tmp.pre = tmp.suf = 0; - tmp.len = r - l + 1; - tmp.res = 0; + tmp.pre = 0; tmp.suf = 0; tmp.len = r - l + 1; tmp.res = 0; int k = 1; for (int i = l, idx; i <= r; i++) { idx = pos[i]; @@ -157,12 +155,9 @@ public static void query(int qi, int l, int r) { } else { for (int i = Math.max(jobl, l); i <= Math.min(jobr, r); i++) { if (arr[i] <= jobv) { - tmp.pre = tmp.suf = tmp.len = 1; - tmp.res = 1; + tmp.pre = 1; tmp.suf = 1; tmp.len = 1; tmp.res = 1; } else { - tmp.pre = tmp.suf = 0; - tmp.len = 1; - tmp.res = 0; + tmp.pre = 0; tmp.suf = 0; tmp.len = 1; tmp.res = 0; } ans[qi].merge(tmp); } From 1c339fdcc5efda45a00728860e763a748111687e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 9 Jul 2025 18:08:51 +0800 Subject: [PATCH 0412/1170] modify code --- src/class174/Code04_Lcm1.java | 239 ++++++++++++++++++++++++++++++++++ src/class174/Code04_Lcm2.java | 150 +++++++++++++++++++++ 2 files changed, 389 insertions(+) create mode 100644 src/class174/Code04_Lcm1.java create mode 100644 src/class174/Code04_Lcm2.java diff --git a/src/class174/Code04_Lcm1.java b/src/class174/Code04_Lcm1.java new file mode 100644 index 000000000..237836674 --- /dev/null +++ b/src/class174/Code04_Lcm1.java @@ -0,0 +1,239 @@ +package class174; + +// 最小公倍数,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3247 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code04_Lcm1 { + + static class Param { + int u, v, a, b, qid; + + public Param(int u_, int v_, int a_, int b_) { + u = u_; + v = v_; + a = a_; + b = b_; + } + } + + static class CmpA implements Comparator { + @Override + public int compare(Param o1, Param o2) { + return o1.a - o2.a; + } + } + + static class CmpB implements Comparator { + @Override + public int compare(Param o1, Param o2) { + return o1.b - o2.b; + } + } + + public static CmpA cmpa = new CmpA(); + public static CmpB cmpb = new CmpB(); + + public static int MAXN = 50001; + public static int MAXM = 100001; + public static int MAXQ = 50001; + public static int n, m, q; + public static int blen, bnum; + + public static Param[] edge = new Param[MAXM]; + public static Param[] ques = new Param[MAXQ]; + + public static int[] arr = new int[MAXQ]; + public static int cntq = 0; + + public static int[] fa = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] maxa = new int[MAXN]; + public static int[] maxb = new int[MAXN]; + public static int[][] rollback = new int[MAXN][5]; + public static int opsize = 0; + + public static boolean[] ans = new boolean[MAXQ]; + + public static void build() { + for (int i = 1; i <= n; i++) { + fa[i] = i; + siz[i] = 1; + maxa[i] = -1; + maxb[i] = -1; + } + } + + public static int find(int x) { + while (x != fa[x]) { + x = fa[x]; + } + return x; + } + + public static void union(int x, int y, int a, int b) { + int fx = find(x); + int fy = find(y); + if (siz[fx] < siz[fy]) { + int tmp = fx; + fx = fy; + fy = tmp; + } + rollback[++opsize][0] = fx; + rollback[opsize][1] = fy; + rollback[opsize][2] = siz[fx]; + rollback[opsize][3] = maxa[fx]; + rollback[opsize][4] = maxb[fx]; + if (fx != fy) { + fa[fy] = fx; + siz[fx] += siz[fy]; + } + maxa[fx] = Math.max(Math.max(maxa[fx], maxa[fy]), a); + maxb[fx] = Math.max(Math.max(maxb[fx], maxb[fy]), b); + } + + public static void undo() { + for (int fx, fy; opsize > 0; opsize--) { + fx = rollback[opsize][0]; + fy = rollback[opsize][1]; + fa[fy] = fy; + siz[fx] = rollback[opsize][2]; + maxa[fx] = rollback[opsize][3]; + maxb[fx] = rollback[opsize][4]; + } + } + + public static boolean query(int x, int y, int a, int b) { + int fx = find(x); + int fy = find(y); + return fx == fy && maxa[fx] == a && maxb[fx] == b; + } + + public static void compute(int l, int r) { + build(); + cntq = 0; + for (int i = 1; i <= q; i++) { + // 保证每条询问只落入其中的一块 + if (edge[l].a <= ques[i].a && (r + 1 > m || ques[i].a < edge[r + 1].a)) { + arr[++cntq] = i; + } + } + if (cntq > 0) { + Arrays.sort(edge, 1, l, cmpb); + int pos = 1; + for (int i = 1; i <= cntq; i++) { + for (; pos < l && edge[pos].b <= ques[arr[i]].b; pos++) { + union(edge[pos].u, edge[pos].v, edge[pos].a, edge[pos].b); + } + opsize = 0; + for (int j = l; j <= r; j++) { + if (edge[j].a <= ques[arr[i]].a && edge[j].b <= ques[arr[i]].b) { + union(edge[j].u, edge[j].v, edge[j].a, edge[j].b); + } + } + ans[ques[arr[i]].qid] = query(ques[arr[i]].u, ques[arr[i]].v, ques[arr[i]].a, ques[arr[i]].b); + undo(); + } + } + } + + public static int log2(int n) { + int ans = 0; + while ((1 << ans) <= (n >> 1)) { + ans++; + } + return ans; + } + + public static void prepare() { + blen = Math.max(1, (int) Math.sqrt(m * log2(n))); + bnum = (m + blen - 1) / blen; + Arrays.sort(edge, 1, m + 1, cmpa); + Arrays.sort(ques, 1, q + 1, cmpb); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, u, v, a, b; i <= m; i++) { + u = in.nextInt(); + v = in.nextInt(); + a = in.nextInt(); + b = in.nextInt(); + edge[i] = new Param(u, v, a, b); + } + q = in.nextInt(); + for (int i = 1, u, v, a, b; i <= q; i++) { + u = in.nextInt(); + v = in.nextInt(); + a = in.nextInt(); + b = in.nextInt(); + ques[i] = new Param(u, v, a, b); + ques[i].qid = i; + } + prepare(); + for (int i = 1, l, r; i <= bnum; i++) { + l = (i - 1) * blen + 1; + r = Math.min(i * blen, m); + compute(l, r); + } + for (int i = 1; i <= q; i++) { + if (ans[i]) { + out.println("Yes"); + } else { + out.println("No"); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class174/Code04_Lcm2.java b/src/class174/Code04_Lcm2.java new file mode 100644 index 000000000..369954352 --- /dev/null +++ b/src/class174/Code04_Lcm2.java @@ -0,0 +1,150 @@ +package class174; + +// 最小公倍数,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3247 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Param { +// int u, v, a, b, qid; +//}; +// +//bool cmpa(Param &x, Param &y) { +// return x.a < y.a; +//} +// +//bool cmpb(Param &x, Param &y) { +// return x.b < y.b; +//} +// +//const int MAXN = 50001; +//const int MAXM = 100001; +//const int MAXQ = 50001; +//int n, m, q; +//int blen, bnum; +// +//Param edge[MAXM]; +//Param ques[MAXQ]; +// +//int arr[MAXQ]; +//int cntq; +// +//int fa[MAXN]; +//int siz[MAXN]; +//int maxa[MAXN]; +//int maxb[MAXN]; +// +//int rollback[MAXN][5]; +//int opsize; +//bool ans[MAXQ]; +// +//void build() { +// for (int i = 1; i <= n; i++) { +// fa[i] = i; +// siz[i] = 1; +// maxa[i] = -1; +// maxb[i] = -1; +// } +//} +// +//int find(int x) { +// while (x != fa[x]) { +// x = fa[x]; +// } +// return x; +//} +// +//void Union(int x, int y, int a, int b) { +// int fx = find(x), fy = find(y); +// if (siz[fx] < siz[fy]) swap(fx, fy); +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; +// rollback[opsize][2] = siz[fx]; +// rollback[opsize][3] = maxa[fx]; +// rollback[opsize][4] = maxb[fx]; +// if (fx != fy) { +// fa[fy] = fx; +// siz[fx] += siz[fy]; +// } +// maxa[fx] = max({maxa[fx], maxa[fy], a}); +// maxb[fx] = max({maxb[fx], maxb[fy], b}); +//} +// +//void undo() { +// for (int fx, fy; opsize > 0; opsize--) { +// fx = rollback[opsize][0]; +// fy = rollback[opsize][1]; +// fa[fy] = fy; +// siz[fx] = rollback[opsize][2]; +// maxa[fx] = rollback[opsize][3]; +// maxb[fx] = rollback[opsize][4]; +// } +//} +// +//bool query(int x, int y, int a, int b) { +// int fx = find(x), fy = find(y); +// return fx == fy && maxa[fx] == a && maxb[fx] == b; +//} +// +//void compute(int l, int r) { +// build(); +// cntq = 0; +// for (int i = 1; i <= q; i++) { +// if (edge[l].a <= ques[i].a && (r + 1 > m || ques[i].a < edge[r + 1].a)) { +// arr[++cntq] = i; +// } +// } +// if (cntq > 0) { +// sort(edge + 1, edge + l, cmpb); +// int pos = 1; +// for (int i = 1; i <= cntq; i++) { +// while (pos < l && edge[pos].b <= ques[arr[i]].b) { +// Union(edge[pos].u, edge[pos].v, edge[pos].a, edge[pos].b); +// pos++; +// } +// opsize = 0; +// for (int j = l; j <= r; j++) { +// if (edge[j].a <= ques[arr[i]].a && edge[j].b <= ques[arr[i]].b) { +// Union(edge[j].u, edge[j].v, edge[j].a, edge[j].b); +// } +// } +// ans[ques[arr[i]].qid] = query(ques[arr[i]].u, ques[arr[i]].v, ques[arr[i]].a, ques[arr[i]].b); +// undo(); +// } +// } +//} +// +//void prepare() { +// blen = max(1, (int)sqrt(m * log2(n))); +// bnum = (m + blen - 1) / blen; +// sort(edge + 1, edge + m + 1, cmpa); +// sort(ques + 1, ques + q + 1, cmpb); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v, a, b; i <= m; i++) { +// cin >> edge[i].u >> edge[i].v >> edge[i].a >> edge[i].b; +// } +// cin >> q; +// for (int i = 1; i <= q; i++) { +// cin >> ques[i].u >> ques[i].v >> ques[i].a >> ques[i].b; +// ques[i].qid = i; +// } +// prepare(); +// for (int i = 1, l, r; i <= bnum; i++) { +// l = (i - 1) * blen + 1; +// r = min(i * blen, m); +// compute(l, r); +// } +// for (int i = 1; i <= q; i++) { +// cout << (ans[i] ? "Yes" : "No") << '\n'; +// } +// return 0; +//} \ No newline at end of file From bd05e9aeff818a9f3f816e461fb3b1fe87ef5b13 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 9 Jul 2025 18:14:54 +0800 Subject: [PATCH 0413/1170] modify code --- src/class174/Code04_Lcm2.java | 13 ++++++++----- src/class174/Code05_Bridge1.java | 8 ++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 src/class174/Code05_Bridge1.java diff --git a/src/class174/Code04_Lcm2.java b/src/class174/Code04_Lcm2.java index 369954352..b03c20be0 100644 --- a/src/class174/Code04_Lcm2.java +++ b/src/class174/Code04_Lcm2.java @@ -59,8 +59,11 @@ //} // //void Union(int x, int y, int a, int b) { -// int fx = find(x), fy = find(y); -// if (siz[fx] < siz[fy]) swap(fx, fy); +// int fx = find(x); +// int fy = find(y); +// if (siz[fx] < siz[fy]) { +// swap(fx, fy); +// } // rollback[++opsize][0] = fx; // rollback[opsize][1] = fy; // rollback[opsize][2] = siz[fx]; @@ -86,7 +89,8 @@ //} // //bool query(int x, int y, int a, int b) { -// int fx = find(x), fy = find(y); +// int fx = find(x); +// int fy = find(y); // return fx == fy && maxa[fx] == a && maxb[fx] == b; //} // @@ -102,9 +106,8 @@ // sort(edge + 1, edge + l, cmpb); // int pos = 1; // for (int i = 1; i <= cntq; i++) { -// while (pos < l && edge[pos].b <= ques[arr[i]].b) { +// for (; pos < l && edge[pos].b <= ques[arr[i]].b; pos++) { // Union(edge[pos].u, edge[pos].v, edge[pos].a, edge[pos].b); -// pos++; // } // opsize = 0; // for (int j = l; j <= r; j++) { diff --git a/src/class174/Code05_Bridge1.java b/src/class174/Code05_Bridge1.java new file mode 100644 index 000000000..1e3f212a9 --- /dev/null +++ b/src/class174/Code05_Bridge1.java @@ -0,0 +1,8 @@ +package class174; + +// 桥梁,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5443 + +public class Code05_Bridge1 { + +} From b79b2df4c81c64361ba4748f34fde8be184bd0d7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 9 Jul 2025 21:21:06 +0800 Subject: [PATCH 0414/1170] modify code --- src/class174/Code04_Lcm1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class174/Code04_Lcm1.java b/src/class174/Code04_Lcm1.java index 237836674..5b5bdfece 100644 --- a/src/class174/Code04_Lcm1.java +++ b/src/class174/Code04_Lcm1.java @@ -126,6 +126,9 @@ public static void compute(int l, int r) { } } if (cntq > 0) { + // 可以使用额外的数组,每块内部根据b进行排序 + // 每次把新块归并进来,保证 1..l-1 范围根据b有序 + // 可以省掉一个log的复杂度,本题不做这个优化也能通过,索性算了 Arrays.sort(edge, 1, l, cmpb); int pos = 1; for (int i = 1; i <= cntq; i++) { From 9a984f1529581061548c8832587e24233ac56163 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Jul 2025 16:00:29 +0800 Subject: [PATCH 0415/1170] modify code --- src/class174/Code05_Bridge1.java | 246 +++++++++++++++++++++++++++++++ src/class174/Code05_Bridge2.java | 179 ++++++++++++++++++++++ 2 files changed, 425 insertions(+) create mode 100644 src/class174/Code05_Bridge2.java diff --git a/src/class174/Code05_Bridge1.java b/src/class174/Code05_Bridge1.java index 1e3f212a9..f56ce5d94 100644 --- a/src/class174/Code05_Bridge1.java +++ b/src/class174/Code05_Bridge1.java @@ -2,7 +2,253 @@ // 桥梁,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5443 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; public class Code05_Bridge1 { + public static int MAXN = 100001; + public static int n, m, q; + public static int blen, bnum; + public static int[] u = new int[MAXN]; + public static int[] v = new int[MAXN]; + public static int[] w = new int[MAXN]; + + public static int[] op = new int[MAXN]; + public static int[] a = new int[MAXN]; + public static int[] b = new int[MAXN]; + + public static int[] eid = new int[MAXN]; + public static int[] change = new int[MAXN]; + public static int[] unchange = new int[MAXN]; + + public static int[] qid = new int[MAXN]; + public static int[] update = new int[MAXN]; + public static int[] query = new int[MAXN]; + + public static int[] fa = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[][] rollback = new int[MAXN][2]; + public static int opsize = 0; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] curw = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + // 编号组成的数组idx,根据v[编号]的值进行从大到小排序,手写双指针快排 + public static void sort(int[] idx, int[] v, int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = v[idx[(l + r) >> 1]], tmp; + while (i <= j) { + while (v[idx[i]] > pivot) i++; + while (v[idx[j]] < pivot) j--; + if (i <= j) { + tmp = idx[i]; idx[i] = idx[j]; idx[j] = tmp; + i++; j--; + } + } + sort(idx, v, l, j); + sort(idx, v, i, r); + } + + public static void build() { + for (int i = 1; i <= n; i++) { + fa[i] = i; + siz[i] = 1; + } + } + + public static int find(int x) { + while (x != fa[x]) { + x = fa[x]; + } + return x; + } + + public static void union(int x, int y) { + int fx = find(x); + int fy = find(y); + if (fx == fy) { + return; + } + if (siz[fx] < siz[fy]) { + int tmp = fx; + fx = fy; + fy = tmp; + } + fa[fy] = fx; + siz[fx] += siz[fy]; + rollback[++opsize][0] = fx; + rollback[opsize][1] = fy; + } + + public static void undo() { + for (int fx, fy; opsize > 0; opsize--) { + fx = rollback[opsize][0]; + fy = rollback[opsize][1]; + fa[fy] = fy; + siz[fx] -= siz[fy]; + } + } + + public static void merge(int l1, int r1, int l2, int r2) { + int i = 0; + while (l1 <= r1 && l2 <= r2) { + eid[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; + } + while (l1 <= r1) { + eid[++i] = change[l1++]; + } + while (l2 <= r2) { + eid[++i] = unchange[l2++]; + } + } + + public static void compute(int l, int r) { + build(); + Arrays.fill(vis, false); + int cntu = 0, cntq = 0; + for (int i = l; i <= r; i++) { + if (op[qid[i]] == 1) { + vis[a[qid[i]]] = true; + update[++cntu] = qid[i]; + } else { + query[++cntq] = qid[i]; + } + } + sort(query, b, 1, cntq); + int k = 1; + for (int i = 1; i <= cntq; i++) { + for (; k <= m && w[eid[k]] >= b[query[i]]; k++) { + if (!vis[eid[k]]) { + union(u[eid[k]], v[eid[k]]); + } + } + opsize = 0; + for (int j = 1; j <= cntu; j++) { + curw[a[update[j]]] = w[a[update[j]]]; + } + for (int j = 1; j <= cntu; j++) { + if (update[j] < query[i]) { + curw[a[update[j]]] = b[update[j]]; + } + } + for (int j = 1; j <= cntu; j++) { + if (curw[a[update[j]]] >= b[query[i]]) { + union(u[a[update[j]]], v[a[update[j]]]); + } + } + ans[query[i]] = siz[find(a[query[i]])]; + undo(); + } + for (int i = 1; i <= cntu; i++) { + w[a[update[i]]] = b[update[i]]; + } + int siz1 = 0, siz2 = 0; + for (int i = 1; i <= m; i++) { + if (vis[eid[i]]) { + change[++siz1] = eid[i]; + } else { + unchange[++siz2] = eid[i]; + } + } + sort(change, w, 1, siz1); + merge(1, siz1, 1, siz2); + } + + public static int log2(int n) { + int ans = 0; + while ((1 << ans) <= (n >> 1)) { + ans++; + } + return ans; + } + + public static void prepare() { + blen = Math.max(1, (int) Math.sqrt(q * log2(n))); + bnum = (q + blen - 1) / blen; + for (int i = 1; i <= m; i++) { + eid[i] = i; + } + for (int i = 1; i <= q; i++) { + qid[i] = i; + } + sort(eid, w, 1, m); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= m; i++) { + u[i] = in.nextInt(); + v[i] = in.nextInt(); + w[i] = in.nextInt(); + } + q = in.nextInt(); + for (int i = 1; i <= q; i++) { + op[i] = in.nextInt(); + a[i] = in.nextInt(); + b[i] = in.nextInt(); + } + prepare(); + for (int i = 1, l, r; i <= bnum; i++) { + l = (i - 1) * blen + 1; + r = Math.min(i * blen, q); + compute(l, r); + } + for (int i = 1; i <= q; i++) { + if (ans[i] > 0) { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class174/Code05_Bridge2.java b/src/class174/Code05_Bridge2.java new file mode 100644 index 000000000..0442c2842 --- /dev/null +++ b/src/class174/Code05_Bridge2.java @@ -0,0 +1,179 @@ +package class174; + +// 桥梁,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5443 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m, q; +//int blen, bnum; +//int u[MAXN]; +//int v[MAXN]; +//int w[MAXN]; +// +//int op[MAXN]; +//int a[MAXN]; +//int b[MAXN]; +// +//int eid[MAXN]; +//int change[MAXN]; +//int unchange[MAXN]; +// +//int qid[MAXN]; +//int update[MAXN]; +//int query[MAXN]; +// +//int fa[MAXN]; +//int siz[MAXN]; +//int rollback[MAXN][2]; +//int opsize = 0; +// +//bool vis[MAXN]; +//int curw[MAXN]; +//int ans[MAXN]; +// +//void build() { +// for (int i = 1; i <= n; i++) { +// fa[i] = i; +// siz[i] = 1; +// } +//} +// +//int find(int x) { +// while (x != fa[x]) { +// x = fa[x]; +// } +// return x; +//} +// +//void Union(int x, int y) { +// int fx = find(x), fy = find(y); +// if (fx == fy) { +// return; +// } +// if (siz[fx] < siz[fy]) { +// swap(fx, fy); +// } +// fa[fy] = fx; +// siz[fx] += siz[fy]; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; +//} +// +//void undo() { +// for (int fx, fy; opsize > 0; opsize--) { +// fx = rollback[opsize][0]; +// fy = rollback[opsize][1]; +// fa[fy] = fy; +// siz[fx] -= siz[fy]; +// } +//} +// +//void merge(int l1, int r1, int l2, int r2) { +// int i = 0; +// while (l1 <= r1 && l2 <= r2) { +// eid[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; +// } +// while (l1 <= r1) { +// eid[++i] = change[l1++]; +// } +// while (l2 <= r2) { +// eid[++i] = unchange[l2++]; +// } +//} +// +//void compute(int l, int r) { +// build(); +// fill(vis + 1, vis + m + 1, false); +// int cntu = 0, cntq = 0; +// for (int i = l; i <= r; i++) { +// if (op[qid[i]] == 1) { +// vis[a[qid[i]]] = true; +// update[++cntu] = qid[i]; +// } else { +// query[++cntq] = qid[i]; +// } +// } +// sort(query + 1, query + cntq + 1, [&](int x, int y) { return b[x] > b[y]; }); +// int k = 1; +// for (int i = 1; i <= cntq; i++) { +// for (; k <= m && w[eid[k]] >= b[query[i]]; k++) { +// if (!vis[eid[k]]) { +// Union(u[eid[k]], v[eid[k]]); +// } +// } +// opsize = 0; +// for (int j = 1; j <= cntu; j++) { +// curw[a[update[j]]] = w[a[update[j]]]; +// } +// for (int j = 1; j <= cntu; j++) { +// if (update[j] < query[i]) { +// curw[a[update[j]]] = b[update[j]]; +// } +// } +// for (int j = 1; j <= cntu; j++) { +// if (curw[a[update[j]]] >= b[query[i]]) { +// Union(u[a[update[j]]], v[a[update[j]]]); +// } +// } +// ans[query[i]] = siz[find(a[query[i]])]; +// undo(); +// } +// for (int i = 1; i <= cntu; i++) { +// w[a[update[i]]] = b[update[i]]; +// } +// int siz1 = 0, siz2 = 0; +// for (int i = 1; i <= m; i++) { +// if (vis[eid[i]]) { +// change[++siz1] = eid[i]; +// } else { +// unchange[++siz2] = eid[i]; +// } +// } +// if (siz1 > 0) { +// std::sort(change + 1, change + siz1 + 1, [&](int x, int y) { return w[x] > w[y]; }); +// } +// merge(1, siz1, 1, siz2); +//} +// +//void prepare() { +// blen = max(1, (int)sqrt(q * log2(n))); +// bnum = (q + blen - 1) / blen; +// for (int i = 1; i <= m; i++) { +// eid[i] = i; +// } +// for (int i = 1; i <= q; i++) { +// qid[i] = i; +// } +// std::sort(eid + 1, eid + m + 1, [&](int x, int y) { return w[x] > w[y]; }); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= m; i++) { +// cin >> u[i] >> v[i] >> w[i]; +// } +// cin >> q; +// for (int i = 1; i <= q; i++) { +// cin >> op[i] >> a[i] >> b[i]; +// } +// prepare(); +// for (int i = 1, l, r; i <= bnum; i++) { +// l = (i - 1) * blen + 1; +// r = min(i * blen, q); +// compute(l, r); +// } +// for (int i = 1; i <= q; i++) { +// if (ans[i]) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From f22a30ab1a3b4e5a79e912f391baa8e45f3173bd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Jul 2025 16:12:59 +0800 Subject: [PATCH 0416/1170] modify code --- src/class174/Code05_Bridge1.java | 32 ++++++++++++++++++-------------- src/class174/Code05_Bridge2.java | 26 +++++++++++++------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/class174/Code05_Bridge1.java b/src/class174/Code05_Bridge1.java index f56ce5d94..be363ad57 100644 --- a/src/class174/Code05_Bridge1.java +++ b/src/class174/Code05_Bridge1.java @@ -3,6 +3,7 @@ // 桥梁,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5443 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 为了java版本能通过,不定义任何类,关于排序一律手写 import java.io.IOException; import java.io.InputStream; @@ -40,7 +41,7 @@ public class Code05_Bridge1 { public static int[] curw = new int[MAXN]; public static int[] ans = new int[MAXN]; - // 编号组成的数组idx,根据v[编号]的值进行从大到小排序,手写双指针快排 + // idx[l..r]由序号组成,v[序号]的值越大,序号越靠前,手写双指针快排 public static void sort(int[] idx, int[] v, int l, int r) { if (l >= r) return; int i = l, j = r, pivot = v[idx[(l + r) >> 1]], tmp; @@ -56,6 +57,22 @@ public static void sort(int[] idx, int[] v, int l, int r) { sort(idx, v, i, r); } + // change[l1..r1]都是边的序号,已经有序了,w[序号]的值越大,序号越靠前 + // unchange[l2..r2]都是边的序号,已经有序了,w[序号]的值越大,序号越靠前 + // 把两个数组中的序号,根据w[序号]的值,归并到eid中 + public static void merge(int l1, int r1, int l2, int r2) { + int i = 0; + while (l1 <= r1 && l2 <= r2) { + eid[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; + } + while (l1 <= r1) { + eid[++i] = change[l1++]; + } + while (l2 <= r2) { + eid[++i] = unchange[l2++]; + } + } + public static void build() { for (int i = 1; i <= n; i++) { fa[i] = i; @@ -96,19 +113,6 @@ public static void undo() { } } - public static void merge(int l1, int r1, int l2, int r2) { - int i = 0; - while (l1 <= r1 && l2 <= r2) { - eid[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; - } - while (l1 <= r1) { - eid[++i] = change[l1++]; - } - while (l2 <= r2) { - eid[++i] = unchange[l2++]; - } - } - public static void compute(int l, int r) { build(); Arrays.fill(vis, false); diff --git a/src/class174/Code05_Bridge2.java b/src/class174/Code05_Bridge2.java index 0442c2842..43469f375 100644 --- a/src/class174/Code05_Bridge2.java +++ b/src/class174/Code05_Bridge2.java @@ -37,6 +37,19 @@ //int curw[MAXN]; //int ans[MAXN]; // +//void merge(int l1, int r1, int l2, int r2) { +// int i = 0; +// while (l1 <= r1 && l2 <= r2) { +// eid[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; +// } +// while (l1 <= r1) { +// eid[++i] = change[l1++]; +// } +// while (l2 <= r2) { +// eid[++i] = unchange[l2++]; +// } +//} +// //void build() { // for (int i = 1; i <= n; i++) { // fa[i] = i; @@ -74,19 +87,6 @@ // } //} // -//void merge(int l1, int r1, int l2, int r2) { -// int i = 0; -// while (l1 <= r1 && l2 <= r2) { -// eid[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; -// } -// while (l1 <= r1) { -// eid[++i] = change[l1++]; -// } -// while (l2 <= r2) { -// eid[++i] = unchange[l2++]; -// } -//} -// //void compute(int l, int r) { // build(); // fill(vis + 1, vis + m + 1, false); From 6b5f24119f8d16e80e8057baffafcd883bdb5252 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Jul 2025 16:16:36 +0800 Subject: [PATCH 0417/1170] modify code --- src/class174/Code05_Bridge2.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class174/Code05_Bridge2.java b/src/class174/Code05_Bridge2.java index 43469f375..cb2918fbb 100644 --- a/src/class174/Code05_Bridge2.java +++ b/src/class174/Code05_Bridge2.java @@ -135,9 +135,7 @@ // unchange[++siz2] = eid[i]; // } // } -// if (siz1 > 0) { -// std::sort(change + 1, change + siz1 + 1, [&](int x, int y) { return w[x] > w[y]; }); -// } +// sort(change + 1, change + siz1 + 1, [&](int x, int y) { return w[x] > w[y]; }); // merge(1, siz1, 1, siz2); //} // @@ -150,7 +148,7 @@ // for (int i = 1; i <= q; i++) { // qid[i] = i; // } -// std::sort(eid + 1, eid + m + 1, [&](int x, int y) { return w[x] > w[y]; }); +// sort(eid + 1, eid + m + 1, [&](int x, int y) { return w[x] > w[y]; }); //} // //int main() { From e6a19fd33e0d25545a80c97c4d9458b030689f8c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Jul 2025 17:25:46 +0800 Subject: [PATCH 0418/1170] modify code --- src/class174/Code03_MagicGirl1.java | 71 ++++++++++++----------------- src/class174/Code03_MagicGirl2.java | 56 +++++++++++------------ 2 files changed, 54 insertions(+), 73 deletions(-) diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code03_MagicGirl1.java index cf9a17549..93080a509 100644 --- a/src/class174/Code03_MagicGirl1.java +++ b/src/class174/Code03_MagicGirl1.java @@ -15,30 +15,6 @@ public class Code03_MagicGirl1 { - static class Answer { - int pre, suf, len; - long res; - - Answer(int p, int s, int l, long r) { - pre = p; - suf = s; - len = l; - res = r; - } - - void merge(Answer right) { - res += right.res + 1L * suf * right.pre; - if (pre == len) - pre += right.pre; - if (right.suf == right.len) { - suf += right.suf; - } else { - suf = right.suf; - } - len += right.len; - } - } - public static int MAXN = 300005; public static int MAXB = 601; public static int POW2 = 9; @@ -62,14 +38,27 @@ void merge(Answer right) { public static int[] last = new int[MAXN]; public static int[] next = new int[MAXN]; - public static Answer tmp = new Answer(0, 0, 0, 0); - public static Answer[] ans = new Answer[MAXN]; - + public static int[] pre = new int[MAXN]; + public static int[] suf = new int[MAXN]; + public static int[] len = new int[MAXN]; + public static long[] ans = new long[MAXN]; + + public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { + ans[i] += rans + 1L * suf[i] * rpre; + if (pre[i] == len[i]) { + pre[i] += rpre; + } + if (rsuf == rlen) { + suf[i] += rsuf; + } else { + suf[i] = rsuf; + } + len[i] += rlen; + } + // 根据arr[pos[i]]的值,对pos[l..r]进行双指针快排 public static void quickSort(int l, int r) { - if (l >= r) { - return; - } + if (l >= r) return; int i = l, j = r, pivot = arr[pos[(l + r) >> 1]], tmp; while (i <= j) { while (arr[pos[i]] < pivot) i++; @@ -103,25 +92,25 @@ public static void calc(int l, int r) { last[i] = i - 1; next[i] = i + 1; } - tmp.pre = 0; tmp.suf = 0; tmp.len = r - l + 1; tmp.res = 0; + int rpre = 0, rsuf = 0, rlen = r - l + 1, rans = 0; int k = 1; for (int i = l, idx; i <= r; i++) { idx = pos[i]; for (; k <= siz && v[arrq[k]] < arr[idx]; k++) { - ans[arrq[k]].merge(tmp); + mergeAns(arrq[k], rpre, rsuf, rlen, rans); } if (last[idx] == l - 1) { - tmp.pre += next[idx] - idx; + rpre += next[idx] - idx; } if (next[idx] == r + 1) { - tmp.suf += idx - last[idx]; + rsuf += idx - last[idx]; } - tmp.res += 1L * (idx - last[idx]) * (next[idx] - idx); + rans += 1L * (idx - last[idx]) * (next[idx] - idx); last[next[idx]] = last[idx]; next[last[idx]] = next[idx]; } for (; k <= siz; k++) { - ans[arrq[k]].merge(tmp); + mergeAns(arrq[k], rpre, rsuf, rlen, rans); } siz = 0; } @@ -155,11 +144,10 @@ public static void query(int qi, int l, int r) { } else { for (int i = Math.max(jobl, l); i <= Math.min(jobr, r); i++) { if (arr[i] <= jobv) { - tmp.pre = 1; tmp.suf = 1; tmp.len = 1; tmp.res = 1; + mergeAns(qi, 1, 1, 1, 1); } else { - tmp.pre = 0; tmp.suf = 0; tmp.len = 1; tmp.res = 0; + mergeAns(qi, 0, 0, 1, 0); } - ans[qi].merge(tmp); } } } @@ -195,9 +183,6 @@ public static void main(String[] args) throws Exception { v[i] = in.nextInt(); } } - for (int i = 1; i <= m; i++) { - ans[i] = new Answer(0, 0, 0, 0); - } int bnum = (n + BLEN - 1) / BLEN; for (int i = 1, l, r; i <= bnum; i++) { l = (i - 1) * BLEN + 1; @@ -206,7 +191,7 @@ public static void main(String[] args) throws Exception { } for (int i = 1; i <= m; i++) { if (op[i] == 2) { - out.println(ans[i].res); + out.println(ans[i]); } } out.flush(); diff --git a/src/class174/Code03_MagicGirl2.java b/src/class174/Code03_MagicGirl2.java index 274888b7f..296669533 100644 --- a/src/class174/Code03_MagicGirl2.java +++ b/src/class174/Code03_MagicGirl2.java @@ -9,24 +9,6 @@ // //using namespace std; // -//struct Answer { -// int pre, suf, len; -// long long res; -// -// inline void merge(const Answer &right) { -// res += right.res + 1LL * suf * right.pre; -// if (pre == len) { -// pre += right.pre; -// } -// if (right.suf == right.len) { -// suf += right.suf; -// } else { -// suf = right.suf; -// } -// len += right.len; -// } -//}; -// //const int MAXN = 300005; //const int MAXB = 601; //const int POW2 = 9; @@ -50,8 +32,23 @@ //int lst[MAXN]; //int nxt[MAXN]; // -//Answer tmp; -//Answer ans[MAXN]; +//int pre[MAXN]; +//int suf[MAXN]; +//int len[MAXN]; +//long long ans[MAXN]; +// +//inline void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { +// ans[i] += rans + 1LL * suf[i] * rpre; +// if (pre[i] == len[i]) { +// pre[i] += rpre; +// } +// if (rsuf == rlen) { +// suf[i] += rsuf; +// } else { +// suf[i] = rsuf; +// } +// len[i] += rlen; +//} // //inline void radixSort() { // fill(cntv, cntv + MAXB, 0); @@ -72,25 +69,25 @@ // lst[i] = i - 1; // nxt[i] = i + 1; // } -// tmp = { 0, 0, r - l + 1, 0 }; +// int rpre = 0, rsuf = 0, rlen = r - l + 1, rans = 0; // int k = 1; // for (int i = l, idx; i <= r; i++) { // idx = pos[i]; // for(; k <= siz && v[arrq[k]] < arr[idx]; k++) { -// ans[arrq[k]].merge(tmp); +// mergeAns(arrq[k], rpre, rsuf, rlen, rans); // } // if (lst[idx] == l - 1) { -// tmp.pre += nxt[idx] - idx; +// rpre += nxt[idx] - idx; // } // if (nxt[idx] == r + 1) { -// tmp.suf += idx - lst[idx]; +// rsuf += idx - lst[idx]; // } -// tmp.res += 1LL * (idx - lst[idx]) * (nxt[idx] - idx); +// rans += 1LL * (idx - lst[idx]) * (nxt[idx] - idx); // lst[nxt[idx]] = lst[idx]; // nxt[lst[idx]] = nxt[idx]; // } // for(; k <= siz; k++) { -// ans[arrq[k]].merge(tmp); +// mergeAns(arrq[k], rpre, rsuf, rlen, rans); // } // siz = 0; //} @@ -123,11 +120,10 @@ // } else { // for (int i = max(jobl, l); i <= min(jobr, r); i++) { // if (arr[i] <= jobv) { -// tmp = { 1, 1, 1, 1 }; +// mergeAns(qi, 1, 1, 1, 1); // } else { -// tmp = { 0, 0, 1, 0 }; +// mergeAns(qi, 0, 0, 1, 0); // } -// ans[qi].merge(tmp); // } // } //} @@ -168,7 +164,7 @@ // } // for (int i = 1; i <= m; i++) { // if (op[i] == 2) { -// cout << ans[i].res << '\n'; +// cout << ans[i] << '\n'; // } // } // return 0; From b6cca0519e3138965058ae47ab53f364fa9820f9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Jul 2025 18:23:29 +0800 Subject: [PATCH 0419/1170] modify code --- src/class174/Code04_Lcm1.java | 117 +++++++++++++++---------------- src/class174/Code04_Lcm2.java | 80 +++++++++++---------- src/class174/Code05_Bridge1.java | 1 - 3 files changed, 100 insertions(+), 98 deletions(-) diff --git a/src/class174/Code04_Lcm1.java b/src/class174/Code04_Lcm1.java index 5b5bdfece..11d723d02 100644 --- a/src/class174/Code04_Lcm1.java +++ b/src/class174/Code04_Lcm1.java @@ -8,49 +8,30 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.util.Arrays; -import java.util.Comparator; public class Code04_Lcm1 { - static class Param { - int u, v, a, b, qid; - - public Param(int u_, int v_, int a_, int b_) { - u = u_; - v = v_; - a = a_; - b = b_; - } - } - - static class CmpA implements Comparator { - @Override - public int compare(Param o1, Param o2) { - return o1.a - o2.a; - } - } - - static class CmpB implements Comparator { - @Override - public int compare(Param o1, Param o2) { - return o1.b - o2.b; - } - } - - public static CmpA cmpa = new CmpA(); - public static CmpB cmpb = new CmpB(); - public static int MAXN = 50001; public static int MAXM = 100001; public static int MAXQ = 50001; public static int n, m, q; public static int blen, bnum; - public static Param[] edge = new Param[MAXM]; - public static Param[] ques = new Param[MAXQ]; + public static int[] eu = new int[MAXM]; + public static int[] ev = new int[MAXM]; + public static int[] ea = new int[MAXM]; + public static int[] eb = new int[MAXM]; - public static int[] arr = new int[MAXQ]; + public static int[] qu = new int[MAXQ]; + public static int[] qv = new int[MAXQ]; + public static int[] qa = new int[MAXQ]; + public static int[] qb = new int[MAXQ]; + public static int[] qid = new int[MAXQ]; + + public static int[] arre = new int[MAXM]; + public static int[] arrq = new int[MAXQ]; + + public static int[] cur = new int[MAXQ]; public static int cntq = 0; public static int[] fa = new int[MAXN]; @@ -62,6 +43,21 @@ public int compare(Param o1, Param o2) { public static boolean[] ans = new boolean[MAXQ]; + public static void sort(int[] idx, int[] v, int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = v[idx[(l + r) >> 1]], tmp; + while (i <= j) { + while (v[idx[i]] < pivot) i++; + while (v[idx[j]] > pivot) j--; + if (i <= j) { + tmp = idx[i]; idx[i] = idx[j]; idx[j] = tmp; + i++; j--; + } + } + sort(idx, v, l, j); + sort(idx, v, i, r); + } + public static void build() { for (int i = 1; i <= n; i++) { fa[i] = i; @@ -82,9 +78,7 @@ public static void union(int x, int y, int a, int b) { int fx = find(x); int fy = find(y); if (siz[fx] < siz[fy]) { - int tmp = fx; - fx = fy; - fy = tmp; + int tmp = fx; fx = fy; fy = tmp; } rollback[++opsize][0] = fx; rollback[opsize][1] = fy; @@ -121,27 +115,28 @@ public static void compute(int l, int r) { cntq = 0; for (int i = 1; i <= q; i++) { // 保证每条询问只落入其中的一块 - if (edge[l].a <= ques[i].a && (r + 1 > m || ques[i].a < edge[r + 1].a)) { - arr[++cntq] = i; + if (ea[arre[l]] <= qa[arrq[i]] && (r + 1 > m || qa[arrq[i]] < ea[arre[r + 1]])) { + cur[++cntq] = arrq[i]; } } if (cntq > 0) { // 可以使用额外的数组,每块内部根据b进行排序 // 每次把新块归并进来,保证 1..l-1 范围根据b有序 // 可以省掉一个log的复杂度,本题不做这个优化也能通过,索性算了 - Arrays.sort(edge, 1, l, cmpb); + sort(arre, eb, 1, l - 1); int pos = 1; for (int i = 1; i <= cntq; i++) { - for (; pos < l && edge[pos].b <= ques[arr[i]].b; pos++) { - union(edge[pos].u, edge[pos].v, edge[pos].a, edge[pos].b); + for (int edge = arre[pos]; pos < l && eb[edge] <= qb[cur[i]]; pos++, edge = arre[pos]) { + union(eu[edge], ev[edge], ea[edge], eb[edge]); } opsize = 0; for (int j = l; j <= r; j++) { - if (edge[j].a <= ques[arr[i]].a && edge[j].b <= ques[arr[i]].b) { - union(edge[j].u, edge[j].v, edge[j].a, edge[j].b); + int edge = arre[j]; + if (ea[edge] <= qa[cur[i]] && eb[edge] <= qb[cur[i]]) { + union(eu[edge], ev[edge], ea[edge], eb[edge]); } } - ans[ques[arr[i]].qid] = query(ques[arr[i]].u, ques[arr[i]].v, ques[arr[i]].a, ques[arr[i]].b); + ans[qid[cur[i]]] = query(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); undo(); } } @@ -158,8 +153,14 @@ public static int log2(int n) { public static void prepare() { blen = Math.max(1, (int) Math.sqrt(m * log2(n))); bnum = (m + blen - 1) / blen; - Arrays.sort(edge, 1, m + 1, cmpa); - Arrays.sort(ques, 1, q + 1, cmpb); + for (int i = 1; i <= m; i++) { + arre[i] = i; + } + for (int i = 1; i <= q; i++) { + arrq[i] = i; + } + sort(arre, ea, 1, m); + sort(arrq, qb, 1, q); } public static void main(String[] args) throws IOException { @@ -167,21 +168,19 @@ public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); m = in.nextInt(); - for (int i = 1, u, v, a, b; i <= m; i++) { - u = in.nextInt(); - v = in.nextInt(); - a = in.nextInt(); - b = in.nextInt(); - edge[i] = new Param(u, v, a, b); + for (int i = 1; i <= m; i++) { + eu[i] = in.nextInt(); + ev[i] = in.nextInt(); + ea[i] = in.nextInt(); + eb[i] = in.nextInt(); } q = in.nextInt(); - for (int i = 1, u, v, a, b; i <= q; i++) { - u = in.nextInt(); - v = in.nextInt(); - a = in.nextInt(); - b = in.nextInt(); - ques[i] = new Param(u, v, a, b); - ques[i].qid = i; + for (int i = 1; i <= q; i++) { + qu[i] = in.nextInt(); + qv[i] = in.nextInt(); + qa[i] = in.nextInt(); + qb[i] = in.nextInt(); + qid[i] = i; } prepare(); for (int i = 1, l, r; i <= bnum; i++) { diff --git a/src/class174/Code04_Lcm2.java b/src/class174/Code04_Lcm2.java index b03c20be0..184a86699 100644 --- a/src/class174/Code04_Lcm2.java +++ b/src/class174/Code04_Lcm2.java @@ -9,37 +9,36 @@ // //using namespace std; // -//struct Param { -// int u, v, a, b, qid; -//}; -// -//bool cmpa(Param &x, Param &y) { -// return x.a < y.a; -//} -// -//bool cmpb(Param &x, Param &y) { -// return x.b < y.b; -//} -// //const int MAXN = 50001; //const int MAXM = 100001; //const int MAXQ = 50001; //int n, m, q; //int blen, bnum; // -//Param edge[MAXM]; -//Param ques[MAXQ]; +//int eu[MAXM]; +//int ev[MAXM]; +//int ea[MAXM]; +//int eb[MAXM]; +// +//int qu[MAXQ]; +//int qv[MAXQ]; +//int qa[MAXQ]; +//int qb[MAXQ]; +//int qid[MAXQ]; // -//int arr[MAXQ]; -//int cntq; +//int arre[MAXM]; +//int arrq[MAXQ]; +// +//int cur[MAXQ]; +//int cntq = 0; // //int fa[MAXN]; //int siz[MAXN]; //int maxa[MAXN]; //int maxb[MAXN]; -// //int rollback[MAXN][5]; -//int opsize; +//int opsize = 0; +// //bool ans[MAXQ]; // //void build() { @@ -59,8 +58,7 @@ //} // //void Union(int x, int y, int a, int b) { -// int fx = find(x); -// int fy = find(y); +// int fx = find(x), fy = find(y); // if (siz[fx] < siz[fy]) { // swap(fx, fy); // } @@ -73,8 +71,8 @@ // fa[fy] = fx; // siz[fx] += siz[fy]; // } -// maxa[fx] = max({maxa[fx], maxa[fy], a}); -// maxb[fx] = max({maxb[fx], maxb[fy], b}); +// maxa[fx] = max(max(maxa[fx], maxa[fy]), a); +// maxb[fx] = max(max(maxb[fx], maxb[fy]), b); //} // //void undo() { @@ -89,8 +87,7 @@ //} // //bool query(int x, int y, int a, int b) { -// int fx = find(x); -// int fy = find(y); +// int fx = find(x), fy = find(y); // return fx == fy && maxa[fx] == a && maxb[fx] == b; //} // @@ -98,24 +95,25 @@ // build(); // cntq = 0; // for (int i = 1; i <= q; i++) { -// if (edge[l].a <= ques[i].a && (r + 1 > m || ques[i].a < edge[r + 1].a)) { -// arr[++cntq] = i; +// if (ea[arre[l]] <= qa[arrq[i]] && (r + 1 > m || qa[arrq[i]] < ea[arre[r + 1]])) { +// cur[++cntq] = arrq[i]; // } // } // if (cntq > 0) { -// sort(edge + 1, edge + l, cmpb); +// sort(arre + 1, arre + l, [&](int x, int y) { return eb[x] < eb[y]; }); // int pos = 1; // for (int i = 1; i <= cntq; i++) { -// for (; pos < l && edge[pos].b <= ques[arr[i]].b; pos++) { -// Union(edge[pos].u, edge[pos].v, edge[pos].a, edge[pos].b); +// for (int edge = arre[pos]; pos < l && eb[edge] <= qb[cur[i]]; pos++, edge = arre[pos]) { +// Union(eu[edge], ev[edge], ea[edge], eb[edge]); // } // opsize = 0; // for (int j = l; j <= r; j++) { -// if (edge[j].a <= ques[arr[i]].a && edge[j].b <= ques[arr[i]].b) { -// Union(edge[j].u, edge[j].v, edge[j].a, edge[j].b); +// int edge = arre[j]; +// if (ea[edge] <= qa[cur[i]] && eb[edge] <= qb[cur[i]]) { +// Union(eu[edge], ev[edge], ea[edge], eb[edge]); // } // } -// ans[ques[arr[i]].qid] = query(ques[arr[i]].u, ques[arr[i]].v, ques[arr[i]].a, ques[arr[i]].b); +// ans[qid[cur[i]]] = query(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); // undo(); // } // } @@ -124,21 +122,27 @@ //void prepare() { // blen = max(1, (int)sqrt(m * log2(n))); // bnum = (m + blen - 1) / blen; -// sort(edge + 1, edge + m + 1, cmpa); -// sort(ques + 1, ques + q + 1, cmpb); +// for (int i = 1; i <= m; i++) { +// arre[i] = i; +// } +// for (int i = 1; i <= q; i++) { +// arrq[i] = i; +// } +// sort(arre + 1, arre + m + 1, [&](int x, int y) { return ea[x] < ea[y]; }); +// sort(arrq + 1, arrq + q + 1, [&](int x, int y) { return qb[x] < qb[y]; }); //} // //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m; -// for (int i = 1, u, v, a, b; i <= m; i++) { -// cin >> edge[i].u >> edge[i].v >> edge[i].a >> edge[i].b; +// for (int i = 1; i <= m; i++) { +// cin >> eu[i] >> ev[i] >> ea[i] >> eb[i]; // } // cin >> q; // for (int i = 1; i <= q; i++) { -// cin >> ques[i].u >> ques[i].v >> ques[i].a >> ques[i].b; -// ques[i].qid = i; +// cin >> qu[i] >> qv[i] >> qa[i] >> qb[i]; +// qid[i] = i; // } // prepare(); // for (int i = 1, l, r; i <= bnum; i++) { diff --git a/src/class174/Code05_Bridge1.java b/src/class174/Code05_Bridge1.java index be363ad57..454f7ee0d 100644 --- a/src/class174/Code05_Bridge1.java +++ b/src/class174/Code05_Bridge1.java @@ -3,7 +3,6 @@ // 桥梁,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5443 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -// 为了java版本能通过,不定义任何类,关于排序一律手写 import java.io.IOException; import java.io.InputStream; From 352c1d8cc49c4d9e11203d5ee5751b6a713d8f0a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Jul 2025 18:28:36 +0800 Subject: [PATCH 0420/1170] modify code --- src/class174/Code05_Bridge1.java | 36 ++++++++++++++++---------------- src/class174/Code05_Bridge2.java | 36 ++++++++++++++++---------------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/class174/Code05_Bridge1.java b/src/class174/Code05_Bridge1.java index 454f7ee0d..bb6bc1608 100644 --- a/src/class174/Code05_Bridge1.java +++ b/src/class174/Code05_Bridge1.java @@ -23,11 +23,11 @@ public class Code05_Bridge1 { public static int[] a = new int[MAXN]; public static int[] b = new int[MAXN]; - public static int[] eid = new int[MAXN]; + public static int[] arre = new int[MAXN]; public static int[] change = new int[MAXN]; public static int[] unchange = new int[MAXN]; - public static int[] qid = new int[MAXN]; + public static int[] arrq = new int[MAXN]; public static int[] update = new int[MAXN]; public static int[] query = new int[MAXN]; @@ -62,13 +62,13 @@ public static void sort(int[] idx, int[] v, int l, int r) { public static void merge(int l1, int r1, int l2, int r2) { int i = 0; while (l1 <= r1 && l2 <= r2) { - eid[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; + arre[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; } while (l1 <= r1) { - eid[++i] = change[l1++]; + arre[++i] = change[l1++]; } while (l2 <= r2) { - eid[++i] = unchange[l2++]; + arre[++i] = unchange[l2++]; } } @@ -117,19 +117,19 @@ public static void compute(int l, int r) { Arrays.fill(vis, false); int cntu = 0, cntq = 0; for (int i = l; i <= r; i++) { - if (op[qid[i]] == 1) { - vis[a[qid[i]]] = true; - update[++cntu] = qid[i]; + if (op[arrq[i]] == 1) { + vis[a[arrq[i]]] = true; + update[++cntu] = arrq[i]; } else { - query[++cntq] = qid[i]; + query[++cntq] = arrq[i]; } } sort(query, b, 1, cntq); int k = 1; for (int i = 1; i <= cntq; i++) { - for (; k <= m && w[eid[k]] >= b[query[i]]; k++) { - if (!vis[eid[k]]) { - union(u[eid[k]], v[eid[k]]); + for (; k <= m && w[arre[k]] >= b[query[i]]; k++) { + if (!vis[arre[k]]) { + union(u[arre[k]], v[arre[k]]); } } opsize = 0; @@ -154,10 +154,10 @@ public static void compute(int l, int r) { } int siz1 = 0, siz2 = 0; for (int i = 1; i <= m; i++) { - if (vis[eid[i]]) { - change[++siz1] = eid[i]; + if (vis[arre[i]]) { + change[++siz1] = arre[i]; } else { - unchange[++siz2] = eid[i]; + unchange[++siz2] = arre[i]; } } sort(change, w, 1, siz1); @@ -176,12 +176,12 @@ public static void prepare() { blen = Math.max(1, (int) Math.sqrt(q * log2(n))); bnum = (q + blen - 1) / blen; for (int i = 1; i <= m; i++) { - eid[i] = i; + arre[i] = i; } for (int i = 1; i <= q; i++) { - qid[i] = i; + arrq[i] = i; } - sort(eid, w, 1, m); + sort(arre, w, 1, m); } public static void main(String[] args) throws IOException { diff --git a/src/class174/Code05_Bridge2.java b/src/class174/Code05_Bridge2.java index cb2918fbb..5f2992289 100644 --- a/src/class174/Code05_Bridge2.java +++ b/src/class174/Code05_Bridge2.java @@ -20,11 +20,11 @@ //int a[MAXN]; //int b[MAXN]; // -//int eid[MAXN]; +//int arre[MAXN]; //int change[MAXN]; //int unchange[MAXN]; // -//int qid[MAXN]; +//int arrq[MAXN]; //int update[MAXN]; //int query[MAXN]; // @@ -40,13 +40,13 @@ //void merge(int l1, int r1, int l2, int r2) { // int i = 0; // while (l1 <= r1 && l2 <= r2) { -// eid[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; +// arre[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; // } // while (l1 <= r1) { -// eid[++i] = change[l1++]; +// arre[++i] = change[l1++]; // } // while (l2 <= r2) { -// eid[++i] = unchange[l2++]; +// arre[++i] = unchange[l2++]; // } //} // @@ -92,19 +92,19 @@ // fill(vis + 1, vis + m + 1, false); // int cntu = 0, cntq = 0; // for (int i = l; i <= r; i++) { -// if (op[qid[i]] == 1) { -// vis[a[qid[i]]] = true; -// update[++cntu] = qid[i]; +// if (op[arrq[i]] == 1) { +// vis[a[arrq[i]]] = true; +// update[++cntu] = arrq[i]; // } else { -// query[++cntq] = qid[i]; +// query[++cntq] = arrq[i]; // } // } // sort(query + 1, query + cntq + 1, [&](int x, int y) { return b[x] > b[y]; }); // int k = 1; // for (int i = 1; i <= cntq; i++) { -// for (; k <= m && w[eid[k]] >= b[query[i]]; k++) { -// if (!vis[eid[k]]) { -// Union(u[eid[k]], v[eid[k]]); +// for (; k <= m && w[arre[k]] >= b[query[i]]; k++) { +// if (!vis[arre[k]]) { +// Union(u[arre[k]], v[arre[k]]); // } // } // opsize = 0; @@ -129,10 +129,10 @@ // } // int siz1 = 0, siz2 = 0; // for (int i = 1; i <= m; i++) { -// if (vis[eid[i]]) { -// change[++siz1] = eid[i]; +// if (vis[arre[i]]) { +// change[++siz1] = arre[i]; // } else { -// unchange[++siz2] = eid[i]; +// unchange[++siz2] = arre[i]; // } // } // sort(change + 1, change + siz1 + 1, [&](int x, int y) { return w[x] > w[y]; }); @@ -143,12 +143,12 @@ // blen = max(1, (int)sqrt(q * log2(n))); // bnum = (q + blen - 1) / blen; // for (int i = 1; i <= m; i++) { -// eid[i] = i; +// arre[i] = i; // } // for (int i = 1; i <= q; i++) { -// qid[i] = i; +// arrq[i] = i; // } -// sort(eid + 1, eid + m + 1, [&](int x, int y) { return w[x] > w[y]; }); +// sort(arre + 1, arre + m + 1, [&](int x, int y) { return w[x] > w[y]; }); //} // //int main() { From a65fd909a33368de47a651701326d08d8cc82be5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Jul 2025 19:17:34 +0800 Subject: [PATCH 0421/1170] modify code --- src/class039/Code01_BasicCalculatorIII.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class039/Code01_BasicCalculatorIII.java b/src/class039/Code01_BasicCalculatorIII.java index 958c21d3b..2774c4f32 100644 --- a/src/class039/Code01_BasicCalculatorIII.java +++ b/src/class039/Code01_BasicCalculatorIII.java @@ -3,7 +3,10 @@ import java.util.ArrayList; // 含有嵌套的表达式求值 +// 力扣上本题为会员题,所以额外提供了牛客网的测试链接 +// 如果在牛客网上提交,请将函数名从改calculate为solve // 测试链接 : https://leetcode.cn/problems/basic-calculator-iii/ +// 测试链接 : https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4 public class Code01_BasicCalculatorIII { public static int calculate(String str) { From d1a068e333c60fa814c5c12d8c184a26256cd36f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Jul 2025 19:22:49 +0800 Subject: [PATCH 0422/1170] modify code --- src/class039/Code01_BasicCalculatorIII.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class039/Code01_BasicCalculatorIII.java b/src/class039/Code01_BasicCalculatorIII.java index 2774c4f32..81714ed36 100644 --- a/src/class039/Code01_BasicCalculatorIII.java +++ b/src/class039/Code01_BasicCalculatorIII.java @@ -4,7 +4,7 @@ // 含有嵌套的表达式求值 // 力扣上本题为会员题,所以额外提供了牛客网的测试链接 -// 如果在牛客网上提交,请将函数名从改calculate为solve +// 如果在牛客网上提交,请将函数名从calculate改为solve // 测试链接 : https://leetcode.cn/problems/basic-calculator-iii/ // 测试链接 : https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4 public class Code01_BasicCalculatorIII { From fcefda6ca30ccda591cab21c0b6d2087f6496458 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Jul 2025 11:33:01 +0800 Subject: [PATCH 0423/1170] modify code --- src/class174/Code01_FutureDiary1.java | 24 +++++++++---------- src/class174/Code01_FutureDiary2.java | 24 +++++++++---------- ...MagicGirl1.java => Code02_MagicGirl1.java} | 4 ++-- ...MagicGirl2.java => Code02_MagicGirl2.java} | 0 ...World1.java => Code03_ColorfulWorld1.java} | 4 ++-- ...World2.java => Code03_ColorfulWorld2.java} | 0 6 files changed, 28 insertions(+), 28 deletions(-) rename src/class174/{Code03_MagicGirl1.java => Code02_MagicGirl1.java} (98%) rename src/class174/{Code03_MagicGirl2.java => Code02_MagicGirl2.java} (100%) rename src/class174/{Code02_ColorfulWorld1.java => Code03_ColorfulWorld1.java} (97%) rename src/class174/{Code02_ColorfulWorld2.java => Code03_ColorfulWorld2.java} (100%) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 875d50289..4df774bfc 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -26,9 +26,9 @@ public class Code01_FutureDiary1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - public static int[] idxRoot = new int[MAXN]; - public static int[][] valRoot = new int[MAXB][MAXN]; - public static int[][] rootVal = new int[MAXB][MAXN]; + public static int[] idxPos = new int[MAXN]; + public static int[][] valPos = new int[MAXB][MAXN]; + public static int[][] posVal = new int[MAXB][MAXN]; public static int[][] sum1 = new int[MAXB][MAXB]; public static int[][] sum2 = new int[MAXB][MAXN]; @@ -37,28 +37,28 @@ public class Code01_FutureDiary1 { public static void build(int b) { for (int i = 1; i <= blen; i++) { - valRoot[b][rootVal[b][i]] = 0; + valPos[b][posVal[b][i]] = 0; } for (int i = bl[b], cnt = 0; i <= br[b]; i++) { - if (valRoot[b][arr[i]] == 0) { + if (valPos[b][arr[i]] == 0) { cnt++; - valRoot[b][arr[i]] = cnt; - rootVal[b][cnt] = arr[i]; + valPos[b][arr[i]] = cnt; + posVal[b][cnt] = arr[i]; } - idxRoot[i] = valRoot[b][arr[i]]; + idxPos[i] = valPos[b][arr[i]]; } } public static void down(int b) { for (int i = bl[b]; i <= br[b]; i++) { - arr[i] = rootVal[b][idxRoot[i]]; + arr[i] = posVal[b][idxPos[i]]; } } public static void xToy(int b, int x, int y) { - valRoot[b][y] = valRoot[b][x]; - rootVal[b][valRoot[b][x]] = y; - valRoot[b][x] = 0; + valPos[b][y] = valPos[b][x]; + posVal[b][valPos[b][x]] = y; + valPos[b][x] = 0; } public static void innerUpdate(int l, int r, int x, int y) { diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 88fd4a1fc..d7e5298c3 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -39,9 +39,9 @@ //int bl[MAXB]; //int br[MAXB]; // -//int idxRoot[MAXN]; -//int valRoot[MAXB][MAXN]; -//int rootVal[MAXB][MAXN]; +//int idxPos[MAXN]; +//int valPos[MAXB][MAXN]; +//int posVal[MAXB][MAXN]; // //int sum1[MAXB][MAXB]; //int sum2[MAXB][MAXN]; @@ -50,29 +50,29 @@ // //void build(int b) { // for (int i = 1; i <= blen; i++) { -// valRoot[b][rootVal[b][i]] = 0; +// valPos[b][posVal[b][i]] = 0; // } // int cnt = 0; // for (int i = bl[b]; i <= br[b]; i++) { -// if (valRoot[b][arr[i]] == 0) { +// if (valPos[b][arr[i]] == 0) { // cnt++; -// valRoot[b][arr[i]] = cnt; -// rootVal[b][cnt] = arr[i]; +// valPos[b][arr[i]] = cnt; +// posVal[b][cnt] = arr[i]; // } -// idxRoot[i] = valRoot[b][arr[i]]; +// idxPos[i] = valPos[b][arr[i]]; // } //} // //void down(int b) { // for (int i = bl[b]; i <= br[b]; i++) { -// arr[i] = rootVal[b][idxRoot[i]]; +// arr[i] = posVal[b][idxPos[i]]; // } //} // //void xToy(int b, int x, int y) { -// valRoot[b][y] = valRoot[b][x]; -// rootVal[b][valRoot[b][x]] = y; -// valRoot[b][x] = 0; +// valPos[b][y] = valPos[b][x]; +// posVal[b][valPos[b][x]] = y; +// valPos[b][x] = 0; //} // //void innerUpdate(int l, int r, int x, int y) { diff --git a/src/class174/Code03_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java similarity index 98% rename from src/class174/Code03_MagicGirl1.java rename to src/class174/Code02_MagicGirl1.java index 93080a509..e102a8c25 100644 --- a/src/class174/Code03_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P6578 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code03_MagicGirl2文件就是C++的实现 +// 想通过用C++实现,本节课Code02_MagicGirl2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code03_MagicGirl1 { +public class Code02_MagicGirl1 { public static int MAXN = 300005; public static int MAXB = 601; diff --git a/src/class174/Code03_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java similarity index 100% rename from src/class174/Code03_MagicGirl2.java rename to src/class174/Code02_MagicGirl2.java diff --git a/src/class174/Code02_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java similarity index 97% rename from src/class174/Code02_ColorfulWorld1.java rename to src/class174/Code03_ColorfulWorld1.java index 171b8d5d6..ee0d73576 100644 --- a/src/class174/Code02_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4117 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code02_ColorfulWorld2文件就是C++的实现 +// 想通过用C++实现,本节课Code03_ColorfulWorld2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_ColorfulWorld1 { +public class Code03_ColorfulWorld1 { public static int MAXN = 1000001; public static int n, m; diff --git a/src/class174/Code02_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java similarity index 100% rename from src/class174/Code02_ColorfulWorld2.java rename to src/class174/Code03_ColorfulWorld2.java From d1f90265a6da85f0cf8af6d1648da57054f315ec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Jul 2025 11:46:19 +0800 Subject: [PATCH 0424/1170] modify code --- src/class174/Code01_FutureDiary1.java | 24 ++++++++++++------------ src/class174/Code01_FutureDiary2.java | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 4df774bfc..3e319ff49 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -26,9 +26,9 @@ public class Code01_FutureDiary1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - public static int[] idxPos = new int[MAXN]; - public static int[][] valPos = new int[MAXB][MAXN]; - public static int[][] posVal = new int[MAXB][MAXN]; + public static int[] idxrt = new int[MAXN]; + public static int[][] valrt = new int[MAXB][MAXN]; + public static int[][] rtval = new int[MAXB][MAXN]; public static int[][] sum1 = new int[MAXB][MAXB]; public static int[][] sum2 = new int[MAXB][MAXN]; @@ -37,28 +37,28 @@ public class Code01_FutureDiary1 { public static void build(int b) { for (int i = 1; i <= blen; i++) { - valPos[b][posVal[b][i]] = 0; + valrt[b][rtval[b][i]] = 0; } for (int i = bl[b], cnt = 0; i <= br[b]; i++) { - if (valPos[b][arr[i]] == 0) { + if (valrt[b][arr[i]] == 0) { cnt++; - valPos[b][arr[i]] = cnt; - posVal[b][cnt] = arr[i]; + valrt[b][arr[i]] = cnt; + rtval[b][cnt] = arr[i]; } - idxPos[i] = valPos[b][arr[i]]; + idxrt[i] = valrt[b][arr[i]]; } } public static void down(int b) { for (int i = bl[b]; i <= br[b]; i++) { - arr[i] = posVal[b][idxPos[i]]; + arr[i] = rtval[b][idxrt[i]]; } } public static void xToy(int b, int x, int y) { - valPos[b][y] = valPos[b][x]; - posVal[b][valPos[b][x]] = y; - valPos[b][x] = 0; + valrt[b][y] = valrt[b][x]; + rtval[b][valrt[b][x]] = y; + valrt[b][x] = 0; } public static void innerUpdate(int l, int r, int x, int y) { diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index d7e5298c3..26f2ee084 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -39,9 +39,9 @@ //int bl[MAXB]; //int br[MAXB]; // -//int idxPos[MAXN]; -//int valPos[MAXB][MAXN]; -//int posVal[MAXB][MAXN]; +//int idxrt[MAXN]; +//int valrt[MAXB][MAXN]; +//int rtval[MAXB][MAXN]; // //int sum1[MAXB][MAXB]; //int sum2[MAXB][MAXN]; @@ -50,29 +50,29 @@ // //void build(int b) { // for (int i = 1; i <= blen; i++) { -// valPos[b][posVal[b][i]] = 0; +// valrt[b][rtval[b][i]] = 0; // } // int cnt = 0; // for (int i = bl[b]; i <= br[b]; i++) { -// if (valPos[b][arr[i]] == 0) { +// if (valrt[b][arr[i]] == 0) { // cnt++; -// valPos[b][arr[i]] = cnt; -// posVal[b][cnt] = arr[i]; +// valrt[b][arr[i]] = cnt; +// rtval[b][cnt] = arr[i]; // } -// idxPos[i] = valPos[b][arr[i]]; +// idxrt[i] = valrt[b][arr[i]]; // } //} // //void down(int b) { // for (int i = bl[b]; i <= br[b]; i++) { -// arr[i] = posVal[b][idxPos[i]]; +// arr[i] = rtval[b][idxrt[i]]; // } //} // //void xToy(int b, int x, int y) { -// valPos[b][y] = valPos[b][x]; -// posVal[b][valPos[b][x]] = y; -// valPos[b][x] = 0; +// valrt[b][y] = valrt[b][x]; +// rtval[b][valrt[b][x]] = y; +// valrt[b][x] = 0; //} // //void innerUpdate(int l, int r, int x, int y) { From 641eb71370c6ff066db9f70acb0221a6391102aa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Jul 2025 12:53:56 +0800 Subject: [PATCH 0425/1170] modify code --- src/class174/Code01_FutureDiary1.java | 2 +- src/class174/Code01_FutureDiary2.java | 2 +- src/class174/Code02_MagicGirl1.java | 2 +- src/class174/Code02_MagicGirl2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 3e319ff49..cde5746aa 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -16,7 +16,7 @@ public class Code01_FutureDiary1 { public static int MAXN = 100001; - public static int MAXB = 318; + public static int MAXB = 401; public static int n, m; public static int[] arr = new int[MAXN]; public static int[] tmp = new int[MAXN]; diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 26f2ee084..c0868c583 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -29,7 +29,7 @@ //} // //const int MAXN = 100001; -//const int MAXB = 318; +//const int MAXB = 401; //int n, m; //int arr[MAXN]; //int tmp[MAXN]; diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index e102a8c25..57b682594 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -15,7 +15,7 @@ public class Code02_MagicGirl1 { - public static int MAXN = 300005; + public static int MAXN = 300002; public static int MAXB = 601; public static int POW2 = 9; public static int BLEN = 1 << POW2; diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index 296669533..acc42f522 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -9,7 +9,7 @@ // //using namespace std; // -//const int MAXN = 300005; +//const int MAXN = 300002; //const int MAXB = 601; //const int POW2 = 9; //const int BLEN = 1 << POW2; From 2476d07818c23cbffc22dae48b846a021b1b2cf3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Jul 2025 13:22:30 +0800 Subject: [PATCH 0426/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 22 ++++++++------ src/class174/Code03_ColorfulWorld2.java | 22 ++++++++------ src/class174/Code05_Bridge1.java | 40 ++++++++++++++----------- src/class174/Code05_Bridge2.java | 40 ++++++++++++++----------- 4 files changed, 70 insertions(+), 54 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index ee0d73576..ce33ef9db 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -16,19 +16,23 @@ public class Code03_ColorfulWorld1 { public static int MAXN = 1000001; + public static int MAXM = 500001; + public static int MAXV = 100002; public static int n, m; public static int blen, bnum; public static int maxv, lazy; + public static int[] arr = new int[MAXN]; + public static int[] op = new int[MAXM]; + public static int[] ql = new int[MAXM]; + public static int[] qr = new int[MAXM]; + public static int[] qx = new int[MAXM]; - public static int[] op = new int[MAXN]; - public static int[] ql = new int[MAXN]; - public static int[] qr = new int[MAXN]; - public static int[] qx = new int[MAXN]; + public static int[] pre0 = new int[MAXN]; + public static int[] fa = new int[MAXV]; + public static int[] sum = new int[MAXV]; - public static int[] fa = new int[MAXN]; - public static int[] sum = new int[MAXN]; - public static int[] ans = new int[MAXN]; + public static int[] ans = new int[MAXM]; public static int find(int x) { if (x != fa[x]) { @@ -134,11 +138,11 @@ public static void prepare() { blen = (int) Math.sqrt(n * 3.0); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { - sum[i] = sum[i - 1] + (arr[i] == 0 ? 1 : 0); + pre0[i] = pre0[i - 1] + (arr[i] == 0 ? 1 : 0); } for (int i = 1; i <= m; i++) { if (op[i] == 2 && qx[i] == 0) { - ans[i] = sum[qr[i]] - sum[ql[i] - 1]; + ans[i] = pre0[qr[i]] - pre0[ql[i] - 1]; } } } diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index 661af14e2..7969df021 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -10,19 +10,23 @@ //using namespace std; // //const int MAXN = 1000001; +//const int MAXM = 500001; +//const int MAXV = 100002; //int n, m; //int blen, bnum; //int maxv, lazy; +// //int arr[MAXN]; +//int op[MAXM]; +//int ql[MAXM]; +//int qr[MAXM]; +//int qx[MAXM]; // -//int op[MAXN]; -//int ql[MAXN]; -//int qr[MAXN]; -//int qx[MAXN]; +//int pre0[MAXN]; +//int fa[MAXV]; +//int sum[MAXV]; // -//int fa[MAXN]; -//int sum[MAXN]; -//int ans[MAXN]; +//int ans[MAXM]; // //int find(int x) { // if (x != fa[x]) { @@ -128,11 +132,11 @@ // blen = (int)sqrt(n * 3.0); // bnum = (n + blen - 1) / blen; // for (int i = 1; i <= n; i++) { -// sum[i] = sum[i - 1] + (arr[i] == 0 ? 1 : 0); +// pre0[i] = pre0[i - 1] + (arr[i] == 0 ? 1 : 0); // } // for (int i = 1; i <= m; i++) { // if (op[i] == 2 && qx[i] == 0) { -// ans[i] = sum[qr[i]] - sum[ql[i] - 1]; +// ans[i] = pre0[qr[i]] - pre0[ql[i] - 1]; // } // } //} diff --git a/src/class174/Code05_Bridge1.java b/src/class174/Code05_Bridge1.java index bb6bc1608..65dc09489 100644 --- a/src/class174/Code05_Bridge1.java +++ b/src/class174/Code05_Bridge1.java @@ -12,33 +12,37 @@ public class Code05_Bridge1 { - public static int MAXN = 100001; + public static int MAXN = 50001; + public static int MAXM = 100001; + public static int MAXQ = 100001; public static int n, m, q; public static int blen, bnum; - public static int[] u = new int[MAXN]; - public static int[] v = new int[MAXN]; - public static int[] w = new int[MAXN]; - public static int[] op = new int[MAXN]; - public static int[] a = new int[MAXN]; - public static int[] b = new int[MAXN]; + public static int[] u = new int[MAXM]; + public static int[] v = new int[MAXM]; + public static int[] w = new int[MAXM]; - public static int[] arre = new int[MAXN]; - public static int[] change = new int[MAXN]; - public static int[] unchange = new int[MAXN]; - - public static int[] arrq = new int[MAXN]; - public static int[] update = new int[MAXN]; - public static int[] query = new int[MAXN]; + public static int[] op = new int[MAXQ]; + public static int[] a = new int[MAXQ]; + public static int[] b = new int[MAXQ]; public static int[] fa = new int[MAXN]; public static int[] siz = new int[MAXN]; - public static int[][] rollback = new int[MAXN][2]; + public static int[][] rollback = new int[MAXM][2]; public static int opsize = 0; - public static boolean[] vis = new boolean[MAXN]; - public static int[] curw = new int[MAXN]; - public static int[] ans = new int[MAXN]; + public static int[] arre = new int[MAXM]; + public static int[] change = new int[MAXM]; + public static int[] unchange = new int[MAXM]; + + public static int[] arrq = new int[MAXQ]; + public static int[] update = new int[MAXQ]; + public static int[] query = new int[MAXQ]; + + public static boolean[] vis = new boolean[MAXM]; + public static int[] curw = new int[MAXM]; + + public static int[] ans = new int[MAXQ]; // idx[l..r]由序号组成,v[序号]的值越大,序号越靠前,手写双指针快排 public static void sort(int[] idx, int[] v, int l, int r) { diff --git a/src/class174/Code05_Bridge2.java b/src/class174/Code05_Bridge2.java index 5f2992289..dd0cb82a5 100644 --- a/src/class174/Code05_Bridge2.java +++ b/src/class174/Code05_Bridge2.java @@ -9,33 +9,37 @@ // //using namespace std; // -//const int MAXN = 100001; +//const int MAXN = 50001; +//const int MAXM = 100001; +//const int MAXQ = 100001; //int n, m, q; //int blen, bnum; -//int u[MAXN]; -//int v[MAXN]; -//int w[MAXN]; // -//int op[MAXN]; -//int a[MAXN]; -//int b[MAXN]; +//int u[MAXM]; +//int v[MAXM]; +//int w[MAXM]; // -//int arre[MAXN]; -//int change[MAXN]; -//int unchange[MAXN]; -// -//int arrq[MAXN]; -//int update[MAXN]; -//int query[MAXN]; +//int op[MAXQ]; +//int a[MAXQ]; +//int b[MAXQ]; // //int fa[MAXN]; //int siz[MAXN]; -//int rollback[MAXN][2]; +//int rollback[MAXM][2]; //int opsize = 0; // -//bool vis[MAXN]; -//int curw[MAXN]; -//int ans[MAXN]; +//int arre[MAXM]; +//int change[MAXM]; +//int unchange[MAXM]; +// +//int arrq[MAXQ]; +//int update[MAXQ]; +//int query[MAXQ]; +// +//bool vis[MAXM]; +//int curw[MAXM]; +// +//int ans[MAXQ]; // //void merge(int l1, int r1, int l2, int r2) { // int i = 0; From 281a8e866780050dc75a05c7feb450c55cb3492c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Jul 2025 14:24:59 +0800 Subject: [PATCH 0427/1170] modify code --- src/class174/Code01_FutureDiary1.java | 4 ++++ src/class174/Code01_FutureDiary2.java | 4 ++++ src/class174/Code02_MagicGirl1.java | 13 ++++++++++--- src/class174/Code02_MagicGirl2.java | 13 ++++++++++--- src/class174/Code03_ColorfulWorld1.java | 6 ++++++ src/class174/Code03_ColorfulWorld2.java | 6 ++++++ src/class174/Code04_Lcm1.java | 7 +++++++ src/class174/Code04_Lcm2.java | 7 +++++++ src/class174/Code05_Bridge1.java | 8 ++++++++ src/class174/Code05_Bridge2.java | 8 ++++++++ 10 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index cde5746aa..f10d4cc72 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -1,6 +1,10 @@ package class174; // 未来日记,java版 +// 给定一个长度为n的数组arr,一共有m条操作,每条操作类型如下 +// 操作 1 l r x y : arr[l..r]范围上,所有值x变成值y +// 操作 2 l r k : arr[l..r]范围上,查询第k小的值 +// 1 <= n、m、arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4119 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index c0868c583..8f4e292b1 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -1,6 +1,10 @@ package class174; // 未来日记,C++版 +// 给定一个长度为n的数组arr,一共有m条操作,每条操作类型如下 +// 操作 1 l r x y : arr[l..r]范围上,所有值x变成值y +// 操作 2 l r k : arr[l..r]范围上,查询第k小的值 +// 1 <= n、m、arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4119 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 57b682594..531c6fd12 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -1,6 +1,11 @@ package class174; // 魔法少女网站,java版 +// 给定一个长度为n的数组arr,一共有m条操作,每条操作类型如下 +// 操作 1 x v : arr[x]的值变成v +// 操作 2 x y v : arr[x..y]范围上,查询有多少连续子数组的最大值 <= v +// 1 <= n、m <= 3 * 10^5 +// 1 <= arr[i] <= n // 测试链接 : https://www.luogu.com.cn/problem/P6578 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 @@ -116,7 +121,7 @@ public static void calc(int l, int r) { } public static void update(int qi, int l, int r) { - int jobi = x[qi], jobv = y[qi]; + int jobi = x[qi], jobv = v[qi]; if (l <= jobi && jobi <= r) { calc(l, r); arr[jobi] = jobv; @@ -178,8 +183,10 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= m; i++) { op[i] = in.nextInt(); x[i] = in.nextInt(); - y[i] = in.nextInt(); - if (op[i] == 2) { + if (op[i] == 1) { + v[i] = in.nextInt(); + } else { + y[i] = in.nextInt(); v[i] = in.nextInt(); } } diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index acc42f522..3c4ab05e6 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -1,6 +1,11 @@ package class174; // 魔法少女网站,C++版 +// 给定一个长度为n的数组arr,一共有m条操作,每条操作类型如下 +// 操作 1 x v : arr[x]的值变成v +// 操作 2 x y v : arr[x..y]范围上,查询有多少连续子数组的最大值 <= v +// 1 <= n、m <= 3 * 10^5 +// 1 <= arr[i] <= n // 测试链接 : https://www.luogu.com.cn/problem/P6578 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -93,7 +98,7 @@ //} // //inline void update(int qi, int l, int r) { -// int jobi = x[qi], jobv = y[qi]; +// int jobi = x[qi], jobv = v[qi]; // if (l <= jobi && jobi <= r) { // calc(l, r); // arr[jobi] = jobv; @@ -151,9 +156,11 @@ // cin >> arr[i]; // } // for (int i = 1; i <= m; i++) { -// cin >> op[i] >> x[i] >> y[i]; -// if (op[i] == 2) { +// cin >> op[i] >> x[i]; +// if (op[i] == 1) { // cin >> v[i]; +// } else { +// cin >> y[i] >> v[i]; // } // } // int bnum = (n + BLEN - 1) / BLEN; diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index ce33ef9db..23d03e647 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -1,6 +1,12 @@ package class174; // 五彩斑斓的世界,java版 +// 给定一个长度为n的数组arr,一共有m条操作,每条操作类型如下 +// 操作 1 l r x : arr[l..r]范围上,所有大于x的数减去x +// 操作 2 l r x : arr[l..l]范围上,查询x出现的次数 +// 1 <= n <= 10^6 +// 1 <= m <= 5 * 10^5 +// 0 <= arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4117 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index 7969df021..d08eb4d41 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -1,6 +1,12 @@ package class174; // 五彩斑斓的世界,C++版 +// 给定一个长度为n的数组arr,一共有m条操作,每条操作类型如下 +// 操作 1 l r x : arr[l..r]范围上,所有大于x的数减去x +// 操作 2 l r x : arr[l..l]范围上,查询x出现的次数 +// 1 <= n <= 10^6 +// 1 <= m <= 5 * 10^5 +// 0 <= arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4117 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class174/Code04_Lcm1.java b/src/class174/Code04_Lcm1.java index 11d723d02..91a1bfc97 100644 --- a/src/class174/Code04_Lcm1.java +++ b/src/class174/Code04_Lcm1.java @@ -1,6 +1,13 @@ package class174; // 最小公倍数,java版 +// 有n个点组成的无向图,依次给出m条无向边,每条边都有边权,并且边权很特殊 +// u v a b : u到v的边,边权 = 2的a次方 * 3的b次方 +// 接下来有q条查询,每条查询的格式如下 +// u v a b : 从u出发可以随意选择边到达v,打印是否存在一条路径,满足如下条件 +// 路径上所有边权的最小公倍数 = 2的a次方 * 3的b次方 +// 1 <= n、q <= 5 * 10^4 +// 1 <= m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3247 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class174/Code04_Lcm2.java b/src/class174/Code04_Lcm2.java index 184a86699..7143c8ee6 100644 --- a/src/class174/Code04_Lcm2.java +++ b/src/class174/Code04_Lcm2.java @@ -1,6 +1,13 @@ package class174; // 最小公倍数,C++版 +// 有n个点组成的无向图,依次给出m条无向边,每条边都有边权,并且边权很特殊 +// u v a b : u到v的边,边权 = 2的a次方 * 3的b次方 +// 接下来有q条查询,每条查询的格式如下 +// u v a b : 从u出发可以随意选择边到达v,打印是否存在一条路径,满足如下条件 +// 路径上所有边权的最小公倍数 = 2的a次方 * 3的b次方 +// 1 <= n、q <= 5 * 10^4 +// 1 <= m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3247 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class174/Code05_Bridge1.java b/src/class174/Code05_Bridge1.java index 65dc09489..94d029831 100644 --- a/src/class174/Code05_Bridge1.java +++ b/src/class174/Code05_Bridge1.java @@ -1,6 +1,14 @@ package class174; // 桥梁,java版 +// 有n个点组成的无向图,依次给出m条无向边 +// u v w : u到v的边,边权为w,边权同时代表限重 +// 如果开车从边上经过,车的重量 <= 边的限重,车才能走过这条边 +// 接下来有q条操作,每条操作的格式如下 +// 操作 1 a b : 编号为a的边,边权变成b +// 操作 2 a b : 编号为a的点是出发点,车重为b,查询车能到达几个不同的点 +// 1 <= n <= 5 * 10^4 0 <= m <= 10^5 +// 1 <= q <= 10^5 1 <= 其他数据 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5443 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class174/Code05_Bridge2.java b/src/class174/Code05_Bridge2.java index dd0cb82a5..f0cf9c79e 100644 --- a/src/class174/Code05_Bridge2.java +++ b/src/class174/Code05_Bridge2.java @@ -1,6 +1,14 @@ package class174; // 桥梁,C++版 +// 有n个点组成的无向图,依次给出m条无向边 +// u v w : u到v的边,边权为w,边权同时代表限重 +// 如果开车从边上经过,车的重量 <= 边的限重,车才能走过这条边 +// 接下来有q条操作,每条操作的格式如下 +// 操作 1 a b : 编号为a的边,边权变成b +// 操作 2 a b : 编号为a的点是出发点,车重为b,查询车能到达几个不同的点 +// 1 <= n <= 5 * 10^4 0 <= m <= 10^5 +// 1 <= q <= 10^5 1 <= 其他数据 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5443 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From c3170149f9b47df5e9c199062e29ff1a905ab0e0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Jul 2025 15:09:26 +0800 Subject: [PATCH 0428/1170] modify code --- src/class091/Code05_MinimalBatteryPower.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/class091/Code05_MinimalBatteryPower.java b/src/class091/Code05_MinimalBatteryPower.java index e515061ee..36518dc1b 100644 --- a/src/class091/Code05_MinimalBatteryPower.java +++ b/src/class091/Code05_MinimalBatteryPower.java @@ -5,9 +5,20 @@ // 执行所有任务的最少初始电量 // 每一个任务有两个参数,需要耗费的电量、至少多少电量才能开始这个任务 // 返回手机至少需要多少的初始电量,才能执行完所有的任务 -// 来自真实大厂笔试,没有在线测试,对数器验证 +// 测试链接 : https://leetcode.cn/problems/minimum-initial-energy-to-finish-tasks/ public class Code05_MinimalBatteryPower { + // 同学找到了本题的在线测试,把如下minimumEffort方法提交,可以直接通过 + // 测试链接 : https://leetcode.cn/problems/minimum-initial-energy-to-finish-tasks/ + public static int minimumEffort(int[][] tasks) { + Arrays.sort(tasks, (a, b) -> (b[0] - b[1]) - (a[0] - a[1])); + int ans = 0; + for (int[] job : tasks) { + ans = Math.max(ans + job[0], job[1]); + } + return ans; + } + // 暴力递归 // 为了验证 // 时间复杂度O(n!) From 0bc2fff73cb73693f59d255af591d5eb92c5de8e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Jul 2025 15:35:31 +0800 Subject: [PATCH 0429/1170] modify code --- src/class094/Code05_CuttingTree.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/class094/Code05_CuttingTree.java b/src/class094/Code05_CuttingTree.java index 78d245e6a..ddb7b1abf 100644 --- a/src/class094/Code05_CuttingTree.java +++ b/src/class094/Code05_CuttingTree.java @@ -6,9 +6,8 @@ // 你每天最多能砍1棵树,砍下这棵树的收益为: // 这棵树的初始重量 + 这棵树增长到这一天的总增重 // 从第1天开始,你一共有m天可以砍树,返回m天内你获得的最大收益 -// 测试链接 : https://pintia.cn/problem-sets/91827364500/exam/problems/91827367873 -// 请同学们务必参考如下代码中关于输入、输出的处理 -// 这是输入输出处理效率很高的写法 +// 测试链接 : https://pintia.cn/problem-sets/91827364500/exam/problems/type/7?problemSetProblemId=91827367873 +// 如果测试链接失效,去往 ZOJ Problem Set 网站上找第3211题,本题的名字叫 "Dream City" // 提交以下的code,提交时请把类名改成"Main",可以直接通过 import java.io.BufferedReader; From c89bb021734ea807d8f3ab838b781b71393a0e9d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Jul 2025 15:41:19 +0800 Subject: [PATCH 0430/1170] modify code --- src/class094/Code05_CuttingTree.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class094/Code05_CuttingTree.java b/src/class094/Code05_CuttingTree.java index ddb7b1abf..c3919e043 100644 --- a/src/class094/Code05_CuttingTree.java +++ b/src/class094/Code05_CuttingTree.java @@ -7,7 +7,7 @@ // 这棵树的初始重量 + 这棵树增长到这一天的总增重 // 从第1天开始,你一共有m天可以砍树,返回m天内你获得的最大收益 // 测试链接 : https://pintia.cn/problem-sets/91827364500/exam/problems/type/7?problemSetProblemId=91827367873 -// 如果测试链接失效,去往 ZOJ Problem Set 网站上找第3211题,本题的名字叫 "Dream City" +// 如果测试链接失效,搜索 "ZOJ Problem Set" 所在网站,找第3211题 "Dream City" // 提交以下的code,提交时请把类名改成"Main",可以直接通过 import java.io.BufferedReader; From 6be2ed914645e6557c5e5a6cdc26399819f6d2ef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Jul 2025 15:52:13 +0800 Subject: [PATCH 0431/1170] modify code --- src/class063/Code02_SnacksWaysBuyTickets.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class063/Code02_SnacksWaysBuyTickets.java b/src/class063/Code02_SnacksWaysBuyTickets.java index 2907fedfa..81c60e58f 100644 --- a/src/class063/Code02_SnacksWaysBuyTickets.java +++ b/src/class063/Code02_SnacksWaysBuyTickets.java @@ -73,7 +73,7 @@ public static long compute() { return ans; } - // arr[i....e]结束,e再往右不展开了! + // arr[i..e-1]范围上展开,到达e就停止 // 返回值 : ans数组填到了什么位置! public static int f(int i, int e, long s, long w, long[] ans, int j) { if (s > w) { From dc69590aa234bc75d553d36ff65c6bc9fb12eaee Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 11:22:15 +0800 Subject: [PATCH 0432/1170] modify code --- src/class174/Code05_Bridge1.java | 41 ++++++++++++++++++-------------- src/class174/Code05_Bridge2.java | 35 ++++++++++++++++----------- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/class174/Code05_Bridge1.java b/src/class174/Code05_Bridge1.java index 94d029831..23b170736 100644 --- a/src/class174/Code05_Bridge1.java +++ b/src/class174/Code05_Bridge1.java @@ -5,8 +5,8 @@ // u v w : u到v的边,边权为w,边权同时代表限重 // 如果开车从边上经过,车的重量 <= 边的限重,车才能走过这条边 // 接下来有q条操作,每条操作的格式如下 -// 操作 1 a b : 编号为a的边,边权变成b -// 操作 2 a b : 编号为a的点是出发点,车重为b,查询车能到达几个不同的点 +// 操作 1 eid tow : 编号为eid的边,边权变成tow +// 操作 2 nid car : 编号为nid的点出发,车重为car,查询能到达几个不同的点 // 1 <= n <= 5 * 10^4 0 <= m <= 10^5 // 1 <= q <= 10^5 1 <= 其他数据 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5443 @@ -31,8 +31,10 @@ public class Code05_Bridge1 { public static int[] w = new int[MAXM]; public static int[] op = new int[MAXQ]; - public static int[] a = new int[MAXQ]; - public static int[] b = new int[MAXQ]; + public static int[] eid = new int[MAXQ]; + public static int[] tow = new int[MAXQ]; + public static int[] nid = new int[MAXQ]; + public static int[] car = new int[MAXQ]; public static int[] fa = new int[MAXN]; public static int[] siz = new int[MAXN]; @@ -105,9 +107,7 @@ public static void union(int x, int y) { return; } if (siz[fx] < siz[fy]) { - int tmp = fx; - fx = fy; - fy = tmp; + int tmp = fx; fx = fy; fy = tmp; } fa[fy] = fx; siz[fx] += siz[fy]; @@ -130,39 +130,39 @@ public static void compute(int l, int r) { int cntu = 0, cntq = 0; for (int i = l; i <= r; i++) { if (op[arrq[i]] == 1) { - vis[a[arrq[i]]] = true; + vis[eid[arrq[i]]] = true; update[++cntu] = arrq[i]; } else { query[++cntq] = arrq[i]; } } - sort(query, b, 1, cntq); + sort(query, car, 1, cntq); int k = 1; for (int i = 1; i <= cntq; i++) { - for (; k <= m && w[arre[k]] >= b[query[i]]; k++) { + for (; k <= m && w[arre[k]] >= car[query[i]]; k++) { if (!vis[arre[k]]) { union(u[arre[k]], v[arre[k]]); } } opsize = 0; for (int j = 1; j <= cntu; j++) { - curw[a[update[j]]] = w[a[update[j]]]; + curw[eid[update[j]]] = w[eid[update[j]]]; } for (int j = 1; j <= cntu; j++) { if (update[j] < query[i]) { - curw[a[update[j]]] = b[update[j]]; + curw[eid[update[j]]] = tow[update[j]]; } } for (int j = 1; j <= cntu; j++) { - if (curw[a[update[j]]] >= b[query[i]]) { - union(u[a[update[j]]], v[a[update[j]]]); + if (curw[eid[update[j]]] >= car[query[i]]) { + union(u[eid[update[j]]], v[eid[update[j]]]); } } - ans[query[i]] = siz[find(a[query[i]])]; + ans[query[i]] = siz[find(nid[query[i]])]; undo(); } for (int i = 1; i <= cntu; i++) { - w[a[update[i]]] = b[update[i]]; + w[eid[update[i]]] = tow[update[i]]; } int siz1 = 0, siz2 = 0; for (int i = 1; i <= m; i++) { @@ -209,8 +209,13 @@ public static void main(String[] args) throws IOException { q = in.nextInt(); for (int i = 1; i <= q; i++) { op[i] = in.nextInt(); - a[i] = in.nextInt(); - b[i] = in.nextInt(); + if (op[i] == 1) { + eid[i] = in.nextInt(); + tow[i] = in.nextInt(); + } else { + nid[i] = in.nextInt(); + car[i] = in.nextInt(); + } } prepare(); for (int i = 1, l, r; i <= bnum; i++) { diff --git a/src/class174/Code05_Bridge2.java b/src/class174/Code05_Bridge2.java index f0cf9c79e..e964f3a74 100644 --- a/src/class174/Code05_Bridge2.java +++ b/src/class174/Code05_Bridge2.java @@ -5,8 +5,8 @@ // u v w : u到v的边,边权为w,边权同时代表限重 // 如果开车从边上经过,车的重量 <= 边的限重,车才能走过这条边 // 接下来有q条操作,每条操作的格式如下 -// 操作 1 a b : 编号为a的边,边权变成b -// 操作 2 a b : 编号为a的点是出发点,车重为b,查询车能到达几个不同的点 +// 操作 1 eid tow : 编号为eid的边,边权变成tow +// 操作 2 nid car : 编号为nid的点出发,车重为car,查询能到达几个不同的点 // 1 <= n <= 5 * 10^4 0 <= m <= 10^5 // 1 <= q <= 10^5 1 <= 其他数据 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5443 @@ -28,8 +28,10 @@ //int w[MAXM]; // //int op[MAXQ]; -//int a[MAXQ]; -//int b[MAXQ]; +//int eid[MAXQ]; +//int tow[MAXQ]; +//int nid[MAXQ]; +//int car[MAXQ]; // //int fa[MAXN]; //int siz[MAXN]; @@ -105,39 +107,39 @@ // int cntu = 0, cntq = 0; // for (int i = l; i <= r; i++) { // if (op[arrq[i]] == 1) { -// vis[a[arrq[i]]] = true; +// vis[eid[arrq[i]]] = true; // update[++cntu] = arrq[i]; // } else { // query[++cntq] = arrq[i]; // } // } -// sort(query + 1, query + cntq + 1, [&](int x, int y) { return b[x] > b[y]; }); +// sort(query + 1, query + cntq + 1, [&](int x, int y) { return car[x] > car[y]; }); // int k = 1; // for (int i = 1; i <= cntq; i++) { -// for (; k <= m && w[arre[k]] >= b[query[i]]; k++) { +// for (; k <= m && w[arre[k]] >= car[query[i]]; k++) { // if (!vis[arre[k]]) { // Union(u[arre[k]], v[arre[k]]); // } // } // opsize = 0; // for (int j = 1; j <= cntu; j++) { -// curw[a[update[j]]] = w[a[update[j]]]; +// curw[eid[update[j]]] = w[eid[update[j]]]; // } // for (int j = 1; j <= cntu; j++) { // if (update[j] < query[i]) { -// curw[a[update[j]]] = b[update[j]]; +// curw[eid[update[j]]] = tow[update[j]]; // } // } // for (int j = 1; j <= cntu; j++) { -// if (curw[a[update[j]]] >= b[query[i]]) { -// Union(u[a[update[j]]], v[a[update[j]]]); +// if (curw[eid[update[j]]] >= car[query[i]]) { +// Union(u[eid[update[j]]], v[eid[update[j]]]); // } // } -// ans[query[i]] = siz[find(a[query[i]])]; +// ans[query[i]] = siz[find(nid[query[i]])]; // undo(); // } // for (int i = 1; i <= cntu; i++) { -// w[a[update[i]]] = b[update[i]]; +// w[eid[update[i]]] = tow[update[i]]; // } // int siz1 = 0, siz2 = 0; // for (int i = 1; i <= m; i++) { @@ -172,7 +174,12 @@ // } // cin >> q; // for (int i = 1; i <= q; i++) { -// cin >> op[i] >> a[i] >> b[i]; +// cin >> op[i]; +// if (op[i] == 1) { +// cin >> eid[i] >> tow[i]; +// } else { +// cin >> nid[i] >> car[i]; +// } // } // prepare(); // for (int i = 1, l, r; i <= bnum; i++) { From 20031d1640f53e9f4ab0bfae26d6dcac6d475f92 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 11:35:10 +0800 Subject: [PATCH 0433/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 2 +- src/class174/Code03_ColorfulWorld2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 23d03e647..fc7a6eae6 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -6,7 +6,7 @@ // 操作 2 l r x : arr[l..l]范围上,查询x出现的次数 // 1 <= n <= 10^6 // 1 <= m <= 5 * 10^5 -// 0 <= arr[i] <= 10^5 +// 0 <= arr[i]、x <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4117 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index d08eb4d41..3d3789c59 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -6,7 +6,7 @@ // 操作 2 l r x : arr[l..l]范围上,查询x出现的次数 // 1 <= n <= 10^6 // 1 <= m <= 5 * 10^5 -// 0 <= arr[i] <= 10^5 +// 0 <= arr[i]、x <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4117 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 6454f4a61698ede7a1c0ad24069f817a206bd7fd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 12:20:56 +0800 Subject: [PATCH 0434/1170] modify code --- src/class174/{Code05_Bridge1.java => Code04_Bridge1.java} | 2 +- src/class174/{Code05_Bridge2.java => Code04_Bridge2.java} | 0 src/class174/{Code04_Lcm1.java => Code05_Lcm1.java} | 2 +- src/class174/{Code04_Lcm2.java => Code05_Lcm2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class174/{Code05_Bridge1.java => Code04_Bridge1.java} (99%) rename src/class174/{Code05_Bridge2.java => Code04_Bridge2.java} (100%) rename src/class174/{Code04_Lcm1.java => Code05_Lcm1.java} (99%) rename src/class174/{Code04_Lcm2.java => Code05_Lcm2.java} (100%) diff --git a/src/class174/Code05_Bridge1.java b/src/class174/Code04_Bridge1.java similarity index 99% rename from src/class174/Code05_Bridge1.java rename to src/class174/Code04_Bridge1.java index 23b170736..fffe7bbdd 100644 --- a/src/class174/Code05_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -18,7 +18,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_Bridge1 { +public class Code04_Bridge1 { public static int MAXN = 50001; public static int MAXM = 100001; diff --git a/src/class174/Code05_Bridge2.java b/src/class174/Code04_Bridge2.java similarity index 100% rename from src/class174/Code05_Bridge2.java rename to src/class174/Code04_Bridge2.java diff --git a/src/class174/Code04_Lcm1.java b/src/class174/Code05_Lcm1.java similarity index 99% rename from src/class174/Code04_Lcm1.java rename to src/class174/Code05_Lcm1.java index 91a1bfc97..6cd909d2b 100644 --- a/src/class174/Code04_Lcm1.java +++ b/src/class174/Code05_Lcm1.java @@ -16,7 +16,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_Lcm1 { +public class Code05_Lcm1 { public static int MAXN = 50001; public static int MAXM = 100001; diff --git a/src/class174/Code04_Lcm2.java b/src/class174/Code05_Lcm2.java similarity index 100% rename from src/class174/Code04_Lcm2.java rename to src/class174/Code05_Lcm2.java From eac92550b07e667231872066de5b517698fb169d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 12:36:16 +0800 Subject: [PATCH 0435/1170] modify code --- src/class174/Code02_MagicGirl1.java | 18 +++++++++--------- src/class174/Code02_MagicGirl2.java | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 531c6fd12..fb67d2dd5 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -20,11 +20,10 @@ public class Code02_MagicGirl1 { - public static int MAXN = 300002; + public static int MAXN = 300002; // 双向链表需要n+1下标 public static int MAXB = 601; - public static int POW2 = 9; - public static int BLEN = 1 << POW2; - public static int OFFSET = BLEN - 1; + public static int POW = 9; // 块长为(2的POW次方),/ 块长时,>> POW即可 + public static int OFFSET = (1 << POW) - 1; // % 块长时, & OFFSET即可 public static int n, m; public static int[] arr = new int[MAXN]; @@ -85,9 +84,9 @@ public static void radixSort() { for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] & OFFSET]--] = arrq[i]; for (int i = 1; i <= siz; i++) arrq[i] = help[i]; Arrays.fill(cntv, 0); - for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] >> POW2]++; + for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] >> POW]++; for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; - for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] >> POW2]--] = arrq[i]; + for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] >> POW]--] = arrq[i]; for (int i = 1; i <= siz; i++) arrq[i] = help[i]; } @@ -190,10 +189,11 @@ public static void main(String[] args) throws Exception { v[i] = in.nextInt(); } } - int bnum = (n + BLEN - 1) / BLEN; + int blen = 1 << POW; + int bnum = (n + blen - 1) / blen; for (int i = 1, l, r; i <= bnum; i++) { - l = (i - 1) * BLEN + 1; - r = Math.min(i * BLEN, n); + l = (i - 1) * blen + 1; + r = Math.min(i * blen, n); compute(l, r); } for (int i = 1; i <= m; i++) { diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index 3c4ab05e6..4cdad00cc 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -16,9 +16,8 @@ // //const int MAXN = 300002; //const int MAXB = 601; -//const int POW2 = 9; -//const int BLEN = 1 << POW2; -//const int OFFSET = BLEN - 1; +//const int POW = 9; +//const int OFFSET = (1 << POW) - 1; //int n, m; // //int arr[MAXN]; @@ -62,9 +61,9 @@ // for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] & OFFSET]--] = arrq[i]; // for (int i = 1; i <= siz; i++) arrq[i] = help[i]; // fill(cntv, cntv + MAXB, 0); -// for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] >> POW2]++; +// for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] >> POW]++; // for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; -// for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] >> POW2]--] = arrq[i]; +// for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] >> POW]--] = arrq[i]; // for (int i = 1; i <= siz; i++) arrq[i] = help[i]; //} // @@ -163,10 +162,11 @@ // cin >> y[i] >> v[i]; // } // } -// int bnum = (n + BLEN - 1) / BLEN; +// int blen = 1 << POW; +// int bnum = (n + blen - 1) / blen; // for (int i = 1, l, r; i <= bnum; i++) { -// l = (i - 1) * BLEN + 1; -// r = min(i * BLEN, n); +// l = (i - 1) * blen + 1; +// r = min(i * blen, n); // compute(l, r); // } // for (int i = 1; i <= m; i++) { From 81a11d48f9a8911b7781f63cf63133924fed9ed5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 12:43:58 +0800 Subject: [PATCH 0436/1170] modify code --- src/class174/Code01_FutureDiary1.java | 2 +- src/class174/Code01_FutureDiary2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index f10d4cc72..5d4f6e600 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -23,7 +23,6 @@ public class Code01_FutureDiary1 { public static int MAXB = 401; public static int n, m; public static int[] arr = new int[MAXN]; - public static int[] tmp = new int[MAXN]; public static int blen, bnum; public static int[] bi = new int[MAXN]; @@ -34,6 +33,7 @@ public class Code01_FutureDiary1 { public static int[][] valrt = new int[MAXB][MAXN]; public static int[][] rtval = new int[MAXB][MAXN]; + public static int[] tmp = new int[MAXN]; public static int[][] sum1 = new int[MAXB][MAXB]; public static int[][] sum2 = new int[MAXB][MAXN]; public static int[] cnt1 = new int[MAXB]; diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 8f4e292b1..573dda9c5 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -36,7 +36,6 @@ //const int MAXB = 401; //int n, m; //int arr[MAXN]; -//int tmp[MAXN]; // //int blen, bnum; //int bi[MAXN]; @@ -47,6 +46,7 @@ //int valrt[MAXB][MAXN]; //int rtval[MAXB][MAXN]; // +//int tmp[MAXN]; //int sum1[MAXB][MAXB]; //int sum2[MAXB][MAXN]; //int cnt1[MAXB]; From 87f3c8e98d2db26710d64c26737a5f1028a6dca4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 13:02:33 +0800 Subject: [PATCH 0437/1170] modify code --- src/class085/FollowUpWindy.java | 111 ++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/class085/FollowUpWindy.java diff --git a/src/class085/FollowUpWindy.java b/src/class085/FollowUpWindy.java new file mode 100644 index 000000000..b34c73bc7 --- /dev/null +++ b/src/class085/FollowUpWindy.java @@ -0,0 +1,111 @@ +package class085; + +// windy数,加强版 +// 课上没有讲这个文件,这是windy数的加强版测试 +// 需要改成long类型,除此之外和课上讲的完全一样 +// 测试链接 : https://www.luogu.com.cn/problem/P13085 +// 提交以下的code,提交时请把类名改成"Main",可以直接通过 + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.StreamTokenizer; + +public class FollowUpWindy { + + public static int MAXLEN = 21; + + public static long[][][] dp = new long[MAXLEN][11][2]; + + public static void build(int len) { + for (int i = 0; i <= len; i++) { + for (int j = 0; j <= 10; j++) { + dp[i][j][0] = -1; + dp[i][j][1] = -1; + } + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StreamTokenizer in = new StreamTokenizer(br); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + while (in.nextToken() != StreamTokenizer.TT_EOF) { + long a = (long) in.nval; + in.nextToken(); + long b = (long) in.nval; + out.println(compute(a, b)); + } + out.flush(); + out.close(); + br.close(); + } + + public static long compute(long a, long b) { + return cnt(b) - cnt(a - 1); + } + + public static long cnt(long num) { + if (num == 0) { + return 1; + } + int len = 1; + long offset = 1; + long tmp = num / 10; + while (tmp > 0) { + len++; + offset *= 10; + tmp /= 10; + } + build(len); + return f(num, offset, len, 10, 0); + } + + public static long f(long num, long offset, int len, int pre, int free) { + if (len == 0) { + return 1; + } + if (dp[len][pre][free] != -1) { + return dp[len][pre][free]; + } + int cur = (int) (num / offset % 10); + long ans = 0; + if (free == 0) { + if (pre == 10) { + ans += f(num, offset / 10, len - 1, 10, 1); + for (int i = 1; i < cur; i++) { + ans += f(num, offset / 10, len - 1, i, 1); + } + ans += f(num, offset / 10, len - 1, cur, 0); + } else { + for (int i = 0; i <= 9; i++) { + if (i <= pre - 2 || i >= pre + 2) { + if (i < cur) { + ans += f(num, offset / 10, len - 1, i, 1); + } else if (i == cur) { + ans += f(num, offset / 10, len - 1, cur, 0); + } + } + } + } + } else { + if (pre == 10) { + ans += f(num, offset / 10, len - 1, 10, 1); + for (int i = 1; i <= 9; i++) { + ans += f(num, offset / 10, len - 1, i, 1); + } + } else { + for (int i = 0; i <= 9; i++) { + if (i <= pre - 2 || i >= pre + 2) { + ans += f(num, offset / 10, len - 1, i, 1); + } + } + } + } + dp[len][pre][free] = ans; + return ans; + } + +} From 16efa12f29f41b38cfc6a46d283667874dfaf1f8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 13:41:00 +0800 Subject: [PATCH 0438/1170] modify code --- src/class174/Code01_FutureDiary1.java | 4 ++-- src/class174/Code01_FutureDiary2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 5d4f6e600..f93fcce45 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -59,7 +59,7 @@ public static void down(int b) { } } - public static void xToy(int b, int x, int y) { + public static void xtoy(int b, int x, int y) { valrt[b][y] = valrt[b][x]; rtval[b][valrt[b][x]] = y; valrt[b][x] = 0; @@ -103,7 +103,7 @@ public static void update(int l, int r, int x, int y) { sum1[b][bi[x]] -= sum2[b][x]; sum2[b][y] += sum2[b][x]; sum2[b][x] = 0; - xToy(b, x, y); + xtoy(b, x, y); } } } diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 573dda9c5..6f6be3e08 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -73,7 +73,7 @@ // } //} // -//void xToy(int b, int x, int y) { +//void xtoy(int b, int x, int y) { // valrt[b][y] = valrt[b][x]; // rtval[b][valrt[b][x]] = y; // valrt[b][x] = 0; @@ -117,7 +117,7 @@ // sum1[b][bi[x]] -= sum2[b][x]; // sum2[b][y] += sum2[b][x]; // sum2[b][x] = 0; -// xToy(b, x, y); +// xtoy(b, x, y); // } // } // } From e786957c39e58764a6411a1538e5f20e5ddd4fe5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 14:09:48 +0800 Subject: [PATCH 0439/1170] modify code --- src/class174/Code01_FutureDiary1.java | 42 +++++++++++++++++++++++---- src/class174/Code01_FutureDiary2.java | 12 ++++---- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index f93fcce45..448bf409c 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -29,16 +29,25 @@ public class Code01_FutureDiary1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; + // idxrt[i]表示下标i,在归属的块中,对应的根编号 + // valrt[b][v]表示序列块b中的数值v,对应的根编号 + // rtval[b][i]表示序列块b中的根编号i,对应的数值 public static int[] idxrt = new int[MAXN]; public static int[][] valrt = new int[MAXB][MAXN]; public static int[][] rtval = new int[MAXB][MAXN]; + // tmp用于临时排序找第k小的值 + // sum1[b][i]表示序列块b中,来自值域块i的数字有几个 + // sum2[b][v]表示序列块b中,数字v有几个 + // cnt1[i]表示遍历过程中,统计值域块i的数字有几个 + // cnt2[v]表示遍历过程中,统计数字v有几个 public static int[] tmp = new int[MAXN]; public static int[][] sum1 = new int[MAXB][MAXB]; public static int[][] sum2 = new int[MAXB][MAXN]; public static int[] cnt1 = new int[MAXB]; public static int[] cnt2 = new int[MAXN]; + // 序列第b块中,根据arr中的值建立起,idxrt、valrt[b]、rtval[b] public static void build(int b) { for (int i = 1; i <= blen; i++) { valrt[b][rtval[b][i]] = 0; @@ -53,18 +62,14 @@ public static void build(int b) { } } + // 序列第b块中,有些位置的值已经改了,让改动写入arr public static void down(int b) { for (int i = bl[b]; i <= br[b]; i++) { arr[i] = rtval[b][idxrt[i]]; } } - public static void xtoy(int b, int x, int y) { - valrt[b][y] = valrt[b][x]; - rtval[b][valrt[b][x]] = y; - valrt[b][x] = 0; - } - + // 序列[l..r]范围上,目前既有x又有y,把所有x改成y public static void innerUpdate(int l, int r, int x, int y) { down(bi[l]); for (int i = l; i <= r; i++) { @@ -79,10 +84,18 @@ public static void innerUpdate(int l, int r, int x, int y) { build(bi[l]); } + // 序列第b块中,目前没有y这个数值,把块中所有的x改成y + public static void xtoy(int b, int x, int y) { + valrt[b][y] = valrt[b][x]; + rtval[b][valrt[b][x]] = y; + valrt[b][x] = 0; + } + public static void update(int l, int r, int x, int y) { if (x == y || (sum2[bi[r]][x] - sum2[bi[l] - 1][x] == 0)) { return; } + // 前缀统计变成当前块统计 for (int b = bi[n]; b >= bi[l]; b--) { sum1[b][bi[x]] -= sum1[b - 1][bi[x]]; sum1[b][bi[y]] -= sum1[b - 1][bi[y]]; @@ -97,6 +110,8 @@ public static void update(int l, int r, int x, int y) { for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { if (sum2[b][x] != 0) { if (sum2[b][y] != 0) { + // 可以证明 + // 整块发生innerUpdate的次数 <= 根号n innerUpdate(bl[b], br[b], x, y); } else { sum1[b][bi[y]] += sum2[b][x]; @@ -108,6 +123,7 @@ public static void update(int l, int r, int x, int y) { } } } + // 当前块统计变回前缀统计 for (int b = bi[l]; b <= bi[n]; b++) { sum1[b][bi[x]] += sum1[b - 1][bi[x]]; sum1[b][bi[y]] += sum1[b - 1][bi[y]]; @@ -128,16 +144,19 @@ public static int query(int l, int r, int k) { } else { down(bi[l]); down(bi[r]); + // 左散块中,每种值的词频统计 for (int i = l; i <= br[bi[l]]; i++) { cnt1[bi[arr[i]]]++; cnt2[arr[i]]++; } + // 右散块中,每种值的词频统计 for (int i = bl[bi[r]]; i <= r; i++) { cnt1[bi[arr[i]]]++; cnt2[arr[i]]++; } int sumCnt = 0; int vblock = 0; + // 先定位第k小的数,来自值域的哪个块,vblock for (int b = 1; b <= bi[MAXN - 1]; b++) { int blockCnt = cnt1[b] + sum1[bi[r] - 1][b] - sum1[bi[l]][b]; if (sumCnt + blockCnt < k) { @@ -147,6 +166,7 @@ public static int query(int l, int r, int k) { break; } } + // 再定位第k小的数,来自值域第vblock块中,具体什么数字 for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { int valCnt = cnt2[v] + sum2[bi[r] - 1][v] - sum2[bi[l]][v]; if (sumCnt + valCnt >= k) { @@ -156,9 +176,11 @@ public static int query(int l, int r, int k) { sumCnt += valCnt; } } + // 左散块的词频统计清空 for (int i = l; i <= br[bi[l]]; i++) { cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; } + // 右散块的词频统计清空 for (int i = bl[bi[r]]; i <= r; i++) { cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; } @@ -169,14 +191,22 @@ public static int query(int l, int r, int k) { public static void prepare() { blen = (int) Math.sqrt(n); bnum = (n + blen - 1) / blen; + // i一定要枚举[1, MAXN) + // 因为不仅序列要分块,值域也要分块 + // bi[i]可以查询下标i来自哪个序列块 + // bi[v]也可查询数字v来自哪个值域块 for (int i = 1; i < MAXN; i++) { bi[i] = (i - 1) / blen + 1; } + // bl[i]表示下标第i块的左边界 + // br[i]表示下标第i块的右边界 + // bl、br 仅用于序列分块 for (int i = 1; i <= bnum; i++) { bl[i] = (i - 1) * blen + 1; br[i] = Math.min(i * blen, n); build(i); } + // 初始建立sum1、sum2,都表示前缀信息 for (int i = 1; i <= bnum; i++) { for (int j = 1; j < MAXB; j++) { sum1[i][j] = sum1[i - 1][j]; diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 6f6be3e08..f0d7d3056 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -73,12 +73,6 @@ // } //} // -//void xtoy(int b, int x, int y) { -// valrt[b][y] = valrt[b][x]; -// rtval[b][valrt[b][x]] = y; -// valrt[b][x] = 0; -//} -// //void innerUpdate(int l, int r, int x, int y) { // down(bi[l]); // for (int i = l; i <= r; i++) { @@ -93,6 +87,12 @@ // build(bi[l]); //} // +//void xtoy(int b, int x, int y) { +// valrt[b][y] = valrt[b][x]; +// rtval[b][valrt[b][x]] = y; +// valrt[b][x] = 0; +//} +// //void update(int l, int r, int x, int y) { // if (x == y || (sum2[bi[r]][x] - sum2[bi[l] - 1][x] == 0)) { // return; From 4accfb8734fc165786f74485046031d66666f546 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 14:26:03 +0800 Subject: [PATCH 0440/1170] modify code --- src/class174/Code01_FutureDiary1.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 448bf409c..c8bbbbb6d 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -32,15 +32,16 @@ public class Code01_FutureDiary1 { // idxrt[i]表示下标i,在归属的块中,对应的根编号 // valrt[b][v]表示序列块b中的数值v,对应的根编号 // rtval[b][i]表示序列块b中的根编号i,对应的数值 + // 绝不会向上跳跃多次才能找到根编号,很像并查集,其实不是 public static int[] idxrt = new int[MAXN]; public static int[][] valrt = new int[MAXB][MAXN]; public static int[][] rtval = new int[MAXB][MAXN]; // tmp用于临时排序找第k小的值 - // sum1[b][i]表示序列块b中,来自值域块i的数字有几个 - // sum2[b][v]表示序列块b中,数字v有几个 - // cnt1[i]表示遍历过程中,统计值域块i的数字有几个 - // cnt2[v]表示遍历过程中,统计数字v有几个 + // sum1[b][i]表示前b个序列块中,来自值域块i的数字有几个 + // sum2[b][v]表示前b个序列块中,数字v有几个 + // cnt1[i]表示遍历散块,统计值域块i的数字有几个 + // cnt2[v]表示遍历散块,统计数字v有几个 public static int[] tmp = new int[MAXN]; public static int[][] sum1 = new int[MAXB][MAXB]; public static int[][] sum2 = new int[MAXB][MAXN]; From 5a4ede3bd191fb6c23cf71c22517c514b0ab1440 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 14:28:21 +0800 Subject: [PATCH 0441/1170] modify code --- src/class174/Code01_FutureDiary1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index c8bbbbb6d..f0c53e4c0 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -112,7 +112,7 @@ public static void update(int l, int r, int x, int y) { if (sum2[b][x] != 0) { if (sum2[b][y] != 0) { // 可以证明 - // 整块发生innerUpdate的次数 <= 根号n + // 整块发生innerUpdate的次数 <= 块长 innerUpdate(bl[b], br[b], x, y); } else { sum1[b][bi[y]] += sum2[b][x]; From 3043dfbdc227308ae880e572cb8193a7c0f7b8b5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 14:37:00 +0800 Subject: [PATCH 0442/1170] modify code --- src/class174/Code01_FutureDiary1.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index f0c53e4c0..8dc852b80 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -111,8 +111,7 @@ public static void update(int l, int r, int x, int y) { for (int b = bi[l] + 1; b <= bi[r] - 1; b++) { if (sum2[b][x] != 0) { if (sum2[b][y] != 0) { - // 可以证明 - // 整块发生innerUpdate的次数 <= 块长 + // 整块更新时,调用innerUpdate的次数 <= 块长 innerUpdate(bl[b], br[b], x, y); } else { sum1[b][bi[y]] += sum2[b][x]; From c31998ca2b2ed0ac505948130a7cdb2c4c3de866 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 15:09:44 +0800 Subject: [PATCH 0443/1170] modify code --- src/class174/Code01_FutureDiary1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 8dc852b80..7151686b4 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -93,6 +93,7 @@ public static void xtoy(int b, int x, int y) { } public static void update(int l, int r, int x, int y) { + // 必要的剪枝 if (x == y || (sum2[bi[r]][x] - sum2[bi[l] - 1][x] == 0)) { return; } From b2bc59b44537a2a0718c6e0db520e3c421f9299a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 16:01:45 +0800 Subject: [PATCH 0444/1170] modify code --- src/class174/Code01_FutureDiary1.java | 95 +++++++++++++-------------- src/class174/Code01_FutureDiary2.java | 83 ++++++++++++----------- 2 files changed, 89 insertions(+), 89 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 7151686b4..d0828a44b 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -15,7 +15,6 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.util.Arrays; public class Code01_FutureDiary1 { @@ -37,19 +36,17 @@ public class Code01_FutureDiary1 { public static int[][] valrt = new int[MAXB][MAXN]; public static int[][] rtval = new int[MAXB][MAXN]; - // tmp用于临时排序找第k小的值 // sum1[b][i]表示前b个序列块中,来自值域块i的数字有几个 // sum2[b][v]表示前b个序列块中,数字v有几个 // cnt1[i]表示遍历散块,统计值域块i的数字有几个 // cnt2[v]表示遍历散块,统计数字v有几个 - public static int[] tmp = new int[MAXN]; public static int[][] sum1 = new int[MAXB][MAXB]; public static int[][] sum2 = new int[MAXB][MAXN]; public static int[] cnt1 = new int[MAXB]; public static int[] cnt2 = new int[MAXN]; // 序列第b块中,根据arr中的值建立起,idxrt、valrt[b]、rtval[b] - public static void build(int b) { + public static void buildSet(int b) { for (int i = 1; i <= blen; i++) { valrt[b][rtval[b][i]] = 0; } @@ -82,7 +79,7 @@ public static void innerUpdate(int l, int r, int x, int y) { arr[i] = y; } } - build(bi[l]); + buildSet(bi[l]); } // 序列第b块中,目前没有y这个数值,把块中所有的x改成y @@ -133,59 +130,57 @@ public static void update(int l, int r, int x, int y) { } } + public static void buildCnt(int l, int r) { + for (int i = l; i <= r; i++) { + cnt1[bi[arr[i]]]++; + cnt2[arr[i]]++; + } + } + + public static void clearCnt(int l, int r) { + for (int i = l; i <= r; i++) { + cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; + } + } + public static int query(int l, int r, int k) { int ans = 0; - if (bi[l] == bi[r]) { + boolean inner = bi[l] == bi[r]; + if (inner) { down(bi[l]); - for (int i = l; i <= r; i++) { - tmp[i] = arr[i]; - } - Arrays.sort(tmp, l, r + 1); - ans = tmp[l + k - 1]; + buildCnt(l, r); } else { down(bi[l]); down(bi[r]); - // 左散块中,每种值的词频统计 - for (int i = l; i <= br[bi[l]]; i++) { - cnt1[bi[arr[i]]]++; - cnt2[arr[i]]++; - } - // 右散块中,每种值的词频统计 - for (int i = bl[bi[r]]; i <= r; i++) { - cnt1[bi[arr[i]]]++; - cnt2[arr[i]]++; - } - int sumCnt = 0; - int vblock = 0; - // 先定位第k小的数,来自值域的哪个块,vblock - for (int b = 1; b <= bi[MAXN - 1]; b++) { - int blockCnt = cnt1[b] + sum1[bi[r] - 1][b] - sum1[bi[l]][b]; - if (sumCnt + blockCnt < k) { - sumCnt += blockCnt; - } else { - vblock = b; - break; - } - } - // 再定位第k小的数,来自值域第vblock块中,具体什么数字 - for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { - int valCnt = cnt2[v] + sum2[bi[r] - 1][v] - sum2[bi[l]][v]; - if (sumCnt + valCnt >= k) { - ans = v; - break; - } else { - sumCnt += valCnt; - } - } - // 左散块的词频统计清空 - for (int i = l; i <= br[bi[l]]; i++) { - cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; + buildCnt(l, br[bi[l]]); + buildCnt(bl[bi[r]], r); + } + int sumCnt = 0; + int vblock = 0; + for (int b = 1; b <= bi[MAXN - 1]; b++) { + int blockCnt = cnt1[b] + (inner ? 0 : sum1[bi[r] - 1][b] - sum1[bi[l]][b]); + if (sumCnt + blockCnt < k) { + sumCnt += blockCnt; + } else { + vblock = b; + break; } - // 右散块的词频统计清空 - for (int i = bl[bi[r]]; i <= r; i++) { - cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; + } + for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { + int valCnt = cnt2[v] + (inner ? 0 : sum2[bi[r] - 1][v] - sum2[bi[l]][v]); + if (sumCnt + valCnt >= k) { + ans = v; + break; + } else { + sumCnt += valCnt; } } + if (inner) { + clearCnt(l, r); + } else { + clearCnt(l, br[bi[l]]); + clearCnt(bl[bi[r]], r); + } return ans; } @@ -205,7 +200,7 @@ public static void prepare() { for (int i = 1; i <= bnum; i++) { bl[i] = (i - 1) * blen + 1; br[i] = Math.min(i * blen, n); - build(i); + buildSet(i); } // 初始建立sum1、sum2,都表示前缀信息 for (int i = 1; i <= bnum; i++) { diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index f0d7d3056..8cbd94506 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -46,13 +46,12 @@ //int valrt[MAXB][MAXN]; //int rtval[MAXB][MAXN]; // -//int tmp[MAXN]; //int sum1[MAXB][MAXB]; //int sum2[MAXB][MAXN]; //int cnt1[MAXB]; //int cnt2[MAXN]; // -//void build(int b) { +//void buildSet(int b) { // for (int i = 1; i <= blen; i++) { // valrt[b][rtval[b][i]] = 0; // } @@ -84,7 +83,7 @@ // arr[i] = y; // } // } -// build(bi[l]); +// buildSet(bi[l]); //} // //void xtoy(int b, int x, int y) { @@ -130,50 +129,56 @@ // } //} // +//void buildCnt(int l, int r) { +// for (int i = l; i <= r; i++) { +// cnt1[bi[arr[i]]]++; +// cnt2[arr[i]]++; +// } +//} +// +//void clearCnt(int l, int r) { +// for (int i = l; i <= r; i++) { +// cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; +// } +//} +// //int query(int l, int r, int k) { // int ans = 0; -// if (bi[l] == bi[r]) { +// bool inner = bi[l] == bi[r]; +// if (inner) { // down(bi[l]); -// for (int i = l; i <= r; i++) { -// tmp[i] = arr[i]; -// } -// sort(tmp + l, tmp + r + 1); -// ans = tmp[l + k - 1]; +// buildCnt(l, r); // } else { // down(bi[l]); // down(bi[r]); -// for (int i = l; i <= br[bi[l]]; i++) { -// cnt1[bi[arr[i]]]++; -// cnt2[arr[i]]++; -// } -// for (int i = bl[bi[r]]; i <= r; i++) { -// cnt1[bi[arr[i]]]++; -// cnt2[arr[i]]++; -// } -// int sumCnt = 0, vblock = 0; -// for (int b = 1; b <= bi[MAXN - 1]; b++) { -// int blockCnt = cnt1[b] + sum1[bi[r] - 1][b] - sum1[bi[l]][b]; -// if (sumCnt + blockCnt < k) { -// sumCnt += blockCnt; -// } else { -// vblock = b; -// break; -// } +// buildCnt(l, br[bi[l]]); +// buildCnt(bl[bi[r]], r); +// } +// int sumCnt = 0; +// int vblock = 0; +// for (int b = 1; b <= bi[MAXN - 1]; b++) { +// int blockCnt = cnt1[b] + (inner ? 0 : sum1[bi[r] - 1][b] - sum1[bi[l]][b]); +// if (sumCnt + blockCnt < k) { +// sumCnt += blockCnt; +// } else { +// vblock = b; +// break; // } -// for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { -// int valCnt = cnt2[v] + sum2[bi[r] - 1][v] - sum2[bi[l]][v]; -// if (sumCnt + valCnt >= k) { -// ans = v; -// break; -// } +// } +// for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { +// int valCnt = cnt2[v] + (inner ? 0 : sum2[bi[r] - 1][v] - sum2[bi[l]][v]); +// if (sumCnt + valCnt >= k) { +// ans = v; +// break; +// } else { // sumCnt += valCnt; // } -// for (int i = l; i <= br[bi[l]]; i++) { -// cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; -// } -// for (int i = bl[bi[r]]; i <= r; i++) { -// cnt1[bi[arr[i]]] = cnt2[arr[i]] = 0; -// } +// } +// if (inner) { +// clearCnt(l, r); +// } else { +// clearCnt(l, br[bi[l]]); +// clearCnt(bl[bi[r]], r); // } // return ans; //} @@ -187,7 +192,7 @@ // for (int i = 1; i <= bnum; i++) { // bl[i] = (i - 1) * blen + 1; // br[i] = min(i * blen, n); -// build(i); +// buildSet(i); // } // for (int i = 1; i <= bnum; i++) { // for (int j = 1; j < MAXB; j++) { From 640e6100626b387bda58c04790d916d341e21da5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 16:09:01 +0800 Subject: [PATCH 0445/1170] modify code --- src/class174/Code01_FutureDiary1.java | 16 +++++++++------- src/class174/Code01_FutureDiary2.java | 14 +++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index d0828a44b..8416a3428 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -157,22 +157,24 @@ public static int query(int l, int r, int k) { } int sumCnt = 0; int vblock = 0; + // 定位第k小的数字,来自哪个值域块 for (int b = 1; b <= bi[MAXN - 1]; b++) { - int blockCnt = cnt1[b] + (inner ? 0 : sum1[bi[r] - 1][b] - sum1[bi[l]][b]); - if (sumCnt + blockCnt < k) { - sumCnt += blockCnt; - } else { + int cnt = cnt1[b] + (inner ? 0 : sum1[bi[r] - 1][b] - sum1[bi[l]][b]); + if (sumCnt + cnt >= k) { vblock = b; break; + } else { + sumCnt += cnt; } } + // 定位第k小的数字,来自值域块的哪个数字 for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { - int valCnt = cnt2[v] + (inner ? 0 : sum2[bi[r] - 1][v] - sum2[bi[l]][v]); - if (sumCnt + valCnt >= k) { + int cnt = cnt2[v] + (inner ? 0 : sum2[bi[r] - 1][v] - sum2[bi[l]][v]); + if (sumCnt + cnt >= k) { ans = v; break; } else { - sumCnt += valCnt; + sumCnt += cnt; } } if (inner) { diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 8cbd94506..1234a1f3c 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -157,21 +157,21 @@ // int sumCnt = 0; // int vblock = 0; // for (int b = 1; b <= bi[MAXN - 1]; b++) { -// int blockCnt = cnt1[b] + (inner ? 0 : sum1[bi[r] - 1][b] - sum1[bi[l]][b]); -// if (sumCnt + blockCnt < k) { -// sumCnt += blockCnt; -// } else { +// int cnt = cnt1[b] + (inner ? 0 : sum1[bi[r] - 1][b] - sum1[bi[l]][b]); +// if (sumCnt + cnt >= k) { // vblock = b; // break; +// } else { +// sumCnt += cnt; // } // } // for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { -// int valCnt = cnt2[v] + (inner ? 0 : sum2[bi[r] - 1][v] - sum2[bi[l]][v]); -// if (sumCnt + valCnt >= k) { +// int cnt = cnt2[v] + (inner ? 0 : sum2[bi[r] - 1][v] - sum2[bi[l]][v]); +// if (sumCnt + cnt >= k) { // ans = v; // break; // } else { -// sumCnt += valCnt; +// sumCnt += cnt; // } // } // if (inner) { From 49f95c330d295f57ae96d2f2acad8595a54a3608 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 16:15:10 +0800 Subject: [PATCH 0446/1170] modify code --- src/class174/Code01_FutureDiary1.java | 14 +++++++------- src/class174/Code01_FutureDiary2.java | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 8416a3428..738c37658 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -46,7 +46,7 @@ public class Code01_FutureDiary1 { public static int[] cnt2 = new int[MAXN]; // 序列第b块中,根据arr中的值建立起,idxrt、valrt[b]、rtval[b] - public static void buildSet(int b) { + public static void build(int b) { for (int i = 1; i <= blen; i++) { valrt[b][rtval[b][i]] = 0; } @@ -79,7 +79,7 @@ public static void innerUpdate(int l, int r, int x, int y) { arr[i] = y; } } - buildSet(bi[l]); + build(bi[l]); } // 序列第b块中,目前没有y这个数值,把块中所有的x改成y @@ -130,7 +130,7 @@ public static void update(int l, int r, int x, int y) { } } - public static void buildCnt(int l, int r) { + public static void addCnt(int l, int r) { for (int i = l; i <= r; i++) { cnt1[bi[arr[i]]]++; cnt2[arr[i]]++; @@ -148,12 +148,12 @@ public static int query(int l, int r, int k) { boolean inner = bi[l] == bi[r]; if (inner) { down(bi[l]); - buildCnt(l, r); + addCnt(l, r); } else { down(bi[l]); down(bi[r]); - buildCnt(l, br[bi[l]]); - buildCnt(bl[bi[r]], r); + addCnt(l, br[bi[l]]); + addCnt(bl[bi[r]], r); } int sumCnt = 0; int vblock = 0; @@ -202,7 +202,7 @@ public static void prepare() { for (int i = 1; i <= bnum; i++) { bl[i] = (i - 1) * blen + 1; br[i] = Math.min(i * blen, n); - buildSet(i); + build(i); } // 初始建立sum1、sum2,都表示前缀信息 for (int i = 1; i <= bnum; i++) { diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 1234a1f3c..481717f68 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -51,7 +51,7 @@ //int cnt1[MAXB]; //int cnt2[MAXN]; // -//void buildSet(int b) { +//void build(int b) { // for (int i = 1; i <= blen; i++) { // valrt[b][rtval[b][i]] = 0; // } @@ -83,7 +83,7 @@ // arr[i] = y; // } // } -// buildSet(bi[l]); +// build(bi[l]); //} // //void xtoy(int b, int x, int y) { @@ -129,7 +129,7 @@ // } //} // -//void buildCnt(int l, int r) { +//void addCnt(int l, int r) { // for (int i = l; i <= r; i++) { // cnt1[bi[arr[i]]]++; // cnt2[arr[i]]++; @@ -147,12 +147,12 @@ // bool inner = bi[l] == bi[r]; // if (inner) { // down(bi[l]); -// buildCnt(l, r); +// addCnt(l, r); // } else { // down(bi[l]); // down(bi[r]); -// buildCnt(l, br[bi[l]]); -// buildCnt(bl[bi[r]], r); +// addCnt(l, br[bi[l]]); +// addCnt(bl[bi[r]], r); // } // int sumCnt = 0; // int vblock = 0; @@ -192,7 +192,7 @@ // for (int i = 1; i <= bnum; i++) { // bl[i] = (i - 1) * blen + 1; // br[i] = min(i * blen, n); -// buildSet(i); +// build(i); // } // for (int i = 1; i <= bnum; i++) { // for (int j = 1; j < MAXB; j++) { From 14d41098a438a1c40112d8c97a8ae0aead47a839 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 16:19:11 +0800 Subject: [PATCH 0447/1170] modify code --- src/class174/Code01_FutureDiary1.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 738c37658..7318d3fb3 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -146,6 +146,7 @@ public static void clearCnt(int l, int r) { public static int query(int l, int r, int k) { int ans = 0; boolean inner = bi[l] == bi[r]; + // 建立散块的词频统计 if (inner) { down(bi[l]); addCnt(l, r); @@ -159,6 +160,7 @@ public static int query(int l, int r, int k) { int vblock = 0; // 定位第k小的数字,来自哪个值域块 for (int b = 1; b <= bi[MAXN - 1]; b++) { + // 如果不存在中间的整块,词频 = 散块词频,否则 词频 = 散块词频 + 整块词频 int cnt = cnt1[b] + (inner ? 0 : sum1[bi[r] - 1][b] - sum1[bi[l]][b]); if (sumCnt + cnt >= k) { vblock = b; @@ -169,6 +171,7 @@ public static int query(int l, int r, int k) { } // 定位第k小的数字,来自值域块的哪个数字 for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { + // 如果不存在中间的整块,词频 = 散块词频,否则 词频 = 散块词频 + 整块词频 int cnt = cnt2[v] + (inner ? 0 : sum2[bi[r] - 1][v] - sum2[bi[l]][v]); if (sumCnt + cnt >= k) { ans = v; @@ -177,6 +180,7 @@ public static int query(int l, int r, int k) { sumCnt += cnt; } } + // 清空散块的词频统计 if (inner) { clearCnt(l, r); } else { From 9477605e108a03764461b6a964028c1331026c88 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 16:20:18 +0800 Subject: [PATCH 0448/1170] modify code --- src/class174/Code01_FutureDiary1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 7318d3fb3..1ba7410bc 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -169,7 +169,7 @@ public static int query(int l, int r, int k) { sumCnt += cnt; } } - // 定位第k小的数字,来自值域块的哪个数字 + // 定位第k小的数字,来自值域块的具体数字 for (int v = (vblock - 1) * blen + 1; v <= vblock * blen; v++) { // 如果不存在中间的整块,词频 = 散块词频,否则 词频 = 散块词频 + 整块词频 int cnt = cnt2[v] + (inner ? 0 : sum2[bi[r] - 1][v] - sum2[bi[l]][v]); From d5d21315c2132e1eea9e180e8be62acff7f25db8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 17:27:13 +0800 Subject: [PATCH 0449/1170] modify code --- src/class174/Code01_FutureDiary1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 1ba7410bc..59e724de7 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -31,7 +31,8 @@ public class Code01_FutureDiary1 { // idxrt[i]表示下标i,在归属的块中,对应的根编号 // valrt[b][v]表示序列块b中的数值v,对应的根编号 // rtval[b][i]表示序列块b中的根编号i,对应的数值 - // 绝不会向上跳跃多次才能找到根编号,很像并查集,其实不是 + // 块中有x无y时,x要改成y,这三个信息才体现作用 + // 绝不会向上跳跃多次才能找到根编号,不是并查集 public static int[] idxrt = new int[MAXN]; public static int[][] valrt = new int[MAXB][MAXN]; public static int[][] rtval = new int[MAXB][MAXN]; From de074b793eec32ccf007815f11573d9f0b84931a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 17:29:36 +0800 Subject: [PATCH 0450/1170] modify code --- src/class174/Code01_FutureDiary1.java | 10 +++++----- src/class174/Code01_FutureDiary2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 59e724de7..26baea823 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -62,7 +62,7 @@ public static void build(int b) { } // 序列第b块中,有些位置的值已经改了,让改动写入arr - public static void down(int b) { + public static void writeArray(int b) { for (int i = bl[b]; i <= br[b]; i++) { arr[i] = rtval[b][idxrt[i]]; } @@ -70,7 +70,7 @@ public static void down(int b) { // 序列[l..r]范围上,目前既有x又有y,把所有x改成y public static void innerUpdate(int l, int r, int x, int y) { - down(bi[l]); + writeArray(bi[l]); for (int i = l; i <= r; i++) { if (arr[i] == x) { sum1[bi[i]][bi[x]]--; @@ -149,11 +149,11 @@ public static int query(int l, int r, int k) { boolean inner = bi[l] == bi[r]; // 建立散块的词频统计 if (inner) { - down(bi[l]); + writeArray(bi[l]); addCnt(l, r); } else { - down(bi[l]); - down(bi[r]); + writeArray(bi[l]); + writeArray(bi[r]); addCnt(l, br[bi[l]]); addCnt(bl[bi[r]], r); } diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 481717f68..982d11c03 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -66,14 +66,14 @@ // } //} // -//void down(int b) { +//void writeArray(int b) { // for (int i = bl[b]; i <= br[b]; i++) { // arr[i] = rtval[b][idxrt[i]]; // } //} // //void innerUpdate(int l, int r, int x, int y) { -// down(bi[l]); +// writeArray(bi[l]); // for (int i = l; i <= r; i++) { // if (arr[i] == x) { // sum1[bi[i]][bi[x]]--; @@ -146,11 +146,11 @@ // int ans = 0; // bool inner = bi[l] == bi[r]; // if (inner) { -// down(bi[l]); +// writeArray(bi[l]); // addCnt(l, r); // } else { -// down(bi[l]); -// down(bi[r]); +// writeArray(bi[l]); +// writeArray(bi[r]); // addCnt(l, br[bi[l]]); // addCnt(bl[bi[r]], r); // } From 775dc59455828ecd2d2d84e3f0e493e1949effc2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 17:30:45 +0800 Subject: [PATCH 0451/1170] modify code --- src/class174/Code01_FutureDiary1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 26baea823..618c05426 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -83,7 +83,7 @@ public static void innerUpdate(int l, int r, int x, int y) { build(bi[l]); } - // 序列第b块中,目前没有y这个数值,把块中所有的x改成y + // 序列第b块中,有x无y,把块中所有的x改成y public static void xtoy(int b, int x, int y) { valrt[b][y] = valrt[b][x]; rtval[b][valrt[b][x]] = y; From 83ee1c73437d82095f4a69d5f290cb491860e4ed Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 17:31:37 +0800 Subject: [PATCH 0452/1170] modify code --- src/class174/Code01_FutureDiary1.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 618c05426..973e0fc18 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -31,8 +31,6 @@ public class Code01_FutureDiary1 { // idxrt[i]表示下标i,在归属的块中,对应的根编号 // valrt[b][v]表示序列块b中的数值v,对应的根编号 // rtval[b][i]表示序列块b中的根编号i,对应的数值 - // 块中有x无y时,x要改成y,这三个信息才体现作用 - // 绝不会向上跳跃多次才能找到根编号,不是并查集 public static int[] idxrt = new int[MAXN]; public static int[][] valrt = new int[MAXB][MAXN]; public static int[][] rtval = new int[MAXB][MAXN]; From 6d72c247ea1fa4e954272f347ffff6609af7f062 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 17:36:14 +0800 Subject: [PATCH 0453/1170] modify code --- src/class174/Code01_FutureDiary1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 973e0fc18..dd96a5b58 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -35,10 +35,10 @@ public class Code01_FutureDiary1 { public static int[][] valrt = new int[MAXB][MAXN]; public static int[][] rtval = new int[MAXB][MAXN]; - // sum1[b][i]表示前b个序列块中,来自值域块i的数字有几个 - // sum2[b][v]表示前b个序列块中,数字v有几个 - // cnt1[i]表示遍历散块,统计值域块i的数字有几个 - // cnt2[v]表示遍历散块,统计数字v有几个 + // sum1[k][b]表示前k个序列块中,第b块个值域块的数字有几个 + // sum2[k][v]表示前k个序列块中,数字v有几个 + // cnt1[b]表示遍历散块之后,第b块个值域块的数字有几个 + // cnt2[v]表示遍历散块之后,数字v有几个 public static int[][] sum1 = new int[MAXB][MAXB]; public static int[][] sum2 = new int[MAXB][MAXN]; public static int[] cnt1 = new int[MAXB]; From b14e148d369ba89a430682693fe6d0bf5e2369ef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 17:37:56 +0800 Subject: [PATCH 0454/1170] modify code --- src/class174/Code01_FutureDiary1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index dd96a5b58..9a867cc47 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -66,7 +66,7 @@ public static void writeArray(int b) { } } - // 序列[l..r]范围上,目前既有x又有y,把所有x改成y + // 序列[l..r]范围上,有x有y,把所有x改成y public static void innerUpdate(int l, int r, int x, int y) { writeArray(bi[l]); for (int i = l; i <= r; i++) { @@ -81,7 +81,7 @@ public static void innerUpdate(int l, int r, int x, int y) { build(bi[l]); } - // 序列第b块中,有x无y,把块中所有的x改成y + // 序列第b块中,有x无y,把所有x改成y public static void xtoy(int b, int x, int y) { valrt[b][y] = valrt[b][x]; rtval[b][valrt[b][x]] = y; From 62c3043951b46609431a7da873252bf969307527 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 18:13:15 +0800 Subject: [PATCH 0455/1170] modify code --- src/class174/Code01_FutureDiary1.java | 2 +- src/class174/Code01_FutureDiary2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 9a867cc47..8966008b3 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -190,7 +190,7 @@ public static int query(int l, int r, int k) { } public static void prepare() { - blen = (int) Math.sqrt(n); + blen = 300; bnum = (n + blen - 1) / blen; // i一定要枚举[1, MAXN) // 因为不仅序列要分块,值域也要分块 diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 982d11c03..0eae7997b 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -184,7 +184,7 @@ //} // //void prepare() { -// blen = (int)sqrt(n); +// blen = 300; // bnum = (n + blen - 1) / blen; // for (int i = 1; i < MAXN; i++) { // bi[i] = (i - 1) / blen + 1; From 6ad7cf7d38b0156f4d791cdcbbdae064d2193afe Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 19:52:35 +0800 Subject: [PATCH 0456/1170] modify code --- src/class174/Code01_FutureDiary1.java | 32 +++++++++++++-------------- src/class174/Code01_FutureDiary2.java | 24 ++++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 8966008b3..e9ac65fdb 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -28,12 +28,12 @@ public class Code01_FutureDiary1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - // idxrt[i]表示下标i,在归属的块中,对应的根编号 - // valrt[b][v]表示序列块b中的数值v,对应的根编号 - // rtval[b][i]表示序列块b中的根编号i,对应的数值 - public static int[] idxrt = new int[MAXN]; - public static int[][] valrt = new int[MAXB][MAXN]; - public static int[][] rtval = new int[MAXB][MAXN]; + // idxset[i]表示下标i,在归属的块中,所属集合的编号 + // valset[b][v]表示序列块b中的数值v,所属集合的编号 + // setval[b][s]表示序列块b中的集合s,对应的数值 + public static int[] idxset = new int[MAXN]; + public static int[][] valset = new int[MAXB][MAXN]; + public static int[][] setval = new int[MAXB][MAXN]; // sum1[k][b]表示前k个序列块中,第b块个值域块的数字有几个 // sum2[k][v]表示前k个序列块中,数字v有几个 @@ -44,25 +44,25 @@ public class Code01_FutureDiary1 { public static int[] cnt1 = new int[MAXB]; public static int[] cnt2 = new int[MAXN]; - // 序列第b块中,根据arr中的值建立起,idxrt、valrt[b]、rtval[b] + // 序列第b块中,根据arr中的值建立起,idxset、valset[b]、setval[b] public static void build(int b) { for (int i = 1; i <= blen; i++) { - valrt[b][rtval[b][i]] = 0; + valset[b][setval[b][i]] = 0; } for (int i = bl[b], cnt = 0; i <= br[b]; i++) { - if (valrt[b][arr[i]] == 0) { + if (valset[b][arr[i]] == 0) { cnt++; - valrt[b][arr[i]] = cnt; - rtval[b][cnt] = arr[i]; + valset[b][arr[i]] = cnt; + setval[b][cnt] = arr[i]; } - idxrt[i] = valrt[b][arr[i]]; + idxset[i] = valset[b][arr[i]]; } } // 序列第b块中,有些位置的值已经改了,让改动写入arr public static void writeArray(int b) { for (int i = bl[b]; i <= br[b]; i++) { - arr[i] = rtval[b][idxrt[i]]; + arr[i] = setval[b][idxset[i]]; } } @@ -83,9 +83,9 @@ public static void innerUpdate(int l, int r, int x, int y) { // 序列第b块中,有x无y,把所有x改成y public static void xtoy(int b, int x, int y) { - valrt[b][y] = valrt[b][x]; - rtval[b][valrt[b][x]] = y; - valrt[b][x] = 0; + valset[b][y] = valset[b][x]; + setval[b][valset[b][x]] = y; + valset[b][x] = 0; } public static void update(int l, int r, int x, int y) { diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index 0eae7997b..e899da892 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -42,9 +42,9 @@ //int bl[MAXB]; //int br[MAXB]; // -//int idxrt[MAXN]; -//int valrt[MAXB][MAXN]; -//int rtval[MAXB][MAXN]; +//int idxset[MAXN]; +//int valset[MAXB][MAXN]; +//int setval[MAXB][MAXN]; // //int sum1[MAXB][MAXB]; //int sum2[MAXB][MAXN]; @@ -53,22 +53,22 @@ // //void build(int b) { // for (int i = 1; i <= blen; i++) { -// valrt[b][rtval[b][i]] = 0; +// valset[b][setval[b][i]] = 0; // } // int cnt = 0; // for (int i = bl[b]; i <= br[b]; i++) { -// if (valrt[b][arr[i]] == 0) { +// if (valset[b][arr[i]] == 0) { // cnt++; -// valrt[b][arr[i]] = cnt; -// rtval[b][cnt] = arr[i]; +// valset[b][arr[i]] = cnt; +// setval[b][cnt] = arr[i]; // } -// idxrt[i] = valrt[b][arr[i]]; +// idxset[i] = valset[b][arr[i]]; // } //} // //void writeArray(int b) { // for (int i = bl[b]; i <= br[b]; i++) { -// arr[i] = rtval[b][idxrt[i]]; +// arr[i] = setval[b][idxset[i]]; // } //} // @@ -87,9 +87,9 @@ //} // //void xtoy(int b, int x, int y) { -// valrt[b][y] = valrt[b][x]; -// rtval[b][valrt[b][x]] = y; -// valrt[b][x] = 0; +// valset[b][y] = valset[b][x]; +// setval[b][valset[b][x]] = y; +// valset[b][x] = 0; //} // //void update(int l, int r, int x, int y) { From 76169825cb9cb561542e94b49b3c006525704999 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 20:13:07 +0800 Subject: [PATCH 0457/1170] modify code --- src/class174/Code01_FutureDiary1.java | 40 +++++++++++++-------------- src/class174/Code01_FutureDiary2.java | 33 +++++++++++----------- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index e9ac65fdb..d61a1c12b 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -28,8 +28,8 @@ public class Code01_FutureDiary1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - // idxset[i]表示下标i,在归属的块中,所属集合的编号 - // valset[b][v]表示序列块b中的数值v,所属集合的编号 + // idxset[i]表示下标i,在归属的块中,来自哪个集合 + // valset[b][v]表示序列块b中的数值v,来自哪个集合 // setval[b][s]表示序列块b中的集合s,对应的数值 public static int[] idxset = new int[MAXN]; public static int[][] valset = new int[MAXB][MAXN]; @@ -49,18 +49,25 @@ public static void build(int b) { for (int i = 1; i <= blen; i++) { valset[b][setval[b][i]] = 0; } - for (int i = bl[b], cnt = 0; i <= br[b]; i++) { + for (int i = bl[b], s = 0; i <= br[b]; i++) { if (valset[b][arr[i]] == 0) { - cnt++; - valset[b][arr[i]] = cnt; - setval[b][cnt] = arr[i]; + s++; + valset[b][arr[i]] = s; + setval[b][s] = arr[i]; } idxset[i] = valset[b][arr[i]]; } } - // 序列第b块中,有些位置的值已经改了,让改动写入arr - public static void writeArray(int b) { + // 命中了整块修改有x无y的情况,序列第b块中,把所有x改成y + public static void lazy(int b, int x, int y) { + valset[b][y] = valset[b][x]; + setval[b][valset[b][x]] = y; + valset[b][x] = 0; + } + + // 之前的整块修改有x无y的情况,导致序列第b块中,有些值改动了,把改动写入arr + public static void down(int b) { for (int i = bl[b]; i <= br[b]; i++) { arr[i] = setval[b][idxset[i]]; } @@ -68,7 +75,7 @@ public static void writeArray(int b) { // 序列[l..r]范围上,有x有y,把所有x改成y public static void innerUpdate(int l, int r, int x, int y) { - writeArray(bi[l]); + down(bi[l]); for (int i = l; i <= r; i++) { if (arr[i] == x) { sum1[bi[i]][bi[x]]--; @@ -81,13 +88,6 @@ public static void innerUpdate(int l, int r, int x, int y) { build(bi[l]); } - // 序列第b块中,有x无y,把所有x改成y - public static void xtoy(int b, int x, int y) { - valset[b][y] = valset[b][x]; - setval[b][valset[b][x]] = y; - valset[b][x] = 0; - } - public static void update(int l, int r, int x, int y) { // 必要的剪枝 if (x == y || (sum2[bi[r]][x] - sum2[bi[l] - 1][x] == 0)) { @@ -115,7 +115,7 @@ public static void update(int l, int r, int x, int y) { sum1[b][bi[x]] -= sum2[b][x]; sum2[b][y] += sum2[b][x]; sum2[b][x] = 0; - xtoy(b, x, y); + lazy(b, x, y); } } } @@ -147,11 +147,11 @@ public static int query(int l, int r, int k) { boolean inner = bi[l] == bi[r]; // 建立散块的词频统计 if (inner) { - writeArray(bi[l]); + down(bi[l]); addCnt(l, r); } else { - writeArray(bi[l]); - writeArray(bi[r]); + down(bi[l]); + down(bi[r]); addCnt(l, br[bi[l]]); addCnt(bl[bi[r]], r); } diff --git a/src/class174/Code01_FutureDiary2.java b/src/class174/Code01_FutureDiary2.java index e899da892..ca6b37748 100644 --- a/src/class174/Code01_FutureDiary2.java +++ b/src/class174/Code01_FutureDiary2.java @@ -55,25 +55,30 @@ // for (int i = 1; i <= blen; i++) { // valset[b][setval[b][i]] = 0; // } -// int cnt = 0; -// for (int i = bl[b]; i <= br[b]; i++) { +// for (int i = bl[b], s = 0; i <= br[b]; i++) { // if (valset[b][arr[i]] == 0) { -// cnt++; -// valset[b][arr[i]] = cnt; -// setval[b][cnt] = arr[i]; +// s++; +// valset[b][arr[i]] = s; +// setval[b][s] = arr[i]; // } // idxset[i] = valset[b][arr[i]]; // } //} // -//void writeArray(int b) { +//void lazy(int b, int x, int y) { +// valset[b][y] = valset[b][x]; +// setval[b][valset[b][x]] = y; +// valset[b][x] = 0; +//} +// +//void down(int b) { // for (int i = bl[b]; i <= br[b]; i++) { // arr[i] = setval[b][idxset[i]]; // } //} // //void innerUpdate(int l, int r, int x, int y) { -// writeArray(bi[l]); +// down(bi[l]); // for (int i = l; i <= r; i++) { // if (arr[i] == x) { // sum1[bi[i]][bi[x]]--; @@ -86,12 +91,6 @@ // build(bi[l]); //} // -//void xtoy(int b, int x, int y) { -// valset[b][y] = valset[b][x]; -// setval[b][valset[b][x]] = y; -// valset[b][x] = 0; -//} -// //void update(int l, int r, int x, int y) { // if (x == y || (sum2[bi[r]][x] - sum2[bi[l] - 1][x] == 0)) { // return; @@ -116,7 +115,7 @@ // sum1[b][bi[x]] -= sum2[b][x]; // sum2[b][y] += sum2[b][x]; // sum2[b][x] = 0; -// xtoy(b, x, y); +// lazy(b, x, y); // } // } // } @@ -146,11 +145,11 @@ // int ans = 0; // bool inner = bi[l] == bi[r]; // if (inner) { -// writeArray(bi[l]); +// down(bi[l]); // addCnt(l, r); // } else { -// writeArray(bi[l]); -// writeArray(bi[r]); +// down(bi[l]); +// down(bi[r]); // addCnt(l, br[bi[l]]); // addCnt(bl[bi[r]], r); // } From aa550f0a5257fcf4f87a23dbe8188b5b6f9711f4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 20:15:20 +0800 Subject: [PATCH 0458/1170] modify code --- src/class174/Code01_FutureDiary1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index d61a1c12b..60d3b9809 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -59,14 +59,14 @@ public static void build(int b) { } } - // 命中了整块修改有x无y的情况,序列第b块中,把所有x改成y + // 命中了整块修改有x无y的情况,序列第b块中所有x改成y public static void lazy(int b, int x, int y) { valset[b][y] = valset[b][x]; setval[b][valset[b][x]] = y; valset[b][x] = 0; } - // 之前的整块修改有x无y的情况,导致序列第b块中,有些值改动了,把改动写入arr + // 之前的整块修改有x无y的情况,导致序列第b块中有些值改动了,把改动写入arr public static void down(int b) { for (int i = bl[b]; i <= br[b]; i++) { arr[i] = setval[b][idxset[i]]; From ab43e731353088c862981b6522ff652af65ba0a8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 20:25:57 +0800 Subject: [PATCH 0459/1170] modify code --- src/class174/Code01_FutureDiary1.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 60d3b9809..c7d0fef24 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -44,11 +44,18 @@ public class Code01_FutureDiary1 { public static int[] cnt1 = new int[MAXB]; public static int[] cnt2 = new int[MAXN]; - // 序列第b块中,根据arr中的值建立起,idxset、valset[b]、setval[b] + // 序列第b块中,根据当前arr中的值,重建集合 public static void build(int b) { + // 根据arr中的值重建集合,需要放弃之前的信息 + // 可是数值范围很大,不能枚举数值去清空 valset + // 注意到,一个块里集合的数量 <= 块长 + // 所以根据 setval[b][s],得到每个集合之前的对应值v + // 然后 valset[b][v] = 0,让块内之前的每个值,不再挂靠任何集合 + // 这样可以避免数值的枚举,做到快速清空 valset for (int i = 1; i <= blen; i++) { valset[b][setval[b][i]] = 0; } + // 重建集合的过程 for (int i = bl[b], s = 0; i <= br[b]; i++) { if (valset[b][arr[i]] == 0) { s++; From dd5472f2d7640c0c8e4c19a6c160d858a2ecebba Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 20:27:57 +0800 Subject: [PATCH 0460/1170] modify code --- src/class174/Code01_FutureDiary1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index c7d0fef24..7246152d7 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -66,14 +66,14 @@ public static void build(int b) { } } - // 命中了整块修改有x无y的情况,序列第b块中所有x改成y + // 命中了整块修改,有x无y的情况,序列第b块中所有x改成y public static void lazy(int b, int x, int y) { valset[b][y] = valset[b][x]; setval[b][valset[b][x]] = y; valset[b][x] = 0; } - // 之前的整块修改有x无y的情况,导致序列第b块中有些值改动了,把改动写入arr + // 之前命中了整块修改,有x无y的情况,导致序列第b块中有些值改动了,把改动写入arr public static void down(int b) { for (int i = bl[b]; i <= br[b]; i++) { arr[i] = setval[b][idxset[i]]; From a70bbec6a0a5d11bbe21b6df35eb22f7f2740357 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 20:31:10 +0800 Subject: [PATCH 0461/1170] modify code --- src/class174/Code01_FutureDiary1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 7246152d7..7ada9fc25 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -49,7 +49,7 @@ public static void build(int b) { // 根据arr中的值重建集合,需要放弃之前的信息 // 可是数值范围很大,不能枚举数值去清空 valset // 注意到,一个块里集合的数量 <= 块长 - // 所以根据 setval[b][s],得到每个集合之前的对应值v + // 所以根据 setval[b][s],可以得到每个集合之前的对应值v // 然后 valset[b][v] = 0,让块内之前的每个值,不再挂靠任何集合 // 这样可以避免数值的枚举,做到快速清空 valset for (int i = 1; i <= blen; i++) { From 68c16d814e6a581357338fc78825b738325300e7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 20:35:03 +0800 Subject: [PATCH 0462/1170] modify code --- src/class174/Code01_FutureDiary1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 7ada9fc25..1d4d3bfad 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -23,6 +23,10 @@ public class Code01_FutureDiary1 { public static int n, m; public static int[] arr = new int[MAXN]; + // bi[i]可以查询下标i来自哪个序列块 + // bi[v]也可查询数字v来自哪个值域块 + // bl[i]表示下标第i块的左边界 + // br[i]表示下标第i块的右边界 public static int blen, bnum; public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; @@ -201,13 +205,9 @@ public static void prepare() { bnum = (n + blen - 1) / blen; // i一定要枚举[1, MAXN) // 因为不仅序列要分块,值域也要分块 - // bi[i]可以查询下标i来自哪个序列块 - // bi[v]也可查询数字v来自哪个值域块 for (int i = 1; i < MAXN; i++) { bi[i] = (i - 1) / blen + 1; } - // bl[i]表示下标第i块的左边界 - // br[i]表示下标第i块的右边界 // bl、br 仅用于序列分块 for (int i = 1; i <= bnum; i++) { bl[i] = (i - 1) * blen + 1; From 85cd121f0fb6691144935f227a12828edcdad9e7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 12 Jul 2025 22:20:41 +0800 Subject: [PATCH 0463/1170] modify code --- src/class174/Code01_FutureDiary1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class174/Code01_FutureDiary1.java b/src/class174/Code01_FutureDiary1.java index 1d4d3bfad..18ee82619 100644 --- a/src/class174/Code01_FutureDiary1.java +++ b/src/class174/Code01_FutureDiary1.java @@ -23,6 +23,8 @@ public class Code01_FutureDiary1 { public static int n, m; public static int[] arr = new int[MAXN]; + // blen既表示序列块长,也表示值域块长 + // bnum只表示序列块的数量 // bi[i]可以查询下标i来自哪个序列块 // bi[v]也可查询数字v来自哪个值域块 // bl[i]表示下标第i块的左边界 From e93e23ee8c114961530f453b62d8797ff4836a11 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 13 Jul 2025 11:51:26 +0800 Subject: [PATCH 0464/1170] modify code --- src/class174/Code02_MagicGirl1.java | 77 +++++++++++++---------------- src/class174/Code02_MagicGirl2.java | 52 +++++++++---------- 2 files changed, 60 insertions(+), 69 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index fb67d2dd5..6f6f135e0 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -27,17 +27,18 @@ public class Code02_MagicGirl1 { public static int n, m; public static int[] arr = new int[MAXN]; - public static int[] pos = new int[MAXN]; - public static int[] op = new int[MAXN]; public static int[] x = new int[MAXN]; public static int[] y = new int[MAXN]; public static int[] v = new int[MAXN]; - public static int[] arrq = new int[MAXN]; + public static int[] pos = new int[MAXN]; + public static int[] que = new int[MAXN]; + public static int cntp; + public static int cntq; + public static int[] cntv = new int[MAXB]; public static int[] help = new int[MAXN]; - public static int siz; public static int[] last = new int[MAXN]; public static int[] next = new int[MAXN]; @@ -60,48 +61,31 @@ public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { len[i] += rlen; } - // 根据arr[pos[i]]的值,对pos[l..r]进行双指针快排 - public static void quickSort(int l, int r) { - if (l >= r) return; - int i = l, j = r, pivot = arr[pos[(l + r) >> 1]], tmp; - while (i <= j) { - while (arr[pos[i]] < pivot) i++; - while (arr[pos[j]] > pivot) j--; - if (i <= j) { - tmp = pos[i]; pos[i] = pos[j]; pos[j] = tmp; - i++; j--; - } - } - quickSort(l, j); - quickSort(i, r); - } - - // 根据查询任务的v值,对查询任务的编号进行基数排序 - public static void radixSort() { + public static void radix(int[] idx, int[] val, int siz) { Arrays.fill(cntv, 0); - for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] & OFFSET]++; + for (int i = 1; i <= siz; i++) cntv[val[idx[i]] & OFFSET]++; for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; - for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] & OFFSET]--] = arrq[i]; - for (int i = 1; i <= siz; i++) arrq[i] = help[i]; + for (int i = siz; i >= 1; i--) help[cntv[val[idx[i]] & OFFSET]--] = idx[i]; + for (int i = 1; i <= siz; i++) idx[i] = help[i]; Arrays.fill(cntv, 0); - for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] >> POW]++; + for (int i = 1; i <= siz; i++) cntv[val[idx[i]] >> POW]++; for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; - for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] >> POW]--] = arrq[i]; - for (int i = 1; i <= siz; i++) arrq[i] = help[i]; + for (int i = siz; i >= 1; i--) help[cntv[val[idx[i]] >> POW]--] = idx[i]; + for (int i = 1; i <= siz; i++) idx[i] = help[i]; } public static void calc(int l, int r) { - radixSort(); + radix(que, v, cntq); for (int i = l; i <= r; i++) { last[i] = i - 1; next[i] = i + 1; } int rpre = 0, rsuf = 0, rlen = r - l + 1, rans = 0; int k = 1; - for (int i = l, idx; i <= r; i++) { - idx = pos[i]; - for (; k <= siz && v[arrq[k]] < arr[idx]; k++) { - mergeAns(arrq[k], rpre, rsuf, rlen, rans); + for (int i = 1; i <= cntp; i++) { + int idx = pos[i]; + for (; k <= cntq && v[que[k]] < arr[idx]; k++) { + mergeAns(que[k], rpre, rsuf, rlen, rans); } if (last[idx] == l - 1) { rpre += next[idx] - idx; @@ -113,10 +97,10 @@ public static void calc(int l, int r) { last[next[idx]] = last[idx]; next[last[idx]] = next[idx]; } - for (; k <= siz; k++) { - mergeAns(arrq[k], rpre, rsuf, rlen, rans); + for (; k <= cntq; k++) { + mergeAns(que[k], rpre, rsuf, rlen, rans); } - siz = 0; + cntq = 0; } public static void update(int qi, int l, int r) { @@ -125,18 +109,22 @@ public static void update(int qi, int l, int r) { calc(l, r); arr[jobi] = jobv; int find = 0; - for (int i = l; i <= r; i++) { + for (int i = 1; i <= cntp; i++) { if (pos[i] == jobi) { find = i; break; } } int tmp; - for (int i = find; i < r && arr[pos[i]] > arr[pos[i + 1]]; i++) { - tmp = pos[i]; pos[i] = pos[i + 1]; pos[i + 1] = tmp; + for (int i = find; i < cntp && arr[pos[i]] > arr[pos[i + 1]]; i++) { + tmp = pos[i]; + pos[i] = pos[i + 1]; + pos[i + 1] = tmp; } - for (int i = find; i > l && arr[pos[i - 1]] > arr[pos[i]]; i--) { - tmp = pos[i - 1]; pos[i - 1] = pos[i]; pos[i] = tmp; + for (int i = find; i > 1 && arr[pos[i - 1]] > arr[pos[i]]; i--) { + tmp = pos[i - 1]; + pos[i - 1] = pos[i]; + pos[i] = tmp; } } } @@ -144,7 +132,7 @@ public static void update(int qi, int l, int r) { public static void query(int qi, int l, int r) { int jobl = x[qi], jobr = y[qi], jobv = v[qi]; if (jobl <= l && r <= jobr) { - arrq[++siz] = qi; + que[++cntq] = qi; } else { for (int i = Math.max(jobl, l); i <= Math.min(jobr, r); i++) { if (arr[i] <= jobv) { @@ -157,10 +145,11 @@ public static void query(int qi, int l, int r) { } public static void compute(int l, int r) { + cntp = 0; for (int i = l; i <= r; i++) { - pos[i] = i; + pos[++cntp] = i; } - quickSort(l, r); + radix(pos, arr, cntp); for (int qi = 1; qi <= m; qi++) { if (op[qi] == 1) { update(qi, l, r); diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index 4cdad00cc..c3d11119c 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -21,17 +21,18 @@ //int n, m; // //int arr[MAXN]; -//int pos[MAXN]; -// //int op[MAXN]; //int x[MAXN]; //int y[MAXN]; //int v[MAXN]; // -//int arrq[MAXN]; +//int pos[MAXN]; +//int que[MAXN]; +//int cntp; +//int cntq; +// //int cntv[MAXB]; //int help[MAXN]; -//int siz; // //int lst[MAXN]; //int nxt[MAXN]; @@ -54,31 +55,31 @@ // len[i] += rlen; //} // -//inline void radixSort() { +//inline void radix(int* idx, int* val, int siz) { // fill(cntv, cntv + MAXB, 0); -// for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] & OFFSET]++; +// for (int i = 1; i <= siz; i++) cntv[val[idx[i]] & OFFSET]++; // for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; -// for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] & OFFSET]--] = arrq[i]; -// for (int i = 1; i <= siz; i++) arrq[i] = help[i]; +// for (int i = siz; i >= 1; i--) help[cntv[val[idx[i]] & OFFSET]--] = idx[i]; +// for (int i = 1; i <= siz; i++) idx[i] = help[i]; // fill(cntv, cntv + MAXB, 0); -// for (int i = 1; i <= siz; i++) cntv[v[arrq[i]] >> POW]++; +// for (int i = 1; i <= siz; i++) cntv[val[idx[i]] >> POW]++; // for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; -// for (int i = siz; i >= 1; i--) help[cntv[v[arrq[i]] >> POW]--] = arrq[i]; -// for (int i = 1; i <= siz; i++) arrq[i] = help[i]; +// for (int i = siz; i >= 1; i--) help[cntv[val[idx[i]] >> POW]--] = idx[i]; +// for (int i = 1; i <= siz; i++) idx[i] = help[i]; //} // //void calc(int l, int r) { -// radixSort(); +// radix(que, v, cntq); // for (int i = l; i <= r; i++) { // lst[i] = i - 1; // nxt[i] = i + 1; // } // int rpre = 0, rsuf = 0, rlen = r - l + 1, rans = 0; // int k = 1; -// for (int i = l, idx; i <= r; i++) { -// idx = pos[i]; -// for(; k <= siz && v[arrq[k]] < arr[idx]; k++) { -// mergeAns(arrq[k], rpre, rsuf, rlen, rans); +// for (int i = 1; i <= cntp; i++) { +// int idx = pos[i]; +// for(; k <= cntq && v[que[k]] < arr[idx]; k++) { +// mergeAns(que[k], rpre, rsuf, rlen, rans); // } // if (lst[idx] == l - 1) { // rpre += nxt[idx] - idx; @@ -90,10 +91,10 @@ // lst[nxt[idx]] = lst[idx]; // nxt[lst[idx]] = nxt[idx]; // } -// for(; k <= siz; k++) { -// mergeAns(arrq[k], rpre, rsuf, rlen, rans); +// for(; k <= cntq; k++) { +// mergeAns(que[k], rpre, rsuf, rlen, rans); // } -// siz = 0; +// cntq = 0; //} // //inline void update(int qi, int l, int r) { @@ -102,16 +103,16 @@ // calc(l, r); // arr[jobi] = jobv; // int find = 0; -// for (int i = l; i <= r; i++) { +// for (int i = 1; i <= cntp; i++) { // if (pos[i] == jobi) { // find = i; // break; // } // } -// for (int i = find; i < r && arr[pos[i]] > arr[pos[i + 1]]; i++) { +// for (int i = find; i < cntp && arr[pos[i]] > arr[pos[i + 1]]; i++) { // swap(pos[i], pos[i + 1]); // } -// for (int i = find; i > l && arr[pos[i - 1]] > arr[pos[i]]; i--) { +// for (int i = find; i > 1 && arr[pos[i - 1]] > arr[pos[i]]; i--) { // swap(pos[i - 1], pos[i]); // } // } @@ -120,7 +121,7 @@ //inline void query(int qi, int l, int r) { // int jobl = x[qi], jobr = y[qi], jobv = v[qi]; // if (jobl <= l && r <= jobr) { -// arrq[++siz] = qi; +// que[++cntq] = qi; // } else { // for (int i = max(jobl, l); i <= min(jobr, r); i++) { // if (arr[i] <= jobv) { @@ -133,10 +134,11 @@ //} // //void compute(int l, int r) { +// cntp = 0; // for (int i = l; i <= r; i++) { -// pos[i] = i; +// pos[++cntp] = i; // } -// sort(pos + l, pos + r + 1, [&](int a, int b) {return arr[a] < arr[b];}); +// radix(pos, arr, cntp); // for (int qi = 1; qi <= m; qi++) { // if (op[qi] == 1) { // update(qi, l, r); From a21f318908b763b93e2ba7c8329529f74f24b617 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 14:29:13 +0800 Subject: [PATCH 0465/1170] modify code --- src/class174/Code04_Bridge1.java | 36 ++++++++++++++++---------------- src/class174/Code04_Bridge2.java | 36 ++++++++++++++++---------------- src/class174/Code05_Lcm1.java | 27 ++++++++++++------------ src/class174/Code05_Lcm2.java | 27 ++++++++++++------------ 4 files changed, 62 insertions(+), 64 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index fffe7bbdd..872846f23 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -41,11 +41,11 @@ public class Code04_Bridge1 { public static int[][] rollback = new int[MAXM][2]; public static int opsize = 0; - public static int[] arre = new int[MAXM]; + public static int[] edge = new int[MAXM]; public static int[] change = new int[MAXM]; public static int[] unchange = new int[MAXM]; - public static int[] arrq = new int[MAXQ]; + public static int[] operate = new int[MAXQ]; public static int[] update = new int[MAXQ]; public static int[] query = new int[MAXQ]; @@ -76,13 +76,13 @@ public static void sort(int[] idx, int[] v, int l, int r) { public static void merge(int l1, int r1, int l2, int r2) { int i = 0; while (l1 <= r1 && l2 <= r2) { - arre[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; + edge[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; } while (l1 <= r1) { - arre[++i] = change[l1++]; + edge[++i] = change[l1++]; } while (l2 <= r2) { - arre[++i] = unchange[l2++]; + edge[++i] = unchange[l2++]; } } @@ -129,19 +129,19 @@ public static void compute(int l, int r) { Arrays.fill(vis, false); int cntu = 0, cntq = 0; for (int i = l; i <= r; i++) { - if (op[arrq[i]] == 1) { - vis[eid[arrq[i]]] = true; - update[++cntu] = arrq[i]; + if (op[operate[i]] == 1) { + vis[eid[operate[i]]] = true; + update[++cntu] = operate[i]; } else { - query[++cntq] = arrq[i]; + query[++cntq] = operate[i]; } } sort(query, car, 1, cntq); int k = 1; for (int i = 1; i <= cntq; i++) { - for (; k <= m && w[arre[k]] >= car[query[i]]; k++) { - if (!vis[arre[k]]) { - union(u[arre[k]], v[arre[k]]); + for (; k <= m && w[edge[k]] >= car[query[i]]; k++) { + if (!vis[edge[k]]) { + union(u[edge[k]], v[edge[k]]); } } opsize = 0; @@ -166,10 +166,10 @@ public static void compute(int l, int r) { } int siz1 = 0, siz2 = 0; for (int i = 1; i <= m; i++) { - if (vis[arre[i]]) { - change[++siz1] = arre[i]; + if (vis[edge[i]]) { + change[++siz1] = edge[i]; } else { - unchange[++siz2] = arre[i]; + unchange[++siz2] = edge[i]; } } sort(change, w, 1, siz1); @@ -188,12 +188,12 @@ public static void prepare() { blen = Math.max(1, (int) Math.sqrt(q * log2(n))); bnum = (q + blen - 1) / blen; for (int i = 1; i <= m; i++) { - arre[i] = i; + edge[i] = i; } for (int i = 1; i <= q; i++) { - arrq[i] = i; + operate[i] = i; } - sort(arre, w, 1, m); + sort(edge, w, 1, m); } public static void main(String[] args) throws IOException { diff --git a/src/class174/Code04_Bridge2.java b/src/class174/Code04_Bridge2.java index e964f3a74..b6b03dd8f 100644 --- a/src/class174/Code04_Bridge2.java +++ b/src/class174/Code04_Bridge2.java @@ -38,11 +38,11 @@ //int rollback[MAXM][2]; //int opsize = 0; // -//int arre[MAXM]; +//int edge[MAXM]; //int change[MAXM]; //int unchange[MAXM]; // -//int arrq[MAXQ]; +//int operate[MAXQ]; //int update[MAXQ]; //int query[MAXQ]; // @@ -54,13 +54,13 @@ //void merge(int l1, int r1, int l2, int r2) { // int i = 0; // while (l1 <= r1 && l2 <= r2) { -// arre[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; +// edge[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; // } // while (l1 <= r1) { -// arre[++i] = change[l1++]; +// edge[++i] = change[l1++]; // } // while (l2 <= r2) { -// arre[++i] = unchange[l2++]; +// edge[++i] = unchange[l2++]; // } //} // @@ -106,19 +106,19 @@ // fill(vis + 1, vis + m + 1, false); // int cntu = 0, cntq = 0; // for (int i = l; i <= r; i++) { -// if (op[arrq[i]] == 1) { -// vis[eid[arrq[i]]] = true; -// update[++cntu] = arrq[i]; +// if (op[operate[i]] == 1) { +// vis[eid[operate[i]]] = true; +// update[++cntu] = operate[i]; // } else { -// query[++cntq] = arrq[i]; +// query[++cntq] = operate[i]; // } // } // sort(query + 1, query + cntq + 1, [&](int x, int y) { return car[x] > car[y]; }); // int k = 1; // for (int i = 1; i <= cntq; i++) { -// for (; k <= m && w[arre[k]] >= car[query[i]]; k++) { -// if (!vis[arre[k]]) { -// Union(u[arre[k]], v[arre[k]]); +// for (; k <= m && w[edge[k]] >= car[query[i]]; k++) { +// if (!vis[edge[k]]) { +// Union(u[edge[k]], v[edge[k]]); // } // } // opsize = 0; @@ -143,10 +143,10 @@ // } // int siz1 = 0, siz2 = 0; // for (int i = 1; i <= m; i++) { -// if (vis[arre[i]]) { -// change[++siz1] = arre[i]; +// if (vis[edge[i]]) { +// change[++siz1] = edge[i]; // } else { -// unchange[++siz2] = arre[i]; +// unchange[++siz2] = edge[i]; // } // } // sort(change + 1, change + siz1 + 1, [&](int x, int y) { return w[x] > w[y]; }); @@ -157,12 +157,12 @@ // blen = max(1, (int)sqrt(q * log2(n))); // bnum = (q + blen - 1) / blen; // for (int i = 1; i <= m; i++) { -// arre[i] = i; +// edge[i] = i; // } // for (int i = 1; i <= q; i++) { -// arrq[i] = i; +// operate[i] = i; // } -// sort(arre + 1, arre + m + 1, [&](int x, int y) { return w[x] > w[y]; }); +// sort(edge + 1, edge + m + 1, [&](int x, int y) { return w[x] > w[y]; }); //} // //int main() { diff --git a/src/class174/Code05_Lcm1.java b/src/class174/Code05_Lcm1.java index 6cd909d2b..50a725271 100644 --- a/src/class174/Code05_Lcm1.java +++ b/src/class174/Code05_Lcm1.java @@ -35,8 +35,8 @@ public class Code05_Lcm1 { public static int[] qb = new int[MAXQ]; public static int[] qid = new int[MAXQ]; - public static int[] arre = new int[MAXM]; - public static int[] arrq = new int[MAXQ]; + public static int[] edge = new int[MAXM]; + public static int[] ques = new int[MAXQ]; public static int[] cur = new int[MAXQ]; public static int cntq = 0; @@ -122,25 +122,24 @@ public static void compute(int l, int r) { cntq = 0; for (int i = 1; i <= q; i++) { // 保证每条询问只落入其中的一块 - if (ea[arre[l]] <= qa[arrq[i]] && (r + 1 > m || qa[arrq[i]] < ea[arre[r + 1]])) { - cur[++cntq] = arrq[i]; + if (ea[edge[l]] <= qa[ques[i]] && (r + 1 > m || qa[ques[i]] < ea[edge[r + 1]])) { + cur[++cntq] = ques[i]; } } if (cntq > 0) { // 可以使用额外的数组,每块内部根据b进行排序 // 每次把新块归并进来,保证 1..l-1 范围根据b有序 // 可以省掉一个log的复杂度,本题不做这个优化也能通过,索性算了 - sort(arre, eb, 1, l - 1); + sort(edge, eb, 1, l - 1); int pos = 1; for (int i = 1; i <= cntq; i++) { - for (int edge = arre[pos]; pos < l && eb[edge] <= qb[cur[i]]; pos++, edge = arre[pos]) { - union(eu[edge], ev[edge], ea[edge], eb[edge]); + for (; pos < l && eb[edge[pos]] <= qb[cur[i]]; pos++) { + union(eu[edge[pos]], ev[edge[pos]], ea[edge[pos]], eb[edge[pos]]); } opsize = 0; for (int j = l; j <= r; j++) { - int edge = arre[j]; - if (ea[edge] <= qa[cur[i]] && eb[edge] <= qb[cur[i]]) { - union(eu[edge], ev[edge], ea[edge], eb[edge]); + if (ea[edge[j]] <= qa[cur[i]] && eb[edge[j]] <= qb[cur[i]]) { + union(eu[edge[j]], ev[edge[j]], ea[edge[j]], eb[edge[j]]); } } ans[qid[cur[i]]] = query(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); @@ -161,13 +160,13 @@ public static void prepare() { blen = Math.max(1, (int) Math.sqrt(m * log2(n))); bnum = (m + blen - 1) / blen; for (int i = 1; i <= m; i++) { - arre[i] = i; + edge[i] = i; } for (int i = 1; i <= q; i++) { - arrq[i] = i; + ques[i] = i; } - sort(arre, ea, 1, m); - sort(arrq, qb, 1, q); + sort(edge, ea, 1, m); + sort(ques, qb, 1, q); } public static void main(String[] args) throws IOException { diff --git a/src/class174/Code05_Lcm2.java b/src/class174/Code05_Lcm2.java index 7143c8ee6..80b7aee91 100644 --- a/src/class174/Code05_Lcm2.java +++ b/src/class174/Code05_Lcm2.java @@ -33,8 +33,8 @@ //int qb[MAXQ]; //int qid[MAXQ]; // -//int arre[MAXM]; -//int arrq[MAXQ]; +//int edge[MAXM]; +//int ques[MAXQ]; // //int cur[MAXQ]; //int cntq = 0; @@ -102,22 +102,21 @@ // build(); // cntq = 0; // for (int i = 1; i <= q; i++) { -// if (ea[arre[l]] <= qa[arrq[i]] && (r + 1 > m || qa[arrq[i]] < ea[arre[r + 1]])) { -// cur[++cntq] = arrq[i]; +// if (ea[edge[l]] <= qa[ques[i]] && (r + 1 > m || qa[ques[i]] < ea[edge[r + 1]])) { +// cur[++cntq] = ques[i]; // } // } // if (cntq > 0) { -// sort(arre + 1, arre + l, [&](int x, int y) { return eb[x] < eb[y]; }); +// sort(edge + 1, edge + l, [&](int x, int y) { return eb[x] < eb[y]; }); // int pos = 1; // for (int i = 1; i <= cntq; i++) { -// for (int edge = arre[pos]; pos < l && eb[edge] <= qb[cur[i]]; pos++, edge = arre[pos]) { -// Union(eu[edge], ev[edge], ea[edge], eb[edge]); +// for (; pos < l && eb[edge[pos]] <= qb[cur[i]]; pos++) { +// Union(eu[edge[pos]], ev[edge[pos]], ea[edge[pos]], eb[edge[pos]]); // } // opsize = 0; // for (int j = l; j <= r; j++) { -// int edge = arre[j]; -// if (ea[edge] <= qa[cur[i]] && eb[edge] <= qb[cur[i]]) { -// Union(eu[edge], ev[edge], ea[edge], eb[edge]); +// if (ea[edge[j]] <= qa[cur[i]] && eb[edge[j]] <= qb[cur[i]]) { +// Union(eu[edge[j]], ev[edge[j]], ea[edge[j]], eb[edge[j]]); // } // } // ans[qid[cur[i]]] = query(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); @@ -130,13 +129,13 @@ // blen = max(1, (int)sqrt(m * log2(n))); // bnum = (m + blen - 1) / blen; // for (int i = 1; i <= m; i++) { -// arre[i] = i; +// edge[i] = i; // } // for (int i = 1; i <= q; i++) { -// arrq[i] = i; +// ques[i] = i; // } -// sort(arre + 1, arre + m + 1, [&](int x, int y) { return ea[x] < ea[y]; }); -// sort(arrq + 1, arrq + q + 1, [&](int x, int y) { return qb[x] < qb[y]; }); +// sort(edge + 1, edge + m + 1, [&](int x, int y) { return ea[x] < ea[y]; }); +// sort(ques + 1, ques + q + 1, [&](int x, int y) { return qb[x] < qb[y]; }); //} // //int main() { From c7b291fba96fb72fc66f40996ed6860941c542fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 17:31:45 +0800 Subject: [PATCH 0466/1170] modify code --- src/class174/Code02_MagicGirl1.java | 33 +++++++++++++++++------------ src/class174/Code02_MagicGirl2.java | 26 +++++++++++------------ 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 6f6f135e0..873459c2f 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -48,19 +48,10 @@ public class Code02_MagicGirl1 { public static int[] len = new int[MAXN]; public static long[] ans = new long[MAXN]; - public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { - ans[i] += rans + 1L * suf[i] * rpre; - if (pre[i] == len[i]) { - pre[i] += rpre; - } - if (rsuf == rlen) { - suf[i] += rsuf; - } else { - suf[i] = rsuf; - } - len[i] += rlen; - } - + // idx[1..siz]都是下标,下标之间根据val[下标]进行从小到大的基数排序 + // 每个val[下标]的数值,只有两位 + // 高位 : val[下标] >> POW + // 低位 : val[下标] & OFFSET public static void radix(int[] idx, int[] val, int siz) { Arrays.fill(cntv, 0); for (int i = 1; i <= siz; i++) cntv[val[idx[i]] & OFFSET]++; @@ -74,6 +65,22 @@ public static void radix(int[] idx, int[] val, int siz) { for (int i = 1; i <= siz; i++) idx[i] = help[i]; } + // 左侧形成的区域,pre[i]、suf[i]、len[i]、ans[i] + // 右侧形成的区域,rpre、rsuf、rlen、rans + // 左侧与右侧合并,修改好pre[i]、suf[i]、len[i]、ans[i] + public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { + ans[i] += rans + 1L * suf[i] * rpre; + if (pre[i] == len[i]) { + pre[i] += rpre; + } + if (rsuf == rlen) { + suf[i] += rsuf; + } else { + suf[i] = rsuf; + } + len[i] += rlen; + } + public static void calc(int l, int r) { radix(que, v, cntq); for (int i = l; i <= r; i++) { diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index c3d11119c..9106e53a1 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -42,19 +42,6 @@ //int len[MAXN]; //long long ans[MAXN]; // -//inline void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { -// ans[i] += rans + 1LL * suf[i] * rpre; -// if (pre[i] == len[i]) { -// pre[i] += rpre; -// } -// if (rsuf == rlen) { -// suf[i] += rsuf; -// } else { -// suf[i] = rsuf; -// } -// len[i] += rlen; -//} -// //inline void radix(int* idx, int* val, int siz) { // fill(cntv, cntv + MAXB, 0); // for (int i = 1; i <= siz; i++) cntv[val[idx[i]] & OFFSET]++; @@ -68,6 +55,19 @@ // for (int i = 1; i <= siz; i++) idx[i] = help[i]; //} // +//inline void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { +// ans[i] += rans + 1LL * suf[i] * rpre; +// if (pre[i] == len[i]) { +// pre[i] += rpre; +// } +// if (rsuf == rlen) { +// suf[i] += rsuf; +// } else { +// suf[i] = rsuf; +// } +// len[i] += rlen; +//} +// //void calc(int l, int r) { // radix(que, v, cntq); // for (int i = l; i <= r; i++) { From 28c004d11847335b0fcd28e619016165624d36e5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 18:02:27 +0800 Subject: [PATCH 0467/1170] modify code --- src/class174/Code02_MagicGirl1.java | 37 ++++++++++++++++------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 873459c2f..7432f3467 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -21,8 +21,8 @@ public class Code02_MagicGirl1 { public static int MAXN = 300002; // 双向链表需要n+1下标 - public static int MAXB = 601; - public static int POW = 9; // 块长为(2的POW次方),/ 块长时,>> POW即可 + public static int MAXB = 601; // 块的最大数量 + public static int POW = 9; // 块长为 2的POW次方,/ 块长时,>> POW即可 public static int OFFSET = (1 << POW) - 1; // % 块长时, & OFFSET即可 public static int n, m; @@ -32,26 +32,27 @@ public class Code02_MagicGirl1 { public static int[] y = new int[MAXN]; public static int[] v = new int[MAXN]; - public static int[] pos = new int[MAXN]; - public static int[] que = new int[MAXN]; - public static int cntp; - public static int cntq; + public static int[] pos = new int[MAXN]; // 当前序列块的下标放入pos + public static int[] que = new int[MAXN]; // 如果查询包含当前序列块,查询下标放入que + public static int cntp; // cntp是pos中的下标个数 + public static int cntq; // cntq是que中的下标个数 + // 基数排序 public static int[] cntv = new int[MAXB]; public static int[] help = new int[MAXN]; + // 双指针 public static int[] last = new int[MAXN]; public static int[] next = new int[MAXN]; - public static int[] pre = new int[MAXN]; - public static int[] suf = new int[MAXN]; - public static int[] len = new int[MAXN]; - public static long[] ans = new long[MAXN]; + // 每个查询的答案信息 + public static int[] pre = new int[MAXN]; // 达标前缀长度 + public static int[] suf = new int[MAXN]; // 达标后缀长度 + public static int[] len = new int[MAXN]; // 总长度 + public static long[] ans = new long[MAXN]; // 达标子数组数量 - // idx[1..siz]都是下标,下标之间根据val[下标]进行从小到大的基数排序 - // 每个val[下标]的数值,只有两位 - // 高位 : val[下标] >> POW - // 低位 : val[下标] & OFFSET + // idx[1..siz]放着所有下标,下标之间根据val[下标]进行从小到大的基数排序 + // 每个val[下标]只有两位,高位数值(val[下标] >> POW),低位数值(val[下标] & OFFSET) public static void radix(int[] idx, int[] val, int siz) { Arrays.fill(cntv, 0); for (int i = 1; i <= siz; i++) cntv[val[idx[i]] & OFFSET]++; @@ -65,9 +66,9 @@ public static void radix(int[] idx, int[] val, int siz) { for (int i = 1; i <= siz; i++) idx[i] = help[i]; } - // 左侧形成的区域,pre[i]、suf[i]、len[i]、ans[i] - // 右侧形成的区域,rpre、rsuf、rlen、rans - // 左侧与右侧合并,修改好pre[i]、suf[i]、len[i]、ans[i] + // 之前的答案信息 pre[i]、suf[i]、len[i]、ans[i] + // 当前的答案信息 rpre、rsuf、rlen、rans + // 之前信息吸收当前信息 public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { ans[i] += rans + 1L * suf[i] * rpre; if (pre[i] == len[i]) { @@ -81,6 +82,8 @@ public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { len[i] += rlen; } + // que[1..cntq]放着所有查询的编号,每条查询都包含arr[l..r] + // 根据arr[l..r]的数字状况,更新每个查询的答案信息 public static void calc(int l, int r) { radix(que, v, cntq); for (int i = l; i <= r; i++) { From 3f7a8e587bd83266d58f869a2d6ec932eda4554a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 18:06:45 +0800 Subject: [PATCH 0468/1170] modify code --- src/class174/Code02_MagicGirl1.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 7432f3467..522ed6088 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -21,7 +21,7 @@ public class Code02_MagicGirl1 { public static int MAXN = 300002; // 双向链表需要n+1下标 - public static int MAXB = 601; // 块的最大数量 + public static int MAXB = 601; // 块的数量上限 public static int POW = 9; // 块长为 2的POW次方,/ 块长时,>> POW即可 public static int OFFSET = (1 << POW) - 1; // % 块长时, & OFFSET即可 public static int n, m; @@ -32,10 +32,12 @@ public class Code02_MagicGirl1 { public static int[] y = new int[MAXN]; public static int[] v = new int[MAXN]; - public static int[] pos = new int[MAXN]; // 当前序列块的下标放入pos - public static int[] que = new int[MAXN]; // 如果查询包含当前序列块,查询下标放入que - public static int cntp; // cntp是pos中的下标个数 - public static int cntq; // cntq是que中的下标个数 + // pos[1..cntp]存放数组下标 + // que[1..cntq]存放查询下标 + public static int[] pos = new int[MAXN]; + public static int[] que = new int[MAXN]; + public static int cntp; + public static int cntq; // 基数排序 public static int[] cntv = new int[MAXB]; @@ -68,7 +70,7 @@ public static void radix(int[] idx, int[] val, int siz) { // 之前的答案信息 pre[i]、suf[i]、len[i]、ans[i] // 当前的答案信息 rpre、rsuf、rlen、rans - // 之前信息吸收当前信息 + // 之前答案合并当前答案 public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { ans[i] += rans + 1L * suf[i] * rpre; if (pre[i] == len[i]) { From 9cd52ca9fa32652a0b1d68f40606578774ad44dd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 18:09:45 +0800 Subject: [PATCH 0469/1170] modify code --- src/class174/Code02_MagicGirl1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 522ed6088..2d5ebf9c9 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -20,10 +20,10 @@ public class Code02_MagicGirl1 { - public static int MAXN = 300002; // 双向链表需要n+1下标 - public static int MAXB = 601; // 块的数量上限 - public static int POW = 9; // 块长为 2的POW次方,/ 块长时,>> POW即可 - public static int OFFSET = (1 << POW) - 1; // % 块长时, & OFFSET即可 + public static int MAXN = 300002; + public static int MAXB = 601; + public static int POW = 9; + public static int OFFSET = (1 << POW) - 1; public static int n, m; public static int[] arr = new int[MAXN]; @@ -54,7 +54,7 @@ public class Code02_MagicGirl1 { public static long[] ans = new long[MAXN]; // 达标子数组数量 // idx[1..siz]放着所有下标,下标之间根据val[下标]进行从小到大的基数排序 - // 每个val[下标]只有两位,高位数值(val[下标] >> POW),低位数值(val[下标] & OFFSET) + // val[下标]只有两位,高位 = val[下标] >> POW,低位 = val[下标] & OFFSET public static void radix(int[] idx, int[] val, int siz) { Arrays.fill(cntv, 0); for (int i = 1; i <= siz; i++) cntv[val[idx[i]] & OFFSET]++; From c90e41cdaf1b18471cecd48a4560a33f5efb2a04 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 18:13:41 +0800 Subject: [PATCH 0470/1170] modify code --- src/class174/Code02_MagicGirl1.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 2d5ebf9c9..862e66495 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -53,8 +53,9 @@ public class Code02_MagicGirl1 { public static int[] len = new int[MAXN]; // 总长度 public static long[] ans = new long[MAXN]; // 达标子数组数量 - // idx[1..siz]放着所有下标,下标之间根据val[下标]进行从小到大的基数排序 - // val[下标]只有两位,高位 = val[下标] >> POW,低位 = val[下标] & OFFSET + // idx[1..siz]存放着编号,编号之间根据val[编号],进行从小到大的基数排序 + // val[编号]的高位 = val[编号] >> POW + // val[编号]的低位 = val[编号] & OFFSET public static void radix(int[] idx, int[] val, int siz) { Arrays.fill(cntv, 0); for (int i = 1; i <= siz; i++) cntv[val[idx[i]] & OFFSET]++; From 306bd00132afc03be93c3b9d0acbcf3042dde97e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 18:15:26 +0800 Subject: [PATCH 0471/1170] modify code --- src/class174/Code02_MagicGirl1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 862e66495..389d64ca9 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -53,6 +53,7 @@ public class Code02_MagicGirl1 { public static int[] len = new int[MAXN]; // 总长度 public static long[] ans = new long[MAXN]; // 达标子数组数量 + // 讲解028 - 基数排序,不会的话看一下 // idx[1..siz]存放着编号,编号之间根据val[编号],进行从小到大的基数排序 // val[编号]的高位 = val[编号] >> POW // val[编号]的低位 = val[编号] & OFFSET From 8c9deade23749378b7c4fbf6fc9808e3903f5a5b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 18:17:47 +0800 Subject: [PATCH 0472/1170] modify code --- src/class174/Code02_MagicGirl1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 389d64ca9..3ebe9506c 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -54,7 +54,7 @@ public class Code02_MagicGirl1 { public static long[] ans = new long[MAXN]; // 达标子数组数量 // 讲解028 - 基数排序,不会的话看一下 - // idx[1..siz]存放着编号,编号之间根据val[编号],进行从小到大的基数排序 + // idx[1..siz]存放着编号,编号根据val[编号]的值排序,值只有两位 // val[编号]的高位 = val[编号] >> POW // val[编号]的低位 = val[编号] & OFFSET public static void radix(int[] idx, int[] val, int siz) { From 4631d25fdb58abb28ca3b7a1399c5769e625cf15 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 20:23:36 +0800 Subject: [PATCH 0473/1170] modify code --- src/class174/Code02_MagicGirl1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 3ebe9506c..350addfd5 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -53,8 +53,8 @@ public class Code02_MagicGirl1 { public static int[] len = new int[MAXN]; // 总长度 public static long[] ans = new long[MAXN]; // 达标子数组数量 - // 讲解028 - 基数排序,不会的话看一下 - // idx[1..siz]存放着编号,编号根据val[编号]的值排序,值只有两位 + // 讲解028 - 基数排序,不会的话去看课 + // idx[1..siz]中的编号排序,根据val[编号]的值排序 // val[编号]的高位 = val[编号] >> POW // val[编号]的低位 = val[编号] & OFFSET public static void radix(int[] idx, int[] val, int siz) { From 7092d3956f8ccc94e9e9ecb365fdc638173815a0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 20:40:18 +0800 Subject: [PATCH 0474/1170] modify code --- src/class174/Code02_MagicGirl1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 350addfd5..38e0920d9 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -48,8 +48,8 @@ public class Code02_MagicGirl1 { public static int[] next = new int[MAXN]; // 每个查询的答案信息 - public static int[] pre = new int[MAXN]; // 达标前缀长度 - public static int[] suf = new int[MAXN]; // 达标后缀长度 + public static int[] pre = new int[MAXN]; // <=v的前缀长度 + public static int[] suf = new int[MAXN]; // <=v的后缀长度 public static int[] len = new int[MAXN]; // 总长度 public static long[] ans = new long[MAXN]; // 达标子数组数量 @@ -70,9 +70,9 @@ public static void radix(int[] idx, int[] val, int siz) { for (int i = 1; i <= siz; i++) idx[i] = help[i]; } - // 之前的答案信息 pre[i]、suf[i]、len[i]、ans[i] - // 当前的答案信息 rpre、rsuf、rlen、rans - // 之前答案合并当前答案 + // 左侧的答案信息 pre[i]、suf[i]、len[i]、ans[i] + // 右侧的答案信息 rpre、rsuf、rlen、rans + // 左侧答案合并右侧答案 public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { ans[i] += rans + 1L * suf[i] * rpre; if (pre[i] == len[i]) { From a512c293b0a02ab824d99b335fce9b8af6490f7d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 20:53:46 +0800 Subject: [PATCH 0475/1170] modify code --- src/class174/Code02_MagicGirl1.java | 21 ++++----------------- src/class174/Code02_MagicGirl2.java | 16 ++++------------ 2 files changed, 8 insertions(+), 29 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 38e0920d9..15dc12e84 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -122,24 +122,11 @@ public static void update(int qi, int l, int r) { if (l <= jobi && jobi <= r) { calc(l, r); arr[jobi] = jobv; - int find = 0; - for (int i = 1; i <= cntp; i++) { - if (pos[i] == jobi) { - find = i; - break; - } - } - int tmp; - for (int i = find; i < cntp && arr[pos[i]] > arr[pos[i + 1]]; i++) { - tmp = pos[i]; - pos[i] = pos[i + 1]; - pos[i + 1] = tmp; - } - for (int i = find; i > 1 && arr[pos[i - 1]] > arr[pos[i]]; i--) { - tmp = pos[i - 1]; - pos[i - 1] = pos[i]; - pos[i] = tmp; + cntp = 0; + for (int i = l; i <= r; i++) { + pos[++cntp] = i; } + radix(pos, arr, cntp); } } diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index 9106e53a1..1f96735f6 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -102,19 +102,11 @@ // if (l <= jobi && jobi <= r) { // calc(l, r); // arr[jobi] = jobv; -// int find = 0; -// for (int i = 1; i <= cntp; i++) { -// if (pos[i] == jobi) { -// find = i; -// break; -// } -// } -// for (int i = find; i < cntp && arr[pos[i]] > arr[pos[i + 1]]; i++) { -// swap(pos[i], pos[i + 1]); -// } -// for (int i = find; i > 1 && arr[pos[i - 1]] > arr[pos[i]]; i--) { -// swap(pos[i - 1], pos[i]); +// cntp = 0; +// for (int i = l; i <= r; i++) { +// pos[++cntp] = i; // } +// radix(pos, arr, cntp); // } //} // From dd40a04475d92a22aee3b096b6ecf5ecbf8f7160 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 21:30:17 +0800 Subject: [PATCH 0476/1170] modify code --- src/class174/Code02_MagicGirl1.java | 12 +++--------- src/class174/Code02_MagicGirl2.java | 12 +++--------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 15dc12e84..fc9abe9a8 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -51,7 +51,7 @@ public class Code02_MagicGirl1 { public static int[] pre = new int[MAXN]; // <=v的前缀长度 public static int[] suf = new int[MAXN]; // <=v的后缀长度 public static int[] len = new int[MAXN]; // 总长度 - public static long[] ans = new long[MAXN]; // 达标子数组数量 + public static long[] ans = new long[MAXN]; // 达标子数组个数 // 讲解028 - 基数排序,不会的话去看课 // idx[1..siz]中的编号排序,根据val[编号]的值排序 @@ -75,14 +75,8 @@ public static void radix(int[] idx, int[] val, int siz) { // 左侧答案合并右侧答案 public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { ans[i] += rans + 1L * suf[i] * rpre; - if (pre[i] == len[i]) { - pre[i] += rpre; - } - if (rsuf == rlen) { - suf[i] += rsuf; - } else { - suf[i] = rsuf; - } + pre[i] = pre[i] != len[i] ? pre[i] : len[i] + rpre; + suf[i] = rsuf != rlen ? rsuf : rlen + suf[i]; len[i] += rlen; } diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index 1f96735f6..6796e0390 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -56,15 +56,9 @@ //} // //inline void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { -// ans[i] += rans + 1LL * suf[i] * rpre; -// if (pre[i] == len[i]) { -// pre[i] += rpre; -// } -// if (rsuf == rlen) { -// suf[i] += rsuf; -// } else { -// suf[i] = rsuf; -// } +// ans[i] += rans + 1L * suf[i] * rpre; +// pre[i] = pre[i] != len[i] ? pre[i] : len[i] + rpre; +// suf[i] = rsuf != rlen ? rsuf : rlen + suf[i]; // len[i] += rlen; //} // From 9cfb849795be29cfc0263366b01bd6af7b4de2fe Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 22:41:42 +0800 Subject: [PATCH 0477/1170] modifycode --- src/class174/Code02_MagicGirl1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index fc9abe9a8..86d4f2e09 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -43,7 +43,7 @@ public class Code02_MagicGirl1 { public static int[] cntv = new int[MAXB]; public static int[] help = new int[MAXN]; - // 双指针 + // 双链表 public static int[] last = new int[MAXN]; public static int[] next = new int[MAXN]; From aed9b9b769a866e585af4c99feaaf779327c902d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 23:01:35 +0800 Subject: [PATCH 0478/1170] modifycode --- src/class174/Code02_MagicGirl1.java | 55 ++++++++++------------------- src/class174/Code02_MagicGirl2.java | 55 ++++++++++------------------- 2 files changed, 38 insertions(+), 72 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 86d4f2e09..0b4fb56fd 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -83,11 +83,14 @@ public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { // que[1..cntq]放着所有查询的编号,每条查询都包含arr[l..r] // 根据arr[l..r]的数字状况,更新每个查询的答案信息 public static void calc(int l, int r) { - radix(que, v, cntq); + cntp = 0; for (int i = l; i <= r; i++) { + pos[++cntp] = i; last[i] = i - 1; next[i] = i + 1; } + radix(pos, arr, cntq); + radix(que, v, cntq); int rpre = 0, rsuf = 0, rlen = r - l + 1, rans = 0; int k = 1; for (int i = 1; i <= cntp; i++) { @@ -111,45 +114,25 @@ public static void calc(int l, int r) { cntq = 0; } - public static void update(int qi, int l, int r) { - int jobi = x[qi], jobv = v[qi]; - if (l <= jobi && jobi <= r) { - calc(l, r); - arr[jobi] = jobv; - cntp = 0; - for (int i = l; i <= r; i++) { - pos[++cntp] = i; - } - radix(pos, arr, cntp); - } - } - - public static void query(int qi, int l, int r) { - int jobl = x[qi], jobr = y[qi], jobv = v[qi]; - if (jobl <= l && r <= jobr) { - que[++cntq] = qi; - } else { - for (int i = Math.max(jobl, l); i <= Math.min(jobr, r); i++) { - if (arr[i] <= jobv) { - mergeAns(qi, 1, 1, 1, 1); - } else { - mergeAns(qi, 0, 0, 1, 0); - } - } - } - } - public static void compute(int l, int r) { - cntp = 0; - for (int i = l; i <= r; i++) { - pos[++cntp] = i; - } - radix(pos, arr, cntp); for (int qi = 1; qi <= m; qi++) { if (op[qi] == 1) { - update(qi, l, r); + if (l <= x[qi] && x[qi] <= r) { + calc(l, r); + arr[x[qi]] = v[qi]; + } } else { - query(qi, l, r); + if (x[qi] <= l && r <= y[qi]) { + que[++cntq] = qi; + } else { + for (int i = Math.max(x[qi], l); i <= Math.min(y[qi], r); i++) { + if (arr[i] <= v[qi]) { + mergeAns(qi, 1, 1, 1, 1); + } else { + mergeAns(qi, 0, 0, 1, 0); + } + } + } } } calc(l, r); diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index 6796e0390..3d893eb10 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -63,11 +63,14 @@ //} // //void calc(int l, int r) { -// radix(que, v, cntq); +// cntp = 0; // for (int i = l; i <= r; i++) { +// pos[++cntp] = i; // lst[i] = i - 1; // nxt[i] = i + 1; // } +// radix(pos, arr, cntp); +// radix(que, v, cntq); // int rpre = 0, rsuf = 0, rlen = r - l + 1, rans = 0; // int k = 1; // for (int i = 1; i <= cntp; i++) { @@ -91,45 +94,25 @@ // cntq = 0; //} // -//inline void update(int qi, int l, int r) { -// int jobi = x[qi], jobv = v[qi]; -// if (l <= jobi && jobi <= r) { -// calc(l, r); -// arr[jobi] = jobv; -// cntp = 0; -// for (int i = l; i <= r; i++) { -// pos[++cntp] = i; -// } -// radix(pos, arr, cntp); -// } -//} -// -//inline void query(int qi, int l, int r) { -// int jobl = x[qi], jobr = y[qi], jobv = v[qi]; -// if (jobl <= l && r <= jobr) { -// que[++cntq] = qi; -// } else { -// for (int i = max(jobl, l); i <= min(jobr, r); i++) { -// if (arr[i] <= jobv) { -// mergeAns(qi, 1, 1, 1, 1); -// } else { -// mergeAns(qi, 0, 0, 1, 0); -// } -// } -// } -//} -// //void compute(int l, int r) { -// cntp = 0; -// for (int i = l; i <= r; i++) { -// pos[++cntp] = i; -// } -// radix(pos, arr, cntp); // for (int qi = 1; qi <= m; qi++) { // if (op[qi] == 1) { -// update(qi, l, r); +// if (l <= x[qi] && x[qi] <= r) { +// calc(l, r); +// arr[x[qi]] = v[qi]; +// } // } else { -// query(qi, l, r); +// if (x[qi] <= l && r <= y[qi]) { +// que[++cntq] = qi; +// } else { +// for (int i = max(x[qi], l); i <= min(y[qi], r); i++) { +// if (arr[i] <= v[qi]) { +// mergeAns(qi, 1, 1, 1, 1); +// } else { +// mergeAns(qi, 0, 0, 1, 0); +// } +// } +// } // } // } // calc(l, r); From a633578687e5485291c0eb60496e789d7d079f88 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Jul 2025 23:05:27 +0800 Subject: [PATCH 0479/1170] modifycode --- src/class174/Code02_MagicGirl1.java | 3 +-- src/class174/Code02_MagicGirl2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 0b4fb56fd..84e5e9173 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -83,7 +83,6 @@ public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { // que[1..cntq]放着所有查询的编号,每条查询都包含arr[l..r] // 根据arr[l..r]的数字状况,更新每个查询的答案信息 public static void calc(int l, int r) { - cntp = 0; for (int i = l; i <= r; i++) { pos[++cntp] = i; last[i] = i - 1; @@ -111,7 +110,7 @@ public static void calc(int l, int r) { for (; k <= cntq; k++) { mergeAns(que[k], rpre, rsuf, rlen, rans); } - cntq = 0; + cntp = cntq = 0; } public static void compute(int l, int r) { diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index 3d893eb10..edaea47f5 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -63,7 +63,6 @@ //} // //void calc(int l, int r) { -// cntp = 0; // for (int i = l; i <= r; i++) { // pos[++cntp] = i; // lst[i] = i - 1; @@ -91,7 +90,7 @@ // for(; k <= cntq; k++) { // mergeAns(que[k], rpre, rsuf, rlen, rans); // } -// cntq = 0; +// cntp = cntq = 0; //} // //void compute(int l, int r) { From ca2ed72d3f41db844c70ffa6f445679e1f2d3bf2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 12:29:20 +0800 Subject: [PATCH 0480/1170] modifycode --- src/class174/Code02_MagicGirl1.java | 70 ++++++++++++++--------------- src/class174/Code02_MagicGirl2.java | 43 +++++++++--------- 2 files changed, 54 insertions(+), 59 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 84e5e9173..fa6cbef6e 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -32,8 +32,8 @@ public class Code02_MagicGirl1 { public static int[] y = new int[MAXN]; public static int[] v = new int[MAXN]; - // pos[1..cntp]存放数组下标 - // que[1..cntq]存放查询下标 + // pos[1..cntp]是当前序列块的下标 + // que[1..cntq]是整包清算的查询编号 public static int[] pos = new int[MAXN]; public static int[] que = new int[MAXN]; public static int cntp; @@ -47,14 +47,14 @@ public class Code02_MagicGirl1 { public static int[] last = new int[MAXN]; public static int[] next = new int[MAXN]; - // 每个查询的答案信息 - public static int[] pre = new int[MAXN]; // <=v的前缀长度 - public static int[] suf = new int[MAXN]; // <=v的后缀长度 - public static int[] len = new int[MAXN]; // 总长度 - public static long[] ans = new long[MAXN]; // 达标子数组个数 + // 每条查询的答案信息 + public static int[] pre = new int[MAXN]; + public static int[] suf = new int[MAXN]; + public static int[] len = new int[MAXN]; + public static long[] ans = new long[MAXN]; // 讲解028 - 基数排序,不会的话去看课 - // idx[1..siz]中的编号排序,根据val[编号]的值排序 + // idx[1..siz]都是编号,编号根据val[编号]的值排序 // val[编号]的高位 = val[编号] >> POW // val[编号]的低位 = val[编号] & OFFSET public static void radix(int[] idx, int[] val, int siz) { @@ -70,17 +70,18 @@ public static void radix(int[] idx, int[] val, int siz) { for (int i = 1; i <= siz; i++) idx[i] = help[i]; } - // 左侧的答案信息 pre[i]、suf[i]、len[i]、ans[i] - // 右侧的答案信息 rpre、rsuf、rlen、rans - // 左侧答案合并右侧答案 - public static void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { - ans[i] += rans + 1L * suf[i] * rpre; - pre[i] = pre[i] != len[i] ? pre[i] : len[i] + rpre; - suf[i] = rsuf != rlen ? rsuf : rlen + suf[i]; - len[i] += rlen; + // 之前的答案信息 pre[i]、suf[i]、len[i]、ans[i] + // 当前的答案信息 curPre、curSuf、curLen、curAns + // 之前的答案合并当前的答案 + public static void mergeAns(int i, int curPre, int curSuf, int curLen, int curAns) { + ans[i] += 1L * suf[i] * curPre + curAns; + pre[i] = pre[i] + (pre[i] == len[i] ? curPre : 0); + suf[i] = curSuf + (curSuf == curLen ? suf[i] : 0); + len[i] += curLen; } - // que[1..cntq]放着所有查询的编号,每条查询都包含arr[l..r] + // 整包结算 + // que[1..cntq]是查询编号,每条查询整包arr[l..r] // 根据arr[l..r]的数字状况,更新每个查询的答案信息 public static void calc(int l, int r) { for (int i = l; i <= r; i++) { @@ -88,27 +89,24 @@ public static void calc(int l, int r) { last[i] = i - 1; next[i] = i + 1; } - radix(pos, arr, cntq); + radix(pos, arr, cntp); radix(que, v, cntq); - int rpre = 0, rsuf = 0, rlen = r - l + 1, rans = 0; - int k = 1; - for (int i = 1; i <= cntp; i++) { - int idx = pos[i]; - for (; k <= cntq && v[que[k]] < arr[idx]; k++) { - mergeAns(que[k], rpre, rsuf, rlen, rans); - } - if (last[idx] == l - 1) { - rpre += next[idx] - idx; - } - if (next[idx] == r + 1) { - rsuf += idx - last[idx]; + int curPre = 0, curSuf = 0, curLen = r - l + 1, curAns = 0; + for (int i = 1, j = 1, idx; i <= cntq; i++) { + while (j <= cntp && arr[pos[j]] <= v[que[i]]) { + idx = pos[j]; + if (last[idx] == l - 1) { + curPre += next[idx] - idx; + } + if (next[idx] == r + 1) { + curSuf += idx - last[idx]; + } + curAns += 1L * (idx - last[idx]) * (next[idx] - idx); + last[next[idx]] = last[idx]; + next[last[idx]] = next[idx]; + j++; } - rans += 1L * (idx - last[idx]) * (next[idx] - idx); - last[next[idx]] = last[idx]; - next[last[idx]] = next[idx]; - } - for (; k <= cntq; k++) { - mergeAns(que[k], rpre, rsuf, rlen, rans); + mergeAns(que[i], curPre, curSuf, curLen, curAns); } cntp = cntq = 0; } diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index edaea47f5..c8f27294e 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -55,11 +55,11 @@ // for (int i = 1; i <= siz; i++) idx[i] = help[i]; //} // -//inline void mergeAns(int i, int rpre, int rsuf, int rlen, int rans) { -// ans[i] += rans + 1L * suf[i] * rpre; -// pre[i] = pre[i] != len[i] ? pre[i] : len[i] + rpre; -// suf[i] = rsuf != rlen ? rsuf : rlen + suf[i]; -// len[i] += rlen; +//inline void mergeAns(int i, int curPre, int curSuf, int curLen, int curAns) { +// ans[i] += 1L * suf[i] * curPre + curAns; +// pre[i] = pre[i] + (pre[i] == len[i] ? curPre : 0); +// suf[i] = curSuf + (curSuf == curLen ? suf[i] : 0); +// len[i] += curLen; //} // //void calc(int l, int r) { @@ -70,25 +70,22 @@ // } // radix(pos, arr, cntp); // radix(que, v, cntq); -// int rpre = 0, rsuf = 0, rlen = r - l + 1, rans = 0; -// int k = 1; -// for (int i = 1; i <= cntp; i++) { -// int idx = pos[i]; -// for(; k <= cntq && v[que[k]] < arr[idx]; k++) { -// mergeAns(que[k], rpre, rsuf, rlen, rans); -// } -// if (lst[idx] == l - 1) { -// rpre += nxt[idx] - idx; -// } -// if (nxt[idx] == r + 1) { -// rsuf += idx - lst[idx]; +// int curPre = 0, curSuf = 0, curLen = r - l + 1, curAns = 0; +// for (int i = 1, j = 1, idx; i <= cntq; i++) { +// while (j <= cntp && arr[pos[j]] <= v[que[i]]) { +// idx = pos[j]; +// if (lst[idx] == l - 1) { +// curPre += nxt[idx] - idx; +// } +// if (nxt[idx] == r + 1) { +// curSuf += idx - lst[idx]; +// } +// curAns += 1L * (idx - lst[idx]) * (nxt[idx] - idx); +// lst[nxt[idx]] = lst[idx]; +// nxt[lst[idx]] = nxt[idx]; +// j++; // } -// rans += 1LL * (idx - lst[idx]) * (nxt[idx] - idx); -// lst[nxt[idx]] = lst[idx]; -// nxt[lst[idx]] = nxt[idx]; -// } -// for(; k <= cntq; k++) { -// mergeAns(que[k], rpre, rsuf, rlen, rans); +// mergeAns(que[i], curPre, curSuf, curLen, curAns); // } // cntp = cntq = 0; //} From 23954c3147cefb33a06d51665045d87f89cc16ce Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 12:32:22 +0800 Subject: [PATCH 0481/1170] modify code --- src/class174/Code02_MagicGirl1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index fa6cbef6e..2161f1ee4 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -81,8 +81,8 @@ public static void mergeAns(int i, int curPre, int curSuf, int curLen, int curAn } // 整包结算 - // que[1..cntq]是查询编号,每条查询整包arr[l..r] - // 根据arr[l..r]的数字状况,更新每个查询的答案信息 + // que[1..cntq]是查询编号,每条查询整包[l..r] + // 根据序列块的数字状况,更新每个查询的答案信息 public static void calc(int l, int r) { for (int i = l; i <= r; i++) { pos[++cntp] = i; From 87fb6487c1c0246e765bc8c8407b482884c5e1cd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 13:20:12 +0800 Subject: [PATCH 0482/1170] modify code --- src/class174/Code02_MagicGirl1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 2161f1ee4..37301d598 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -33,7 +33,7 @@ public class Code02_MagicGirl1 { public static int[] v = new int[MAXN]; // pos[1..cntp]是当前序列块的下标 - // que[1..cntq]是整包清算的查询编号 + // que[1..cntq]是整包结算的查询编号 public static int[] pos = new int[MAXN]; public static int[] que = new int[MAXN]; public static int cntp; From 77e4c6780bfc424b198deccaed52530fda5e8df7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 13:26:25 +0800 Subject: [PATCH 0483/1170] modify code --- src/class174/Code02_MagicGirl1.java | 14 +++++++------- src/class174/Code02_MagicGirl2.java | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index 37301d598..c68789f69 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -70,10 +70,10 @@ public static void radix(int[] idx, int[] val, int siz) { for (int i = 1; i <= siz; i++) idx[i] = help[i]; } - // 之前的答案信息 pre[i]、suf[i]、len[i]、ans[i] - // 当前的答案信息 curPre、curSuf、curLen、curAns - // 之前的答案合并当前的答案 - public static void mergeAns(int i, int curPre, int curSuf, int curLen, int curAns) { + // 查询的答案信息 pre[i]、suf[i]、len[i]、ans[i] + // 当前块答案信息 curPre、curSuf、curLen、curAns + // 查询的答案信息 合并 当前块答案信息 + public static void merge(int i, int curPre, int curSuf, int curLen, int curAns) { ans[i] += 1L * suf[i] * curPre + curAns; pre[i] = pre[i] + (pre[i] == len[i] ? curPre : 0); suf[i] = curSuf + (curSuf == curLen ? suf[i] : 0); @@ -106,7 +106,7 @@ public static void calc(int l, int r) { next[last[idx]] = next[idx]; j++; } - mergeAns(que[i], curPre, curSuf, curLen, curAns); + merge(que[i], curPre, curSuf, curLen, curAns); } cntp = cntq = 0; } @@ -124,9 +124,9 @@ public static void compute(int l, int r) { } else { for (int i = Math.max(x[qi], l); i <= Math.min(y[qi], r); i++) { if (arr[i] <= v[qi]) { - mergeAns(qi, 1, 1, 1, 1); + merge(qi, 1, 1, 1, 1); } else { - mergeAns(qi, 0, 0, 1, 0); + merge(qi, 0, 0, 1, 0); } } } diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index c8f27294e..40d1f8aa5 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -55,7 +55,7 @@ // for (int i = 1; i <= siz; i++) idx[i] = help[i]; //} // -//inline void mergeAns(int i, int curPre, int curSuf, int curLen, int curAns) { +//inline void merge(int i, int curPre, int curSuf, int curLen, int curAns) { // ans[i] += 1L * suf[i] * curPre + curAns; // pre[i] = pre[i] + (pre[i] == len[i] ? curPre : 0); // suf[i] = curSuf + (curSuf == curLen ? suf[i] : 0); @@ -85,7 +85,7 @@ // nxt[lst[idx]] = nxt[idx]; // j++; // } -// mergeAns(que[i], curPre, curSuf, curLen, curAns); +// merge(que[i], curPre, curSuf, curLen, curAns); // } // cntp = cntq = 0; //} @@ -103,9 +103,9 @@ // } else { // for (int i = max(x[qi], l); i <= min(y[qi], r); i++) { // if (arr[i] <= v[qi]) { -// mergeAns(qi, 1, 1, 1, 1); +// merge(qi, 1, 1, 1, 1); // } else { -// mergeAns(qi, 0, 0, 1, 0); +// merge(qi, 0, 0, 1, 0); // } // } // } From 90f6c1852e87fdfa7ad8a38d2a6c9c9bd047c03c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 15:18:37 +0800 Subject: [PATCH 0484/1170] modify code --- src/class174/Code02_MagicGirl1.java | 14 +++++++------- src/class174/Code02_MagicGirl2.java | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index c68789f69..a9cf5b3fd 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -33,9 +33,9 @@ public class Code02_MagicGirl1 { public static int[] v = new int[MAXN]; // pos[1..cntp]是当前序列块的下标 - // que[1..cntq]是整包结算的查询编号 + // qid[1..cntq]是整包结算的查询编号 public static int[] pos = new int[MAXN]; - public static int[] que = new int[MAXN]; + public static int[] qid = new int[MAXN]; public static int cntp; public static int cntq; @@ -81,7 +81,7 @@ public static void merge(int i, int curPre, int curSuf, int curLen, int curAns) } // 整包结算 - // que[1..cntq]是查询编号,每条查询整包[l..r] + // qid[1..cntq]是查询编号,每条查询整包[l..r] // 根据序列块的数字状况,更新每个查询的答案信息 public static void calc(int l, int r) { for (int i = l; i <= r; i++) { @@ -90,10 +90,10 @@ public static void calc(int l, int r) { next[i] = i + 1; } radix(pos, arr, cntp); - radix(que, v, cntq); + radix(qid, v, cntq); int curPre = 0, curSuf = 0, curLen = r - l + 1, curAns = 0; for (int i = 1, j = 1, idx; i <= cntq; i++) { - while (j <= cntp && arr[pos[j]] <= v[que[i]]) { + while (j <= cntp && arr[pos[j]] <= v[qid[i]]) { idx = pos[j]; if (last[idx] == l - 1) { curPre += next[idx] - idx; @@ -106,7 +106,7 @@ public static void calc(int l, int r) { next[last[idx]] = next[idx]; j++; } - merge(que[i], curPre, curSuf, curLen, curAns); + merge(qid[i], curPre, curSuf, curLen, curAns); } cntp = cntq = 0; } @@ -120,7 +120,7 @@ public static void compute(int l, int r) { } } else { if (x[qi] <= l && r <= y[qi]) { - que[++cntq] = qi; + qid[++cntq] = qi; } else { for (int i = Math.max(x[qi], l); i <= Math.min(y[qi], r); i++) { if (arr[i] <= v[qi]) { diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index 40d1f8aa5..e59cb767f 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -27,7 +27,7 @@ //int v[MAXN]; // //int pos[MAXN]; -//int que[MAXN]; +//int qid[MAXN]; //int cntp; //int cntq; // @@ -69,10 +69,10 @@ // nxt[i] = i + 1; // } // radix(pos, arr, cntp); -// radix(que, v, cntq); +// radix(qid, v, cntq); // int curPre = 0, curSuf = 0, curLen = r - l + 1, curAns = 0; // for (int i = 1, j = 1, idx; i <= cntq; i++) { -// while (j <= cntp && arr[pos[j]] <= v[que[i]]) { +// while (j <= cntp && arr[pos[j]] <= v[qid[i]]) { // idx = pos[j]; // if (lst[idx] == l - 1) { // curPre += nxt[idx] - idx; @@ -85,7 +85,7 @@ // nxt[lst[idx]] = nxt[idx]; // j++; // } -// merge(que[i], curPre, curSuf, curLen, curAns); +// merge(qid[i], curPre, curSuf, curLen, curAns); // } // cntp = cntq = 0; //} @@ -99,7 +99,7 @@ // } // } else { // if (x[qi] <= l && r <= y[qi]) { -// que[++cntq] = qi; +// qid[++cntq] = qi; // } else { // for (int i = max(x[qi], l); i <= min(y[qi], r); i++) { // if (arr[i] <= v[qi]) { From 1d0a1ea6f5e6a557058285795e4c30de921da331 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 17:41:24 +0800 Subject: [PATCH 0485/1170] modify code --- src/class174/Code02_MagicGirl1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class174/Code02_MagicGirl1.java b/src/class174/Code02_MagicGirl1.java index a9cf5b3fd..6fc1bdbdd 100644 --- a/src/class174/Code02_MagicGirl1.java +++ b/src/class174/Code02_MagicGirl1.java @@ -111,6 +111,7 @@ public static void calc(int l, int r) { cntp = cntq = 0; } + // 序列块[l..r],处理一遍所有的操作(单改 + 查询) public static void compute(int l, int r) { for (int qi = 1; qi <= m; qi++) { if (op[qi] == 1) { From e38954a1fc79603f472e5384adf2b37f64bf6613 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 19:38:15 +0800 Subject: [PATCH 0486/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 7 ++----- src/class174/Code03_ColorfulWorld2.java | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index fc7a6eae6..68c161852 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -59,7 +59,7 @@ public static void down(int l, int r) { public static void update(int qi, int l, int r) { int jobl = ql[qi], jobr = qr[qi], jobx = qx[qi]; - if (jobx > maxv - lazy || jobl > r || jobr < l) { + if (jobx >= maxv - lazy || jobl > r || jobr < l) { return; } if (jobl <= l && r <= jobr) { @@ -103,10 +103,7 @@ public static void update(int qi, int l, int r) { public static void query(int qi, int l, int r) { int jobl = ql[qi], jobr = qr[qi], jobx = qx[qi]; - if (jobx == 0) { - return; - } - if (jobx > maxv - lazy || jobl > r || jobr < l) { + if (jobx == 0 || jobx > maxv - lazy || jobl > r || jobr < l) { return; } if (jobl <= l && r <= jobr) { diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index 3d3789c59..02765aea7 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -53,7 +53,7 @@ // //void update(int qi, int l, int r) { // int jobl = ql[qi], jobr = qr[qi], jobx = qx[qi]; -// if (jobx > maxv - lazy || jobl > r || jobr < l) { +// if (jobx >= maxv - lazy || jobl > r || jobr < l) { // return; // } // if (jobl <= l && r <= jobr) { @@ -97,10 +97,7 @@ // //void query(int qi, int l, int r) { // int jobl = ql[qi], jobr = qr[qi], jobx = qx[qi]; -// if (jobx == 0) { -// return; -// } -// if (jobx > maxv - lazy || jobl > r || jobr < l) { +// if (jobx == 0 || jobx > maxv - lazy || jobl > r || jobr < l) { // return; // } // if (jobl <= l && r <= jobr) { From e48be5a415b462733ffae43d6bc13319a696e63e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 19:45:25 +0800 Subject: [PATCH 0487/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 24 ++++++++++++------------ src/class174/Code03_ColorfulWorld2.java | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 68c161852..09e962330 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -36,7 +36,7 @@ public class Code03_ColorfulWorld1 { public static int[] pre0 = new int[MAXN]; public static int[] fa = new int[MAXV]; - public static int[] sum = new int[MAXV]; + public static int[] cntv = new int[MAXV]; public static int[] ans = new int[MAXM]; @@ -65,19 +65,19 @@ public static void update(int qi, int l, int r) { if (jobl <= l && r <= jobr) { if ((jobx << 1) <= maxv - lazy) { for (int v = lazy + 1; v <= lazy + jobx; v++) { - sum[v + jobx] += sum[v]; - sum[v] = 0; + cntv[v + jobx] += cntv[v]; + cntv[v] = 0; union(v, v + jobx); } lazy += jobx; } else { for (int v = maxv; v > lazy + jobx; v--) { - sum[v - jobx] += sum[v]; - sum[v] = 0; + cntv[v - jobx] += cntv[v]; + cntv[v] = 0; union(v, v - jobx); } for (int v = maxv; v >= 0; v--) { - if (sum[v] != 0) { + if (cntv[v] != 0) { maxv = v; break; } @@ -87,13 +87,13 @@ public static void update(int qi, int l, int r) { down(l, r); for (int i = Math.max(l, jobl); i <= Math.min(r, jobr); i++) { if (arr[i] - lazy > jobx) { - sum[arr[i]]--; + cntv[arr[i]]--; arr[i] -= jobx; - sum[arr[i]]++; + cntv[arr[i]]++; } } for (int v = maxv; v >= 0; v--) { - if (sum[v] != 0) { + if (cntv[v] != 0) { maxv = v; break; } @@ -107,7 +107,7 @@ public static void query(int qi, int l, int r) { return; } if (jobl <= l && r <= jobr) { - ans[qi] += sum[jobx + lazy]; + ans[qi] += cntv[jobx + lazy]; } else { down(l, r); for (int i = Math.max(l, jobl); i <= Math.min(r, jobr); i++) { @@ -119,11 +119,11 @@ public static void query(int qi, int l, int r) { } public static void compute(int l, int r) { - Arrays.fill(sum, 0); + Arrays.fill(cntv, 0); maxv = lazy = 0; for (int i = l; i <= r; i++) { maxv = Math.max(maxv, arr[i]); - sum[arr[i]]++; + cntv[arr[i]]++; } for (int v = 0; v <= maxv; v++) { fa[v] = v; diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index 02765aea7..5cae34136 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -30,7 +30,7 @@ // //int pre0[MAXN]; //int fa[MAXV]; -//int sum[MAXV]; +//int cntv[MAXV]; // //int ans[MAXM]; // @@ -59,19 +59,19 @@ // if (jobl <= l && r <= jobr) { // if ((jobx << 1) <= maxv - lazy) { // for (int v = lazy + 1; v <= lazy + jobx; v++) { -// sum[v + jobx] += sum[v]; -// sum[v] = 0; +// cntv[v + jobx] += cntv[v]; +// cntv[v] = 0; // Union(v, v + jobx); // } // lazy += jobx; // } else { // for (int v = maxv; v > lazy + jobx; v--) { -// sum[v - jobx] += sum[v]; -// sum[v] = 0; +// cntv[v - jobx] += cntv[v]; +// cntv[v] = 0; // Union(v, v - jobx); // } // for (int v = maxv; v >= 0; v--) { -// if (sum[v] != 0) { +// if (cntv[v] != 0) { // maxv = v; // break; // } @@ -81,13 +81,13 @@ // down(l, r); // for (int i = max(l, jobl); i <= min(r, jobr); i++) { // if (arr[i] - lazy > jobx) { -// sum[arr[i]]--; +// cntv[arr[i]]--; // arr[i] -= jobx; -// sum[arr[i]]++; +// cntv[arr[i]]++; // } // } // for (int v = maxv; v >= 0; v--) { -// if (sum[v] != 0) { +// if (cntv[v] != 0) { // maxv = v; // break; // } @@ -101,7 +101,7 @@ // return; // } // if (jobl <= l && r <= jobr) { -// ans[qi] += sum[jobx + lazy]; +// ans[qi] += cntv[jobx + lazy]; // } else { // down(l, r); // for (int i = max(l, jobl); i <= min(r, jobr); i++) { @@ -113,11 +113,11 @@ //} // //void compute(int l, int r) { -// fill(sum, sum + MAXN, 0); +// fill(cntv, cntv + MAXV, 0); // maxv = lazy = 0; // for (int i = l; i <= r; i++) { // maxv = max(maxv, arr[i]); -// sum[arr[i]]++; +// cntv[arr[i]]++; // } // for (int v = 0; v <= maxv; v++) { // fa[v] = v; From de036d55df98e29a2c35b93a7ea1d3bec7063c57 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 19:47:58 +0800 Subject: [PATCH 0488/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 2 +- src/class174/Code03_ColorfulWorld2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 09e962330..8e89ac698 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -34,8 +34,8 @@ public class Code03_ColorfulWorld1 { public static int[] qr = new int[MAXM]; public static int[] qx = new int[MAXM]; - public static int[] pre0 = new int[MAXN]; public static int[] fa = new int[MAXV]; + public static int[] pre0 = new int[MAXN]; public static int[] cntv = new int[MAXV]; public static int[] ans = new int[MAXM]; diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index 5cae34136..7907295fd 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -28,8 +28,8 @@ //int qr[MAXM]; //int qx[MAXM]; // -//int pre0[MAXN]; //int fa[MAXV]; +//int pre0[MAXN]; //int cntv[MAXV]; // //int ans[MAXM]; From 1a73475ce48dd81f90c3875aa33a8c98aa3252da Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 19:54:49 +0800 Subject: [PATCH 0489/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 8 +++++++- src/class174/Code03_ColorfulWorld2.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 8e89ac698..14f5577a9 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -26,7 +26,6 @@ public class Code03_ColorfulWorld1 { public static int MAXV = 100002; public static int n, m; public static int blen, bnum; - public static int maxv, lazy; public static int[] arr = new int[MAXN]; public static int[] op = new int[MAXM]; @@ -34,10 +33,17 @@ public class Code03_ColorfulWorld1 { public static int[] qr = new int[MAXM]; public static int[] qx = new int[MAXM]; + // maxv代表一个序列块中的最大值 + // lazy代表一个序列块中,所有数字需要统计减去多少 + // fa代表值域并查集 + // pre0代表数组前缀上0的词频统计 + // cntv代表一个序列块中每种值的词频统计 + public static int maxv, lazy; public static int[] fa = new int[MAXV]; public static int[] pre0 = new int[MAXN]; public static int[] cntv = new int[MAXV]; + // 查询的答案 public static int[] ans = new int[MAXM]; public static int find(int x) { diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index 7907295fd..130aab998 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -20,7 +20,6 @@ //const int MAXV = 100002; //int n, m; //int blen, bnum; -//int maxv, lazy; // //int arr[MAXN]; //int op[MAXM]; @@ -28,6 +27,7 @@ //int qr[MAXM]; //int qx[MAXM]; // +//int maxv, lazy; //int fa[MAXV]; //int pre0[MAXN]; //int cntv[MAXV]; From b6d244f4f59b820c3b2090d142b1936ba32b086e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 20:00:09 +0800 Subject: [PATCH 0490/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 14f5577a9..00ba1a1bc 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -46,6 +46,7 @@ public class Code03_ColorfulWorld1 { // 查询的答案 public static int[] ans = new int[MAXM]; + // 查询x值变成了什么 public static int find(int x) { if (x != fa[x]) { fa[x] = find(fa[x]); @@ -53,10 +54,12 @@ public static int find(int x) { return fa[x]; } + // 所有x值变成y值 public static void union(int x, int y) { fa[find(x)] = find(y); } + // 根据值域并查集的修改结果,把修改写入arr[l..r] public static void down(int l, int r) { for (int i = l; i <= r; i++) { arr[i] = find(arr[i]); From 0f3c89ba5bfa4ccd33015cd784fe7c4c82a2b8b8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 20:01:48 +0800 Subject: [PATCH 0491/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 00ba1a1bc..7b94bdb29 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -59,7 +59,7 @@ public static void union(int x, int y) { fa[find(x)] = find(y); } - // 根据值域并查集的修改结果,把修改写入arr[l..r] + // 修改保留在值域并查集,把真实值写入arr[l..r] public static void down(int l, int r) { for (int i = l; i <= r; i++) { arr[i] = find(arr[i]); From 94a53a7ab5a9f37037ab99bc7d1307e46c9d98db Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 20:08:06 +0800 Subject: [PATCH 0492/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 2 +- src/class174/Code03_ColorfulWorld2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 7b94bdb29..7e03b8b15 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -3,7 +3,7 @@ // 五彩斑斓的世界,java版 // 给定一个长度为n的数组arr,一共有m条操作,每条操作类型如下 // 操作 1 l r x : arr[l..r]范围上,所有大于x的数减去x -// 操作 2 l r x : arr[l..l]范围上,查询x出现的次数 +// 操作 2 l r x : arr[l..r]范围上,查询x出现的次数 // 1 <= n <= 10^6 // 1 <= m <= 5 * 10^5 // 0 <= arr[i]、x <= 10^5 diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index 130aab998..6c0f4d5c7 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -3,7 +3,7 @@ // 五彩斑斓的世界,C++版 // 给定一个长度为n的数组arr,一共有m条操作,每条操作类型如下 // 操作 1 l r x : arr[l..r]范围上,所有大于x的数减去x -// 操作 2 l r x : arr[l..l]范围上,查询x出现的次数 +// 操作 2 l r x : arr[l..r]范围上,查询x出现的次数 // 1 <= n <= 10^6 // 1 <= m <= 5 * 10^5 // 0 <= arr[i]、x <= 10^5 From 280eb3f26e12777cae3852f97d584a1ffe8f3369 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 21:23:54 +0800 Subject: [PATCH 0493/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 7e03b8b15..8ee1cdcc2 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -59,7 +59,7 @@ public static void union(int x, int y) { fa[find(x)] = find(y); } - // 修改保留在值域并查集,把真实值写入arr[l..r] + // 修改保留在值域并查集,把修改写入arr[l..r] public static void down(int l, int r) { for (int i = l; i <= r; i++) { arr[i] = find(arr[i]); From 503a4c91658ef3235746602cb14bc423bbf622c3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 21:28:48 +0800 Subject: [PATCH 0494/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 2 +- src/class174/Code03_ColorfulWorld2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 8ee1cdcc2..0a3d34229 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -80,7 +80,7 @@ public static void update(int qi, int l, int r) { } lazy += jobx; } else { - for (int v = maxv; v > lazy + jobx; v--) { + for (int v = lazy + jobx + 1; v <= maxv; v++) { cntv[v - jobx] += cntv[v]; cntv[v] = 0; union(v, v - jobx); diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index 6c0f4d5c7..b1ead2e55 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -65,7 +65,7 @@ // } // lazy += jobx; // } else { -// for (int v = maxv; v > lazy + jobx; v--) { +// for (int v = lazy + jobx + 1; v <= maxv; v++) { // cntv[v - jobx] += cntv[v]; // cntv[v] = 0; // Union(v, v - jobx); From 139aea758cdfc92b20317834aae1437217ca928a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Jul 2025 22:14:59 +0800 Subject: [PATCH 0495/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 8 ++++---- src/class174/Code03_ColorfulWorld2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index 0a3d34229..dc9dfb990 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -55,8 +55,8 @@ public static int find(int x) { } // 所有x值变成y值 - public static void union(int x, int y) { - fa[find(x)] = find(y); + public static void change(int x, int y) { + fa[x] = y; } // 修改保留在值域并查集,把修改写入arr[l..r] @@ -76,14 +76,14 @@ public static void update(int qi, int l, int r) { for (int v = lazy + 1; v <= lazy + jobx; v++) { cntv[v + jobx] += cntv[v]; cntv[v] = 0; - union(v, v + jobx); + change(v, v + jobx); } lazy += jobx; } else { for (int v = lazy + jobx + 1; v <= maxv; v++) { cntv[v - jobx] += cntv[v]; cntv[v] = 0; - union(v, v - jobx); + change(v, v - jobx); } for (int v = maxv; v >= 0; v--) { if (cntv[v] != 0) { diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index b1ead2e55..befc8e922 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -41,8 +41,8 @@ // return fa[x]; //} // -//void Union(int x, int y) { -// fa[find(x)] = find(y); +//void change(int x, int y) { +// fa[x] = y; //} // //void down(int l, int r) { @@ -61,14 +61,14 @@ // for (int v = lazy + 1; v <= lazy + jobx; v++) { // cntv[v + jobx] += cntv[v]; // cntv[v] = 0; -// Union(v, v + jobx); +// change(v, v + jobx); // } // lazy += jobx; // } else { // for (int v = lazy + jobx + 1; v <= maxv; v++) { // cntv[v - jobx] += cntv[v]; // cntv[v] = 0; -// Union(v, v - jobx); +// change(v, v - jobx); // } // for (int v = maxv; v >= 0; v--) { // if (cntv[v] != 0) { From fd96ab2acc8cbce4ed82e76d83bbba1fc2a89516 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 12:32:09 +0800 Subject: [PATCH 0496/1170] modify code --- src/class174/Code04_Bridge1.java | 26 +++++++++++++------------- src/class174/Code04_Bridge2.java | 26 +++++++++++++------------- src/class174/Code05_Lcm1.java | 18 ++++++++---------- src/class174/Code05_Lcm2.java | 14 +++++++------- 4 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index 872846f23..00d8069f8 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -137,25 +137,25 @@ public static void compute(int l, int r) { } } sort(query, car, 1, cntq); - int k = 1; - for (int i = 1; i <= cntq; i++) { - for (; k <= m && w[edge[k]] >= car[query[i]]; k++) { - if (!vis[edge[k]]) { - union(u[edge[k]], v[edge[k]]); + for (int i = 1, j = 1; i <= cntq; i++) { + while (j <= m && w[edge[j]] >= car[query[i]]) { + if (!vis[edge[j]]) { + union(u[edge[j]], v[edge[j]]); } + j++; } opsize = 0; - for (int j = 1; j <= cntu; j++) { - curw[eid[update[j]]] = w[eid[update[j]]]; + for (int k = 1; k <= cntu; k++) { + curw[eid[update[k]]] = w[eid[update[k]]]; } - for (int j = 1; j <= cntu; j++) { - if (update[j] < query[i]) { - curw[eid[update[j]]] = tow[update[j]]; + for (int k = 1; k <= cntu; k++) { + if (update[k] < query[i]) { + curw[eid[update[k]]] = tow[update[k]]; } } - for (int j = 1; j <= cntu; j++) { - if (curw[eid[update[j]]] >= car[query[i]]) { - union(u[eid[update[j]]], v[eid[update[j]]]); + for (int k = 1; k <= cntu; k++) { + if (curw[eid[update[k]]] >= car[query[i]]) { + union(u[eid[update[k]]], v[eid[update[k]]]); } } ans[query[i]] = siz[find(nid[query[i]])]; diff --git a/src/class174/Code04_Bridge2.java b/src/class174/Code04_Bridge2.java index b6b03dd8f..ed4ae15c9 100644 --- a/src/class174/Code04_Bridge2.java +++ b/src/class174/Code04_Bridge2.java @@ -114,25 +114,25 @@ // } // } // sort(query + 1, query + cntq + 1, [&](int x, int y) { return car[x] > car[y]; }); -// int k = 1; -// for (int i = 1; i <= cntq; i++) { -// for (; k <= m && w[edge[k]] >= car[query[i]]; k++) { -// if (!vis[edge[k]]) { -// Union(u[edge[k]], v[edge[k]]); +// for (int i = 1, j = 1; i <= cntq; i++) { +// while (j <= m && w[edge[j]] >= car[query[i]]) { +// if (!vis[edge[j]]) { +// Union(u[edge[j]], v[edge[j]]); // } +// j++; // } // opsize = 0; -// for (int j = 1; j <= cntu; j++) { -// curw[eid[update[j]]] = w[eid[update[j]]]; +// for (int k = 1; k <= cntu; k++) { +// curw[eid[update[k]]] = w[eid[update[k]]]; // } -// for (int j = 1; j <= cntu; j++) { -// if (update[j] < query[i]) { -// curw[eid[update[j]]] = tow[update[j]]; +// for (int k = 1; k <= cntu; k++) { +// if (update[k] < query[i]) { +// curw[eid[update[k]]] = tow[update[k]]; // } // } -// for (int j = 1; j <= cntu; j++) { -// if (curw[eid[update[j]]] >= car[query[i]]) { -// Union(u[eid[update[j]]], v[eid[update[j]]]); +// for (int k = 1; k <= cntu; k++) { +// if (curw[eid[update[k]]] >= car[query[i]]) { +// Union(u[eid[update[k]]], v[eid[update[k]]]); // } // } // ans[query[i]] = siz[find(nid[query[i]])]; diff --git a/src/class174/Code05_Lcm1.java b/src/class174/Code05_Lcm1.java index 50a725271..65c62021d 100644 --- a/src/class174/Code05_Lcm1.java +++ b/src/class174/Code05_Lcm1.java @@ -127,19 +127,17 @@ public static void compute(int l, int r) { } } if (cntq > 0) { - // 可以使用额外的数组,每块内部根据b进行排序 - // 每次把新块归并进来,保证 1..l-1 范围根据b有序 - // 可以省掉一个log的复杂度,本题不做这个优化也能通过,索性算了 + // 本题直接排序能通过,就不写归并了 sort(edge, eb, 1, l - 1); - int pos = 1; - for (int i = 1; i <= cntq; i++) { - for (; pos < l && eb[edge[pos]] <= qb[cur[i]]; pos++) { - union(eu[edge[pos]], ev[edge[pos]], ea[edge[pos]], eb[edge[pos]]); + for (int i = 1, j = 1; i <= cntq; i++) { + while (j < l && eb[edge[j]] <= qb[cur[i]]) { + union(eu[edge[j]], ev[edge[j]], ea[edge[j]], eb[edge[j]]); + j++; } opsize = 0; - for (int j = l; j <= r; j++) { - if (ea[edge[j]] <= qa[cur[i]] && eb[edge[j]] <= qb[cur[i]]) { - union(eu[edge[j]], ev[edge[j]], ea[edge[j]], eb[edge[j]]); + for (int k = l; k <= r; k++) { + if (ea[edge[k]] <= qa[cur[i]] && eb[edge[k]] <= qb[cur[i]]) { + union(eu[edge[k]], ev[edge[k]], ea[edge[k]], eb[edge[k]]); } } ans[qid[cur[i]]] = query(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); diff --git a/src/class174/Code05_Lcm2.java b/src/class174/Code05_Lcm2.java index 80b7aee91..38c9692c6 100644 --- a/src/class174/Code05_Lcm2.java +++ b/src/class174/Code05_Lcm2.java @@ -108,15 +108,15 @@ // } // if (cntq > 0) { // sort(edge + 1, edge + l, [&](int x, int y) { return eb[x] < eb[y]; }); -// int pos = 1; -// for (int i = 1; i <= cntq; i++) { -// for (; pos < l && eb[edge[pos]] <= qb[cur[i]]; pos++) { -// Union(eu[edge[pos]], ev[edge[pos]], ea[edge[pos]], eb[edge[pos]]); +// for (int i = 1, j = 1; i <= cntq; i++) { +// while (j < l && eb[edge[j]] <= qb[cur[i]]) { +// Union(eu[edge[j]], ev[edge[j]], ea[edge[j]], eb[edge[j]]); +// j++; // } // opsize = 0; -// for (int j = l; j <= r; j++) { -// if (ea[edge[j]] <= qa[cur[i]] && eb[edge[j]] <= qb[cur[i]]) { -// Union(eu[edge[j]], ev[edge[j]], ea[edge[j]], eb[edge[j]]); +// for (int k = l; k <= r; k++) { +// if (ea[edge[k]] <= qa[cur[i]] && eb[edge[k]] <= qb[cur[i]]) { +// Union(eu[edge[k]], ev[edge[k]], ea[edge[k]], eb[edge[k]]); // } // } // ans[qid[cur[i]]] = query(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); From a47e05facac1098a2572cd4b5f9df2aaa72ba49f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 13:19:06 +0800 Subject: [PATCH 0497/1170] modify code --- src/class174/Code04_Bridge1.java | 13 ++++++------- src/class174/Code04_Bridge2.java | 13 ++++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index 00d8069f8..d11c9cf8a 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -36,21 +36,20 @@ public class Code04_Bridge1 { public static int[] nid = new int[MAXQ]; public static int[] car = new int[MAXQ]; - public static int[] fa = new int[MAXN]; - public static int[] siz = new int[MAXN]; - public static int[][] rollback = new int[MAXM][2]; - public static int opsize = 0; - public static int[] edge = new int[MAXM]; public static int[] change = new int[MAXM]; public static int[] unchange = new int[MAXM]; + public static boolean[] vis = new boolean[MAXM]; + public static int[] curw = new int[MAXM]; public static int[] operate = new int[MAXQ]; public static int[] update = new int[MAXQ]; public static int[] query = new int[MAXQ]; - public static boolean[] vis = new boolean[MAXM]; - public static int[] curw = new int[MAXM]; + public static int[] fa = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[][] rollback = new int[MAXM][2]; + public static int opsize = 0; public static int[] ans = new int[MAXQ]; diff --git a/src/class174/Code04_Bridge2.java b/src/class174/Code04_Bridge2.java index ed4ae15c9..f4a2b4c5e 100644 --- a/src/class174/Code04_Bridge2.java +++ b/src/class174/Code04_Bridge2.java @@ -33,21 +33,20 @@ //int nid[MAXQ]; //int car[MAXQ]; // -//int fa[MAXN]; -//int siz[MAXN]; -//int rollback[MAXM][2]; -//int opsize = 0; -// //int edge[MAXM]; //int change[MAXM]; //int unchange[MAXM]; +//bool vis[MAXM]; +//int curw[MAXM]; // //int operate[MAXQ]; //int update[MAXQ]; //int query[MAXQ]; // -//bool vis[MAXM]; -//int curw[MAXM]; +//int fa[MAXN]; +//int siz[MAXN]; +//int rollback[MAXM][2]; +//int opsize = 0; // //int ans[MAXQ]; // From 7bc7d4add02e516d53291f694e387089e161a344 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 13:30:45 +0800 Subject: [PATCH 0498/1170] modify code --- src/class174/Code04_Bridge1.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index d11c9cf8a..90a5ebcae 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -53,25 +53,25 @@ public class Code04_Bridge1 { public static int[] ans = new int[MAXQ]; - // idx[l..r]由序号组成,v[序号]的值越大,序号越靠前,手写双指针快排 - public static void sort(int[] idx, int[] v, int l, int r) { + // idx[l..r]都是编号,编号根据val[编号]的值从大到小排序,手写双指针快排 + public static void sort(int[] idx, int[] val, int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = v[idx[(l + r) >> 1]], tmp; + int i = l, j = r, pivot = val[idx[(l + r) >> 1]], tmp; while (i <= j) { - while (v[idx[i]] > pivot) i++; - while (v[idx[j]] < pivot) j--; + while (val[idx[i]] > pivot) i++; + while (val[idx[j]] < pivot) j--; if (i <= j) { tmp = idx[i]; idx[i] = idx[j]; idx[j] = tmp; i++; j--; } } - sort(idx, v, l, j); - sort(idx, v, i, r); + sort(idx, val, l, j); + sort(idx, val, i, r); } - // change[l1..r1]都是边的序号,已经有序了,w[序号]的值越大,序号越靠前 - // unchange[l2..r2]都是边的序号,已经有序了,w[序号]的值越大,序号越靠前 - // 把两个数组中的序号,根据w[序号]的值,归并到eid中 + // change[l1..r1]和unchange[l2..r2]都是边的序号 + // 各自的数组中,序号是有序的,w[序号]的值越大,序号越靠前 + // 归并两个数组的序号 public static void merge(int l1, int r1, int l2, int r2) { int i = 0; while (l1 <= r1 && l2 <= r2) { From a5910ec20e03502244e8c59cc429238d61f714cc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 13:59:37 +0800 Subject: [PATCH 0499/1170] modify code --- src/class174/Code04_Bridge1.java | 22 +++++--------- src/class174/Code04_Bridge2.java | 8 ++--- src/class174/Code05_Lcm1.java | 52 ++++++++++++-------------------- src/class174/Code05_Lcm2.java | 30 ++++++++---------- 4 files changed, 40 insertions(+), 72 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index 90a5ebcae..149c7e5c0 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -175,23 +175,13 @@ public static void compute(int l, int r) { merge(1, siz1, 1, siz2); } - public static int log2(int n) { - int ans = 0; - while ((1 << ans) <= (n >> 1)) { - ans++; - } - return ans; - } - public static void prepare() { - blen = Math.max(1, (int) Math.sqrt(q * log2(n))); - bnum = (q + blen - 1) / blen; - for (int i = 1; i <= m; i++) { - edge[i] = i; - } - for (int i = 1; i <= q; i++) { - operate[i] = i; + int log2n = 0; + while ((1 << log2n) <= (n >> 1)) { + log2n++; } + blen = Math.max(1, (int) Math.sqrt(q * log2n)); + bnum = (q + blen - 1) / blen; sort(edge, w, 1, m); } @@ -204,6 +194,7 @@ public static void main(String[] args) throws IOException { u[i] = in.nextInt(); v[i] = in.nextInt(); w[i] = in.nextInt(); + edge[i] = i; } q = in.nextInt(); for (int i = 1; i <= q; i++) { @@ -215,6 +206,7 @@ public static void main(String[] args) throws IOException { nid[i] = in.nextInt(); car[i] = in.nextInt(); } + operate[i] = i; } prepare(); for (int i = 1, l, r; i <= bnum; i++) { diff --git a/src/class174/Code04_Bridge2.java b/src/class174/Code04_Bridge2.java index f4a2b4c5e..1613e76b5 100644 --- a/src/class174/Code04_Bridge2.java +++ b/src/class174/Code04_Bridge2.java @@ -155,12 +155,6 @@ //void prepare() { // blen = max(1, (int)sqrt(q * log2(n))); // bnum = (q + blen - 1) / blen; -// for (int i = 1; i <= m; i++) { -// edge[i] = i; -// } -// for (int i = 1; i <= q; i++) { -// operate[i] = i; -// } // sort(edge + 1, edge + m + 1, [&](int x, int y) { return w[x] > w[y]; }); //} // @@ -170,6 +164,7 @@ // cin >> n >> m; // for (int i = 1; i <= m; i++) { // cin >> u[i] >> v[i] >> w[i]; +// edge[i] = i; // } // cin >> q; // for (int i = 1; i <= q; i++) { @@ -179,6 +174,7 @@ // } else { // cin >> nid[i] >> car[i]; // } +// operate[i] = i; // } // prepare(); // for (int i = 1, l, r; i <= bnum; i++) { diff --git a/src/class174/Code05_Lcm1.java b/src/class174/Code05_Lcm1.java index 65c62021d..afe4b8317 100644 --- a/src/class174/Code05_Lcm1.java +++ b/src/class174/Code05_Lcm1.java @@ -33,13 +33,12 @@ public class Code05_Lcm1 { public static int[] qv = new int[MAXQ]; public static int[] qa = new int[MAXQ]; public static int[] qb = new int[MAXQ]; - public static int[] qid = new int[MAXQ]; public static int[] edge = new int[MAXM]; - public static int[] ques = new int[MAXQ]; + public static int[] query = new int[MAXQ]; public static int[] cur = new int[MAXQ]; - public static int cntq = 0; + public static int cursiz = 0; public static int[] fa = new int[MAXN]; public static int[] siz = new int[MAXN]; @@ -111,7 +110,7 @@ public static void undo() { } } - public static boolean query(int x, int y, int a, int b) { + public static boolean check(int x, int y, int a, int b) { int fx = find(x); int fy = find(y); return fx == fy && maxa[fx] == a && maxb[fx] == b; @@ -119,17 +118,17 @@ public static boolean query(int x, int y, int a, int b) { public static void compute(int l, int r) { build(); - cntq = 0; + cursiz = 0; for (int i = 1; i <= q; i++) { - // 保证每条询问只落入其中的一块 - if (ea[edge[l]] <= qa[ques[i]] && (r + 1 > m || qa[ques[i]] < ea[edge[r + 1]])) { - cur[++cntq] = ques[i]; + // 保证每条查询只在一个边的序列块中处理 + if (ea[edge[l]] <= qa[query[i]] && (r + 1 > m || qa[query[i]] < ea[edge[r + 1]])) { + cur[++cursiz] = query[i]; } } - if (cntq > 0) { + if (cursiz > 0) { // 本题直接排序能通过,就不写归并了 sort(edge, eb, 1, l - 1); - for (int i = 1, j = 1; i <= cntq; i++) { + for (int i = 1, j = 1; i <= cursiz; i++) { while (j < l && eb[edge[j]] <= qb[cur[i]]) { union(eu[edge[j]], ev[edge[j]], ea[edge[j]], eb[edge[j]]); j++; @@ -140,31 +139,21 @@ public static void compute(int l, int r) { union(eu[edge[k]], ev[edge[k]], ea[edge[k]], eb[edge[k]]); } } - ans[qid[cur[i]]] = query(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); + ans[cur[i]] = check(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); undo(); } } } - public static int log2(int n) { - int ans = 0; - while ((1 << ans) <= (n >> 1)) { - ans++; - } - return ans; - } - public static void prepare() { - blen = Math.max(1, (int) Math.sqrt(m * log2(n))); - bnum = (m + blen - 1) / blen; - for (int i = 1; i <= m; i++) { - edge[i] = i; - } - for (int i = 1; i <= q; i++) { - ques[i] = i; + int log2n = 0; + while ((1 << log2n) <= (n >> 1)) { + log2n++; } + blen = Math.max(1, (int) Math.sqrt(m * log2n)); + bnum = (m + blen - 1) / blen; sort(edge, ea, 1, m); - sort(ques, qb, 1, q); + sort(query, qb, 1, q); } public static void main(String[] args) throws IOException { @@ -177,6 +166,7 @@ public static void main(String[] args) throws IOException { ev[i] = in.nextInt(); ea[i] = in.nextInt(); eb[i] = in.nextInt(); + edge[i] = i; } q = in.nextInt(); for (int i = 1; i <= q; i++) { @@ -184,7 +174,7 @@ public static void main(String[] args) throws IOException { qv[i] = in.nextInt(); qa[i] = in.nextInt(); qb[i] = in.nextInt(); - qid[i] = i; + query[i] = i; } prepare(); for (int i = 1, l, r; i <= bnum; i++) { @@ -193,11 +183,7 @@ public static void main(String[] args) throws IOException { compute(l, r); } for (int i = 1; i <= q; i++) { - if (ans[i]) { - out.println("Yes"); - } else { - out.println("No"); - } + out.println(ans[i] ? "Yes" : "No"); } out.flush(); out.close(); diff --git a/src/class174/Code05_Lcm2.java b/src/class174/Code05_Lcm2.java index 38c9692c6..57faf78d4 100644 --- a/src/class174/Code05_Lcm2.java +++ b/src/class174/Code05_Lcm2.java @@ -31,13 +31,12 @@ //int qv[MAXQ]; //int qa[MAXQ]; //int qb[MAXQ]; -//int qid[MAXQ]; // //int edge[MAXM]; -//int ques[MAXQ]; +//int query[MAXQ]; // //int cur[MAXQ]; -//int cntq = 0; +//int cursiz; // //int fa[MAXN]; //int siz[MAXN]; @@ -93,22 +92,22 @@ // } //} // -//bool query(int x, int y, int a, int b) { +//bool check(int x, int y, int a, int b) { // int fx = find(x), fy = find(y); // return fx == fy && maxa[fx] == a && maxb[fx] == b; //} // //void compute(int l, int r) { // build(); -// cntq = 0; +// cursiz = 0; // for (int i = 1; i <= q; i++) { -// if (ea[edge[l]] <= qa[ques[i]] && (r + 1 > m || qa[ques[i]] < ea[edge[r + 1]])) { -// cur[++cntq] = ques[i]; +// if (ea[edge[l]] <= qa[query[i]] && (r + 1 > m || qa[query[i]] < ea[edge[r + 1]])) { +// cur[++cursiz] = query[i]; // } // } -// if (cntq > 0) { +// if (cursiz > 0) { // sort(edge + 1, edge + l, [&](int x, int y) { return eb[x] < eb[y]; }); -// for (int i = 1, j = 1; i <= cntq; i++) { +// for (int i = 1, j = 1; i <= cursiz; i++) { // while (j < l && eb[edge[j]] <= qb[cur[i]]) { // Union(eu[edge[j]], ev[edge[j]], ea[edge[j]], eb[edge[j]]); // j++; @@ -119,7 +118,7 @@ // Union(eu[edge[k]], ev[edge[k]], ea[edge[k]], eb[edge[k]]); // } // } -// ans[qid[cur[i]]] = query(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); +// ans[cur[i]] = check(qu[cur[i]], qv[cur[i]], qa[cur[i]], qb[cur[i]]); // undo(); // } // } @@ -128,14 +127,8 @@ //void prepare() { // blen = max(1, (int)sqrt(m * log2(n))); // bnum = (m + blen - 1) / blen; -// for (int i = 1; i <= m; i++) { -// edge[i] = i; -// } -// for (int i = 1; i <= q; i++) { -// ques[i] = i; -// } // sort(edge + 1, edge + m + 1, [&](int x, int y) { return ea[x] < ea[y]; }); -// sort(ques + 1, ques + q + 1, [&](int x, int y) { return qb[x] < qb[y]; }); +// sort(query + 1, query + q + 1, [&](int x, int y) { return qb[x] < qb[y]; }); //} // //int main() { @@ -144,11 +137,12 @@ // cin >> n >> m; // for (int i = 1; i <= m; i++) { // cin >> eu[i] >> ev[i] >> ea[i] >> eb[i]; +// edge[i] = i; // } // cin >> q; // for (int i = 1; i <= q; i++) { // cin >> qu[i] >> qv[i] >> qa[i] >> qb[i]; -// qid[i] = i; +// query[i] = i; // } // prepare(); // for (int i = 1, l, r; i <= bnum; i++) { From 047674b0cf9b7cf5ae8d9cecd6630aea51bc8f1a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 15:02:06 +0800 Subject: [PATCH 0500/1170] modify code --- src/class174/Code03_ColorfulWorld1.java | 2 +- src/class174/Code03_ColorfulWorld2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class174/Code03_ColorfulWorld1.java b/src/class174/Code03_ColorfulWorld1.java index dc9dfb990..5be4c84f3 100644 --- a/src/class174/Code03_ColorfulWorld1.java +++ b/src/class174/Code03_ColorfulWorld1.java @@ -147,7 +147,7 @@ public static void compute(int l, int r) { } public static void prepare() { - blen = (int) Math.sqrt(n * 3.0); + blen = (int) Math.sqrt(n); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { pre0[i] = pre0[i - 1] + (arr[i] == 0 ? 1 : 0); diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index befc8e922..f6e0adb06 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -132,7 +132,7 @@ //} // //void prepare() { -// blen = (int)sqrt(n * 3.0); +// blen = (int)sqrt(n); // bnum = (n + blen - 1) / blen; // for (int i = 1; i <= n; i++) { // pre0[i] = pre0[i - 1] + (arr[i] == 0 ? 1 : 0); From 7689795c3a22a5287abcf77e34277004fd6cf8f0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 17:58:56 +0800 Subject: [PATCH 0501/1170] modify code --- src/class174/Code04_Bridge1.java | 88 ++++++++++++++++++-------------- src/class174/Code04_Bridge2.java | 65 ++++++++++++----------- 2 files changed, 81 insertions(+), 72 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index 149c7e5c0..609ca2cfa 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -37,9 +37,7 @@ public class Code04_Bridge1 { public static int[] car = new int[MAXQ]; public static int[] edge = new int[MAXM]; - public static int[] change = new int[MAXM]; - public static int[] unchange = new int[MAXM]; - public static boolean[] vis = new boolean[MAXM]; + public static boolean[] change = new boolean[MAXM]; public static int[] curw = new int[MAXM]; public static int[] operate = new int[MAXQ]; @@ -51,6 +49,9 @@ public class Code04_Bridge1 { public static int[][] rollback = new int[MAXM][2]; public static int opsize = 0; + public static int[] arr1 = new int[MAXM]; + public static int[] arr2 = new int[MAXM]; + public static int[] ans = new int[MAXQ]; // idx[l..r]都是编号,编号根据val[编号]的值从大到小排序,手写双指针快排 @@ -69,22 +70,6 @@ public static void sort(int[] idx, int[] val, int l, int r) { sort(idx, val, i, r); } - // change[l1..r1]和unchange[l2..r2]都是边的序号 - // 各自的数组中,序号是有序的,w[序号]的值越大,序号越靠前 - // 归并两个数组的序号 - public static void merge(int l1, int r1, int l2, int r2) { - int i = 0; - while (l1 <= r1 && l2 <= r2) { - edge[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; - } - while (l1 <= r1) { - edge[++i] = change[l1++]; - } - while (l2 <= r2) { - edge[++i] = unchange[l2++]; - } - } - public static void build() { for (int i = 1; i <= n; i++) { fa[i] = i; @@ -123,56 +108,81 @@ public static void undo() { } } + public static void merge() { + int siz1 = 0, siz2 = 0; + for (int i = 1; i <= m; i++) { + if (change[edge[i]]) { + arr1[++siz1] = edge[i]; + } else { + arr2[++siz2] = edge[i]; + } + } + sort(arr1, w, 1, siz1); + int i = 0, p1 = 1, p2 = 1; + while (p1 <= siz1 && p2 <= siz2) { + edge[++i] = w[arr1[p1]] >= w[arr2[p2]] ? arr1[p1++] : arr2[p2++]; + } + while (p1 <= siz1) { + edge[++i] = arr1[p1++]; + } + while (p2 <= siz2) { + edge[++i] = arr2[p2++]; + } + } + + // 当前操作序号[l..r],之前的所有修改操作都已生效 + // 所有边的序号edge[1..m],按照边权从大到小排序 + // 处理当前操作块的所有操作 public static void compute(int l, int r) { - build(); - Arrays.fill(vis, false); + build(); // 重建并查集,目前没有任何联通性 + Arrays.fill(change, false); // 清空边的修改标记 int cntu = 0, cntq = 0; for (int i = l; i <= r; i++) { - if (op[operate[i]] == 1) { - vis[eid[operate[i]]] = true; + if (op[operate[i]] == 1) { // 修改类型的操作 + change[eid[operate[i]]] = true; update[++cntu] = operate[i]; - } else { + } else { // 查询类型的操作 query[++cntq] = operate[i]; } } + // 查询操作的所有序号,根据车重从大到小排序 + // 然后依次处理所有查询 sort(query, car, 1, cntq); for (int i = 1, j = 1; i <= cntq; i++) { + // 边权 >= 当前车重 的边全部连上,注意这是不回退的 while (j <= m && w[edge[j]] >= car[query[i]]) { - if (!vis[edge[j]]) { + if (!change[edge[j]]) { union(u[edge[j]], v[edge[j]]); } j++; } + // 注意需要用可撤销并查集,撤销会改值的边 opsize = 0; + // 会改值的边,边权先继承改之前的值 for (int k = 1; k <= cntu; k++) { curw[eid[update[k]]] = w[eid[update[k]]]; } - for (int k = 1; k <= cntu; k++) { - if (update[k] < query[i]) { - curw[eid[update[k]]] = tow[update[k]]; - } + // 修改操作的时序 < 当前查询操作的时序,那么相关边的边权改成最新值 + for (int k = 1; k <= cntu && update[k] < query[i]; k++) { + curw[eid[update[k]]] = tow[update[k]]; } + // 会改值的边,其中 边权 >= 当前车重 的边全部连上 for (int k = 1; k <= cntu; k++) { if (curw[eid[update[k]]] >= car[query[i]]) { union(u[eid[update[k]]], v[eid[update[k]]]); } } + // 并查集修改完毕,查询答案 ans[query[i]] = siz[find(nid[query[i]])]; + // 并查集的撤销 undo(); } + // 所有会改值的边,边权修改,因为即将去下个操作块 for (int i = 1; i <= cntu; i++) { w[eid[update[i]]] = tow[update[i]]; } - int siz1 = 0, siz2 = 0; - for (int i = 1; i <= m; i++) { - if (vis[edge[i]]) { - change[++siz1] = edge[i]; - } else { - unchange[++siz2] = edge[i]; - } - } - sort(change, w, 1, siz1); - merge(1, siz1, 1, siz2); + // 没改值的边和改了值的边,根据边权从大到小合并 + merge(); } public static void prepare() { diff --git a/src/class174/Code04_Bridge2.java b/src/class174/Code04_Bridge2.java index 1613e76b5..2e0d68ef8 100644 --- a/src/class174/Code04_Bridge2.java +++ b/src/class174/Code04_Bridge2.java @@ -34,9 +34,7 @@ //int car[MAXQ]; // //int edge[MAXM]; -//int change[MAXM]; -//int unchange[MAXM]; -//bool vis[MAXM]; +//bool change[MAXM]; //int curw[MAXM]; // //int operate[MAXQ]; @@ -48,20 +46,10 @@ //int rollback[MAXM][2]; //int opsize = 0; // -//int ans[MAXQ]; +//int arr1[MAXM]; +//int arr2[MAXM]; // -//void merge(int l1, int r1, int l2, int r2) { -// int i = 0; -// while (l1 <= r1 && l2 <= r2) { -// edge[++i] = w[change[l1]] >= w[unchange[l2]] ? change[l1++] : unchange[l2++]; -// } -// while (l1 <= r1) { -// edge[++i] = change[l1++]; -// } -// while (l2 <= r2) { -// edge[++i] = unchange[l2++]; -// } -//} +//int ans[MAXQ]; // //void build() { // for (int i = 1; i <= n; i++) { @@ -100,13 +88,35 @@ // } //} // +//void merge() { +// int siz1 = 0, siz2 = 0; +// for (int i = 1; i <= m; i++) { +// if (change[edge[i]]) { +// arr1[++siz1] = edge[i]; +// } else { +// arr2[++siz2] = edge[i]; +// } +// } +// sort(arr1 + 1, arr1 + siz1 + 1, [&](int x, int y) { return w[x] > w[y]; }); +// int i = 0, p1 = 1, p2 = 1; +// while (p1 <= siz1 && p2 <= siz2) { +// edge[++i] = w[arr1[p1]] >= w[arr2[p2]] ? arr1[p1++] : arr2[p2++]; +// } +// while (p1 <= siz1) { +// edge[++i] = arr1[p1++]; +// } +// while (p2 <= siz2) { +// edge[++i] = arr2[p2++]; +// } +//} +// //void compute(int l, int r) { // build(); -// fill(vis + 1, vis + m + 1, false); +// fill(change + 1, change + m + 1, false); // int cntu = 0, cntq = 0; // for (int i = l; i <= r; i++) { // if (op[operate[i]] == 1) { -// vis[eid[operate[i]]] = true; +// change[eid[operate[i]]] = true; // update[++cntu] = operate[i]; // } else { // query[++cntq] = operate[i]; @@ -115,7 +125,7 @@ // sort(query + 1, query + cntq + 1, [&](int x, int y) { return car[x] > car[y]; }); // for (int i = 1, j = 1; i <= cntq; i++) { // while (j <= m && w[edge[j]] >= car[query[i]]) { -// if (!vis[edge[j]]) { +// if (!change[edge[j]]) { // Union(u[edge[j]], v[edge[j]]); // } // j++; @@ -124,10 +134,8 @@ // for (int k = 1; k <= cntu; k++) { // curw[eid[update[k]]] = w[eid[update[k]]]; // } -// for (int k = 1; k <= cntu; k++) { -// if (update[k] < query[i]) { -// curw[eid[update[k]]] = tow[update[k]]; -// } +// for (int k = 1; k <= cntu && update[k] < query[i]; k++) { +// curw[eid[update[k]]] = tow[update[k]]; // } // for (int k = 1; k <= cntu; k++) { // if (curw[eid[update[k]]] >= car[query[i]]) { @@ -140,16 +148,7 @@ // for (int i = 1; i <= cntu; i++) { // w[eid[update[i]]] = tow[update[i]]; // } -// int siz1 = 0, siz2 = 0; -// for (int i = 1; i <= m; i++) { -// if (vis[edge[i]]) { -// change[++siz1] = edge[i]; -// } else { -// unchange[++siz2] = edge[i]; -// } -// } -// sort(change + 1, change + siz1 + 1, [&](int x, int y) { return w[x] > w[y]; }); -// merge(1, siz1, 1, siz2); +// merge(); //} // //void prepare() { From 7e979613a61484b9fa0f0eb2de1f8c4fe89323b7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 18:54:16 +0800 Subject: [PATCH 0502/1170] modify code --- src/class174/Code04_Bridge1.java | 11 ++++++++++- src/class174/Code04_Bridge2.java | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index 609ca2cfa..9f3228c43 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -36,22 +36,31 @@ public class Code04_Bridge1 { public static int[] nid = new int[MAXQ]; public static int[] car = new int[MAXQ]; + // edge里是所有边的序号 + // change表示边的分类 + // curw表示边最新的权值 public static int[] edge = new int[MAXM]; public static boolean[] change = new boolean[MAXM]; public static int[] curw = new int[MAXM]; + // edge里是所有操作的编号 + // query里是当前操作块里查询操作的编号 + // update里是当前操作块里修改操作的编号 public static int[] operate = new int[MAXQ]; - public static int[] update = new int[MAXQ]; public static int[] query = new int[MAXQ]; + public static int[] update = new int[MAXQ]; + // 可撤销并查集 public static int[] fa = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[][] rollback = new int[MAXM][2]; public static int opsize = 0; + // 归并的辅助数组 public static int[] arr1 = new int[MAXM]; public static int[] arr2 = new int[MAXM]; + // 所有查询的答案 public static int[] ans = new int[MAXQ]; // idx[l..r]都是编号,编号根据val[编号]的值从大到小排序,手写双指针快排 diff --git a/src/class174/Code04_Bridge2.java b/src/class174/Code04_Bridge2.java index 2e0d68ef8..132f218c2 100644 --- a/src/class174/Code04_Bridge2.java +++ b/src/class174/Code04_Bridge2.java @@ -38,8 +38,8 @@ //int curw[MAXM]; // //int operate[MAXQ]; -//int update[MAXQ]; //int query[MAXQ]; +//int update[MAXQ]; // //int fa[MAXN]; //int siz[MAXN]; From 27fb792edc2c6e8b03c38e3857b0b060958b381b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 18:56:10 +0800 Subject: [PATCH 0503/1170] modify code --- src/class174/Code04_Bridge1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index 9f3228c43..57c291aaa 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -36,7 +36,7 @@ public class Code04_Bridge1 { public static int[] nid = new int[MAXQ]; public static int[] car = new int[MAXQ]; - // edge里是所有边的序号 + // edge里是所有边的编号 // change表示边的分类 // curw表示边最新的权值 public static int[] edge = new int[MAXM]; @@ -139,8 +139,8 @@ public static void merge() { } } - // 当前操作序号[l..r],之前的所有修改操作都已生效 - // 所有边的序号edge[1..m],按照边权从大到小排序 + // 当前操作编号[l..r],之前的所有修改操作都已生效 + // 所有边的编号edge[1..m],按照边权从大到小排序 // 处理当前操作块的所有操作 public static void compute(int l, int r) { build(); // 重建并查集,目前没有任何联通性 @@ -154,7 +154,7 @@ public static void compute(int l, int r) { query[++cntq] = operate[i]; } } - // 查询操作的所有序号,根据车重从大到小排序 + // 查询操作的所有编号,根据车重从大到小排序 // 然后依次处理所有查询 sort(query, car, 1, cntq); for (int i = 1, j = 1; i <= cntq; i++) { From ba48f97e6eb8d34df5b5fbc7cc74027659849f6f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 18:57:29 +0800 Subject: [PATCH 0504/1170] modify code --- src/class174/Code04_Bridge1.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index 57c291aaa..cf3dab677 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -143,14 +143,16 @@ public static void merge() { // 所有边的编号edge[1..m],按照边权从大到小排序 // 处理当前操作块的所有操作 public static void compute(int l, int r) { - build(); // 重建并查集,目前没有任何联通性 - Arrays.fill(change, false); // 清空边的修改标记 + // 重建并查集,目前没有任何联通性 + // 清空边的修改标记 + build(); + Arrays.fill(change, false); int cntu = 0, cntq = 0; for (int i = l; i <= r; i++) { - if (op[operate[i]] == 1) { // 修改类型的操作 + if (op[operate[i]] == 1) { change[eid[operate[i]]] = true; update[++cntu] = operate[i]; - } else { // 查询类型的操作 + } else { query[++cntq] = operate[i]; } } From 5fa7c9af6d8fab31b5f2f13af0cf0d4fb54f124c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 18:58:37 +0800 Subject: [PATCH 0505/1170] modify code --- src/class174/Code04_Bridge1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index cf3dab677..8f75525d6 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -36,16 +36,16 @@ public class Code04_Bridge1 { public static int[] nid = new int[MAXQ]; public static int[] car = new int[MAXQ]; - // edge里是所有边的编号 + // edge是所有边的编号 // change表示边的分类 // curw表示边最新的权值 public static int[] edge = new int[MAXM]; public static boolean[] change = new boolean[MAXM]; public static int[] curw = new int[MAXM]; - // edge里是所有操作的编号 - // query里是当前操作块里查询操作的编号 - // update里是当前操作块里修改操作的编号 + // edge是所有操作的编号 + // query是当前操作块查询操作的编号 + // update是当前操作块修改操作的编号 public static int[] operate = new int[MAXQ]; public static int[] query = new int[MAXQ]; public static int[] update = new int[MAXQ]; From 5fe8f9c56b886710329ded0e51a2b8222737d122 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 20:50:19 +0800 Subject: [PATCH 0506/1170] modify code --- src/class174/Code04_Bridge1.java | 4 ++-- src/class174/Code04_Bridge2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index 8f75525d6..ac300ff22 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -43,7 +43,7 @@ public class Code04_Bridge1 { public static boolean[] change = new boolean[MAXM]; public static int[] curw = new int[MAXM]; - // edge是所有操作的编号 + // operate是所有操作的编号 // query是当前操作块查询操作的编号 // update是当前操作块修改操作的编号 public static int[] operate = new int[MAXQ]; @@ -236,7 +236,7 @@ public static void main(String[] args) throws IOException { compute(l, r); } for (int i = 1; i <= q; i++) { - if (ans[i] > 0) { + if (op[i] == 2) { out.println(ans[i]); } } diff --git a/src/class174/Code04_Bridge2.java b/src/class174/Code04_Bridge2.java index 132f218c2..fe5644d84 100644 --- a/src/class174/Code04_Bridge2.java +++ b/src/class174/Code04_Bridge2.java @@ -182,7 +182,7 @@ // compute(l, r); // } // for (int i = 1; i <= q; i++) { -// if (ans[i]) { +// if (op[i] == 2) { // cout << ans[i] << '\n'; // } // } From 176ad1d02d24881298810fe3f10719bbb700e861 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 22:31:48 +0800 Subject: [PATCH 0507/1170] modify code --- src/class174/Code04_Bridge1.java | 2 +- src/class174/Code05_Lcm1.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class174/Code04_Bridge1.java b/src/class174/Code04_Bridge1.java index ac300ff22..492dc72c5 100644 --- a/src/class174/Code04_Bridge1.java +++ b/src/class174/Code04_Bridge1.java @@ -143,7 +143,7 @@ public static void merge() { // 所有边的编号edge[1..m],按照边权从大到小排序 // 处理当前操作块的所有操作 public static void compute(int l, int r) { - // 重建并查集,目前没有任何联通性 + // 重建并查集,目前没有任何连通性 // 清空边的修改标记 build(); Arrays.fill(change, false); diff --git a/src/class174/Code05_Lcm1.java b/src/class174/Code05_Lcm1.java index afe4b8317..5d969c958 100644 --- a/src/class174/Code05_Lcm1.java +++ b/src/class174/Code05_Lcm1.java @@ -117,10 +117,12 @@ public static boolean check(int x, int y, int a, int b) { } public static void compute(int l, int r) { + // 重建并查集,目前没有任何连通性 build(); + // 重要剪枝 + // 保证每条查询只在一个边的序列块中处理 cursiz = 0; for (int i = 1; i <= q; i++) { - // 保证每条查询只在一个边的序列块中处理 if (ea[edge[l]] <= qa[query[i]] && (r + 1 > m || qa[query[i]] < ea[edge[r + 1]])) { cur[++cursiz] = query[i]; } From ea7b882bb48299e0f45c51602cb6901574f9a9a0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 23:03:54 +0800 Subject: [PATCH 0508/1170] modify code --- src/class174/Code05_Lcm1.java | 4 ++-- src/class174/Code05_Lcm2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class174/Code05_Lcm1.java b/src/class174/Code05_Lcm1.java index 5d969c958..abdc20fc9 100644 --- a/src/class174/Code05_Lcm1.java +++ b/src/class174/Code05_Lcm1.java @@ -117,8 +117,6 @@ public static boolean check(int x, int y, int a, int b) { } public static void compute(int l, int r) { - // 重建并查集,目前没有任何连通性 - build(); // 重要剪枝 // 保证每条查询只在一个边的序列块中处理 cursiz = 0; @@ -128,6 +126,8 @@ public static void compute(int l, int r) { } } if (cursiz > 0) { + // 重建并查集,目前没有任何连通性 + build(); // 本题直接排序能通过,就不写归并了 sort(edge, eb, 1, l - 1); for (int i = 1, j = 1; i <= cursiz; i++) { diff --git a/src/class174/Code05_Lcm2.java b/src/class174/Code05_Lcm2.java index 57faf78d4..6036c1d61 100644 --- a/src/class174/Code05_Lcm2.java +++ b/src/class174/Code05_Lcm2.java @@ -98,7 +98,6 @@ //} // //void compute(int l, int r) { -// build(); // cursiz = 0; // for (int i = 1; i <= q; i++) { // if (ea[edge[l]] <= qa[query[i]] && (r + 1 > m || qa[query[i]] < ea[edge[r + 1]])) { @@ -106,6 +105,7 @@ // } // } // if (cursiz > 0) { +// build(); // sort(edge + 1, edge + l, [&](int x, int y) { return eb[x] < eb[y]; }); // for (int i = 1, j = 1; i <= cursiz; i++) { // while (j < l && eb[edge[j]] <= qb[cur[i]]) { From 20cb3c9732d5f1012621baae38973b027978f39a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Jul 2025 23:52:55 +0800 Subject: [PATCH 0509/1170] modify code --- ...10\345\271\266\346\237\245\351\233\206.pptx" | Bin 0 -> 47558 bytes src/class174/Code05_Lcm1.java | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243174\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2303-\345\217\214\345\261\202\345\210\206\345\235\227\343\200\201\345\210\206\345\235\227\347\273\223\345\220\210\345\271\266\346\237\245\351\233\206.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243174\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2303-\345\217\214\345\261\202\345\210\206\345\235\227\343\200\201\345\210\206\345\235\227\347\273\223\345\220\210\345\271\266\346\237\245\351\233\206.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243174\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2303-\345\217\214\345\261\202\345\210\206\345\235\227\343\200\201\345\210\206\345\235\227\347\273\223\345\220\210\345\271\266\346\237\245\351\233\206.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..16e2b92f6c12f5491b05e579b534bb6775150634 GIT binary patch literal 47558 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

qgu~nvKI?)Yiv`lStjYktK7#d7{uCJ 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 XHoMrN$8Z!%ANp885A|LpOKblFFukhT literal 0 HcmV?d00001 diff --git a/src/class174/Code05_Lcm1.java b/src/class174/Code05_Lcm1.java index abdc20fc9..b4393cb10 100644 --- a/src/class174/Code05_Lcm1.java +++ b/src/class174/Code05_Lcm1.java @@ -49,19 +49,19 @@ public class Code05_Lcm1 { public static boolean[] ans = new boolean[MAXQ]; - public static void sort(int[] idx, int[] v, int l, int r) { + public static void sort(int[] idx, int[] val, int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = v[idx[(l + r) >> 1]], tmp; + int i = l, j = r, pivot = val[idx[(l + r) >> 1]], tmp; while (i <= j) { - while (v[idx[i]] < pivot) i++; - while (v[idx[j]] > pivot) j--; + while (val[idx[i]] < pivot) i++; + while (val[idx[j]] > pivot) j--; if (i <= j) { tmp = idx[i]; idx[i] = idx[j]; idx[j] = tmp; i++; j--; } } - sort(idx, v, l, j); - sort(idx, v, i, r); + sort(idx, val, l, j); + sort(idx, val, i, r); } public static void build() { From 192def1801e77154f4b4fc52685c0d7ae77dfa1f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Jul 2025 19:44:19 +0800 Subject: [PATCH 0510/1170] modify code --- src/class174/Code02_MagicGirl2.java | 70 ++++++++++++++++++++----- src/class174/Code03_ColorfulWorld2.java | 2 +- src/class174/Code04_Bridge2.java | 2 +- 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index e59cb767f..242b3062d 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -14,6 +14,50 @@ // //using namespace std; // +//namespace fastio { +// static const int SZ = 1 << 20; +// char ibuf[SZ], *is = ibuf, *ie = ibuf; +// inline int gc() { +// if (is == ie) { +// size_t len = fread(ibuf, 1, SZ, stdin); +// if (len == 0) return -1; +// is = ibuf; +// ie = ibuf + len; +// } +// return *is++; +// } +// template +// inline bool readInt(T& x) { +// int c = gc(); if (c == -1) return false; +// bool neg = false; +// while (c != '-' && (c < '0' || c > '9')) { c = gc(); if (c == -1) return false; } +// if (c == '-') { neg = true; c = gc(); } +// x = 0; +// while (c >= '0' && c <= '9') { x = x * 10 + (c & 15); c = gc(); } +// if (neg) x = -x; +// return true; +// } +// char obuf[SZ]; char* op = obuf; +// inline void flush() { +// fwrite(obuf, 1, op - obuf, stdout); +// op = obuf; +// } +// template +// inline void writeInt(T x, char end = '\n') { +// if (op > obuf + SZ - 64) flush(); +// if (x == 0) { *op++ = '0'; *op++ = end; return; } +// if (x < 0) { *op++ = '-'; x = -x; } +// char s[24]; int n = 0; +// while (x) { s[n++] = char('0' + x % 10); x /= 10; } +// while (n) *op++ = s[--n]; +// *op++ = end; +// } +//} +// +//using fastio::readInt; +//using fastio::writeInt; +//using fastio::flush; +// //const int MAXN = 300002; //const int MAXB = 601; //const int POW = 9; @@ -43,16 +87,16 @@ //long long ans[MAXN]; // //inline void radix(int* idx, int* val, int siz) { -// fill(cntv, cntv + MAXB, 0); +// memset(cntv, 0, sizeof(int) * MAXB); // for (int i = 1; i <= siz; i++) cntv[val[idx[i]] & OFFSET]++; // for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; // for (int i = siz; i >= 1; i--) help[cntv[val[idx[i]] & OFFSET]--] = idx[i]; -// for (int i = 1; i <= siz; i++) idx[i] = help[i]; -// fill(cntv, cntv + MAXB, 0); +// memcpy(idx + 1, help + 1, siz * sizeof(int)); +// memset(cntv, 0, sizeof(int) * MAXB); // for (int i = 1; i <= siz; i++) cntv[val[idx[i]] >> POW]++; // for (int i = 1; i < MAXB; i++) cntv[i] += cntv[i - 1]; // for (int i = siz; i >= 1; i--) help[cntv[val[idx[i]] >> POW]--] = idx[i]; -// for (int i = 1; i <= siz; i++) idx[i] = help[i]; +// memcpy(idx + 1, help + 1, siz * sizeof(int)); //} // //inline void merge(int i, int curPre, int curSuf, int curLen, int curAns) { @@ -115,18 +159,19 @@ //} // //int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n >> m; +// readInt(n); +// readInt(m); // for (int i = 1; i <= n; i++) { -// cin >> arr[i]; +// readInt(arr[i]); // } // for (int i = 1; i <= m; i++) { -// cin >> op[i] >> x[i]; +// readInt(op[i]); +// readInt(x[i]); // if (op[i] == 1) { -// cin >> v[i]; +// readInt(v[i]); // } else { -// cin >> y[i] >> v[i]; +// readInt(y[i]); +// readInt(v[i]); // } // } // int blen = 1 << POW; @@ -138,8 +183,9 @@ // } // for (int i = 1; i <= m; i++) { // if (op[i] == 2) { -// cout << ans[i] << '\n'; +// writeInt(ans[i]); // } // } +// flush(); // return 0; //} \ No newline at end of file diff --git a/src/class174/Code03_ColorfulWorld2.java b/src/class174/Code03_ColorfulWorld2.java index f6e0adb06..247c5da1a 100644 --- a/src/class174/Code03_ColorfulWorld2.java +++ b/src/class174/Code03_ColorfulWorld2.java @@ -113,7 +113,7 @@ //} // //void compute(int l, int r) { -// fill(cntv, cntv + MAXV, 0); +// memset(cntv, 0, sizeof(int) * MAXV); // maxv = lazy = 0; // for (int i = l; i <= r; i++) { // maxv = max(maxv, arr[i]); diff --git a/src/class174/Code04_Bridge2.java b/src/class174/Code04_Bridge2.java index fe5644d84..0a76f3c34 100644 --- a/src/class174/Code04_Bridge2.java +++ b/src/class174/Code04_Bridge2.java @@ -112,7 +112,7 @@ // //void compute(int l, int r) { // build(); -// fill(change + 1, change + m + 1, false); +// memset(change + 1, 0, m * sizeof(bool)); // int cntu = 0, cntq = 0; // for (int i = l; i <= r; i++) { // if (op[operate[i]] == 1) { From 10d30251b71ba74e9531e5c232c51e0d9e8c8335 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Jul 2025 20:10:19 +0800 Subject: [PATCH 0511/1170] modify code --- src/class119/Code01_EmergencyAssembly2.java | 11 ++++------- src/class151/Code02_Treap2.java | 18 +++++++----------- src/class151/FollowUp2.java | 18 +++++++----------- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/src/class119/Code01_EmergencyAssembly2.java b/src/class119/Code01_EmergencyAssembly2.java index e8eef367d..0588f622d 100644 --- a/src/class119/Code01_EmergencyAssembly2.java +++ b/src/class119/Code01_EmergencyAssembly2.java @@ -12,10 +12,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -//#include -//#include -//#include -//#include +//#include // //using namespace std; // @@ -43,12 +40,12 @@ //void build(int n) { // power = log2(n); // cnt = 1; -// fill(head, head + n + 1, 0); +// memset(head + 1, 0, n * sizeof(int)); //} // //void addEdge(int u, int v) { -// edgeNext[cnt] = head[u]; -// edgeTo[cnt] = v; +// edgeNext[cnt] = head[u]; +// edgeTo[cnt] = v; // head[u] = cnt++; //} // diff --git a/src/class151/Code02_Treap2.java b/src/class151/Code02_Treap2.java index 00a4449bf..d2e7e1be1 100644 --- a/src/class151/Code02_Treap2.java +++ b/src/class151/Code02_Treap2.java @@ -14,11 +14,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -//#include -//#include -//#include -//#include -//#include +//#include // //using namespace std; // @@ -178,12 +174,12 @@ //} // //void clear() { -// fill(key + 1, key + cnt + 1, 0); -// fill(key_count + 1, key_count + cnt + 1, 0); -// fill(ls + 1, ls + cnt + 1, 0); -// fill(rs + 1, rs + cnt + 1, 0); -// fill(siz + 1, siz + cnt + 1, 0); -// fill(priority + 1, priority + cnt + 1, 0); +// memset(key + 1, 0, cnt * sizeof(int)); +// memset(key_count + 1, 0, cnt * sizeof(int)); +// memset(ls + 1, 0, cnt * sizeof(int)); +// memset(rs + 1, 0, cnt * sizeof(int)); +// memset(siz + 1, 0, cnt * sizeof(int)); +// memset(priority + 1, 0, cnt * sizeof(int)); // cnt = 0; // head = 0; //} diff --git a/src/class151/FollowUp2.java b/src/class151/FollowUp2.java index da9078481..34e8e6336 100644 --- a/src/class151/FollowUp2.java +++ b/src/class151/FollowUp2.java @@ -7,11 +7,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -//#include -//#include -//#include -//#include -//#include +//#include // //using namespace std; // @@ -171,12 +167,12 @@ //} // //void clear() { -// fill(key + 1, key + cnt + 1, 0); -// fill(key_count + 1, key_count + cnt + 1, 0); -// fill(ls + 1, ls + cnt + 1, 0); -// fill(rs + 1, rs + cnt + 1, 0); -// fill(siz + 1, siz + cnt + 1, 0); -// fill(priority + 1, priority + cnt + 1, 0); +// memset(key + 1, 0, cnt * sizeof(int)); +// memset(key_count + 1, 0, cnt * sizeof(int)); +// memset(ls + 1, 0, cnt * sizeof(int)); +// memset(rs + 1, 0, cnt * sizeof(int)); +// memset(siz + 1, 0, cnt * sizeof(int)); +// memset(priority + 1, 0, cnt * sizeof(int)); // cnt = 0; // head = 0; //} From 880a9b975b3e1177398d94a7b987eff3d73abf25 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Jul 2025 20:50:17 +0800 Subject: [PATCH 0512/1170] modify code --- src/class174/Code02_MagicGirl2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class174/Code02_MagicGirl2.java b/src/class174/Code02_MagicGirl2.java index 242b3062d..ea7ed0586 100644 --- a/src/class174/Code02_MagicGirl2.java +++ b/src/class174/Code02_MagicGirl2.java @@ -44,7 +44,7 @@ // } // template // inline void writeInt(T x, char end = '\n') { -// if (op > obuf + SZ - 64) flush(); +// if (op > obuf + SZ - 256) flush(); // if (x == 0) { *op++ = '0'; *op++ = end; return; } // if (x < 0) { *op++ = '-'; x = -x; } // char s[24]; int n = 0; From 2e4771cba7be771465e695797836d09263ce81ae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 18 Jul 2025 00:57:23 +0800 Subject: [PATCH 0513/1170] modify code --- src/class164/Code02_Training1.java | 24 ++++++++++++++++++++---- src/class164/Code02_Training2.java | 18 ++++++++++++++---- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/class164/Code02_Training1.java b/src/class164/Code02_Training1.java index bbb1eea0b..691e5ac7a 100644 --- a/src/class164/Code02_Training1.java +++ b/src/class164/Code02_Training1.java @@ -2,10 +2,11 @@ // youyou的军训,java版 // 图里有n个点,m条无向边,每条边给定不同的边权,图里可能有若干个连通的部分 -// 一共有q条操作,每条操作都是如下的三种类型中的一种 -// 操作 1 x : 限制变量limit,把limit的值改成x +// 一开始limit = 0,接下来有q条操作,每条操作都是如下的三种类型中的一种 +// 操作 1 x : 所有修改操作生效,然后limit变成x,图中那些边权小于limit的边断开 // 操作 2 x : 点x不能走过任何边权小于limit的边,打印此时x所在的连通区域大小 -// 操作 3 x y : 第x条边的边权修改为y,题目保证修改之后,第x条边的边权排名不变 +// 操作 3 x y : 第x条边的边权修改为y,但不是立刻生效,而是下次limit改变时生效 +// 题目保证边权不管怎么修改,所有边权都不相等,并且每条边的边权排名不发生变化 // 1 <= n、m、q <= 4 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P9638 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -44,6 +45,14 @@ public class Code02_Training1 { // 树上dfs,Kruskal重构树的节点,倍增表 public static int[][] stjump = new int[MAXK][MAXH]; + // 边权的修改操作先不生效,等到下次limit被设置时生效 + // 修改了哪些边 + public static int[] pendEdge = new int[MAXM]; + // 修改成了什么边权 + public static int[] pendVal = new int[MAXM]; + // 修改操作的个数 + public static int cntp = 0; + // 并查集的find方法,需要改成迭代版不然会爆栈,C++实现不需要 public static int find(int i) { int size = 0; @@ -181,6 +190,11 @@ public static void main(String[] args) { for (int i = 1; i <= q; i++) { op = io.nextInt(); if (op == 1) { + // 从上次limit改变开始,积攒的修改操作统一生效 + for (int k = 1; k <= cntp; k++) { + nodeKey[edgeToTree[pendEdge[k]]] = pendVal[k]; + } + cntp = 0; limit = io.nextInt(); } else if (op == 2) { x = io.nextInt(); @@ -188,8 +202,10 @@ public static void main(String[] args) { } else { x = io.nextInt(); y = io.nextInt(); + // 修改操作先收集起来,等到limit改变时,统一生效 if (edgeToTree[x] != 0) { - nodeKey[edgeToTree[x]] = y; + pendEdge[++cntp] = x; + pendVal[cntp] = y; } } } diff --git a/src/class164/Code02_Training2.java b/src/class164/Code02_Training2.java index 2211ff9f3..ab6b865ec 100644 --- a/src/class164/Code02_Training2.java +++ b/src/class164/Code02_Training2.java @@ -2,10 +2,11 @@ // youyou的军训,C++版 // 图里有n个点,m条无向边,每条边给定不同的边权,图里可能有若干个连通的部分 -// 一共有q条操作,每条操作都是如下的三种类型中的一种 -// 操作 1 x : 限制变量limit,把limit的值改成x +// 一开始limit = 0,接下来有q条操作,每条操作都是如下的三种类型中的一种 +// 操作 1 x : 所有修改操作生效,然后limit变成x,图中那些边权小于limit的边断开 // 操作 2 x : 点x不能走过任何边权小于limit的边,打印此时x所在的连通区域大小 -// 操作 3 x y : 第x条边的边权修改为y,题目保证修改之后,第x条边的边权排名不变 +// 操作 3 x y : 第x条边的边权修改为y,但不是立刻生效,而是下次limit改变时生效 +// 题目保证边权不管怎么修改,所有边权都不相等,并且每条边的边权排名不发生变化 // 1 <= n、m、q <= 4 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P9638 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -42,6 +43,10 @@ //int leafsiz[MAXK]; //int stjump[MAXK][MAXH]; // +//int pendEdge[MAXM]; +//int pendVal[MAXM]; +//int cntp; +// //int find(int i) { // if (i != father[i]) { // father[i] = find(father[i]); @@ -120,6 +125,10 @@ // for (int i = 1; i <= q; i++) { // cin >> op; // if (op == 1) { +// for (int k = 1; k <= cntp; k++) { +// nodeKey[edgeToTree[pendEdge[k]]] = pendVal[k]; +// } +// cntp = 0; // cin >> limit; // } else if (op == 2) { // cin >> x; @@ -127,7 +136,8 @@ // } else { // cin >> x >> y; // if (edgeToTree[x] != 0) { -// nodeKey[edgeToTree[x]] = y; +// pendEdge[++cntp] = x; +// pendVal[cntp] = y; // } // } // } From e951e9a362e8d236216e935405cd150c7ddc461f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 18 Jul 2025 01:01:09 +0800 Subject: [PATCH 0514/1170] modify code --- ...\345\205\263\351\242\230\347\233\256.pptx" | Bin 54142 -> 54193 bytes src/class164/Code02_Training1.java | 2 +- src/class164/Code02_Training2.java | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243164\343\200\220\346\214\272\351\232\276\343\200\221Kruskal\351\207\215\346\236\204\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243164\343\200\220\346\214\272\351\232\276\343\200\221Kruskal\351\207\215\346\236\204\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" index 5bb5c6ddf8e296952cf831e9e94f92b06db290b1..14593bfa8fadfa1502ea91dbde223eaa59613494 100644 GIT binary patch delta 3349 zcmY+Gc|2768^>qtAxp+O#b8jvAjBX>C42S^3E3sG|701mgvfG;T#`#<8Deg7vyGjx zkK8UwSyQ%36uS9wPBk_EJkNQb&$E2L^F6QU`>lk&rj-7msUbZB0tSPzzyw)7)*M8@ z>Gv#vhHrybl&){zlGf;==|Lxe=?_pr;$~rk9FYU`P>clYE+~;=vtKN%luoEzatsJCQz|7PA z%v;b&Q;VOlprxri38`aLPtsDnSBGG?hAXr}j5agWwHj`PCcAhRlAX})2Vn+Y30Uo6 z1+)#IwhkI@{^Z#6ke1t29W1`D)iPxS5-f+nCD>XOf!bO;3si~C7V|SWw~rMFvxk!E zT?z!3wVz){6wv)A#^l z0+JBs%X5xvx8S_r#}+I9kjTk4oFrGQtwC%%bA8^>W@1>7?~zHO^j+=KI#Z2?ETVtG zpJl|>dA&o&g=fDTOl{fb#WsYwt2=sFn#S3lOZN>44h~*;a)MMnD@A$QWqh>9+E|>I zi#ZNfDo}gZDkWU{nxD4|N?27PaJfF~ug5Y3=EnH^O!H{EF6)dpSO31hn4#%mn*_hA z#`E@2yfkGUkIvGLulj()C478ZECjFC!Ws}xWLvn-XCC7Z>LeSnm@6HKxfhIk?Cp>n zgz)4u_vShs_Ssy2w^SPE+{!POIDN8Xu{_ymvVR&k{!H`0DHRkBp`pBd1CNy&x4{V# zFb2K;9B=2?umSUyu&;mWM26~EP;vl4vsKgiwk_dC|LH(ZpDB^3HK9zK z&denz6Qu>@r(@C+*=SwJp} z^QRWr<*v7AI`y3!^|$2{WMeMh1zgDMd7gT;Z*ihc4{&v_sE!vt-IHysX0=GgcT?=G z?LKwK#0&}wW6MXm@Hqx9{<5s~oCKw{hQ)@%%B$+-JCi^c3GeQ^wWg7-^|XS!F|i`C z)kBZ{Y>{TZvCAM|Oz?D5cuGC&f>=>!W9UCtdir^~hs?h`s`%gaD1<|in7KuCb-Z|u zBbHB}{mdx0A4-PxLv)}m3rC)iKAWeghGHH|!B-)dr8F%-0*&XJ>rz9ll1mf;b>3Rc&({>BwE zx;>s1y4OQRlm!-3irUiQ@c62_WU}@|vmT#MFQ$(gdR`Wz!#_g_2@x<9SsuL9qh@o} z$6=F995`9`&(av9dq^(aSW#{OkqlRqo5q(ZtGMf#|NGL<>j}26P)mO!4!KIz!1MEG z!~LSB@*75(^RIuYCJ_c!CW(JkJI2v-YB413wqp@WWA#dvWgjItBzm1V^9S1ShRS4J zDrRzh_>i^pJNTJUuUn$u;Ilnp)K{tX6J9{LJoDUOeHvRIJVWqTJEurZrED zn#u92wL+}*A{Zm z&gEb}P`S=yDUsi-+sAHk=x;tJ{7(07E9q<3GH>EQl|wETh!SlGKt%>fEkM@Z!*98i*mQcv38HK~GTtYmdB z6Zd`)T~1Qke$WIQ1``F+O9X*QD%;*|2LWIT*nu;3bKsml{)7UKWYU+$Na&^$+M)uE z_u3W>(0*u92Q7xI1zJC{0ce}a(EIAZAbbp|b(wSo(fEBY}WENJILC3HL+n zQa{uivHt??_61KpylbeqpME5W6x+)AfF5Uw<+~@L2u4 zc>&o&(0@KWgro~h1r(?P0OK$pm|S=m39kgO!%%srVI-YfHYm9BT~NIzC;<9~(Ww1X zCw(B9{NvQ2_D&z|$5jA^NsT~xwMUR}J>cR96!!Ck?;TbYEoRRvD*?mGOIQJ+Hg>S3 zk-gAqU}XeqX>TXs#(+E(BeGvV?s;)x?A~XTco+ub`z?_X5J{B)d;IOo_)Q~F2Ns*8 z@`K3~${Usw7-6u=U>J<&H=!B8Jt_t!i=)1pz|z5Bq`hjtYlNEsi%|)t{FeR5{{s`r Bgg5{I delta 3302 zcmZvec|4SB8^>o%vad;)BO@~jF*1nAcDyCau{6YloI;e2EFCB2G-OF4%VQb)mZe^b znJifjvSgb~mLx>B;n)drEQjZ*rt_Zn`RBTy@BO=e*LB~Y`}4W);ylE5E`rC*2(eEH z27|G~%*g@8JVJ29ZUoTq4KPZwwCzReJWBuq9C+R>i-MC73{*SGOkdD|;44ihXoXlEHmGZL-C3s0_CJse zccvYLF*eG8sv*R9j8?y~_7-NF0%jUu@jb1!87mNq?*P|Du*?Sa6dQJ^5*Gpc&4AX% z3HaGTyJBGP4K8WVVA%mG*81~#P)kKQA>bUldr25qafp|U5fY=Gan^^nIl?WI72Jvw zo||ArMXwfc1~}m<4M_R+fbcJ0`d5`Su;LFvT0k`uKEKz)yH`Qt<8xNO{V>=yB;b%C z49s`10&!wOKx76lsW7Jc^V|sPfLIX0FsS}|4$XJguK1+$t1_#&mnvh2GeULBtp>XF z1PQt(EMqm#Ka^~B*U)j)%2Gtg8CJ`D70wTdINa5a^$Frt2F2%64?U4`_XnC1u0XM! z8h*Le${zPXboE`sJF}RU%k3xivD}z?iY=YrdvsIx zd2O|7m56YTcZomu(!S)xYazkq`O%jiHpj|3J6<~GlSA=+WO~VFE6dbffe7ziwit_wNL$e9KMAq$QG zM)n`eNBCA^ix4a_H>B7k@W%rsgSj6FiBk0y;%YpLhE!(sB0O1uP}6m>DRmChQ`r^- zpPRhB-of#twhEn;4!K|sSEaQZAtqtPA|2;vD-x+r7B}5)+cp{7bk>QdZF0>_fAU{E zt4l+t>QByT>)Krqz1jB2S{N<5py`$vPgNMqvZlDZ2(p}S%gif920>B^nac09#DO^or6^pndkQ|h}IZERD*Z*siAl;Xy5 z@e0Ae_}TgmV%(=A#0Y`@^l~_oW9P`C&V+SEyhN9Gs+F0CC;qIKCvjeRc5=1YtF%6y zPp1`cV3f6y`p{>*w33)f zS_$i}Ucp4^ym)b|$FA~iKDNAV875^=h0Mzgd{%Eqa8JF%kwoxX8(`G8zK9z^QT2@IP=t!R%!+# zW|4&}fNuS=y3cKaqz&#BVQfVk7y2Z&kbC&(Hdnj!scp@AGRZhqd3fi3#$hKdr+wSW z?_e0QSW^aJI-x(o{`P}4)G;4_!R^loyd5qw^3Nn0VGqiM}WZl0=?qqiD|o6av9EDa@hO&*fblDvcWI<>HNdJFTHUCwAR zx-IPfmFMXMi{?zVI6h3{v6-KKzm6G*%e$<1)1@FG{Hb;5*{o>(@`ZyES7b@QZMns* zhfl>KS8S}aVpO(fWUMje7n5n}jDei1cX}$T;M4LHrNKW&Q*DQO)cJa=H-{_MBqAr0m8-r3 zJwFO+RKdGg=@J{5Iz%JH^cuf1sLu4aepv36 zZG$uu-!b!ch()(Uy$!cRYdS@P_Krx?0ewEcMgs3?ir|>%HIrR`4Y9Ou%m~zAJD8e? z4n^=>eR~W6tsSbUy_3e?pS3ixd(z&+VKCHgWPZAlKrvkeP@@ZjcII>>{5Eidj+Xex z0sU7R4k)5yK~1u>i<0c_%S-YH80;X^cX#9lY}3(Td0CF|+W%jEFbynEcq0s&m6vP# zi|v}Ni~XS`&U!H=7MH}xtu^)12<^M#zOAF>>9%V)!kD7)rtPP za}NA+XwsCzUgytT0%? guQ1qwf217-^t+CLX|7#Jmgy=WqzkkETFsv3Z(nMt@Bjb+ diff --git a/src/class164/Code02_Training1.java b/src/class164/Code02_Training1.java index 691e5ac7a..2ae39f93f 100644 --- a/src/class164/Code02_Training1.java +++ b/src/class164/Code02_Training1.java @@ -4,7 +4,7 @@ // 图里有n个点,m条无向边,每条边给定不同的边权,图里可能有若干个连通的部分 // 一开始limit = 0,接下来有q条操作,每条操作都是如下的三种类型中的一种 // 操作 1 x : 所有修改操作生效,然后limit变成x,图中那些边权小于limit的边断开 -// 操作 2 x : 点x不能走过任何边权小于limit的边,打印此时x所在的连通区域大小 +// 操作 2 x : 查询点x所在连通区域大小 // 操作 3 x y : 第x条边的边权修改为y,但不是立刻生效,而是下次limit改变时生效 // 题目保证边权不管怎么修改,所有边权都不相等,并且每条边的边权排名不发生变化 // 1 <= n、m、q <= 4 * 10^5 diff --git a/src/class164/Code02_Training2.java b/src/class164/Code02_Training2.java index ab6b865ec..86c8851b6 100644 --- a/src/class164/Code02_Training2.java +++ b/src/class164/Code02_Training2.java @@ -4,7 +4,7 @@ // 图里有n个点,m条无向边,每条边给定不同的边权,图里可能有若干个连通的部分 // 一开始limit = 0,接下来有q条操作,每条操作都是如下的三种类型中的一种 // 操作 1 x : 所有修改操作生效,然后limit变成x,图中那些边权小于limit的边断开 -// 操作 2 x : 点x不能走过任何边权小于limit的边,打印此时x所在的连通区域大小 +// 操作 2 x : 查询点x所在连通区域大小 // 操作 3 x y : 第x条边的边权修改为y,但不是立刻生效,而是下次limit改变时生效 // 题目保证边权不管怎么修改,所有边权都不相等,并且每条边的边权排名不发生变化 // 1 <= n、m、q <= 4 * 10^5 From 2dfc27eacbc2a426dab687c38790aa6f3bf65a7b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 18 Jul 2025 12:39:57 +0800 Subject: [PATCH 0515/1170] modify code --- ...\345\205\263\351\242\230\347\233\256.pptx" | Bin 54193 -> 54188 bytes src/class164/Code02_Training1.java | 30 +++++++++--------- src/class164/Code02_Training2.java | 19 +++++------ 3 files changed, 25 insertions(+), 24 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243164\343\200\220\346\214\272\351\232\276\343\200\221Kruskal\351\207\215\346\236\204\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243164\343\200\220\346\214\272\351\232\276\343\200\221Kruskal\351\207\215\346\236\204\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" index 14593bfa8fadfa1502ea91dbde223eaa59613494..aa7ea88121f57100c76dbe0a956865cfc69d0d01 100644 GIT binary patch delta 3209 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 delta 3129 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 uLOc@!Q5u9maPAv+-^?JLAu-^IrM(^1Kp_y-Jpb Date: Fri, 18 Jul 2025 13:05:06 +0800 Subject: [PATCH 0516/1170] modify code --- ...\345\205\263\351\242\230\347\233\256.pptx" | Bin 54188 -> 54204 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243164\343\200\220\346\214\272\351\232\276\343\200\221Kruskal\351\207\215\346\236\204\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243164\343\200\220\346\214\272\351\232\276\343\200\221Kruskal\351\207\215\346\236\204\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" index aa7ea88121f57100c76dbe0a956865cfc69d0d01..656af71ca9d046493096e90d84196503c661afeb 100644 GIT binary patch delta 3126 zcmZ9OcT`i^7RFQP6Uxv_q)L~ffFOc21wsZziWH@H!ABKoLj;tGAQHGUbfw4yL_jct zSZLBh?M|JNCg@%el!y3$#3uh@@EEu4otPHT;J;(+^nP1K`!|8bLP!MnO zcr(GVoA5z~U4@kO)uHF2!!Sw{i=`vnL4d@hZRw~?9-ugdLU>(J=%5Ucs>(d-C+cZs zgSL)$!u=%GtoMsG_lmW&=*7#&0cz9n0_RZHX8{}3GN92d7fu1o5#t_UL7K4w3kJUq zEJ!mANc#-1a9QYpwP2)Y!3Ytp``|6u+Z55A2fEmx6ZT+dY!0e)9OMWZm^fVqXMh{5 zxB%4QY7LeZ^JGA>ru%$xnA31cmq_CkrWkvj1RwFHe<34$aMj>%@M-l97mT+e2mW=*L916sVALI3Pe+gb7~z1s>x91g@PrA07!!dSNc>PaQJ&y9wKSX0 z#bT%=Ejh#NKk66NI;nm9*3!AZPz5+~0a+4nHW#-AnrIm3kgC1@!!qLKn$-`(zV450 z9D>4p)&-+y-`?)ZqP&X^saMO;{heImH$jZ^A5phNR-I=FOq9s+9ifs@wts9rn~hb| zEk1o7cOD-i?)M5O&qsCjmyRGzriUadkG&!PE!dxNI91uTr0`Ilu_ZF}y|5VXHMs}) z(qEU`?m{;;)r4%$^=1V-*cP;`&EE`7yQ76qHmNoDW?jdpCG)AXaNHwfOD3FC9Uw*#blwpFIjJDELqYpV{D6<#^8#XYy=mo}Q2 z86-9t`f}b6uX%fHWPGAFgy8+O=0Z@+M)~KBm`f4=P=gASn_DSfsg1#J^&%XOabz5_ zP;gf-ax-V$C?UnvkMKX!RdurEQiyVbFJKKI67APf4!vQ@(G2yL{5kBeL&OuZ4ZEbWO>@sE zW=Z&lFTb`H7rl9sA@<_Sn+A9p#@A`g9^J{N!nIN)y}o)WRzU*eFlGqH5VXc{+1#^H zDc&tB)uVAG&DZqd2Lp+^yGAur1FjigYjmFnu&Jd)w09~wo&VY%AKxoPJLcQZ<(PTV zBT|X2mQ(%HAMdwO8Z_oo!pb%@PPwe+#+lCiQ!qP*bcjy+VrtG$4YyT%Q(} z_~IPjZAD#ol9-svV9EO?8oEf*gBTCm^S^DA5ag6w^|KsJ>bh(FJ7HG+KK@IUrzx-f zLrVaaP3xaNP3W# zetkrcah&I+yVQ)c+(PvjnM~fcF~7_A=K?DNjk>WCXKz*^X%$#>CC-g{M|6B_c;tLTP zYK(taByZ9sVq#mPXr`^={`B)IGAbuM+AlP+W!T{c>nF^2X5t6N$0oWd(wB(qdJK0x z=4bLg3bth|il`jV?|=I|x<4~BOl;yv>0j@vMP3tV=8LpWsrAWhf|{nYp7`Y}6pWHZ z#nSh;{)cQ7)p{q?8(EZSoq{Z?2Tn&&PSkK_FIX-1u06=Fh}oz-{FEUrxyrluZ8&q_ zETQ_y!pCIoGsWUPMwa*>RBU)yokLcz?I^N7fMw^3cj-2#;97ODS{a-EQ@^NQr?H4& zbkXrZ?jJ(xxm3Pmw+Q%PTKUs_6Bu$N-&{W0cb?+*};zH!_D^=Sr z!#wL*oosS2f~ImL7uP*_t%*U{ zefy->6Of*fB9UG{~he5r=IbT zNyp0Mwe?8EgxMdHxe0x;*X)*|?4er?V((Rs=_;Ct;vbd~1how3f+Mb9s2WKBY;uEQwS`1%_RrD%efB*IQom?*?a9?*X4Ctj7S(84O~fksej}mARKrym|r2+$ZaMM81#iA@-?)e}#S(f?E5I z!hOE=VNrw>=<}c;q}I<56MR1w`55x)KL`i6`mv~>43KWwOHb^kOQFrZwAcU^C6Wiy zdU3p^5a0`c?04OQ+IJR*aF`2n!p_W>;OBP22imfJlb z%B}*Wqbt~;C@SceGKfXmLS=)}V(@>A%1k89?_S`?kqCsuuI@il(DI-v@Ek6E_L0bl rK$L|c5Ip;a-M0&n-jF2lTpyeo*G3@_6#oDB$U|3$WSB}C;KKg`MfY@? delta 3109 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 Date: Thu, 24 Jul 2025 23:09:15 +0800 Subject: [PATCH 0517/1170] modify code --- src/class143/Code04_MomoEquation1.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/class143/Code04_MomoEquation1.java b/src/class143/Code04_MomoEquation1.java index 56189443b..f58d77d22 100644 --- a/src/class143/Code04_MomoEquation1.java +++ b/src/class143/Code04_MomoEquation1.java @@ -112,14 +112,19 @@ public static void main(String[] args) throws IOException { l = (long) in.nval - 1; in.nextToken(); r = (long) in.nval; - in.nextToken(); - x = (int) in.nval; - prepare(); - for (int i = 2, vi; i <= n; i++) { + x = 0; + for (int i = 1, vi; i <= n; i++) { in.nextToken(); vi = (int) in.nval; - for (int j = 0; j < x; j++) { - addEdge(j, (j + vi) % x, vi); + if (vi != 0) { + if (x == 0) { + x = vi; + prepare(); + } else { + for (int j = 0; j < x; j++) { + addEdge(j, (j + vi) % x, vi); + } + } } } out.println(compute()); From cc1563b43b6318f54a70b58f13dab4cca33750f0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 30 Jul 2025 17:18:34 +0800 Subject: [PATCH 0518/1170] modify code --- src/class175/Code01_HashCollision1.java | 137 ++++++++++++++++++++++++ src/class175/Code01_HashCollision2.java | 65 +++++++++++ 2 files changed, 202 insertions(+) create mode 100644 src/class175/Code01_HashCollision1.java create mode 100644 src/class175/Code01_HashCollision2.java diff --git a/src/class175/Code01_HashCollision1.java b/src/class175/Code01_HashCollision1.java new file mode 100644 index 000000000..9f2c905fa --- /dev/null +++ b/src/class175/Code01_HashCollision1.java @@ -0,0 +1,137 @@ +package class175; + +// 哈希冲突,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3396 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code01_HashCollision1 { + + public static int MAXN = 150001; + public static int MAXB = 401; + public static int n, m, blen; + public static int[] arr = new int[MAXN]; + public static long[][] dp = new long[MAXB][MAXB]; + + public static long query(int x, int y) { + if (x <= blen) { + return dp[x][y]; + } + long ans = 0; + for (int i = y; i <= n; i += x) { + ans += arr[i]; + } + return ans; + } + + public static void update(int x, int y) { + int delta = y - arr[x]; + arr[x] = y; + for (int mod = 1; mod <= blen; mod++) { + dp[mod][x % mod] += delta; + } + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + for (int mod = 1; mod <= blen; mod++) { + for (int i = 1; i <= n; i++) { + dp[mod][i % mod] += arr[i]; + } + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + char op; + int x, y; + for (int i = 1; i <= m; i++) { + op = in.nextChar(); + x = in.nextInt(); + y = in.nextInt(); + if (op == 'A') { + out.println(query(x, y)); + } else { + update(x, y); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class175/Code01_HashCollision2.java b/src/class175/Code01_HashCollision2.java new file mode 100644 index 000000000..3999efe2b --- /dev/null +++ b/src/class175/Code01_HashCollision2.java @@ -0,0 +1,65 @@ +package class175; + +// 哈希冲突,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3396 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 150001; +//const int MAXB = 401; +//int n, m, blen; +//int arr[MAXN]; +//long long dp[MAXB][MAXB]; +// +//long long query(int x, int y) { +// if (x <= blen) { +// return dp[x][y]; +// } +// long long ans = 0; +// for (int i = y; i <= n; i += x) { +// ans += arr[i]; +// } +// return ans; +//} +// +//void update(int x, int y) { +// int delta = y - arr[x]; +// arr[x] = y; +// for (int mod = 1; mod <= blen; mod++) { +// dp[mod][x % mod] += delta; +// } +//} +// +//void prepare() { +// blen = (int)sqrt(n); +// for (int mod = 1; mod <= blen; mod++) { +// for (int i = 1; i <= n; i++) { +// dp[mod][i % mod] += arr[i]; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// char op; +// int x, y; +// for (int i = 1; i <= m; i++) { +// cin >> op >> x >> y; +// if (op == 'A') { +// cout << query(x, y) << '\n'; +// } else { +// update(x, y); +// } +// } +// return 0; +//} \ No newline at end of file From c222b2cd0370cd2b463187e8372b5bcf91b6524e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 30 Jul 2025 21:05:41 +0800 Subject: [PATCH 0519/1170] modify code --- src/class175/Code02_SumOfProgression1.java | 114 +++++++++++++++++++++ src/class175/Code02_SumOfProgression2.java | 67 ++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 src/class175/Code02_SumOfProgression1.java create mode 100644 src/class175/Code02_SumOfProgression2.java diff --git a/src/class175/Code02_SumOfProgression1.java b/src/class175/Code02_SumOfProgression1.java new file mode 100644 index 000000000..e9b5a94f6 --- /dev/null +++ b/src/class175/Code02_SumOfProgression1.java @@ -0,0 +1,114 @@ +package class175; + +// 等差数列求和,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1921F +// 测试链接 : https://codeforces.com/problemset/problem/1921/F +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code02_SumOfProgression1 { + + public static int MAXN = 100001; + public static int MAXB = 401; + public static int MAXS = MAXN + MAXB; + public static int t, n, q, blen; + public static int[] arr = new int[MAXN]; + public static long[][] f = new long[MAXS][MAXB]; + public static long[][] g = new long[MAXS][MAXB]; + + public static long query(int s, int d, int k) { + if (d <= blen) { + return g[s][d] - g[s + d * k][d] - f[s + d * k][d] * k; + } + long ans = 0; + for (int i = 1; i <= k; i++) { + ans += 1L * arr[s + (i - 1) * d] * i; + } + return ans; + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + for (int s = 1; s <= n + blen; s++) { + for (int d = 1; d < MAXB; d++) { + f[s][d] = g[s][d] = 0; + } + } + for (int s = n; s >= 1; s--) { + for (int d = 1; d <= blen; d++) { + f[s][d] = f[s + d][d] + arr[s]; + } + } + for (int s = n; s >= 1; s--) { + for (int d = 1; d <= blen; d++) { + g[s][d] = g[s + d][d] + f[s][d]; + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + t = in.nextInt(); + for (int c = 1; c <= t; c++) { + n = in.nextInt(); + q = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + for (int i = 1, s, d, k; i <= q; i++) { + s = in.nextInt(); + d = in.nextInt(); + k = in.nextInt(); + out.println(query(s, d, k)); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class175/Code02_SumOfProgression2.java b/src/class175/Code02_SumOfProgression2.java new file mode 100644 index 000000000..38f2faf34 --- /dev/null +++ b/src/class175/Code02_SumOfProgression2.java @@ -0,0 +1,67 @@ +package class175; + +// 等差数列求和,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1921F +// 测试链接 : https://codeforces.com/problemset/problem/1921/F +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXB = 401; +//const int MAXS = MAXN + MAXB; +//int t, n, q, blen; +//int arr[MAXN]; +//long long f[MAXS][MAXB]; +//long long g[MAXS][MAXB]; +// +//long long query(int s, int d, int k) { +// if (d <= blen) { +// return g[s][d] - g[s + d * k][d] - f[s + d * k][d] * k; +// } +// long long ans = 0; +// for (int i = 1; i <= k; i++) { +// ans += 1LL * i * arr[s + (i - 1) * d]; +// } +// return ans; +//} +// +//void prepare() { +// blen = (int)sqrt(n); +// for (int s = 1; s <= n + blen; s++) { +// for (int d = 1; d < MAXB; d++) { +// f[s][d] = g[s][d] = 0; +// } +// } +// for (int s = n; s >= 1; s--) { +// for (int d = 1; d <= blen; d++) { +// f[s][d] = f[s + d][d] + arr[s]; +// } +// } +// for (int s = n; s >= 1; s--) { +// for (int d = 1; d <= blen; d++) { +// g[s][d] = g[s + d][d] + f[s][d]; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> t; +// for (int c = 1; c <= t; c++) { +// cin >> n >> q; +// for (int i = 1; i <= n; ++i) { +// cin >> arr[i]; +// } +// prepare(); +// for (int i = 1, s, d, k; i <= q; i++) { +// cin >> s >> d >> k; +// cout << query(s, d, k) << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From a0a72393409fe6a29b9f30efdeeeec95f1654b60 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 31 Jul 2025 15:21:14 +0800 Subject: [PATCH 0520/1170] modify code --- src/class175/Code02_ArrayQueries1.java | 99 +++++++++++++++++++ src/class175/Code02_ArrayQueries2.java | 54 ++++++++++ ...on1.java => Code03_SumOfProgression1.java} | 30 +++--- ...on2.java => Code03_SumOfProgression2.java} | 30 +++--- 4 files changed, 181 insertions(+), 32 deletions(-) create mode 100644 src/class175/Code02_ArrayQueries1.java create mode 100644 src/class175/Code02_ArrayQueries2.java rename src/class175/{Code02_SumOfProgression1.java => Code03_SumOfProgression1.java} (81%) rename src/class175/{Code02_SumOfProgression2.java => Code03_SumOfProgression2.java} (70%) diff --git a/src/class175/Code02_ArrayQueries1.java b/src/class175/Code02_ArrayQueries1.java new file mode 100644 index 000000000..8036e2e21 --- /dev/null +++ b/src/class175/Code02_ArrayQueries1.java @@ -0,0 +1,99 @@ +package class175; + +// 数组查询,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF797E +// 测试链接 : https://codeforces.com/problemset/problem/797/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code02_ArrayQueries1 { + + public static int MAXN = 100001; + public static int MAXB = 401; + public static int n, q, blen; + public static int[] arr = new int[MAXN]; + public static int[][] dp = new int[MAXN][MAXB]; + + public static int query(int p, int k) { + if (k <= blen) { + return dp[p][k]; + } + int ans = 0; + while (p <= n) { + ans++; + p += arr[p] + k; + } + return ans; + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + for (int p = n; p >= 1; p--) { + for (int k = 1; k <= blen; k++) { + dp[p][k] = 1 + (p + arr[p] + k > n ? 0 : dp[p + arr[p] + k][k]); + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + q = in.nextInt(); + for (int i = 1, p, k; i <= q; i++) { + p = in.nextInt(); + k = in.nextInt(); + out.println(query(p, k)); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class175/Code02_ArrayQueries2.java b/src/class175/Code02_ArrayQueries2.java new file mode 100644 index 000000000..e3b6b2ec7 --- /dev/null +++ b/src/class175/Code02_ArrayQueries2.java @@ -0,0 +1,54 @@ +package class175; + +// 数组查询,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF797E +// 测试链接 : https://codeforces.com/problemset/problem/797/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXB = 401; +//int n, q, blen; +//int arr[MAXN]; +//int dp[MAXN][MAXB]; +// +//int query(int p, int k) { +// if (k <= blen) { +// return dp[p][k]; +// } +// int ans = 0; +// while (p <= n) { +// ans++; +// p += arr[p] + k; +// } +// return ans; +//} +// +//void prepare() { +// blen = (int)sqrt(n); +// for (int p = n; p >= 1; p--) { +// for (int k = 1; k <= blen; k++) { +// dp[p][k] = 1 + (p + arr[p] + k > n ? 0 : dp[p + arr[p] + k][k]); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// cin >> q; +// for (int i = 1, p, k; i <= q; i++) { +// cin >> p >> k; +// cout << query(p, k) << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class175/Code02_SumOfProgression1.java b/src/class175/Code03_SumOfProgression1.java similarity index 81% rename from src/class175/Code02_SumOfProgression1.java rename to src/class175/Code03_SumOfProgression1.java index e9b5a94f6..4092a4399 100644 --- a/src/class175/Code02_SumOfProgression1.java +++ b/src/class175/Code03_SumOfProgression1.java @@ -10,42 +10,40 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_SumOfProgression1 { +public class Code03_SumOfProgression1 { public static int MAXN = 100001; public static int MAXB = 401; - public static int MAXS = MAXN + MAXB; public static int t, n, q, blen; public static int[] arr = new int[MAXN]; - public static long[][] f = new long[MAXS][MAXB]; - public static long[][] g = new long[MAXS][MAXB]; + public static long[][] f = new long[MAXN][MAXB]; + public static long[][] g = new long[MAXN][MAXB]; public static long query(int s, int d, int k) { - if (d <= blen) { - return g[s][d] - g[s + d * k][d] - f[s + d * k][d] * k; - } long ans = 0; - for (int i = 1; i <= k; i++) { - ans += 1L * arr[s + (i - 1) * d] * i; + if (d <= blen) { + ans = g[s][d]; + if (s + d * k <= n) { + ans = ans - g[s + d * k][d] - f[s + d * k][d] * k; + } + } else { + for (int i = 1; i <= k; i++) { + ans += 1L * arr[s + (i - 1) * d] * i; + } } return ans; } public static void prepare() { blen = (int) Math.sqrt(n); - for (int s = 1; s <= n + blen; s++) { - for (int d = 1; d < MAXB; d++) { - f[s][d] = g[s][d] = 0; - } - } for (int s = n; s >= 1; s--) { for (int d = 1; d <= blen; d++) { - f[s][d] = f[s + d][d] + arr[s]; + f[s][d] = arr[s] + (s + d > n ? 0 : f[s + d][d]); } } for (int s = n; s >= 1; s--) { for (int d = 1; d <= blen; d++) { - g[s][d] = g[s + d][d] + f[s][d]; + g[s][d] = f[s][d] + (s + d > n ? 0 : g[s + d][d]); } } } diff --git a/src/class175/Code02_SumOfProgression2.java b/src/class175/Code03_SumOfProgression2.java similarity index 70% rename from src/class175/Code02_SumOfProgression2.java rename to src/class175/Code03_SumOfProgression2.java index 38f2faf34..20f7464a0 100644 --- a/src/class175/Code02_SumOfProgression2.java +++ b/src/class175/Code03_SumOfProgression2.java @@ -12,38 +12,36 @@ // //const int MAXN = 100001; //const int MAXB = 401; -//const int MAXS = MAXN + MAXB; //int t, n, q, blen; //int arr[MAXN]; -//long long f[MAXS][MAXB]; -//long long g[MAXS][MAXB]; +//long long f[MAXN][MAXB]; +//long long g[MAXN][MAXB]; // //long long query(int s, int d, int k) { -// if (d <= blen) { -// return g[s][d] - g[s + d * k][d] - f[s + d * k][d] * k; -// } // long long ans = 0; -// for (int i = 1; i <= k; i++) { -// ans += 1LL * i * arr[s + (i - 1) * d]; +// if (d <= blen) { +// ans = g[s][d]; +// if (s + d * k <= n) { +// ans -= g[s + d * k][d] + f[s + d * k][d] * k; +// } +// } else { +// for (int i = 1; i <= k; i++) { +// ans += 1LL * arr[s + (i - 1) * d] * i; +// } // } // return ans; //} // //void prepare() { // blen = (int)sqrt(n); -// for (int s = 1; s <= n + blen; s++) { -// for (int d = 1; d < MAXB; d++) { -// f[s][d] = g[s][d] = 0; -// } -// } // for (int s = n; s >= 1; s--) { // for (int d = 1; d <= blen; d++) { -// f[s][d] = f[s + d][d] + arr[s]; +// f[s][d] = arr[s] + (s + d > n ? 0 : f[s + d][d]); // } // } // for (int s = n; s >= 1; s--) { // for (int d = 1; d <= blen; d++) { -// g[s][d] = g[s + d][d] + f[s][d]; +// g[s][d] = f[s][d] + (s + d > n ? 0 : g[s + d][d]); // } // } //} @@ -54,7 +52,7 @@ // cin >> t; // for (int c = 1; c <= t; c++) { // cin >> n >> q; -// for (int i = 1; i <= n; ++i) { +// for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } // prepare(); From 38091a52a3667326b42506cba164147b0aab1a94 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 31 Jul 2025 21:04:16 +0800 Subject: [PATCH 0521/1170] modify code --- src/class175/Code04_Initialization1.java | 162 +++++++++++++++++++++++ src/class175/Code04_Initialization2.java | 112 ++++++++++++++++ 2 files changed, 274 insertions(+) create mode 100644 src/class175/Code04_Initialization1.java create mode 100644 src/class175/Code04_Initialization2.java diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java new file mode 100644 index 000000000..2a5f26267 --- /dev/null +++ b/src/class175/Code04_Initialization1.java @@ -0,0 +1,162 @@ +package class175; + +// 初始化,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5309 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code04_Initialization2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code04_Initialization1 { + + public static int MAXN = 200001; + public static int MAXB = 2001; + public static int MOD = 1000000007; + public static int n, m; + + public static long[] arr = new long[MAXN]; + public static long[] sum = new long[MAXN]; + public static long[][] pre = new long[MAXB][MAXB]; + public static long[][] suf = new long[MAXB][MAXB]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + + public static void add(int x, int y, int z) { + if (x >= blen) { + for (int i = y; i <= n; i += x) { + arr[i] += z; + sum[bi[i]] += z; + } + } else { + for (int i = y; i <= x; i++) { + pre[x][i] += z; + } + for (int i = 1; i <= y; i++) { + suf[x][i] += z; + } + } + } + + public static long querySum(int l, int r) { + int lb = bi[l], rb = bi[r]; + long ans = 0; + if (lb == rb) { + for (int i = l; i <= r; i++) { + ans += arr[i]; + } + } else { + for (int i = l; i <= br[lb]; i++) { + ans += arr[i]; + } + for (int i = bl[rb]; i <= r; i++) { + ans += arr[i]; + } + for (int b = lb + 1; b <= rb - 1; b++) { + ans += sum[b]; + } + } + return ans; + } + + public static long query(int l, int r) { + long ans = querySum(l, r); + for (int x = 1, lb, rb, num; x < blen; x++) { + lb = (l - 1) / x + 1; + rb = (r - 1) / x + 1; + num = rb - lb - 1; + if (lb == rb) { + ans = ans - pre[x][(l - 1) % x] + pre[x][(r - 1) % x + 1]; + } else { + ans = ans + pre[x][x] * num + pre[x][(r - 1) % x + 1] + suf[x][(l - 1) % x + 1]; + } + } + return ans; + } + + public static void prepare() { + blen = 128; + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int b = 1; b <= bnum; b++) { + bl[b] = (b - 1) * blen + 1; + br[b] = Math.min(b * blen, n); + for (int i = bl[b]; i <= br[b]; i++) { + sum[b] += arr[i]; + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + for (int i = 1, op, x, y, z; i <= m; i++) { + op = in.nextInt(); + x = in.nextInt(); + y = in.nextInt(); + if (op == 1) { + z = in.nextInt(); + add(x, y, z); + } else { + out.println((query(x, y) % MOD + MOD) % MOD); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java new file mode 100644 index 000000000..0eefea368 --- /dev/null +++ b/src/class175/Code04_Initialization2.java @@ -0,0 +1,112 @@ +package class175; + +// 初始化,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5309 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//const int MAXB = 2001; +//const int MOD = 1000000007; +//int n, m; +// +//long long arr[MAXN]; +//long long sum[MAXN]; +//long long pre[MAXB][MAXB]; +//long long suf[MAXB][MAXB]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +// +//void add(int x, int y, long long z) { +// if (x >= blen) { +// for (int i = y; i <= n; i += x) { +// arr[i] += z; +// sum[bi[i]] += z; +// } +// } else { +// for (int i = y; i <= x; i++) { +// pre[x][i] += z; +// } +// for (int i = 1; i <= y; i++) { +// suf[x][i] += z; +// } +// } +//} +// +//long long querySum(int l, int r) { +// int lb = bi[l], rb = bi[r]; +// long long ans = 0; +// if (lb == rb) { +// for (int i = l; i <= r; i++) { +// ans += arr[i]; +// } +// } else { +// for (int i = l; i <= br[lb]; i++) { +// ans += arr[i]; +// } +// for (int i = bl[rb]; i <= r; i++) { +// ans += arr[i]; +// } +// for (int b = lb + 1; b <= rb - 1; b++) { +// ans += sum[b]; +// } +// } +// return ans; +//} +// +//long long query(int l, int r) { +// long long ans = querySum(l, r); +// for (int x = 1, lb, rb, num; x < blen; x++) { +// lb = (l - 1) / x + 1; +// rb = (r - 1) / x + 1; +// num = rb - lb - 1; +// if (lb == rb) { +// ans = ans - pre[x][(l - 1) % x] + pre[x][(r - 1) % x + 1]; +// } else { +// ans = ans + pre[x][x] * num + pre[x][(r - 1) % x + 1] + suf[x][(l - 1) % x + 1]; +// } +// } +// return ans; +//} +// +//void prepare() { +// blen = 128; +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int b = 1; b <= bnum; b++) { +// bl[b] = (b - 1) * blen + 1; +// br[b] = min(b * blen, n); +// for (int i = bl[b]; i <= br[b]; i++) { +// sum[b] += arr[i]; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// for (int i = 1, op, x, y, z; i <= m; i++) { +// cin >> op >> x >> y; +// if (op == 1) { +// cin >> z; +// add(x, y, z); +// } else { +// cout << ((query(x, y) % MOD + MOD) % MOD) << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 0cbca3816ba94b81ffaccf6040186f72b086fbef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 31 Jul 2025 21:12:39 +0800 Subject: [PATCH 0522/1170] modify code --- src/class175/Code04_Initialization1.java | 16 ++++++++-------- src/class175/Code04_Initialization2.java | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index 2a5f26267..785d522f6 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -30,18 +30,18 @@ public class Code04_Initialization1 { public static int[] br = new int[MAXB]; public static void add(int x, int y, int z) { - if (x >= blen) { - for (int i = y; i <= n; i += x) { - arr[i] += z; - sum[bi[i]] += z; - } - } else { + if (x <= blen) { for (int i = y; i <= x; i++) { pre[x][i] += z; } for (int i = 1; i <= y; i++) { suf[x][i] += z; } + } else { + for (int i = y; i <= n; i += x) { + arr[i] += z; + sum[bi[i]] += z; + } } } @@ -68,7 +68,7 @@ public static long querySum(int l, int r) { public static long query(int l, int r) { long ans = querySum(l, r); - for (int x = 1, lb, rb, num; x < blen; x++) { + for (int x = 1, lb, rb, num; x <= blen; x++) { lb = (l - 1) / x + 1; rb = (r - 1) / x + 1; num = rb - lb - 1; @@ -82,7 +82,7 @@ public static long query(int l, int r) { } public static void prepare() { - blen = 128; + blen = 150; bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index 0eefea368..1a2539436 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -25,18 +25,18 @@ //int br[MAXB]; // //void add(int x, int y, long long z) { -// if (x >= blen) { -// for (int i = y; i <= n; i += x) { -// arr[i] += z; -// sum[bi[i]] += z; -// } -// } else { +// if (x <= blen) { // for (int i = y; i <= x; i++) { // pre[x][i] += z; // } // for (int i = 1; i <= y; i++) { // suf[x][i] += z; // } +// } else { +// for (int i = y; i <= n; i += x) { +// arr[i] += z; +// sum[bi[i]] += z; +// } // } //} // @@ -63,7 +63,7 @@ // //long long query(int l, int r) { // long long ans = querySum(l, r); -// for (int x = 1, lb, rb, num; x < blen; x++) { +// for (int x = 1, lb, rb, num; x <= blen; x++) { // lb = (l - 1) / x + 1; // rb = (r - 1) / x + 1; // num = rb - lb - 1; @@ -77,7 +77,7 @@ //} // //void prepare() { -// blen = 128; +// blen = 150; // bnum = (n + blen - 1) / blen; // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; From e01fbd0b9dc5fbc91e0bbd074d2b5f254527f8c2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 31 Jul 2025 21:16:38 +0800 Subject: [PATCH 0523/1170] modify code --- src/class175/Code04_Initialization1.java | 4 ++-- src/class175/Code04_Initialization2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index 785d522f6..83eed97cd 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -78,7 +78,7 @@ public static long query(int l, int r) { ans = ans + pre[x][x] * num + pre[x][(r - 1) % x + 1] + suf[x][(l - 1) % x + 1]; } } - return ans; + return (ans % MOD + MOD) % MOD; } public static void prepare() { @@ -113,7 +113,7 @@ public static void main(String[] args) throws Exception { z = in.nextInt(); add(x, y, z); } else { - out.println((query(x, y) % MOD + MOD) % MOD); + out.println(query(x, y)); } } out.flush(); diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index 1a2539436..ef05a63cf 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -73,7 +73,7 @@ // ans = ans + pre[x][x] * num + pre[x][(r - 1) % x + 1] + suf[x][(l - 1) % x + 1]; // } // } -// return ans; +// return (ans % MOD + MOD) % MOD; //} // //void prepare() { @@ -105,7 +105,7 @@ // cin >> z; // add(x, y, z); // } else { -// cout << ((query(x, y) % MOD + MOD) % MOD) << '\n'; +// cout << query(x, y) << '\n'; // } // } // return 0; From a72f94d1607121d8ba8ecf00d12703bcfc0e669b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 31 Jul 2025 21:48:11 +0800 Subject: [PATCH 0524/1170] modify code --- src/class175/Code04_Initialization1.java | 4 ++-- src/class175/Code04_Initialization2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index 83eed97cd..69fcbc3b7 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -73,9 +73,9 @@ public static long query(int l, int r) { rb = (r - 1) / x + 1; num = rb - lb - 1; if (lb == rb) { - ans = ans - pre[x][(l - 1) % x] + pre[x][(r - 1) % x + 1]; + ans = ans + pre[x][(r - 1) % x + 1] - pre[x][(l - 1) % x]; } else { - ans = ans + pre[x][x] * num + pre[x][(r - 1) % x + 1] + suf[x][(l - 1) % x + 1]; + ans = ans + suf[x][(l - 1) % x + 1] + pre[x][x] * num + pre[x][(r - 1) % x + 1]; } } return (ans % MOD + MOD) % MOD; diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index ef05a63cf..c98151d8d 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -68,9 +68,9 @@ // rb = (r - 1) / x + 1; // num = rb - lb - 1; // if (lb == rb) { -// ans = ans - pre[x][(l - 1) % x] + pre[x][(r - 1) % x + 1]; +// ans = ans + pre[x][(r - 1) % x + 1] - pre[x][(l - 1) % x]; // } else { -// ans = ans + pre[x][x] * num + pre[x][(r - 1) % x + 1] + suf[x][(l - 1) % x + 1]; +// ans = ans + suf[x][(l - 1) % x + 1] + pre[x][x] * num + pre[x][(r - 1) % x + 1]; // } // } // return (ans % MOD + MOD) % MOD; From 2862218c889187aea244b8886e9ac6d3e9916dc9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 1 Aug 2025 20:44:23 +0800 Subject: [PATCH 0525/1170] modify code --- src/class175/Code05_Skyscraper1.java | 157 +++++++++++++++++++++++++++ src/class175/Code05_Skyscraper2.java | 102 +++++++++++++++++ 2 files changed, 259 insertions(+) create mode 100644 src/class175/Code05_Skyscraper1.java create mode 100644 src/class175/Code05_Skyscraper2.java diff --git a/src/class175/Code05_Skyscraper1.java b/src/class175/Code05_Skyscraper1.java new file mode 100644 index 000000000..84c89396f --- /dev/null +++ b/src/class175/Code05_Skyscraper1.java @@ -0,0 +1,157 @@ +package class175; + +// 雅加达的摩天楼,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3645 +// 测试链接 : https://uoj.ac/problem/111 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.util.ArrayDeque; +import java.util.BitSet; + +public class Code05_Skyscraper1 { + + static class Node { + int idx, jump, step; + + Node(int i, int j, int s) { + idx = i; + jump = j; + step = s; + } + + } + + public static int MAXN = 30001; + public static int n, m; + + // 每个位置拥有的doge列表 + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN]; + public static int[] to = new int[MAXN]; + public static int cnt; + + // bfs需要 + public static ArrayDeque que = new ArrayDeque<>(); + public static BitSet[] set = new BitSet[MAXN]; + public static boolean[] vis = new boolean[MAXN]; + + public static void add(int idx, int jump) { + next[++cnt] = head[idx]; + to[cnt] = jump; + head[idx] = cnt; + } + + public static void extend(int idx, int jump, int step) { + if (!set[idx].get(jump)) { + set[idx].set(jump); + que.addLast(new Node(idx, jump, step)); + } + if (!vis[idx]) { + vis[idx] = true; + for (int e = head[idx], nextJump; e > 0; e = next[e]) { + nextJump = to[e]; + if (!set[idx].get(nextJump)) { + set[idx].set(nextJump); + que.addLast(new Node(idx, nextJump, step)); + } + } + } + } + + public static int bfs(int s, int t) { + if (s == t) { + return 0; + } + for (int idx = 0; idx < MAXN; idx++) { + set[idx] = new BitSet(); + } + vis[s] = true; + for (int e = head[s], jump; e > 0; e = next[e]) { + jump = to[e]; + if (!set[s].get(jump)) { + set[s].set(jump); + que.addLast(new Node(s, jump, 0)); + } + } + while (!que.isEmpty()) { + Node cur = que.pollFirst(); + int idx = cur.idx; + int jump = cur.jump; + int step = cur.step; + if (idx - jump == t || idx + jump == t) { + return step + 1; + } + if (idx - jump >= 0) { + extend(idx - jump, jump, step + 1); + } + if (idx + jump < n) { + extend(idx + jump, jump, step + 1); + } + } + return -1; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(System.out); + n = in.nextInt(); + m = in.nextInt(); + int s = in.nextInt(); + int sjump = in.nextInt(); + int t = in.nextInt(); + int tjump = in.nextInt(); + add(s, sjump); + add(t, tjump); + for (int i = 2, idx, jump; i < m; i++) { + idx = in.nextInt(); + jump = in.nextInt(); + add(idx, jump); + } + out.println(bfs(s, t)); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file diff --git a/src/class175/Code05_Skyscraper2.java b/src/class175/Code05_Skyscraper2.java new file mode 100644 index 000000000..b858d0646 --- /dev/null +++ b/src/class175/Code05_Skyscraper2.java @@ -0,0 +1,102 @@ +package class175; + +// 雅加达的摩天楼,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3645 +// 测试链接 : https://uoj.ac/problem/111 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int idx, jump, step; +//}; +// +//const int MAXN = 30001; +//int n, m; +// +//int head[MAXN]; +//int nxt[MAXN]; +//int to[MAXN]; +//int cnt; +// +//deque que; +//bitset bs[MAXN]; +//bool vis[MAXN]; +// +//void add(int idx, int jump) { +// nxt[++cnt] = head[idx]; +// to[cnt] = jump; +// head[idx] = cnt; +//} +// +//void extend(int idx, int jump, int step) { +// if (!bs[idx].test(jump)) { +// bs[idx].set(jump); +// que.push_back({idx, jump, step}); +// } +// if (!vis[idx]) { +// vis[idx] = true; +// for (int e = head[idx], nextJump; e; e = nxt[e]) { +// nextJump = to[e]; +// if (!bs[idx].test(nextJump)) { +// bs[idx].set(nextJump); +// que.push_back({idx, nextJump, step}); +// } +// } +// } +//} +// +//int bfs(int s, int t) { +// if (s == t) { +// return 0; +// } +// for (int i = 0; i < n; i++) { +// bs[i].reset(); +// vis[i] = false; +// } +// que.clear(); +// vis[s] = true; +// for (int e = head[s], jump; e; e = nxt[e]) { +// jump = to[e]; +// if (!bs[s].test(jump)) { +// bs[s].set(jump); +// que.push_back({s, jump, 0}); +// } +// } +// while (!que.empty()) { +// Node cur = que.front(); +// que.pop_front(); +// int idx = cur.idx; +// int jump = cur.jump; +// int step = cur.step; +// if (idx - jump == t || idx + jump == t) { +// return step + 1; +// } +// if (idx - jump >= 0) { +// extend(idx - jump, jump, step + 1); +// } +// if (idx + jump < n) { +// extend(idx + jump, jump, step + 1); +// } +// } +// return -1; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// int s, sjump, t, tjump; +// cin >> s >> sjump >> t >> tjump; +// add(s, sjump); +// add(t, tjump); +// for (int i = 2, idx, jump; i < m; i++) { +// cin >> idx >> jump; +// add(idx, jump); +// } +// cout << bfs(s, t) << '\n'; +// return 0; +//} \ No newline at end of file From f2f82995335784309b422203cc7a8f0c15f5f9cd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 1 Aug 2025 23:07:35 +0800 Subject: [PATCH 0526/1170] modify code --- src/class175/Code05_Skyscraper1.java | 44 ++++++++++++---------------- src/class175/Code05_Skyscraper2.java | 41 +++++++++++--------------- 2 files changed, 36 insertions(+), 49 deletions(-) diff --git a/src/class175/Code05_Skyscraper1.java b/src/class175/Code05_Skyscraper1.java index 84c89396f..3d41b9755 100644 --- a/src/class175/Code05_Skyscraper1.java +++ b/src/class175/Code05_Skyscraper1.java @@ -33,10 +33,9 @@ static class Node { public static int[] to = new int[MAXN]; public static int cnt; - // bfs需要 + // bfs过程 public static ArrayDeque que = new ArrayDeque<>(); - public static BitSet[] set = new BitSet[MAXN]; - public static boolean[] vis = new boolean[MAXN]; + public static BitSet[] vis = new BitSet[MAXN]; public static void add(int idx, int jump) { next[++cnt] = head[idx]; @@ -44,38 +43,33 @@ public static void add(int idx, int jump) { head[idx] = cnt; } + public static void trigger(int idx, int step) { + for (int e = head[idx], nextJump; e > 0; e = next[e]) { + nextJump = to[e]; + if (!vis[idx].get(nextJump)) { + vis[idx].set(nextJump); + que.addLast(new Node(idx, nextJump, step)); + } + } + head[idx] = 0; + } + public static void extend(int idx, int jump, int step) { - if (!set[idx].get(jump)) { - set[idx].set(jump); + trigger(idx, step); + if (!vis[idx].get(jump)) { + vis[idx].set(jump); que.addLast(new Node(idx, jump, step)); } - if (!vis[idx]) { - vis[idx] = true; - for (int e = head[idx], nextJump; e > 0; e = next[e]) { - nextJump = to[e]; - if (!set[idx].get(nextJump)) { - set[idx].set(nextJump); - que.addLast(new Node(idx, nextJump, step)); - } - } - } } public static int bfs(int s, int t) { if (s == t) { return 0; } - for (int idx = 0; idx < MAXN; idx++) { - set[idx] = new BitSet(); - } - vis[s] = true; - for (int e = head[s], jump; e > 0; e = next[e]) { - jump = to[e]; - if (!set[s].get(jump)) { - set[s].set(jump); - que.addLast(new Node(s, jump, 0)); - } + for (int i = 0; i < MAXN; i++) { + vis[i] = new BitSet(); } + trigger(s, 0); while (!que.isEmpty()) { Node cur = que.pollFirst(); int idx = cur.idx; diff --git a/src/class175/Code05_Skyscraper2.java b/src/class175/Code05_Skyscraper2.java index b858d0646..f050a6fa4 100644 --- a/src/class175/Code05_Skyscraper2.java +++ b/src/class175/Code05_Skyscraper2.java @@ -23,8 +23,7 @@ //int cnt; // //deque que; -//bitset bs[MAXN]; -//bool vis[MAXN]; +//bitset vis[MAXN]; // //void add(int idx, int jump) { // nxt[++cnt] = head[idx]; @@ -32,21 +31,23 @@ // head[idx] = cnt; //} // +//void trigger(int idx, int step) { +// for (int e = head[idx], nextJump; e; e = nxt[e]) { +// nextJump = to[e]; +// if (!vis[idx].test(nextJump)) { +// vis[idx].set(nextJump); +// que.push_back({idx, nextJump, step}); +// } +// } +// head[idx] = 0; +//} +// //void extend(int idx, int jump, int step) { -// if (!bs[idx].test(jump)) { -// bs[idx].set(jump); +// trigger(idx, step); +// if (!vis[idx].test(jump)) { +// vis[idx].set(jump); // que.push_back({idx, jump, step}); // } -// if (!vis[idx]) { -// vis[idx] = true; -// for (int e = head[idx], nextJump; e; e = nxt[e]) { -// nextJump = to[e]; -// if (!bs[idx].test(nextJump)) { -// bs[idx].set(nextJump); -// que.push_back({idx, nextJump, step}); -// } -// } -// } //} // //int bfs(int s, int t) { @@ -54,18 +55,10 @@ // return 0; // } // for (int i = 0; i < n; i++) { -// bs[i].reset(); -// vis[i] = false; +// vis[i].reset(); // } // que.clear(); -// vis[s] = true; -// for (int e = head[s], jump; e; e = nxt[e]) { -// jump = to[e]; -// if (!bs[s].test(jump)) { -// bs[s].set(jump); -// que.push_back({s, jump, 0}); -// } -// } +// trigger(s, 0); // while (!que.empty()) { // Node cur = que.front(); // que.pop_front(); From 143c90d9891ebab2512411882233446bc5674876 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 2 Aug 2025 17:17:21 +0800 Subject: [PATCH 0527/1170] modify code --- src/class175/Code06_GivenTree1.java | 170 ++++++++++++++++++++++++++++ src/class175/Code06_GivenTree2.java | 121 ++++++++++++++++++++ 2 files changed, 291 insertions(+) create mode 100644 src/class175/Code06_GivenTree1.java create mode 100644 src/class175/Code06_GivenTree2.java diff --git a/src/class175/Code06_GivenTree1.java b/src/class175/Code06_GivenTree1.java new file mode 100644 index 000000000..abcc818db --- /dev/null +++ b/src/class175/Code06_GivenTree1.java @@ -0,0 +1,170 @@ +package class175; + +// 给你一棵树,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1039D +// 测试链接 : https://codeforces.com/problemset/problem/1039/D +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code06_GivenTree1 { + + public static int MAXN = 200001; + public static int n, blen; + + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg = 0; + + public static int[] fa = new int[MAXN]; + public static int[] seg = new int[MAXN]; + public static int cntd = 0; + + public static int[] len = new int[MAXN]; + public static int[] max1 = new int[MAXN]; + public static int[] max2 = new int[MAXN]; + + public static int[] ans = new int[MAXN]; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void dfs(int u, int f) { + fa[u] = f; + seg[++cntd] = u; + for (int e = head[u]; e > 0; e = next[e]) { + if (to[e] != f) { + dfs(to[e], u); + } + } + } + + public static int getCnt(int limit) { + int pathCnt = 0; + for (int dfn = n, cur, father; dfn >= 1; dfn--) { + cur = seg[dfn]; + father = fa[cur]; + if (max1[cur] + max2[cur] + 1 >= limit) { + pathCnt++; + len[cur] = 0; + } else { + len[cur] = max1[cur] + 1; + } + if (len[cur] > max1[father]) { + max2[father] = max1[father]; + max1[father] = len[cur]; + } else if (len[cur] > max2[father]) { + max2[father] = len[cur]; + } + max1[cur] = max2[cur] = 0; + } + return pathCnt; + } + + public static int findLimit(int l, int r, int pathCnt) { + int limit = 1; + while (l <= r) { + int mid = (l + r) >> 1; + if (getCnt(mid) <= pathCnt) { + limit = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + return limit; + } + + public static void compute() { + for (int k = 1; k <= blen; k++) { + ans[k] = getCnt(k); + } + int l = 1, r = n; + for (int pathCnt = 0; pathCnt * blen <= n; pathCnt++) { + int limit = findLimit(l, r, pathCnt); + if (getCnt(limit) == pathCnt) { + ans[limit] = pathCnt; + r = limit; + } + } + } + + public static void prepare() { + dfs(1, 0); + int log2n = 0; + while ((1 << log2n) <= (n >> 1)) { + log2n++; + } + blen = Math.max(1, (int) Math.sqrt(n * log2n)); + Arrays.fill(ans, 1, n + 1, -1); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(System.out); + n = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + prepare(); + compute(); + for (int i = 1; i <= n; i++) { + if (ans[i] == -1) { + ans[i] = ans[i - 1]; + } + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class175/Code06_GivenTree2.java b/src/class175/Code06_GivenTree2.java new file mode 100644 index 000000000..5d28dd73e --- /dev/null +++ b/src/class175/Code06_GivenTree2.java @@ -0,0 +1,121 @@ +package class175; + +// 给你一棵树,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1039D +// 测试链接 : https://codeforces.com/problemset/problem/1039/D +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//int n, blen; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +// +//int fa[MAXN]; +//int seg[MAXN]; +//int cntd = 0; +// +//int len[MAXN]; +//int max1[MAXN]; +//int max2[MAXN]; +// +//int ans[MAXN]; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs(int u, int f) { +// fa[u] = f; +// seg[++cntd] = u; +// for (int e = head[u]; e; e = nxt[e]) { +// if (to[e] != f) { +// dfs(to[e], u); +// } +// } +//} +// +//int getCnt(int limit) { +// int pathCnt = 0; +// for (int dfn = n, cur, father; dfn >= 1; dfn--) { +// cur = seg[dfn]; +// father = fa[cur]; +// if (max1[cur] + max2[cur] + 1 >= limit) { +// pathCnt++; +// len[cur] = 0; +// } else { +// len[cur] = max1[cur] + 1; +// } +// if (len[cur] > max1[father]) { +// max2[father] = max1[father]; +// max1[father] = len[cur]; +// } else if (len[cur] > max2[father]) { +// max2[father] = len[cur]; +// } +// max1[cur] = max2[cur] = 0; +// } +// return pathCnt; +//} +// +//int findLimit(int l, int r, int pathCnt) { +// int limit = 1; +// while (l <= r) { +// int mid = (l + r) >> 1; +// if (getCnt(mid) <= pathCnt) { +// limit = mid; +// r = mid - 1; +// } else { +// l = mid + 1; +// } +// } +// return limit; +//} +// +//void compute() { +// for (int k = 1; k <= blen; k++) { +// ans[k] = getCnt(k); +// } +// int l = 1, r = n; +// for (int pathCnt = 0; pathCnt * blen <= n; pathCnt++) { +// int limit = findLimit(l, r, pathCnt); +// if (getCnt(limit) == pathCnt) { +// ans[limit] = pathCnt; +// r = limit; +// } +// } +//} +// +//void prepare() { +// dfs(1, 0); +// blen = max(1, (int)sqrt(n * log2(n))); +// fill(ans + 1, ans + n + 1, -1); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// prepare(); +// compute(); +// for (int i = 1; i <= n; i++) { +// if (ans[i] == -1) { +// ans[i] = ans[i - 1]; +// } +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 9cb6b0d5ae1dce1490e91b304170d500c181d4fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 2 Aug 2025 19:20:19 +0800 Subject: [PATCH 0528/1170] modify code --- src/class175/Code06_TillCollapse1.java | 123 ++++++++++++++++++ src/class175/Code06_TillCollapse2.java | 79 +++++++++++ ...GivenTree1.java => Code07_GivenTree1.java} | 15 ++- ...GivenTree2.java => Code07_GivenTree2.java} | 13 +- 4 files changed, 219 insertions(+), 11 deletions(-) create mode 100644 src/class175/Code06_TillCollapse1.java create mode 100644 src/class175/Code06_TillCollapse2.java rename src/class175/{Code06_GivenTree1.java => Code07_GivenTree1.java} (95%) rename src/class175/{Code06_GivenTree2.java => Code07_GivenTree2.java} (93%) diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java new file mode 100644 index 000000000..e1028ba2e --- /dev/null +++ b/src/class175/Code06_TillCollapse1.java @@ -0,0 +1,123 @@ +package class175; + +// 直到倒下,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF786C +// 测试链接 : https://codeforces.com/problemset/problem/786/C +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.InputStream; +import java.io.PrintWriter; +import java.util.Arrays; +import java.io.IOException; + +public class Code06_TillCollapse1 { + + public static int MAXN = 100001; + public static int n, blen = 1000; + public static int[] arr = new int[MAXN]; + public static int[] num = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + private static int query(int x) { + Arrays.fill(num, 0); + int cnt = 0, lst = 1, tot = 0; + for (int i = 1; i <= n; i++) { + if (num[arr[i]] == 0) { + cnt++; + num[arr[i]] = 1; + } + if (cnt > x) { + tot++; + for (int j = lst; j <= i; j++) { + num[arr[j]] = 0; + } + lst = i; + num[arr[i]] = 1; + cnt = 1; + } + } + if (cnt > 0) { + tot++; + } + return tot; + } + + public static void compute() { + for (int i = 1; i <= blen; i++) { + ans[i] = query(i); + } + for (int i = blen + 1; i <= n; i++) { + int tmp = query(i); + int l = i, r = n, find = i; + while (l <= r) { + int mid = (l + r) >> 1; + if (query(mid) >= tmp) { + find = mid; + l = mid + 1; + } else { + r = mid - 1; + } + } + for (int j = i; j <= find; j++) { + ans[j] = tmp; + } + i = find; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(System.out); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + compute(); + for (int i = 1; i <= n; i++) { + out.print(ans[i] + " "); + } + out.println(); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java new file mode 100644 index 000000000..aa5b0da17 --- /dev/null +++ b/src/class175/Code06_TillCollapse2.java @@ -0,0 +1,79 @@ +package class175; + +// 直到倒下,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF786C +// 测试链接 : https://codeforces.com/problemset/problem/786/C +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, blen = 1000; +//int arr[MAXN]; +//int num[MAXN]; +//int ans[MAXN]; +// +//int query(int x) { +// memset(num, 0, sizeof(num)); +// int cnt = 0, lst = 1, tot = 0; +// for (int i = 1; i <= n; i++) { +// if (num[arr[i]] == 0) { +// cnt++; +// num[arr[i]] = 1; +// } +// if (cnt > x) { +// tot++; +// for (int j = lst; j <= i; j++) { +// num[arr[j]] = 0; +// } +// lst = i; +// num[arr[i]] = 1; +// cnt = 1; +// } +// } +// if (cnt > 0) { +// tot++; +// } +// return tot; +//} +// +//void compute() { +// for (int i = 1; i <= blen; i++) { +// ans[i] = query(i); +// } +// for (int i = blen + 1; i <= n; i++) { +// int tmp = query(i); +// int l = i, r = n, find = i; +// while (l <= r) { +// int mid = (l + r) >> 1; +// if (query(mid) >= tmp) { +// find = mid; +// l = mid + 1; +// } else { +// r = mid - 1; +// } +// } +// for (int j = i; j <= find; j++) { +// ans[j] = tmp; +// } +// i = find; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// compute(); +// for (int i = 1; i <= n; i++) { +// cout << ans[i] << ' '; +// } +// cout << '\n'; +// return 0; +//} \ No newline at end of file diff --git a/src/class175/Code06_GivenTree1.java b/src/class175/Code07_GivenTree1.java similarity index 95% rename from src/class175/Code06_GivenTree1.java rename to src/class175/Code07_GivenTree1.java index abcc818db..2ee5b7bdb 100644 --- a/src/class175/Code06_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code06_GivenTree1 { +public class Code07_GivenTree1 { public static int MAXN = 200001; public static int n, blen; @@ -69,14 +69,17 @@ public static int getCnt(int limit) { } public static int findLimit(int l, int r, int pathCnt) { - int limit = 1; + int limit = -1; while (l <= r) { int mid = (l + r) >> 1; - if (getCnt(mid) <= pathCnt) { - limit = mid; + int cnt = getCnt(mid); + if (cnt < pathCnt) { r = mid - 1; - } else { + } else if (cnt > pathCnt) { l = mid + 1; + } else { + limit = mid; + r = mid - 1; } } return limit; @@ -89,7 +92,7 @@ public static void compute() { int l = 1, r = n; for (int pathCnt = 0; pathCnt * blen <= n; pathCnt++) { int limit = findLimit(l, r, pathCnt); - if (getCnt(limit) == pathCnt) { + if (limit != -1) { ans[limit] = pathCnt; r = limit; } diff --git a/src/class175/Code06_GivenTree2.java b/src/class175/Code07_GivenTree2.java similarity index 93% rename from src/class175/Code06_GivenTree2.java rename to src/class175/Code07_GivenTree2.java index 5d28dd73e..45c92b8cf 100644 --- a/src/class175/Code06_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -67,14 +67,17 @@ //} // //int findLimit(int l, int r, int pathCnt) { -// int limit = 1; +// int limit = -1; // while (l <= r) { // int mid = (l + r) >> 1; -// if (getCnt(mid) <= pathCnt) { -// limit = mid; +// int cnt = getCnt(mid); +// if (cnt < pathCnt) { // r = mid - 1; -// } else { +// } else if (cnt > pathCnt) { // l = mid + 1; +// } else { +// limit = mid; +// r = mid - 1; // } // } // return limit; @@ -87,7 +90,7 @@ // int l = 1, r = n; // for (int pathCnt = 0; pathCnt * blen <= n; pathCnt++) { // int limit = findLimit(l, r, pathCnt); -// if (getCnt(limit) == pathCnt) { +// if (limit != -1) { // ans[limit] = pathCnt; // r = limit; // } From c2cf63b50b666ef1ced0aa1b01f464b82b17a8be Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 3 Aug 2025 10:01:58 +0800 Subject: [PATCH 0529/1170] modify code --- src/class175/Code07_GivenTree1.java | 17 ++++++++--------- src/class175/Code07_GivenTree2.java | 17 ++++++++--------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index 2ee5b7bdb..bf28c1e39 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -69,7 +69,7 @@ public static int getCnt(int limit) { } public static int findLimit(int l, int r, int pathCnt) { - int limit = -1; + int find = -1; while (l <= r) { int mid = (l + r) >> 1; int cnt = getCnt(mid); @@ -78,23 +78,22 @@ public static int findLimit(int l, int r, int pathCnt) { } else if (cnt > pathCnt) { l = mid + 1; } else { - limit = mid; + find = mid; r = mid - 1; } } - return limit; + return find; } public static void compute() { for (int k = 1; k <= blen; k++) { ans[k] = getCnt(k); } - int l = 1, r = n; - for (int pathCnt = 0; pathCnt * blen <= n; pathCnt++) { - int limit = findLimit(l, r, pathCnt); - if (limit != -1) { - ans[limit] = pathCnt; - r = limit; + for (int pathCnt = 0, limit = n; pathCnt * blen <= n; pathCnt++) { + int find = findLimit(1, limit, pathCnt); + if (find != -1) { + ans[find] = pathCnt; + limit = find; } } } diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index 45c92b8cf..9bcf3f245 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -67,7 +67,7 @@ //} // //int findLimit(int l, int r, int pathCnt) { -// int limit = -1; +// int find = -1; // while (l <= r) { // int mid = (l + r) >> 1; // int cnt = getCnt(mid); @@ -76,23 +76,22 @@ // } else if (cnt > pathCnt) { // l = mid + 1; // } else { -// limit = mid; +// find = mid; // r = mid - 1; // } // } -// return limit; +// return find; //} // //void compute() { // for (int k = 1; k <= blen; k++) { // ans[k] = getCnt(k); // } -// int l = 1, r = n; -// for (int pathCnt = 0; pathCnt * blen <= n; pathCnt++) { -// int limit = findLimit(l, r, pathCnt); -// if (limit != -1) { -// ans[limit] = pathCnt; -// r = limit; +// for (int pathCnt = 0, limit = n; pathCnt * blen <= n; pathCnt++) { +// int find = findLimit(1, limit, pathCnt); +// if (find != -1) { +// ans[find] = pathCnt; +// limit = find; // } // } //} From 22d13ac1763e21cbcac062a21c0fdf714edda599 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 3 Aug 2025 15:54:58 +0800 Subject: [PATCH 0530/1170] modify code --- src/class175/Code06_TillCollapse1.java | 15 ++++++++------- src/class175/Code06_TillCollapse2.java | 15 ++++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java index e1028ba2e..cb39af0ba 100644 --- a/src/class175/Code06_TillCollapse1.java +++ b/src/class175/Code06_TillCollapse1.java @@ -43,25 +43,23 @@ private static int query(int x) { } public static void compute() { + Arrays.fill(ans, 1, n + 1, -1); for (int i = 1; i <= blen; i++) { ans[i] = query(i); } - for (int i = blen + 1; i <= n; i++) { - int tmp = query(i); + for (int i = blen + 1; i <= n;) { + ans[i] = query(i); int l = i, r = n, find = i; while (l <= r) { int mid = (l + r) >> 1; - if (query(mid) >= tmp) { + if (query(mid) >= ans[i]) { find = mid; l = mid + 1; } else { r = mid - 1; } } - for (int j = i; j <= find; j++) { - ans[j] = tmp; - } - i = find; + i = find + 1; } } @@ -74,6 +72,9 @@ public static void main(String[] args) throws Exception { } compute(); for (int i = 1; i <= n; i++) { + if (ans[i] == -1) { + ans[i] = ans[i - 1]; + } out.print(ans[i] + " "); } out.println(); diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java index aa5b0da17..f6a48cfd4 100644 --- a/src/class175/Code06_TillCollapse2.java +++ b/src/class175/Code06_TillCollapse2.java @@ -41,25 +41,23 @@ //} // //void compute() { +// fill(ans + 1, ans + n + 1, -1); // for (int i = 1; i <= blen; i++) { // ans[i] = query(i); // } -// for (int i = blen + 1; i <= n; i++) { -// int tmp = query(i); +// for (int i = blen + 1; i <= n;) { +// ans[i] = query(i); // int l = i, r = n, find = i; // while (l <= r) { // int mid = (l + r) >> 1; -// if (query(mid) >= tmp) { +// if (query(mid) >= ans[i]) { // find = mid; // l = mid + 1; // } else { // r = mid - 1; // } // } -// for (int j = i; j <= find; j++) { -// ans[j] = tmp; -// } -// i = find; +// i = find + 1; // } //} // @@ -72,6 +70,9 @@ // } // compute(); // for (int i = 1; i <= n; i++) { +// if (ans[i] == -1) { +// ans[i] = ans[i - 1]; +// } // cout << ans[i] << ' '; // } // cout << '\n'; From 3ed692c5d3f1083090f655d6bcc871719fd52253 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 3 Aug 2025 16:09:28 +0800 Subject: [PATCH 0531/1170] modify code --- src/class175/Code06_TillCollapse1.java | 13 +++++++++++-- src/class175/Code06_TillCollapse2.java | 9 +++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java index cb39af0ba..06eabbedf 100644 --- a/src/class175/Code06_TillCollapse1.java +++ b/src/class175/Code06_TillCollapse1.java @@ -13,7 +13,7 @@ public class Code06_TillCollapse1 { public static int MAXN = 100001; - public static int n, blen = 1000; + public static int n, blen; public static int[] arr = new int[MAXN]; public static int[] num = new int[MAXN]; public static int[] ans = new int[MAXN]; @@ -43,7 +43,6 @@ private static int query(int x) { } public static void compute() { - Arrays.fill(ans, 1, n + 1, -1); for (int i = 1; i <= blen; i++) { ans[i] = query(i); } @@ -63,6 +62,15 @@ public static void compute() { } } + public static void prepare() { + int log2n = 0; + while ((1 << log2n) <= (n >> 1)) { + log2n++; + } + blen = Math.max(1, (int) Math.sqrt(n * log2n)); + Arrays.fill(ans, 1, n + 1, -1); + } + public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(System.out); @@ -70,6 +78,7 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } + prepare(); compute(); for (int i = 1; i <= n; i++) { if (ans[i] == -1) { diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java index f6a48cfd4..8e47a514a 100644 --- a/src/class175/Code06_TillCollapse2.java +++ b/src/class175/Code06_TillCollapse2.java @@ -11,7 +11,7 @@ //using namespace std; // //const int MAXN = 100001; -//int n, blen = 1000; +//int n, blen; //int arr[MAXN]; //int num[MAXN]; //int ans[MAXN]; @@ -41,7 +41,6 @@ //} // //void compute() { -// fill(ans + 1, ans + n + 1, -1); // for (int i = 1; i <= blen; i++) { // ans[i] = query(i); // } @@ -61,6 +60,11 @@ // } //} // +//void prepare() { +// blen = max(1, (int)sqrt(n * log2(n))); +// fill(ans + 1, ans + n + 1, -1); +//} +// //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); @@ -68,6 +72,7 @@ // for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } +// prepare(); // compute(); // for (int i = 1; i <= n; i++) { // if (ans[i] == -1) { From 73bbf063d5e49dbe9a46b442fb527b9e2db20e6e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 3 Aug 2025 18:54:57 +0800 Subject: [PATCH 0532/1170] modify code --- src/class175/Code01_HashCollision1.java | 4 ++++ src/class175/Code01_HashCollision2.java | 4 ++++ src/class175/Code02_ArrayQueries1.java | 3 +++ src/class175/Code02_ArrayQueries2.java | 3 +++ src/class175/Code03_SumOfProgression1.java | 6 ++++++ src/class175/Code03_SumOfProgression2.java | 6 ++++++ src/class175/Code04_Initialization1.java | 4 ++++ src/class175/Code04_Initialization2.java | 4 ++++ src/class175/Code05_Skyscraper1.java | 7 ++++++- src/class175/Code05_Skyscraper2.java | 5 +++++ src/class175/Code06_TillCollapse1.java | 4 ++++ src/class175/Code06_TillCollapse2.java | 4 ++++ src/class175/Code07_GivenTree1.java | 5 +++++ src/class175/Code07_GivenTree2.java | 5 +++++ 14 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/class175/Code01_HashCollision1.java b/src/class175/Code01_HashCollision1.java index 9f2c905fa..5d1f37810 100644 --- a/src/class175/Code01_HashCollision1.java +++ b/src/class175/Code01_HashCollision1.java @@ -1,6 +1,10 @@ package class175; // 哈希冲突,java版 +// 给定一个长度为n的数组arr,接下来有m条操作,操作格式如下 +// 操作 A x y : 下标 % x == y,符合要求的下标,把对应的值累加起来,打印结果 +// 操作 C x y : arr[x]的值改成y +// 1 <= n、m <= 1.5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3396 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class175/Code01_HashCollision2.java b/src/class175/Code01_HashCollision2.java index 3999efe2b..efd052a58 100644 --- a/src/class175/Code01_HashCollision2.java +++ b/src/class175/Code01_HashCollision2.java @@ -1,6 +1,10 @@ package class175; // 哈希冲突,C++版 +// 给定一个长度为n的数组arr,接下来有m条操作,操作格式如下 +// 操作 A x y : 下标 % x == y,符合要求的下标,把对应的值累加起来,打印结果 +// 操作 C x y : arr[x]的值改成y +// 1 <= n、m <= 1.5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3396 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class175/Code02_ArrayQueries1.java b/src/class175/Code02_ArrayQueries1.java index 8036e2e21..959cab0a4 100644 --- a/src/class175/Code02_ArrayQueries1.java +++ b/src/class175/Code02_ArrayQueries1.java @@ -1,6 +1,9 @@ package class175; // 数组查询,java版 +// 给定一个长度为n的数组arr,接下来有q条查询,查询格式如下 +// 查询 p k : p 不断变成 p + arr[p] + k,直到 p > n 停止,打印操作次数 +// 1 <= n、q <= 10 ^ 5 // 测试链接 : https://www.luogu.com.cn/problem/CF797E // 测试链接 : https://codeforces.com/problemset/problem/797/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class175/Code02_ArrayQueries2.java b/src/class175/Code02_ArrayQueries2.java index e3b6b2ec7..df092d986 100644 --- a/src/class175/Code02_ArrayQueries2.java +++ b/src/class175/Code02_ArrayQueries2.java @@ -1,6 +1,9 @@ package class175; // 数组查询,C++版 +// 给定一个长度为n的数组arr,接下来有q条查询,查询格式如下 +// 查询 p k : p 不断变成 p + arr[p] + k,直到 p > n 停止,打印操作次数 +// 1 <= n、q <= 10 ^ 5 // 测试链接 : https://www.luogu.com.cn/problem/CF797E // 测试链接 : https://codeforces.com/problemset/problem/797/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class175/Code03_SumOfProgression1.java b/src/class175/Code03_SumOfProgression1.java index 4092a4399..c4f1679de 100644 --- a/src/class175/Code03_SumOfProgression1.java +++ b/src/class175/Code03_SumOfProgression1.java @@ -1,6 +1,12 @@ package class175; // 等差数列求和,java版 +// 一共有t组测试,每组测试遵循同样的设定 +// 给定一个长度为n的数组arr,接下来有q条查询,查询格式如下 +// 查询 s d k : arr[s]作为第1项、arr[s + 1d]作为第2项、arr[s + 2d]作为第3项... +// 每项的值 * 项的编号,一共k项都累加起来,打印累加和 +// 1 <= n <= 10^5 +// 1 <= q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1921F // 测试链接 : https://codeforces.com/problemset/problem/1921/F // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class175/Code03_SumOfProgression2.java b/src/class175/Code03_SumOfProgression2.java index 20f7464a0..4d4a21935 100644 --- a/src/class175/Code03_SumOfProgression2.java +++ b/src/class175/Code03_SumOfProgression2.java @@ -1,6 +1,12 @@ package class175; // 等差数列求和,C++版 +// 一共有t组测试,每组测试遵循同样的设定 +// 给定一个长度为n的数组arr,接下来有q条查询,查询格式如下 +// 查询 s d k : arr[s]作为第1项、arr[s + 1d]作为第2项、arr[s + 2d]作为第3项... +// 每项的值 * 项的编号,一共k项都累加起来,打印累加和 +// 1 <= n <= 10^5 +// 1 <= q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1921F // 测试链接 : https://codeforces.com/problemset/problem/1921/F // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index 69fcbc3b7..87d5241b0 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -1,6 +1,10 @@ package class175; // 初始化,java版 +// 给定一个长度为n的数组arr,接下来有m条操作,操作格式如下 +// 操作 1 x y z : 从arr[y]开始,下标每次+x,所有相应位置的数都+z,题目保证 y <= x +// 操作 2 x y : 打印arr[x..y]的累加和,答案对1000000007取余 +// 1 <= n、m <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5309 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index c98151d8d..8f9d5632a 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -1,6 +1,10 @@ package class175; // 初始化,C++版 +// 给定一个长度为n的数组arr,接下来有m条操作,操作格式如下 +// 操作 1 x y z : 从arr[y]开始,下标每次+x,所有相应位置的数都+z,题目保证 y <= x +// 操作 2 x y : 打印arr[x..y]的累加和,答案对1000000007取余 +// 1 <= n、m <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5309 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class175/Code05_Skyscraper1.java b/src/class175/Code05_Skyscraper1.java index 3d41b9755..790221ba0 100644 --- a/src/class175/Code05_Skyscraper1.java +++ b/src/class175/Code05_Skyscraper1.java @@ -1,6 +1,11 @@ package class175; // 雅加达的摩天楼,java版 +// 有n个大楼,编号0~n-1,有m个狗子,编号0~m-1 +// 每只狗子有两个参数,idx表示狗子的初始大楼,jump表示狗子的跳跃能力 +// 狗子在i位置,可以来到 i - jump 或 i + jump,向左向右自由跳跃,但不能越界 +// 0号狗子有消息希望传给1号狗子,所有狗子都可帮忙,返回至少传几次,无法送达打印-1 +// 1 <= n、m <= 30000 // 测试链接 : https://www.luogu.com.cn/problem/P3645 // 测试链接 : https://uoj.ac/problem/111 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -27,7 +32,7 @@ static class Node { public static int MAXN = 30001; public static int n, m; - // 每个位置拥有的doge列表 + // 每个位置拥有的狗子列表 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN]; public static int[] to = new int[MAXN]; diff --git a/src/class175/Code05_Skyscraper2.java b/src/class175/Code05_Skyscraper2.java index f050a6fa4..d84ecf2c6 100644 --- a/src/class175/Code05_Skyscraper2.java +++ b/src/class175/Code05_Skyscraper2.java @@ -1,6 +1,11 @@ package class175; // 雅加达的摩天楼,C++版 +// 有n个大楼,编号0~n-1,有m个狗子,编号0~m-1 +// 每只狗子有两个参数,idx表示狗子的初始大楼,jump表示狗子的跳跃能力 +// 狗子在i位置,可以来到 i - jump 或 i + jump,向左向右自由跳跃,但不能越界 +// 0号狗子有消息希望传给1号狗子,所有狗子都可帮忙,返回至少传几次,无法送达打印-1 +// 1 <= n、m <= 30000 // 测试链接 : https://www.luogu.com.cn/problem/P3645 // 测试链接 : https://uoj.ac/problem/111 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java index 06eabbedf..52954b9f8 100644 --- a/src/class175/Code06_TillCollapse1.java +++ b/src/class175/Code06_TillCollapse1.java @@ -1,6 +1,10 @@ package class175; // 直到倒下,java版 +// 给定一个长度为n的数组arr,考虑如下问题的解 +// 希望知道arr最少划分成几段,可以做到每段内,不同数值的个数 <= k +// 打印k = 1, 2, 3..n时,所有的答案 +// 1 <= arr[i] <= n <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF786C // 测试链接 : https://codeforces.com/problemset/problem/786/C // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java index 8e47a514a..793cc0752 100644 --- a/src/class175/Code06_TillCollapse2.java +++ b/src/class175/Code06_TillCollapse2.java @@ -1,6 +1,10 @@ package class175; // 直到倒下,C++版 +// 给定一个长度为n的数组arr,考虑如下问题的解 +// 希望知道arr最少划分成几段,可以做到每段内,不同数值的个数 <= k +// 打印k = 1, 2, 3..n时,所有的答案 +// 1 <= arr[i] <= n <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF786C // 测试链接 : https://codeforces.com/problemset/problem/786/C // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index bf28c1e39..de57cb283 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -1,6 +1,11 @@ package class175; // 给你一棵树,java版 +// 一共有n个节点,给定n-1条边,所有节点连成一棵树 +// 树的路径是指,从节点x到节点y,沿途节点只经过一次,k路径是指,路径上节点数正好为k +// 那么整棵树可以分解出若干条路径,路径之间不能重叠,所有路径也不要求覆盖所有点 +// 希望分解方案中,k路径的数量尽可能多,返回这个尽可能多的数量作为答案 +// 打印k = 1, 2, 3..n时,所有的答案 // 测试链接 : https://www.luogu.com.cn/problem/CF1039D // 测试链接 : https://codeforces.com/problemset/problem/1039/D // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index 9bcf3f245..69724e903 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -1,6 +1,11 @@ package class175; // 给你一棵树,C++版 +// 一共有n个节点,给定n-1条边,所有节点连成一棵树 +// 树的路径是指,从节点x到节点y,沿途节点只经过一次,k路径是指,路径上节点数正好为k +// 那么整棵树可以分解出若干条路径,路径之间不能重叠,所有路径也不要求覆盖所有点 +// 希望分解方案中,k路径的数量尽可能多,返回这个尽可能多的数量作为答案 +// 打印k = 1, 2, 3..n时,所有的答案 // 测试链接 : https://www.luogu.com.cn/problem/CF1039D // 测试链接 : https://codeforces.com/problemset/problem/1039/D // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From c1944d9cc07d0564c5f0ea18f234fadd1e42d0fb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 4 Aug 2025 17:43:25 +0800 Subject: [PATCH 0533/1170] modify code --- src/class175/Code06_TillCollapse1.java | 66 +++++++++++++++----------- src/class175/Code06_TillCollapse2.java | 66 +++++++++++++++----------- src/class175/Code07_GivenTree1.java | 24 +++++----- src/class175/Code07_GivenTree2.java | 24 +++++----- 4 files changed, 98 insertions(+), 82 deletions(-) diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java index 52954b9f8..e1747de37 100644 --- a/src/class175/Code06_TillCollapse1.java +++ b/src/class175/Code06_TillCollapse1.java @@ -19,31 +19,49 @@ public class Code06_TillCollapse1 { public static int MAXN = 100001; public static int n, blen; public static int[] arr = new int[MAXN]; - public static int[] num = new int[MAXN]; + public static boolean[] vis = new boolean[MAXN]; public static int[] ans = new int[MAXN]; - private static int query(int x) { - Arrays.fill(num, 0); - int cnt = 0, lst = 1, tot = 0; + public static int query(int limit) { + int num = 0, cnt = 0, start = 1; for (int i = 1; i <= n; i++) { - if (num[arr[i]] == 0) { - cnt++; - num[arr[i]] = 1; - } - if (cnt > x) { - tot++; - for (int j = lst; j <= i; j++) { - num[arr[j]] = 0; + if (!vis[arr[i]]) { + num++; + if (num > limit) { + cnt++; + for (int j = start; j < i; j++) { + vis[arr[j]] = false; + } + start = i; + num = 1; } - lst = i; - num[arr[i]] = 1; - cnt = 1; + vis[arr[i]] = true; + } + } + if (num > 0) { + cnt++; + for (int j = start; j <= n; j++) { + vis[arr[j]] = false; } } - if (cnt > 0) { - tot++; + return cnt; + } + + public static int jump(int l, int r, int curAns) { + int find = l; + while (l <= r) { + int mid = (l + r) >> 1; + int check = query(mid); + if (check < curAns) { + r = mid - 1; + } else if (check > curAns) { + l = mid + 1; + } else { + find = mid; + l = mid + 1; + } } - return tot; + return find; } public static void compute() { @@ -52,17 +70,7 @@ public static void compute() { } for (int i = blen + 1; i <= n;) { ans[i] = query(i); - int l = i, r = n, find = i; - while (l <= r) { - int mid = (l + r) >> 1; - if (query(mid) >= ans[i]) { - find = mid; - l = mid + 1; - } else { - r = mid - 1; - } - } - i = find + 1; + i = jump(i, n, ans[i]) + 1; } } diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java index 793cc0752..bf4600222 100644 --- a/src/class175/Code06_TillCollapse2.java +++ b/src/class175/Code06_TillCollapse2.java @@ -17,31 +17,49 @@ //const int MAXN = 100001; //int n, blen; //int arr[MAXN]; -//int num[MAXN]; +//bool vis[MAXN]; //int ans[MAXN]; // -//int query(int x) { -// memset(num, 0, sizeof(num)); -// int cnt = 0, lst = 1, tot = 0; +//int query(int limit) { +// int num = 0, cnt = 0, start = 1; // for (int i = 1; i <= n; i++) { -// if (num[arr[i]] == 0) { -// cnt++; -// num[arr[i]] = 1; -// } -// if (cnt > x) { -// tot++; -// for (int j = lst; j <= i; j++) { -// num[arr[j]] = 0; +// if (!vis[arr[i]]) { +// num++; +// if (num > limit) { +// cnt++; +// for (int j = start; j < i; j++) { +// vis[arr[j]] = false; +// } +// start = i; +// num = 1; // } -// lst = i; -// num[arr[i]] = 1; -// cnt = 1; +// vis[arr[i]] = true; +// } +// } +// if (num > 0) { +// cnt++; +// for (int j = start; j <= n; j++) { +// vis[arr[j]] = false; // } // } -// if (cnt > 0) { -// tot++; +// return cnt; +//} +// +//int jump(int l, int r, int curAns) { +// int find = l; +// while (l <= r) { +// int mid = (l + r) >> 1; +// int check = query(mid); +// if (check < curAns) { +// r = mid - 1; +// } else if (check > curAns) { +// l = mid + 1; +// } else { +// find = mid; +// l = mid + 1; +// } // } -// return tot; +// return find; //} // //void compute() { @@ -50,17 +68,7 @@ // } // for (int i = blen + 1; i <= n;) { // ans[i] = query(i); -// int l = i, r = n, find = i; -// while (l <= r) { -// int mid = (l + r) >> 1; -// if (query(mid) >= ans[i]) { -// find = mid; -// l = mid + 1; -// } else { -// r = mid - 1; -// } -// } -// i = find + 1; +// i = jump(i, n, ans[i]) + 1; // } //} // diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index de57cb283..57d578233 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -51,7 +51,7 @@ public static void dfs(int u, int f) { } } - public static int getCnt(int limit) { + public static int dp(int limit) { int pathCnt = 0; for (int dfn = n, cur, father; dfn >= 1; dfn--) { cur = seg[dfn]; @@ -73,32 +73,32 @@ public static int getCnt(int limit) { return pathCnt; } - public static int findLimit(int l, int r, int pathCnt) { - int find = -1; + public static int find(int l, int r, int pathCnt) { + int limit = -1; while (l <= r) { int mid = (l + r) >> 1; - int cnt = getCnt(mid); + int cnt = dp(mid); if (cnt < pathCnt) { r = mid - 1; } else if (cnt > pathCnt) { l = mid + 1; } else { - find = mid; + limit = mid; r = mid - 1; } } - return find; + return limit; } public static void compute() { for (int k = 1; k <= blen; k++) { - ans[k] = getCnt(k); + ans[k] = dp(k); } - for (int pathCnt = 0, limit = n; pathCnt * blen <= n; pathCnt++) { - int find = findLimit(1, limit, pathCnt); - if (find != -1) { - ans[find] = pathCnt; - limit = find; + for (int pathCnt = 0, r = n; pathCnt * blen <= n; pathCnt++) { + int limit = find(1, r, pathCnt); + if (limit != -1) { + ans[limit] = pathCnt; + r = limit; } } } diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index 69724e903..d5b4b5f25 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -49,7 +49,7 @@ // } //} // -//int getCnt(int limit) { +//int dp(int limit) { // int pathCnt = 0; // for (int dfn = n, cur, father; dfn >= 1; dfn--) { // cur = seg[dfn]; @@ -71,32 +71,32 @@ // return pathCnt; //} // -//int findLimit(int l, int r, int pathCnt) { -// int find = -1; +//int find(int l, int r, int pathCnt) { +// int limit = -1; // while (l <= r) { // int mid = (l + r) >> 1; -// int cnt = getCnt(mid); +// int cnt = dp(mid); // if (cnt < pathCnt) { // r = mid - 1; // } else if (cnt > pathCnt) { // l = mid + 1; // } else { -// find = mid; +// limit = mid; // r = mid - 1; // } // } -// return find; +// return limit; //} // //void compute() { // for (int k = 1; k <= blen; k++) { -// ans[k] = getCnt(k); +// ans[k] = dp(k); // } -// for (int pathCnt = 0, limit = n; pathCnt * blen <= n; pathCnt++) { -// int find = findLimit(1, limit, pathCnt); -// if (find != -1) { -// ans[find] = pathCnt; -// limit = find; +// for (int pathCnt = 0, r = n; pathCnt * blen <= n; pathCnt++) { +// int limit = find(1, r, pathCnt); +// if (limit != -1) { +// ans[limit] = pathCnt; +// r = limit; // } // } //} From 2a9d49661c5eb89dc944260e9a0c3af5e9b85c8b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 4 Aug 2025 19:32:55 +0800 Subject: [PATCH 0534/1170] modify code --- src/class175/Code06_TillCollapse1.java | 3 +-- src/class175/Code06_TillCollapse2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java index e1747de37..180eaff7e 100644 --- a/src/class175/Code06_TillCollapse1.java +++ b/src/class175/Code06_TillCollapse1.java @@ -68,9 +68,8 @@ public static void compute() { for (int i = 1; i <= blen; i++) { ans[i] = query(i); } - for (int i = blen + 1; i <= n;) { + for (int i = blen + 1; i <= n; i = jump(i, n, ans[i]) + 1) { ans[i] = query(i); - i = jump(i, n, ans[i]) + 1; } } diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java index bf4600222..ab43e3fb3 100644 --- a/src/class175/Code06_TillCollapse2.java +++ b/src/class175/Code06_TillCollapse2.java @@ -66,9 +66,8 @@ // for (int i = 1; i <= blen; i++) { // ans[i] = query(i); // } -// for (int i = blen + 1; i <= n;) { +// for (int i = blen + 1; i <= n; i = jump(i, n, ans[i]) + 1) { // ans[i] = query(i); -// i = jump(i, n, ans[i]) + 1; // } //} // From c8b78ab7ee6b6137395278cf3beb83e05eeb96ae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Aug 2025 13:48:40 +0800 Subject: [PATCH 0535/1170] modify code --- src/class175/Code02_ArrayQueries1.java | 1 + src/class175/Code02_ArrayQueries2.java | 1 + src/class175/Code04_Initialization1.java | 8 ++++++-- src/class175/Code04_Initialization2.java | 4 ++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/class175/Code02_ArrayQueries1.java b/src/class175/Code02_ArrayQueries1.java index 959cab0a4..29653cd8d 100644 --- a/src/class175/Code02_ArrayQueries1.java +++ b/src/class175/Code02_ArrayQueries1.java @@ -4,6 +4,7 @@ // 给定一个长度为n的数组arr,接下来有q条查询,查询格式如下 // 查询 p k : p 不断变成 p + arr[p] + k,直到 p > n 停止,打印操作次数 // 1 <= n、q <= 10 ^ 5 +// 1 <= arr[i] <= n // 测试链接 : https://www.luogu.com.cn/problem/CF797E // 测试链接 : https://codeforces.com/problemset/problem/797/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class175/Code02_ArrayQueries2.java b/src/class175/Code02_ArrayQueries2.java index df092d986..8dbacb952 100644 --- a/src/class175/Code02_ArrayQueries2.java +++ b/src/class175/Code02_ArrayQueries2.java @@ -4,6 +4,7 @@ // 给定一个长度为n的数组arr,接下来有q条查询,查询格式如下 // 查询 p k : p 不断变成 p + arr[p] + k,直到 p > n 停止,打印操作次数 // 1 <= n、q <= 10 ^ 5 +// 1 <= arr[i] <= n // 测试链接 : https://www.luogu.com.cn/problem/CF797E // 测试链接 : https://codeforces.com/problemset/problem/797/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index 87d5241b0..be3defe0d 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -82,11 +82,15 @@ public static long query(int l, int r) { ans = ans + suf[x][(l - 1) % x + 1] + pre[x][x] * num + pre[x][(r - 1) % x + 1]; } } - return (ans % MOD + MOD) % MOD; + return ans % MOD; } public static void prepare() { - blen = 150; + int log2n = 0; + while ((1 << log2n) <= (n >> 1)) { + log2n++; + } + blen = Math.max(1, (int) Math.sqrt(n / log2n)); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index 8f9d5632a..664e7735a 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -77,11 +77,11 @@ // ans = ans + suf[x][(l - 1) % x + 1] + pre[x][x] * num + pre[x][(r - 1) % x + 1]; // } // } -// return (ans % MOD + MOD) % MOD; +// return ans % MOD; //} // //void prepare() { -// blen = 150; +// blen = max(1, (int)sqrt(n / log2(n))); // bnum = (n + blen - 1) / blen; // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; From 1cf5d009f85a4f4e79af25f72f8f58db86306b4c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Aug 2025 13:55:26 +0800 Subject: [PATCH 0536/1170] modify code --- src/class175/Code06_TillCollapse1.java | 2 +- src/class175/Code06_TillCollapse2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java index 180eaff7e..7bf96fb30 100644 --- a/src/class175/Code06_TillCollapse1.java +++ b/src/class175/Code06_TillCollapse1.java @@ -1,6 +1,6 @@ package class175; -// 直到倒下,java版 +// 最少划分,java版 // 给定一个长度为n的数组arr,考虑如下问题的解 // 希望知道arr最少划分成几段,可以做到每段内,不同数值的个数 <= k // 打印k = 1, 2, 3..n时,所有的答案 diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java index ab43e3fb3..fdeb29dd5 100644 --- a/src/class175/Code06_TillCollapse2.java +++ b/src/class175/Code06_TillCollapse2.java @@ -1,6 +1,6 @@ package class175; -// 直到倒下,C++版 +// 最少划分,C++版 // 给定一个长度为n的数组arr,考虑如下问题的解 // 希望知道arr最少划分成几段,可以做到每段内,不同数值的个数 <= k // 打印k = 1, 2, 3..n时,所有的答案 From a162d915c7d1e5119afae3cdfb9d00aff2ce6b01 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Aug 2025 14:15:29 +0800 Subject: [PATCH 0537/1170] modify code --- src/class175/Code05_Skyscraper1.java | 2 +- src/class175/Code05_Skyscraper2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class175/Code05_Skyscraper1.java b/src/class175/Code05_Skyscraper1.java index 790221ba0..0637531c9 100644 --- a/src/class175/Code05_Skyscraper1.java +++ b/src/class175/Code05_Skyscraper1.java @@ -4,7 +4,7 @@ // 有n个大楼,编号0~n-1,有m个狗子,编号0~m-1 // 每只狗子有两个参数,idx表示狗子的初始大楼,jump表示狗子的跳跃能力 // 狗子在i位置,可以来到 i - jump 或 i + jump,向左向右自由跳跃,但不能越界 -// 0号狗子有消息希望传给1号狗子,所有狗子都可帮忙,返回至少传几次,无法送达打印-1 +// 0号狗子有消息希望传给1号狗子,所有狗子都可帮忙,返回至少传送几次,无法送达打印-1 // 1 <= n、m <= 30000 // 测试链接 : https://www.luogu.com.cn/problem/P3645 // 测试链接 : https://uoj.ac/problem/111 diff --git a/src/class175/Code05_Skyscraper2.java b/src/class175/Code05_Skyscraper2.java index d84ecf2c6..b7ff56e78 100644 --- a/src/class175/Code05_Skyscraper2.java +++ b/src/class175/Code05_Skyscraper2.java @@ -4,7 +4,7 @@ // 有n个大楼,编号0~n-1,有m个狗子,编号0~m-1 // 每只狗子有两个参数,idx表示狗子的初始大楼,jump表示狗子的跳跃能力 // 狗子在i位置,可以来到 i - jump 或 i + jump,向左向右自由跳跃,但不能越界 -// 0号狗子有消息希望传给1号狗子,所有狗子都可帮忙,返回至少传几次,无法送达打印-1 +// 0号狗子有消息希望传给1号狗子,所有狗子都可帮忙,返回至少传送几次,无法送达打印-1 // 1 <= n、m <= 30000 // 测试链接 : https://www.luogu.com.cn/problem/P3645 // 测试链接 : https://uoj.ac/problem/111 From e7364004c5b2d0baa6cdab05ccbeaca7a5f193c8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Aug 2025 15:33:33 +0800 Subject: [PATCH 0538/1170] modify code --- src/class175/Code01_HashCollision1.java | 4 ++-- src/class175/Code01_HashCollision2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class175/Code01_HashCollision1.java b/src/class175/Code01_HashCollision1.java index 5d1f37810..19801e067 100644 --- a/src/class175/Code01_HashCollision1.java +++ b/src/class175/Code01_HashCollision1.java @@ -42,9 +42,9 @@ public static void update(int x, int y) { public static void prepare() { blen = (int) Math.sqrt(n); - for (int mod = 1; mod <= blen; mod++) { + for (int x = 1; x <= blen; x++) { for (int i = 1; i <= n; i++) { - dp[mod][i % mod] += arr[i]; + dp[x][i % x] += arr[i]; } } } diff --git a/src/class175/Code01_HashCollision2.java b/src/class175/Code01_HashCollision2.java index efd052a58..ecd70a378 100644 --- a/src/class175/Code01_HashCollision2.java +++ b/src/class175/Code01_HashCollision2.java @@ -40,9 +40,9 @@ // //void prepare() { // blen = (int)sqrt(n); -// for (int mod = 1; mod <= blen; mod++) { +// for (int x = 1; x <= blen; x++) { // for (int i = 1; i <= n; i++) { -// dp[mod][i % mod] += arr[i]; +// dp[x][i % x] += arr[i]; // } // } //} From 50962fac33a8a4c882545d635d7584fc0fa963ed Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Aug 2025 15:35:43 +0800 Subject: [PATCH 0539/1170] modify code --- src/class175/Code01_HashCollision1.java | 10 +++++----- src/class175/Code01_HashCollision2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class175/Code01_HashCollision1.java b/src/class175/Code01_HashCollision1.java index 19801e067..722069de0 100644 --- a/src/class175/Code01_HashCollision1.java +++ b/src/class175/Code01_HashCollision1.java @@ -32,11 +32,11 @@ public static long query(int x, int y) { return ans; } - public static void update(int x, int y) { - int delta = y - arr[x]; - arr[x] = y; - for (int mod = 1; mod <= blen; mod++) { - dp[mod][x % mod] += delta; + public static void update(int i, int v) { + int delta = v - arr[i]; + arr[i] = v; + for (int x = 1; x <= blen; x++) { + dp[x][i % x] += delta; } } diff --git a/src/class175/Code01_HashCollision2.java b/src/class175/Code01_HashCollision2.java index ecd70a378..dd62d12e4 100644 --- a/src/class175/Code01_HashCollision2.java +++ b/src/class175/Code01_HashCollision2.java @@ -30,11 +30,11 @@ // return ans; //} // -//void update(int x, int y) { -// int delta = y - arr[x]; -// arr[x] = y; -// for (int mod = 1; mod <= blen; mod++) { -// dp[mod][x % mod] += delta; +//void update(int i, int v) { +// int delta = v - arr[i]; +// arr[i] = v; +// for (int x = 1; x <= blen; x++) { +// dp[x][i % x] += delta; // } //} // From bd3a807cef6cf0dbe3c9aa33a92d230211c037aa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 12:31:16 +0800 Subject: [PATCH 0540/1170] modify code --- src/class175/Code06_TillCollapse1.java | 4 +-- src/class175/Code06_TillCollapse2.java | 4 +-- src/class175/Code07_GivenTree1.java | 37 +++++++++---------- src/class175/Code07_GivenTree2.java | 49 ++++++++++++-------------- 4 files changed, 42 insertions(+), 52 deletions(-) diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java index 7bf96fb30..350c80381 100644 --- a/src/class175/Code06_TillCollapse1.java +++ b/src/class175/Code06_TillCollapse1.java @@ -61,14 +61,14 @@ public static int jump(int l, int r, int curAns) { l = mid + 1; } } - return find; + return find + 1; } public static void compute() { for (int i = 1; i <= blen; i++) { ans[i] = query(i); } - for (int i = blen + 1; i <= n; i = jump(i, n, ans[i]) + 1) { + for (int i = blen + 1; i <= n; i = jump(i, n, ans[i])) { ans[i] = query(i); } } diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java index fdeb29dd5..049a75fd3 100644 --- a/src/class175/Code06_TillCollapse2.java +++ b/src/class175/Code06_TillCollapse2.java @@ -59,14 +59,14 @@ // l = mid + 1; // } // } -// return find; +// return find + 1; //} // //void compute() { // for (int i = 1; i <= blen; i++) { // ans[i] = query(i); // } -// for (int i = blen + 1; i <= n; i = jump(i, n, ans[i]) + 1) { +// for (int i = blen + 1; i <= n; i = jump(i, n, ans[i])) { // ans[i] = query(i); // } //} diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index 57d578233..4e3c795e1 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -19,7 +19,6 @@ public class Code07_GivenTree1 { public static int MAXN = 200001; public static int n, blen; - public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN << 1]; public static int[] to = new int[MAXN << 1]; @@ -51,13 +50,13 @@ public static void dfs(int u, int f) { } } - public static int dp(int limit) { - int pathCnt = 0; + public static int query(int limit) { + int cnt = 0; for (int dfn = n, cur, father; dfn >= 1; dfn--) { cur = seg[dfn]; father = fa[cur]; if (max1[cur] + max2[cur] + 1 >= limit) { - pathCnt++; + cnt++; len[cur] = 0; } else { len[cur] = max1[cur] + 1; @@ -70,36 +69,32 @@ public static int dp(int limit) { } max1[cur] = max2[cur] = 0; } - return pathCnt; + return cnt; } - public static int find(int l, int r, int pathCnt) { - int limit = -1; + public static int jump(int l, int r, int curAns) { + int find = l; while (l <= r) { int mid = (l + r) >> 1; - int cnt = dp(mid); - if (cnt < pathCnt) { + int check = query(mid); + if (check < curAns) { r = mid - 1; - } else if (cnt > pathCnt) { + } else if (check > curAns) { l = mid + 1; } else { - limit = mid; - r = mid - 1; + find = mid; + l = mid + 1; } } - return limit; + return find + 1; } public static void compute() { - for (int k = 1; k <= blen; k++) { - ans[k] = dp(k); + for (int i = 1; i <= blen; i++) { + ans[i] = query(i); } - for (int pathCnt = 0, r = n; pathCnt * blen <= n; pathCnt++) { - int limit = find(1, r, pathCnt); - if (limit != -1) { - ans[limit] = pathCnt; - r = limit; - } + for (int i = blen + 1; i <= n; i = jump(i, n, ans[i])) { + ans[i] = query(i); } } diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index d5b4b5f25..5ef60252a 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -17,7 +17,6 @@ // //const int MAXN = 200001; //int n, blen; -// //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; @@ -34,7 +33,7 @@ //int ans[MAXN]; // //void addEdge(int u, int v) { -// nxt[++cntg] = head[u]; +// nxt[++cntg] = head[u]; // to[cntg] = v; // head[u] = cntg; //} @@ -43,61 +42,57 @@ // fa[u] = f; // seg[++cntd] = u; // for (int e = head[u]; e; e = nxt[e]) { -// if (to[e] != f) { -// dfs(to[e], u); -// } +// if (to[e] != f) { +// dfs(to[e], u); +// } // } //} // -//int dp(int limit) { -// int pathCnt = 0; +//int query(int limit) { +// int cnt = 0; // for (int dfn = n, cur, father; dfn >= 1; dfn--) { // cur = seg[dfn]; // father = fa[cur]; // if (max1[cur] + max2[cur] + 1 >= limit) { -// pathCnt++; +// cnt++; // len[cur] = 0; // } else { // len[cur] = max1[cur] + 1; // } // if (len[cur] > max1[father]) { -// max2[father] = max1[father]; +// max2[father] = max1[father]; // max1[father] = len[cur]; // } else if (len[cur] > max2[father]) { -// max2[father] = len[cur]; +// max2[father] = len[cur]; // } // max1[cur] = max2[cur] = 0; // } -// return pathCnt; +// return cnt; //} // -//int find(int l, int r, int pathCnt) { -// int limit = -1; +//int jump(int l, int r, int curAns) { +// int find = l; // while (l <= r) { // int mid = (l + r) >> 1; -// int cnt = dp(mid); -// if (cnt < pathCnt) { +// int check = query(mid); +// if (check < curAns) { // r = mid - 1; -// } else if (cnt > pathCnt) { +// } else if (check > curAns) { // l = mid + 1; // } else { -// limit = mid; -// r = mid - 1; +// find = mid; +// l = mid + 1; // } // } -// return limit; +// return find + 1; //} // //void compute() { -// for (int k = 1; k <= blen; k++) { -// ans[k] = dp(k); +// for (int i = 1; i <= blen; i++) { +// ans[i] = query(i); // } -// for (int pathCnt = 0, r = n; pathCnt * blen <= n; pathCnt++) { -// int limit = find(1, r, pathCnt); -// if (limit != -1) { -// ans[limit] = pathCnt; -// r = limit; -// } +// for (int i = blen + 1; i <= n; i = jump(i, n, ans[i])) { +// ans[i] = query(i); // } //} // From 6054e9456a2b6f4d2a4131915cdfb0f72654081a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 12:43:19 +0800 Subject: [PATCH 0541/1170] modify code --- ...eNumber.java => Code05_DoubleNumber1.java} | 3 ++- src/class030/Code05_DoubleNumber2.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) rename src/class030/{Code05_DoubleNumber.java => Code05_DoubleNumber1.java} (86%) create mode 100644 src/class030/Code05_DoubleNumber2.java diff --git a/src/class030/Code05_DoubleNumber.java b/src/class030/Code05_DoubleNumber1.java similarity index 86% rename from src/class030/Code05_DoubleNumber.java rename to src/class030/Code05_DoubleNumber1.java index 757ecd56b..079654751 100644 --- a/src/class030/Code05_DoubleNumber.java +++ b/src/class030/Code05_DoubleNumber1.java @@ -3,7 +3,8 @@ // 数组中有2种数出现了奇数次,其他的数都出现了偶数次 // 返回这2种出现了奇数次的数 // 测试链接 : https://leetcode.cn/problems/single-number-iii/ -public class Code05_DoubleNumber { +// C++版本的实现,就是本节课Code05_DoubleNumber2文件 +public class Code05_DoubleNumber1 { public static int[] singleNumber(int[] nums) { int eor1 = 0; diff --git a/src/class030/Code05_DoubleNumber2.java b/src/class030/Code05_DoubleNumber2.java new file mode 100644 index 000000000..f447b5d78 --- /dev/null +++ b/src/class030/Code05_DoubleNumber2.java @@ -0,0 +1,25 @@ +package class030; + +// 数组中有2种数出现了奇数次,其他的数都出现了偶数次 +// 返回这2种出现了奇数次的数 +// 测试链接 : https://leetcode.cn/problems/single-number-iii/ +// 如下代码是C++版,直接提交可以通过,注意看代码中的注释 + +//class Solution { +//public: +// vector singleNumber(vector& nums) { +// int eor1 = 0; +// for (int x : nums) { +// eor1 ^= x; +// } +// // 为什么这么写?自己去查!语言问题自己搞定 +// uint32_t rightOne = (uint32_t)eor1 & (-(uint32_t)eor1); +// int a = 0; +// for (int x : nums) { +// if (((uint32_t)x & rightOne) == 0) { +// a ^= x; +// } +// } +// return {a, eor1 ^ a}; +// } +//}; \ No newline at end of file From 67f3837a409a340650ac4bc254d71157ba5cf1c2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 12:47:38 +0800 Subject: [PATCH 0542/1170] modify code --- src/class030/Code05_DoubleNumber1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class030/Code05_DoubleNumber1.java b/src/class030/Code05_DoubleNumber1.java index 079654751..4d9bda306 100644 --- a/src/class030/Code05_DoubleNumber1.java +++ b/src/class030/Code05_DoubleNumber1.java @@ -3,7 +3,7 @@ // 数组中有2种数出现了奇数次,其他的数都出现了偶数次 // 返回这2种出现了奇数次的数 // 测试链接 : https://leetcode.cn/problems/single-number-iii/ -// C++版本的实现,就是本节课Code05_DoubleNumber2文件 +// 这是java版本的实现,本节课Code05_DoubleNumber2文件是C++版本的实现 public class Code05_DoubleNumber1 { public static int[] singleNumber(int[] nums) { From 2426255cb690f7aca5a512aa150d5c4f157b7a6c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 12:52:31 +0800 Subject: [PATCH 0543/1170] modify code --- src/class030/Code05_DoubleNumber2.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class030/Code05_DoubleNumber2.java b/src/class030/Code05_DoubleNumber2.java index f447b5d78..cc8008c8d 100644 --- a/src/class030/Code05_DoubleNumber2.java +++ b/src/class030/Code05_DoubleNumber2.java @@ -13,10 +13,10 @@ // eor1 ^= x; // } // // 为什么这么写?自己去查!语言问题自己搞定 -// uint32_t rightOne = (uint32_t)eor1 & (-(uint32_t)eor1); +// unsigned int rightOne = (unsigned int)eor1 & (-(unsigned int)eor1); // int a = 0; // for (int x : nums) { -// if (((uint32_t)x & rightOne) == 0) { +// if (((unsigned int)x & rightOne) == 0) { // a ^= x; // } // } From fccd0197c9dbb3046caccb5960da6410f6bac680 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 13:33:48 +0800 Subject: [PATCH 0544/1170] modify code --- src/class175/Code03_SumOfProgression1.java | 20 ++++++++++---------- src/class175/Code03_SumOfProgression2.java | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/class175/Code03_SumOfProgression1.java b/src/class175/Code03_SumOfProgression1.java index c4f1679de..16ce54faa 100644 --- a/src/class175/Code03_SumOfProgression1.java +++ b/src/class175/Code03_SumOfProgression1.java @@ -22,15 +22,15 @@ public class Code03_SumOfProgression1 { public static int MAXB = 401; public static int t, n, q, blen; public static int[] arr = new int[MAXN]; - public static long[][] f = new long[MAXN][MAXB]; - public static long[][] g = new long[MAXN][MAXB]; + public static long[][] f = new long[MAXB][MAXN]; + public static long[][] g = new long[MAXB][MAXN]; public static long query(int s, int d, int k) { long ans = 0; if (d <= blen) { - ans = g[s][d]; + ans = g[d][s]; if (s + d * k <= n) { - ans = ans - g[s + d * k][d] - f[s + d * k][d] * k; + ans = ans - g[d][s + d * k] - f[d][s + d * k] * k; } } else { for (int i = 1; i <= k; i++) { @@ -42,14 +42,14 @@ public static long query(int s, int d, int k) { public static void prepare() { blen = (int) Math.sqrt(n); - for (int s = n; s >= 1; s--) { - for (int d = 1; d <= blen; d++) { - f[s][d] = arr[s] + (s + d > n ? 0 : f[s + d][d]); + for (int d = 1; d <= blen; d++) { + for (int s = n; s >= 1; s--) { + f[d][s] = arr[s] + (s + d > n ? 0 : f[d][s + d]); } } - for (int s = n; s >= 1; s--) { - for (int d = 1; d <= blen; d++) { - g[s][d] = f[s][d] + (s + d > n ? 0 : g[s + d][d]); + for (int d = 1; d <= blen; d++) { + for (int s = n; s >= 1; s--) { + g[d][s] = f[d][s] + (s + d > n ? 0 : g[d][s + d]); } } } diff --git a/src/class175/Code03_SumOfProgression2.java b/src/class175/Code03_SumOfProgression2.java index 4d4a21935..f5a6ec378 100644 --- a/src/class175/Code03_SumOfProgression2.java +++ b/src/class175/Code03_SumOfProgression2.java @@ -20,15 +20,15 @@ //const int MAXB = 401; //int t, n, q, blen; //int arr[MAXN]; -//long long f[MAXN][MAXB]; -//long long g[MAXN][MAXB]; +//long long f[MAXB][MAXN]; +//long long g[MAXB][MAXN]; // //long long query(int s, int d, int k) { // long long ans = 0; // if (d <= blen) { -// ans = g[s][d]; +// ans = g[d][s]; // if (s + d * k <= n) { -// ans -= g[s + d * k][d] + f[s + d * k][d] * k; +// ans -= g[d][s + d * k] + f[d][s + d * k] * k; // } // } else { // for (int i = 1; i <= k; i++) { @@ -40,14 +40,14 @@ // //void prepare() { // blen = (int)sqrt(n); -// for (int s = n; s >= 1; s--) { -// for (int d = 1; d <= blen; d++) { -// f[s][d] = arr[s] + (s + d > n ? 0 : f[s + d][d]); +// for (int d = 1; d <= blen; d++) { +// for (int s = n; s >= 1; s--) { +// f[d][s] = arr[s] + (s + d > n ? 0 : f[d][s + d]); // } // } -// for (int s = n; s >= 1; s--) { -// for (int d = 1; d <= blen; d++) { -// g[s][d] = f[s][d] + (s + d > n ? 0 : g[s + d][d]); +// for (int d = 1; d <= blen; d++) { +// for (int s = n; s >= 1; s--) { +// g[d][s] = f[d][s] + (s + d > n ? 0 : g[d][s + d]); // } // } //} From caa976ecbfed8f0f3a230bf3e5863a3aab695fff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 14:27:31 +0800 Subject: [PATCH 0545/1170] modify code --- src/class175/Code04_Initialization1.java | 4 ++-- src/class175/Code04_Initialization2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index be3defe0d..d86b9f374 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -19,7 +19,7 @@ public class Code04_Initialization1 { public static int MAXN = 200001; - public static int MAXB = 2001; + public static int MAXB = 501; public static int MOD = 1000000007; public static int n, m; @@ -90,7 +90,7 @@ public static void prepare() { while ((1 << log2n) <= (n >> 1)) { log2n++; } - blen = Math.max(1, (int) Math.sqrt(n / log2n)); + blen = (int) Math.sqrt(n); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index 664e7735a..0befce448 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -14,7 +14,7 @@ //using namespace std; // //const int MAXN = 200001; -//const int MAXB = 2001; +//const int MAXB = 501; //const int MOD = 1000000007; //int n, m; // @@ -81,7 +81,7 @@ //} // //void prepare() { -// blen = max(1, (int)sqrt(n / log2(n))); +// blen = (int)sqrt(n); // bnum = (n + blen - 1) / blen; // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; From c8bc4eef3028497674423764498ccab953f06172 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 14:28:43 +0800 Subject: [PATCH 0546/1170] modify code --- src/class175/Code04_Initialization1.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index d86b9f374..ffafb2e23 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -86,10 +86,6 @@ public static long query(int l, int r) { } public static void prepare() { - int log2n = 0; - while ((1 << log2n) <= (n >> 1)) { - log2n++; - } blen = (int) Math.sqrt(n); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { From 67fff86b7414c7d43ca07ccc2b24845ec5de0e29 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 15:21:49 +0800 Subject: [PATCH 0547/1170] modify code --- src/class175/Code03_SumOfProgression1.java | 8 ++++---- src/class175/Code03_SumOfProgression2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class175/Code03_SumOfProgression1.java b/src/class175/Code03_SumOfProgression1.java index 16ce54faa..f55984bc5 100644 --- a/src/class175/Code03_SumOfProgression1.java +++ b/src/class175/Code03_SumOfProgression1.java @@ -43,13 +43,13 @@ public static long query(int s, int d, int k) { public static void prepare() { blen = (int) Math.sqrt(n); for (int d = 1; d <= blen; d++) { - for (int s = n; s >= 1; s--) { - f[d][s] = arr[s] + (s + d > n ? 0 : f[d][s + d]); + for (int i = n; i >= 1; i--) { + f[d][i] = arr[i] + (i + d > n ? 0 : f[d][i + d]); } } for (int d = 1; d <= blen; d++) { - for (int s = n; s >= 1; s--) { - g[d][s] = f[d][s] + (s + d > n ? 0 : g[d][s + d]); + for (int i = n; i >= 1; i--) { + g[d][i] = f[d][i] + (i + d > n ? 0 : g[d][i + d]); } } } diff --git a/src/class175/Code03_SumOfProgression2.java b/src/class175/Code03_SumOfProgression2.java index f5a6ec378..f4a3b74f8 100644 --- a/src/class175/Code03_SumOfProgression2.java +++ b/src/class175/Code03_SumOfProgression2.java @@ -41,13 +41,13 @@ //void prepare() { // blen = (int)sqrt(n); // for (int d = 1; d <= blen; d++) { -// for (int s = n; s >= 1; s--) { -// f[d][s] = arr[s] + (s + d > n ? 0 : f[d][s + d]); +// for (int i = n; i >= 1; i--) { +// f[d][i] = arr[i] + (i + d > n ? 0 : f[d][i + d]); // } // } // for (int d = 1; d <= blen; d++) { -// for (int s = n; s >= 1; s--) { -// g[d][s] = f[d][s] + (s + d > n ? 0 : g[d][s + d]); +// for (int i = n; i >= 1; i--) { +// g[d][i] = f[d][i] + (i + d > n ? 0 : g[d][i + d]); // } // } //} From bfad0b04c14e981b4e65f5e0e330dee90783c927 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 15:54:47 +0800 Subject: [PATCH 0548/1170] modify code --- src/class175/Code04_Initialization1.java | 2 +- src/class175/Code04_Initialization2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index ffafb2e23..dda4f664b 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -24,7 +24,7 @@ public class Code04_Initialization1 { public static int n, m; public static long[] arr = new long[MAXN]; - public static long[] sum = new long[MAXN]; + public static long[] sum = new long[MAXB]; public static long[][] pre = new long[MAXB][MAXB]; public static long[][] suf = new long[MAXB][MAXB]; diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index 0befce448..d146c2310 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -19,7 +19,7 @@ //int n, m; // //long long arr[MAXN]; -//long long sum[MAXN]; +//long long sum[MAXB]; //long long pre[MAXB][MAXB]; //long long suf[MAXB][MAXB]; // From 714933cdefddfcd76fedd57780f3b404ff09188c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 15:57:10 +0800 Subject: [PATCH 0549/1170] modify code --- src/class175/Code04_Initialization1.java | 4 ++-- src/class175/Code04_Initialization2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index dda4f664b..0f6c73e40 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -23,10 +23,10 @@ public class Code04_Initialization1 { public static int MOD = 1000000007; public static int n, m; - public static long[] arr = new long[MAXN]; - public static long[] sum = new long[MAXB]; public static long[][] pre = new long[MAXB][MAXB]; public static long[][] suf = new long[MAXB][MAXB]; + public static long[] arr = new long[MAXN]; + public static long[] sum = new long[MAXB]; public static int blen, bnum; public static int[] bi = new int[MAXN]; diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index d146c2310..10ade8894 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -18,10 +18,10 @@ //const int MOD = 1000000007; //int n, m; // -//long long arr[MAXN]; -//long long sum[MAXB]; //long long pre[MAXB][MAXB]; //long long suf[MAXB][MAXB]; +//long long arr[MAXN]; +//long long sum[MAXB]; // //int blen, bnum; //int bi[MAXN]; From fa0e93b776145df72547ea08ff57ae210bd39303 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 16:47:02 +0800 Subject: [PATCH 0550/1170] modify code --- src/class175/Code04_Initialization1.java | 2 +- src/class175/Code04_Initialization2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index 0f6c73e40..59454c28a 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -38,7 +38,7 @@ public static void add(int x, int y, int z) { for (int i = y; i <= x; i++) { pre[x][i] += z; } - for (int i = 1; i <= y; i++) { + for (int i = y; i >= 1; i--) { suf[x][i] += z; } } else { diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index 10ade8894..033c9f3f9 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -33,7 +33,7 @@ // for (int i = y; i <= x; i++) { // pre[x][i] += z; // } -// for (int i = 1; i <= y; i++) { +// for (int i = y; i >= 1; i--) { // suf[x][i] += z; // } // } else { From cce01b65082fc77e465bdd9e51461bdc6f6c2c6e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 17:59:54 +0800 Subject: [PATCH 0551/1170] modify code --- src/class175/Code04_Initialization1.java | 10 +++++----- src/class175/Code04_Initialization2.java | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class175/Code04_Initialization1.java b/src/class175/Code04_Initialization1.java index 59454c28a..677b0f564 100644 --- a/src/class175/Code04_Initialization1.java +++ b/src/class175/Code04_Initialization1.java @@ -72,11 +72,11 @@ public static long querySum(int l, int r) { public static long query(int l, int r) { long ans = querySum(l, r); - for (int x = 1, lb, rb, num; x <= blen; x++) { - lb = (l - 1) / x + 1; - rb = (r - 1) / x + 1; - num = rb - lb - 1; - if (lb == rb) { + for (int x = 1, lth, rth, num; x <= blen; x++) { + lth = (l - 1) / x + 1; + rth = (r - 1) / x + 1; + num = rth - lth - 1; + if (lth == rth) { ans = ans + pre[x][(r - 1) % x + 1] - pre[x][(l - 1) % x]; } else { ans = ans + suf[x][(l - 1) % x + 1] + pre[x][x] * num + pre[x][(r - 1) % x + 1]; diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index 033c9f3f9..7e3dc9f45 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -68,10 +68,10 @@ //long long query(int l, int r) { // long long ans = querySum(l, r); // for (int x = 1, lb, rb, num; x <= blen; x++) { -// lb = (l - 1) / x + 1; -// rb = (r - 1) / x + 1; -// num = rb - lb - 1; -// if (lb == rb) { +// lth = (l - 1) / x + 1; +// rth = (r - 1) / x + 1; +// num = rth - lth - 1; +// if (lth == rth) { // ans = ans + pre[x][(r - 1) % x + 1] - pre[x][(l - 1) % x]; // } else { // ans = ans + suf[x][(l - 1) % x + 1] + pre[x][x] * num + pre[x][(r - 1) % x + 1]; From 1184806eec3e69c1b15bd1348e156d652708c9a5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 18:07:27 +0800 Subject: [PATCH 0552/1170] modify code --- src/class175/Code04_Initialization2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class175/Code04_Initialization2.java b/src/class175/Code04_Initialization2.java index 7e3dc9f45..f7f7e80fd 100644 --- a/src/class175/Code04_Initialization2.java +++ b/src/class175/Code04_Initialization2.java @@ -67,7 +67,7 @@ // //long long query(int l, int r) { // long long ans = querySum(l, r); -// for (int x = 1, lb, rb, num; x <= blen; x++) { +// for (int x = 1, lth, rth, num; x <= blen; x++) { // lth = (l - 1) / x + 1; // rth = (r - 1) / x + 1; // num = rth - lth - 1; From 7c0b30b8685fd62b7f3dadcdf02fcc30028a5d70 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 18:39:18 +0800 Subject: [PATCH 0553/1170] modify code --- src/class175/Code05_Skyscraper1.java | 1 - src/class175/Code05_Skyscraper2.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/class175/Code05_Skyscraper1.java b/src/class175/Code05_Skyscraper1.java index 0637531c9..3c26112c5 100644 --- a/src/class175/Code05_Skyscraper1.java +++ b/src/class175/Code05_Skyscraper1.java @@ -31,7 +31,6 @@ static class Node { public static int MAXN = 30001; public static int n, m; - // 每个位置拥有的狗子列表 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN]; diff --git a/src/class175/Code05_Skyscraper2.java b/src/class175/Code05_Skyscraper2.java index b7ff56e78..c4200f861 100644 --- a/src/class175/Code05_Skyscraper2.java +++ b/src/class175/Code05_Skyscraper2.java @@ -21,7 +21,6 @@ // //const int MAXN = 30001; //int n, m; -// //int head[MAXN]; //int nxt[MAXN]; //int to[MAXN]; From 5045eab81ba3f864f7e4ad66cf3e484a0b8b178d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 19:08:43 +0800 Subject: [PATCH 0554/1170] modify code --- src/class175/Code07_GivenTree1.java | 4 +++- src/class175/Code07_GivenTree2.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index 4e3c795e1..fe997e124 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -67,7 +67,9 @@ public static int query(int limit) { } else if (len[cur] > max2[father]) { max2[father] = len[cur]; } - max1[cur] = max2[cur] = 0; + } + for (int i = 1; i <= n; i++) { + len[i] = max1[i] = max2[i] = 0; } return cnt; } diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index 5ef60252a..0049027ba 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -65,7 +65,9 @@ // } else if (len[cur] > max2[father]) { // max2[father] = len[cur]; // } -// max1[cur] = max2[cur] = 0; +// } +// for (int i = 1; i <= n; i++) { +// len[i] = max1[i] = max2[i] = 0; // } // return cnt; //} From c3bb6cf60e703091ec0534484f759831355134c2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 19:41:46 +0800 Subject: [PATCH 0555/1170] modify code --- src/class175/Code05_Skyscraper1.java | 24 ++++++++++++------------ src/class175/Code05_Skyscraper2.java | 20 ++++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/class175/Code05_Skyscraper1.java b/src/class175/Code05_Skyscraper1.java index 3c26112c5..7f923cfc9 100644 --- a/src/class175/Code05_Skyscraper1.java +++ b/src/class175/Code05_Skyscraper1.java @@ -19,12 +19,12 @@ public class Code05_Skyscraper1 { static class Node { - int idx, jump, step; + int idx, jump, time; - Node(int i, int j, int s) { + Node(int i, int j, int t) { idx = i; jump = j; - step = s; + time = t; } } @@ -47,22 +47,22 @@ public static void add(int idx, int jump) { head[idx] = cnt; } - public static void trigger(int idx, int step) { + public static void trigger(int idx, int time) { for (int e = head[idx], nextJump; e > 0; e = next[e]) { nextJump = to[e]; if (!vis[idx].get(nextJump)) { vis[idx].set(nextJump); - que.addLast(new Node(idx, nextJump, step)); + que.addLast(new Node(idx, nextJump, time)); } } head[idx] = 0; } - public static void extend(int idx, int jump, int step) { - trigger(idx, step); + public static void extend(int idx, int jump, int time) { + trigger(idx, time); if (!vis[idx].get(jump)) { vis[idx].set(jump); - que.addLast(new Node(idx, jump, step)); + que.addLast(new Node(idx, jump, time)); } } @@ -78,15 +78,15 @@ public static int bfs(int s, int t) { Node cur = que.pollFirst(); int idx = cur.idx; int jump = cur.jump; - int step = cur.step; + int time = cur.time; if (idx - jump == t || idx + jump == t) { - return step + 1; + return time + 1; } if (idx - jump >= 0) { - extend(idx - jump, jump, step + 1); + extend(idx - jump, jump, time + 1); } if (idx + jump < n) { - extend(idx + jump, jump, step + 1); + extend(idx + jump, jump, time + 1); } } return -1; diff --git a/src/class175/Code05_Skyscraper2.java b/src/class175/Code05_Skyscraper2.java index c4200f861..638d65afb 100644 --- a/src/class175/Code05_Skyscraper2.java +++ b/src/class175/Code05_Skyscraper2.java @@ -16,7 +16,7 @@ //using namespace std; // //struct Node { -// int idx, jump, step; +// int idx, jump, time; //}; // //const int MAXN = 30001; @@ -35,22 +35,22 @@ // head[idx] = cnt; //} // -//void trigger(int idx, int step) { +//void trigger(int idx, int time) { // for (int e = head[idx], nextJump; e; e = nxt[e]) { // nextJump = to[e]; // if (!vis[idx].test(nextJump)) { // vis[idx].set(nextJump); -// que.push_back({idx, nextJump, step}); +// que.push_back({idx, nextJump, time}); // } // } // head[idx] = 0; //} // -//void extend(int idx, int jump, int step) { -// trigger(idx, step); +//void extend(int idx, int jump, int time) { +// trigger(idx, time); // if (!vis[idx].test(jump)) { // vis[idx].set(jump); -// que.push_back({idx, jump, step}); +// que.push_back({idx, jump, time}); // } //} // @@ -68,15 +68,15 @@ // que.pop_front(); // int idx = cur.idx; // int jump = cur.jump; -// int step = cur.step; +// int time = cur.time; // if (idx - jump == t || idx + jump == t) { -// return step + 1; +// return time + 1; // } // if (idx - jump >= 0) { -// extend(idx - jump, jump, step + 1); +// extend(idx - jump, jump, time + 1); // } // if (idx + jump < n) { -// extend(idx + jump, jump, step + 1); +// extend(idx + jump, jump, time + 1); // } // } // return -1; From 75a1a1c7327058f3c7ec8c890baf594f472442b9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 20:06:54 +0800 Subject: [PATCH 0556/1170] modify code --- src/class175/Code05_Skyscraper1.java | 10 +++++----- src/class175/Code05_Skyscraper2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class175/Code05_Skyscraper1.java b/src/class175/Code05_Skyscraper1.java index 7f923cfc9..a86a9519e 100644 --- a/src/class175/Code05_Skyscraper1.java +++ b/src/class175/Code05_Skyscraper1.java @@ -48,11 +48,11 @@ public static void add(int idx, int jump) { } public static void trigger(int idx, int time) { - for (int e = head[idx], nextJump; e > 0; e = next[e]) { - nextJump = to[e]; - if (!vis[idx].get(nextJump)) { - vis[idx].set(nextJump); - que.addLast(new Node(idx, nextJump, time)); + for (int e = head[idx], jump; e > 0; e = next[e]) { + jump = to[e]; + if (!vis[idx].get(jump)) { + vis[idx].set(jump); + que.addLast(new Node(idx, jump, time)); } } head[idx] = 0; diff --git a/src/class175/Code05_Skyscraper2.java b/src/class175/Code05_Skyscraper2.java index 638d65afb..b3a27e22e 100644 --- a/src/class175/Code05_Skyscraper2.java +++ b/src/class175/Code05_Skyscraper2.java @@ -36,11 +36,11 @@ //} // //void trigger(int idx, int time) { -// for (int e = head[idx], nextJump; e; e = nxt[e]) { -// nextJump = to[e]; -// if (!vis[idx].test(nextJump)) { -// vis[idx].set(nextJump); -// que.push_back({idx, nextJump, time}); +// for (int e = head[idx], jump; e; e = nxt[e]) { +// jump = to[e]; +// if (!vis[idx].test(jump)) { +// vis[idx].set(jump); +// que.push_back({idx, jump, time}); // } // } // head[idx] = 0; From d1309bda3c4a06f5c9443a3cecefca1c2b3812d7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Aug 2025 20:43:46 +0800 Subject: [PATCH 0557/1170] modify code --- src/class175/Code05_Skyscraper1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class175/Code05_Skyscraper1.java b/src/class175/Code05_Skyscraper1.java index a86a9519e..ecbcad1da 100644 --- a/src/class175/Code05_Skyscraper1.java +++ b/src/class175/Code05_Skyscraper1.java @@ -31,7 +31,7 @@ static class Node { public static int MAXN = 30001; public static int n, m; - // 每个位置拥有的狗子列表 + // 每个大楼拥有的狗子列表 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN]; public static int[] to = new int[MAXN]; @@ -39,6 +39,7 @@ static class Node { // bfs过程 public static ArrayDeque que = new ArrayDeque<>(); + // vis[idx]是个位图,可以表示vis[idx][jump]是否出现过 public static BitSet[] vis = new BitSet[MAXN]; public static void add(int idx, int jump) { From c7b497efdba598b0f573b01fe2e2c6257822dd29 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 13:29:49 +0800 Subject: [PATCH 0558/1170] modify code --- src/class175/Code07_GivenTree1.java | 2 +- src/class175/Code07_GivenTree2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index fe997e124..311d40c70 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -2,7 +2,7 @@ // 给你一棵树,java版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树 -// 树的路径是指,从节点x到节点y,沿途节点只经过一次,k路径是指,路径上节点数正好为k +// 树的路径是指,从节点x到节点y的简单路径,k路径是指,路径上节点数正好为k // 那么整棵树可以分解出若干条路径,路径之间不能重叠,所有路径也不要求覆盖所有点 // 希望分解方案中,k路径的数量尽可能多,返回这个尽可能多的数量作为答案 // 打印k = 1, 2, 3..n时,所有的答案 diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index 0049027ba..49ead5990 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -2,7 +2,7 @@ // 给你一棵树,C++版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树 -// 树的路径是指,从节点x到节点y,沿途节点只经过一次,k路径是指,路径上节点数正好为k +// 树的路径是指,从节点x到节点y的简单路径,k路径是指,路径上节点数正好为k // 那么整棵树可以分解出若干条路径,路径之间不能重叠,所有路径也不要求覆盖所有点 // 希望分解方案中,k路径的数量尽可能多,返回这个尽可能多的数量作为答案 // 打印k = 1, 2, 3..n时,所有的答案 From 90182eabb32153e55f81721041e8f03941c6c653 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 13:41:06 +0800 Subject: [PATCH 0559/1170] modify code --- src/class175/Code07_GivenTree1.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index 311d40c70..17f091ff0 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -24,10 +24,15 @@ public class Code07_GivenTree1 { public static int[] to = new int[MAXN << 1]; public static int cntg = 0; + // fa[i]表示,i节点的父节点编号 + // seg[d]表示,dfn序号为d的节点,在图上的编号是什么 public static int[] fa = new int[MAXN]; public static int[] seg = new int[MAXN]; public static int cntd = 0; + // len[i]表示,当前i号节点只能往下走,没分配成路径的最长链的长度 + // max1[i]表示,最大值 { len[a], len[b], len[c] ... },其中a、b、c..是i的子节点 + // max2[i]表示,次大值 { len[a], len[b], len[c] ... },其中a、b、c..是i的子节点 public static int[] len = new int[MAXN]; public static int[] max1 = new int[MAXN]; public static int[] max2 = new int[MAXN]; From 67ce8d5c3a800b033eb05525d34010541d28833f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 13:43:06 +0800 Subject: [PATCH 0560/1170] modify code --- src/class175/Code07_GivenTree1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index 17f091ff0..cdd01bbee 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -2,7 +2,7 @@ // 给你一棵树,java版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树 -// 树的路径是指,从节点x到节点y的简单路径,k路径是指,路径上节点数正好为k +// 树的路径是指,从端点x到端点y的简单路径,k路径是指,路径上节点数正好为k // 那么整棵树可以分解出若干条路径,路径之间不能重叠,所有路径也不要求覆盖所有点 // 希望分解方案中,k路径的数量尽可能多,返回这个尽可能多的数量作为答案 // 打印k = 1, 2, 3..n时,所有的答案 From 7d33ffe509216d8d01e953787653bcad21b659fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 13:43:37 +0800 Subject: [PATCH 0561/1170] modify code --- src/class175/Code07_GivenTree2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index 49ead5990..ade3e13d7 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -2,7 +2,7 @@ // 给你一棵树,C++版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树 -// 树的路径是指,从节点x到节点y的简单路径,k路径是指,路径上节点数正好为k +// 树的路径是指,从端点x到端点y的简单路径,k路径是指,路径上节点数正好为k // 那么整棵树可以分解出若干条路径,路径之间不能重叠,所有路径也不要求覆盖所有点 // 希望分解方案中,k路径的数量尽可能多,返回这个尽可能多的数量作为答案 // 打印k = 1, 2, 3..n时,所有的答案 From 6c132ae2aec803fdc3082a91ac256c3987baf163 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 14:23:18 +0800 Subject: [PATCH 0562/1170] modify code --- src/class175/Code06_TillCollapse1.java | 2 +- src/class175/Code06_TillCollapse2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java index 350c80381..4ed19f510 100644 --- a/src/class175/Code06_TillCollapse1.java +++ b/src/class175/Code06_TillCollapse1.java @@ -2,7 +2,7 @@ // 最少划分,java版 // 给定一个长度为n的数组arr,考虑如下问题的解 -// 希望知道arr最少划分成几段,可以做到每段内,不同数值的个数 <= k +// 数组arr划分成若干段子数组,保证每段不同数字的种类 <= k,返回至少划分成几段 // 打印k = 1, 2, 3..n时,所有的答案 // 1 <= arr[i] <= n <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF786C diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java index 049a75fd3..67a626ce5 100644 --- a/src/class175/Code06_TillCollapse2.java +++ b/src/class175/Code06_TillCollapse2.java @@ -2,7 +2,7 @@ // 最少划分,C++版 // 给定一个长度为n的数组arr,考虑如下问题的解 -// 希望知道arr最少划分成几段,可以做到每段内,不同数值的个数 <= k +// 数组arr划分成若干段子数组,保证每段不同数字的种类 <= k,返回至少划分成几段 // 打印k = 1, 2, 3..n时,所有的答案 // 1 <= arr[i] <= n <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF786C From 6c0ca39a7375a444d55b3e0a361d0ed3d4b23776 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 14:40:51 +0800 Subject: [PATCH 0563/1170] modify code --- src/class175/Code06_TillCollapse1.java | 10 +++++----- src/class175/Code06_TillCollapse2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class175/Code06_TillCollapse1.java b/src/class175/Code06_TillCollapse1.java index 4ed19f510..938c885e5 100644 --- a/src/class175/Code06_TillCollapse1.java +++ b/src/class175/Code06_TillCollapse1.java @@ -23,22 +23,22 @@ public class Code06_TillCollapse1 { public static int[] ans = new int[MAXN]; public static int query(int limit) { - int num = 0, cnt = 0, start = 1; + int kind = 0, cnt = 0, start = 1; for (int i = 1; i <= n; i++) { if (!vis[arr[i]]) { - num++; - if (num > limit) { + kind++; + if (kind > limit) { cnt++; for (int j = start; j < i; j++) { vis[arr[j]] = false; } start = i; - num = 1; + kind = 1; } vis[arr[i]] = true; } } - if (num > 0) { + if (kind > 0) { cnt++; for (int j = start; j <= n; j++) { vis[arr[j]] = false; diff --git a/src/class175/Code06_TillCollapse2.java b/src/class175/Code06_TillCollapse2.java index 67a626ce5..cc1b86e4b 100644 --- a/src/class175/Code06_TillCollapse2.java +++ b/src/class175/Code06_TillCollapse2.java @@ -21,22 +21,22 @@ //int ans[MAXN]; // //int query(int limit) { -// int num = 0, cnt = 0, start = 1; +// int kind = 0, cnt = 0, start = 1; // for (int i = 1; i <= n; i++) { // if (!vis[arr[i]]) { -// num++; -// if (num > limit) { +// kind++; +// if (kind > limit) { // cnt++; // for (int j = start; j < i; j++) { // vis[arr[j]] = false; // } // start = i; -// num = 1; +// kind = 1; // } // vis[arr[i]] = true; // } // } -// if (num > 0) { +// if (kind > 0) { // cnt++; // for (int j = start; j <= n; j++) { // vis[arr[j]] = false; From 10be0c6bd8d1bc2b928d696452685515c56745bf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 15:51:51 +0800 Subject: [PATCH 0564/1170] modify code --- src/class175/Code07_GivenTree1.java | 7 +++---- src/class175/Code07_GivenTree2.java | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index cdd01bbee..e783de56e 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -2,10 +2,9 @@ // 给你一棵树,java版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树 -// 树的路径是指,从端点x到端点y的简单路径,k路径是指,路径上节点数正好为k -// 那么整棵树可以分解出若干条路径,路径之间不能重叠,所有路径也不要求覆盖所有点 -// 希望分解方案中,k路径的数量尽可能多,返回这个尽可能多的数量作为答案 -// 打印k = 1, 2, 3..n时,所有的答案 +// 树的路径是指,从端点x到端点y的简单路径,k路径是指,路径的节点数正好为k +// 整棵树希望分解成尽量多的k路径,k路径的节点不能复用,所有k路径不要求包含所有点 +// 打印k = 1, 2, 3..n时,k路径有最多有几条 // 测试链接 : https://www.luogu.com.cn/problem/CF1039D // 测试链接 : https://codeforces.com/problemset/problem/1039/D // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index ade3e13d7..c6b55cca0 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -2,10 +2,9 @@ // 给你一棵树,C++版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树 -// 树的路径是指,从端点x到端点y的简单路径,k路径是指,路径上节点数正好为k -// 那么整棵树可以分解出若干条路径,路径之间不能重叠,所有路径也不要求覆盖所有点 -// 希望分解方案中,k路径的数量尽可能多,返回这个尽可能多的数量作为答案 -// 打印k = 1, 2, 3..n时,所有的答案 +// 树的路径是指,从端点x到端点y的简单路径,k路径是指,路径的节点数正好为k +// 整棵树希望分解成尽量多的k路径,k路径的节点不能复用,所有k路径不要求包含所有点 +// 打印k = 1, 2, 3..n时,k路径有最多有几条 // 测试链接 : https://www.luogu.com.cn/problem/CF1039D // 测试链接 : https://codeforces.com/problemset/problem/1039/D // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 3d2c99e873718084852369895673e3cea20c45d2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 16:01:29 +0800 Subject: [PATCH 0565/1170] modify code --- src/class175/Code07_GivenTree1.java | 6 +++--- src/class175/Code07_GivenTree2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index e783de56e..8481942b2 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -54,12 +54,12 @@ public static void dfs(int u, int f) { } } - public static int query(int limit) { + public static int query(int k) { int cnt = 0; for (int dfn = n, cur, father; dfn >= 1; dfn--) { cur = seg[dfn]; father = fa[cur]; - if (max1[cur] + max2[cur] + 1 >= limit) { + if (max1[cur] + max2[cur] + 1 >= k) { cnt++; len[cur] = 0; } else { @@ -105,7 +105,6 @@ public static void compute() { } public static void prepare() { - dfs(1, 0); int log2n = 0; while ((1 << log2n) <= (n >> 1)) { log2n++; @@ -124,6 +123,7 @@ public static void main(String[] args) throws Exception { addEdge(u, v); addEdge(v, u); } + dfs(1, 0); prepare(); compute(); for (int i = 1; i <= n; i++) { diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index c6b55cca0..4ac155bf1 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -47,12 +47,12 @@ // } //} // -//int query(int limit) { +//int query(int k) { // int cnt = 0; // for (int dfn = n, cur, father; dfn >= 1; dfn--) { // cur = seg[dfn]; // father = fa[cur]; -// if (max1[cur] + max2[cur] + 1 >= limit) { +// if (max1[cur] + max2[cur] + 1 >= k) { // cnt++; // len[cur] = 0; // } else { @@ -98,7 +98,6 @@ //} // //void prepare() { -// dfs(1, 0); // blen = max(1, (int)sqrt(n * log2(n))); // fill(ans + 1, ans + n + 1, -1); //} @@ -112,6 +111,7 @@ // addEdge(u, v); // addEdge(v, u); // } +// dfs(1, 0); // prepare(); // compute(); // for (int i = 1; i <= n; i++) { From 21326292a8020dab6a60be2e0d383149c36a0126 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 16:07:31 +0800 Subject: [PATCH 0566/1170] modify code --- src/class175/Code07_GivenTree1.java | 10 +++++----- src/class175/Code07_GivenTree2.java | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class175/Code07_GivenTree1.java b/src/class175/Code07_GivenTree1.java index 8481942b2..c8b69c415 100644 --- a/src/class175/Code07_GivenTree1.java +++ b/src/class175/Code07_GivenTree1.java @@ -24,9 +24,9 @@ public class Code07_GivenTree1 { public static int cntg = 0; // fa[i]表示,i节点的父节点编号 - // seg[d]表示,dfn序号为d的节点,在图上的编号是什么 + // dfnOrder是根据dfn序,依次收集上来的节点编号 public static int[] fa = new int[MAXN]; - public static int[] seg = new int[MAXN]; + public static int[] dfnOrder = new int[MAXN]; public static int cntd = 0; // len[i]表示,当前i号节点只能往下走,没分配成路径的最长链的长度 @@ -46,7 +46,7 @@ public static void addEdge(int u, int v) { public static void dfs(int u, int f) { fa[u] = f; - seg[++cntd] = u; + dfnOrder[++cntd] = u; for (int e = head[u]; e > 0; e = next[e]) { if (to[e] != f) { dfs(to[e], u); @@ -56,8 +56,8 @@ public static void dfs(int u, int f) { public static int query(int k) { int cnt = 0; - for (int dfn = n, cur, father; dfn >= 1; dfn--) { - cur = seg[dfn]; + for (int i = n, cur, father; i >= 1; i--) { + cur = dfnOrder[i]; father = fa[cur]; if (max1[cur] + max2[cur] + 1 >= k) { cnt++; diff --git a/src/class175/Code07_GivenTree2.java b/src/class175/Code07_GivenTree2.java index 4ac155bf1..7fc6acecd 100644 --- a/src/class175/Code07_GivenTree2.java +++ b/src/class175/Code07_GivenTree2.java @@ -22,7 +22,7 @@ //int cntg = 0; // //int fa[MAXN]; -//int seg[MAXN]; +//int dfnOrder[MAXN]; //int cntd = 0; // //int len[MAXN]; @@ -39,7 +39,7 @@ // //void dfs(int u, int f) { // fa[u] = f; -// seg[++cntd] = u; +// dfnOrder[++cntd] = u; // for (int e = head[u]; e; e = nxt[e]) { // if (to[e] != f) { // dfs(to[e], u); @@ -49,8 +49,8 @@ // //int query(int k) { // int cnt = 0; -// for (int dfn = n, cur, father; dfn >= 1; dfn--) { -// cur = seg[dfn]; +// for (int i = n, cur, father; i >= 1; i--) { +// cur = dfnOrder[i]; // father = fa[cur]; // if (max1[cur] + max2[cur] + 1 >= k) { // cnt++; From 3cdba910b92bdcbf30a9e1b785becaab0161c3f3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Aug 2025 17:04:20 +0800 Subject: [PATCH 0567/1170] modify code --- ...71\345\217\267\345\210\206\346\262\273.pptx" | Bin 0 -> 52612 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243175\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2304-\346\240\271\345\217\267\345\210\206\346\262\273.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243175\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2304-\346\240\271\345\217\267\345\210\206\346\262\273.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243175\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2304-\346\240\271\345\217\267\345\210\206\346\262\273.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..ef506834435332aac705106e78fc455beffe719a GIT binary patch literal 52612 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 Apa1{> literal 0 HcmV?d00001 From 994f427912bf2e0a95b798639b68f09ba786e26b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Aug 2025 17:24:55 +0800 Subject: [PATCH 0568/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 164 ++++++++++++++++++++++++++ src/class176/Code01_MoAlgorithm2.java | 106 +++++++++++++++++ 2 files changed, 270 insertions(+) create mode 100644 src/class176/Code01_MoAlgorithm1.java create mode 100644 src/class176/Code01_MoAlgorithm2.java diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java new file mode 100644 index 000000000..60bea028d --- /dev/null +++ b/src/class176/Code01_MoAlgorithm1.java @@ -0,0 +1,164 @@ +package class176; + +// 普通莫队模版题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/SP3267 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code01_MoAlgorithm1 { + + // 莫队经典排序 + public static class QueryCmp1 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + return a[1] - b[1]; + } + + } + + // 莫队优化常数的排序 + public static class QueryCmp2 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } + return b[1] - a[1]; + } + + } + + public static QueryCmp1 cmp1 = new QueryCmp1(); + public static QueryCmp2 cmp2 = new QueryCmp2(); + + public static int MAXN = 30001; + public static int MAXV = 1000001; + public static int MAXQ = 200001; + public static int n, q; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXQ][3]; + + public static int[] bi = new int[MAXN]; + public static int[] cnt = new int[MAXV]; + public static int kind = 0; + + public static int[] ans = new int[MAXQ]; + + public static void del(int idx) { + if (--cnt[arr[idx]] == 0) { + kind--; + } + } + + public static void add(int idx) { + if (++cnt[arr[idx]] == 1) { + kind++; + } + } + + public static void prepare() { + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + // Arrays.sort(query, 1, q + 1, cmp1); + Arrays.sort(query, 1, q + 1, cmp2); + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= q; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + while (winl < jobl) { + del(winl++); + } + while (winl > jobl) { + add(--winl); + } + while (winr < jobr) { + add(++winr); + } + while (winr > jobr) { + del(winr--); + } + ans[query[i][2]] = kind; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + q = in.nextInt(); + for (int i = 1; i <= q; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= q; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java new file mode 100644 index 000000000..fa31ab4e9 --- /dev/null +++ b/src/class176/Code01_MoAlgorithm2.java @@ -0,0 +1,106 @@ +package class176; + +// 普通莫队模版题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/SP3267 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 30001; +//const int MAXV = 1000001; +//const int MAXQ = 200001; +//int n, q; +//int arr[MAXN]; +//Query query[MAXQ]; +// +//int bi[MAXN]; +//int cnt[MAXV]; +//int kind = 0; +// +//int ans[MAXQ]; +// +//bool QueryCmp1(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// return a.r < b.r; +//} +// +//bool QueryCmp2(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// if ((bi[a.l] & 1) == 1) { +// return a.r < b.r; +// } +// return a.r > b.r; +//} +// +//void del(int idx) { +// if (--cnt[arr[idx]] == 0) { +// kind--; +// } +//} +// +//void add(int idx) { +// if (++cnt[arr[idx]] == 1) { +// kind++; +// } +//} +// +//void prepare() { +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + q + 1, QueryCmp2); +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= q; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// while (winl < jobl) { +// del(winl++); +// } +// while (winl > jobl) { +// add(--winl); +// } +// while (winr < jobr) { +// add(++winr); +// } +// while (winr > jobr) { +// del(winr--); +// } +// ans[query[i].id] = kind; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// cin >> q; +// for (int i = 1; i <= q; i++) { +// cin >> query[i].l; +// cin >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= q; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From c22cb7b414f0afae08264cc5bc49087de4532395 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Aug 2025 19:11:13 +0800 Subject: [PATCH 0569/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 3 +- src/class176/Code01_MoAlgorithm2.java | 1 - src/class176/Code02_QueryFromB1.java | 160 ++++++++++++++++++++++++++ src/class176/Code02_QueryFromB2.java | 100 ++++++++++++++++ 4 files changed, 261 insertions(+), 3 deletions(-) create mode 100644 src/class176/Code02_QueryFromB1.java create mode 100644 src/class176/Code02_QueryFromB2.java diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index 60bea028d..1954f09ce 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -26,7 +26,7 @@ public int compare(int[] a, int[] b) { } - // 莫队优化常数的排序 + // 莫队奇偶排序 public static class QueryCmp2 implements Comparator { @Override @@ -55,7 +55,6 @@ public int compare(int[] a, int[] b) { public static int[] bi = new int[MAXN]; public static int[] cnt = new int[MAXV]; public static int kind = 0; - public static int[] ans = new int[MAXQ]; public static void del(int idx) { diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java index fa31ab4e9..ae602430b 100644 --- a/src/class176/Code01_MoAlgorithm2.java +++ b/src/class176/Code01_MoAlgorithm2.java @@ -23,7 +23,6 @@ //int bi[MAXN]; //int cnt[MAXV]; //int kind = 0; -// //int ans[MAXQ]; // //bool QueryCmp1(Query &a, Query &b) { diff --git a/src/class176/Code02_QueryFromB1.java b/src/class176/Code02_QueryFromB1.java new file mode 100644 index 000000000..9b0db1917 --- /dev/null +++ b/src/class176/Code02_QueryFromB1.java @@ -0,0 +1,160 @@ +package class176; + +// 小B的询问,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2709 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code02_QueryFromB1 { + + // 莫队经典排序 + public static class QueryCmp1 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + return a[1] - b[1]; + } + + } + + // 莫队奇偶排序 + public static class QueryCmp2 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } + return b[1] - a[1]; + } + + } + + public static QueryCmp1 cmp1 = new QueryCmp1(); + public static QueryCmp2 cmp2 = new QueryCmp2(); + + public static int MAXN = 50001; + public static int n, m, k; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + + public static int[] bi = new int[MAXN]; + public static int[] cnt = new int[MAXN]; + public static long sum = 0; + public static long[] ans = new long[MAXN]; + + public static void del(int idx) { + sum -= 2 * cnt[arr[idx]] - 1; + cnt[arr[idx]]--; + } + + public static void add(int idx) { + sum += 2 * cnt[arr[idx]] + 1; + cnt[arr[idx]]++; + } + + public static void prepare() { + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + // Arrays.sort(query, 1, m + 1, cmp1); + Arrays.sort(query, 1, m + 1, cmp2); + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + while (winl < jobl) { + del(winl++); + } + while (winl > jobl) { + add(--winl); + } + while (winr < jobr) { + add(++winr); + } + while (winr > jobr) { + del(winr--); + } + ans[query[i][2]] = sum; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + k = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file diff --git a/src/class176/Code02_QueryFromB2.java b/src/class176/Code02_QueryFromB2.java new file mode 100644 index 000000000..e048b35b9 --- /dev/null +++ b/src/class176/Code02_QueryFromB2.java @@ -0,0 +1,100 @@ +package class176; + +// 小B的询问,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2709 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 50001; +//int n, m, k; +//int arr[MAXN]; +//Query query[MAXN]; +// +//int bi[MAXN]; +//int cnt[MAXN]; +//long long sum = 0; +//long long ans[MAXN]; +// +//bool QueryCmp1(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// return a.r < b.r; +//} +// +//bool QueryCmp2(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// if ((bi[a.l] & 1) == 1) { +// return a.r < b.r; +// } +// return a.r > b.r; +//} +// +//void del(int idx) { +// sum -= 2 * cnt[arr[idx]] - 1; +// cnt[arr[idx]]--; +//} +// +//void add(int idx) { +// sum += 2 * cnt[arr[idx]] + 1; +// cnt[arr[idx]]++; +//} +// +//void prepare() { +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + m + 1, QueryCmp2); +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// while (winl < jobl) { +// del(winl++); +// } +// while (winl > jobl) { +// add(--winl); +// } +// while (winr < jobr) { +// add(++winr); +// } +// while (winr > jobr) { +// del(winr--); +// } +// ans[query[i].id] = sum; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> k; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l; +// cin >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From ee6e6adb8e7a6f3d2c0933f0fcefac411c78ee8c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Aug 2025 10:49:08 +0800 Subject: [PATCH 0570/1170] modify code --- src/class176/Code03_SockFromZ1.java | 179 ++++++++++++++++++++++++++++ src/class176/Code03_SockFromZ2.java | 117 ++++++++++++++++++ 2 files changed, 296 insertions(+) create mode 100644 src/class176/Code03_SockFromZ1.java create mode 100644 src/class176/Code03_SockFromZ2.java diff --git a/src/class176/Code03_SockFromZ1.java b/src/class176/Code03_SockFromZ1.java new file mode 100644 index 000000000..09e678a6c --- /dev/null +++ b/src/class176/Code03_SockFromZ1.java @@ -0,0 +1,179 @@ +package class176; + +// 小Z的袜子,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1494 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code03_SockFromZ2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code03_SockFromZ1 { + + // 莫队经典排序 + public static class QueryCmp1 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + return a[1] - b[1]; + } + + } + + // 莫队奇偶排序 + public static class QueryCmp2 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } + return b[1] - a[1]; + } + + } + + public static QueryCmp1 cmp1 = new QueryCmp1(); + public static QueryCmp2 cmp2 = new QueryCmp2(); + + public static int MAXN = 50001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + + public static int[] bi = new int[MAXN]; + public static int[] cnt = new int[MAXN]; + public static long sum = 0; + public static long[] ans1 = new long[MAXN]; + public static long[] ans2 = new long[MAXN]; + + public static long gcd(long a, long b) { + return b == 0 ? a : gcd(b, a % b); + } + + public static void del(int idx) { + sum -= cnt[arr[idx]] * cnt[arr[idx]]; + cnt[arr[idx]]--; + sum += cnt[arr[idx]] * cnt[arr[idx]]; + } + + public static void add(int idx) { + sum -= cnt[arr[idx]] * cnt[arr[idx]]; + cnt[arr[idx]]++; + sum += cnt[arr[idx]] * cnt[arr[idx]]; + } + + public static void prepare() { + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + // Arrays.sort(query, 1, m + 1, cmp1); + Arrays.sort(query, 1, m + 1, cmp2); + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; + while (winl < jobl) { + del(winl++); + } + while (winl > jobl) { + add(--winl); + } + while (winr < jobr) { + add(++winr); + } + while (winr > jobr) { + del(winr--); + } + if (jobl == jobr) { + ans1[id] = 0; + ans2[id] = 1; + } else { + ans1[id] = sum - (jobr - jobl + 1); + ans2[id] = 1L * (jobr - jobl + 1) * (jobr - jobl); + long g = gcd(ans1[id], ans2[id]); + ans1[id] /= g; + ans2[id] /= g; + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans1[i] + "/" + ans2[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file diff --git a/src/class176/Code03_SockFromZ2.java b/src/class176/Code03_SockFromZ2.java new file mode 100644 index 000000000..8a92a19e6 --- /dev/null +++ b/src/class176/Code03_SockFromZ2.java @@ -0,0 +1,117 @@ +package class176; + +// 小Z的袜子,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1494 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 50001; +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +// +//int bi[MAXN]; +//int cnt[MAXN]; +//long long sum = 0; +//long long ans1[MAXN]; +//long long ans2[MAXN]; +// +//bool QueryCmp1(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// return a.r < b.r; +//} +// +//bool QueryCmp2(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// if ((bi[a.l] & 1) == 1) { +// return a.r < b.r; +// } +// return a.r > b.r; +//} +// +//long long gcd(long long a, long long b) { +// return b == 0 ? a : gcd(b, a % b); +//} +// +//void del(int idx) { +// sum -= cnt[arr[idx]] * cnt[arr[idx]]; +// cnt[arr[idx]]--; +// sum += cnt[arr[idx]] * cnt[arr[idx]]; +//} +// +//void add(int idx) { +// sum -= cnt[arr[idx]] * cnt[arr[idx]]; +// cnt[arr[idx]]++; +// sum += cnt[arr[idx]] * cnt[arr[idx]]; +//} +// +//void prepare() { +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + m + 1, QueryCmp2); +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; +// while (winl < jobl) { +// del(winl++); +// } +// while (winl > jobl) { +// add(--winl); +// } +// while (winr < jobr) { +// add(++winr); +// } +// while (winr > jobr) { +// del(winr--); +// } +// if (jobl == jobr) { +// ans1[id] = 0; +// ans2[id] = 1; +// } else { +// ans1[id] = sum - (jobr - jobl + 1); +// ans2[id] = 1LL * (jobr - jobl + 1) * (jobr - jobl); +// long long g = gcd(ans1[id], ans2[id]); +// ans1[id] /= g; +// ans2[id] /= g; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l; +// cin >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans1[i] << '/' << ans2[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 336f780a7ab066ce3dd025a6b439187cb1fb3327 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Aug 2025 12:02:35 +0800 Subject: [PATCH 0571/1170] modify code --- src/class176/Code03_SockFromZ2.java | 2 +- src/class176/Code04_BloodyString1.java | 196 +++++++++++++++++++++++++ src/class176/Code04_BloodyString2.java | 137 +++++++++++++++++ 3 files changed, 334 insertions(+), 1 deletion(-) create mode 100644 src/class176/Code04_BloodyString1.java create mode 100644 src/class176/Code04_BloodyString2.java diff --git a/src/class176/Code03_SockFromZ2.java b/src/class176/Code03_SockFromZ2.java index 8a92a19e6..582f746fd 100644 --- a/src/class176/Code03_SockFromZ2.java +++ b/src/class176/Code03_SockFromZ2.java @@ -1,6 +1,6 @@ package class176; -// 小Z的袜子,java版 +// 小Z的袜子,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P1494 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java new file mode 100644 index 000000000..40a26d17a --- /dev/null +++ b/src/class176/Code04_BloodyString1.java @@ -0,0 +1,196 @@ +package class176; + +// 大爷的字符串题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3709 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code04_BloodyString1 { + + // 莫队经典排序 + public static class QueryCmp1 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + return a[1] - b[1]; + } + + } + + // 莫队奇偶排序 + public static class QueryCmp2 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } + return b[1] - a[1]; + } + + } + + public static QueryCmp1 cmp1 = new QueryCmp1(); + public static QueryCmp2 cmp2 = new QueryCmp2(); + + public static int MAXN = 200001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[] sorted = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + + public static int[] bi = new int[MAXN]; + public static int[] cnt1 = new int[MAXN]; + public static int[] cnt2 = new int[MAXN]; + public static int maxCnt = 0; + public static int[] ans = new int[MAXN]; + + public static int kth(int len, int num) { + int left = 1, right = len, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static void del(int idx) { + int num = arr[idx]; + if (cnt1[num] == maxCnt && cnt2[cnt1[num]] == 1) { + maxCnt--; + } + cnt2[cnt1[num]]--; + cnt2[--cnt1[num]]++; + } + + public static void add(int idx) { + int num = arr[idx]; + cnt2[cnt1[num]]--; + cnt2[++cnt1[num]]++; + maxCnt = Math.max(maxCnt, cnt1[num]); + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + int len = 1; + for (int i = 2; i <= n; i++) { + if (sorted[len] != sorted[i]) { + sorted[++len] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = kth(len, arr[i]); + } + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + // Arrays.sort(query, 1, m + 1, cmp1); + Arrays.sort(query, 1, m + 1, cmp2); + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + // 为了滑动窗口时,不让词频变成负数 + // 先执行关于加的,再执行关于减的 + while (winl > jobl) { + add(--winl); + } + while (winr < jobr) { + add(++winr); + } + while (winl < jobl) { + del(winl++); + } + while (winr > jobr) { + del(winr--); + } + ans[query[i][2]] = maxCnt; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(-ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file diff --git a/src/class176/Code04_BloodyString2.java b/src/class176/Code04_BloodyString2.java new file mode 100644 index 000000000..c62789be8 --- /dev/null +++ b/src/class176/Code04_BloodyString2.java @@ -0,0 +1,137 @@ +package class176; + +// 大爷的字符串题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3709 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 200001; +//int n, m; +//int arr[MAXN]; +//int sorted[MAXN]; +//Query query[MAXN]; +// +//int bi[MAXN]; +//int cnt1[MAXN]; +//int cnt2[MAXN]; +//int maxCnt = 0; +//int ans[MAXN]; +// +//bool QueryCmp1(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// return a.r < b.r; +//} +// +//bool QueryCmp2(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// if ((bi[a.l] & 1) == 1) { +// return a.r < b.r; +// } +// return a.r > b.r; +//} +// +//int kth(int len, int num) { +// int left = 1, right = len, mid, ret = 0; +// while (left <= right) { +// mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//void del(int idx) { +// int num = arr[idx]; +// if (cnt1[num] == maxCnt && cnt2[cnt1[num]] == 1) { +// maxCnt--; +// } +// cnt2[cnt1[num]]--; +// cnt2[--cnt1[num]]++; +//} +// +//void add(int idx) { +// int num = arr[idx]; +// cnt2[cnt1[num]]--; +// cnt2[++cnt1[num]]++; +// if (cnt1[num] > maxCnt) { +// maxCnt = cnt1[num]; +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = arr[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// int len = 1; +// for (int i = 2; i <= n; i++) { +// if (sorted[len] != sorted[i]) { +// sorted[++len] = sorted[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(len, arr[i]); +// } +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + m + 1, QueryCmp2); +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// while (winl > jobl) { +// add(--winl); +// } +// while (winr < jobr) { +// add(++winr); +// } +// while (winl < jobl) { +// del(winl++); +// } +// while (winr > jobr) { +// del(winr--); +// } +// ans[query[i].id] = maxCnt; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l; +// cin >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << -ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 5d1f81f48de2fda22499e57dab4cf8d3eb624755 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Aug 2025 12:04:30 +0800 Subject: [PATCH 0572/1170] modify code --- src/class176/Code04_BloodyString1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index 40a26d17a..9a672f342 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -115,7 +115,7 @@ public static void compute() { int jobl = query[i][0]; int jobr = query[i][1]; // 为了滑动窗口时,不让词频变成负数 - // 先执行关于加的,再执行关于减的 + // 先执行加词频的操作,再执行减词频的操作 while (winl > jobl) { add(--winl); } From cc277146a067d2095ab9b8e25d65f78128db4261 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 14 Aug 2025 14:56:37 +0800 Subject: [PATCH 0573/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 6 +- src/class176/Code01_MoAlgorithm2.java | 6 +- src/class176/Code02_QueryFromB1.java | 6 +- src/class176/Code02_QueryFromB2.java | 6 +- src/class176/Code03_SockFromZ1.java | 6 +- src/class176/Code03_SockFromZ2.java | 6 +- src/class176/Code05_XorSequence1.java | 187 ++++++++++++++++++++++++++ 7 files changed, 205 insertions(+), 18 deletions(-) create mode 100644 src/class176/Code05_XorSequence1.java diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index 1954f09ce..898f997f3 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -83,15 +83,15 @@ public static void compute() { for (int i = 1; i <= q; i++) { int jobl = query[i][0]; int jobr = query[i][1]; - while (winl < jobl) { - del(winl++); - } while (winl > jobl) { add(--winl); } while (winr < jobr) { add(++winr); } + while (winl < jobl) { + del(winl++); + } while (winr > jobr) { del(winr--); } diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java index ae602430b..994a89dc1 100644 --- a/src/class176/Code01_MoAlgorithm2.java +++ b/src/class176/Code01_MoAlgorithm2.java @@ -67,15 +67,15 @@ // for (int i = 1; i <= q; i++) { // int jobl = query[i].l; // int jobr = query[i].r; -// while (winl < jobl) { -// del(winl++); -// } // while (winl > jobl) { // add(--winl); // } // while (winr < jobr) { // add(++winr); // } +// while (winl < jobl) { +// del(winl++); +// } // while (winr > jobr) { // del(winr--); // } diff --git a/src/class176/Code02_QueryFromB1.java b/src/class176/Code02_QueryFromB1.java index 9b0db1917..27ffb096f 100644 --- a/src/class176/Code02_QueryFromB1.java +++ b/src/class176/Code02_QueryFromB1.java @@ -79,15 +79,15 @@ public static void compute() { for (int i = 1; i <= m; i++) { int jobl = query[i][0]; int jobr = query[i][1]; - while (winl < jobl) { - del(winl++); - } while (winl > jobl) { add(--winl); } while (winr < jobr) { add(++winr); } + while (winl < jobl) { + del(winl++); + } while (winr > jobr) { del(winr--); } diff --git a/src/class176/Code02_QueryFromB2.java b/src/class176/Code02_QueryFromB2.java index e048b35b9..6f4d2aeda 100644 --- a/src/class176/Code02_QueryFromB2.java +++ b/src/class176/Code02_QueryFromB2.java @@ -63,15 +63,15 @@ // for (int i = 1; i <= m; i++) { // int jobl = query[i].l; // int jobr = query[i].r; -// while (winl < jobl) { -// del(winl++); -// } // while (winl > jobl) { // add(--winl); // } // while (winr < jobr) { // add(++winr); // } +// while (winl < jobl) { +// del(winl++); +// } // while (winr > jobr) { // del(winr--); // } diff --git a/src/class176/Code03_SockFromZ1.java b/src/class176/Code03_SockFromZ1.java index 09e678a6c..ecb502855 100644 --- a/src/class176/Code03_SockFromZ1.java +++ b/src/class176/Code03_SockFromZ1.java @@ -90,15 +90,15 @@ public static void compute() { int jobl = query[i][0]; int jobr = query[i][1]; int id = query[i][2]; - while (winl < jobl) { - del(winl++); - } while (winl > jobl) { add(--winl); } while (winr < jobr) { add(++winr); } + while (winl < jobl) { + del(winl++); + } while (winr > jobr) { del(winr--); } diff --git a/src/class176/Code03_SockFromZ2.java b/src/class176/Code03_SockFromZ2.java index 582f746fd..5d890c155 100644 --- a/src/class176/Code03_SockFromZ2.java +++ b/src/class176/Code03_SockFromZ2.java @@ -71,15 +71,15 @@ // int jobl = query[i].l; // int jobr = query[i].r; // int id = query[i].id; -// while (winl < jobl) { -// del(winl++); -// } // while (winl > jobl) { // add(--winl); // } // while (winr < jobr) { // add(++winr); // } +// while (winl < jobl) { +// del(winl++); +// } // while (winr > jobr) { // del(winr--); // } diff --git a/src/class176/Code05_XorSequence1.java b/src/class176/Code05_XorSequence1.java new file mode 100644 index 000000000..c4abbe435 --- /dev/null +++ b/src/class176/Code05_XorSequence1.java @@ -0,0 +1,187 @@ +package class176; + +// 异或序列,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4462 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code05_XorSequence1 { + + // 莫队经典排序 + public static class QueryCmp1 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + return a[1] - b[1]; + } + + } + + // 莫队奇偶排序 + public static class QueryCmp2 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return a[0] - b[0]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } + return b[1] - a[1]; + } + + } + + public static QueryCmp1 cmp1 = new QueryCmp1(); + public static QueryCmp2 cmp2 = new QueryCmp2(); + + public static int MAXN = 100001; + public static int MAXK = 1 << 20; + public static int n, m, k; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + + public static int[] pre = new int[MAXN]; + public static int[] bi = new int[MAXN]; + + public static long[] cnt = new long[MAXK]; + public static long[] ans = new long[MAXN]; + public static long cur; + + public static void del(int idx) { + int xor = pre[idx]; + if (k != 0) { + cur -= cnt[xor] * cnt[xor ^ k]; + } else { + cur -= (cnt[xor] * (cnt[xor] - 1)) >> 1; + } + cnt[xor]--; + if (k != 0) { + cur += cnt[xor] * cnt[xor ^ k]; + } else { + cur += (cnt[xor] * (cnt[xor] - 1)) >> 1; + } + } + + public static void add(int idx) { + int xor = pre[idx]; + if (k != 0) { + cur -= cnt[xor] * cnt[xor ^ k]; + } else { + cur -= (cnt[xor] * (cnt[xor] - 1)) >> 1; + } + cnt[xor]++; + if (k != 0) { + cur += cnt[xor] * cnt[xor ^ k]; + } else { + cur += (cnt[xor] * (cnt[xor] - 1)) >> 1; + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + pre[i] = pre[i - 1] ^ arr[i]; + } + int blen = Math.max(1, (int) Math.sqrt(n)); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + // Arrays.sort(query, 1, m + 1, cmp1); + Arrays.sort(query, 1, m + 1, cmp2); + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + // 左边界要-1 + int jobl = query[i][0] - 1; + int jobr = query[i][1]; + while (winl > jobl) { + add(--winl); + } + while (winr < jobr) { + add(++winr); + } + while (winl < jobl) { + del(winl++); + } + while (winr > jobr) { + del(winr--); + } + ans[query[i][2]] = cur; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + k = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 03f8bea9c0c0d38bd9e99f0c2ca6650aa1d9c997 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 14 Aug 2025 15:11:33 +0800 Subject: [PATCH 0574/1170] modify code --- src/class176/Code05_XorSequence1.java | 26 +++--- src/class176/Code05_XorSequence2.java | 126 ++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 13 deletions(-) create mode 100644 src/class176/Code05_XorSequence2.java diff --git a/src/class176/Code05_XorSequence1.java b/src/class176/Code05_XorSequence1.java index c4abbe435..a880b6991 100644 --- a/src/class176/Code05_XorSequence1.java +++ b/src/class176/Code05_XorSequence1.java @@ -59,32 +59,32 @@ public int compare(int[] a, int[] b) { public static long cur; public static void del(int idx) { - int xor = pre[idx]; + int x = pre[idx]; if (k != 0) { - cur -= cnt[xor] * cnt[xor ^ k]; + cur -= cnt[x] * cnt[x ^ k]; } else { - cur -= (cnt[xor] * (cnt[xor] - 1)) >> 1; + cur -= (cnt[x] * (cnt[x] - 1)) >> 1; } - cnt[xor]--; + cnt[x]--; if (k != 0) { - cur += cnt[xor] * cnt[xor ^ k]; + cur += cnt[x] * cnt[x ^ k]; } else { - cur += (cnt[xor] * (cnt[xor] - 1)) >> 1; + cur += (cnt[x] * (cnt[x] - 1)) >> 1; } } public static void add(int idx) { - int xor = pre[idx]; + int x = pre[idx]; if (k != 0) { - cur -= cnt[xor] * cnt[xor ^ k]; + cur -= cnt[x] * cnt[x ^ k]; } else { - cur -= (cnt[xor] * (cnt[xor] - 1)) >> 1; + cur -= (cnt[x] * (cnt[x] - 1)) >> 1; } - cnt[xor]++; + cnt[x]++; if (k != 0) { - cur += cnt[xor] * cnt[xor ^ k]; + cur += cnt[x] * cnt[x ^ k]; } else { - cur += (cnt[xor] * (cnt[xor] - 1)) >> 1; + cur += (cnt[x] * (cnt[x] - 1)) >> 1; } } @@ -92,7 +92,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { pre[i] = pre[i - 1] ^ arr[i]; } - int blen = Math.max(1, (int) Math.sqrt(n)); + int blen = (int) Math.sqrt(n); for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } diff --git a/src/class176/Code05_XorSequence2.java b/src/class176/Code05_XorSequence2.java new file mode 100644 index 000000000..bffd02b3f --- /dev/null +++ b/src/class176/Code05_XorSequence2.java @@ -0,0 +1,126 @@ +package class176; + +// 异或序列,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4462 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 100001; +//const int MAXK = 1 << 20; +//int n, m, k; +//int arr[MAXN]; +//Query query[MAXN]; +// +//int pre[MAXN]; +//int bi[MAXN]; +// +//long long cnt[MAXK]; +//long long ans[MAXN]; +//long long cur; +// +//bool QueryCmp1(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// return a.r < b.r; +//} +// +//bool QueryCmp2(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return a.l < b.l; +// } +// if ((bi[a.l] & 1) == 1) { +// return a.r < b.r; +// } +// return a.r > b.r; +//} +// +//void del(int idx) { +// int x = pre[idx]; +// if (k != 0) { +// cur -= cnt[x] * cnt[x ^ k]; +// } else { +// cur -= (cnt[x] * (cnt[x] - 1)) >> 1; +// } +// cnt[x]--; +// if (k != 0) { +// cur += cnt[x] * cnt[x ^ k]; +// } else { +// cur += (cnt[x] * (cnt[x] - 1)) >> 1; +// } +//} +// +//void add(int idx) { +// int x = pre[idx]; +// if (k != 0) { +// cur -= cnt[x] * cnt[x ^ k]; +// } else { +// cur -= (cnt[x] * (cnt[x] - 1)) >> 1; +// } +// cnt[x]++; +// if (k != 0) { +// cur += cnt[x] * cnt[x ^ k]; +// } else { +// cur += (cnt[x] * (cnt[x] - 1)) >> 1; +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// pre[i] = pre[i - 1] ^ arr[i]; +// } +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + m + 1, QueryCmp2); +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l - 1; +// int jobr = query[i].r; +// while (winl > jobl) { +// add(--winl); +// } +// while (winr < jobr) { +// add(++winr); +// } +// while (winl < jobl) { +// del(winl++); +// } +// while (winr > jobr) { +// del(winr--); +// } +// ans[query[i].id] = cur; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> k; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l; +// cin >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 2791e44f07927c5a5296f99989d1dc5d98ef3d56 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Aug 2025 10:13:29 +0800 Subject: [PATCH 0575/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index 898f997f3..00e560209 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -19,7 +19,7 @@ public static class QueryCmp1 implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; + return bi[a[0]] - bi[b[0]]; } return a[1] - b[1]; } @@ -32,7 +32,7 @@ public static class QueryCmp2 implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; + return bi[a[0]] - bi[b[0]]; } if ((bi[a[0]] & 1) == 1) { return a[1] - b[1]; @@ -42,8 +42,8 @@ public int compare(int[] a, int[] b) { } - public static QueryCmp1 cmp1 = new QueryCmp1(); - public static QueryCmp2 cmp2 = new QueryCmp2(); + public static QueryCmp1 mo1 = new QueryCmp1(); + public static QueryCmp2 mo2 = new QueryCmp2(); public static int MAXN = 30001; public static int MAXV = 1000001; @@ -75,7 +75,7 @@ public static void prepare() { bi[i] = (i - 1) / blen + 1; } // Arrays.sort(query, 1, q + 1, cmp1); - Arrays.sort(query, 1, q + 1, cmp2); + Arrays.sort(query, 1, q + 1, mo2); } public static void compute() { From a2731cf727009c04a4dd3670f80b4b3bd308b8fd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Aug 2025 10:27:08 +0800 Subject: [PATCH 0576/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 8 +++----- src/class176/Code01_MoAlgorithm2.java | 5 +++-- src/class176/Code02_QueryFromB1.java | 27 +++------------------------ src/class176/Code02_QueryFromB2.java | 16 +++------------- 4 files changed, 12 insertions(+), 44 deletions(-) diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index 00e560209..ae59f75db 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -2,6 +2,7 @@ // 普通莫队模版题,java版 // 测试链接 : https://www.luogu.com.cn/problem/SP3267 +// 测试链接 : https://www.spoj.com/problems/DQUERY/ // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; @@ -42,9 +43,6 @@ public int compare(int[] a, int[] b) { } - public static QueryCmp1 mo1 = new QueryCmp1(); - public static QueryCmp2 mo2 = new QueryCmp2(); - public static int MAXN = 30001; public static int MAXV = 1000001; public static int MAXQ = 200001; @@ -74,8 +72,8 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - // Arrays.sort(query, 1, q + 1, cmp1); - Arrays.sort(query, 1, q + 1, mo2); + Arrays.sort(query, 1, q + 1, new QueryCmp1()); + // Arrays.sort(query, 1, q + 1, new QueryCmp2()); } public static void compute() { diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java index 994a89dc1..9dcc3177d 100644 --- a/src/class176/Code01_MoAlgorithm2.java +++ b/src/class176/Code01_MoAlgorithm2.java @@ -2,6 +2,7 @@ // 普通莫队模版题,C++版 // 测试链接 : https://www.luogu.com.cn/problem/SP3267 +// 测试链接 : https://www.spoj.com/problems/DQUERY/ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -27,14 +28,14 @@ // //bool QueryCmp1(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; +// return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // //bool QueryCmp2(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; +// return bi[a.l] < bi[b.l]; // } // if ((bi[a.l] & 1) == 1) { // return a.r < b.r; diff --git a/src/class176/Code02_QueryFromB1.java b/src/class176/Code02_QueryFromB1.java index 27ffb096f..f655ad890 100644 --- a/src/class176/Code02_QueryFromB1.java +++ b/src/class176/Code02_QueryFromB1.java @@ -13,38 +13,18 @@ public class Code02_QueryFromB1 { - // 莫队经典排序 - public static class QueryCmp1 implements Comparator { + public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; + return bi[a[0]] - bi[b[0]]; } return a[1] - b[1]; } } - // 莫队奇偶排序 - public static class QueryCmp2 implements Comparator { - - @Override - public int compare(int[] a, int[] b) { - if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; - } - if ((bi[a[0]] & 1) == 1) { - return a[1] - b[1]; - } - return b[1] - a[1]; - } - - } - - public static QueryCmp1 cmp1 = new QueryCmp1(); - public static QueryCmp2 cmp2 = new QueryCmp2(); - public static int MAXN = 50001; public static int n, m, k; public static int[] arr = new int[MAXN]; @@ -70,8 +50,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - // Arrays.sort(query, 1, m + 1, cmp1); - Arrays.sort(query, 1, m + 1, cmp2); + Arrays.sort(query, 1, m + 1, new QueryCmp()); } public static void compute() { diff --git a/src/class176/Code02_QueryFromB2.java b/src/class176/Code02_QueryFromB2.java index 6f4d2aeda..7d951a49a 100644 --- a/src/class176/Code02_QueryFromB2.java +++ b/src/class176/Code02_QueryFromB2.java @@ -23,23 +23,13 @@ //long long sum = 0; //long long ans[MAXN]; // -//bool QueryCmp1(Query &a, Query &b) { +//bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; +// return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // -//bool QueryCmp2(Query &a, Query &b) { -// if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; -// } -// if ((bi[a.l] & 1) == 1) { -// return a.r < b.r; -// } -// return a.r > b.r; -//} -// //void del(int idx) { // sum -= 2 * cnt[arr[idx]] - 1; // cnt[arr[idx]]--; @@ -55,7 +45,7 @@ // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } -// sort(query + 1, query + m + 1, QueryCmp2); +// sort(query + 1, query + m + 1, QueryCmp); //} // //void compute() { From c1260072e7726122c4224acc772e34994bc567e4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Aug 2025 10:36:43 +0800 Subject: [PATCH 0577/1170] modify code --- src/class176/Code03_SockFromZ1.java | 27 +++--------------------- src/class176/Code03_SockFromZ2.java | 16 +++----------- src/class176/Code04_BloodyString1.java | 29 +++----------------------- src/class176/Code04_BloodyString2.java | 16 +++----------- src/class176/Code05_XorSequence1.java | 27 +++--------------------- src/class176/Code05_XorSequence2.java | 16 +++----------- 6 files changed, 18 insertions(+), 113 deletions(-) diff --git a/src/class176/Code03_SockFromZ1.java b/src/class176/Code03_SockFromZ1.java index ecb502855..679c76831 100644 --- a/src/class176/Code03_SockFromZ1.java +++ b/src/class176/Code03_SockFromZ1.java @@ -16,38 +16,18 @@ public class Code03_SockFromZ1 { - // 莫队经典排序 - public static class QueryCmp1 implements Comparator { + public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; + return bi[a[0]] - bi[b[0]]; } return a[1] - b[1]; } } - // 莫队奇偶排序 - public static class QueryCmp2 implements Comparator { - - @Override - public int compare(int[] a, int[] b) { - if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; - } - if ((bi[a[0]] & 1) == 1) { - return a[1] - b[1]; - } - return b[1] - a[1]; - } - - } - - public static QueryCmp1 cmp1 = new QueryCmp1(); - public static QueryCmp2 cmp2 = new QueryCmp2(); - public static int MAXN = 50001; public static int n, m; public static int[] arr = new int[MAXN]; @@ -80,8 +60,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - // Arrays.sort(query, 1, m + 1, cmp1); - Arrays.sort(query, 1, m + 1, cmp2); + Arrays.sort(query, 1, m + 1, new QueryCmp()); } public static void compute() { diff --git a/src/class176/Code03_SockFromZ2.java b/src/class176/Code03_SockFromZ2.java index 5d890c155..42439abc1 100644 --- a/src/class176/Code03_SockFromZ2.java +++ b/src/class176/Code03_SockFromZ2.java @@ -24,23 +24,13 @@ //long long ans1[MAXN]; //long long ans2[MAXN]; // -//bool QueryCmp1(Query &a, Query &b) { +//bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; +// return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // -//bool QueryCmp2(Query &a, Query &b) { -// if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; -// } -// if ((bi[a.l] & 1) == 1) { -// return a.r < b.r; -// } -// return a.r > b.r; -//} -// //long long gcd(long long a, long long b) { // return b == 0 ? a : gcd(b, a % b); //} @@ -62,7 +52,7 @@ // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } -// sort(query + 1, query + m + 1, QueryCmp2); +// sort(query + 1, query + m + 1, QueryCmp); //} // //void compute() { diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index 9a672f342..2e8a6edfc 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -13,38 +13,18 @@ public class Code04_BloodyString1 { - // 莫队经典排序 - public static class QueryCmp1 implements Comparator { + public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; + return bi[a[0]] - bi[b[0]]; } return a[1] - b[1]; } } - // 莫队奇偶排序 - public static class QueryCmp2 implements Comparator { - - @Override - public int compare(int[] a, int[] b) { - if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; - } - if ((bi[a[0]] & 1) == 1) { - return a[1] - b[1]; - } - return b[1] - a[1]; - } - - } - - public static QueryCmp1 cmp1 = new QueryCmp1(); - public static QueryCmp2 cmp2 = new QueryCmp2(); - public static int MAXN = 200001; public static int n, m; public static int[] arr = new int[MAXN]; @@ -105,8 +85,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - // Arrays.sort(query, 1, m + 1, cmp1); - Arrays.sort(query, 1, m + 1, cmp2); + Arrays.sort(query, 1, m + 1, new QueryCmp()); } public static void compute() { @@ -114,8 +93,6 @@ public static void compute() { for (int i = 1; i <= m; i++) { int jobl = query[i][0]; int jobr = query[i][1]; - // 为了滑动窗口时,不让词频变成负数 - // 先执行加词频的操作,再执行减词频的操作 while (winl > jobl) { add(--winl); } diff --git a/src/class176/Code04_BloodyString2.java b/src/class176/Code04_BloodyString2.java index c62789be8..785bd6a5c 100644 --- a/src/class176/Code04_BloodyString2.java +++ b/src/class176/Code04_BloodyString2.java @@ -25,23 +25,13 @@ //int maxCnt = 0; //int ans[MAXN]; // -//bool QueryCmp1(Query &a, Query &b) { +//bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; +// return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // -//bool QueryCmp2(Query &a, Query &b) { -// if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; -// } -// if ((bi[a.l] & 1) == 1) { -// return a.r < b.r; -// } -// return a.r > b.r; -//} -// //int kth(int len, int num) { // int left = 1, right = len, mid, ret = 0; // while (left <= right) { @@ -92,7 +82,7 @@ // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } -// sort(query + 1, query + m + 1, QueryCmp2); +// sort(query + 1, query + m + 1, QueryCmp); //} // //void compute() { diff --git a/src/class176/Code05_XorSequence1.java b/src/class176/Code05_XorSequence1.java index a880b6991..c832fb0b7 100644 --- a/src/class176/Code05_XorSequence1.java +++ b/src/class176/Code05_XorSequence1.java @@ -13,38 +13,18 @@ public class Code05_XorSequence1 { - // 莫队经典排序 - public static class QueryCmp1 implements Comparator { + public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; + return bi[a[0]] - bi[b[0]]; } return a[1] - b[1]; } } - // 莫队奇偶排序 - public static class QueryCmp2 implements Comparator { - - @Override - public int compare(int[] a, int[] b) { - if (bi[a[0]] != bi[b[0]]) { - return a[0] - b[0]; - } - if ((bi[a[0]] & 1) == 1) { - return a[1] - b[1]; - } - return b[1] - a[1]; - } - - } - - public static QueryCmp1 cmp1 = new QueryCmp1(); - public static QueryCmp2 cmp2 = new QueryCmp2(); - public static int MAXN = 100001; public static int MAXK = 1 << 20; public static int n, m, k; @@ -96,8 +76,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - // Arrays.sort(query, 1, m + 1, cmp1); - Arrays.sort(query, 1, m + 1, cmp2); + Arrays.sort(query, 1, m + 1, new QueryCmp()); } public static void compute() { diff --git a/src/class176/Code05_XorSequence2.java b/src/class176/Code05_XorSequence2.java index bffd02b3f..e929be4f9 100644 --- a/src/class176/Code05_XorSequence2.java +++ b/src/class176/Code05_XorSequence2.java @@ -26,23 +26,13 @@ //long long ans[MAXN]; //long long cur; // -//bool QueryCmp1(Query &a, Query &b) { +//bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; +// return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // -//bool QueryCmp2(Query &a, Query &b) { -// if (bi[a.l] != bi[b.l]) { -// return a.l < b.l; -// } -// if ((bi[a.l] & 1) == 1) { -// return a.r < b.r; -// } -// return a.r > b.r; -//} -// //void del(int idx) { // int x = pre[idx]; // if (k != 0) { @@ -81,7 +71,7 @@ // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } -// sort(query + 1, query + m + 1, QueryCmp2); +// sort(query + 1, query + m + 1, QueryCmp); //} // //void compute() { From 152326aaf600687691d5ccd011ca309d42f646d3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Aug 2025 10:42:18 +0800 Subject: [PATCH 0578/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index ae59f75db..c7e8adcda 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -27,7 +27,7 @@ public int compare(int[] a, int[] b) { } - // 莫队奇偶排序 + // 莫队奇偶排序,玄学优化 public static class QueryCmp2 implements Comparator { @Override @@ -72,8 +72,8 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - Arrays.sort(query, 1, q + 1, new QueryCmp1()); - // Arrays.sort(query, 1, q + 1, new QueryCmp2()); + // Arrays.sort(query, 1, q + 1, new QueryCmp1()); + Arrays.sort(query, 1, q + 1, new QueryCmp2()); } public static void compute() { From 6120cc87f0c47c60b08b78f4dd23d4b5c8a59de1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Aug 2025 14:09:55 +0800 Subject: [PATCH 0579/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 16 +- src/class176/Code01_MoAlgorithm2.java | 16 +- src/class176/Code02_QueryFromB1.java | 20 +-- src/class176/Code02_QueryFromB2.java | 20 +-- src/class176/Code03_SockFromZ1.java | 24 +-- src/class176/Code03_SockFromZ2.java | 24 +-- src/class176/Code04_BloodyString1.java | 14 +- src/class176/Code04_BloodyString2.java | 14 +- src/class176/Code05_XorSequence1.java | 14 +- src/class176/Code05_XorSequence2.java | 14 +- src/class176/Code06_CountingColors1.java | 206 +++++++++++++++++++++++ 11 files changed, 290 insertions(+), 92 deletions(-) create mode 100644 src/class176/Code06_CountingColors1.java diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index c7e8adcda..f3398b433 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -55,14 +55,14 @@ public int compare(int[] a, int[] b) { public static int kind = 0; public static int[] ans = new int[MAXQ]; - public static void del(int idx) { - if (--cnt[arr[idx]] == 0) { + public static void del(int num) { + if (--cnt[num] == 0) { kind--; } } - public static void add(int idx) { - if (++cnt[arr[idx]] == 1) { + public static void add(int num) { + if (++cnt[num] == 1) { kind++; } } @@ -82,16 +82,16 @@ public static void compute() { int jobl = query[i][0]; int jobr = query[i][1]; while (winl > jobl) { - add(--winl); + add(arr[--winl]); } while (winr < jobr) { - add(++winr); + add(arr[++winr]); } while (winl < jobl) { - del(winl++); + del(arr[winl++]); } while (winr > jobr) { - del(winr--); + del(arr[winr--]); } ans[query[i][2]] = kind; } diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java index 9dcc3177d..16209b02c 100644 --- a/src/class176/Code01_MoAlgorithm2.java +++ b/src/class176/Code01_MoAlgorithm2.java @@ -43,14 +43,14 @@ // return a.r > b.r; //} // -//void del(int idx) { -// if (--cnt[arr[idx]] == 0) { +//void del(int num) { +// if (--cnt[num] == 0) { // kind--; // } //} // -//void add(int idx) { -// if (++cnt[arr[idx]] == 1) { +//void add(int num) { +// if (++cnt[num] == 1) { // kind++; // } //} @@ -69,16 +69,16 @@ // int jobl = query[i].l; // int jobr = query[i].r; // while (winl > jobl) { -// add(--winl); +// add(arr[--winl]); // } // while (winr < jobr) { -// add(++winr); +// add(arr[++winr]); // } // while (winl < jobl) { -// del(winl++); +// del(arr[winl++]); // } // while (winr > jobr) { -// del(winr--); +// del(arr[winr--]); // } // ans[query[i].id] = kind; // } diff --git a/src/class176/Code02_QueryFromB1.java b/src/class176/Code02_QueryFromB1.java index f655ad890..2c1e0b753 100644 --- a/src/class176/Code02_QueryFromB1.java +++ b/src/class176/Code02_QueryFromB1.java @@ -35,14 +35,14 @@ public int compare(int[] a, int[] b) { public static long sum = 0; public static long[] ans = new long[MAXN]; - public static void del(int idx) { - sum -= 2 * cnt[arr[idx]] - 1; - cnt[arr[idx]]--; + public static void del(int num) { + sum -= 2 * cnt[num] - 1; + cnt[num]--; } - public static void add(int idx) { - sum += 2 * cnt[arr[idx]] + 1; - cnt[arr[idx]]++; + public static void add(int num) { + sum += 2 * cnt[num] + 1; + cnt[num]++; } public static void prepare() { @@ -59,16 +59,16 @@ public static void compute() { int jobl = query[i][0]; int jobr = query[i][1]; while (winl > jobl) { - add(--winl); + add(arr[--winl]); } while (winr < jobr) { - add(++winr); + add(arr[++winr]); } while (winl < jobl) { - del(winl++); + del(arr[winl++]); } while (winr > jobr) { - del(winr--); + del(arr[winr--]); } ans[query[i][2]] = sum; } diff --git a/src/class176/Code02_QueryFromB2.java b/src/class176/Code02_QueryFromB2.java index 7d951a49a..876b10460 100644 --- a/src/class176/Code02_QueryFromB2.java +++ b/src/class176/Code02_QueryFromB2.java @@ -30,14 +30,14 @@ // return a.r < b.r; //} // -//void del(int idx) { -// sum -= 2 * cnt[arr[idx]] - 1; -// cnt[arr[idx]]--; +//void del(int num) { +// sum -= 2 * cnt[num] - 1; +// cnt[num]--; //} // -//void add(int idx) { -// sum += 2 * cnt[arr[idx]] + 1; -// cnt[arr[idx]]++; +//void add(int num) { +// sum += 2 * cnt[num] + 1; +// cnt[num]++; //} // //void prepare() { @@ -54,16 +54,16 @@ // int jobl = query[i].l; // int jobr = query[i].r; // while (winl > jobl) { -// add(--winl); +// add(arr[--winl]); // } // while (winr < jobr) { -// add(++winr); +// add(arr[++winr]); // } // while (winl < jobl) { -// del(winl++); +// del(arr[winl++]); // } // while (winr > jobr) { -// del(winr--); +// del(arr[winr--]); // } // ans[query[i].id] = sum; // } diff --git a/src/class176/Code03_SockFromZ1.java b/src/class176/Code03_SockFromZ1.java index 679c76831..897fb599a 100644 --- a/src/class176/Code03_SockFromZ1.java +++ b/src/class176/Code03_SockFromZ1.java @@ -43,16 +43,16 @@ public static long gcd(long a, long b) { return b == 0 ? a : gcd(b, a % b); } - public static void del(int idx) { - sum -= cnt[arr[idx]] * cnt[arr[idx]]; - cnt[arr[idx]]--; - sum += cnt[arr[idx]] * cnt[arr[idx]]; + public static void del(int num) { + sum -= cnt[num] * cnt[num]; + cnt[num]--; + sum += cnt[num] * cnt[num]; } - public static void add(int idx) { - sum -= cnt[arr[idx]] * cnt[arr[idx]]; - cnt[arr[idx]]++; - sum += cnt[arr[idx]] * cnt[arr[idx]]; + public static void add(int num) { + sum -= cnt[num] * cnt[num]; + cnt[num]++; + sum += cnt[num] * cnt[num]; } public static void prepare() { @@ -70,16 +70,16 @@ public static void compute() { int jobr = query[i][1]; int id = query[i][2]; while (winl > jobl) { - add(--winl); + add(arr[--winl]); } while (winr < jobr) { - add(++winr); + add(arr[++winr]); } while (winl < jobl) { - del(winl++); + del(arr[winl++]); } while (winr > jobr) { - del(winr--); + del(arr[winr--]); } if (jobl == jobr) { ans1[id] = 0; diff --git a/src/class176/Code03_SockFromZ2.java b/src/class176/Code03_SockFromZ2.java index 42439abc1..b4fddadb8 100644 --- a/src/class176/Code03_SockFromZ2.java +++ b/src/class176/Code03_SockFromZ2.java @@ -35,16 +35,16 @@ // return b == 0 ? a : gcd(b, a % b); //} // -//void del(int idx) { -// sum -= cnt[arr[idx]] * cnt[arr[idx]]; -// cnt[arr[idx]]--; -// sum += cnt[arr[idx]] * cnt[arr[idx]]; +//void del(int num) { +// sum -= cnt[num] * cnt[num]; +// cnt[num]--; +// sum += cnt[num] * cnt[num]; //} // -//void add(int idx) { -// sum -= cnt[arr[idx]] * cnt[arr[idx]]; -// cnt[arr[idx]]++; -// sum += cnt[arr[idx]] * cnt[arr[idx]]; +//void add(int num) { +// sum -= cnt[num] * cnt[num]; +// cnt[num]++; +// sum += cnt[num] * cnt[num]; //} // //void prepare() { @@ -62,16 +62,16 @@ // int jobr = query[i].r; // int id = query[i].id; // while (winl > jobl) { -// add(--winl); +// add(arr[--winl]); // } // while (winr < jobr) { -// add(++winr); +// add(arr[++winr]); // } // while (winl < jobl) { -// del(winl++); +// del(arr[winl++]); // } // while (winr > jobr) { -// del(winr--); +// del(arr[winr--]); // } // if (jobl == jobr) { // ans1[id] = 0; diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index 2e8a6edfc..ed5b0f270 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -51,8 +51,7 @@ public static int kth(int len, int num) { return ret; } - public static void del(int idx) { - int num = arr[idx]; + public static void del(int num) { if (cnt1[num] == maxCnt && cnt2[cnt1[num]] == 1) { maxCnt--; } @@ -60,8 +59,7 @@ public static void del(int idx) { cnt2[--cnt1[num]]++; } - public static void add(int idx) { - int num = arr[idx]; + public static void add(int num) { cnt2[cnt1[num]]--; cnt2[++cnt1[num]]++; maxCnt = Math.max(maxCnt, cnt1[num]); @@ -94,16 +92,16 @@ public static void compute() { int jobl = query[i][0]; int jobr = query[i][1]; while (winl > jobl) { - add(--winl); + add(arr[--winl]); } while (winr < jobr) { - add(++winr); + add(arr[++winr]); } while (winl < jobl) { - del(winl++); + del(arr[winl++]); } while (winr > jobr) { - del(winr--); + del(arr[winr--]); } ans[query[i][2]] = maxCnt; } diff --git a/src/class176/Code04_BloodyString2.java b/src/class176/Code04_BloodyString2.java index 785bd6a5c..5e9bc1b84 100644 --- a/src/class176/Code04_BloodyString2.java +++ b/src/class176/Code04_BloodyString2.java @@ -46,8 +46,7 @@ // return ret; //} // -//void del(int idx) { -// int num = arr[idx]; +//void del(int num) { // if (cnt1[num] == maxCnt && cnt2[cnt1[num]] == 1) { // maxCnt--; // } @@ -55,8 +54,7 @@ // cnt2[--cnt1[num]]++; //} // -//void add(int idx) { -// int num = arr[idx]; +//void add(int num) { // cnt2[cnt1[num]]--; // cnt2[++cnt1[num]]++; // if (cnt1[num] > maxCnt) { @@ -91,16 +89,16 @@ // int jobl = query[i].l; // int jobr = query[i].r; // while (winl > jobl) { -// add(--winl); +// add(arr[--winl]); // } // while (winr < jobr) { -// add(++winr); +// add(arr[++winr]); // } // while (winl < jobl) { -// del(winl++); +// del(arr[winl++]); // } // while (winr > jobr) { -// del(winr--); +// del(arr[winr--]); // } // ans[query[i].id] = maxCnt; // } diff --git a/src/class176/Code05_XorSequence1.java b/src/class176/Code05_XorSequence1.java index c832fb0b7..b4db3064f 100644 --- a/src/class176/Code05_XorSequence1.java +++ b/src/class176/Code05_XorSequence1.java @@ -38,8 +38,7 @@ public int compare(int[] a, int[] b) { public static long[] ans = new long[MAXN]; public static long cur; - public static void del(int idx) { - int x = pre[idx]; + public static void del(int x) { if (k != 0) { cur -= cnt[x] * cnt[x ^ k]; } else { @@ -53,8 +52,7 @@ public static void del(int idx) { } } - public static void add(int idx) { - int x = pre[idx]; + public static void add(int x) { if (k != 0) { cur -= cnt[x] * cnt[x ^ k]; } else { @@ -86,16 +84,16 @@ public static void compute() { int jobl = query[i][0] - 1; int jobr = query[i][1]; while (winl > jobl) { - add(--winl); + add(pre[--winl]); } while (winr < jobr) { - add(++winr); + add(pre[++winr]); } while (winl < jobl) { - del(winl++); + del(pre[winl++]); } while (winr > jobr) { - del(winr--); + del(pre[winr--]); } ans[query[i][2]] = cur; } diff --git a/src/class176/Code05_XorSequence2.java b/src/class176/Code05_XorSequence2.java index e929be4f9..b4e4990c5 100644 --- a/src/class176/Code05_XorSequence2.java +++ b/src/class176/Code05_XorSequence2.java @@ -33,8 +33,7 @@ // return a.r < b.r; //} // -//void del(int idx) { -// int x = pre[idx]; +//void del(int x) { // if (k != 0) { // cur -= cnt[x] * cnt[x ^ k]; // } else { @@ -48,8 +47,7 @@ // } //} // -//void add(int idx) { -// int x = pre[idx]; +//void add(int x) { // if (k != 0) { // cur -= cnt[x] * cnt[x ^ k]; // } else { @@ -80,16 +78,16 @@ // int jobl = query[i].l - 1; // int jobr = query[i].r; // while (winl > jobl) { -// add(--winl); +// add(pre[--winl]); // } // while (winr < jobr) { -// add(++winr); +// add(pre[++winr]); // } // while (winl < jobl) { -// del(winl++); +// del(pre[winl++]); // } // while (winr > jobr) { -// del(winr--); +// del(pre[winr--]); // } // ans[query[i].id] = cur; // } diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_CountingColors1.java new file mode 100644 index 000000000..fb55bd982 --- /dev/null +++ b/src/class176/Code06_CountingColors1.java @@ -0,0 +1,206 @@ +package class176; + +// 数颜色,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1903 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code06_CountingColors1 { + + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if (bi[a[1]] != bi[b[1]]) { + return bi[a[1]] - bi[b[1]]; + } + return a[2] - b[2]; + } + + } + + public static int MAXN = 200001; + public static int MAXV = 1000001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[] bi = new int[MAXN]; + + public static int[][] query = new int[MAXN][4]; + public static int[][] update = new int[MAXN][2]; + public static int cntq; + public static int cntu; + + public static int[] cnt = new int[MAXV]; + public static int[] ans = new int[MAXN]; + public static int kind; + + public static void del(int num) { + if (--cnt[num] == 0) { + kind--; + } + } + + public static void add(int num) { + if (++cnt[num] == 1) { + kind++; + } + } + + public static void updateTime(int jobl, int jobr, int t) { + int pos = update[t][0]; + int val = update[t][1]; + if (jobl <= pos && pos <= jobr) { + del(arr[pos]); + add(val); + } + int tmp = arr[pos]; + arr[pos] = val; + update[t][1] = tmp; + } + + public static void prepare() { + int blen = Math.max(1, (int) Math.pow(n, 0.666)); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + } + + public static void compute() { + int winl = 1, winr = 0, wint = 0; + for (int i = 1; i <= cntq; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int jobt = query[i][2]; + int id = query[i][3]; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); + } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + while (wint < jobt) { + updateTime(jobl, jobr, ++wint); + } + while (wint > jobt) { + updateTime(jobl, jobr, wint--); + } + ans[id] = kind; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + char op; + int x, y; + for (int i = 1; i <= m; i++) { + op = in.nextChar(); + x = in.nextInt(); + y = in.nextInt(); + if (op == 'Q') { + cntq++; + query[cntq][0] = x; + query[cntq][1] = y; + query[cntq][2] = cntu; + query[cntq][3] = cntq; + } else { + cntu++; + update[cntu][0] = x; + update[cntu][1] = y; + } + } + prepare(); + compute(); + for (int i = 1; i <= cntq; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} From ce79edb8682bcc7e3e4cd6fbb519a7a0d3fba727 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Aug 2025 14:14:19 +0800 Subject: [PATCH 0580/1170] modify code --- src/class176/Code06_CountingColors1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_CountingColors1.java index fb55bd982..f8b52ff2b 100644 --- a/src/class176/Code06_CountingColors1.java +++ b/src/class176/Code06_CountingColors1.java @@ -55,16 +55,16 @@ public static void add(int num) { } } - public static void updateTime(int jobl, int jobr, int t) { - int pos = update[t][0]; - int val = update[t][1]; + public static void updateTime(int jobl, int jobr, int tim) { + int pos = update[tim][0]; + int val = update[tim][1]; if (jobl <= pos && pos <= jobr) { del(arr[pos]); add(val); } int tmp = arr[pos]; arr[pos] = val; - update[t][1] = tmp; + update[tim][1] = tmp; } public static void prepare() { From 290487c287296afc67170fb0dc6352b7cb1f9b2e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Aug 2025 17:42:49 +0800 Subject: [PATCH 0581/1170] modify code --- src/class176/Code06_CountingColors1.java | 5 +- src/class176/Code06_CountingColors2.java | 134 +++++++++++++++++++++++ 2 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 src/class176/Code06_CountingColors2.java diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_CountingColors1.java index f8b52ff2b..83ab59f14 100644 --- a/src/class176/Code06_CountingColors1.java +++ b/src/class176/Code06_CountingColors1.java @@ -36,8 +36,7 @@ public int compare(int[] a, int[] b) { public static int[][] query = new int[MAXN][4]; public static int[][] update = new int[MAXN][2]; - public static int cntq; - public static int cntu; + public static int cntq, cntu; public static int[] cnt = new int[MAXV]; public static int[] ans = new int[MAXN]; @@ -68,7 +67,7 @@ public static void updateTime(int jobl, int jobr, int tim) { } public static void prepare() { - int blen = Math.max(1, (int) Math.pow(n, 0.666)); + int blen = Math.max(1, (int) Math.pow(n, 2.0 / 3)); for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } diff --git a/src/class176/Code06_CountingColors2.java b/src/class176/Code06_CountingColors2.java new file mode 100644 index 000000000..51d8afe5a --- /dev/null +++ b/src/class176/Code06_CountingColors2.java @@ -0,0 +1,134 @@ +package class176; + +// 数颜色,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P1903 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, t, id; +//}; +// +//struct Update { +// int i, v; +//}; +// +//const int MAXN = 200001; +//const int MAXV = 1000001; +//int n, m; +//int arr[MAXN]; +//int bi[MAXN]; +// +//Query query[MAXN]; +//Update update[MAXN]; +//int cntq, cntu; +// +//int cnt[MAXV]; +//int ans[MAXN]; +//int kind; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if (bi[a.r] != bi[b.r]) { +// return bi[a.r] < bi[b.r]; +// } +// return a.t < b.t; +//} +// +//void del(int num) { +// if (--cnt[num] == 0) { +// kind--; +// } +//} +// +//void add(int num) { +// if (++cnt[num] == 1) { +// kind++; +// } +//} +// +//void updateTime(int jobl, int jobr, int tim) { +// int pos = update[tim].i; +// int val = update[tim].v; +// if (jobl <= pos && pos <= jobr) { +// del(arr[pos]); +// add(val); +// } +// int tmp = arr[pos]; +// arr[pos] = val; +// update[tim].v = tmp; +//} +// +//void prepare() { +// int blen = max(1, (int)pow(n, 2.0 / 3)); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + cntq + 1, QueryCmp); +//} +// +//void compute() { +// int winl = 1, winr = 0, wint = 0; +// for (int i = 1; i <= cntq; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int jobt = query[i].t; +// int id = query[i].id; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// while (winr < jobr) { +// add(arr[++winr]); +// } +// while (winl < jobl) { +// del(arr[winl++]); +// } +// while (winr > jobr) { +// del(arr[winr--]); +// } +// while (wint < jobt) { +// updateTime(jobl, jobr, ++wint); +// } +// while (wint > jobt) { +// updateTime(jobl, jobr, wint--); +// } +// ans[id] = kind; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// char op; +// int x, y; +// for (int i = 1; i <= m; i++) { +// cin >> op >> x >> y; +// if (op == 'Q') { +// cntq++; +// query[cntq].l = x; +// query[cntq].r = y; +// query[cntq].t = cntu; +// query[cntq].id = cntq; +// } else { +// cntu++; +// update[cntu].i = x; +// update[cntu].v = y; +// } +// } +// prepare(); +// compute(); +// for (int i = 1; i <= cntq; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 123348e6c6fcd2d03bd58b53beb517ba2e9df329 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Aug 2025 18:56:02 +0800 Subject: [PATCH 0582/1170] modify code --- src/class176/Code06_CountingColors1.java | 6 +++--- src/class176/Code06_CountingColors2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_CountingColors1.java index 83ab59f14..1a6ea41b4 100644 --- a/src/class176/Code06_CountingColors1.java +++ b/src/class176/Code06_CountingColors1.java @@ -54,7 +54,7 @@ public static void add(int num) { } } - public static void updateTime(int jobl, int jobr, int tim) { + public static void moveTime(int jobl, int jobr, int tim) { int pos = update[tim][0]; int val = update[tim][1]; if (jobl <= pos && pos <= jobr) { @@ -94,10 +94,10 @@ public static void compute() { del(arr[winr--]); } while (wint < jobt) { - updateTime(jobl, jobr, ++wint); + moveTime(jobl, jobr, ++wint); } while (wint > jobt) { - updateTime(jobl, jobr, wint--); + moveTime(jobl, jobr, wint--); } ans[id] = kind; } diff --git a/src/class176/Code06_CountingColors2.java b/src/class176/Code06_CountingColors2.java index 51d8afe5a..41ccd6397 100644 --- a/src/class176/Code06_CountingColors2.java +++ b/src/class176/Code06_CountingColors2.java @@ -53,7 +53,7 @@ // } //} // -//void updateTime(int jobl, int jobr, int tim) { +//void moveTime(int jobl, int jobr, int tim) { // int pos = update[tim].i; // int val = update[tim].v; // if (jobl <= pos && pos <= jobr) { @@ -93,10 +93,10 @@ // del(arr[winr--]); // } // while (wint < jobt) { -// updateTime(jobl, jobr, ++wint); +// moveTime(jobl, jobr, ++wint); // } // while (wint > jobt) { -// updateTime(jobl, jobr, wint--); +// moveTime(jobl, jobr, wint--); // } // ans[id] = kind; // } From f50d6e93f57448ed8bbc9520c6b188d1203bd16b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Aug 2025 20:06:51 +0800 Subject: [PATCH 0583/1170] modify code --- src/class176/Code07_MachineLearning1.java | 239 ++++++++++++++++++++++ src/class176/Code07_MachineLearning2.java | 170 +++++++++++++++ 2 files changed, 409 insertions(+) create mode 100644 src/class176/Code07_MachineLearning1.java create mode 100644 src/class176/Code07_MachineLearning2.java diff --git a/src/class176/Code07_MachineLearning1.java b/src/class176/Code07_MachineLearning1.java new file mode 100644 index 000000000..98daf9398 --- /dev/null +++ b/src/class176/Code07_MachineLearning1.java @@ -0,0 +1,239 @@ +package class176; + +// 机器学习,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF940F +// 测试链接 : https://codeforces.com/problemset/problem/940/F +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code07_MachineLearning1 { + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if (bi[a[1]] != bi[b[1]]) { + return bi[a[1]] - bi[b[1]]; + } + return a[2] - b[2]; + } + } + + public static int MAXN = 100001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[] sorted = new int[MAXN << 1]; + + public static int[] bi = new int[MAXN]; + public static int[][] query = new int[MAXN][4]; + public static int[][] update = new int[MAXN][2]; + public static int cntq, cntu; + + public static int[] cnt1 = new int[MAXN << 1]; + public static int[] cnt2 = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + public static int kth(int len, int num) { + int left = 1, right = len, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static void add(int num) { + --cnt2[cnt1[num]]; + ++cnt2[++cnt1[num]]; + } + + public static void del(int num) { + --cnt2[cnt1[num]]; + ++cnt2[--cnt1[num]]; + } + + public static void moveTime(int jobl, int jobr, int tim) { + int pos = update[tim][0]; + int val = update[tim][1]; + if (jobl <= pos && pos <= jobr) { + del(arr[pos]); + add(val); + } + int tmp = arr[pos]; + arr[pos] = val; + update[tim][1] = tmp; + } + + public static void compute() { + int winl = 1, winr = 0, wint = 0; + for (int i = 1; i <= cntq; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int jobt = query[i][2]; + int id = query[i][3]; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); + } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + while (wint < jobt) { + moveTime(jobl, jobr, ++wint); + } + while (wint > jobt) { + moveTime(jobl, jobr, wint--); + } + int ret = 1; + while (ret <= n && cnt2[ret] > 0) { + ret++; + } + ans[id] = ret; + } + } + + public static void prepare() { + int len = 0; + for (int i = 1; i <= n; i++) { + sorted[++len] = arr[i]; + } + for (int i = 1; i <= cntu; i++) { + sorted[++len] = update[i][1]; + } + Arrays.sort(sorted, 1, len + 1); + int tmp = 1; + for (int i = 2; i <= len; i++) { + if (sorted[tmp] != sorted[i]) { + sorted[++tmp] = sorted[i]; + } + } + len = tmp; + for (int i = 1; i <= n; i++) { + arr[i] = kth(len, arr[i]); + } + for (int i = 1; i <= cntu; i++) { + update[i][1] = kth(len, update[i][1]); + } + int blen = Math.max(1, (int) Math.pow(n, 2.0 / 3)); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1, op, x, y; i <= m; i++) { + op = in.nextInt(); + x = in.nextInt(); + y = in.nextInt(); + if (op == 1) { + cntq++; + query[cntq][0] = x; + query[cntq][1] = y; + query[cntq][2] = cntu; + query[cntq][3] = cntq; + } else { + cntu++; + update[cntu][0] = x; + update[cntu][1] = y; + } + } + prepare(); + compute(); + for (int i = 1; i <= cntq; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class176/Code07_MachineLearning2.java b/src/class176/Code07_MachineLearning2.java new file mode 100644 index 000000000..2fa851b91 --- /dev/null +++ b/src/class176/Code07_MachineLearning2.java @@ -0,0 +1,170 @@ +package class176; + +// 机器学习,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF940F +// 测试链接 : https://codeforces.com/problemset/problem/940/F +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, t, id; +//}; +// +//struct Update { +// int i, v; +//}; +// +//const int MAXN = 100001; +//int n, m; +//int arr[MAXN]; +//int sorted[MAXN << 1]; +// +//int bi[MAXN]; +//Query query[MAXN]; +//Update update[MAXN]; +//int cntq, cntu; +// +//int cnt1[MAXN << 1]; +//int cnt2[MAXN]; +//int ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if (bi[a.r] != bi[b.r]) { +// return bi[a.r] < bi[b.r]; +// } +// return a.t < b.t; +//} +// +//int kth(int len, int num) { +// int left = 1, right = len, mid, ret = 0; +// while (left <= right) { +// mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//void add(int num) { +// --cnt2[cnt1[num]]; +// ++cnt2[++cnt1[num]]; +//} +// +//void del(int num) { +// --cnt2[cnt1[num]]; +// ++cnt2[--cnt1[num]]; +//} +// +//void moveTime(int jobl, int jobr, int tim) { +// int pos = update[tim].i; +// int val = update[tim].v; +// if (jobl <= pos && pos <= jobr) { +// del(arr[pos]); +// add(val); +// } +// int tmp = arr[pos]; +// arr[pos] = val; +// update[tim].v = tmp; +//} +// +//void compute() { +// int winl = 1, winr = 0, wint = 0; +// for (int i = 1; i <= cntq; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int jobt = query[i].t; +// int id = query[i].id; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// while (winr < jobr) { +// add(arr[++winr]); +// } +// while (winl < jobl) { +// del(arr[winl++]); +// } +// while (winr > jobr) { +// del(arr[winr--]); +// } +// while (wint < jobt) { +// moveTime(jobl, jobr, ++wint); +// } +// while (wint > jobt) { +// moveTime(jobl, jobr, wint--); +// } +// int ret = 1; +// while (ret <= n && cnt2[ret] > 0) { +// ret++; +// } +// ans[id] = ret; +// } +//} +// +//void prepare() { +// int len = 0; +// for (int i = 1; i <= n; i++) { +// sorted[++len] = arr[i]; +// } +// for (int i = 1; i <= cntu; i++) { +// sorted[++len] = update[i].v; +// } +// sort(sorted + 1, sorted + len + 1); +// int tmp = 1; +// for (int i = 2; i <= len; i++) { +// if (sorted[tmp] != sorted[i]) { +// sorted[++tmp] = sorted[i]; +// } +// } +// len = tmp; +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(len, arr[i]); +// } +// for (int i = 1; i <= cntu; i++) { +// update[i].v = kth(len, update[i].v); +// } +// int blen = max(1, (int)pow(n, 2.0 / 3)); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + cntq + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1, op, x, y; i <= m; i++) { +// cin >> op >> x >> y; +// if (op == 1) { +// ++cntq; +// query[cntq].l = x; +// query[cntq].r = y; +// query[cntq].t = cntu; +// query[cntq].id = cntq; +// } else { +// ++cntu; +// update[cntu].i = x; +// update[cntu].v = y; +// } +// } +// prepare(); +// compute(); +// for (int i = 1; i <= cntq; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From c5c9bee8fe85773510e7404578dc892bd44f106b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 16 Aug 2025 11:03:29 +0800 Subject: [PATCH 0584/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 7 ++++--- src/class176/Code01_MoAlgorithm2.java | 3 ++- src/class176/Code06_CountingColors1.java | 26 ++++++++++++++++++++++-- src/class176/Code06_CountingColors2.java | 18 ++++++++++++++-- 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index f3398b433..cb1bc4058 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -14,7 +14,7 @@ public class Code01_MoAlgorithm1 { - // 莫队经典排序 + // 普通莫队经典排序 public static class QueryCmp1 implements Comparator { @Override @@ -27,7 +27,7 @@ public int compare(int[] a, int[] b) { } - // 莫队奇偶排序,玄学优化 + // 普通莫队奇偶排序 public static class QueryCmp2 implements Comparator { @Override @@ -37,8 +37,9 @@ public int compare(int[] a, int[] b) { } if ((bi[a[0]] & 1) == 1) { return a[1] - b[1]; + } else { + return b[1] - a[1]; } - return b[1] - a[1]; } } diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java index 16209b02c..c257997cb 100644 --- a/src/class176/Code01_MoAlgorithm2.java +++ b/src/class176/Code01_MoAlgorithm2.java @@ -39,8 +39,9 @@ // } // if ((bi[a.l] & 1) == 1) { // return a.r < b.r; +// } else { +// return a.r > b.r; // } -// return a.r > b.r; //} // //void del(int num) { diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_CountingColors1.java index 1a6ea41b4..5de71f76a 100644 --- a/src/class176/Code06_CountingColors1.java +++ b/src/class176/Code06_CountingColors1.java @@ -13,7 +13,8 @@ public class Code06_CountingColors1 { - public static class QueryCmp implements Comparator { + // 带修莫队经典排序 + public static class QueryCmp1 implements Comparator { @Override public int compare(int[] a, int[] b) { @@ -28,6 +29,26 @@ public int compare(int[] a, int[] b) { } + // 带修莫队奇偶排序 + public static class QueryCmp2 implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if (bi[a[1]] != bi[b[1]]) { + if ((bi[a[0]] & 1) == 1) { + return bi[a[1]] - bi[b[1]]; + } else { + return bi[b[1]] - bi[a[1]]; + } + } + return a[2] - b[2]; + } + + } + public static int MAXN = 200001; public static int MAXV = 1000001; public static int n, m; @@ -71,7 +92,8 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + // Arrays.sort(query, 1, cntq + 1, new QueryCmp1()); + Arrays.sort(query, 1, cntq + 1, new QueryCmp2()); } public static void compute() { diff --git a/src/class176/Code06_CountingColors2.java b/src/class176/Code06_CountingColors2.java index 41ccd6397..a65035f08 100644 --- a/src/class176/Code06_CountingColors2.java +++ b/src/class176/Code06_CountingColors2.java @@ -31,7 +31,7 @@ //int ans[MAXN]; //int kind; // -//bool QueryCmp(Query &a, Query &b) { +//bool QueryCmp1(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } @@ -41,6 +41,20 @@ // return a.t < b.t; //} // +//bool QueryCmp2(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if (bi[a.r] != bi[b.r]) { +// if ((bi[a.l] & 1) == 1) { +// return bi[a.r] < bi[b.r]; +// } else { +// return bi[a.r] > bi[b.r]; +// } +// } +// return a.t < b.t; +//} +// //void del(int num) { // if (--cnt[num] == 0) { // kind--; @@ -70,7 +84,7 @@ // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } -// sort(query + 1, query + cntq + 1, QueryCmp); +// sort(query + 1, query + cntq + 1, QueryCmp2); //} // //void compute() { From dde2baa1a17df64293631da240c66a8de41c537b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 16 Aug 2025 14:12:38 +0800 Subject: [PATCH 0585/1170] modify code --- src/class176/Code06_CountingColors1.java | 16 +- src/class176/Code06_CountingColors2.java | 22 +- src/class176/Code07_MachineLearning1.java | 16 +- src/class176/Code07_MachineLearning2.java | 26 +-- src/class176/Code08_MinimumDifference1.java | 225 ++++++++++++++++++++ src/class176/Code08_MinimumDifference2.java | 178 ++++++++++++++++ 6 files changed, 447 insertions(+), 36 deletions(-) create mode 100644 src/class176/Code08_MinimumDifference1.java create mode 100644 src/class176/Code08_MinimumDifference2.java diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_CountingColors1.java index 5de71f76a..895f0020b 100644 --- a/src/class176/Code06_CountingColors1.java +++ b/src/class176/Code06_CountingColors1.java @@ -134,21 +134,23 @@ public static void main(String[] args) throws Exception { arr[i] = in.nextInt(); } char op; - int x, y; + int l, r, pos, val; for (int i = 1; i <= m; i++) { op = in.nextChar(); - x = in.nextInt(); - y = in.nextInt(); if (op == 'Q') { + l = in.nextInt(); + r = in.nextInt(); cntq++; - query[cntq][0] = x; - query[cntq][1] = y; + query[cntq][0] = l; + query[cntq][1] = r; query[cntq][2] = cntu; query[cntq][3] = cntq; } else { + pos = in.nextInt(); + val = in.nextInt(); cntu++; - update[cntu][0] = x; - update[cntu][1] = y; + update[cntu][0] = pos; + update[cntu][1] = val; } } prepare(); diff --git a/src/class176/Code06_CountingColors2.java b/src/class176/Code06_CountingColors2.java index a65035f08..ac8eae32b 100644 --- a/src/class176/Code06_CountingColors2.java +++ b/src/class176/Code06_CountingColors2.java @@ -14,7 +14,7 @@ //}; // //struct Update { -// int i, v; +// int pos, val; //}; // //const int MAXN = 200001; @@ -68,15 +68,15 @@ //} // //void moveTime(int jobl, int jobr, int tim) { -// int pos = update[tim].i; -// int val = update[tim].v; +// int pos = update[tim].pos; +// int val = update[tim].val; // if (jobl <= pos && pos <= jobr) { // del(arr[pos]); // add(val); // } // int tmp = arr[pos]; // arr[pos] = val; -// update[tim].v = tmp; +// update[tim].val = tmp; //} // //void prepare() { @@ -124,19 +124,21 @@ // cin >> arr[i]; // } // char op; -// int x, y; +// int l, r, pos, val; // for (int i = 1; i <= m; i++) { -// cin >> op >> x >> y; +// cin >> op; // if (op == 'Q') { +// cin >> l >> r; // cntq++; -// query[cntq].l = x; -// query[cntq].r = y; +// query[cntq].l = l; +// query[cntq].r = r; // query[cntq].t = cntu; // query[cntq].id = cntq; // } else { +// cin >> pos >> val; // cntu++; -// update[cntu].i = x; -// update[cntu].v = y; +// update[cntu].pos = pos; +// update[cntu].val = val; // } // } // prepare(); diff --git a/src/class176/Code07_MachineLearning1.java b/src/class176/Code07_MachineLearning1.java index 98daf9398..3a050766e 100644 --- a/src/class176/Code07_MachineLearning1.java +++ b/src/class176/Code07_MachineLearning1.java @@ -147,20 +147,22 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } - for (int i = 1, op, x, y; i <= m; i++) { + for (int i = 1, op, l, r, pos, val; i <= m; i++) { op = in.nextInt(); - x = in.nextInt(); - y = in.nextInt(); if (op == 1) { + l = in.nextInt(); + r = in.nextInt(); cntq++; - query[cntq][0] = x; - query[cntq][1] = y; + query[cntq][0] = l; + query[cntq][1] = r; query[cntq][2] = cntu; query[cntq][3] = cntq; } else { + pos = in.nextInt(); + val = in.nextInt(); cntu++; - update[cntu][0] = x; - update[cntu][1] = y; + update[cntu][0] = pos; + update[cntu][1] = val; } } prepare(); diff --git a/src/class176/Code07_MachineLearning2.java b/src/class176/Code07_MachineLearning2.java index 2fa851b91..1ffc67816 100644 --- a/src/class176/Code07_MachineLearning2.java +++ b/src/class176/Code07_MachineLearning2.java @@ -15,7 +15,7 @@ //}; // //struct Update { -// int i, v; +// int pos, val; //}; // //const int MAXN = 100001; @@ -67,15 +67,15 @@ //} // //void moveTime(int jobl, int jobr, int tim) { -// int pos = update[tim].i; -// int val = update[tim].v; +// int pos = update[tim].pos; +// int val = update[tim].val; // if (jobl <= pos && pos <= jobr) { // del(arr[pos]); // add(val); // } // int tmp = arr[pos]; // arr[pos] = val; -// update[tim].v = tmp; +// update[tim].val = tmp; //} // //void compute() { @@ -117,7 +117,7 @@ // sorted[++len] = arr[i]; // } // for (int i = 1; i <= cntu; i++) { -// sorted[++len] = update[i].v; +// sorted[++len] = update[i].val; // } // sort(sorted + 1, sorted + len + 1); // int tmp = 1; @@ -131,7 +131,7 @@ // arr[i] = kth(len, arr[i]); // } // for (int i = 1; i <= cntu; i++) { -// update[i].v = kth(len, update[i].v); +// update[i].val = kth(len, update[i].val); // } // int blen = max(1, (int)pow(n, 2.0 / 3)); // for (int i = 1; i <= n; i++) { @@ -147,18 +147,20 @@ // for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } -// for (int i = 1, op, x, y; i <= m; i++) { -// cin >> op >> x >> y; +// for (int i = 1, op, l, r, pos, val; i <= m; i++) { +// cin >> op; // if (op == 1) { +// cin >> l >> r; // ++cntq; -// query[cntq].l = x; -// query[cntq].r = y; +// query[cntq].l = l; +// query[cntq].r = r; // query[cntq].t = cntu; // query[cntq].id = cntq; // } else { +// cin >> pos >> val; // ++cntu; -// update[cntu].i = x; -// update[cntu].v = y; +// update[cntu].pos = pos; +// update[cntu].val = val; // } // } // prepare(); diff --git a/src/class176/Code08_MinimumDifference1.java b/src/class176/Code08_MinimumDifference1.java new file mode 100644 index 000000000..befeaa9b2 --- /dev/null +++ b/src/class176/Code08_MinimumDifference1.java @@ -0,0 +1,225 @@ +package class176; + +// 最小化极差,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1476G +// 测试链接 : https://codeforces.com/problemset/problem/1476/G +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code08_MinimumDifference1 { + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if (bi[a[1]] != bi[b[1]]) { + return bi[a[1]] - bi[b[1]]; + } + return a[3] - b[3]; + } + } + + public static int MAXN = 100001; + public static int MAXB = 3001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + + // query : l, r, k, t, id + // update : pos, val + public static int[][] query = new int[MAXN][5]; + public static int[][] update = new int[MAXN][2]; + public static int cntq, cntu; + + public static int[] cnt1 = new int[MAXN]; + public static int[] cnt2 = new int[MAXN]; + public static int[] sum = new int[MAXB]; + public static int[] cntFreq = new int[MAXN]; + public static int[] freqVal = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + public static void del(int num) { + cnt2[cnt1[num]]--; + sum[bi[cnt1[num]]]--; + cnt1[num]--; + cnt2[cnt1[num]]++; + sum[bi[cnt1[num]]]++; + } + + public static void add(int num) { + cnt2[cnt1[num]]--; + sum[bi[cnt1[num]]]--; + cnt1[num]++; + cnt2[cnt1[num]]++; + sum[bi[cnt1[num]]]++; + } + + public static void moveTime(int jobl, int jobr, int tim) { + int pos = update[tim][0]; + int val = update[tim][1]; + if (jobl <= pos && pos <= jobr) { + del(arr[pos]); + add(val); + } + int tmp = arr[pos]; + arr[pos] = val; + update[tim][1] = tmp; + } + + public static int getAns(int k) { + int size = 0; + for (int b = 1; b <= bi[n]; b++) { + if (sum[b] != 0) { + for (int f = bl[b]; f <= br[b]; f++) { + if (cnt2[f] > 0) { + cntFreq[++size] = cnt2[f]; + freqVal[size] = f; + } + } + } + } + int minDiff = Integer.MAX_VALUE; + int cntSum = 0; + for (int l = 1, r = 0; l <= size; l++) { + while (cntSum < k && r < size) { + r++; + cntSum += cntFreq[r]; + } + if (cntSum >= k) { + minDiff = Math.min(minDiff, freqVal[r] - freqVal[l]); + } + cntSum -= cntFreq[l]; + } + return minDiff == Integer.MAX_VALUE ? -1 : minDiff; + } + + public static void compute() { + int winl = 1, winr = 0, wint = 0; + for (int i = 1; i <= cntq; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int jobk = query[i][2]; + int jobt = query[i][3]; + int id = query[i][4]; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); + } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + while (wint < jobt) { + moveTime(jobl, jobr, ++wint); + } + while (wint > jobt) { + moveTime(jobl, jobr, wint--); + } + ans[id] = getAns(jobk); + } + } + + public static void prepare() { + int blen = Math.max(1, (int) Math.pow(n, 2.0 / 3)); + int bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, n); + } + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1, op, l, r, k, pos, val; i <= m; i++) { + op = in.nextInt(); + if (op == 1) { + l = in.nextInt(); + r = in.nextInt(); + k = in.nextInt(); + cntq++; + query[cntq][0] = l; + query[cntq][1] = r; + query[cntq][2] = k; + query[cntq][3] = cntu; + query[cntq][4] = cntq; + } else { + pos = in.nextInt(); + val = in.nextInt(); + cntu++; + update[cntu][0] = pos; + update[cntu][1] = val; + } + } + prepare(); + compute(); + for (int i = 1; i <= cntq; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class176/Code08_MinimumDifference2.java b/src/class176/Code08_MinimumDifference2.java new file mode 100644 index 000000000..9ed9f00f8 --- /dev/null +++ b/src/class176/Code08_MinimumDifference2.java @@ -0,0 +1,178 @@ +package class176; + +// 最小化极差,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1476G +// 测试链接 : https://codeforces.com/problemset/problem/1476/G +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, k, t, id; +//}; +// +//struct Update { +// int pos, val; +//}; +// +//const int MAXN = 100001; +//const int MAXB = 3001; +//int n, m; +//int arr[MAXN]; +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +// +//Query query[MAXN]; +//Update update[MAXN]; +//int cntq, cntu; +// +//int cnt1[MAXN]; +//int cnt2[MAXN]; +//int sum[MAXB]; +//int cntFreq[MAXN]; +//int freqVal[MAXN]; +//int ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if (bi[a.r] != bi[b.r]) { +// return bi[a.r] < bi[b.r]; +// } +// return a.t < b.t; +//} +// +//void del(int num) { +// cnt2[cnt1[num]]--; +// sum[bi[cnt1[num]]]--; +// cnt1[num]--; +// cnt2[cnt1[num]]++; +// sum[bi[cnt1[num]]]++; +//} +// +//void add(int num) { +// cnt2[cnt1[num]]--; +// sum[bi[cnt1[num]]]--; +// cnt1[num]++; +// cnt2[cnt1[num]]++; +// sum[bi[cnt1[num]]]++; +//} +// +//void moveTime(int jobl, int jobr, int tim) { +// int pos = update[tim].pos; +// int val = update[tim].val; +// if (jobl <= pos && pos <= jobr) { +// del(arr[pos]); +// add(val); +// } +// int tmp = arr[pos]; +// arr[pos] = val; +// update[tim].val = tmp; +//} +// +//int getAns(int k) { +// int size = 0; +// for (int b = 1; b <= bi[n]; b++) { +// if (sum[b] != 0) { +// for (int f = bl[b]; f <= br[b]; f++) { +// if (cnt2[f] > 0) { +// cntFreq[++size] = cnt2[f]; +// freqVal[size] = f; +// } +// } +// } +// } +// int minDiff = INT_MAX; +// int cntSum = 0; +// for (int l = 1, r = 0; l <= size; l++) { +// while (cntSum < k && r < size) { +// r++; +// cntSum += cntFreq[r]; +// } +// if (cntSum >= k) { +// minDiff = min(minDiff, freqVal[r] - freqVal[l]); +// } +// cntSum -= cntFreq[l]; +// } +// return minDiff == INT_MAX ? -1 : minDiff; +//} +// +//void compute() { +// int winl = 1, winr = 0, wint = 0; +// for (int i = 1; i <= cntq; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int jobk = query[i].k; +// int jobt = query[i].t; +// int id = query[i].id; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// while (winr < jobr) { +// add(arr[++winr]); +// } +// while (winl < jobl) { +// del(arr[winl++]); +// } +// while (winr > jobr) { +// del(arr[winr--]); +// } +// while (wint < jobt) { +// moveTime(jobl, jobr, ++wint); +// } +// while (wint > jobt) { +// moveTime(jobl, jobr, wint--); +// } +// ans[id] = getAns(jobk); +// } +//} +// +//void prepare() { +// int blen = max(1, (int)pow(n, 2.0 / 3.0)); +// int bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, n); +// } +// sort(query + 1, query + cntq + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1, op, l, r, k, pos, val; i <= m; i++) { +// cin >> op; +// if (op == 1) { +// cin >> l >> r >> k; +// ++cntq; +// query[cntq].l = l; +// query[cntq].r = r; +// query[cntq].k = k; +// query[cntq].t = cntu; +// query[cntq].id = cntq; +// } else { +// cin >> pos >> val; +// ++cntu; +// update[cntu].pos = pos; +// update[cntu].val = val; +// } +// } +// prepare(); +// compute(); +// for (int i = 1; i <= cntq; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From d822b2a6a35548f91620dcebfc37c9126e2d96c2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 16 Aug 2025 14:13:46 +0800 Subject: [PATCH 0586/1170] modify code --- src/class176/Code08_MinimumDifference2.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class176/Code08_MinimumDifference2.java b/src/class176/Code08_MinimumDifference2.java index 9ed9f00f8..8df446db4 100644 --- a/src/class176/Code08_MinimumDifference2.java +++ b/src/class176/Code08_MinimumDifference2.java @@ -67,8 +67,8 @@ // int pos = update[tim].pos; // int val = update[tim].val; // if (jobl <= pos && pos <= jobr) { -// del(arr[pos]); -// add(val); +// del(arr[pos]); +// add(val); // } // int tmp = arr[pos]; // arr[pos] = val; From ab7e3f37c5f2f07b36e68d6457e189c50e5ec4c8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 16 Aug 2025 14:15:08 +0800 Subject: [PATCH 0587/1170] modify code --- src/class176/Code07_MachineLearning2.java | 4 ++-- src/class176/Code08_MinimumDifference2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class176/Code07_MachineLearning2.java b/src/class176/Code07_MachineLearning2.java index 1ffc67816..956ad7d0b 100644 --- a/src/class176/Code07_MachineLearning2.java +++ b/src/class176/Code07_MachineLearning2.java @@ -151,14 +151,14 @@ // cin >> op; // if (op == 1) { // cin >> l >> r; -// ++cntq; +// cntq++; // query[cntq].l = l; // query[cntq].r = r; // query[cntq].t = cntu; // query[cntq].id = cntq; // } else { // cin >> pos >> val; -// ++cntu; +// cntu++; // update[cntu].pos = pos; // update[cntu].val = val; // } diff --git a/src/class176/Code08_MinimumDifference2.java b/src/class176/Code08_MinimumDifference2.java index 8df446db4..49de4b7eb 100644 --- a/src/class176/Code08_MinimumDifference2.java +++ b/src/class176/Code08_MinimumDifference2.java @@ -156,7 +156,7 @@ // cin >> op; // if (op == 1) { // cin >> l >> r >> k; -// ++cntq; +// cntq++; // query[cntq].l = l; // query[cntq].r = r; // query[cntq].k = k; @@ -164,7 +164,7 @@ // query[cntq].id = cntq; // } else { // cin >> pos >> val; -// ++cntu; +// cntu++; // update[cntu].pos = pos; // update[cntu].val = val; // } From 3f67b922bb0d892e7bda8a1b24ac3edcdc373577 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 16 Aug 2025 15:44:50 +0800 Subject: [PATCH 0588/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 5 +++++ src/class176/Code01_MoAlgorithm2.java | 5 +++++ src/class176/Code02_QueryFromB1.java | 4 ++++ src/class176/Code02_QueryFromB2.java | 4 ++++ src/class176/Code03_SockFromZ1.java | 4 ++++ src/class176/Code03_SockFromZ2.java | 4 ++++ src/class176/Code04_BloodyString1.java | 4 ++++ src/class176/Code04_BloodyString2.java | 4 ++++ src/class176/Code05_XorSequence1.java | 3 +++ src/class176/Code05_XorSequence2.java | 3 +++ src/class176/Code06_CountingColors1.java | 5 +++++ src/class176/Code06_CountingColors2.java | 5 +++++ src/class176/Code07_MachineLearning1.java | 6 ++++++ src/class176/Code07_MachineLearning2.java | 6 ++++++ src/class176/Code08_MinimumDifference1.java | 7 +++++++ src/class176/Code08_MinimumDifference2.java | 7 +++++++ 16 files changed, 76 insertions(+) diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index cb1bc4058..556220cd1 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -1,6 +1,11 @@ package class176; // 普通莫队模版题,java版 +// 给定一个长度为n的数组arr,一共有q条查询,格式如下 +// 查询 l r : 打印arr[l..r]范围上有几种不同的数字 +// 1 <= n <= 3 * 10^4 +// 1 <= arr[i] <= 10^6 +// 1 <= q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/SP3267 // 测试链接 : https://www.spoj.com/problems/DQUERY/ // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java index c257997cb..affc321fd 100644 --- a/src/class176/Code01_MoAlgorithm2.java +++ b/src/class176/Code01_MoAlgorithm2.java @@ -1,6 +1,11 @@ package class176; // 普通莫队模版题,C++版 +// 给定一个长度为n的数组arr,一共有q条查询,格式如下 +// 查询 l r : 打印arr[l..r]范围上有几种不同的数字 +// 1 <= n <= 3 * 10^4 +// 1 <= arr[i] <= 10^6 +// 1 <= q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/SP3267 // 测试链接 : https://www.spoj.com/problems/DQUERY/ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class176/Code02_QueryFromB1.java b/src/class176/Code02_QueryFromB1.java index 2c1e0b753..519a40065 100644 --- a/src/class176/Code02_QueryFromB1.java +++ b/src/class176/Code02_QueryFromB1.java @@ -1,6 +1,10 @@ package class176; // 小B的询问,java版 +// 给定一个长度为n的数组arr,所有数字在[1..k]范围上 +// 定义f(i) = i这种数的出现次数的平方,一共有m条查询,格式如下 +// 查询 l r : arr[l..r]范围上,打印 f(1) + f(2) + .. + f(k) 的值 +// 1 <= n、m、k <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P2709 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class176/Code02_QueryFromB2.java b/src/class176/Code02_QueryFromB2.java index 876b10460..5d3cb08d6 100644 --- a/src/class176/Code02_QueryFromB2.java +++ b/src/class176/Code02_QueryFromB2.java @@ -1,6 +1,10 @@ package class176; // 小B的询问,C++版 +// 给定一个长度为n的数组arr,所有数字在[1..k]范围上 +// 定义f(i) = i这种数的出现次数的平方,一共有m条查询,格式如下 +// 查询 l r : arr[l..r]范围上,打印 f(1) + f(2) + .. + f(k) 的值 +// 1 <= n、m、k <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P2709 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class176/Code03_SockFromZ1.java b/src/class176/Code03_SockFromZ1.java index 897fb599a..c26f66b01 100644 --- a/src/class176/Code03_SockFromZ1.java +++ b/src/class176/Code03_SockFromZ1.java @@ -1,6 +1,10 @@ package class176; // 小Z的袜子,java版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : arr[l..r]范围上,如果随机选两个数,打印数字相同的概率 +// 打印的结果用分数的形式表达,并且约分到最简的形式 +// 1 <= n、m、arr[i] <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P1494 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class176/Code03_SockFromZ2.java b/src/class176/Code03_SockFromZ2.java index b4fddadb8..7a7c9832b 100644 --- a/src/class176/Code03_SockFromZ2.java +++ b/src/class176/Code03_SockFromZ2.java @@ -1,6 +1,10 @@ package class176; // 小Z的袜子,C++版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : arr[l..r]范围上,如果随机选两个数,打印数字相同的概率 +// 打印的结果用分数的形式表达,并且约分到最简的形式 +// 1 <= n、m、arr[i] <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P1494 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index ed5b0f270..bb450bd1e 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -1,6 +1,10 @@ package class176; // 大爷的字符串题,java版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : arr[l..r]范围上,众数出现了几次,打印其相反数 +// 1 <= n、m <= 2 * 10^5 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3709 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class176/Code04_BloodyString2.java b/src/class176/Code04_BloodyString2.java index 5e9bc1b84..a323ee170 100644 --- a/src/class176/Code04_BloodyString2.java +++ b/src/class176/Code04_BloodyString2.java @@ -1,6 +1,10 @@ package class176; // 大爷的字符串题,C++版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : arr[l..r]范围上,众数出现了几次,打印其相反数 +// 1 <= n、m <= 2 * 10^5 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3709 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class176/Code05_XorSequence1.java b/src/class176/Code05_XorSequence1.java index b4db3064f..7b37c1a99 100644 --- a/src/class176/Code05_XorSequence1.java +++ b/src/class176/Code05_XorSequence1.java @@ -1,6 +1,9 @@ package class176; // 异或序列,java版 +// 给定一个长度为n的数组arr,给定一个数字k,一共有m条查询,格式如下 +// 查询 l r : arr[l..r]范围上,有多少子数组的异或和为k,打印其数量 +// 0 <= n、m、k、arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4462 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class176/Code05_XorSequence2.java b/src/class176/Code05_XorSequence2.java index b4e4990c5..62f4e2b50 100644 --- a/src/class176/Code05_XorSequence2.java +++ b/src/class176/Code05_XorSequence2.java @@ -1,6 +1,9 @@ package class176; // 异或序列,C++版 +// 给定一个长度为n的数组arr,给定一个数字k,一共有m条查询,格式如下 +// 查询 l r : arr[l..r]范围上,有多少子数组的异或和为k,打印其数量 +// 0 <= n、m、k、arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4462 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_CountingColors1.java index 895f0020b..addd6c3c4 100644 --- a/src/class176/Code06_CountingColors1.java +++ b/src/class176/Code06_CountingColors1.java @@ -1,6 +1,11 @@ package class176; // 数颜色,java版 +// 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 +// 操作 Q l r : 打印arr[l..r]范围上有几种不同的数 +// 操作 R pos val : 把arr[pos]的值设置成val +// 1 <= n、m <= 2 * 10^5 +// 1 <= arr[i]、val <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P1903 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class176/Code06_CountingColors2.java b/src/class176/Code06_CountingColors2.java index ac8eae32b..547eaa0ac 100644 --- a/src/class176/Code06_CountingColors2.java +++ b/src/class176/Code06_CountingColors2.java @@ -1,6 +1,11 @@ package class176; // 数颜色,C++版 +// 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 +// 操作 Q l r : 打印arr[l..r]范围上有几种不同的数 +// 操作 R pos val : 把arr[pos]的值设置成val +// 1 <= n、m <= 2 * 10^5 +// 1 <= arr[i]、val <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P1903 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class176/Code07_MachineLearning1.java b/src/class176/Code07_MachineLearning1.java index 3a050766e..a52ff438b 100644 --- a/src/class176/Code07_MachineLearning1.java +++ b/src/class176/Code07_MachineLearning1.java @@ -1,6 +1,12 @@ package class176; // 机器学习,java版 +// 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 +// 操作 1 l r : arr[l..r]范围上,每种数字出现的次数,假设构成一个集合 +// 打印这个集合中,没出现的最小非负整数,就是打印次数的mex +// 操作 2 pos val : 把arr[pos]的值设置成val +// 1 <= n、m <= 10^5 +// 1 <= arr[i]、val <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF940F // 测试链接 : https://codeforces.com/problemset/problem/940/F // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class176/Code07_MachineLearning2.java b/src/class176/Code07_MachineLearning2.java index 956ad7d0b..ed2750fd1 100644 --- a/src/class176/Code07_MachineLearning2.java +++ b/src/class176/Code07_MachineLearning2.java @@ -1,6 +1,12 @@ package class176; // 机器学习,C++版 +// 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 +// 操作 1 l r : arr[l..r]范围上,每种数字出现的次数,假设构成一个集合 +// 打印这个集合中,没出现的最小非负整数,就是打印次数的mex +// 操作 2 pos val : 把arr[pos]的值设置成val +// 1 <= n、m <= 10^5 +// 1 <= arr[i]、val <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF940F // 测试链接 : https://codeforces.com/problemset/problem/940/F // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class176/Code08_MinimumDifference1.java b/src/class176/Code08_MinimumDifference1.java index befeaa9b2..407cd784e 100644 --- a/src/class176/Code08_MinimumDifference1.java +++ b/src/class176/Code08_MinimumDifference1.java @@ -1,6 +1,13 @@ package class176; // 最小化极差,java版 +// 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 +// 操作 1 l r k : arr[l..r]范围上,选出k个真的出现并且互不相同的数 +// 这些数假设为a1、a2 .. ak,对应的出现次数假设为cnt1、cnt2 .. cntk +// 打印 max{cnt1 .. cntk} - min{cnt1 .. cntk} 的最小值 +// 如果无法选出k个数,打印-1 +// 操作 2 pos val : 把arr[pos]的值设置成val +// 1 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1476G // 测试链接 : https://codeforces.com/problemset/problem/1476/G // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class176/Code08_MinimumDifference2.java b/src/class176/Code08_MinimumDifference2.java index 49de4b7eb..ffc3a61a0 100644 --- a/src/class176/Code08_MinimumDifference2.java +++ b/src/class176/Code08_MinimumDifference2.java @@ -1,6 +1,13 @@ package class176; // 最小化极差,C++版 +// 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 +// 操作 1 l r k : arr[l..r]范围上,选出k个真的出现并且互不相同的数 +// 这些数假设为a1、a2 .. ak,对应的出现次数假设为cnt1、cnt2 .. cntk +// 打印 max{cnt1 .. cntk} - min{cnt1 .. cntk} 的最小值 +// 如果无法选出k个数,打印-1 +// 操作 2 pos val : 把arr[pos]的值设置成val +// 1 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1476G // 测试链接 : https://codeforces.com/problemset/problem/1476/G // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 2025ebafe623eb8293d2d7477be5f44374c8ee54 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 17 Aug 2025 16:45:29 +0800 Subject: [PATCH 0589/1170] modify code --- src/class176/Code06_CountingColors1.java | 26 ++---------------------- src/class176/Code06_CountingColors2.java | 18 ++-------------- 2 files changed, 4 insertions(+), 40 deletions(-) diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_CountingColors1.java index addd6c3c4..4ea1da41a 100644 --- a/src/class176/Code06_CountingColors1.java +++ b/src/class176/Code06_CountingColors1.java @@ -18,8 +18,7 @@ public class Code06_CountingColors1 { - // 带修莫队经典排序 - public static class QueryCmp1 implements Comparator { + public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { @@ -34,26 +33,6 @@ public int compare(int[] a, int[] b) { } - // 带修莫队奇偶排序 - public static class QueryCmp2 implements Comparator { - - @Override - public int compare(int[] a, int[] b) { - if (bi[a[0]] != bi[b[0]]) { - return bi[a[0]] - bi[b[0]]; - } - if (bi[a[1]] != bi[b[1]]) { - if ((bi[a[0]] & 1) == 1) { - return bi[a[1]] - bi[b[1]]; - } else { - return bi[b[1]] - bi[a[1]]; - } - } - return a[2] - b[2]; - } - - } - public static int MAXN = 200001; public static int MAXV = 1000001; public static int n, m; @@ -97,8 +76,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - // Arrays.sort(query, 1, cntq + 1, new QueryCmp1()); - Arrays.sort(query, 1, cntq + 1, new QueryCmp2()); + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); } public static void compute() { diff --git a/src/class176/Code06_CountingColors2.java b/src/class176/Code06_CountingColors2.java index 547eaa0ac..61803d938 100644 --- a/src/class176/Code06_CountingColors2.java +++ b/src/class176/Code06_CountingColors2.java @@ -36,7 +36,7 @@ //int ans[MAXN]; //int kind; // -//bool QueryCmp1(Query &a, Query &b) { +//bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } @@ -46,20 +46,6 @@ // return a.t < b.t; //} // -//bool QueryCmp2(Query &a, Query &b) { -// if (bi[a.l] != bi[b.l]) { -// return bi[a.l] < bi[b.l]; -// } -// if (bi[a.r] != bi[b.r]) { -// if ((bi[a.l] & 1) == 1) { -// return bi[a.r] < bi[b.r]; -// } else { -// return bi[a.r] > bi[b.r]; -// } -// } -// return a.t < b.t; -//} -// //void del(int num) { // if (--cnt[num] == 0) { // kind--; @@ -89,7 +75,7 @@ // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } -// sort(query + 1, query + cntq + 1, QueryCmp2); +// sort(query + 1, query + cntq + 1, QueryCmp); //} // //void compute() { From 3b6310684a0fd122e694e425e6fc0c6ee00230f9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 17 Aug 2025 17:41:13 +0800 Subject: [PATCH 0590/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 2 +- src/class176/Code01_MoAlgorithm2.java | 2 +- src/class176/Code06_CountingColors1.java | 2 +- src/class176/Code06_CountingColors2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index 556220cd1..b6aa6f456 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -1,6 +1,6 @@ package class176; -// 普通莫队模版题,java版 +// 普通莫队入门题,java版 // 给定一个长度为n的数组arr,一共有q条查询,格式如下 // 查询 l r : 打印arr[l..r]范围上有几种不同的数字 // 1 <= n <= 3 * 10^4 diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java index affc321fd..38c07d6ed 100644 --- a/src/class176/Code01_MoAlgorithm2.java +++ b/src/class176/Code01_MoAlgorithm2.java @@ -1,6 +1,6 @@ package class176; -// 普通莫队模版题,C++版 +// 普通莫队入门题,C++版 // 给定一个长度为n的数组arr,一共有q条查询,格式如下 // 查询 l r : 打印arr[l..r]范围上有几种不同的数字 // 1 <= n <= 3 * 10^4 diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_CountingColors1.java index 4ea1da41a..be7c45270 100644 --- a/src/class176/Code06_CountingColors1.java +++ b/src/class176/Code06_CountingColors1.java @@ -1,6 +1,6 @@ package class176; -// 数颜色,java版 +// 带修莫队入门题,java版 // 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 // 操作 Q l r : 打印arr[l..r]范围上有几种不同的数 // 操作 R pos val : 把arr[pos]的值设置成val diff --git a/src/class176/Code06_CountingColors2.java b/src/class176/Code06_CountingColors2.java index 61803d938..7b7adcfe4 100644 --- a/src/class176/Code06_CountingColors2.java +++ b/src/class176/Code06_CountingColors2.java @@ -1,6 +1,6 @@ package class176; -// 数颜色,C++版 +// 带修莫队入门题,C++版 // 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 // 操作 Q l r : 打印arr[l..r]范围上有几种不同的数 // 操作 R pos val : 把arr[pos]的值设置成val From 3bfa9fe8d0ca7ef2e26ebe66059666dd7fe3fb7e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 18 Aug 2025 10:39:53 +0800 Subject: [PATCH 0591/1170] modify code --- .../{Code06_CountingColors1.java => Code06_MoWithModify1.java} | 2 +- .../{Code06_CountingColors2.java => Code06_MoWithModify2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class176/{Code06_CountingColors1.java => Code06_MoWithModify1.java} (99%) rename src/class176/{Code06_CountingColors2.java => Code06_MoWithModify2.java} (100%) diff --git a/src/class176/Code06_CountingColors1.java b/src/class176/Code06_MoWithModify1.java similarity index 99% rename from src/class176/Code06_CountingColors1.java rename to src/class176/Code06_MoWithModify1.java index be7c45270..025504dee 100644 --- a/src/class176/Code06_CountingColors1.java +++ b/src/class176/Code06_MoWithModify1.java @@ -16,7 +16,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code06_CountingColors1 { +public class Code06_MoWithModify1 { public static class QueryCmp implements Comparator { diff --git a/src/class176/Code06_CountingColors2.java b/src/class176/Code06_MoWithModify2.java similarity index 100% rename from src/class176/Code06_CountingColors2.java rename to src/class176/Code06_MoWithModify2.java From 7c68f909d9552aa0d71babbfe014884679be9895 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 18 Aug 2025 11:25:09 +0800 Subject: [PATCH 0592/1170] modify code --- src/class176/Code02_QueryFromB1.java | 3 ++- src/class176/Code02_QueryFromB2.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class176/Code02_QueryFromB1.java b/src/class176/Code02_QueryFromB1.java index 519a40065..d703c9909 100644 --- a/src/class176/Code02_QueryFromB1.java +++ b/src/class176/Code02_QueryFromB1.java @@ -2,7 +2,8 @@ // 小B的询问,java版 // 给定一个长度为n的数组arr,所有数字在[1..k]范围上 -// 定义f(i) = i这种数的出现次数的平方,一共有m条查询,格式如下 +// 定义f(i) = i这种数的出现次数的平方 +// 一共有m条查询,格式如下 // 查询 l r : arr[l..r]范围上,打印 f(1) + f(2) + .. + f(k) 的值 // 1 <= n、m、k <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P2709 diff --git a/src/class176/Code02_QueryFromB2.java b/src/class176/Code02_QueryFromB2.java index 5d3cb08d6..57ba95552 100644 --- a/src/class176/Code02_QueryFromB2.java +++ b/src/class176/Code02_QueryFromB2.java @@ -2,7 +2,8 @@ // 小B的询问,C++版 // 给定一个长度为n的数组arr,所有数字在[1..k]范围上 -// 定义f(i) = i这种数的出现次数的平方,一共有m条查询,格式如下 +// 定义f(i) = i这种数的出现次数的平方 +// 一共有m条查询,格式如下 // 查询 l r : arr[l..r]范围上,打印 f(1) + f(2) + .. + f(k) 的值 // 1 <= n、m、k <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P2709 From 44fce2ef88deab4bdf97a3f51b8c9b65e99c2f55 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 18 Aug 2025 11:40:11 +0800 Subject: [PATCH 0593/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 2 +- src/class176/Code01_MoAlgorithm2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index b6aa6f456..41b7adf28 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -58,8 +58,8 @@ public int compare(int[] a, int[] b) { public static int[] bi = new int[MAXN]; public static int[] cnt = new int[MAXV]; - public static int kind = 0; public static int[] ans = new int[MAXQ]; + public static int kind = 0; public static void del(int num) { if (--cnt[num] == 0) { diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java index 38c07d6ed..ca245a000 100644 --- a/src/class176/Code01_MoAlgorithm2.java +++ b/src/class176/Code01_MoAlgorithm2.java @@ -28,8 +28,8 @@ // //int bi[MAXN]; //int cnt[MAXV]; -//int kind = 0; //int ans[MAXQ]; +//int kind = 0; // //bool QueryCmp1(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { From 41e1890275db017d0c8bef9d4993e74f548793b4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 15:01:43 +0800 Subject: [PATCH 0594/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 25 +++++++++++++------------ src/class176/Code01_MoAlgorithm2.java | 3 ++- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index 41b7adf28..2f7a464fb 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -19,6 +19,19 @@ public class Code01_MoAlgorithm1 { + public static int MAXN = 30001; + public static int MAXV = 1000001; + public static int MAXQ = 200001; + public static int n, q; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXQ][3]; // jobl, jobr, 问题id + + public static int[] bi = new int[MAXN]; + public static int[] cnt = new int[MAXV]; + public static int kind = 0; + + public static int[] ans = new int[MAXQ]; + // 普通莫队经典排序 public static class QueryCmp1 implements Comparator { @@ -49,18 +62,6 @@ public int compare(int[] a, int[] b) { } - public static int MAXN = 30001; - public static int MAXV = 1000001; - public static int MAXQ = 200001; - public static int n, q; - public static int[] arr = new int[MAXN]; - public static int[][] query = new int[MAXQ][3]; - - public static int[] bi = new int[MAXN]; - public static int[] cnt = new int[MAXV]; - public static int[] ans = new int[MAXQ]; - public static int kind = 0; - public static void del(int num) { if (--cnt[num] == 0) { kind--; diff --git a/src/class176/Code01_MoAlgorithm2.java b/src/class176/Code01_MoAlgorithm2.java index ca245a000..137e14ab7 100644 --- a/src/class176/Code01_MoAlgorithm2.java +++ b/src/class176/Code01_MoAlgorithm2.java @@ -28,9 +28,10 @@ // //int bi[MAXN]; //int cnt[MAXV]; -//int ans[MAXQ]; //int kind = 0; // +//int ans[MAXQ]; +// //bool QueryCmp1(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; From f12d817ceb9e74f6a06f20a1d62d3d72a2ac79c1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 15:02:49 +0800 Subject: [PATCH 0595/1170] modify code --- src/class176/Code01_MoAlgorithm1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class176/Code01_MoAlgorithm1.java b/src/class176/Code01_MoAlgorithm1.java index 2f7a464fb..1c0a4458b 100644 --- a/src/class176/Code01_MoAlgorithm1.java +++ b/src/class176/Code01_MoAlgorithm1.java @@ -24,7 +24,8 @@ public class Code01_MoAlgorithm1 { public static int MAXQ = 200001; public static int n, q; public static int[] arr = new int[MAXN]; - public static int[][] query = new int[MAXQ][3]; // jobl, jobr, 问题id + // jobl, jobr, 问题id + public static int[][] query = new int[MAXQ][3]; public static int[] bi = new int[MAXN]; public static int[] cnt = new int[MAXV]; From d90d6fe9801e503811c175c6dfb4a4da1864e62f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 15:31:13 +0800 Subject: [PATCH 0596/1170] modify code --- src/class176/Code02_QueryFromB1.java | 10 ++++++---- src/class176/Code02_QueryFromB2.java | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/class176/Code02_QueryFromB1.java b/src/class176/Code02_QueryFromB1.java index d703c9909..92e1a508f 100644 --- a/src/class176/Code02_QueryFromB1.java +++ b/src/class176/Code02_QueryFromB1.java @@ -37,17 +37,19 @@ public int compare(int[] a, int[] b) { public static int[] bi = new int[MAXN]; public static int[] cnt = new int[MAXN]; - public static long sum = 0; - public static long[] ans = new long[MAXN]; + public static int sum = 0; + public static int[] ans = new int[MAXN]; public static void del(int num) { - sum -= 2 * cnt[num] - 1; + sum -= cnt[num] * cnt[num]; cnt[num]--; + sum += cnt[num] * cnt[num]; } public static void add(int num) { - sum += 2 * cnt[num] + 1; + sum -= cnt[num] * cnt[num]; cnt[num]++; + sum += cnt[num] * cnt[num]; } public static void prepare() { diff --git a/src/class176/Code02_QueryFromB2.java b/src/class176/Code02_QueryFromB2.java index 57ba95552..a0d86f55a 100644 --- a/src/class176/Code02_QueryFromB2.java +++ b/src/class176/Code02_QueryFromB2.java @@ -25,8 +25,8 @@ // //int bi[MAXN]; //int cnt[MAXN]; -//long long sum = 0; -//long long ans[MAXN]; +//int sum = 0; +//int ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { @@ -36,13 +36,15 @@ //} // //void del(int num) { -// sum -= 2 * cnt[num] - 1; +// sum -= cnt[num] * cnt[num]; // cnt[num]--; +// sum += cnt[num] * cnt[num]; //} // //void add(int num) { -// sum += 2 * cnt[num] + 1; +// sum -= cnt[num] * cnt[num]; // cnt[num]++; +// sum += cnt[num] * cnt[num]; //} // //void prepare() { From 10e19aadc78ab7323d4e5f4bce6ffe44c463cd55 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 16:50:11 +0800 Subject: [PATCH 0597/1170] modify code --- src/class176/Code02_QueryFromB1.java | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/class176/Code02_QueryFromB1.java b/src/class176/Code02_QueryFromB1.java index 92e1a508f..61d51c4ed 100644 --- a/src/class176/Code02_QueryFromB1.java +++ b/src/class176/Code02_QueryFromB1.java @@ -18,6 +18,18 @@ public class Code02_QueryFromB1 { + public static int MAXN = 50001; + public static int n, m, k; + public static int[] arr = new int[MAXN]; + // jobl, jobr, 问题id + public static int[][] query = new int[MAXN][3]; + + public static int[] bi = new int[MAXN]; + public static int[] cnt = new int[MAXN]; + public static int sum = 0; + + public static int[] ans = new int[MAXN]; + public static class QueryCmp implements Comparator { @Override @@ -30,16 +42,6 @@ public int compare(int[] a, int[] b) { } - public static int MAXN = 50001; - public static int n, m, k; - public static int[] arr = new int[MAXN]; - public static int[][] query = new int[MAXN][3]; - - public static int[] bi = new int[MAXN]; - public static int[] cnt = new int[MAXN]; - public static int sum = 0; - public static int[] ans = new int[MAXN]; - public static void del(int num) { sum -= cnt[num] * cnt[num]; cnt[num]--; From c6968ffe87bc913dcbd0aacb45c4c3e4025a994d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 17:02:00 +0800 Subject: [PATCH 0598/1170] modify code --- src/class176/Code03_SockFromZ1.java | 26 +++++++++++++------------- src/class176/Code03_SockFromZ2.java | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/class176/Code03_SockFromZ1.java b/src/class176/Code03_SockFromZ1.java index c26f66b01..32df429be 100644 --- a/src/class176/Code03_SockFromZ1.java +++ b/src/class176/Code03_SockFromZ1.java @@ -2,8 +2,8 @@ // 小Z的袜子,java版 // 给定一个长度为n的数组arr,一共有m条查询,格式如下 -// 查询 l r : arr[l..r]范围上,如果随机选两个数,打印数字相同的概率 -// 打印的结果用分数的形式表达,并且约分到最简的形式 +// 查询 l r : arr[l..r]范围上,随机选不同位置的两个数,打印数值相同的概率 +// 概率用分数的形式表达,并且约分到最简的形式 // 1 <= n、m、arr[i] <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P1494 // 提交以下的code,提交时请把类名改成"Main" @@ -20,6 +20,17 @@ public class Code03_SockFromZ1 { + public static int MAXN = 50001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + + public static int[] bi = new int[MAXN]; + public static int[] cnt = new int[MAXN]; + public static long sum = 0; + public static long[] ans1 = new long[MAXN]; + public static long[] ans2 = new long[MAXN]; + public static class QueryCmp implements Comparator { @Override @@ -32,17 +43,6 @@ public int compare(int[] a, int[] b) { } - public static int MAXN = 50001; - public static int n, m; - public static int[] arr = new int[MAXN]; - public static int[][] query = new int[MAXN][3]; - - public static int[] bi = new int[MAXN]; - public static int[] cnt = new int[MAXN]; - public static long sum = 0; - public static long[] ans1 = new long[MAXN]; - public static long[] ans2 = new long[MAXN]; - public static long gcd(long a, long b) { return b == 0 ? a : gcd(b, a % b); } diff --git a/src/class176/Code03_SockFromZ2.java b/src/class176/Code03_SockFromZ2.java index 7a7c9832b..814bbf2da 100644 --- a/src/class176/Code03_SockFromZ2.java +++ b/src/class176/Code03_SockFromZ2.java @@ -2,8 +2,8 @@ // 小Z的袜子,C++版 // 给定一个长度为n的数组arr,一共有m条查询,格式如下 -// 查询 l r : arr[l..r]范围上,如果随机选两个数,打印数字相同的概率 -// 打印的结果用分数的形式表达,并且约分到最简的形式 +// 查询 l r : arr[l..r]范围上,随机选不同位置的两个数,打印数值相同的概率 +// 概率用分数的形式表达,并且约分到最简的形式 // 1 <= n、m、arr[i] <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P1494 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 6e75ef36668cee834b5d3d50bd724ad441851d22 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 17:23:19 +0800 Subject: [PATCH 0599/1170] modify code --- src/class176/Code03_SockFromZ1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class176/Code03_SockFromZ1.java b/src/class176/Code03_SockFromZ1.java index 32df429be..49c029739 100644 --- a/src/class176/Code03_SockFromZ1.java +++ b/src/class176/Code03_SockFromZ1.java @@ -28,7 +28,10 @@ public class Code03_SockFromZ1 { public static int[] bi = new int[MAXN]; public static int[] cnt = new int[MAXN]; public static long sum = 0; + + // 每个查询的分子的值 public static long[] ans1 = new long[MAXN]; + // 每个查询的分母的值 public static long[] ans2 = new long[MAXN]; public static class QueryCmp implements Comparator { From 903ebc497fa5675bc1825208d55b4f67d55239fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 17:40:26 +0800 Subject: [PATCH 0600/1170] modify code --- src/class176/Code04_BloodyString1.java | 28 +++++++++++++++----------- src/class176/Code04_BloodyString2.java | 3 ++- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index bb450bd1e..bb547c4a4 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -17,6 +17,22 @@ public class Code04_BloodyString1 { + public static int MAXN = 200001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[] sorted = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + public static int[] bi = new int[MAXN]; + + // cnt1[i] = j,表示窗口内,i这种数出现的次数为j + // cnt2[i] = j,表示窗口内,出现次数为i的数,一共有j种 + // maxCnt表示窗口内众数的次数 + public static int[] cnt1 = new int[MAXN]; + public static int[] cnt2 = new int[MAXN]; + public static int maxCnt = 0; + + public static int[] ans = new int[MAXN]; + public static class QueryCmp implements Comparator { @Override @@ -29,18 +45,6 @@ public int compare(int[] a, int[] b) { } - public static int MAXN = 200001; - public static int n, m; - public static int[] arr = new int[MAXN]; - public static int[] sorted = new int[MAXN]; - public static int[][] query = new int[MAXN][3]; - - public static int[] bi = new int[MAXN]; - public static int[] cnt1 = new int[MAXN]; - public static int[] cnt2 = new int[MAXN]; - public static int maxCnt = 0; - public static int[] ans = new int[MAXN]; - public static int kth(int len, int num) { int left = 1, right = len, mid, ret = 0; while (left <= right) { diff --git a/src/class176/Code04_BloodyString2.java b/src/class176/Code04_BloodyString2.java index a323ee170..27b259897 100644 --- a/src/class176/Code04_BloodyString2.java +++ b/src/class176/Code04_BloodyString2.java @@ -22,11 +22,12 @@ //int arr[MAXN]; //int sorted[MAXN]; //Query query[MAXN]; -// //int bi[MAXN]; +// //int cnt1[MAXN]; //int cnt2[MAXN]; //int maxCnt = 0; +// //int ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { From eaaf377449bc6d6452827e1f790debb12a24056e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 17:47:18 +0800 Subject: [PATCH 0601/1170] modify code --- src/class176/Code04_BloodyString1.java | 6 ++++-- src/class176/Code04_BloodyString2.java | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index bb547c4a4..7a347315d 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -64,12 +64,14 @@ public static void del(int num) { maxCnt--; } cnt2[cnt1[num]]--; - cnt2[--cnt1[num]]++; + cnt1[num]--; + cnt2[cnt1[num]]++; } public static void add(int num) { cnt2[cnt1[num]]--; - cnt2[++cnt1[num]]++; + cnt1[num]++; + cnt2[cnt1[num]]++; maxCnt = Math.max(maxCnt, cnt1[num]); } diff --git a/src/class176/Code04_BloodyString2.java b/src/class176/Code04_BloodyString2.java index 27b259897..b76d12013 100644 --- a/src/class176/Code04_BloodyString2.java +++ b/src/class176/Code04_BloodyString2.java @@ -56,15 +56,15 @@ // maxCnt--; // } // cnt2[cnt1[num]]--; -// cnt2[--cnt1[num]]++; +// cnt1[num]--; +// cnt2[cnt1[num]]++; //} // //void add(int num) { // cnt2[cnt1[num]]--; -// cnt2[++cnt1[num]]++; -// if (cnt1[num] > maxCnt) { -// maxCnt = cnt1[num]; -// } +// cnt1[num]++; +// cnt2[cnt1[num]]++; +// maxCnt = max(maxCnt, cnt1[num]); //} // //void prepare() { From 255f7c9b323a909e35fbe68576d814146239274d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 17:49:11 +0800 Subject: [PATCH 0602/1170] modify code --- src/class176/Code04_BloodyString1.java | 2 +- src/class176/Code04_BloodyString2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index 7a347315d..66d35b4bc 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -2,7 +2,7 @@ // 大爷的字符串题,java版 // 给定一个长度为n的数组arr,一共有m条查询,格式如下 -// 查询 l r : arr[l..r]范围上,众数出现了几次,打印其相反数 +// 查询 l r : arr[l..r]范围上,众数出现了几次,打印次数的相反数 // 1 <= n、m <= 2 * 10^5 // 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3709 diff --git a/src/class176/Code04_BloodyString2.java b/src/class176/Code04_BloodyString2.java index b76d12013..eed031769 100644 --- a/src/class176/Code04_BloodyString2.java +++ b/src/class176/Code04_BloodyString2.java @@ -2,7 +2,7 @@ // 大爷的字符串题,C++版 // 给定一个长度为n的数组arr,一共有m条查询,格式如下 -// 查询 l r : arr[l..r]范围上,众数出现了几次,打印其相反数 +// 查询 l r : arr[l..r]范围上,众数出现了几次,打印次数的相反数 // 1 <= n、m <= 2 * 10^5 // 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3709 From 5b83ac4629f71b33f0e460c8800b6fb29c4e13c3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 17:53:29 +0800 Subject: [PATCH 0603/1170] modify code --- src/class176/Code04_BloodyString1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index 66d35b4bc..57b375341 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -24,8 +24,8 @@ public class Code04_BloodyString1 { public static int[][] query = new int[MAXN][3]; public static int[] bi = new int[MAXN]; - // cnt1[i] = j,表示窗口内,i这种数出现的次数为j - // cnt2[i] = j,表示窗口内,出现次数为i的数,一共有j种 + // cnt1[i] = j,表示窗口内,数字i出现了j次 + // cnt2[i] = j,表示窗口内,出现了i次的数,有j种 // maxCnt表示窗口内众数的次数 public static int[] cnt1 = new int[MAXN]; public static int[] cnt2 = new int[MAXN]; From 9c867c7799af80a947fbd163433b3a84c7bf3f23 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 17:54:03 +0800 Subject: [PATCH 0604/1170] modify code --- src/class176/Code04_BloodyString1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index 57b375341..77e842ffb 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -26,7 +26,7 @@ public class Code04_BloodyString1 { // cnt1[i] = j,表示窗口内,数字i出现了j次 // cnt2[i] = j,表示窗口内,出现了i次的数,有j种 - // maxCnt表示窗口内众数的次数 + // maxCnt,表示窗口内,众数的次数 public static int[] cnt1 = new int[MAXN]; public static int[] cnt2 = new int[MAXN]; public static int maxCnt = 0; From c37c86a106564b130858211f83f7d2b19eec5d87 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 18:34:51 +0800 Subject: [PATCH 0605/1170] modify code --- src/class176/Code05_XorSequence1.java | 26 +++++++++++++------------- src/class176/Code05_XorSequence2.java | 8 ++++---- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/class176/Code05_XorSequence1.java b/src/class176/Code05_XorSequence1.java index 7b37c1a99..0841238e0 100644 --- a/src/class176/Code05_XorSequence1.java +++ b/src/class176/Code05_XorSequence1.java @@ -16,6 +16,19 @@ public class Code05_XorSequence1 { + public static int MAXN = 100001; + public static int MAXS = 1 << 20; + public static int n, m, k; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + + public static int[] bi = new int[MAXN]; + public static int[] pre = new int[MAXN]; + public static long[] cnt = new long[MAXS]; + public static long cur; + + public static long[] ans = new long[MAXN]; + public static class QueryCmp implements Comparator { @Override @@ -28,19 +41,6 @@ public int compare(int[] a, int[] b) { } - public static int MAXN = 100001; - public static int MAXK = 1 << 20; - public static int n, m, k; - public static int[] arr = new int[MAXN]; - public static int[][] query = new int[MAXN][3]; - - public static int[] pre = new int[MAXN]; - public static int[] bi = new int[MAXN]; - - public static long[] cnt = new long[MAXK]; - public static long[] ans = new long[MAXN]; - public static long cur; - public static void del(int x) { if (k != 0) { cur -= cnt[x] * cnt[x ^ k]; diff --git a/src/class176/Code05_XorSequence2.java b/src/class176/Code05_XorSequence2.java index 62f4e2b50..841569e86 100644 --- a/src/class176/Code05_XorSequence2.java +++ b/src/class176/Code05_XorSequence2.java @@ -17,17 +17,17 @@ //}; // //const int MAXN = 100001; -//const int MAXK = 1 << 20; +//const int MAXS = 1 << 20; //int n, m, k; //int arr[MAXN]; //Query query[MAXN]; // -//int pre[MAXN]; //int bi[MAXN]; +//int pre[MAXN]; +//long long cnt[MAXS]; +//long long cur; // -//long long cnt[MAXK]; //long long ans[MAXN]; -//long long cur; // //bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { From c7661c36175336b46ad232b2350e18a75aaa05ec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 18:48:48 +0800 Subject: [PATCH 0606/1170] modify code --- src/class176/Code05_XorSequence1.java | 6 ++++-- src/class176/Code05_XorSequence2.java | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/class176/Code05_XorSequence1.java b/src/class176/Code05_XorSequence1.java index 0841238e0..be0ebcf5e 100644 --- a/src/class176/Code05_XorSequence1.java +++ b/src/class176/Code05_XorSequence1.java @@ -21,12 +21,14 @@ public class Code05_XorSequence1 { public static int n, m, k; public static int[] arr = new int[MAXN]; public static int[][] query = new int[MAXN][3]; - public static int[] bi = new int[MAXN]; + + // pre[i] == x,表示前i个数字的前缀异或和为x public static int[] pre = new int[MAXN]; + // cnt[x] = a,表示窗口内,前缀异或和x,一共有a个 public static long[] cnt = new long[MAXS]; + // cur表示窗口内,异或和为k的子数组数量 public static long cur; - public static long[] ans = new long[MAXN]; public static class QueryCmp implements Comparator { diff --git a/src/class176/Code05_XorSequence2.java b/src/class176/Code05_XorSequence2.java index 841569e86..aa6c68d7a 100644 --- a/src/class176/Code05_XorSequence2.java +++ b/src/class176/Code05_XorSequence2.java @@ -21,12 +21,11 @@ //int n, m, k; //int arr[MAXN]; //Query query[MAXN]; -// //int bi[MAXN]; +// //int pre[MAXN]; //long long cnt[MAXS]; //long long cur; -// //long long ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { From eff2f20b5e447e603435332f858dd55b76c34305 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 20:59:31 +0800 Subject: [PATCH 0607/1170] modify code --- src/class176/Code05_XorSequence1.java | 26 ++++++++++++++------------ src/class176/Code05_XorSequence2.java | 20 ++++++++++---------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/class176/Code05_XorSequence1.java b/src/class176/Code05_XorSequence1.java index be0ebcf5e..5c84033b6 100644 --- a/src/class176/Code05_XorSequence1.java +++ b/src/class176/Code05_XorSequence1.java @@ -27,8 +27,8 @@ public class Code05_XorSequence1 { public static int[] pre = new int[MAXN]; // cnt[x] = a,表示窗口内,前缀异或和x,一共有a个 public static long[] cnt = new long[MAXS]; - // cur表示窗口内,异或和为k的子数组数量 - public static long cur; + // num表示窗口内,异或和为k的子数组数量 + public static long num; public static long[] ans = new long[MAXN]; public static class QueryCmp implements Comparator { @@ -43,31 +43,33 @@ public int compare(int[] a, int[] b) { } + // 前缀异或和x要删除一次 public static void del(int x) { if (k != 0) { - cur -= cnt[x] * cnt[x ^ k]; + num -= cnt[x] * cnt[x ^ k]; } else { - cur -= (cnt[x] * (cnt[x] - 1)) >> 1; + num -= (cnt[x] * (cnt[x] - 1)) >> 1; } cnt[x]--; if (k != 0) { - cur += cnt[x] * cnt[x ^ k]; + num += cnt[x] * cnt[x ^ k]; } else { - cur += (cnt[x] * (cnt[x] - 1)) >> 1; + num += (cnt[x] * (cnt[x] - 1)) >> 1; } } + // 前缀异或和x要增加一次 public static void add(int x) { if (k != 0) { - cur -= cnt[x] * cnt[x ^ k]; + num -= cnt[x] * cnt[x ^ k]; } else { - cur -= (cnt[x] * (cnt[x] - 1)) >> 1; + num -= (cnt[x] * (cnt[x] - 1)) >> 1; } cnt[x]++; if (k != 0) { - cur += cnt[x] * cnt[x ^ k]; + num += cnt[x] * cnt[x ^ k]; } else { - cur += (cnt[x] * (cnt[x] - 1)) >> 1; + num += (cnt[x] * (cnt[x] - 1)) >> 1; } } @@ -85,7 +87,7 @@ public static void prepare() { public static void compute() { int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { - // 左边界要-1 + // 窗口[l..r],但是前缀可能性多一种,1..l-1 int jobl = query[i][0] - 1; int jobr = query[i][1]; while (winl > jobl) { @@ -100,7 +102,7 @@ public static void compute() { while (winr > jobr) { del(pre[winr--]); } - ans[query[i][2]] = cur; + ans[query[i][2]] = num; } } diff --git a/src/class176/Code05_XorSequence2.java b/src/class176/Code05_XorSequence2.java index aa6c68d7a..cbba1cacc 100644 --- a/src/class176/Code05_XorSequence2.java +++ b/src/class176/Code05_XorSequence2.java @@ -25,7 +25,7 @@ // //int pre[MAXN]; //long long cnt[MAXS]; -//long long cur; +//long long num; //long long ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { @@ -37,29 +37,29 @@ // //void del(int x) { // if (k != 0) { -// cur -= cnt[x] * cnt[x ^ k]; +// num -= cnt[x] * cnt[x ^ k]; // } else { -// cur -= (cnt[x] * (cnt[x] - 1)) >> 1; +// num -= (cnt[x] * (cnt[x] - 1)) >> 1; // } // cnt[x]--; // if (k != 0) { -// cur += cnt[x] * cnt[x ^ k]; +// num += cnt[x] * cnt[x ^ k]; // } else { -// cur += (cnt[x] * (cnt[x] - 1)) >> 1; +// num += (cnt[x] * (cnt[x] - 1)) >> 1; // } //} // //void add(int x) { // if (k != 0) { -// cur -= cnt[x] * cnt[x ^ k]; +// num -= cnt[x] * cnt[x ^ k]; // } else { -// cur -= (cnt[x] * (cnt[x] - 1)) >> 1; +// num -= (cnt[x] * (cnt[x] - 1)) >> 1; // } // cnt[x]++; // if (k != 0) { -// cur += cnt[x] * cnt[x ^ k]; +// num += cnt[x] * cnt[x ^ k]; // } else { -// cur += (cnt[x] * (cnt[x] - 1)) >> 1; +// num += (cnt[x] * (cnt[x] - 1)) >> 1; // } //} // @@ -91,7 +91,7 @@ // while (winr > jobr) { // del(pre[winr--]); // } -// ans[query[i].id] = cur; +// ans[query[i].id] = num; // } //} // From d67b6ff8c0d16f1add8e2499c80c443424f9b4b8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Aug 2025 21:18:17 +0800 Subject: [PATCH 0608/1170] modify code --- src/class176/Code05_XorSequence1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class176/Code05_XorSequence1.java b/src/class176/Code05_XorSequence1.java index 5c84033b6..8f2375ad8 100644 --- a/src/class176/Code05_XorSequence1.java +++ b/src/class176/Code05_XorSequence1.java @@ -87,7 +87,8 @@ public static void prepare() { public static void compute() { int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { - // 窗口[l..r],但是前缀可能性多一种,1..l-1 + // 任务范围[jobl, jobr],但是前缀可能性会多一种 + // 所以左边界-1 int jobl = query[i][0] - 1; int jobr = query[i][1]; while (winl > jobl) { From f7a9391645546a5b97987d396fdb1b969affb74a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Aug 2025 18:38:54 +0800 Subject: [PATCH 0609/1170] modify code --- src/class176/Code06_MoWithModify1.java | 49 ++++++++++++++------------ src/class176/Code06_MoWithModify2.java | 19 +++++----- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/class176/Code06_MoWithModify1.java b/src/class176/Code06_MoWithModify1.java index 025504dee..b3d681652 100644 --- a/src/class176/Code06_MoWithModify1.java +++ b/src/class176/Code06_MoWithModify1.java @@ -18,6 +18,22 @@ public class Code06_MoWithModify1 { + public static int MAXN = 200001; + public static int MAXV = 1000001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[] bi = new int[MAXN]; + + public static int[][] query = new int[MAXN][4]; + public static int[][] update = new int[MAXN][2]; + public static int cntq, cntu; + + public static int[] cnt = new int[MAXV]; + public static int kind; + + public static int[] ans = new int[MAXN]; + + // 带修莫队的任务排序 public static class QueryCmp implements Comparator { @Override @@ -33,20 +49,6 @@ public int compare(int[] a, int[] b) { } - public static int MAXN = 200001; - public static int MAXV = 1000001; - public static int n, m; - public static int[] arr = new int[MAXN]; - public static int[] bi = new int[MAXN]; - - public static int[][] query = new int[MAXN][4]; - public static int[][] update = new int[MAXN][2]; - public static int cntq, cntu; - - public static int[] cnt = new int[MAXV]; - public static int[] ans = new int[MAXN]; - public static int kind; - public static void del(int num) { if (--cnt[num] == 0) { kind--; @@ -66,19 +68,14 @@ public static void moveTime(int jobl, int jobr, int tim) { del(arr[pos]); add(val); } + // 这里比较巧妙 + // 修改时间点不管前进还是后退 + // 数据只要在arr和update之间交换即可 int tmp = arr[pos]; arr[pos] = val; update[tim][1] = tmp; } - public static void prepare() { - int blen = Math.max(1, (int) Math.pow(n, 2.0 / 3)); - for (int i = 1; i <= n; i++) { - bi[i] = (i - 1) / blen + 1; - } - Arrays.sort(query, 1, cntq + 1, new QueryCmp()); - } - public static void compute() { int winl = 1, winr = 0, wint = 0; for (int i = 1; i <= cntq; i++) { @@ -108,6 +105,14 @@ public static void compute() { } } + public static void prepare() { + int blen = Math.max(1, (int) Math.pow(n, 2.0 / 3)); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + } + public static void main(String[] args) throws Exception { FastReader in = new FastReader(); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); diff --git a/src/class176/Code06_MoWithModify2.java b/src/class176/Code06_MoWithModify2.java index 7b7adcfe4..bf31d940d 100644 --- a/src/class176/Code06_MoWithModify2.java +++ b/src/class176/Code06_MoWithModify2.java @@ -33,9 +33,10 @@ //int cntq, cntu; // //int cnt[MAXV]; -//int ans[MAXN]; //int kind; // +//int ans[MAXN]; +// //bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; @@ -70,14 +71,6 @@ // update[tim].val = tmp; //} // -//void prepare() { -// int blen = max(1, (int)pow(n, 2.0 / 3)); -// for (int i = 1; i <= n; i++) { -// bi[i] = (i - 1) / blen + 1; -// } -// sort(query + 1, query + cntq + 1, QueryCmp); -//} -// //void compute() { // int winl = 1, winr = 0, wint = 0; // for (int i = 1; i <= cntq; i++) { @@ -107,6 +100,14 @@ // } //} // +//void prepare() { +// int blen = max(1, (int)pow(n, 2.0 / 3)); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + cntq + 1, QueryCmp); +//} +// //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); From 7ade0c46d424333032a0288c6b25fe480c23af57 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Aug 2025 18:40:46 +0800 Subject: [PATCH 0610/1170] modify code --- src/class176/Code06_MoWithModify1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class176/Code06_MoWithModify1.java b/src/class176/Code06_MoWithModify1.java index b3d681652..124d67dd7 100644 --- a/src/class176/Code06_MoWithModify1.java +++ b/src/class176/Code06_MoWithModify1.java @@ -69,7 +69,7 @@ public static void moveTime(int jobl, int jobr, int tim) { add(val); } // 这里比较巧妙 - // 修改时间点不管前进还是后退 + // 时间窗口不管前进还是后退 // 数据只要在arr和update之间交换即可 int tmp = arr[pos]; arr[pos] = val; From e4c0badb33619b9f9bf845022430714803abc3f4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Aug 2025 18:41:05 +0800 Subject: [PATCH 0611/1170] modify code --- src/class176/Code06_MoWithModify1.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class176/Code06_MoWithModify1.java b/src/class176/Code06_MoWithModify1.java index 124d67dd7..b759cf6b9 100644 --- a/src/class176/Code06_MoWithModify1.java +++ b/src/class176/Code06_MoWithModify1.java @@ -68,7 +68,6 @@ public static void moveTime(int jobl, int jobr, int tim) { del(arr[pos]); add(val); } - // 这里比较巧妙 // 时间窗口不管前进还是后退 // 数据只要在arr和update之间交换即可 int tmp = arr[pos]; From e21812f9f78f241b6000cce82435472f03d629af Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Aug 2025 22:43:28 +0800 Subject: [PATCH 0612/1170] modify code --- src/class176/Code06_MoWithModify1.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/class176/Code06_MoWithModify1.java b/src/class176/Code06_MoWithModify1.java index b759cf6b9..9f6dba6a7 100644 --- a/src/class176/Code06_MoWithModify1.java +++ b/src/class176/Code06_MoWithModify1.java @@ -24,7 +24,9 @@ public class Code06_MoWithModify1 { public static int[] arr = new int[MAXN]; public static int[] bi = new int[MAXN]; + // 每条查询 : jobl、jobr、jobt、id public static int[][] query = new int[MAXN][4]; + // 每条修改 : pos、val public static int[][] update = new int[MAXN][2]; public static int cntq, cntu; @@ -61,6 +63,8 @@ public static void add(int num) { } } + // jobl..jobr 数组范围 + // tim : 生效或者撤销的修改时间点 public static void moveTime(int jobl, int jobr, int tim) { int pos = update[tim][0]; int val = update[tim][1]; @@ -68,8 +72,7 @@ public static void moveTime(int jobl, int jobr, int tim) { del(arr[pos]); add(val); } - // 时间窗口不管前进还是后退 - // 数据只要在arr和update之间交换即可 + // 不管生效还是撤销,数据只要在arr和update之间交换即可 int tmp = arr[pos]; arr[pos] = val; update[tim][1] = tmp; From f84967d0984c1c0e4e22d83d7141ad785ff0f78c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Aug 2025 14:59:33 +0800 Subject: [PATCH 0613/1170] modify code --- src/class176/Code07_UniqueNumbers1.java | 219 +++++++++++++++++ ...rence2.java => Code07_UniqueNumbers2.java} | 116 +++------ ...ing1.java => Code08_MachineLearning1.java} | 43 ++-- ...ing2.java => Code08_MachineLearning2.java} | 15 +- src/class176/Code08_MinimumDifference1.java | 232 ------------------ 5 files changed, 290 insertions(+), 335 deletions(-) create mode 100644 src/class176/Code07_UniqueNumbers1.java rename src/class176/{Code08_MinimumDifference2.java => Code07_UniqueNumbers2.java} (50%) rename src/class176/{Code07_MachineLearning1.java => Code08_MachineLearning1.java} (97%) rename src/class176/{Code07_MachineLearning2.java => Code08_MachineLearning2.java} (96%) delete mode 100644 src/class176/Code08_MinimumDifference1.java diff --git a/src/class176/Code07_UniqueNumbers1.java b/src/class176/Code07_UniqueNumbers1.java new file mode 100644 index 000000000..8d18790f1 --- /dev/null +++ b/src/class176/Code07_UniqueNumbers1.java @@ -0,0 +1,219 @@ +package class176; + +// 统计出现1次的数,java版 +// 给定一个长度为n的数组arr,下标0~n-1,一共有m条操作,格式如下 +// 操作 1 pos val : 把arr[pos]的值设置成val +// 操作 2 l r : 查询arr[l..r]范围上,有多少种数出现了1次 +// 0 <= n、m、arr[i] <= 2 * 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/SP30906 +// 测试链接 : https://www.spoj.com/problems/ADAUNIQ/ +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code07_UniqueNumbers2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code07_UniqueNumbers1 { + + public static int MAXN = 200001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[] bi = new int[MAXN]; + + public static int[][] query = new int[MAXN][4]; + public static int[][] update = new int[MAXN][2]; + public static int cntq, cntu; + + public static int[] cnt = new int[MAXN]; + public static int curAns = 0; + + public static int[] ans = new int[MAXN]; + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if (bi[a[1]] != bi[b[1]]) { + return bi[a[1]] - bi[b[1]]; + } + return a[2] - b[2]; + } + } + + public static void del(int num) { + if (cnt[num] == 1) { + curAns--; + } + if (cnt[num] == 2) { + curAns++; + } + cnt[num]--; + } + + public static void add(int num) { + if (cnt[num] == 0) { + curAns++; + } + if (cnt[num] == 1) { + curAns--; + } + cnt[num]++; + } + + public static void moveTime(int jobl, int jobr, int tim) { + int pos = update[tim][0]; + int val = update[tim][1]; + if (jobl <= pos && pos <= jobr) { + del(arr[pos]); + add(val); + } + int tmp = arr[pos]; + arr[pos] = val; + update[tim][1] = tmp; + } + + public static void compute() { + int winl = 1, winr = 0, wint = 0; + for (int i = 1; i <= cntq; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int jobt = query[i][2]; + int id = query[i][3]; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); + } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + while (wint < jobt) { + moveTime(jobl, jobr, ++wint); + } + while (wint > jobt) { + moveTime(jobl, jobr, wint--); + } + ans[id] = curAns; + } + } + + public static void prepare() { + int blen = Math.max(1, (int) Math.pow(n, 2.0 / 3)); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1, op, l, r, pos, val; i <= m; i++) { + op = in.nextInt(); + if (op == 1) { + pos = in.nextInt(); + val = in.nextInt(); + cntu++; + update[cntu][0] = pos + 1; + update[cntu][1] = val; + } else { + l = in.nextInt(); + r = in.nextInt(); + cntq++; + query[cntq][0] = l + 1; + query[cntq][1] = r + 1; + query[cntq][2] = cntu; + query[cntq][3] = cntq; + } + } + prepare(); + compute(); + for (int i = 1; i <= cntq; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class176/Code08_MinimumDifference2.java b/src/class176/Code07_UniqueNumbers2.java similarity index 50% rename from src/class176/Code08_MinimumDifference2.java rename to src/class176/Code07_UniqueNumbers2.java index ffc3a61a0..05cba1d82 100644 --- a/src/class176/Code08_MinimumDifference2.java +++ b/src/class176/Code07_UniqueNumbers2.java @@ -1,15 +1,12 @@ package class176; -// 最小化极差,C++版 -// 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 -// 操作 1 l r k : arr[l..r]范围上,选出k个真的出现并且互不相同的数 -// 这些数假设为a1、a2 .. ak,对应的出现次数假设为cnt1、cnt2 .. cntk -// 打印 max{cnt1 .. cntk} - min{cnt1 .. cntk} 的最小值 -// 如果无法选出k个数,打印-1 -// 操作 2 pos val : 把arr[pos]的值设置成val -// 1 <= 所有数据 <= 10^5 -// 测试链接 : https://www.luogu.com.cn/problem/CF1476G -// 测试链接 : https://codeforces.com/problemset/problem/1476/G +// 统计出现1次的数,C++版 +// 给定一个长度为n的数组arr,下标0~n-1,一共有m条操作,格式如下 +// 操作 1 pos val : 把arr[pos]的值设置成val +// 操作 2 l r : 查询arr[l..r]范围上,有多少种数出现了1次 +// 0 <= n、m、arr[i] <= 2 * 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/SP30906 +// 测试链接 : https://www.spoj.com/problems/ADAUNIQ/ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -18,30 +15,25 @@ //using namespace std; // //struct Query { -// int l, r, k, t, id; +// int l, r, t, id; //}; // //struct Update { // int pos, val; //}; // -//const int MAXN = 100001; -//const int MAXB = 3001; +//const int MAXN = 200001; //int n, m; //int arr[MAXN]; //int bi[MAXN]; -//int bl[MAXB]; -//int br[MAXB]; // //Query query[MAXN]; //Update update[MAXN]; //int cntq, cntu; // -//int cnt1[MAXN]; -//int cnt2[MAXN]; -//int sum[MAXB]; -//int cntFreq[MAXN]; -//int freqVal[MAXN]; +//int cnt[MAXN]; +//int curAns; +// //int ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { @@ -55,19 +47,23 @@ //} // //void del(int num) { -// cnt2[cnt1[num]]--; -// sum[bi[cnt1[num]]]--; -// cnt1[num]--; -// cnt2[cnt1[num]]++; -// sum[bi[cnt1[num]]]++; +// if (cnt[num] == 1) { +// curAns--; +// } +// if (cnt[num] == 2) { +// curAns++; +// } +// cnt[num]--; //} // //void add(int num) { -// cnt2[cnt1[num]]--; -// sum[bi[cnt1[num]]]--; -// cnt1[num]++; -// cnt2[cnt1[num]]++; -// sum[bi[cnt1[num]]]++; +// if (cnt[num] == 0) { +// curAns++; +// } +// if (cnt[num] == 1) { +// curAns--; +// } +// cnt[num]++; //} // //void moveTime(int jobl, int jobr, int tim) { @@ -82,41 +78,13 @@ // update[tim].val = tmp; //} // -//int getAns(int k) { -// int size = 0; -// for (int b = 1; b <= bi[n]; b++) { -// if (sum[b] != 0) { -// for (int f = bl[b]; f <= br[b]; f++) { -// if (cnt2[f] > 0) { -// cntFreq[++size] = cnt2[f]; -// freqVal[size] = f; -// } -// } -// } -// } -// int minDiff = INT_MAX; -// int cntSum = 0; -// for (int l = 1, r = 0; l <= size; l++) { -// while (cntSum < k && r < size) { -// r++; -// cntSum += cntFreq[r]; -// } -// if (cntSum >= k) { -// minDiff = min(minDiff, freqVal[r] - freqVal[l]); -// } -// cntSum -= cntFreq[l]; -// } -// return minDiff == INT_MAX ? -1 : minDiff; -//} -// //void compute() { // int winl = 1, winr = 0, wint = 0; // for (int i = 1; i <= cntq; i++) { // int jobl = query[i].l; // int jobr = query[i].r; -// int jobk = query[i].k; // int jobt = query[i].t; -// int id = query[i].id; +// int id = query[i].id; // while (winl > jobl) { // add(arr[--winl]); // } @@ -135,20 +103,15 @@ // while (wint > jobt) { // moveTime(jobl, jobr, wint--); // } -// ans[id] = getAns(jobk); -// } +// ans[id] = curAns; +// } //} // //void prepare() { -// int blen = max(1, (int)pow(n, 2.0 / 3.0)); -// int bnum = (n + blen - 1) / blen; +// int blen = max(1, (int)pow(n, 2.0 / 3)); // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } -// for (int i = 1; i <= bnum; i++) { -// bl[i] = (i - 1) * blen + 1; -// br[i] = min(i * blen, n); -// } // sort(query + 1, query + cntq + 1, QueryCmp); //} // @@ -159,21 +122,20 @@ // for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } -// for (int i = 1, op, l, r, k, pos, val; i <= m; i++) { +// for (int i = 1, op, l, r, pos, val; i <= m; i++) { // cin >> op; // if (op == 1) { -// cin >> l >> r >> k; -// cntq++; -// query[cntq].l = l; -// query[cntq].r = r; -// query[cntq].k = k; -// query[cntq].t = cntu; -// query[cntq].id = cntq; -// } else { // cin >> pos >> val; // cntu++; -// update[cntu].pos = pos; +// update[cntu].pos = pos + 1; // update[cntu].val = val; +// } else { +// cin >> l >> r; +// cntq++; +// query[cntq].l = l + 1; +// query[cntq].r = r + 1; +// query[cntq].t = cntu; +// query[cntq].id = cntq; // } // } // prepare(); diff --git a/src/class176/Code07_MachineLearning1.java b/src/class176/Code08_MachineLearning1.java similarity index 97% rename from src/class176/Code07_MachineLearning1.java rename to src/class176/Code08_MachineLearning1.java index a52ff438b..f51730060 100644 --- a/src/class176/Code07_MachineLearning1.java +++ b/src/class176/Code08_MachineLearning1.java @@ -18,20 +18,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code07_MachineLearning1 { - - public static class QueryCmp implements Comparator { - @Override - public int compare(int[] a, int[] b) { - if (bi[a[0]] != bi[b[0]]) { - return bi[a[0]] - bi[b[0]]; - } - if (bi[a[1]] != bi[b[1]]) { - return bi[a[1]] - bi[b[1]]; - } - return a[2] - b[2]; - } - } +public class Code08_MachineLearning1 { public static int MAXN = 100001; public static int n, m; @@ -45,8 +32,22 @@ public int compare(int[] a, int[] b) { public static int[] cnt1 = new int[MAXN << 1]; public static int[] cnt2 = new int[MAXN]; + public static int[] ans = new int[MAXN]; + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if (bi[a[1]] != bi[b[1]]) { + return bi[a[1]] - bi[b[1]]; + } + return a[2] - b[2]; + } + } + public static int kth(int len, int num) { int left = 1, right = len, mid, ret = 0; while (left <= right) { @@ -61,14 +62,16 @@ public static int kth(int len, int num) { return ret; } - public static void add(int num) { - --cnt2[cnt1[num]]; - ++cnt2[++cnt1[num]]; + public static void del(int num) { + cnt2[cnt1[num]]--; + cnt1[num]--; + cnt2[cnt1[num]]++; } - public static void del(int num) { - --cnt2[cnt1[num]]; - ++cnt2[--cnt1[num]]; + public static void add(int num) { + cnt2[cnt1[num]]--; + cnt1[num]++; + cnt2[cnt1[num]]++; } public static void moveTime(int jobl, int jobr, int tim) { diff --git a/src/class176/Code07_MachineLearning2.java b/src/class176/Code08_MachineLearning2.java similarity index 96% rename from src/class176/Code07_MachineLearning2.java rename to src/class176/Code08_MachineLearning2.java index ed2750fd1..065b2be6c 100644 --- a/src/class176/Code07_MachineLearning2.java +++ b/src/class176/Code08_MachineLearning2.java @@ -36,6 +36,7 @@ // //int cnt1[MAXN << 1]; //int cnt2[MAXN]; +// //int ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { @@ -62,14 +63,16 @@ // return ret; //} // -//void add(int num) { -// --cnt2[cnt1[num]]; -// ++cnt2[++cnt1[num]]; +//void del(int num) { +// cnt2[cnt1[num]]--; +// cnt1[num]--; +// cnt2[cnt1[num]]++; //} // -//void del(int num) { -// --cnt2[cnt1[num]]; -// ++cnt2[--cnt1[num]]; +//void add(int num) { +// cnt2[cnt1[num]]--; +// cnt1[num]++; +// cnt2[cnt1[num]]++; //} // //void moveTime(int jobl, int jobr, int tim) { diff --git a/src/class176/Code08_MinimumDifference1.java b/src/class176/Code08_MinimumDifference1.java deleted file mode 100644 index 407cd784e..000000000 --- a/src/class176/Code08_MinimumDifference1.java +++ /dev/null @@ -1,232 +0,0 @@ -package class176; - -// 最小化极差,java版 -// 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 -// 操作 1 l r k : arr[l..r]范围上,选出k个真的出现并且互不相同的数 -// 这些数假设为a1、a2 .. ak,对应的出现次数假设为cnt1、cnt2 .. cntk -// 打印 max{cnt1 .. cntk} - min{cnt1 .. cntk} 的最小值 -// 如果无法选出k个数,打印-1 -// 操作 2 pos val : 把arr[pos]的值设置成val -// 1 <= 所有数据 <= 10^5 -// 测试链接 : https://www.luogu.com.cn/problem/CF1476G -// 测试链接 : https://codeforces.com/problemset/problem/1476/G -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.util.Arrays; -import java.util.Comparator; - -public class Code08_MinimumDifference1 { - - public static class QueryCmp implements Comparator { - @Override - public int compare(int[] a, int[] b) { - if (bi[a[0]] != bi[b[0]]) { - return bi[a[0]] - bi[b[0]]; - } - if (bi[a[1]] != bi[b[1]]) { - return bi[a[1]] - bi[b[1]]; - } - return a[3] - b[3]; - } - } - - public static int MAXN = 100001; - public static int MAXB = 3001; - public static int n, m; - public static int[] arr = new int[MAXN]; - public static int[] bi = new int[MAXN]; - public static int[] bl = new int[MAXB]; - public static int[] br = new int[MAXB]; - - // query : l, r, k, t, id - // update : pos, val - public static int[][] query = new int[MAXN][5]; - public static int[][] update = new int[MAXN][2]; - public static int cntq, cntu; - - public static int[] cnt1 = new int[MAXN]; - public static int[] cnt2 = new int[MAXN]; - public static int[] sum = new int[MAXB]; - public static int[] cntFreq = new int[MAXN]; - public static int[] freqVal = new int[MAXN]; - public static int[] ans = new int[MAXN]; - - public static void del(int num) { - cnt2[cnt1[num]]--; - sum[bi[cnt1[num]]]--; - cnt1[num]--; - cnt2[cnt1[num]]++; - sum[bi[cnt1[num]]]++; - } - - public static void add(int num) { - cnt2[cnt1[num]]--; - sum[bi[cnt1[num]]]--; - cnt1[num]++; - cnt2[cnt1[num]]++; - sum[bi[cnt1[num]]]++; - } - - public static void moveTime(int jobl, int jobr, int tim) { - int pos = update[tim][0]; - int val = update[tim][1]; - if (jobl <= pos && pos <= jobr) { - del(arr[pos]); - add(val); - } - int tmp = arr[pos]; - arr[pos] = val; - update[tim][1] = tmp; - } - - public static int getAns(int k) { - int size = 0; - for (int b = 1; b <= bi[n]; b++) { - if (sum[b] != 0) { - for (int f = bl[b]; f <= br[b]; f++) { - if (cnt2[f] > 0) { - cntFreq[++size] = cnt2[f]; - freqVal[size] = f; - } - } - } - } - int minDiff = Integer.MAX_VALUE; - int cntSum = 0; - for (int l = 1, r = 0; l <= size; l++) { - while (cntSum < k && r < size) { - r++; - cntSum += cntFreq[r]; - } - if (cntSum >= k) { - minDiff = Math.min(minDiff, freqVal[r] - freqVal[l]); - } - cntSum -= cntFreq[l]; - } - return minDiff == Integer.MAX_VALUE ? -1 : minDiff; - } - - public static void compute() { - int winl = 1, winr = 0, wint = 0; - for (int i = 1; i <= cntq; i++) { - int jobl = query[i][0]; - int jobr = query[i][1]; - int jobk = query[i][2]; - int jobt = query[i][3]; - int id = query[i][4]; - while (winl > jobl) { - add(arr[--winl]); - } - while (winr < jobr) { - add(arr[++winr]); - } - while (winl < jobl) { - del(arr[winl++]); - } - while (winr > jobr) { - del(arr[winr--]); - } - while (wint < jobt) { - moveTime(jobl, jobr, ++wint); - } - while (wint > jobt) { - moveTime(jobl, jobr, wint--); - } - ans[id] = getAns(jobk); - } - } - - public static void prepare() { - int blen = Math.max(1, (int) Math.pow(n, 2.0 / 3)); - int bnum = (n + blen - 1) / blen; - for (int i = 1; i <= n; i++) { - bi[i] = (i - 1) / blen + 1; - } - for (int i = 1; i <= bnum; i++) { - bl[i] = (i - 1) * blen + 1; - br[i] = Math.min(i * blen, n); - } - Arrays.sort(query, 1, cntq + 1, new QueryCmp()); - } - - public static void main(String[] args) throws Exception { - FastReader in = new FastReader(System.in); - PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - n = in.nextInt(); - m = in.nextInt(); - for (int i = 1; i <= n; i++) { - arr[i] = in.nextInt(); - } - for (int i = 1, op, l, r, k, pos, val; i <= m; i++) { - op = in.nextInt(); - if (op == 1) { - l = in.nextInt(); - r = in.nextInt(); - k = in.nextInt(); - cntq++; - query[cntq][0] = l; - query[cntq][1] = r; - query[cntq][2] = k; - query[cntq][3] = cntu; - query[cntq][4] = cntq; - } else { - pos = in.nextInt(); - val = in.nextInt(); - cntu++; - update[cntu][0] = pos; - update[cntu][1] = val; - } - } - prepare(); - compute(); - for (int i = 1; i <= cntq; i++) { - out.println(ans[i]); - } - out.flush(); - out.close(); - } - - // 读写工具类 - static class FastReader { - private final byte[] buffer = new byte[1 << 16]; - private int ptr = 0, len = 0; - private final InputStream in; - - FastReader(InputStream in) { - this.in = in; - } - - private int readByte() throws IOException { - if (ptr >= len) { - len = in.read(buffer); - ptr = 0; - if (len <= 0) - return -1; - } - return buffer[ptr++]; - } - - int nextInt() throws IOException { - int c; - do { - c = readByte(); - } while (c <= ' ' && c != -1); - boolean neg = false; - if (c == '-') { - neg = true; - c = readByte(); - } - int val = 0; - while (c > ' ' && c != -1) { - val = val * 10 + (c - '0'); - c = readByte(); - } - return neg ? -val : val; - } - } - -} From 41094e0307323edc79b5d5b2acd9d89caeda7558 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Aug 2025 15:48:54 +0800 Subject: [PATCH 0614/1170] modify code --- src/class176/Code07_UniqueNumbers1.java | 14 ++++++++------ src/class176/Code07_UniqueNumbers2.java | 12 ++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/class176/Code07_UniqueNumbers1.java b/src/class176/Code07_UniqueNumbers1.java index 8d18790f1..6d1c6d9e0 100644 --- a/src/class176/Code07_UniqueNumbers1.java +++ b/src/class176/Code07_UniqueNumbers1.java @@ -30,8 +30,10 @@ public class Code07_UniqueNumbers1 { public static int[][] update = new int[MAXN][2]; public static int cntq, cntu; + // 每种数字的词频统计 public static int[] cnt = new int[MAXN]; - public static int curAns = 0; + // curCnt代表出现次数1次的数有几种 + public static int curCnt = 0; public static int[] ans = new int[MAXN]; @@ -50,20 +52,20 @@ public int compare(int[] a, int[] b) { public static void del(int num) { if (cnt[num] == 1) { - curAns--; + curCnt--; } if (cnt[num] == 2) { - curAns++; + curCnt++; } cnt[num]--; } public static void add(int num) { if (cnt[num] == 0) { - curAns++; + curCnt++; } if (cnt[num] == 1) { - curAns--; + curCnt--; } cnt[num]++; } @@ -105,7 +107,7 @@ public static void compute() { while (wint > jobt) { moveTime(jobl, jobr, wint--); } - ans[id] = curAns; + ans[id] = curCnt; } } diff --git a/src/class176/Code07_UniqueNumbers2.java b/src/class176/Code07_UniqueNumbers2.java index 05cba1d82..97b6217ea 100644 --- a/src/class176/Code07_UniqueNumbers2.java +++ b/src/class176/Code07_UniqueNumbers2.java @@ -32,7 +32,7 @@ //int cntq, cntu; // //int cnt[MAXN]; -//int curAns; +//int curCnt; // //int ans[MAXN]; // @@ -48,20 +48,20 @@ // //void del(int num) { // if (cnt[num] == 1) { -// curAns--; +// curCnt--; // } // if (cnt[num] == 2) { -// curAns++; +// curCnt++; // } // cnt[num]--; //} // //void add(int num) { // if (cnt[num] == 0) { -// curAns++; +// curCnt++; // } // if (cnt[num] == 1) { -// curAns--; +// curCnt--; // } // cnt[num]++; //} @@ -103,7 +103,7 @@ // while (wint > jobt) { // moveTime(jobl, jobr, wint--); // } -// ans[id] = curAns; +// ans[id] = curCnt; // } //} // From 6bc56187d31e7dff1d332ab282e1fb463239b56b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Aug 2025 15:50:55 +0800 Subject: [PATCH 0615/1170] modify code --- .../{Code08_MachineLearning1.java => Code08_CntMex1.java} | 4 ++-- .../{Code08_MachineLearning2.java => Code08_CntMex2.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/class176/{Code08_MachineLearning1.java => Code08_CntMex1.java} (98%) rename src/class176/{Code08_MachineLearning2.java => Code08_CntMex2.java} (99%) diff --git a/src/class176/Code08_MachineLearning1.java b/src/class176/Code08_CntMex1.java similarity index 98% rename from src/class176/Code08_MachineLearning1.java rename to src/class176/Code08_CntMex1.java index f51730060..ebeba53c3 100644 --- a/src/class176/Code08_MachineLearning1.java +++ b/src/class176/Code08_CntMex1.java @@ -1,6 +1,6 @@ package class176; -// 机器学习,java版 +// 次数的mex,java版 // 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 // 操作 1 l r : arr[l..r]范围上,每种数字出现的次数,假设构成一个集合 // 打印这个集合中,没出现的最小非负整数,就是打印次数的mex @@ -18,7 +18,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code08_MachineLearning1 { +public class Code08_CntMex1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class176/Code08_MachineLearning2.java b/src/class176/Code08_CntMex2.java similarity index 99% rename from src/class176/Code08_MachineLearning2.java rename to src/class176/Code08_CntMex2.java index 065b2be6c..f33113fbf 100644 --- a/src/class176/Code08_MachineLearning2.java +++ b/src/class176/Code08_CntMex2.java @@ -1,6 +1,6 @@ package class176; -// 机器学习,C++版 +// 次数的mex,C++版 // 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 // 操作 1 l r : arr[l..r]范围上,每种数字出现的次数,假设构成一个集合 // 打印这个集合中,没出现的最小非负整数,就是打印次数的mex From e477efa67ffc75e8823e12f3a448bd7ba6e44a27 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Aug 2025 15:55:28 +0800 Subject: [PATCH 0616/1170] modify code --- src/class176/Code08_CntMex1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class176/Code08_CntMex1.java b/src/class176/Code08_CntMex1.java index ebeba53c3..497ab23bd 100644 --- a/src/class176/Code08_CntMex1.java +++ b/src/class176/Code08_CntMex1.java @@ -30,6 +30,8 @@ public class Code08_CntMex1 { public static int[][] update = new int[MAXN][2]; public static int cntq, cntu; + // cnt1[i] = j,表示i这种数出现了j次 + // cnt2[i] = j,表示出现次数为i的数有j种 public static int[] cnt1 = new int[MAXN << 1]; public static int[] cnt2 = new int[MAXN]; From 48da4340aa9ed1ae0c562b73fcf373f9ac94aec9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Aug 2025 16:00:37 +0800 Subject: [PATCH 0617/1170] modify code --- .../{Code08_CntMex1.java => Code08_MachineLearning1.java} | 6 +++--- .../{Code08_CntMex2.java => Code08_MachineLearning2.java} | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) rename src/class176/{Code08_CntMex1.java => Code08_MachineLearning1.java} (97%) rename src/class176/{Code08_CntMex2.java => Code08_MachineLearning2.java} (97%) diff --git a/src/class176/Code08_CntMex1.java b/src/class176/Code08_MachineLearning1.java similarity index 97% rename from src/class176/Code08_CntMex1.java rename to src/class176/Code08_MachineLearning1.java index 497ab23bd..72f973300 100644 --- a/src/class176/Code08_CntMex1.java +++ b/src/class176/Code08_MachineLearning1.java @@ -1,9 +1,9 @@ package class176; -// 次数的mex,java版 +// 机器学习,java版 // 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 // 操作 1 l r : arr[l..r]范围上,每种数字出现的次数,假设构成一个集合 -// 打印这个集合中,没出现的最小非负整数,就是打印次数的mex +// 打印这个集合中,没出现过的最小正数 // 操作 2 pos val : 把arr[pos]的值设置成val // 1 <= n、m <= 10^5 // 1 <= arr[i]、val <= 10^9 @@ -18,7 +18,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code08_CntMex1 { +public class Code08_MachineLearning1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class176/Code08_CntMex2.java b/src/class176/Code08_MachineLearning2.java similarity index 97% rename from src/class176/Code08_CntMex2.java rename to src/class176/Code08_MachineLearning2.java index f33113fbf..ec53d2360 100644 --- a/src/class176/Code08_CntMex2.java +++ b/src/class176/Code08_MachineLearning2.java @@ -1,9 +1,9 @@ package class176; -// 次数的mex,C++版 +// 机器学习,java版 // 给定一个长度为n的数组arr,一共有m条操作,操作格式如下 // 操作 1 l r : arr[l..r]范围上,每种数字出现的次数,假设构成一个集合 -// 打印这个集合中,没出现的最小非负整数,就是打印次数的mex +// 打印这个集合中,没出现过的最小正数 // 操作 2 pos val : 把arr[pos]的值设置成val // 1 <= n、m <= 10^5 // 1 <= arr[i]、val <= 10^9 From a84e44cbbb6e5a864e78f4ddb73727848e149f11 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Aug 2025 16:34:48 +0800 Subject: [PATCH 0618/1170] modify code --- src/class176/Code08_MachineLearning1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class176/Code08_MachineLearning1.java b/src/class176/Code08_MachineLearning1.java index 72f973300..dde8f622f 100644 --- a/src/class176/Code08_MachineLearning1.java +++ b/src/class176/Code08_MachineLearning1.java @@ -24,8 +24,8 @@ public class Code08_MachineLearning1 { public static int n, m; public static int[] arr = new int[MAXN]; public static int[] sorted = new int[MAXN << 1]; - public static int[] bi = new int[MAXN]; + public static int[][] query = new int[MAXN][4]; public static int[][] update = new int[MAXN][2]; public static int cntq, cntu; @@ -113,6 +113,7 @@ public static void compute() { while (wint > jobt) { moveTime(jobl, jobr, wint--); } + // 如下枚举看似暴力,其实O(根号n)的复杂度 int ret = 1; while (ret <= n && cnt2[ret] > 0) { ret++; From 478e248aaf10951421546f649bed56a6d204bb19 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Aug 2025 16:41:25 +0800 Subject: [PATCH 0619/1170] modify code --- ...46\344\277\256\350\216\253\351\230\237.pptx" | Bin 0 -> 56677 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243176\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2301-\346\231\256\351\200\232\350\216\253\351\230\237\343\200\201\345\270\246\344\277\256\350\216\253\351\230\237.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243176\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2301-\346\231\256\351\200\232\350\216\253\351\230\237\343\200\201\345\270\246\344\277\256\350\216\253\351\230\237.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243176\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2301-\346\231\256\351\200\232\350\216\253\351\230\237\343\200\201\345\270\246\344\277\256\350\216\253\351\230\237.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..6e1e73b7a3e0e8b850ee99b0507edb1e8b0d5c24 GIT binary patch literal 56677 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 Date: Tue, 26 Aug 2025 13:49:07 +0800 Subject: [PATCH 0620/1170] modify code --- src/class177/Code01_MoOnlyAdd1.java | 200 +++++++++++++++++ src/class177/Code02_ThresholdMajority1.java | 171 +++++++++++++++ src/class177/Code03_SameNumberMaxDist1.java | 218 +++++++++++++++++++ src/class177/Code04_ZeroQuery1.java | 224 ++++++++++++++++++++ src/class177/Code05_MoOnlyDel1.java | 165 ++++++++++++++ src/class177/Code06_BaldChief1.java | 185 ++++++++++++++++ src/class177/Code06_BaldChief2.java | 132 ++++++++++++ 7 files changed, 1295 insertions(+) create mode 100644 src/class177/Code01_MoOnlyAdd1.java create mode 100644 src/class177/Code02_ThresholdMajority1.java create mode 100644 src/class177/Code03_SameNumberMaxDist1.java create mode 100644 src/class177/Code04_ZeroQuery1.java create mode 100644 src/class177/Code05_MoOnlyDel1.java create mode 100644 src/class177/Code06_BaldChief1.java create mode 100644 src/class177/Code06_BaldChief2.java diff --git a/src/class177/Code01_MoOnlyAdd1.java b/src/class177/Code01_MoOnlyAdd1.java new file mode 100644 index 000000000..a24f5c97c --- /dev/null +++ b/src/class177/Code01_MoOnlyAdd1.java @@ -0,0 +1,200 @@ +package class177; + +// 只加不减的回滚莫队入门题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/AT_joisc2014_c +// 测试链接 : https://atcoder.jp/contests/joisc2014/tasks/joisc2014_c +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code01_MoOnlyAdd1 { + + public static int MAXN = 100001; + public static int MAXB = 401; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + public static int[] sorted = new int[MAXN]; + public static int cntv; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] br = new int[MAXB]; + + public static int[] forceCnt = new int[MAXN]; + public static int[] cnt = new int[MAXN]; + + public static long curAns = 0; + public static long[] ans = new long[MAXN]; + + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return a[1] - b[1]; + } + + } + + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static long force(int l, int r) { + long ret = 0; + for (int i = l; i <= r; i++) { + forceCnt[arr[i]]++; + } + for (int i = l; i <= r; i++) { + ret = Math.max(ret, (long) forceCnt[arr[i]] * sorted[arr[i]]); + } + for (int i = l; i <= r; i++) { + forceCnt[arr[i]]--; + } + return ret; + } + + public static void del(int num) { + cnt[num]--; + } + + public static void add(int num) { + cnt[num]++; + curAns = Math.max(curAns, (long) cnt[num] * sorted[num]); + } + + public static void compute() { + for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { + curAns = 0; + Arrays.fill(cnt, 1, cntv + 1, 0); + int winl = br[block] + 1; + int winr = br[block]; + for (; qi <= m && bi[query[qi][0]] == block; qi++) { + int jobl = query[qi][0]; + int jobr = query[qi][1]; + int id = query[qi][2]; + if (jobr <= br[block]) { + ans[id] = force(jobl, jobr); + } else { + while (winr < jobr) { + add(arr[++winr]); + } + long backup = curAns; + while (winl > jobl) { + add(arr[--winl]); + } + ans[id] = curAns; + curAns = backup; + while (winl <= br[block]) { + del(arr[winl++]); + } + } + } + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + cntv = 1; + for (int i = 2; i <= n; i++) { + if (sorted[cntv] != sorted[i]) { + sorted[++cntv] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = kth(arr[i]); + } + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + br[i] = Math.min(i * blen, n); + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java new file mode 100644 index 000000000..234062dea --- /dev/null +++ b/src/class177/Code02_ThresholdMajority1.java @@ -0,0 +1,171 @@ +package class177; + +// 到达阈值的最小众数,java版 +// 测试链接 : https://leetcode.cn/problems/threshold-majority-queries/ + +import java.util.Arrays; +import java.util.Comparator; + +public class Code02_ThresholdMajority1 { + + public static int MAXN = 10001; + public static int MAXM = 50001; + public static int MAXB = 301; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXM][4]; + public static int[] sorted = new int[MAXN]; + public static int cntv; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] br = new int[MAXB]; + + public static int[] forceCnt = new int[MAXN]; + public static int[] cnt = new int[MAXN]; + + public static int maxCnt; + public static int numAns; + public static int[] ans = new int[MAXM]; + + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return a[1] - b[1]; + } + + } + + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static int force(int l, int r, int k) { + int maxCnt = 0; + int numAns = 0; + for (int i = l; i <= r; i++) { + forceCnt[arr[i]]++; + } + for (int i = l; i <= r; i++) { + if (forceCnt[arr[i]] > maxCnt || (forceCnt[arr[i]] == maxCnt && arr[i] < numAns)) { + maxCnt = forceCnt[arr[i]]; + numAns = arr[i]; + } + } + for (int i = l; i <= r; i++) { + forceCnt[arr[i]]--; + } + return maxCnt >= k ? sorted[numAns] : -1; + } + + public static void del(int num) { + cnt[num]--; + } + + public static void add(int num) { + cnt[num]++; + if (cnt[num] > maxCnt || (cnt[num] == maxCnt && num < numAns)) { + maxCnt = cnt[num]; + numAns = num; + } + } + + public static void compute() { + for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { + maxCnt = 0; + numAns = 0; + Arrays.fill(cnt, 1, cntv + 1, 0); + int winl = br[block] + 1; + int winr = br[block]; + for (; qi <= m && bi[query[qi][0]] == block; qi++) { + int jobl = query[qi][0]; + int jobr = query[qi][1]; + int jobk = query[qi][2]; + int id = query[qi][3]; + if (jobr <= br[block]) { + ans[id] = force(jobl, jobr, jobk); + } else { + while (winr < jobr) { + add(arr[++winr]); + } + int backupCnt = maxCnt; + int backupNum = numAns; + while (winl > jobl) { + add(arr[--winl]); + } + if (maxCnt >= jobk) { + ans[id] = sorted[numAns]; + } else { + ans[id] = -1; + } + maxCnt = backupCnt; + numAns = backupNum; + while (winl <= br[block]) { + del(arr[winl++]); + } + } + } + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + cntv = 1; + for (int i = 2; i <= n; i++) { + if (sorted[cntv] != sorted[i]) { + sorted[++cntv] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = kth(arr[i]); + } + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + br[i] = Math.min(i * blen, n); + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static int[] subarrayMajority(int[] nums, int[][] queries) { + n = nums.length; + m = queries.length; + for (int i = 1, j = 0; i <= n; i++, j++) { + arr[i] = nums[j]; + } + for (int i = 1, j = 0; i <= m; i++, j++) { + query[i][0] = queries[j][0] + 1; + query[i][1] = queries[j][1] + 1; + query[i][2] = queries[j][2]; + query[i][3] = i; + } + prepare(); + compute(); + int[] ret = new int[m]; + for (int i = 1, j = 0; i <= m; i++, j++) { + ret[j] = ans[i]; + } + return ret; + } + +} diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java new file mode 100644 index 000000000..228183a5e --- /dev/null +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -0,0 +1,218 @@ +package class177; + +// 相同数的最远距离,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5906 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code03_SameNumberMaxDist1 { + + public static int MAXN = 200001; + public static int MAXB = 501; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + public static int[] sorted = new int[MAXN]; + public static int cntv; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] br = new int[MAXB]; + + public static int[] forceEnd = new int[MAXN]; + public static int[] start = new int[MAXN]; + public static int[] end = new int[MAXN]; + + public static int curAns = 0; + public static int[] ans = new int[MAXN]; + + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return a[1] - b[1]; + } + + } + + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static int force(int l, int r) { + int ret = 0; + for (int i = l; i <= r; i++) { + if (forceEnd[arr[i]] == 0) { + forceEnd[arr[i]] = i; + } else { + ret = Math.max(ret, i - forceEnd[arr[i]]); + } + } + for (int i = l; i <= r; i++) { + forceEnd[arr[i]] = 0; + } + return ret; + } + + public static void delLeft(int idx) { + int num = arr[idx]; + if (end[num] == idx) { + end[num] = 0; + } + } + + public static void addRight(int idx) { + int num = arr[idx]; + end[num] = idx; + if (start[num] == 0) { + start[num] = idx; + } + curAns = Math.max(curAns, idx - start[num]); + } + + public static void addLeft(int idx) { + int num = arr[idx]; + if (end[num] != 0) { + curAns = Math.max(curAns, end[num] - idx); + } else { + end[num] = idx; + } + } + + public static void compute() { + for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { + curAns = 0; + Arrays.fill(start, 1, cntv + 1, 0); + Arrays.fill(end, 1, cntv + 1, 0); + int winl = br[block] + 1; + int winr = br[block]; + for (; qi <= m && bi[query[qi][0]] == block; qi++) { + int jobl = query[qi][0]; + int jobr = query[qi][1]; + int id = query[qi][2]; + if (jobr <= br[block]) { + ans[id] = force(jobl, jobr); + } else { + while (winr < jobr) { + addRight(++winr); + } + int backup = curAns; + while (winl > jobl) { + addLeft(--winl); + } + ans[id] = curAns; + curAns = backup; + while (winl <= br[block]) { + delLeft(winl++); + } + } + } + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + cntv = 1; + for (int i = 2; i <= n; i++) { + if (sorted[cntv] != sorted[i]) { + sorted[++cntv] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = kth(arr[i]); + } + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + br[i] = Math.min(i * blen, n); + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + m = in.nextInt(); + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java new file mode 100644 index 000000000..f3ed89776 --- /dev/null +++ b/src/class177/Code04_ZeroQuery1.java @@ -0,0 +1,224 @@ +package class177; + +// 累加和为0的最长子数组,java版 +// 测试链接 : https://www.luogu.com.cn/problem/SP20644 +// 测试链接 : https://www.spoj.com/problems/ZQUERY/ +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code04_ZeroQuery1 { + + public static int MAXN = 50001; + public static int MAXB = 301; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + public static int[] sorted = new int[MAXN + 1]; + public static int cntv; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] br = new int[MAXB]; + + public static int[] forceEnd = new int[MAXN + 1]; + public static int[] start = new int[MAXN + 1]; + public static int[] end = new int[MAXN + 1]; + + public static int curAns = 0; + public static int[] ans = new int[MAXN]; + + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return a[1] - b[1]; + } + + } + + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static int force(int l, int r) { + int ret = 0; + for (int i = l; i <= r; i++) { + if (forceEnd[arr[i]] == 0) { + forceEnd[arr[i]] = i; + } else { + ret = Math.max(ret, i - forceEnd[arr[i]]); + } + } + for (int i = l; i <= r; i++) { + forceEnd[arr[i]] = 0; + } + return ret; + } + + public static void delLeft(int idx) { + int num = arr[idx]; + if (end[num] == idx) { + end[num] = 0; + } + } + + public static void addRight(int idx) { + int num = arr[idx]; + end[num] = idx; + if (start[num] == 0) { + start[num] = idx; + } + curAns = Math.max(curAns, idx - start[num]); + } + + public static void addLeft(int idx) { + int num = arr[idx]; + if (end[num] != 0) { + curAns = Math.max(curAns, end[num] - idx); + } else { + end[num] = idx; + } + } + + public static void compute() { + for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { + curAns = 0; + Arrays.fill(start, 1, cntv + 1, 0); + Arrays.fill(end, 1, cntv + 1, 0); + int winl = br[block] + 1; + int winr = br[block]; + for (; qi <= m && bi[query[qi][0]] == block; qi++) { + int jobl = query[qi][0] - 1; + int jobr = query[qi][1]; + int id = query[qi][2]; + if (jobr <= br[block]) { + ans[id] = force(jobl, jobr); + } else { + while (winr < jobr) { + addRight(++winr); + } + int backup = curAns; + while (winl > jobl) { + addLeft(--winl); + } + ans[id] = curAns; + curAns = backup; + while (winl <= br[block]) { + delLeft(winl++); + } + } + } + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + arr[i] += arr[i - 1]; + } + int len = 0; + sorted[++len] = 0; + for (int i = 1; i <= n; i++) { + sorted[++len] = arr[i]; + } + Arrays.sort(sorted, 1, len + 1); + cntv = 1; + for (int i = 2; i <= len; i++) { + if (sorted[cntv] != sorted[i]) { + sorted[++cntv] = sorted[i]; + } + } + for (int i = 0; i <= n; i++) { + arr[i] = kth(arr[i]); + } + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + br[i] = Math.min(i * blen, n); + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class177/Code05_MoOnlyDel1.java b/src/class177/Code05_MoOnlyDel1.java new file mode 100644 index 000000000..bcf1bb426 --- /dev/null +++ b/src/class177/Code05_MoOnlyDel1.java @@ -0,0 +1,165 @@ +package class177; + +// 只减不加的回滚莫队入门题,java版 +// 本题最优解为主席树,讲解158,题目2,已经讲述 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 +// 0 <= n、m、arr[i] <= 2 * 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P4137 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code05_MoOnlyDel1 { + + public static int MAXN = 200001; + public static int MAXB = 501; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + + public static int[] cnt = new int[MAXN + 1]; + public static int mex; + public static int[] ans = new int[MAXN]; + + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return b[1] - a[1]; + } + + } + + public static void del(int num) { + if (--cnt[num] == 0) { + mex = Math.min(mex, num); + } + } + + public static void add(int num) { + cnt[num]++; + } + + public static void compute() { + for (int i = 1; i <= n; i++) { + add(arr[i]); + } + int winl = 1, winr = n; + for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { + while (winr < n) { + add(arr[++winr]); + } + while (winl < bl[block]) { + del(arr[winl++]); + } + mex = 0; + while (cnt[mex] != 0) { + mex++; + } + for (; qi <= m && bi[query[qi][0]] == block; qi++) { + int jobl = query[qi][0]; + int jobr = query[qi][1]; + int id = query[qi][2]; + while (winr > jobr) { + del(arr[winr--]); + } + int backup = mex; + while (winl < jobl) { + del(arr[winl++]); + } + ans[id] = mex; + mex = backup; + while (winl > bl[block]) { + add(arr[--winl]); + } + } + } + } + + public static void prepare() { + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java new file mode 100644 index 000000000..e36d50442 --- /dev/null +++ b/src/class177/Code06_BaldChief1.java @@ -0,0 +1,185 @@ +package class177; + +// 秃子酋长,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P8078 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code06_BaldChief2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code06_BaldChief1 { + + public static int MAXN = 500001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + public static int[] pos = new int[MAXN]; + + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXN]; + + public static int[] last = new int[MAXN + 1]; + public static int[] next = new int[MAXN + 1]; + public static long sum; + public static long[] ans = new long[MAXN]; + + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return b[1] - a[1]; + } + + } + + // 删除num + public static void del(int num) { + int less = last[num], more = next[num]; + if (less != 0) { + sum -= Math.abs(pos[num] - pos[less]); + } + if (more != n + 1) { + sum -= Math.abs(pos[more] - pos[num]); + } + if (less != 0 && more != n + 1) { + sum += Math.abs(pos[more] - pos[less]); + } + next[less] = more; + last[more] = less; + } + + // 加入num,必须保证num是最近一次删除的数字 + public static void undo(int num) { + next[last[num]] = num; + last[next[num]] = num; + } + + public static void compute() { + for (int v = 1; v <= n; v++) { + last[v] = v - 1; + next[v] = v + 1; + } + next[0] = 1; + last[n + 1] = n; + for (int v = 2; v <= n; v++) { + sum += Math.abs(pos[v] - pos[v - 1]); + } + int winl = 1, winr = n; + long lastBlockSum = sum; + for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { + while (winr < n) { + undo(arr[++winr]); + } + sum = lastBlockSum; + while (winl < bl[block]) { + del(arr[winl++]); + } + lastBlockSum = sum; + for (; qi <= m && bi[query[qi][0]] == block; qi++) { + int jobl = query[qi][0]; + int jobr = query[qi][1]; + int id = query[qi][2]; + while (winr > jobr) { + del(arr[winr--]); + } + long backup = sum; + while (winl < jobl) { + del(arr[winl++]); + } + ans[id] = sum; + while (winl > bl[block]) { + undo(arr[--winl]); + } + sum = backup; + } + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + pos[arr[i]] = i; + } + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file diff --git a/src/class177/Code06_BaldChief2.java b/src/class177/Code06_BaldChief2.java new file mode 100644 index 000000000..22ca4170e --- /dev/null +++ b/src/class177/Code06_BaldChief2.java @@ -0,0 +1,132 @@ +package class177; + +// 秃子酋长,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P8078 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 500001; +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +//int pos[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXN]; +// +//int lst[MAXN + 1]; +//int nxt[MAXN + 1]; +//long long sum; +//long long ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return a.r > b.r; +//} +// +//inline void del(int num) { +// int less = lst[num], more = nxt[num]; +// if (less != 0) { +// sum -= abs(pos[num] - pos[less]); +// } +// if (more != n + 1) { +// sum -= abs(pos[more] - pos[num]); +// } +// if (less != 0 && more != n + 1) { +// sum += abs(pos[more] - pos[less]); +// } +// nxt[less] = more; +// lst[more] = less; +//} +// +//inline void undo(int num) { +// nxt[lst[num]] = num; +// lst[nxt[num]] = num; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// pos[arr[i]] = i; +// } +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// } +// sort(query + 1, query + 1 + m, QueryCmp); +//} +// +//void compute() { +// for (int v = 1; v <= n; v++) { +// lst[v] = v - 1; +// nxt[v] = v + 1; +// } +// nxt[0] = 1; +// lst[n + 1] = n; +// sum = 0; +// for (int v = 2; v <= n; v++) { +// sum += abs(pos[v] - pos[v - 1]); +// } +// int winl = 1, winr = n; +// long long lastBlockSum = sum; +// for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { +// while (winr < n) { +// undo(arr[++winr]); +// } +// sum = lastBlockSum; +// while (winl < bl[block]) { +// del(arr[winl++]); +// } +// lastBlockSum = sum; +// for (; qi <= m && bi[query[qi].l] == block; qi++) { +// int jobl = query[qi].l; +// int jobr = query[qi].r; +// int id = query[qi].id; +// while (winr > jobr) { +// del(arr[winr--]); +// } +// long long backup = sum; +// while (winl < jobl) { +// del(arr[winl++]); +// } +// ans[id] = sum; +// while (winl > bl[block]) { +// undo(arr[--winl]); +// } +// sum = backup; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 65c227ab1778961212888cfd5fb6b2e00d6c4676 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 26 Aug 2025 13:55:20 +0800 Subject: [PATCH 0621/1170] modify code --- src/class177/Code06_BaldChief1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index e36d50442..80f4a03c2 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -59,7 +59,8 @@ public static void del(int num) { last[more] = less; } - // 加入num,必须保证num是最近一次删除的数字 + // 加入num,必须保证num上一次删除的数字 + // 也就是说,undo的调用就是del操作的回滚 public static void undo(int num) { next[last[num]] = num; last[next[num]] = num; From 71ba0fc84e6df65564b89e473c7e5b3a10eb09ee Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 26 Aug 2025 13:55:52 +0800 Subject: [PATCH 0622/1170] modify code --- src/class177/Code06_BaldChief1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index 80f4a03c2..9f545ad67 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -60,7 +60,7 @@ public static void del(int num) { } // 加入num,必须保证num上一次删除的数字 - // 也就是说,undo的调用就是del操作的回滚 + // 也就是说,undo的调用必须是del操作的回滚 public static void undo(int num) { next[last[num]] = num; last[next[num]] = num; From 47aa35ad5c0e365aa401224816574ec042fea825 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 26 Aug 2025 18:04:13 +0800 Subject: [PATCH 0623/1170] modify code --- ...MoOnlyAdd1.java => Code01_MoAddUndo1.java} | 14 +++++----- src/class177/Code02_ThresholdMajority1.java | 10 +++---- src/class177/Code03_SameNumberMaxDist1.java | 4 +-- src/class177/Code04_ZeroQuery1.java | 16 ++++++------ ...MoOnlyDel1.java => Code05_MoDelUndo1.java} | 26 ++++++++++--------- src/class177/Code06_BaldChief1.java | 11 ++++---- src/class177/Code06_BaldChief2.java | 11 ++++---- 7 files changed, 46 insertions(+), 46 deletions(-) rename src/class177/{Code01_MoOnlyAdd1.java => Code01_MoAddUndo1.java} (96%) rename src/class177/{Code05_MoOnlyDel1.java => Code05_MoDelUndo1.java} (92%) diff --git a/src/class177/Code01_MoOnlyAdd1.java b/src/class177/Code01_MoAddUndo1.java similarity index 96% rename from src/class177/Code01_MoOnlyAdd1.java rename to src/class177/Code01_MoAddUndo1.java index a24f5c97c..b84c883dd 100644 --- a/src/class177/Code01_MoOnlyAdd1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -1,6 +1,6 @@ package class177; -// 只加不减的回滚莫队入门题,java版 +// 只增回滚莫队入门题,java版 // 测试链接 : https://www.luogu.com.cn/problem/AT_joisc2014_c // 测试链接 : https://atcoder.jp/contests/joisc2014/tasks/joisc2014_c // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +12,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code01_MoOnlyAdd1 { +public class Code01_MoAddUndo1 { public static int MAXN = 100001; public static int MAXB = 401; @@ -72,15 +72,15 @@ public static long force(int l, int r) { return ret; } - public static void del(int num) { - cnt[num]--; - } - public static void add(int num) { cnt[num]++; curAns = Math.max(curAns, (long) cnt[num] * sorted[num]); } + public static void undo(int num) { + cnt[num]--; + } + public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { curAns = 0; @@ -104,7 +104,7 @@ public static void compute() { ans[id] = curAns; curAns = backup; while (winl <= br[block]) { - del(arr[winl++]); + undo(arr[winl++]); } } } diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index 234062dea..9ca5b90f4 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -72,10 +72,6 @@ public static int force(int l, int r, int k) { return maxCnt >= k ? sorted[numAns] : -1; } - public static void del(int num) { - cnt[num]--; - } - public static void add(int num) { cnt[num]++; if (cnt[num] > maxCnt || (cnt[num] == maxCnt && num < numAns)) { @@ -83,6 +79,10 @@ public static void add(int num) { numAns = num; } } + + public static void undo(int num) { + cnt[num]--; + } public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { @@ -115,7 +115,7 @@ public static void compute() { maxCnt = backupCnt; numAns = backupNum; while (winl <= br[block]) { - del(arr[winl++]); + undo(arr[winl++]); } } } diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index 228183a5e..70f0665a5 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -89,7 +89,7 @@ public static void addRight(int idx) { curAns = Math.max(curAns, idx - start[num]); } - public static void addLeft(int idx) { + public static void undoLeft(int idx) { int num = arr[idx]; if (end[num] != 0) { curAns = Math.max(curAns, end[num] - idx); @@ -117,7 +117,7 @@ public static void compute() { } int backup = curAns; while (winl > jobl) { - addLeft(--winl); + undoLeft(--winl); } ans[id] = curAns; curAns = backup; diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java index f3ed89776..0de082bd9 100644 --- a/src/class177/Code04_ZeroQuery1.java +++ b/src/class177/Code04_ZeroQuery1.java @@ -74,13 +74,6 @@ public static int force(int l, int r) { return ret; } - public static void delLeft(int idx) { - int num = arr[idx]; - if (end[num] == idx) { - end[num] = 0; - } - } - public static void addRight(int idx) { int num = arr[idx]; end[num] = idx; @@ -99,6 +92,13 @@ public static void addLeft(int idx) { } } + public static void undoLeft(int idx) { + int num = arr[idx]; + if (end[num] == idx) { + end[num] = 0; + } + } + public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { curAns = 0; @@ -123,7 +123,7 @@ public static void compute() { ans[id] = curAns; curAns = backup; while (winl <= br[block]) { - delLeft(winl++); + undoLeft(winl++); } } } diff --git a/src/class177/Code05_MoOnlyDel1.java b/src/class177/Code05_MoDelUndo1.java similarity index 92% rename from src/class177/Code05_MoOnlyDel1.java rename to src/class177/Code05_MoDelUndo1.java index bcf1bb426..b4ed8075a 100644 --- a/src/class177/Code05_MoOnlyDel1.java +++ b/src/class177/Code05_MoDelUndo1.java @@ -1,6 +1,6 @@ package class177; -// 只减不加的回滚莫队入门题,java版 +// 只减回滚莫队入门题,java版 // 本题最优解为主席树,讲解158,题目2,已经讲述 // 给定一个长度为n的数组arr,一共有m条查询,格式如下 // 查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 @@ -15,7 +15,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code05_MoOnlyDel1 { +public class Code05_MoDelUndo1 { public static int MAXN = 200001; public static int MAXB = 501; @@ -49,26 +49,24 @@ public static void del(int num) { } } - public static void add(int num) { + public static void undo(int num) { cnt[num]++; } public static void compute() { for (int i = 1; i <= n; i++) { - add(arr[i]); + undo(arr[i]); + } + mex = 0; + while (cnt[mex] != 0) { + mex++; } int winl = 1, winr = n; for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { - while (winr < n) { - add(arr[++winr]); - } while (winl < bl[block]) { del(arr[winl++]); } - mex = 0; - while (cnt[mex] != 0) { - mex++; - } + int before = mex; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0]; int jobr = query[qi][1]; @@ -83,9 +81,13 @@ public static void compute() { ans[id] = mex; mex = backup; while (winl > bl[block]) { - add(arr[--winl]); + undo(arr[--winl]); } } + while (winr < n) { + undo(arr[++winr]); + } + mex = before; } } diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index 9f545ad67..91e184f42 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -77,16 +77,11 @@ public static void compute() { sum += Math.abs(pos[v] - pos[v - 1]); } int winl = 1, winr = n; - long lastBlockSum = sum; for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { - while (winr < n) { - undo(arr[++winr]); - } - sum = lastBlockSum; while (winl < bl[block]) { del(arr[winl++]); } - lastBlockSum = sum; + long before = sum; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0]; int jobr = query[qi][1]; @@ -104,6 +99,10 @@ public static void compute() { } sum = backup; } + while (winr < n) { + undo(arr[++winr]); + } + sum = before; } } diff --git a/src/class177/Code06_BaldChief2.java b/src/class177/Code06_BaldChief2.java index 22ca4170e..350f34e61 100644 --- a/src/class177/Code06_BaldChief2.java +++ b/src/class177/Code06_BaldChief2.java @@ -82,16 +82,11 @@ // sum += abs(pos[v] - pos[v - 1]); // } // int winl = 1, winr = n; -// long long lastBlockSum = sum; // for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { -// while (winr < n) { -// undo(arr[++winr]); -// } -// sum = lastBlockSum; // while (winl < bl[block]) { // del(arr[winl++]); // } -// lastBlockSum = sum; +// long long before = sum; // for (; qi <= m && bi[query[qi].l] == block; qi++) { // int jobl = query[qi].l; // int jobr = query[qi].r; @@ -109,6 +104,10 @@ // } // sum = backup; // } +// while (winr < n) { +// undo(arr[++winr]); +// } +// sum = before; // } //} // From d604c42bc6713237db015ff68522976136519150 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 26 Aug 2025 18:07:18 +0800 Subject: [PATCH 0624/1170] modify code --- src/class177/Code05_MoDelUndo1.java | 4 ++-- src/class177/Code06_BaldChief1.java | 4 ++-- src/class177/Code06_BaldChief2.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class177/Code05_MoDelUndo1.java b/src/class177/Code05_MoDelUndo1.java index b4ed8075a..976f33a15 100644 --- a/src/class177/Code05_MoDelUndo1.java +++ b/src/class177/Code05_MoDelUndo1.java @@ -66,7 +66,7 @@ public static void compute() { while (winl < bl[block]) { del(arr[winl++]); } - int before = mex; + int beforeJob = mex; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0]; int jobr = query[qi][1]; @@ -87,7 +87,7 @@ public static void compute() { while (winr < n) { undo(arr[++winr]); } - mex = before; + mex = beforeJob; } } diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index 91e184f42..42db55a79 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -81,7 +81,7 @@ public static void compute() { while (winl < bl[block]) { del(arr[winl++]); } - long before = sum; + long beforeJob = sum; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0]; int jobr = query[qi][1]; @@ -102,7 +102,7 @@ public static void compute() { while (winr < n) { undo(arr[++winr]); } - sum = before; + sum = beforeJob; } } diff --git a/src/class177/Code06_BaldChief2.java b/src/class177/Code06_BaldChief2.java index 350f34e61..bd5fe178c 100644 --- a/src/class177/Code06_BaldChief2.java +++ b/src/class177/Code06_BaldChief2.java @@ -86,7 +86,7 @@ // while (winl < bl[block]) { // del(arr[winl++]); // } -// long long before = sum; +// long long beforeJob = sum; // for (; qi <= m && bi[query[qi].l] == block; qi++) { // int jobl = query[qi].l; // int jobr = query[qi].r; @@ -107,7 +107,7 @@ // while (winr < n) { // undo(arr[++winr]); // } -// sum = before; +// sum = beforeJob; // } //} // From e9f516fb9e93452591bedea8387c0f9e9c2c9bb3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 26 Aug 2025 18:10:14 +0800 Subject: [PATCH 0625/1170] modify code --- src/class177/Code02_ThresholdMajority1.java | 267 ++++++++++---------- 1 file changed, 136 insertions(+), 131 deletions(-) diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index 9ca5b90f4..4f13c3293 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -2,170 +2,175 @@ // 到达阈值的最小众数,java版 // 测试链接 : https://leetcode.cn/problems/threshold-majority-queries/ +// 提交如下代码中的Solution类,可以通过所有测试用例 import java.util.Arrays; import java.util.Comparator; public class Code02_ThresholdMajority1 { - public static int MAXN = 10001; - public static int MAXM = 50001; - public static int MAXB = 301; - public static int n, m; - public static int[] arr = new int[MAXN]; - public static int[][] query = new int[MAXM][4]; - public static int[] sorted = new int[MAXN]; - public static int cntv; + class Solution { - public static int blen, bnum; - public static int[] bi = new int[MAXN]; - public static int[] br = new int[MAXB]; + public static int MAXN = 10001; + public static int MAXM = 50001; + public static int MAXB = 301; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXM][4]; + public static int[] sorted = new int[MAXN]; + public static int cntv; - public static int[] forceCnt = new int[MAXN]; - public static int[] cnt = new int[MAXN]; + public static int blen, bnum; + public static int[] bi = new int[MAXN]; + public static int[] br = new int[MAXB]; - public static int maxCnt; - public static int numAns; - public static int[] ans = new int[MAXM]; + public static int[] forceCnt = new int[MAXN]; + public static int[] cnt = new int[MAXN]; - public static class QueryCmp implements Comparator { + public static int maxCnt; + public static int numAns; + public static int[] ans = new int[MAXM]; - @Override - public int compare(int[] a, int[] b) { - if (bi[a[0]] != bi[b[0]]) { - return bi[a[0]] - bi[b[0]]; + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return a[1] - b[1]; } - return a[1] - b[1]; - } - } + } - public static int kth(int num) { - int left = 1, right = cntv, mid, ret = 0; - while (left <= right) { - mid = (left + right) / 2; - if (sorted[mid] <= num) { - ret = mid; - left = mid + 1; - } else { - right = mid - 1; + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } } + return ret; } - return ret; - } - public static int force(int l, int r, int k) { - int maxCnt = 0; - int numAns = 0; - for (int i = l; i <= r; i++) { - forceCnt[arr[i]]++; - } - for (int i = l; i <= r; i++) { - if (forceCnt[arr[i]] > maxCnt || (forceCnt[arr[i]] == maxCnt && arr[i] < numAns)) { - maxCnt = forceCnt[arr[i]]; - numAns = arr[i]; + public static int force(int l, int r, int k) { + int maxCnt = 0; + int numAns = 0; + for (int i = l; i <= r; i++) { + forceCnt[arr[i]]++; } + for (int i = l; i <= r; i++) { + if (forceCnt[arr[i]] > maxCnt || (forceCnt[arr[i]] == maxCnt && arr[i] < numAns)) { + maxCnt = forceCnt[arr[i]]; + numAns = arr[i]; + } + } + for (int i = l; i <= r; i++) { + forceCnt[arr[i]]--; + } + return maxCnt >= k ? sorted[numAns] : -1; } - for (int i = l; i <= r; i++) { - forceCnt[arr[i]]--; + + public static void add(int num) { + cnt[num]++; + if (cnt[num] > maxCnt || (cnt[num] == maxCnt && num < numAns)) { + maxCnt = cnt[num]; + numAns = num; + } } - return maxCnt >= k ? sorted[numAns] : -1; - } - public static void add(int num) { - cnt[num]++; - if (cnt[num] > maxCnt || (cnt[num] == maxCnt && num < numAns)) { - maxCnt = cnt[num]; - numAns = num; + public static void undo(int num) { + cnt[num]--; } - } - - public static void undo(int num) { - cnt[num]--; - } - public static void compute() { - for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { - maxCnt = 0; - numAns = 0; - Arrays.fill(cnt, 1, cntv + 1, 0); - int winl = br[block] + 1; - int winr = br[block]; - for (; qi <= m && bi[query[qi][0]] == block; qi++) { - int jobl = query[qi][0]; - int jobr = query[qi][1]; - int jobk = query[qi][2]; - int id = query[qi][3]; - if (jobr <= br[block]) { - ans[id] = force(jobl, jobr, jobk); - } else { - while (winr < jobr) { - add(arr[++winr]); - } - int backupCnt = maxCnt; - int backupNum = numAns; - while (winl > jobl) { - add(arr[--winl]); - } - if (maxCnt >= jobk) { - ans[id] = sorted[numAns]; + public static void compute() { + for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { + maxCnt = 0; + numAns = 0; + Arrays.fill(cnt, 1, cntv + 1, 0); + int winl = br[block] + 1; + int winr = br[block]; + for (; qi <= m && bi[query[qi][0]] == block; qi++) { + int jobl = query[qi][0]; + int jobr = query[qi][1]; + int jobk = query[qi][2]; + int id = query[qi][3]; + if (jobr <= br[block]) { + ans[id] = force(jobl, jobr, jobk); } else { - ans[id] = -1; - } - maxCnt = backupCnt; - numAns = backupNum; - while (winl <= br[block]) { - undo(arr[winl++]); + while (winr < jobr) { + add(arr[++winr]); + } + int backupCnt = maxCnt; + int backupNum = numAns; + while (winl > jobl) { + add(arr[--winl]); + } + if (maxCnt >= jobk) { + ans[id] = sorted[numAns]; + } else { + ans[id] = -1; + } + maxCnt = backupCnt; + numAns = backupNum; + while (winl <= br[block]) { + undo(arr[winl++]); + } } } } } - } - public static void prepare() { - for (int i = 1; i <= n; i++) { - sorted[i] = arr[i]; - } - Arrays.sort(sorted, 1, n + 1); - cntv = 1; - for (int i = 2; i <= n; i++) { - if (sorted[cntv] != sorted[i]) { - sorted[++cntv] = sorted[i]; + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; } + Arrays.sort(sorted, 1, n + 1); + cntv = 1; + for (int i = 2; i <= n; i++) { + if (sorted[cntv] != sorted[i]) { + sorted[++cntv] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = kth(arr[i]); + } + blen = (int) Math.sqrt(n); + bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + br[i] = Math.min(i * blen, n); + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); } - for (int i = 1; i <= n; i++) { - arr[i] = kth(arr[i]); - } - blen = (int) Math.sqrt(n); - bnum = (n + blen - 1) / blen; - for (int i = 1; i <= n; i++) { - bi[i] = (i - 1) / blen + 1; - } - for (int i = 1; i <= bnum; i++) { - br[i] = Math.min(i * blen, n); - } - Arrays.sort(query, 1, m + 1, new QueryCmp()); - } - public static int[] subarrayMajority(int[] nums, int[][] queries) { - n = nums.length; - m = queries.length; - for (int i = 1, j = 0; i <= n; i++, j++) { - arr[i] = nums[j]; - } - for (int i = 1, j = 0; i <= m; i++, j++) { - query[i][0] = queries[j][0] + 1; - query[i][1] = queries[j][1] + 1; - query[i][2] = queries[j][2]; - query[i][3] = i; - } - prepare(); - compute(); - int[] ret = new int[m]; - for (int i = 1, j = 0; i <= m; i++, j++) { - ret[j] = ans[i]; + public static int[] subarrayMajority(int[] nums, int[][] queries) { + n = nums.length; + m = queries.length; + for (int i = 1, j = 0; i <= n; i++, j++) { + arr[i] = nums[j]; + } + for (int i = 1, j = 0; i <= m; i++, j++) { + query[i][0] = queries[j][0] + 1; + query[i][1] = queries[j][1] + 1; + query[i][2] = queries[j][2]; + query[i][3] = i; + } + prepare(); + compute(); + int[] ret = new int[m]; + for (int i = 1, j = 0; i <= m; i++, j++) { + ret[j] = ans[i]; + } + return ret; } - return ret; + } } From d19e549f8790cf6dee64fc9c893f4b7bb3e1996c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 26 Aug 2025 18:45:48 +0800 Subject: [PATCH 0626/1170] modify code --- src/class177/Code03_SameNumberMaxDist1.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index 70f0665a5..f72adf0f9 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -73,13 +73,6 @@ public static int force(int l, int r) { return ret; } - public static void delLeft(int idx) { - int num = arr[idx]; - if (end[num] == idx) { - end[num] = 0; - } - } - public static void addRight(int idx) { int num = arr[idx]; end[num] = idx; @@ -89,7 +82,7 @@ public static void addRight(int idx) { curAns = Math.max(curAns, idx - start[num]); } - public static void undoLeft(int idx) { + public static void addLeft(int idx) { int num = arr[idx]; if (end[num] != 0) { curAns = Math.max(curAns, end[num] - idx); @@ -98,6 +91,13 @@ public static void undoLeft(int idx) { } } + public static void undoLeft(int idx) { + int num = arr[idx]; + if (end[num] == idx) { + end[num] = 0; + } + } + public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { curAns = 0; @@ -117,12 +117,12 @@ public static void compute() { } int backup = curAns; while (winl > jobl) { - undoLeft(--winl); + addLeft(--winl); } ans[id] = curAns; curAns = backup; while (winl <= br[block]) { - delLeft(winl++); + undoLeft(winl++); } } } From 4a2b83f91fb4cf65039e019624499d6d0ac97412 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 10:40:05 +0800 Subject: [PATCH 0627/1170] modify code --- src/class177/Code02_ThresholdMajority1.java | 2 +- src/class177/Code05_MoDelUndo1.java | 2 +- src/class177/Code07_MoOnTree1.java | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 src/class177/Code07_MoOnTree1.java diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index 4f13c3293..7a8fea772 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -1,6 +1,6 @@ package class177; -// 到达阈值的最小众数,java版 +// 达到阈值的最小众数,java版 // 测试链接 : https://leetcode.cn/problems/threshold-majority-queries/ // 提交如下代码中的Solution类,可以通过所有测试用例 diff --git a/src/class177/Code05_MoDelUndo1.java b/src/class177/Code05_MoDelUndo1.java index 976f33a15..d7ede8847 100644 --- a/src/class177/Code05_MoDelUndo1.java +++ b/src/class177/Code05_MoDelUndo1.java @@ -1,6 +1,6 @@ package class177; -// 只减回滚莫队入门题,java版 +// 只删回滚莫队入门题,java版 // 本题最优解为主席树,讲解158,题目2,已经讲述 // 给定一个长度为n的数组arr,一共有m条查询,格式如下 // 查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 diff --git a/src/class177/Code07_MoOnTree1.java b/src/class177/Code07_MoOnTree1.java new file mode 100644 index 000000000..d079f367c --- /dev/null +++ b/src/class177/Code07_MoOnTree1.java @@ -0,0 +1,10 @@ +package class177; + +// 树上莫队入门题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/SP10707 +// 测试链接 : https://www.spoj.com/problems/COT2/ +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code07_MoOnTree1 { + +} From c7b905f8db591e989a043ed027e13183ea2abf23 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 12:35:10 +0800 Subject: [PATCH 0628/1170] modify code --- src/class177/Code07_MoOnTree1.java | 261 ++++++++++++++++++++++++++++- src/class177/Code07_MoOnTree2.java | 209 +++++++++++++++++++++++ 2 files changed, 469 insertions(+), 1 deletion(-) create mode 100644 src/class177/Code07_MoOnTree2.java diff --git a/src/class177/Code07_MoOnTree1.java b/src/class177/Code07_MoOnTree1.java index d079f367c..51088f3f8 100644 --- a/src/class177/Code07_MoOnTree1.java +++ b/src/class177/Code07_MoOnTree1.java @@ -3,8 +3,267 @@ // 树上莫队入门题,java版 // 测试链接 : https://www.luogu.com.cn/problem/SP10707 // 测试链接 : https://www.spoj.com/problems/COT2/ -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code07_MoOnTree2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; public class Code07_MoOnTree1 { + public static int MAXN = 40001; + public static int MAXM = 100001; + public static int MAXP = 20; + public static int n, m; + public static int[] color = new int[MAXN]; + public static int[][] query = new int[MAXM][4]; + public static int[] sorted = new int[MAXN]; + public static int cntv; + + public static int[] head = new int[MAXN]; + public static int[] to = new int[MAXN << 1]; + public static int[] next = new int[MAXN << 1]; + public static int cntg; + + public static int[] dep = new int[MAXN]; + public static int[] seg = new int[MAXN << 1]; + public static int[] startId = new int[MAXN]; + public static int[] endId = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + public static int cntd; + + public static int[] bi = new int[MAXN << 1]; + public static boolean[] vis = new boolean[MAXN]; + public static int[] cnt = new int[MAXN]; + public static int kind = 0; + + public static int[] ans = new int[MAXM]; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static void dfs(int u, int fa) { + dep[u] = dep[fa] + 1; + seg[++cntd] = u; + startId[u] = cntd; + stjump[u][0] = fa; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa) { + dfs(v, u); + } + } + seg[++cntd] = u; + endId[u] = cntd; + } + + public static int lca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return a[1] - b[1]; + } + + } + + public static void update(int node) { + int val = color[node]; + if (vis[node]) { + if (--cnt[val] == 0) { + kind--; + } + } else { + if (++cnt[val] == 1) { + kind++; + } + } + vis[node] = !vis[node]; + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int jobLca = query[i][2]; + int id = query[i][3]; + while (winl > jobl) { + update(seg[--winl]); + } + while (winr < jobr) { + update(seg[++winr]); + } + while (winl < jobl) { + update(seg[winl++]); + } + while (winr > jobr) { + update(seg[winr--]); + } + if (jobLca > 0) { + update(jobLca); + } + ans[id] = kind; + if (jobLca > 0) { + update(jobLca); + } + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = color[i]; + } + Arrays.sort(sorted, 1, n + 1); + cntv = 1; + for (int i = 2; i <= n; i++) { + if (sorted[cntv] != sorted[i]) { + sorted[++cntv] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + color[i] = kth(color[i]); + } + // 括号序列分块 + int blen = (int) Math.sqrt(cntd); + for (int i = 1; i <= cntd; i++) { + bi[i] = (i - 1) / blen + 1; + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + color[i] = in.nextInt(); + } + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + dfs(1, 0); + for (int i = 1, u, v, uvlca; i <= m; i++) { + u = in.nextInt(); + v = in.nextInt(); + if (startId[v] < startId[u]) { + int tmp = u; + u = v; + v = tmp; + } + uvlca = lca(u, v); + if (u == uvlca) { + query[i][0] = startId[u]; + query[i][1] = startId[v]; + query[i][2] = 0; + } else { + query[i][0] = endId[u]; + query[i][1] = startId[v]; + query[i][2] = uvlca; + } + query[i][3] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class177/Code07_MoOnTree2.java b/src/class177/Code07_MoOnTree2.java new file mode 100644 index 000000000..aa6ffc90a --- /dev/null +++ b/src/class177/Code07_MoOnTree2.java @@ -0,0 +1,209 @@ +package class177; + +// 树上莫队入门题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/SP10707 +// 测试链接 : https://www.spoj.com/problems/COT2/ +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, lca, id; +//}; +// +//const int MAXN = 40001; +//const int MAXM = 100001; +//const int MAXP = 20; +//int n, m; +//int color[MAXN]; +//Query query[MAXM]; +//int sorted[MAXN]; +//int cntv; +// +//int head[MAXN]; +//int to[MAXN << 1]; +//int nxt[MAXN << 1]; +//int cntg; +// +//int dep[MAXN]; +//int seg[MAXN << 1]; +//int startId[MAXN]; +//int endId[MAXN]; +//int stjump[MAXN][MAXP]; +//int cntd; +// +//int bi[MAXN << 1]; +//bool vis[MAXN]; +//int cnt[MAXN]; +//int kind; +// +//int ans[MAXM]; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//int kth(int num) { +// int left = 1, right = cntv, mid, ret = 0; +// while (left <= right) { +// mid = (left + right) / 2; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// seg[++cntd] = u; +// startId[u] = cntd; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa) { +// dfs(v, u); +// } +// } +// seg[++cntd] = u; +// endId[u] = cntd; +//} +// +//int lca(int a, int b) { +// if (dep[a] < dep[b]) { +// int tmp = a; a = b; b = tmp; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) return a; +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return a.r < b.r; +//} +// +//void update(int node) { +// int val = color[node]; +// if (vis[node]) { +// if (--cnt[val] == 0) { +// kind--; +// } +// } else { +// if (++cnt[val] == 1) { +// kind++; +// } +// } +// vis[node] = !vis[node]; +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int jobLca = query[i].lca; +// int id = query[i].id; +// while (winl > jobl) { +// update(seg[--winl]); +// } +// while (winr < jobr) { +// update(seg[++winr]); +// } +// while (winl < jobl) { +// update(seg[winl++]); +// } +// while (winr > jobr) { +// update(seg[winr--]); +// } +// if (jobLca > 0) { +// update(jobLca); +// } +// ans[id] = kind; +// if (jobLca > 0) { +// update(jobLca); +// } +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = color[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// cntv = 1; +// for (int i = 2; i <= n; i++) { +// if (sorted[cntv] != sorted[i]) { +// sorted[++cntv] = sorted[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// color[i] = kth(color[i]); +// } +// int blen = (int) sqrt(cntd); +// for (int i = 1; i <= cntd; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> color[i]; +// } +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs(1, 0); +// for (int i = 1, u, v, uvlca; i <= m; i++) { +// cin >> u >> v; +// if (startId[v] < startId[u]) { +// int tmp = u; u = v; v = tmp; +// } +// uvlca = lca(u, v); +// if (u == uvlca) { +// query[i].l = startId[u]; +// query[i].r = startId[v]; +// query[i].lca = 0; +// } else { +// query[i].l = endId[u]; +// query[i].r = startId[v]; +// query[i].lca = uvlca; +// } +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From db159aca6b85b84043d8fb22f6f47f0e664dd135 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 13:20:25 +0800 Subject: [PATCH 0629/1170] modify code --- src/class177/Code03_SameNumberMaxDist1.java | 36 ++++++++++----------- src/class177/Code04_ZeroQuery1.java | 36 ++++++++++----------- src/class177/Code07_MoOnTree1.java | 18 +++++------ src/class177/Code07_MoOnTree2.java | 18 +++++------ 4 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index f72adf0f9..debf1770c 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -25,9 +25,9 @@ public class Code03_SameNumberMaxDist1 { public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; - public static int[] forceEnd = new int[MAXN]; - public static int[] start = new int[MAXN]; - public static int[] end = new int[MAXN]; + public static int[] forceEd = new int[MAXN]; + public static int[] st = new int[MAXN]; + public static int[] ed = new int[MAXN]; public static int curAns = 0; public static int[] ans = new int[MAXN]; @@ -61,48 +61,48 @@ public static int kth(int num) { public static int force(int l, int r) { int ret = 0; for (int i = l; i <= r; i++) { - if (forceEnd[arr[i]] == 0) { - forceEnd[arr[i]] = i; + if (forceEd[arr[i]] == 0) { + forceEd[arr[i]] = i; } else { - ret = Math.max(ret, i - forceEnd[arr[i]]); + ret = Math.max(ret, i - forceEd[arr[i]]); } } for (int i = l; i <= r; i++) { - forceEnd[arr[i]] = 0; + forceEd[arr[i]] = 0; } return ret; } public static void addRight(int idx) { int num = arr[idx]; - end[num] = idx; - if (start[num] == 0) { - start[num] = idx; + ed[num] = idx; + if (st[num] == 0) { + st[num] = idx; } - curAns = Math.max(curAns, idx - start[num]); + curAns = Math.max(curAns, idx - st[num]); } public static void addLeft(int idx) { int num = arr[idx]; - if (end[num] != 0) { - curAns = Math.max(curAns, end[num] - idx); + if (ed[num] != 0) { + curAns = Math.max(curAns, ed[num] - idx); } else { - end[num] = idx; + ed[num] = idx; } } public static void undoLeft(int idx) { int num = arr[idx]; - if (end[num] == idx) { - end[num] = 0; + if (ed[num] == idx) { + ed[num] = 0; } } public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { curAns = 0; - Arrays.fill(start, 1, cntv + 1, 0); - Arrays.fill(end, 1, cntv + 1, 0); + Arrays.fill(st, 1, cntv + 1, 0); + Arrays.fill(ed, 1, cntv + 1, 0); int winl = br[block] + 1; int winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java index 0de082bd9..d9d629747 100644 --- a/src/class177/Code04_ZeroQuery1.java +++ b/src/class177/Code04_ZeroQuery1.java @@ -26,9 +26,9 @@ public class Code04_ZeroQuery1 { public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; - public static int[] forceEnd = new int[MAXN + 1]; - public static int[] start = new int[MAXN + 1]; - public static int[] end = new int[MAXN + 1]; + public static int[] forceEd = new int[MAXN + 1]; + public static int[] st = new int[MAXN + 1]; + public static int[] ed = new int[MAXN + 1]; public static int curAns = 0; public static int[] ans = new int[MAXN]; @@ -62,48 +62,48 @@ public static int kth(int num) { public static int force(int l, int r) { int ret = 0; for (int i = l; i <= r; i++) { - if (forceEnd[arr[i]] == 0) { - forceEnd[arr[i]] = i; + if (forceEd[arr[i]] == 0) { + forceEd[arr[i]] = i; } else { - ret = Math.max(ret, i - forceEnd[arr[i]]); + ret = Math.max(ret, i - forceEd[arr[i]]); } } for (int i = l; i <= r; i++) { - forceEnd[arr[i]] = 0; + forceEd[arr[i]] = 0; } return ret; } public static void addRight(int idx) { int num = arr[idx]; - end[num] = idx; - if (start[num] == 0) { - start[num] = idx; + ed[num] = idx; + if (st[num] == 0) { + st[num] = idx; } - curAns = Math.max(curAns, idx - start[num]); + curAns = Math.max(curAns, idx - st[num]); } public static void addLeft(int idx) { int num = arr[idx]; - if (end[num] != 0) { - curAns = Math.max(curAns, end[num] - idx); + if (ed[num] != 0) { + curAns = Math.max(curAns, ed[num] - idx); } else { - end[num] = idx; + ed[num] = idx; } } public static void undoLeft(int idx) { int num = arr[idx]; - if (end[num] == idx) { - end[num] = 0; + if (ed[num] == idx) { + ed[num] = 0; } } public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { curAns = 0; - Arrays.fill(start, 1, cntv + 1, 0); - Arrays.fill(end, 1, cntv + 1, 0); + Arrays.fill(st, 1, cntv + 1, 0); + Arrays.fill(ed, 1, cntv + 1, 0); int winl = br[block] + 1; int winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { diff --git a/src/class177/Code07_MoOnTree1.java b/src/class177/Code07_MoOnTree1.java index 51088f3f8..c140bc95e 100644 --- a/src/class177/Code07_MoOnTree1.java +++ b/src/class177/Code07_MoOnTree1.java @@ -33,8 +33,8 @@ public class Code07_MoOnTree1 { public static int[] dep = new int[MAXN]; public static int[] seg = new int[MAXN << 1]; - public static int[] startId = new int[MAXN]; - public static int[] endId = new int[MAXN]; + public static int[] st = new int[MAXN]; + public static int[] ed = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXP]; public static int cntd; @@ -68,7 +68,7 @@ public static int kth(int num) { public static void dfs(int u, int fa) { dep[u] = dep[fa] + 1; seg[++cntd] = u; - startId[u] = cntd; + st[u] = cntd; stjump[u][0] = fa; for (int p = 1; p < MAXP; p++) { stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; @@ -80,7 +80,7 @@ public static void dfs(int u, int fa) { } } seg[++cntd] = u; - endId[u] = cntd; + ed[u] = cntd; } public static int lca(int a, int b) { @@ -201,19 +201,19 @@ public static void main(String[] args) throws Exception { for (int i = 1, u, v, uvlca; i <= m; i++) { u = in.nextInt(); v = in.nextInt(); - if (startId[v] < startId[u]) { + if (st[v] < st[u]) { int tmp = u; u = v; v = tmp; } uvlca = lca(u, v); if (u == uvlca) { - query[i][0] = startId[u]; - query[i][1] = startId[v]; + query[i][0] = st[u]; + query[i][1] = st[v]; query[i][2] = 0; } else { - query[i][0] = endId[u]; - query[i][1] = startId[v]; + query[i][0] = ed[u]; + query[i][1] = st[v]; query[i][2] = uvlca; } query[i][3] = i; diff --git a/src/class177/Code07_MoOnTree2.java b/src/class177/Code07_MoOnTree2.java index aa6ffc90a..2f0c239c1 100644 --- a/src/class177/Code07_MoOnTree2.java +++ b/src/class177/Code07_MoOnTree2.java @@ -30,8 +30,8 @@ // //int dep[MAXN]; //int seg[MAXN << 1]; -//int startId[MAXN]; -//int endId[MAXN]; +//int st[MAXN]; +//int ed[MAXN]; //int stjump[MAXN][MAXP]; //int cntd; // @@ -65,7 +65,7 @@ //void dfs(int u, int fa) { // dep[u] = dep[fa] + 1; // seg[++cntd] = u; -// startId[u] = cntd; +// st[u] = cntd; // stjump[u][0] = fa; // for (int p = 1; p < MAXP; p++) { // stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; @@ -77,7 +77,7 @@ // } // } // seg[++cntd] = u; -// endId[u] = cntd; +// ed[u] = cntd; //} // //int lca(int a, int b) { @@ -185,17 +185,17 @@ // dfs(1, 0); // for (int i = 1, u, v, uvlca; i <= m; i++) { // cin >> u >> v; -// if (startId[v] < startId[u]) { +// if (st[v] < st[u]) { // int tmp = u; u = v; v = tmp; // } // uvlca = lca(u, v); // if (u == uvlca) { -// query[i].l = startId[u]; -// query[i].r = startId[v]; +// query[i].l = st[u]; +// query[i].r = st[v]; // query[i].lca = 0; // } else { -// query[i].l = endId[u]; -// query[i].r = startId[v]; +// query[i].l = ed[u]; +// query[i].r = st[v]; // query[i].lca = uvlca; // } // query[i].id = i; From c210e9a022d14b75be126eba7c2329d824515f5e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 16:48:41 +0800 Subject: [PATCH 0630/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 1 + src/class177/Code05_MoDelUndo1.java | 1 + src/class177/Code07_MoOnTree1.java | 21 +- src/class177/Code07_MoOnTree2.java | 41 ++-- src/class177/Code08_CandyPark1.java | 329 ++++++++++++++++++++++++++++ src/class177/Code08_CandyPark2.java | 216 ++++++++++++++++++ 6 files changed, 580 insertions(+), 29 deletions(-) create mode 100644 src/class177/Code08_CandyPark1.java create mode 100644 src/class177/Code08_CandyPark2.java diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index b84c883dd..e0b31d50d 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -32,6 +32,7 @@ public class Code01_MoAddUndo1 { public static long curAns = 0; public static long[] ans = new long[MAXN]; + // 只增回滚莫队经典排序 public static class QueryCmp implements Comparator { @Override diff --git a/src/class177/Code05_MoDelUndo1.java b/src/class177/Code05_MoDelUndo1.java index d7ede8847..fde0c16d7 100644 --- a/src/class177/Code05_MoDelUndo1.java +++ b/src/class177/Code05_MoDelUndo1.java @@ -31,6 +31,7 @@ public class Code05_MoDelUndo1 { public static int mex; public static int[] ans = new int[MAXN]; + // 只删回滚莫队经典排序 public static class QueryCmp implements Comparator { @Override diff --git a/src/class177/Code07_MoOnTree1.java b/src/class177/Code07_MoOnTree1.java index c140bc95e..91f0e4fae 100644 --- a/src/class177/Code07_MoOnTree1.java +++ b/src/class177/Code07_MoOnTree1.java @@ -106,6 +106,7 @@ public static int lca(int a, int b) { return stjump[a][0]; } + // 普通莫队经典排序 public static class QueryCmp implements Comparator { @Override @@ -118,7 +119,7 @@ public int compare(int[] a, int[] b) { } - public static void update(int node) { + public static void modify(int node) { int val = color[node]; if (vis[node]) { if (--cnt[val] == 0) { @@ -137,26 +138,26 @@ public static void compute() { for (int i = 1; i <= m; i++) { int jobl = query[i][0]; int jobr = query[i][1]; - int jobLca = query[i][2]; + int lca = query[i][2]; int id = query[i][3]; while (winl > jobl) { - update(seg[--winl]); + modify(seg[--winl]); } while (winr < jobr) { - update(seg[++winr]); + modify(seg[++winr]); } while (winl < jobl) { - update(seg[winl++]); + modify(seg[winl++]); } while (winr > jobr) { - update(seg[winr--]); + modify(seg[winr--]); } - if (jobLca > 0) { - update(jobLca); + if (lca > 0) { + modify(lca); } ans[id] = kind; - if (jobLca > 0) { - update(jobLca); + if (lca > 0) { + modify(lca); } } } diff --git a/src/class177/Code07_MoOnTree2.java b/src/class177/Code07_MoOnTree2.java index 2f0c239c1..9853b4a86 100644 --- a/src/class177/Code07_MoOnTree2.java +++ b/src/class177/Code07_MoOnTree2.java @@ -17,6 +17,7 @@ //const int MAXN = 40001; //const int MAXM = 100001; //const int MAXP = 20; +// //int n, m; //int color[MAXN]; //Query query[MAXM]; @@ -82,14 +83,16 @@ // //int lca(int a, int b) { // if (dep[a] < dep[b]) { -// int tmp = a; a = b; b = tmp; +// swap(a, b); // } // for (int p = MAXP - 1; p >= 0; p--) { // if (dep[stjump[a][p]] >= dep[b]) { // a = stjump[a][p]; // } // } -// if (a == b) return a; +// if (a == b) { +// return a; +// } // for (int p = MAXP - 1; p >= 0; p--) { // if (stjump[a][p] != stjump[b][p]) { // a = stjump[a][p]; @@ -106,7 +109,7 @@ // return a.r < b.r; //} // -//void update(int node) { +//void modify(int node) { // int val = color[node]; // if (vis[node]) { // if (--cnt[val] == 0) { @@ -125,26 +128,26 @@ // for (int i = 1; i <= m; i++) { // int jobl = query[i].l; // int jobr = query[i].r; -// int jobLca = query[i].lca; +// int lca = query[i].lca; // int id = query[i].id; // while (winl > jobl) { -// update(seg[--winl]); +// modify(seg[--winl]); // } // while (winr < jobr) { -// update(seg[++winr]); +// modify(seg[++winr]); // } // while (winl < jobl) { -// update(seg[winl++]); +// modify(seg[winl++]); // } // while (winr > jobr) { -// update(seg[winr--]); +// modify(seg[winr--]); // } -// if (jobLca > 0) { -// update(jobLca); +// if (lca > 0) { +// modify(lca); // } // ans[id] = kind; -// if (jobLca > 0) { -// update(jobLca); +// if (lca > 0) { +// modify(lca); // } // } //} @@ -186,17 +189,17 @@ // for (int i = 1, u, v, uvlca; i <= m; i++) { // cin >> u >> v; // if (st[v] < st[u]) { -// int tmp = u; u = v; v = tmp; +// swap(u, v); // } // uvlca = lca(u, v); // if (u == uvlca) { -// query[i].l = st[u]; -// query[i].r = st[v]; -// query[i].lca = 0; +// query[i].l = st[u]; +// query[i].r = st[v]; +// query[i].lca = 0; // } else { -// query[i].l = ed[u]; -// query[i].r = st[v]; -// query[i].lca = uvlca; +// query[i].l = ed[u]; +// query[i].r = st[v]; +// query[i].lca = uvlca; // } // query[i].id = i; // } diff --git a/src/class177/Code08_CandyPark1.java b/src/class177/Code08_CandyPark1.java new file mode 100644 index 000000000..787c33eec --- /dev/null +++ b/src/class177/Code08_CandyPark1.java @@ -0,0 +1,329 @@ +package class177; + +// 糖果公园,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4074 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code08_CandyPark1 { + + public static int MAXN = 100001; + public static int MAXP = 20; + public static int n, m, q; + public static int[] v = new int[MAXN]; + public static int[] w = new int[MAXN]; + public static int[] c = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] to = new int[MAXN << 1]; + public static int[] next = new int[MAXN << 1]; + public static int cntg; + + // 每条查询 : l、r、t、lca、id + public static int[][] query = new int[MAXN][5]; + // 每条修改 : pos、val + public static int[][] update = new int[MAXN][2]; + public static int cntq, cntu; + + public static int[] dep = new int[MAXN]; + public static int[] seg = new int[MAXN << 1]; + public static int[] st = new int[MAXN]; + public static int[] ed = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + public static int cntd; + + public static int[] bi = new int[MAXN << 1]; + public static boolean[] vis = new boolean[MAXN]; + public static int[] cnt = new int[MAXN]; + public static long curAns; + public static long[] ans = new long[MAXN]; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + // 递归版,C++可以通过,java会爆栈,需要改迭代 + public static void dfs1(int u, int fa) { + dep[u] = dep[fa] + 1; + seg[++cntd] = u; + st[u] = cntd; + stjump[u][0] = fa; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa) { + dfs1(v, u); + } + } + seg[++cntd] = u; + ed[u] = cntd; + } + + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + public static int[][] ufe = new int[MAXN][3]; + + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + // dfs1的迭代版 + public static void dfs2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dep[u] = dep[f] + 1; + seg[++cntd] = u; + st[u] = cntd; + stjump[u][0] = f; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + e = head[u]; + } else { + e = next[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } else { + seg[++cntd] = u; + ed[u] = cntd; + } + } + } + + public static int lca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + // 带修莫队经典排序 + public static class QueryCmp implements Comparator { + + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if (bi[a[1]] != bi[b[1]]) { + return bi[a[1]] - bi[b[1]]; + } + return a[2] - b[2]; + } + + } + + public static void modify(int node) { + int candy = c[node]; + if (vis[node]) { + curAns -= (long) v[candy] * w[cnt[candy]--]; + } else { + curAns += (long) v[candy] * w[++cnt[candy]]; + } + vis[node] = !vis[node]; + } + + public static void moveTime(int tim) { + int pos = update[tim][0]; + int oldVal = c[pos]; + int newVal = update[tim][1]; + if (vis[pos]) { + modify(pos); + c[pos] = newVal; + update[tim][1] = oldVal; + modify(pos); + } else { + c[pos] = newVal; + update[tim][1] = oldVal; + } + } + + public static void compute() { + int winl = 1, winr = 0, wint = 0; + for (int i = 1; i <= cntq; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int jobt = query[i][2]; + int lca = query[i][3]; + int id = query[i][4]; + while (winl > jobl) { + modify(seg[--winl]); + } + while (winr < jobr) { + modify(seg[++winr]); + } + while (winl < jobl) { + modify(seg[winl++]); + } + while (winr > jobr) { + modify(seg[winr--]); + } + while (wint < jobt) { + moveTime(++wint); + } + while (wint > jobt) { + moveTime(wint--); + } + if (lca > 0) { + modify(lca); + } + ans[id] = curAns; + if (lca > 0) { + modify(lca); + } + } + } + + public static void prapare() { + int blen = Math.max(1, (int) Math.pow(cntd, 2.0 / 3)); + for (int i = 1; i <= cntd; i++) { + bi[i] = (i - 1) / blen + 1; + } + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + q = in.nextInt(); + for (int i = 1; i <= m; i++) { + v[i] = in.nextInt(); + } + for (int i = 1; i <= n; i++) { + w[i] = in.nextInt(); + } + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + for (int i = 1; i <= n; i++) { + c[i] = in.nextInt(); + } + dfs2(); + for (int i = 1, op, x, y; i <= q; i++) { + op = in.nextInt(); + x = in.nextInt(); + y = in.nextInt(); + if (op == 0) { + cntu++; + update[cntu][0] = x; + update[cntu][1] = y; + } else { + if (st[x] > st[y]) { + int tmp = x; + x = y; + y = tmp; + } + int xylca = lca(x, y); + if (x == xylca) { + query[++cntq][0] = st[x]; + query[cntq][1] = st[y]; + query[cntq][2] = cntu; + query[cntq][3] = 0; + query[cntq][4] = cntq; + } else { + query[++cntq][0] = ed[x]; + query[cntq][1] = st[y]; + query[cntq][2] = cntu; + query[cntq][3] = xylca; + query[cntq][4] = cntq; + } + } + } + prapare(); + compute(); + for (int i = 1; i <= cntq; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class177/Code08_CandyPark2.java b/src/class177/Code08_CandyPark2.java new file mode 100644 index 000000000..e15a0e912 --- /dev/null +++ b/src/class177/Code08_CandyPark2.java @@ -0,0 +1,216 @@ +package class177; + +// 糖果公园,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4074 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, t, lca, id; +//}; +// +//struct Update { +// int pos, val; +//}; +// +//const int MAXN = 100001; +//const int MAXP = 20; +//int n, m, q; +//int v[MAXN]; +//int w[MAXN]; +//int c[MAXN]; +// +//int head[MAXN]; +//int to[MAXN << 1]; +//int nxt[MAXN << 1]; +//int cntg; +// +//Query query[MAXN]; +//Update update[MAXN]; +//int cntq, cntu; +// +//int dep[MAXN]; +//int seg[MAXN << 1]; +//int st[MAXN]; +//int ed[MAXN]; +//int stjump[MAXN][MAXP]; +//int cntd; +// +//int bi[MAXN << 1]; +//bool vis[MAXN]; +//int cnt[MAXN]; +//long long curAns; +//long long ans[MAXN]; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// seg[++cntd] = u; +// st[u] = cntd; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa) { +// dfs(v, u); +// } +// } +// seg[++cntd] = u; +// ed[u] = cntd; +//} +// +//int lca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if (bi[a.r] != bi[b.r]) { +// return bi[a.r] < bi[b.r]; +// } +// return a.t < b.t; +//} +// +//void modify(int node) { +// int candy = c[node]; +// if (vis[node]) { +// curAns -= 1LL * v[candy] * w[cnt[candy]--]; +// } else { +// curAns += 1LL * v[candy] * w[++cnt[candy]]; +// } +// vis[node] = !vis[node]; +//} +// +//void moveTime(int tim) { +// int pos = update[tim].pos; +// int oldVal = c[pos]; +// int newVal = update[tim].val; +// if (vis[pos]) { +// modify(pos); +// c[pos] = newVal; +// update[tim].val = oldVal; +// modify(pos); +// } else { +// c[pos] = newVal; +// update[tim].val = oldVal; +// } +//} +// +//void compute() { +// int winl = 1, winr = 0, wint = 0; +// for (int i = 1; i <= cntq; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int jobt = query[i].t; +// int lca = query[i].lca; +// int id = query[i].id; +// while (winl > jobl) { +// modify(seg[--winl]); +// } +// while (winr < jobr) { +// modify(seg[++winr]); +// } +// while (winl < jobl) { +// modify(seg[winl++]); +// } +// while (winr > jobr) { +// modify(seg[winr--]); +// } +// while (wint < jobt) { +// moveTime(++wint); +// } +// while (wint > jobt) { +// moveTime(wint--); +// } +// if (lca > 0) { +// modify(lca); +// } +// ans[id] = curAns; +// if (lca > 0) { +// modify(lca); +// } +// } +//} +// +//void prapare() { +// int blen = max(1, (int)pow(cntd, 2.0 / 3.0)); +// for (int i = 1; i <= cntd; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + cntq + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> q; +// for (int i = 1; i <= m; i++) { +// cin >> v[i]; +// } +// for (int i = 1; i <= n; i++) { +// cin >> w[i]; +// } +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// for (int i = 1; i <= n; i++) { +// cin >> c[i]; +// } +// dfs(1, 0); +// for (int i = 1, op, x, y; i <= q; i++) { +// cin >> op >> x >> y; +// if (op == 0) { +// cntu++; +// update[cntu].pos = x; +// update[cntu].val = y; +// } else { +// if (st[x] > st[y]) { +// swap(x, y); +// } +// int xylca = lca(x, y); +// if (x == xylca) { +// query[++cntq] = {st[x], st[y], cntu, 0, cntq}; +// } else { +// query[++cntq] = {ed[x], st[y], cntu, xylca, cntq}; +// } +// } +// } +// prapare(); +// compute(); +// for (int i = 1; i <= cntq; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 428df5863b443df403d9e4aa08315d4b0c2b320f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 16:51:56 +0800 Subject: [PATCH 0631/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 3 +-- src/class177/Code02_ThresholdMajority1.java | 3 +-- src/class177/Code03_SameNumberMaxDist1.java | 3 +-- src/class177/Code04_ZeroQuery1.java | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index e0b31d50d..ff79f3008 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -86,8 +86,7 @@ public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { curAns = 0; Arrays.fill(cnt, 1, cntv + 1, 0); - int winl = br[block] + 1; - int winr = br[block]; + int winl = br[block] + 1, winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0]; int jobr = query[qi][1]; diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index 7a8fea772..909b1dddc 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -92,8 +92,7 @@ public static void compute() { maxCnt = 0; numAns = 0; Arrays.fill(cnt, 1, cntv + 1, 0); - int winl = br[block] + 1; - int winr = br[block]; + int winl = br[block] + 1, winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0]; int jobr = query[qi][1]; diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index debf1770c..9f27478ad 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -103,8 +103,7 @@ public static void compute() { curAns = 0; Arrays.fill(st, 1, cntv + 1, 0); Arrays.fill(ed, 1, cntv + 1, 0); - int winl = br[block] + 1; - int winr = br[block]; + int winl = br[block] + 1, winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0]; int jobr = query[qi][1]; diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java index d9d629747..057125182 100644 --- a/src/class177/Code04_ZeroQuery1.java +++ b/src/class177/Code04_ZeroQuery1.java @@ -104,8 +104,7 @@ public static void compute() { curAns = 0; Arrays.fill(st, 1, cntv + 1, 0); Arrays.fill(ed, 1, cntv + 1, 0); - int winl = br[block] + 1; - int winr = br[block]; + int winl = br[block] + 1, winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0] - 1; int jobr = query[qi][1]; From 957f8dca70d84d484a71d4f7f5db5ea2f82b57c7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 17:11:01 +0800 Subject: [PATCH 0632/1170] modify code --- src/class177/Code01_MoAddUndo2.java | 150 ++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 src/class177/Code01_MoAddUndo2.java diff --git a/src/class177/Code01_MoAddUndo2.java b/src/class177/Code01_MoAddUndo2.java new file mode 100644 index 000000000..be344297a --- /dev/null +++ b/src/class177/Code01_MoAddUndo2.java @@ -0,0 +1,150 @@ +package class177; + +// 只增回滚莫队入门题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/AT_joisc2014_c +// 测试链接 : https://atcoder.jp/contests/joisc2014/tasks/joisc2014_c +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 100001; +//const int MAXB = 401; +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +//int sorted[MAXN]; +//int cntv; +// +//int blen, bnum; +//int bi[MAXN]; +//int br[MAXB]; +// +//int forceCnt[MAXN]; +//int cnt[MAXN]; +// +//long long curAns = 0; +//long long ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return a.r < b.r; +//} +// +//int kth(int num) { +// int left = 1, right = cntv, ret = 0; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//long long force(int l, int r) { +// long long ret = 0; +// for (int i = l; i <= r; i++) { +// forceCnt[arr[i]]++; +// } +// for (int i = l; i <= r; i++) { +// ret = max(ret, 1LL * forceCnt[arr[i]] * sorted[arr[i]]); +// } +// for (int i = l; i <= r; i++) { +// forceCnt[arr[i]]--; +// } +// return ret; +//} +// +//void add(int num) { +// cnt[num]++; +// curAns = max(curAns, 1LL * cnt[num] * sorted[num]); +//} +// +//void undo(int num) { +// cnt[num]--; +//} +// +//void compute() { +// for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { +// curAns = 0; +// fill(cnt + 1, cnt + cntv + 1, 0); +// int winl = br[block] + 1, winr = br[block]; +// for (; qi <= m && bi[query[qi].l] == block; qi++) { +// int jobl = query[qi].l; +// int jobr = query[qi].r; +// int id = query[qi].id; +// if (jobr <= br[block]) { +// ans[id] = force(jobl, jobr); +// } else { +// while (winr < jobr) { +// add(arr[++winr]); +// } +// long long backup = curAns; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// ans[id] = curAns; +// curAns = backup; +// while (winl <= br[block]) { +// undo(arr[winl++]); +// } +// } +// } +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = arr[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// cntv = 1; +// for (int i = 2; i <= n; i++) { +// if (sorted[cntv] != sorted[i]) { +// sorted[++cntv] = sorted[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(arr[i]); +// } +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// br[i] = min(i * blen, n); +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 0671bd3f6bf13af1d8e0991799112bed9730a163 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 17:19:13 +0800 Subject: [PATCH 0633/1170] modify code --- src/class177/Code03_SameNumberMaxDist2.java | 169 ++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 src/class177/Code03_SameNumberMaxDist2.java diff --git a/src/class177/Code03_SameNumberMaxDist2.java b/src/class177/Code03_SameNumberMaxDist2.java new file mode 100644 index 000000000..cd8d863bf --- /dev/null +++ b/src/class177/Code03_SameNumberMaxDist2.java @@ -0,0 +1,169 @@ +package class177; + +// 相同数的最远距离,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5906 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 200001; +//const int MAXB = 501; +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +//int sortedv[MAXN]; +//int cntv; +// +//int blen, bnum; +//int bi[MAXN]; +//int br[MAXB]; +// +//int forceEd[MAXN]; +//int st[MAXN]; +//int ed[MAXN]; +// +//int curAns = 0; +//int ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return a.r < b.r; +//} +// +//int kth(int num) { +// int left = 1, right = cntv, ret = 0; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sortedv[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//int force(int l, int r) { +// int ret = 0; +// for (int i = l; i <= r; i++) { +// if (forceEd[arr[i]] == 0) { +// forceEd[arr[i]] = i; +// } else { +// ret = max(ret, i - forceEd[arr[i]]); +// } +// } +// for (int i = l; i <= r; i++) { +// forceEd[arr[i]] = 0; +// } +// return ret; +//} +// +//void addRight(int idx) { +// int num = arr[idx]; +// ed[num] = idx; +// if (st[num] == 0) { +// st[num] = idx; +// } +// curAns = max(curAns, idx - st[num]); +//} +// +//void addLeft(int idx) { +// int num = arr[idx]; +// if (ed[num] != 0) { +// curAns = max(curAns, ed[num] - idx); +// } else { +// ed[num] = idx; +// } +//} +// +//void undoLeft(int idx) { +// int num = arr[idx]; +// if (ed[num] == idx) { +// ed[num] = 0; +// } +//} +// +//void compute() { +// for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { +// curAns = 0; +// fill(st + 1, st + cntv + 1, 0); +// fill(ed + 1, ed + cntv + 1, 0); +// int winl = br[block] + 1, winr = br[block]; +// for (; qi <= m && bi[query[qi].l] == block; qi++) { +// int jobl = query[qi].l; +// int jobr = query[qi].r; +// int id = query[qi].id; +// if (jobr <= br[block]) { +// ans[id] = force(jobl, jobr); +// } else { +// while (winr < jobr) { +// addRight(++winr); +// } +// int backup = curAns; +// while (winl > jobl) { +// addLeft(--winl); +// } +// ans[id] = curAns; +// curAns = backup; +// while (winl <= br[block]) { +// undoLeft(winl++); +// } +// } +// } +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sortedv[i] = arr[i]; +// } +// sort(sortedv + 1, sortedv + n + 1); +// cntv = 1; +// for (int i = 2; i <= n; i++) { +// if (sortedv[cntv] != sortedv[i]) { +// sortedv[++cntv] = sortedv[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(arr[i]); +// } +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// br[i] = min(i * blen, n); +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// cin >> m; +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 004f412b8f51d4e54f39a39dde312cd36afc2fd1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 17:26:37 +0800 Subject: [PATCH 0634/1170] modify code --- src/class177/Code03_SameNumberMaxDist2.java | 12 +- src/class177/Code04_ZeroQuery2.java | 174 ++++++++++++++++++++ 2 files changed, 180 insertions(+), 6 deletions(-) create mode 100644 src/class177/Code04_ZeroQuery2.java diff --git a/src/class177/Code03_SameNumberMaxDist2.java b/src/class177/Code03_SameNumberMaxDist2.java index cd8d863bf..52d0e75a8 100644 --- a/src/class177/Code03_SameNumberMaxDist2.java +++ b/src/class177/Code03_SameNumberMaxDist2.java @@ -18,7 +18,7 @@ //int n, m; //int arr[MAXN]; //Query query[MAXN]; -//int sortedv[MAXN]; +//int sorted[MAXN]; //int cntv; // //int blen, bnum; @@ -43,7 +43,7 @@ // int left = 1, right = cntv, ret = 0; // while (left <= right) { // int mid = (left + right) >> 1; -// if (sortedv[mid] <= num) { +// if (sorted[mid] <= num) { // ret = mid; // left = mid + 1; // } else { @@ -125,13 +125,13 @@ // //void prepare() { // for (int i = 1; i <= n; i++) { -// sortedv[i] = arr[i]; +// sorted[i] = arr[i]; // } -// sort(sortedv + 1, sortedv + n + 1); +// sort(sorted + 1, sorted + n + 1); // cntv = 1; // for (int i = 2; i <= n; i++) { -// if (sortedv[cntv] != sortedv[i]) { -// sortedv[++cntv] = sortedv[i]; +// if (sorted[cntv] != sorted[i]) { +// sorted[++cntv] = sorted[i]; // } // } // for (int i = 1; i <= n; i++) { diff --git a/src/class177/Code04_ZeroQuery2.java b/src/class177/Code04_ZeroQuery2.java new file mode 100644 index 000000000..0093e943a --- /dev/null +++ b/src/class177/Code04_ZeroQuery2.java @@ -0,0 +1,174 @@ +package class177; + +// 累加和为0的最长子数组,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/SP20644 +// 测试链接 : https://www.spoj.com/problems/ZQUERY/ +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 50001; +//const int MAXB = 301; +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +//int sorted[MAXN + 1]; +//int cntv; +// +//int blen, bnum; +//int bi[MAXN]; +//int br[MAXB]; +// +//int forceEd[MAXN + 1]; +//int st[MAXN + 1]; +//int ed[MAXN + 1]; +// +//int curAns = 0; +//int ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return a.r < b.r; +//} +// +//int kth(int num) { +// int left = 1, right = cntv, ret = 0; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//int force(int l, int r) { +// int ret = 0; +// for (int i = l; i <= r; i++) { +// if (forceEd[arr[i]] == 0) { +// forceEd[arr[i]] = i; +// } else { +// ret = max(ret, i - forceEd[arr[i]]); +// } +// } +// for (int i = l; i <= r; i++) { +// forceEd[arr[i]] = 0; +// } +// return ret; +//} +// +//void addRight(int idx) { +// int num = arr[idx]; +// ed[num] = idx; +// if (st[num] == 0) { +// st[num] = idx; +// } +// curAns = max(curAns, idx - st[num]); +//} +// +//void addLeft(int idx) { +// int num = arr[idx]; +// if (ed[num] != 0) { +// curAns = max(curAns, ed[num] - idx); +// } else { +// ed[num] = idx; +// } +//} +// +//void undoLeft(int idx) { +// int num = arr[idx]; +// if (ed[num] == idx) { +// ed[num] = 0; +// } +//} +// +//void compute() { +// for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { +// curAns = 0; +// fill(st + 1, st + cntv + 1, 0); +// fill(ed + 1, ed + cntv + 1, 0); +// int winl = br[block] + 1, winr = br[block]; +// for (; qi <= m && bi[query[qi].l] == block; qi++) { +// int jobl = query[qi].l - 1; +// int jobr = query[qi].r; +// int id = query[qi].id; +// if (jobr <= br[block]) { +// ans[id] = force(jobl, jobr); +// } else { +// while (winr < jobr) { +// addRight(++winr); +// } +// int backup = curAns; +// while (winl > jobl) { +// addLeft(--winl); +// } +// ans[id] = curAns; +// curAns = backup; +// while (winl <= br[block]) { +// undoLeft(winl++); +// } +// } +// } +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// arr[i] += arr[i - 1]; +// } +// int len = 0; +// sorted[++len] = 0; +// for (int i = 1; i <= n; i++) { +// sorted[++len] = arr[i]; +// } +// sort(sorted + 1, sorted + len + 1); +// cntv = 1; +// for (int i = 2; i <= len; i++) { +// if (sorted[cntv] != sorted[i]) { +// sorted[++cntv] = sorted[i]; +// } +// } +// for (int i = 0; i <= n; i++) { +// arr[i] = kth(arr[i]); +// } +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// br[i] = min(i * blen, n); +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From cae297c70818870598ef51841811ae1e47c6fff6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 17:31:14 +0800 Subject: [PATCH 0635/1170] modify code --- src/class177/Code05_MoDelUndo2.java | 118 ++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 src/class177/Code05_MoDelUndo2.java diff --git a/src/class177/Code05_MoDelUndo2.java b/src/class177/Code05_MoDelUndo2.java new file mode 100644 index 000000000..d37e06223 --- /dev/null +++ b/src/class177/Code05_MoDelUndo2.java @@ -0,0 +1,118 @@ +package class177; + +// 只删回滚莫队入门题,C++版 +// 本题最优解为主席树,讲解158,题目2,已经讲述 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 +// 0 <= n、m、arr[i] <= 2 * 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P4137 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 200001; +//const int MAXB = 501; +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +// +//int blen, bnum; +//int bi[MAXN]; +//int bl[MAXB]; +// +//int cnt[MAXN + 1]; +//int mex; +//int ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return b.r < a.r; +//} +// +//void del(int num) { +// if (--cnt[num] == 0) { +// mex = min(mex, num); +// } +//} +// +//void undo(int num) { +// cnt[num]++; +//} +// +//void compute() { +// for (int i = 1; i <= n; i++) { +// undo(arr[i]); +// } +// mex = 0; +// while (cnt[mex] != 0) { +// mex++; +// } +// int winl = 1, winr = n; +// for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { +// while (winl < bl[block]) { +// del(arr[winl++]); +// } +// int beforeJob = mex; +// for (; qi <= m && bi[query[qi].l] == block; qi++) { +// int jobl = query[qi].l; +// int jobr = query[qi].r; +// int id = query[qi].id; +// while (winr > jobr) { +// del(arr[winr--]); +// } +// int backup = mex; +// while (winl < jobl) { +// del(arr[winl++]); +// } +// ans[id] = mex; +// mex = backup; +// while (winl > bl[block]) { +// undo(arr[--winl]); +// } +// } +// while (winr < n) { +// undo(arr[++winr]); +// } +// mex = beforeJob; +// } +//} +// +//void prepare() { +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From cba5c01b1ff3455b439aaad5491ca502bbe8d1f2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 17:44:15 +0800 Subject: [PATCH 0636/1170] modify code --- src/class177/Code02_ThresholdMajority1.java | 15 +- src/class177/Code02_ThresholdMajority2.java | 171 ++++++++++++++++++++ 2 files changed, 179 insertions(+), 7 deletions(-) create mode 100644 src/class177/Code02_ThresholdMajority2.java diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index 909b1dddc..592745d8c 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -2,7 +2,7 @@ // 达到阈值的最小众数,java版 // 测试链接 : https://leetcode.cn/problems/threshold-majority-queries/ -// 提交如下代码中的Solution类,可以通过所有测试用例 +// 提交以下代码中的Solution类,可以通过所有测试用例 import java.util.Arrays; import java.util.Comparator; @@ -58,21 +58,22 @@ public static int kth(int num) { } public static int force(int l, int r, int k) { - int maxCnt = 0; - int numAns = 0; + int mx = 0; + int who = 0; for (int i = l; i <= r; i++) { forceCnt[arr[i]]++; } for (int i = l; i <= r; i++) { - if (forceCnt[arr[i]] > maxCnt || (forceCnt[arr[i]] == maxCnt && arr[i] < numAns)) { - maxCnt = forceCnt[arr[i]]; - numAns = arr[i]; + int num = arr[i]; + if (forceCnt[num] > mx || (forceCnt[num] == mx && num < who)) { + mx = forceCnt[num]; + who = num; } } for (int i = l; i <= r; i++) { forceCnt[arr[i]]--; } - return maxCnt >= k ? sorted[numAns] : -1; + return mx >= k ? sorted[who] : -1; } public static void add(int num) { diff --git a/src/class177/Code02_ThresholdMajority2.java b/src/class177/Code02_ThresholdMajority2.java new file mode 100644 index 000000000..036b0fd6a --- /dev/null +++ b/src/class177/Code02_ThresholdMajority2.java @@ -0,0 +1,171 @@ +package class177; + +// 达到阈值的最小众数,C++版 +// 测试链接 : https://leetcode.cn/problems/threshold-majority-queries/ +// 提交以下全部代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, k, id; +//}; +// +//const int MAXN = 10001; +//const int MAXM = 50001; +//const int MAXB = 301; +// +//int n, m; +//int arr[MAXN]; +//Query query[MAXM]; +//int sorted[MAXN]; +//int cntv; +// +//int blen, bnum; +//int bi[MAXN]; +//int br[MAXB]; +// +//int forceCnt[MAXN]; +//int cnt[MAXN]; +// +//int maxCnt; +//int numAns; +//int ans[MAXM]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return a.r < b.r; +//} +// +//int kth(int num) { +// int left = 1, right = cntv, ret = 0; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//int force(int l, int r, int k) { +// int mx = 0, who = 0; +// for (int i = l; i <= r; i++) { +// forceCnt[arr[i]]++; +// } +// for (int i = l; i <= r; i++) { +// int num = arr[i]; +// if (forceCnt[num] > mx || (forceCnt[num] == mx && num < who)) { +// mx = forceCnt[num]; +// who = num; +// } +// } +// for (int i = l; i <= r; i++) { +// forceCnt[arr[i]]--; +// } +// return mx >= k ? sorted[who] : -1; +//} +// +//void add(int num) { +// cnt[num]++; +// if (cnt[num] > maxCnt || (cnt[num] == maxCnt && num < numAns)) { +// maxCnt = cnt[num]; +// numAns = num; +// } +//} +// +//void undo(int num) { +// cnt[num]--; +//} +// +//void compute() { +// for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { +// maxCnt = 0; +// numAns = 0; +// fill(cnt + 1, cnt + cntv + 1, 0); +// int winl = br[block] + 1, winr = br[block]; +// for (; qi <= m && bi[query[qi].l] == block; qi++) { +// int jobl = query[qi].l; +// int jobr = query[qi].r; +// int jobk = query[qi].k; +// int id = query[qi].id; +// if (jobr <= br[block]) { +// ans[id] = force(jobl, jobr, jobk); +// } else { +// while (winr < jobr) { +// add(arr[++winr]); +// } +// int backupCnt = maxCnt; +// int backupNum = numAns; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// if (maxCnt >= jobk) { +// ans[id] = sorted[numAns]; +// } else { +// ans[id] = -1; +// } +// maxCnt = backupCnt; +// numAns = backupNum; +// while (winl <= br[block]) { +// undo(arr[winl++]); +// } +// } +// } +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = arr[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// cntv = 1; +// for (int i = 2; i <= n; i++) { +// if (sorted[cntv] != sorted[i]) { +// sorted[++cntv] = sorted[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(arr[i]); +// } +// blen = (int)sqrt(n); +// bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// br[i] = min(i * blen, n); +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//class Solution { +//public: +// vector subarrayMajority(vector& nums, vector>& queries) { +// n = (int)nums.size(); +// m = (int)queries.size(); +// for (int i = 1; i <= n; i++) { +// arr[i] = nums[i - 1]; +// } +// for (int i = 1; i <= m; i++) { +// query[i].l = queries[i - 1][0] + 1; +// query[i].r = queries[i - 1][1] + 1; +// query[i].k = queries[i - 1][2]; +// query[i].id = i; +// } +// prepare(); +// compute(); +// vector ret(m); +// for (int i = 1; i <= m; i++) { +// ret[i - 1] = ans[i]; +// } +// return ret; +// } +//}; \ No newline at end of file From 8d7d3b627e65cf72e9b8e9c31bea51faf257c5ac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Aug 2025 18:56:51 +0800 Subject: [PATCH 0637/1170] modify code --- src/class177/Code05_MoDelUndo1.java | 18 +++++++++++------- src/class177/Code05_MoDelUndo2.java | 18 +++++++++++------- src/class177/Code06_BaldChief1.java | 24 ++++++++++++++---------- src/class177/Code06_BaldChief2.java | 25 ++++++++++++++----------- 4 files changed, 50 insertions(+), 35 deletions(-) diff --git a/src/class177/Code05_MoDelUndo1.java b/src/class177/Code05_MoDelUndo1.java index fde0c16d7..6c986cb88 100644 --- a/src/class177/Code05_MoDelUndo1.java +++ b/src/class177/Code05_MoDelUndo1.java @@ -44,6 +44,16 @@ public int compare(int[] a, int[] b) { } + public static void init() { + for (int i = 1; i <= n; i++) { + cnt[arr[i]]++; + } + mex = 0; + while (cnt[mex] != 0) { + mex++; + } + } + public static void del(int num) { if (--cnt[num] == 0) { mex = Math.min(mex, num); @@ -55,13 +65,7 @@ public static void undo(int num) { } public static void compute() { - for (int i = 1; i <= n; i++) { - undo(arr[i]); - } - mex = 0; - while (cnt[mex] != 0) { - mex++; - } + init(); int winl = 1, winr = n; for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { while (winl < bl[block]) { diff --git a/src/class177/Code05_MoDelUndo2.java b/src/class177/Code05_MoDelUndo2.java index d37e06223..891d452ac 100644 --- a/src/class177/Code05_MoDelUndo2.java +++ b/src/class177/Code05_MoDelUndo2.java @@ -38,6 +38,16 @@ // return b.r < a.r; //} // +//void init() { +// for (int i = 1; i <= n; i++) { +// cnt[arr[i]]++; +// } +// mex = 0; +// while (cnt[mex] != 0) { +// mex++; +// } +//} +// //void del(int num) { // if (--cnt[num] == 0) { // mex = min(mex, num); @@ -49,13 +59,7 @@ //} // //void compute() { -// for (int i = 1; i <= n; i++) { -// undo(arr[i]); -// } -// mex = 0; -// while (cnt[mex] != 0) { -// mex++; -// } +// init(); // int winl = 1, winr = n; // for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { // while (winl < bl[block]) { diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index 42db55a79..858009e31 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -43,6 +43,18 @@ public int compare(int[] a, int[] b) { } + public static void init() { + for (int v = 1; v <= n; v++) { + last[v] = v - 1; + next[v] = v + 1; + } + next[0] = 1; + last[n + 1] = n; + for (int v = 2; v <= n; v++) { + sum += Math.abs(pos[v] - pos[v - 1]); + } + } + // 删除num public static void del(int num) { int less = last[num], more = next[num]; @@ -67,15 +79,7 @@ public static void undo(int num) { } public static void compute() { - for (int v = 1; v <= n; v++) { - last[v] = v - 1; - next[v] = v + 1; - } - next[0] = 1; - last[n + 1] = n; - for (int v = 2; v <= n; v++) { - sum += Math.abs(pos[v] - pos[v - 1]); - } + init(); int winl = 1, winr = n; for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { while (winl < bl[block]) { @@ -94,10 +98,10 @@ public static void compute() { del(arr[winl++]); } ans[id] = sum; + sum = backup; while (winl > bl[block]) { undo(arr[--winl]); } - sum = backup; } while (winr < n) { undo(arr[++winr]); diff --git a/src/class177/Code06_BaldChief2.java b/src/class177/Code06_BaldChief2.java index bd5fe178c..5806741e1 100644 --- a/src/class177/Code06_BaldChief2.java +++ b/src/class177/Code06_BaldChief2.java @@ -35,6 +35,18 @@ // return a.r > b.r; //} // +//inline void init() { +// for (int v = 1; v <= n; v++) { +// lst[v] = v - 1; +// nxt[v] = v + 1; +// } +// nxt[0] = 1; +// lst[n + 1] = n; +// for (int v = 2; v <= n; v++) { +// sum += abs(pos[v] - pos[v - 1]); +// } +//} +// //inline void del(int num) { // int less = lst[num], more = nxt[num]; // if (less != 0) { @@ -71,16 +83,7 @@ //} // //void compute() { -// for (int v = 1; v <= n; v++) { -// lst[v] = v - 1; -// nxt[v] = v + 1; -// } -// nxt[0] = 1; -// lst[n + 1] = n; -// sum = 0; -// for (int v = 2; v <= n; v++) { -// sum += abs(pos[v] - pos[v - 1]); -// } +// init(); // int winl = 1, winr = n; // for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { // while (winl < bl[block]) { @@ -99,10 +102,10 @@ // del(arr[winl++]); // } // ans[id] = sum; +// sum = backup; // while (winl > bl[block]) { // undo(arr[--winl]); // } -// sum = backup; // } // while (winr < n) { // undo(arr[++winr]); From 95467f5b754847ac4ea55dd2a9d54b9f13368042 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Aug 2025 15:30:37 +0800 Subject: [PATCH 0638/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 6 ++++ src/class177/Code01_MoAddUndo2.java | 6 ++++ src/class177/Code02_ThresholdMajority1.java | 6 ++++ src/class177/Code02_ThresholdMajority2.java | 6 ++++ src/class177/Code03_SameNumberMaxDist1.java | 5 +++ src/class177/Code03_SameNumberMaxDist2.java | 5 +++ src/class177/Code04_ZeroQuery1.java | 37 ++++++++++++++------- src/class177/Code04_ZeroQuery2.java | 29 +++++++++------- 8 files changed, 76 insertions(+), 24 deletions(-) diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index ff79f3008..ee15d2a6e 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -1,6 +1,12 @@ package class177; // 只增回滚莫队入门题,java版 +// 给定一个长度为n的数组arr,下面定义重要度的概念 +// 如果一段范围上,数字x出现c次,那么这个数字的重要度为x * c +// 范围上的最大重要度,就是该范围上,每种数字的重要度取最大值 +// 一共有m条查询,格式 l r : 打印arr[l..r]范围上的最大重要度 +// 1 <= n、m <= 10^5 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/AT_joisc2014_c // 测试链接 : https://atcoder.jp/contests/joisc2014/tasks/joisc2014_c // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class177/Code01_MoAddUndo2.java b/src/class177/Code01_MoAddUndo2.java index be344297a..472170ed2 100644 --- a/src/class177/Code01_MoAddUndo2.java +++ b/src/class177/Code01_MoAddUndo2.java @@ -1,6 +1,12 @@ package class177; // 只增回滚莫队入门题,C++版 +// 给定一个长度为n的数组arr,下面定义重要度的概念 +// 如果一段范围上,数字x出现c次,那么这个数字的重要度为x * c +// 范围上的最大重要度,就是该范围上,每种数字的重要度取最大值 +// 一共有m条查询,格式 l r : 打印arr[l..r]范围上的最大重要度 +// 1 <= n、m <= 10^5 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/AT_joisc2014_c // 测试链接 : https://atcoder.jp/contests/joisc2014/tasks/joisc2014_c // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index 592745d8c..dac3415f6 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -1,6 +1,12 @@ package class177; // 达到阈值的最小众数,java版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r k : arr[l..r]范围上,如果所有数字的出现次数 < k,打印-1 +// 如果有些数字的出现次数 >= k,打印其中的最小众数 +// 1 <= n <= 10^4 +// 1 <= m <= 5 * 10^4 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://leetcode.cn/problems/threshold-majority-queries/ // 提交以下代码中的Solution类,可以通过所有测试用例 diff --git a/src/class177/Code02_ThresholdMajority2.java b/src/class177/Code02_ThresholdMajority2.java index 036b0fd6a..530a03aee 100644 --- a/src/class177/Code02_ThresholdMajority2.java +++ b/src/class177/Code02_ThresholdMajority2.java @@ -1,6 +1,12 @@ package class177; // 达到阈值的最小众数,C++版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r k : arr[l..r]范围上,如果所有数字的出现次数 < k,打印-1 +// 如果有些数字的出现次数 >= k,打印其中的最小众数 +// 1 <= n <= 10^4 +// 1 <= m <= 5 * 10^4 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://leetcode.cn/problems/threshold-majority-queries/ // 提交以下全部代码,可以通过所有测试用例 diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index 9f27478ad..141cbca4e 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -1,6 +1,11 @@ package class177; // 相同数的最远距离,java版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : 打印arr[l..r]范围上,相同的数的最远间隔距离 +// 序列中两个元素的间隔距离指的是两个元素下标差的绝对值 +// 1 <= n、m <= 2 * 10^5 +// 1 <= arr[i] <= 2 * 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5906 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class177/Code03_SameNumberMaxDist2.java b/src/class177/Code03_SameNumberMaxDist2.java index 52d0e75a8..26f75d17f 100644 --- a/src/class177/Code03_SameNumberMaxDist2.java +++ b/src/class177/Code03_SameNumberMaxDist2.java @@ -1,6 +1,11 @@ package class177; // 相同数的最远距离,C++版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : 打印arr[l..r]范围上,相同的数的最远间隔距离 +// 序列中两个元素的间隔距离指的是两个元素下标差的绝对值 +// 1 <= n、m <= 2 * 10^5 +// 1 <= arr[i] <= 2 * 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5906 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java index 057125182..cfed91ea1 100644 --- a/src/class177/Code04_ZeroQuery1.java +++ b/src/class177/Code04_ZeroQuery1.java @@ -1,6 +1,9 @@ package class177; // 累加和为0的最长子数组,java版 +// 给定一个长度为n的数组arr,其中只有1和-1两种值 +// 一共有m条查询,格式 l r : 打印arr[l..r]范围上,累加和为0的最长子数组长度 +// 1 <= n、m <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/SP20644 // 测试链接 : https://www.spoj.com/problems/ZQUERY/ // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,21 +17,21 @@ public class Code04_ZeroQuery1 { - public static int MAXN = 50001; + public static int MAXN = 50002; public static int MAXB = 301; public static int n, m; public static int[] arr = new int[MAXN]; public static int[][] query = new int[MAXN][3]; - public static int[] sorted = new int[MAXN + 1]; + public static int[] sorted = new int[MAXN]; public static int cntv; public static int blen, bnum; public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; - public static int[] forceEd = new int[MAXN + 1]; - public static int[] st = new int[MAXN + 1]; - public static int[] ed = new int[MAXN + 1]; + public static int[] forceEd = new int[MAXN]; + public static int[] st = new int[MAXN]; + public static int[] ed = new int[MAXN]; public static int curAns = 0; public static int[] ans = new int[MAXN]; @@ -106,7 +109,7 @@ public static void compute() { Arrays.fill(ed, 1, cntv + 1, 0); int winl = br[block] + 1, winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { - int jobl = query[qi][0] - 1; + int jobl = query[qi][0]; int jobr = query[qi][1]; int id = query[qi][2]; if (jobr <= br[block]) { @@ -130,24 +133,29 @@ public static void compute() { } public static void prepare() { + // 生成前缀和数组,下标从1开始,补充一个前缀长度为0的前缀和 for (int i = 1; i <= n; i++) { arr[i] += arr[i - 1]; } - int len = 0; - sorted[++len] = 0; + for (int i = n; i >= 0; i--) { + arr[i + 1] = arr[i]; + } + n++; + // 离散化 for (int i = 1; i <= n; i++) { - sorted[++len] = arr[i]; + sorted[i] = arr[i]; } - Arrays.sort(sorted, 1, len + 1); + Arrays.sort(sorted, 1, n + 1); cntv = 1; - for (int i = 2; i <= len; i++) { + for (int i = 2; i <= n; i++) { if (sorted[cntv] != sorted[i]) { sorted[++cntv] = sorted[i]; } } - for (int i = 0; i <= n; i++) { + for (int i = 1; i <= n; i++) { arr[i] = kth(arr[i]); } + // 分块 blen = (int) Math.sqrt(n); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { @@ -156,6 +164,11 @@ public static void prepare() { for (int i = 1; i <= bnum; i++) { br[i] = Math.min(i * blen, n); } + // 原来查询范围 l..r,对应前缀查询范围 l-1..r + // 但是前缀和平移了,所以对应的前缀查询范围 l..r+1 + for (int i = 1; i <= m; i++) { + query[i][1]++; + } Arrays.sort(query, 1, m + 1, new QueryCmp()); } diff --git a/src/class177/Code04_ZeroQuery2.java b/src/class177/Code04_ZeroQuery2.java index 0093e943a..8d2bac2ca 100644 --- a/src/class177/Code04_ZeroQuery2.java +++ b/src/class177/Code04_ZeroQuery2.java @@ -14,21 +14,21 @@ // int l, r, id; //}; // -//const int MAXN = 50001; +//const int MAXN = 50002; //const int MAXB = 301; //int n, m; //int arr[MAXN]; //Query query[MAXN]; -//int sorted[MAXN + 1]; +//int sorted[MAXN]; //int cntv; // //int blen, bnum; //int bi[MAXN]; //int br[MAXB]; // -//int forceEd[MAXN + 1]; -//int st[MAXN + 1]; -//int ed[MAXN + 1]; +//int forceEd[MAXN]; +//int st[MAXN]; +//int ed[MAXN]; // //int curAns = 0; //int ans[MAXN]; @@ -101,7 +101,7 @@ // fill(ed + 1, ed + cntv + 1, 0); // int winl = br[block] + 1, winr = br[block]; // for (; qi <= m && bi[query[qi].l] == block; qi++) { -// int jobl = query[qi].l - 1; +// int jobl = query[qi].l; // int jobr = query[qi].r; // int id = query[qi].id; // if (jobr <= br[block]) { @@ -128,19 +128,21 @@ // for (int i = 1; i <= n; i++) { // arr[i] += arr[i - 1]; // } -// int len = 0; -// sorted[++len] = 0; +// for (int i = n; i >= 0; i--) { +// arr[i + 1] = arr[i]; +// } +// n++; // for (int i = 1; i <= n; i++) { -// sorted[++len] = arr[i]; +// sorted[i] = arr[i]; // } -// sort(sorted + 1, sorted + len + 1); +// sort(sorted + 1, sorted + n + 1); // cntv = 1; -// for (int i = 2; i <= len; i++) { +// for (int i = 2; i <= n; i++) { // if (sorted[cntv] != sorted[i]) { // sorted[++cntv] = sorted[i]; // } // } -// for (int i = 0; i <= n; i++) { +// for (int i = 1; i <= n; i++) { // arr[i] = kth(arr[i]); // } // blen = (int)sqrt(n); @@ -151,6 +153,9 @@ // for (int i = 1; i <= bnum; i++) { // br[i] = min(i * blen, n); // } +// for (int i = 1; i <= m; i++) { +// query[i].r++; +// } // sort(query + 1, query + m + 1, QueryCmp); //} // From adf6d99a9ca3094c33c8e963cb8332aa514920c6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Aug 2025 15:34:52 +0800 Subject: [PATCH 0639/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 2 +- src/class177/Code01_MoAddUndo2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index ee15d2a6e..c5876137b 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -3,7 +3,7 @@ // 只增回滚莫队入门题,java版 // 给定一个长度为n的数组arr,下面定义重要度的概念 // 如果一段范围上,数字x出现c次,那么这个数字的重要度为x * c -// 范围上的最大重要度,就是该范围上,每种数字的重要度取最大值 +// 范围上的最大重要度,就是该范围上,每种数字的重要度,取最大值 // 一共有m条查询,格式 l r : 打印arr[l..r]范围上的最大重要度 // 1 <= n、m <= 10^5 // 1 <= arr[i] <= 10^9 diff --git a/src/class177/Code01_MoAddUndo2.java b/src/class177/Code01_MoAddUndo2.java index 472170ed2..93c83084f 100644 --- a/src/class177/Code01_MoAddUndo2.java +++ b/src/class177/Code01_MoAddUndo2.java @@ -3,7 +3,7 @@ // 只增回滚莫队入门题,C++版 // 给定一个长度为n的数组arr,下面定义重要度的概念 // 如果一段范围上,数字x出现c次,那么这个数字的重要度为x * c -// 范围上的最大重要度,就是该范围上,每种数字的重要度取最大值 +// 范围上的最大重要度,就是该范围上,每种数字的重要度,取最大值 // 一共有m条查询,格式 l r : 打印arr[l..r]范围上的最大重要度 // 1 <= n、m <= 10^5 // 1 <= arr[i] <= 10^9 From f4ec7aebab06c1c656e342e5a97517330ff4eaf3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Aug 2025 15:44:19 +0800 Subject: [PATCH 0640/1170] modify code --- src/class177/Code06_BaldChief1.java | 5 +++++ src/class177/Code06_BaldChief2.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index 858009e31..578482b70 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -1,6 +1,11 @@ package class177; // 秃子酋长,java版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : 打印arr[l..r]范围上,如果所有数排序后, +// 相邻的数在原序列中的位置的差的绝对值之和 +// 注意arr很特殊,1~n这些数字在arr中都只出现1次 +// 1 <= n、m <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P8078 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class177/Code06_BaldChief2.java b/src/class177/Code06_BaldChief2.java index 5806741e1..6a64e31b1 100644 --- a/src/class177/Code06_BaldChief2.java +++ b/src/class177/Code06_BaldChief2.java @@ -1,6 +1,11 @@ package class177; // 秃子酋长,C++版 +// 给定一个长度为n的数组arr,一共有m条查询,格式如下 +// 查询 l r : 打印arr[l..r]范围上,如果所有数排序后, +// 相邻的数在原序列中的位置的差的绝对值之和 +// 注意arr很特殊,1~n这些数字在arr中都只出现1次 +// 1 <= n、m <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P8078 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From af6b6572f85d868a0f3e58c4897d92aa34fba7ad Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Aug 2025 15:51:17 +0800 Subject: [PATCH 0641/1170] modify code --- src/class177/Code07_MoOnTree1.java | 5 +++++ src/class177/Code07_MoOnTree2.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/class177/Code07_MoOnTree1.java b/src/class177/Code07_MoOnTree1.java index 91f0e4fae..bf54d9477 100644 --- a/src/class177/Code07_MoOnTree1.java +++ b/src/class177/Code07_MoOnTree1.java @@ -1,6 +1,11 @@ package class177; // 树上莫队入门题,java版 +// 一共有n个节点,每个节点给定颜色值,给定n-1条边,所有节点连成一棵树 +// 一共有m条查询,格式 u v : 打印点u到点v的简单路径上,有几种不同的颜色 +// 1 <= n <= 4 * 10^4 +// 1 <= m <= 10^5 +// 1 <= 颜色值 <= 2 * 10^9 // 测试链接 : https://www.luogu.com.cn/problem/SP10707 // 测试链接 : https://www.spoj.com/problems/COT2/ // 提交以下的code,提交时请把类名改成"Main" diff --git a/src/class177/Code07_MoOnTree2.java b/src/class177/Code07_MoOnTree2.java index 9853b4a86..8bdb751d4 100644 --- a/src/class177/Code07_MoOnTree2.java +++ b/src/class177/Code07_MoOnTree2.java @@ -1,6 +1,11 @@ package class177; // 树上莫队入门题,C++版 +// 一共有n个节点,每个节点给定颜色值,给定n-1条边,所有节点连成一棵树 +// 一共有m条查询,格式 u v : 打印点u到点v的简单路径上,有几种不同的颜色 +// 1 <= n <= 4 * 10^4 +// 1 <= m <= 10^5 +// 1 <= 颜色值 <= 2 * 10^9 // 测试链接 : https://www.luogu.com.cn/problem/SP10707 // 测试链接 : https://www.spoj.com/problems/COT2/ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 12443e5a4a385783fdbf1654cb52c8adf5f8820e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Aug 2025 16:53:13 +0800 Subject: [PATCH 0642/1170] modify code --- src/class177/Code08_CandyPark1.java | 8 ++++++++ src/class177/Code08_CandyPark2.java | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/class177/Code08_CandyPark1.java b/src/class177/Code08_CandyPark1.java index 787c33eec..b694ce432 100644 --- a/src/class177/Code08_CandyPark1.java +++ b/src/class177/Code08_CandyPark1.java @@ -1,6 +1,14 @@ package class177; // 糖果公园,java版 +// 一共有n个公园,给定n-1条边,所有公园连成一棵树,c[i]为i号公园的糖果型号 +// 一共有m种糖果,v[y]表示y号糖果的美味指数,给定长度为n的数组w,用于计算愉悦值 +// 假设游客当前遇到了y号糖果,并且是第x次遇到,那么愉悦值会增加 v[y] * w[x] +// 随着游客遇到各种各样的糖果,愉悦值会不断上升,接下来有q条操作,操作类型如下 +// 操作 0 x y : 第x号公园的糖果型号改成y +// 操作 1 x y : 游客从点x出发走过简单路径到达y,依次遇到每个公园的糖果,打印最终的愉悦值 +// 1 <= n、m、q <= 10^5 +// 1 <= v[i]、w[i] <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P4074 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class177/Code08_CandyPark2.java b/src/class177/Code08_CandyPark2.java index e15a0e912..9cca3143b 100644 --- a/src/class177/Code08_CandyPark2.java +++ b/src/class177/Code08_CandyPark2.java @@ -1,6 +1,14 @@ package class177; // 糖果公园,C++版 +// 一共有n个公园,给定n-1条边,所有公园连成一棵树,c[i]为i号公园的糖果型号 +// 一共有m种糖果,v[y]表示y号糖果的美味指数,给定长度为n的数组w,用于计算愉悦值 +// 假设游客当前遇到了y号糖果,并且是第x次遇到,那么愉悦值会增加 v[y] * w[x] +// 随着游客遇到各种各样的糖果,愉悦值会不断上升,接下来有q条操作,操作类型如下 +// 操作 0 x y : 第x号公园的糖果型号改成y +// 操作 1 x y : 游客从点x出发走过简单路径到达y,依次遇到每个公园的糖果,打印最终的愉悦值 +// 1 <= n、m、q <= 10^5 +// 1 <= v[i]、w[i] <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P4074 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 1ed9ce8cf11b3beccbc207b9ded875dfaa32d9b5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Aug 2025 17:09:20 +0800 Subject: [PATCH 0643/1170] modify code --- src/class177/Code04_ZeroQuery1.java | 12 +++++------- src/class177/Code04_ZeroQuery2.java | 9 ++++++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java index cfed91ea1..7a1539d44 100644 --- a/src/class177/Code04_ZeroQuery1.java +++ b/src/class177/Code04_ZeroQuery1.java @@ -141,7 +141,11 @@ public static void prepare() { arr[i + 1] = arr[i]; } n++; - // 离散化 + // 原来查询范围 l..r,对应前缀和查询范围 l-1..r + // 现在前缀和平移了,所以对应前缀查询范围 l..r+1 + for (int i = 1; i <= m; i++) { + query[i][1]++; + } for (int i = 1; i <= n; i++) { sorted[i] = arr[i]; } @@ -155,7 +159,6 @@ public static void prepare() { for (int i = 1; i <= n; i++) { arr[i] = kth(arr[i]); } - // 分块 blen = (int) Math.sqrt(n); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; i++) { @@ -164,11 +167,6 @@ public static void prepare() { for (int i = 1; i <= bnum; i++) { br[i] = Math.min(i * blen, n); } - // 原来查询范围 l..r,对应前缀查询范围 l-1..r - // 但是前缀和平移了,所以对应的前缀查询范围 l..r+1 - for (int i = 1; i <= m; i++) { - query[i][1]++; - } Arrays.sort(query, 1, m + 1, new QueryCmp()); } diff --git a/src/class177/Code04_ZeroQuery2.java b/src/class177/Code04_ZeroQuery2.java index 8d2bac2ca..51c96c0b9 100644 --- a/src/class177/Code04_ZeroQuery2.java +++ b/src/class177/Code04_ZeroQuery2.java @@ -1,6 +1,9 @@ package class177; // 累加和为0的最长子数组,C++版 +// 给定一个长度为n的数组arr,其中只有1和-1两种值 +// 一共有m条查询,格式 l r : 打印arr[l..r]范围上,累加和为0的最长子数组长度 +// 1 <= n、m <= 5 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/SP20644 // 测试链接 : https://www.spoj.com/problems/ZQUERY/ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -132,6 +135,9 @@ // arr[i + 1] = arr[i]; // } // n++; +// for (int i = 1; i <= m; i++) { +// query[i].r++; +// } // for (int i = 1; i <= n; i++) { // sorted[i] = arr[i]; // } @@ -153,9 +159,6 @@ // for (int i = 1; i <= bnum; i++) { // br[i] = min(i * blen, n); // } -// for (int i = 1; i <= m; i++) { -// query[i].r++; -// } // sort(query + 1, query + m + 1, QueryCmp); //} // From ec2123319ca5b61ad33674d78813a33918ccd0c5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Aug 2025 17:56:08 +0800 Subject: [PATCH 0644/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 4 ++-- src/class177/Code01_MoAddUndo2.java | 4 ++-- src/class177/Code02_ThresholdMajority1.java | 4 ++-- src/class177/Code02_ThresholdMajority2.java | 4 ++-- src/class177/Code03_SameNumberMaxDist1.java | 4 ++-- src/class177/Code03_SameNumberMaxDist2.java | 4 ++-- src/class177/Code04_ZeroQuery1.java | 4 ++-- src/class177/Code04_ZeroQuery2.java | 4 ++-- src/class177/Code05_MoDelUndo1.java | 6 +++--- src/class177/Code05_MoDelUndo2.java | 6 +++--- src/class177/Code06_BaldChief1.java | 9 +++------ src/class177/Code06_BaldChief2.java | 6 +++--- 12 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index c5876137b..66f0c46ae 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -84,7 +84,7 @@ public static void add(int num) { curAns = Math.max(curAns, (long) cnt[num] * sorted[num]); } - public static void undo(int num) { + public static void del(int num) { cnt[num]--; } @@ -110,7 +110,7 @@ public static void compute() { ans[id] = curAns; curAns = backup; while (winl <= br[block]) { - undo(arr[winl++]); + del(arr[winl++]); } } } diff --git a/src/class177/Code01_MoAddUndo2.java b/src/class177/Code01_MoAddUndo2.java index 93c83084f..0e5df71ef 100644 --- a/src/class177/Code01_MoAddUndo2.java +++ b/src/class177/Code01_MoAddUndo2.java @@ -78,7 +78,7 @@ // curAns = max(curAns, 1LL * cnt[num] * sorted[num]); //} // -//void undo(int num) { +//void del(int num) { // cnt[num]--; //} // @@ -104,7 +104,7 @@ // ans[id] = curAns; // curAns = backup; // while (winl <= br[block]) { -// undo(arr[winl++]); +// del(arr[winl++]); // } // } // } diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index dac3415f6..17ba5dc1f 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -90,7 +90,7 @@ public static void add(int num) { } } - public static void undo(int num) { + public static void del(int num) { cnt[num]--; } @@ -124,7 +124,7 @@ public static void compute() { maxCnt = backupCnt; numAns = backupNum; while (winl <= br[block]) { - undo(arr[winl++]); + del(arr[winl++]); } } } diff --git a/src/class177/Code02_ThresholdMajority2.java b/src/class177/Code02_ThresholdMajority2.java index 530a03aee..9b312e834 100644 --- a/src/class177/Code02_ThresholdMajority2.java +++ b/src/class177/Code02_ThresholdMajority2.java @@ -86,7 +86,7 @@ // } //} // -//void undo(int num) { +//void del(int num) { // cnt[num]--; //} // @@ -120,7 +120,7 @@ // maxCnt = backupCnt; // numAns = backupNum; // while (winl <= br[block]) { -// undo(arr[winl++]); +// del(arr[winl++]); // } // } // } diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index 141cbca4e..7d32836bf 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -96,7 +96,7 @@ public static void addLeft(int idx) { } } - public static void undoLeft(int idx) { + public static void delLeft(int idx) { int num = arr[idx]; if (ed[num] == idx) { ed[num] = 0; @@ -126,7 +126,7 @@ public static void compute() { ans[id] = curAns; curAns = backup; while (winl <= br[block]) { - undoLeft(winl++); + delLeft(winl++); } } } diff --git a/src/class177/Code03_SameNumberMaxDist2.java b/src/class177/Code03_SameNumberMaxDist2.java index 26f75d17f..ee9e7e463 100644 --- a/src/class177/Code03_SameNumberMaxDist2.java +++ b/src/class177/Code03_SameNumberMaxDist2.java @@ -91,7 +91,7 @@ // } //} // -//void undoLeft(int idx) { +//void delLeft(int idx) { // int num = arr[idx]; // if (ed[num] == idx) { // ed[num] = 0; @@ -121,7 +121,7 @@ // ans[id] = curAns; // curAns = backup; // while (winl <= br[block]) { -// undoLeft(winl++); +// delLeft(winl++); // } // } // } diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java index 7a1539d44..3983075e5 100644 --- a/src/class177/Code04_ZeroQuery1.java +++ b/src/class177/Code04_ZeroQuery1.java @@ -95,7 +95,7 @@ public static void addLeft(int idx) { } } - public static void undoLeft(int idx) { + public static void delLeft(int idx) { int num = arr[idx]; if (ed[num] == idx) { ed[num] = 0; @@ -125,7 +125,7 @@ public static void compute() { ans[id] = curAns; curAns = backup; while (winl <= br[block]) { - undoLeft(winl++); + delLeft(winl++); } } } diff --git a/src/class177/Code04_ZeroQuery2.java b/src/class177/Code04_ZeroQuery2.java index 51c96c0b9..a420ad38d 100644 --- a/src/class177/Code04_ZeroQuery2.java +++ b/src/class177/Code04_ZeroQuery2.java @@ -90,7 +90,7 @@ // } //} // -//void undoLeft(int idx) { +//void delLeft(int idx) { // int num = arr[idx]; // if (ed[num] == idx) { // ed[num] = 0; @@ -120,7 +120,7 @@ // ans[id] = curAns; // curAns = backup; // while (winl <= br[block]) { -// undoLeft(winl++); +// delLeft(winl++); // } // } // } diff --git a/src/class177/Code05_MoDelUndo1.java b/src/class177/Code05_MoDelUndo1.java index 6c986cb88..c3b48c47c 100644 --- a/src/class177/Code05_MoDelUndo1.java +++ b/src/class177/Code05_MoDelUndo1.java @@ -60,7 +60,7 @@ public static void del(int num) { } } - public static void undo(int num) { + public static void add(int num) { cnt[num]++; } @@ -86,11 +86,11 @@ public static void compute() { ans[id] = mex; mex = backup; while (winl > bl[block]) { - undo(arr[--winl]); + add(arr[--winl]); } } while (winr < n) { - undo(arr[++winr]); + add(arr[++winr]); } mex = beforeJob; } diff --git a/src/class177/Code05_MoDelUndo2.java b/src/class177/Code05_MoDelUndo2.java index 891d452ac..abaa604a8 100644 --- a/src/class177/Code05_MoDelUndo2.java +++ b/src/class177/Code05_MoDelUndo2.java @@ -54,7 +54,7 @@ // } //} // -//void undo(int num) { +//void add(int num) { // cnt[num]++; //} // @@ -80,11 +80,11 @@ // ans[id] = mex; // mex = backup; // while (winl > bl[block]) { -// undo(arr[--winl]); +// add(arr[--winl]); // } // } // while (winr < n) { -// undo(arr[++winr]); +// add(arr[++winr]); // } // mex = beforeJob; // } diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index 578482b70..b522f054e 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -60,7 +60,6 @@ public static void init() { } } - // 删除num public static void del(int num) { int less = last[num], more = next[num]; if (less != 0) { @@ -76,9 +75,7 @@ public static void del(int num) { last[more] = less; } - // 加入num,必须保证num上一次删除的数字 - // 也就是说,undo的调用必须是del操作的回滚 - public static void undo(int num) { + public static void add(int num) { next[last[num]] = num; last[next[num]] = num; } @@ -105,11 +102,11 @@ public static void compute() { ans[id] = sum; sum = backup; while (winl > bl[block]) { - undo(arr[--winl]); + add(arr[--winl]); } } while (winr < n) { - undo(arr[++winr]); + add(arr[++winr]); } sum = beforeJob; } diff --git a/src/class177/Code06_BaldChief2.java b/src/class177/Code06_BaldChief2.java index 6a64e31b1..1e02e390f 100644 --- a/src/class177/Code06_BaldChief2.java +++ b/src/class177/Code06_BaldChief2.java @@ -67,7 +67,7 @@ // lst[more] = less; //} // -//inline void undo(int num) { +//inline void add(int num) { // nxt[lst[num]] = num; // lst[nxt[num]] = num; //} @@ -109,11 +109,11 @@ // ans[id] = sum; // sum = backup; // while (winl > bl[block]) { -// undo(arr[--winl]); +// add(arr[--winl]); // } // } // while (winr < n) { -// undo(arr[++winr]); +// add(arr[++winr]); // } // sum = beforeJob; // } From 534fbbed574c4a8d0103b59662eb9d4fd41c866d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Aug 2025 22:07:58 +0800 Subject: [PATCH 0645/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index 66f0c46ae..fec170f88 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -29,13 +29,19 @@ public class Code01_MoAddUndo1 { public static int cntv; public static int blen, bnum; + // 查询块号 public static int[] bi = new int[MAXN]; + // 查询每块的右边界 public static int[] br = new int[MAXB]; + // 每组暴力遍历的任务,需要的词频表为forceCnt public static int[] forceCnt = new int[MAXN]; + // 每组滑窗回滚的任务,需要的词频表为cnt public static int[] cnt = new int[MAXN]; + // 当前窗口的最大重要度 public static long curAns = 0; + // 收集所有答案 public static long[] ans = new long[MAXN]; // 只增回滚莫队经典排序 From d9592adf8e45c64390661175ce44c234a2504177 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 30 Aug 2025 11:08:04 +0800 Subject: [PATCH 0646/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 2 +- src/class177/Code01_MoAddUndo2.java | 2 +- src/class177/Code02_ThresholdMajority1.java | 16 ++++++++-------- src/class177/Code02_ThresholdMajority2.java | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index fec170f88..6518f0bfa 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -38,9 +38,9 @@ public class Code01_MoAddUndo1 { public static int[] forceCnt = new int[MAXN]; // 每组滑窗回滚的任务,需要的词频表为cnt public static int[] cnt = new int[MAXN]; - // 当前窗口的最大重要度 public static long curAns = 0; + // 收集所有答案 public static long[] ans = new long[MAXN]; diff --git a/src/class177/Code01_MoAddUndo2.java b/src/class177/Code01_MoAddUndo2.java index 0e5df71ef..f0beb584b 100644 --- a/src/class177/Code01_MoAddUndo2.java +++ b/src/class177/Code01_MoAddUndo2.java @@ -34,8 +34,8 @@ // //int forceCnt[MAXN]; //int cnt[MAXN]; -// //long long curAns = 0; +// //long long ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index 17ba5dc1f..fd5711aef 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -32,9 +32,9 @@ class Solution { public static int[] forceCnt = new int[MAXN]; public static int[] cnt = new int[MAXN]; - public static int maxCnt; - public static int numAns; + public static int minMode; + public static int[] ans = new int[MAXM]; public static class QueryCmp implements Comparator { @@ -84,9 +84,9 @@ public static int force(int l, int r, int k) { public static void add(int num) { cnt[num]++; - if (cnt[num] > maxCnt || (cnt[num] == maxCnt && num < numAns)) { + if (cnt[num] > maxCnt || (cnt[num] == maxCnt && num < minMode)) { maxCnt = cnt[num]; - numAns = num; + minMode = num; } } @@ -97,7 +97,7 @@ public static void del(int num) { public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { maxCnt = 0; - numAns = 0; + minMode = 0; Arrays.fill(cnt, 1, cntv + 1, 0); int winl = br[block] + 1, winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { @@ -112,17 +112,17 @@ public static void compute() { add(arr[++winr]); } int backupCnt = maxCnt; - int backupNum = numAns; + int backupNum = minMode; while (winl > jobl) { add(arr[--winl]); } if (maxCnt >= jobk) { - ans[id] = sorted[numAns]; + ans[id] = sorted[minMode]; } else { ans[id] = -1; } maxCnt = backupCnt; - numAns = backupNum; + minMode = backupNum; while (winl <= br[block]) { del(arr[winl++]); } diff --git a/src/class177/Code02_ThresholdMajority2.java b/src/class177/Code02_ThresholdMajority2.java index 9b312e834..6f9600fec 100644 --- a/src/class177/Code02_ThresholdMajority2.java +++ b/src/class177/Code02_ThresholdMajority2.java @@ -34,9 +34,9 @@ // //int forceCnt[MAXN]; //int cnt[MAXN]; -// //int maxCnt; //int numAns; +// //int ans[MAXM]; // //bool QueryCmp(Query &a, Query &b) { From 11ce78dc2d80ed8a0083dcb97ae6c14bb6cc6071 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 30 Aug 2025 17:05:15 +0800 Subject: [PATCH 0647/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 10 ++--- src/class177/Code01_MoAddUndo2.java | 7 ++-- src/class177/Code02_ThresholdMajority1.java | 9 ++--- src/class177/Code02_ThresholdMajority2.java | 23 +++++------ src/class177/Code03_SameNumberMaxDist1.java | 45 ++++++++++----------- src/class177/Code03_SameNumberMaxDist2.java | 45 ++++++++++----------- 6 files changed, 66 insertions(+), 73 deletions(-) diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index 6518f0bfa..6f273d736 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -34,9 +34,7 @@ public class Code01_MoAddUndo1 { // 查询每块的右边界 public static int[] br = new int[MAXB]; - // 每组暴力遍历的任务,需要的词频表为forceCnt - public static int[] forceCnt = new int[MAXN]; - // 每组滑窗回滚的任务,需要的词频表为cnt + // 词频表 public static int[] cnt = new int[MAXN]; // 当前窗口的最大重要度 public static long curAns = 0; @@ -74,13 +72,13 @@ public static int kth(int num) { public static long force(int l, int r) { long ret = 0; for (int i = l; i <= r; i++) { - forceCnt[arr[i]]++; + cnt[arr[i]]++; } for (int i = l; i <= r; i++) { - ret = Math.max(ret, (long) forceCnt[arr[i]] * sorted[arr[i]]); + ret = Math.max(ret, (long) cnt[arr[i]] * sorted[arr[i]]); } for (int i = l; i <= r; i++) { - forceCnt[arr[i]]--; + cnt[arr[i]]--; } return ret; } diff --git a/src/class177/Code01_MoAddUndo2.java b/src/class177/Code01_MoAddUndo2.java index f0beb584b..fae0b8c91 100644 --- a/src/class177/Code01_MoAddUndo2.java +++ b/src/class177/Code01_MoAddUndo2.java @@ -32,7 +32,6 @@ //int bi[MAXN]; //int br[MAXB]; // -//int forceCnt[MAXN]; //int cnt[MAXN]; //long long curAns = 0; // @@ -62,13 +61,13 @@ //long long force(int l, int r) { // long long ret = 0; // for (int i = l; i <= r; i++) { -// forceCnt[arr[i]]++; +// cnt[arr[i]]++; // } // for (int i = l; i <= r; i++) { -// ret = max(ret, 1LL * forceCnt[arr[i]] * sorted[arr[i]]); +// ret = max(ret, 1LL * cnt[arr[i]] * sorted[arr[i]]); // } // for (int i = l; i <= r; i++) { -// forceCnt[arr[i]]--; +// cnt[arr[i]]--; // } // return ret; //} diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index fd5711aef..e6d3a1bd9 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -30,7 +30,6 @@ class Solution { public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; - public static int[] forceCnt = new int[MAXN]; public static int[] cnt = new int[MAXN]; public static int maxCnt; public static int minMode; @@ -67,17 +66,17 @@ public static int force(int l, int r, int k) { int mx = 0; int who = 0; for (int i = l; i <= r; i++) { - forceCnt[arr[i]]++; + cnt[arr[i]]++; } for (int i = l; i <= r; i++) { int num = arr[i]; - if (forceCnt[num] > mx || (forceCnt[num] == mx && num < who)) { - mx = forceCnt[num]; + if (cnt[num] > mx || (cnt[num] == mx && num < who)) { + mx = cnt[num]; who = num; } } for (int i = l; i <= r; i++) { - forceCnt[arr[i]]--; + cnt[arr[i]]--; } return mx >= k ? sorted[who] : -1; } diff --git a/src/class177/Code02_ThresholdMajority2.java b/src/class177/Code02_ThresholdMajority2.java index 6f9600fec..f92d837ca 100644 --- a/src/class177/Code02_ThresholdMajority2.java +++ b/src/class177/Code02_ThresholdMajority2.java @@ -32,10 +32,9 @@ //int bi[MAXN]; //int br[MAXB]; // -//int forceCnt[MAXN]; //int cnt[MAXN]; //int maxCnt; -//int numAns; +//int minMode; // //int ans[MAXM]; // @@ -63,26 +62,26 @@ //int force(int l, int r, int k) { // int mx = 0, who = 0; // for (int i = l; i <= r; i++) { -// forceCnt[arr[i]]++; +// cnt[arr[i]]++; // } // for (int i = l; i <= r; i++) { // int num = arr[i]; -// if (forceCnt[num] > mx || (forceCnt[num] == mx && num < who)) { -// mx = forceCnt[num]; +// if (cnt[num] > mx || (cnt[num] == mx && num < who)) { +// mx = cnt[num]; // who = num; // } // } // for (int i = l; i <= r; i++) { -// forceCnt[arr[i]]--; +// cnt[arr[i]]--; // } // return mx >= k ? sorted[who] : -1; //} // //void add(int num) { // cnt[num]++; -// if (cnt[num] > maxCnt || (cnt[num] == maxCnt && num < numAns)) { +// if (cnt[num] > maxCnt || (cnt[num] == maxCnt && num < minMode)) { // maxCnt = cnt[num]; -// numAns = num; +// minMode = num; // } //} // @@ -93,7 +92,7 @@ //void compute() { // for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { // maxCnt = 0; -// numAns = 0; +// minMode = 0; // fill(cnt + 1, cnt + cntv + 1, 0); // int winl = br[block] + 1, winr = br[block]; // for (; qi <= m && bi[query[qi].l] == block; qi++) { @@ -108,17 +107,17 @@ // add(arr[++winr]); // } // int backupCnt = maxCnt; -// int backupNum = numAns; +// int backupNum = minMode; // while (winl > jobl) { // add(arr[--winl]); // } // if (maxCnt >= jobk) { -// ans[id] = sorted[numAns]; +// ans[id] = sorted[minMode]; // } else { // ans[id] = -1; // } // maxCnt = backupCnt; -// numAns = backupNum; +// minMode = backupNum; // while (winl <= br[block]) { // del(arr[winl++]); // } diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index 7d32836bf..b0ca212ce 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -30,11 +30,10 @@ public class Code03_SameNumberMaxDist1 { public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; - public static int[] forceEd = new int[MAXN]; - public static int[] st = new int[MAXN]; - public static int[] ed = new int[MAXN]; + public static int[] first = new int[MAXN]; + public static int[] mostRight = new int[MAXN]; + public static int maxDist; - public static int curAns = 0; public static int[] ans = new int[MAXN]; public static class QueryCmp implements Comparator { @@ -66,48 +65,48 @@ public static int kth(int num) { public static int force(int l, int r) { int ret = 0; for (int i = l; i <= r; i++) { - if (forceEd[arr[i]] == 0) { - forceEd[arr[i]] = i; + if (first[arr[i]] == 0) { + first[arr[i]] = i; } else { - ret = Math.max(ret, i - forceEd[arr[i]]); + ret = Math.max(ret, i - first[arr[i]]); } } for (int i = l; i <= r; i++) { - forceEd[arr[i]] = 0; + first[arr[i]] = 0; } return ret; } public static void addRight(int idx) { int num = arr[idx]; - ed[num] = idx; - if (st[num] == 0) { - st[num] = idx; + mostRight[num] = idx; + if (first[num] == 0) { + first[num] = idx; } - curAns = Math.max(curAns, idx - st[num]); + maxDist = Math.max(maxDist, idx - first[num]); } public static void addLeft(int idx) { int num = arr[idx]; - if (ed[num] != 0) { - curAns = Math.max(curAns, ed[num] - idx); + if (mostRight[num] != 0) { + maxDist = Math.max(maxDist, mostRight[num] - idx); } else { - ed[num] = idx; + mostRight[num] = idx; } } public static void delLeft(int idx) { int num = arr[idx]; - if (ed[num] == idx) { - ed[num] = 0; + if (mostRight[num] == idx) { + mostRight[num] = 0; } } public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { - curAns = 0; - Arrays.fill(st, 1, cntv + 1, 0); - Arrays.fill(ed, 1, cntv + 1, 0); + maxDist = 0; + Arrays.fill(first, 1, cntv + 1, 0); + Arrays.fill(mostRight, 1, cntv + 1, 0); int winl = br[block] + 1, winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0]; @@ -119,12 +118,12 @@ public static void compute() { while (winr < jobr) { addRight(++winr); } - int backup = curAns; + int backup = maxDist; while (winl > jobl) { addLeft(--winl); } - ans[id] = curAns; - curAns = backup; + ans[id] = maxDist; + maxDist = backup; while (winl <= br[block]) { delLeft(winl++); } diff --git a/src/class177/Code03_SameNumberMaxDist2.java b/src/class177/Code03_SameNumberMaxDist2.java index ee9e7e463..9e1cc213c 100644 --- a/src/class177/Code03_SameNumberMaxDist2.java +++ b/src/class177/Code03_SameNumberMaxDist2.java @@ -30,11 +30,10 @@ //int bi[MAXN]; //int br[MAXB]; // -//int forceEd[MAXN]; -//int st[MAXN]; -//int ed[MAXN]; +//int first[MAXN]; +//int mostRight[MAXN]; +//int maxDist; // -//int curAns = 0; //int ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { @@ -61,48 +60,48 @@ //int force(int l, int r) { // int ret = 0; // for (int i = l; i <= r; i++) { -// if (forceEd[arr[i]] == 0) { -// forceEd[arr[i]] = i; +// if (first[arr[i]] == 0) { +// first[arr[i]] = i; // } else { -// ret = max(ret, i - forceEd[arr[i]]); +// ret = max(ret, i - first[arr[i]]); // } // } // for (int i = l; i <= r; i++) { -// forceEd[arr[i]] = 0; +// first[arr[i]] = 0; // } // return ret; //} // //void addRight(int idx) { // int num = arr[idx]; -// ed[num] = idx; -// if (st[num] == 0) { -// st[num] = idx; +// mostRight[num] = idx; +// if (first[num] == 0) { +// first[num] = idx; // } -// curAns = max(curAns, idx - st[num]); +// maxDist = max(maxDist, idx - first[num]); //} // //void addLeft(int idx) { // int num = arr[idx]; -// if (ed[num] != 0) { -// curAns = max(curAns, ed[num] - idx); +// if (mostRight[num] != 0) { +// maxDist = max(maxDist, mostRight[num] - idx); // } else { -// ed[num] = idx; +// mostRight[num] = idx; // } //} // //void delLeft(int idx) { // int num = arr[idx]; -// if (ed[num] == idx) { -// ed[num] = 0; +// if (mostRight[num] == idx) { +// mostRight[num] = 0; // } //} // //void compute() { // for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { -// curAns = 0; -// fill(st + 1, st + cntv + 1, 0); -// fill(ed + 1, ed + cntv + 1, 0); +// maxDist = 0; +// fill(first + 1, first + cntv + 1, 0); +// fill(mostRight + 1, mostRight + cntv + 1, 0); // int winl = br[block] + 1, winr = br[block]; // for (; qi <= m && bi[query[qi].l] == block; qi++) { // int jobl = query[qi].l; @@ -114,12 +113,12 @@ // while (winr < jobr) { // addRight(++winr); // } -// int backup = curAns; +// int backup = maxDist; // while (winl > jobl) { // addLeft(--winl); // } -// ans[id] = curAns; -// curAns = backup; +// ans[id] = maxDist; +// maxDist = backup; // while (winl <= br[block]) { // delLeft(winl++); // } From eed77e62a1f1e21f6227549bdb39f7e0fda25915 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 30 Aug 2025 17:14:17 +0800 Subject: [PATCH 0648/1170] modify code --- src/class177/Code03_SameNumberMaxDist1.java | 3 ++ src/class177/Code04_ZeroQuery1.java | 45 ++++++++++---------- src/class177/Code04_ZeroQuery2.java | 47 ++++++++++----------- 3 files changed, 48 insertions(+), 47 deletions(-) diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index b0ca212ce..a81cbdb9b 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -30,8 +30,11 @@ public class Code03_SameNumberMaxDist1 { public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; + // first[x] = i,不考虑窗口左扩的情况下,数字x首次出现在i位置 public static int[] first = new int[MAXN]; + // mostRight[x] = i,窗口中数字x最右出现在i位置 public static int[] mostRight = new int[MAXN]; + // 答案信息,相同的数的最远间隔距离 public static int maxDist; public static int[] ans = new int[MAXN]; diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java index 3983075e5..566bf8370 100644 --- a/src/class177/Code04_ZeroQuery1.java +++ b/src/class177/Code04_ZeroQuery1.java @@ -29,11 +29,10 @@ public class Code04_ZeroQuery1 { public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; - public static int[] forceEd = new int[MAXN]; - public static int[] st = new int[MAXN]; - public static int[] ed = new int[MAXN]; + public static int[] first = new int[MAXN]; + public static int[] mostRight = new int[MAXN]; + public static int maxDist; - public static int curAns = 0; public static int[] ans = new int[MAXN]; public static class QueryCmp implements Comparator { @@ -65,48 +64,48 @@ public static int kth(int num) { public static int force(int l, int r) { int ret = 0; for (int i = l; i <= r; i++) { - if (forceEd[arr[i]] == 0) { - forceEd[arr[i]] = i; + if (first[arr[i]] == 0) { + first[arr[i]] = i; } else { - ret = Math.max(ret, i - forceEd[arr[i]]); + ret = Math.max(ret, i - first[arr[i]]); } } for (int i = l; i <= r; i++) { - forceEd[arr[i]] = 0; + first[arr[i]] = 0; } return ret; } public static void addRight(int idx) { int num = arr[idx]; - ed[num] = idx; - if (st[num] == 0) { - st[num] = idx; + mostRight[num] = idx; + if (first[num] == 0) { + first[num] = idx; } - curAns = Math.max(curAns, idx - st[num]); + maxDist = Math.max(maxDist, idx - first[num]); } public static void addLeft(int idx) { int num = arr[idx]; - if (ed[num] != 0) { - curAns = Math.max(curAns, ed[num] - idx); + if (mostRight[num] != 0) { + maxDist = Math.max(maxDist, mostRight[num] - idx); } else { - ed[num] = idx; + mostRight[num] = idx; } } public static void delLeft(int idx) { int num = arr[idx]; - if (ed[num] == idx) { - ed[num] = 0; + if (mostRight[num] == idx) { + mostRight[num] = 0; } } public static void compute() { for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { - curAns = 0; - Arrays.fill(st, 1, cntv + 1, 0); - Arrays.fill(ed, 1, cntv + 1, 0); + maxDist = 0; + Arrays.fill(first, 1, cntv + 1, 0); + Arrays.fill(mostRight, 1, cntv + 1, 0); int winl = br[block] + 1, winr = br[block]; for (; qi <= m && bi[query[qi][0]] == block; qi++) { int jobl = query[qi][0]; @@ -118,12 +117,12 @@ public static void compute() { while (winr < jobr) { addRight(++winr); } - int backup = curAns; + int backup = maxDist; while (winl > jobl) { addLeft(--winl); } - ans[id] = curAns; - curAns = backup; + ans[id] = maxDist; + maxDist = backup; while (winl <= br[block]) { delLeft(winl++); } diff --git a/src/class177/Code04_ZeroQuery2.java b/src/class177/Code04_ZeroQuery2.java index a420ad38d..ff66b7f60 100644 --- a/src/class177/Code04_ZeroQuery2.java +++ b/src/class177/Code04_ZeroQuery2.java @@ -29,11 +29,10 @@ //int bi[MAXN]; //int br[MAXB]; // -//int forceEd[MAXN]; -//int st[MAXN]; -//int ed[MAXN]; -// -//int curAns = 0; +//int first[MAXN]; +//int mostRight[MAXN]; +//int maxDist; +// //int ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { @@ -60,48 +59,48 @@ //int force(int l, int r) { // int ret = 0; // for (int i = l; i <= r; i++) { -// if (forceEd[arr[i]] == 0) { -// forceEd[arr[i]] = i; +// if (first[arr[i]] == 0) { +// first[arr[i]] = i; // } else { -// ret = max(ret, i - forceEd[arr[i]]); +// ret = max(ret, i - first[arr[i]]); // } // } // for (int i = l; i <= r; i++) { -// forceEd[arr[i]] = 0; +// first[arr[i]] = 0; // } // return ret; //} // //void addRight(int idx) { // int num = arr[idx]; -// ed[num] = idx; -// if (st[num] == 0) { -// st[num] = idx; +// mostRight[num] = idx; +// if (first[num] == 0) { +// first[num] = idx; // } -// curAns = max(curAns, idx - st[num]); +// maxDist = max(maxDist, idx - first[num]); //} // //void addLeft(int idx) { // int num = arr[idx]; -// if (ed[num] != 0) { -// curAns = max(curAns, ed[num] - idx); +// if (mostRight[num] != 0) { +// maxDist = max(maxDist, mostRight[num] - idx); // } else { -// ed[num] = idx; +// mostRight[num] = idx; // } //} // //void delLeft(int idx) { // int num = arr[idx]; -// if (ed[num] == idx) { -// ed[num] = 0; +// if (mostRight[num] == idx) { +// mostRight[num] = 0; // } //} // //void compute() { // for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { -// curAns = 0; -// fill(st + 1, st + cntv + 1, 0); -// fill(ed + 1, ed + cntv + 1, 0); +// maxDist = 0; +// fill(first + 1, first + cntv + 1, 0); +// fill(mostRight + 1, mostRight + cntv + 1, 0); // int winl = br[block] + 1, winr = br[block]; // for (; qi <= m && bi[query[qi].l] == block; qi++) { // int jobl = query[qi].l; @@ -113,12 +112,12 @@ // while (winr < jobr) { // addRight(++winr); // } -// int backup = curAns; +// int backup = maxDist; // while (winl > jobl) { // addLeft(--winl); // } -// ans[id] = curAns; -// curAns = backup; +// ans[id] = maxDist; +// maxDist = backup; // while (winl <= br[block]) { // delLeft(winl++); // } From b10e7da1639847ef0a80b70b60b2645d75350a4d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 30 Aug 2025 17:15:51 +0800 Subject: [PATCH 0649/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index 6f273d736..fc9067301 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -29,9 +29,7 @@ public class Code01_MoAddUndo1 { public static int cntv; public static int blen, bnum; - // 查询块号 public static int[] bi = new int[MAXN]; - // 查询每块的右边界 public static int[] br = new int[MAXB]; // 词频表 From 7a320f60dcb9e64283a120941bb8d83e3dd9c2f8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 30 Aug 2025 17:17:16 +0800 Subject: [PATCH 0650/1170] modify code --- src/class177/Code01_MoAddUndo1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index fc9067301..30bdb5a71 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -67,6 +67,7 @@ public static int kth(int num) { return ret; } + // 暴力遍历arr[l..r]得到答案 public static long force(int l, int r) { long ret = 0; for (int i = l; i <= r; i++) { @@ -81,11 +82,13 @@ public static long force(int l, int r) { return ret; } + // 窗口增加num,词频和答案都更新 public static void add(int num) { cnt[num]++; curAns = Math.max(curAns, (long) cnt[num] * sorted[num]); } + // 窗口减少num,词频更新、答案不更新 public static void del(int num) { cnt[num]--; } From 4a77aab63ebcd283469745f41eea912b9aa8b517 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 31 Aug 2025 11:50:24 +0800 Subject: [PATCH 0651/1170] modify code --- src/class177/Code03_SameNumberMaxDist1.java | 8 ++++---- src/class177/Code03_SameNumberMaxDist2.java | 6 +++--- src/class177/Code04_ZeroQuery1.java | 6 +++--- src/class177/Code04_ZeroQuery2.java | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index a81cbdb9b..ab1a61960 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -30,7 +30,7 @@ public class Code03_SameNumberMaxDist1 { public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; - // first[x] = i,不考虑窗口左扩的情况下,数字x首次出现在i位置 + // first[x] = i,只考虑右扩的情况下,数字x首次出现在i位置 public static int[] first = new int[MAXN]; // mostRight[x] = i,窗口中数字x最右出现在i位置 public static int[] mostRight = new int[MAXN]; @@ -91,10 +91,10 @@ public static void addRight(int idx) { public static void addLeft(int idx) { int num = arr[idx]; - if (mostRight[num] != 0) { - maxDist = Math.max(maxDist, mostRight[num] - idx); - } else { + if (mostRight[num] == 0) { mostRight[num] = idx; + } else { + maxDist = Math.max(maxDist, mostRight[num] - idx); } } diff --git a/src/class177/Code03_SameNumberMaxDist2.java b/src/class177/Code03_SameNumberMaxDist2.java index 9e1cc213c..42c91be11 100644 --- a/src/class177/Code03_SameNumberMaxDist2.java +++ b/src/class177/Code03_SameNumberMaxDist2.java @@ -83,10 +83,10 @@ // //void addLeft(int idx) { // int num = arr[idx]; -// if (mostRight[num] != 0) { -// maxDist = max(maxDist, mostRight[num] - idx); -// } else { +// if (mostRight[num] == 0) { // mostRight[num] = idx; +// } else { +// maxDist = max(maxDist, mostRight[num] - idx); // } //} // diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java index 566bf8370..88c31b2f8 100644 --- a/src/class177/Code04_ZeroQuery1.java +++ b/src/class177/Code04_ZeroQuery1.java @@ -87,10 +87,10 @@ public static void addRight(int idx) { public static void addLeft(int idx) { int num = arr[idx]; - if (mostRight[num] != 0) { - maxDist = Math.max(maxDist, mostRight[num] - idx); - } else { + if (mostRight[num] == 0) { mostRight[num] = idx; + } else { + maxDist = Math.max(maxDist, mostRight[num] - idx); } } diff --git a/src/class177/Code04_ZeroQuery2.java b/src/class177/Code04_ZeroQuery2.java index ff66b7f60..a0c36399e 100644 --- a/src/class177/Code04_ZeroQuery2.java +++ b/src/class177/Code04_ZeroQuery2.java @@ -82,10 +82,10 @@ // //void addLeft(int idx) { // int num = arr[idx]; -// if (mostRight[num] != 0) { -// maxDist = max(maxDist, mostRight[num] - idx); -// } else { +// if (mostRight[num] == 0) { // mostRight[num] = idx; +// } else { +// maxDist = max(maxDist, mostRight[num] - idx); // } //} // From e9ab4dac029fe5a7b37758f4f696df68c2e02f7c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 31 Aug 2025 11:51:21 +0800 Subject: [PATCH 0652/1170] modify code --- src/class177/Code03_SameNumberMaxDist1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index ab1a61960..65529fe6d 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -30,9 +30,9 @@ public class Code03_SameNumberMaxDist1 { public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; - // first[x] = i,只考虑右扩的情况下,数字x首次出现在i位置 + // first[x]表示只考虑右扩的情况下,数字x首次出现的位置 public static int[] first = new int[MAXN]; - // mostRight[x] = i,窗口中数字x最右出现在i位置 + // mostRight[x]表示窗口中数字x最右出现的位置 public static int[] mostRight = new int[MAXN]; // 答案信息,相同的数的最远间隔距离 public static int maxDist; From ca80ad55f239a3a3a9f3ea7a336a417db579d4fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 31 Aug 2025 15:39:46 +0800 Subject: [PATCH 0653/1170] modify code --- src/class177/Code03_SameNumberMaxDist1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index 65529fe6d..a28a9afbb 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -30,7 +30,7 @@ public class Code03_SameNumberMaxDist1 { public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; - // first[x]表示只考虑右扩的情况下,数字x首次出现的位置 + // first[x]表示只考虑窗口右扩阶段,数字x首次出现的位置 public static int[] first = new int[MAXN]; // mostRight[x]表示窗口中数字x最右出现的位置 public static int[] mostRight = new int[MAXN]; From b36053efc38650b5829d6185cbf88086eb663f01 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 31 Aug 2025 16:46:31 +0800 Subject: [PATCH 0654/1170] modify code --- src/class177/Code06_BaldChief1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index b522f054e..fbedf2bc5 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -75,6 +75,7 @@ public static void del(int num) { last[more] = less; } + // 加数字的顺序,就是删数字的顺序的回滚,才能这么方便的更新 public static void add(int num) { next[last[num]] = num; last[next[num]] = num; From 1c0b06e73a5b77b3a75cb41a565f185f6a72763e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 31 Aug 2025 16:50:11 +0800 Subject: [PATCH 0655/1170] modify code --- src/class177/Code05_MoDelUndo1.java | 18 +++++++----------- src/class177/Code05_MoDelUndo2.java | 18 +++++++----------- src/class177/Code06_BaldChief1.java | 22 +++++++++------------- src/class177/Code06_BaldChief2.java | 22 +++++++++------------- 4 files changed, 32 insertions(+), 48 deletions(-) diff --git a/src/class177/Code05_MoDelUndo1.java b/src/class177/Code05_MoDelUndo1.java index c3b48c47c..61dfac117 100644 --- a/src/class177/Code05_MoDelUndo1.java +++ b/src/class177/Code05_MoDelUndo1.java @@ -44,16 +44,6 @@ public int compare(int[] a, int[] b) { } - public static void init() { - for (int i = 1; i <= n; i++) { - cnt[arr[i]]++; - } - mex = 0; - while (cnt[mex] != 0) { - mex++; - } - } - public static void del(int num) { if (--cnt[num] == 0) { mex = Math.min(mex, num); @@ -65,7 +55,13 @@ public static void add(int num) { } public static void compute() { - init(); + for (int i = 1; i <= n; i++) { + cnt[arr[i]]++; + } + mex = 0; + while (cnt[mex] != 0) { + mex++; + } int winl = 1, winr = n; for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { while (winl < bl[block]) { diff --git a/src/class177/Code05_MoDelUndo2.java b/src/class177/Code05_MoDelUndo2.java index abaa604a8..ccf9001c1 100644 --- a/src/class177/Code05_MoDelUndo2.java +++ b/src/class177/Code05_MoDelUndo2.java @@ -38,16 +38,6 @@ // return b.r < a.r; //} // -//void init() { -// for (int i = 1; i <= n; i++) { -// cnt[arr[i]]++; -// } -// mex = 0; -// while (cnt[mex] != 0) { -// mex++; -// } -//} -// //void del(int num) { // if (--cnt[num] == 0) { // mex = min(mex, num); @@ -59,7 +49,13 @@ //} // //void compute() { -// init(); +// for (int i = 1; i <= n; i++) { +// cnt[arr[i]]++; +// } +// mex = 0; +// while (cnt[mex] != 0) { +// mex++; +// } // int winl = 1, winr = n; // for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { // while (winl < bl[block]) { diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index fbedf2bc5..78b415eb8 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -48,18 +48,6 @@ public int compare(int[] a, int[] b) { } - public static void init() { - for (int v = 1; v <= n; v++) { - last[v] = v - 1; - next[v] = v + 1; - } - next[0] = 1; - last[n + 1] = n; - for (int v = 2; v <= n; v++) { - sum += Math.abs(pos[v] - pos[v - 1]); - } - } - public static void del(int num) { int less = last[num], more = next[num]; if (less != 0) { @@ -82,7 +70,15 @@ public static void add(int num) { } public static void compute() { - init(); + for (int v = 1; v <= n; v++) { + last[v] = v - 1; + next[v] = v + 1; + } + next[0] = 1; + last[n + 1] = n; + for (int v = 2; v <= n; v++) { + sum += Math.abs(pos[v] - pos[v - 1]); + } int winl = 1, winr = n; for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { while (winl < bl[block]) { diff --git a/src/class177/Code06_BaldChief2.java b/src/class177/Code06_BaldChief2.java index 1e02e390f..f70765deb 100644 --- a/src/class177/Code06_BaldChief2.java +++ b/src/class177/Code06_BaldChief2.java @@ -40,18 +40,6 @@ // return a.r > b.r; //} // -//inline void init() { -// for (int v = 1; v <= n; v++) { -// lst[v] = v - 1; -// nxt[v] = v + 1; -// } -// nxt[0] = 1; -// lst[n + 1] = n; -// for (int v = 2; v <= n; v++) { -// sum += abs(pos[v] - pos[v - 1]); -// } -//} -// //inline void del(int num) { // int less = lst[num], more = nxt[num]; // if (less != 0) { @@ -88,7 +76,15 @@ //} // //void compute() { -// init(); +// for (int v = 1; v <= n; v++) { +// lst[v] = v - 1; +// nxt[v] = v + 1; +// } +// nxt[0] = 1; +// lst[n + 1] = n; +// for (int v = 2; v <= n; v++) { +// sum += abs(pos[v] - pos[v - 1]); +// } // int winl = 1, winr = n; // for (int block = 1, qi = 1; block <= bnum && qi <= m; block++) { // while (winl < bl[block]) { From ed62b1afa2aba0ad18f492e1af6cc941e531a7ff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 31 Aug 2025 18:33:25 +0800 Subject: [PATCH 0656/1170] modify code --- src/class177/Code05_MoDelUndo1.java | 2 +- src/class177/Code05_MoDelUndo2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class177/Code05_MoDelUndo1.java b/src/class177/Code05_MoDelUndo1.java index 61dfac117..3ccf17658 100644 --- a/src/class177/Code05_MoDelUndo1.java +++ b/src/class177/Code05_MoDelUndo1.java @@ -27,7 +27,7 @@ public class Code05_MoDelUndo1 { public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; - public static int[] cnt = new int[MAXN + 1]; + public static int[] cnt = new int[MAXN]; public static int mex; public static int[] ans = new int[MAXN]; diff --git a/src/class177/Code05_MoDelUndo2.java b/src/class177/Code05_MoDelUndo2.java index ccf9001c1..b9bff7d70 100644 --- a/src/class177/Code05_MoDelUndo2.java +++ b/src/class177/Code05_MoDelUndo2.java @@ -27,7 +27,7 @@ //int bi[MAXN]; //int bl[MAXB]; // -//int cnt[MAXN + 1]; +//int cnt[MAXN]; //int mex; //int ans[MAXN]; // From 7c653aa26f3294e3571a62fa2005f0c81dbbce20 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 31 Aug 2025 18:55:26 +0800 Subject: [PATCH 0657/1170] modify code --- src/class177/Code06_BaldChief1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class177/Code06_BaldChief1.java b/src/class177/Code06_BaldChief1.java index 78b415eb8..895ce911b 100644 --- a/src/class177/Code06_BaldChief1.java +++ b/src/class177/Code06_BaldChief1.java @@ -63,7 +63,7 @@ public static void del(int num) { last[more] = less; } - // 加数字的顺序,就是删数字的顺序的回滚,才能这么方便的更新 + // 加数字的顺序,就是删数字顺序的回滚,才能这么方便的更新 public static void add(int num) { next[last[num]] = num; last[next[num]] = num; From 84dce240441138101b1bae664062b533c2a7c328 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Sep 2025 14:42:50 +0800 Subject: [PATCH 0658/1170] modify code --- src/class177/Code07_MoOnTree1.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/class177/Code07_MoOnTree1.java b/src/class177/Code07_MoOnTree1.java index bf54d9477..ce4c075e7 100644 --- a/src/class177/Code07_MoOnTree1.java +++ b/src/class177/Code07_MoOnTree1.java @@ -31,11 +31,18 @@ public class Code07_MoOnTree1 { public static int[] sorted = new int[MAXN]; public static int cntv; + // 链式前向星 public static int[] head = new int[MAXN]; public static int[] to = new int[MAXN << 1]; public static int[] next = new int[MAXN << 1]; public static int cntg; + // dep是深度 + // seg是括号序 + // st是节点开始序 + // ed是节点结束序 + // stjump是倍增表 + // cntd是括号序列的长度 public static int[] dep = new int[MAXN]; public static int[] seg = new int[MAXN << 1]; public static int[] st = new int[MAXN]; @@ -43,7 +50,10 @@ public class Code07_MoOnTree1 { public static int[][] stjump = new int[MAXN][MAXP]; public static int cntd; + // 分块 public static int[] bi = new int[MAXN << 1]; + + // 窗口信息 public static boolean[] vis = new boolean[MAXN]; public static int[] cnt = new int[MAXN]; public static int kind = 0; From 40981b4850fe0446118061f0b0a3a853bf063e9e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Sep 2025 16:35:16 +0800 Subject: [PATCH 0659/1170] modify code --- src/class177/Code07_MoOnTree1.java | 21 +++++++++++++-------- src/class177/Code07_MoOnTree2.java | 18 ++++++++++-------- src/class177/Code08_CandyPark1.java | 19 ++++++++++--------- src/class177/Code08_CandyPark2.java | 18 +++++++++--------- 4 files changed, 42 insertions(+), 34 deletions(-) diff --git a/src/class177/Code07_MoOnTree1.java b/src/class177/Code07_MoOnTree1.java index ce4c075e7..2f3233403 100644 --- a/src/class177/Code07_MoOnTree1.java +++ b/src/class177/Code07_MoOnTree1.java @@ -27,10 +27,14 @@ public class Code07_MoOnTree1 { public static int MAXP = 20; public static int n, m; public static int[] color = new int[MAXN]; - public static int[][] query = new int[MAXM][4]; public static int[] sorted = new int[MAXN]; public static int cntv; + // 查询的参数,jobl、jobr、lca、id + // 如果是类型1,那么lca == 0,表示空缺 + // 如果是类型2,那么lca > 0,查询结果需要补充这个单点信息 + public static int[][] query = new int[MAXM][4]; + // 链式前向星 public static int[] head = new int[MAXN]; public static int[] to = new int[MAXN << 1]; @@ -134,7 +138,8 @@ public int compare(int[] a, int[] b) { } - public static void modify(int node) { + // 窗口不管是加入还是删除node,遇到node就翻转信息即可 + public static void invert(int node) { int val = color[node]; if (vis[node]) { if (--cnt[val] == 0) { @@ -156,23 +161,23 @@ public static void compute() { int lca = query[i][2]; int id = query[i][3]; while (winl > jobl) { - modify(seg[--winl]); + invert(seg[--winl]); } while (winr < jobr) { - modify(seg[++winr]); + invert(seg[++winr]); } while (winl < jobl) { - modify(seg[winl++]); + invert(seg[winl++]); } while (winr > jobr) { - modify(seg[winr--]); + invert(seg[winr--]); } if (lca > 0) { - modify(lca); + invert(lca); } ans[id] = kind; if (lca > 0) { - modify(lca); + invert(lca); } } } diff --git a/src/class177/Code07_MoOnTree2.java b/src/class177/Code07_MoOnTree2.java index 8bdb751d4..31201b655 100644 --- a/src/class177/Code07_MoOnTree2.java +++ b/src/class177/Code07_MoOnTree2.java @@ -25,10 +25,11 @@ // //int n, m; //int color[MAXN]; -//Query query[MAXM]; //int sorted[MAXN]; //int cntv; // +//Query query[MAXM]; +// //int head[MAXN]; //int to[MAXN << 1]; //int nxt[MAXN << 1]; @@ -42,6 +43,7 @@ //int cntd; // //int bi[MAXN << 1]; +// //bool vis[MAXN]; //int cnt[MAXN]; //int kind; @@ -114,7 +116,7 @@ // return a.r < b.r; //} // -//void modify(int node) { +//void invert(int node) { // int val = color[node]; // if (vis[node]) { // if (--cnt[val] == 0) { @@ -136,23 +138,23 @@ // int lca = query[i].lca; // int id = query[i].id; // while (winl > jobl) { -// modify(seg[--winl]); +// invert(seg[--winl]); // } // while (winr < jobr) { -// modify(seg[++winr]); +// invert(seg[++winr]); // } // while (winl < jobl) { -// modify(seg[winl++]); +// invert(seg[winl++]); // } // while (winr > jobr) { -// modify(seg[winr--]); +// invert(seg[winr--]); // } // if (lca > 0) { -// modify(lca); +// invert(lca); // } // ans[id] = kind; // if (lca > 0) { -// modify(lca); +// invert(lca); // } // } //} diff --git a/src/class177/Code08_CandyPark1.java b/src/class177/Code08_CandyPark1.java index b694ce432..11b67b83f 100644 --- a/src/class177/Code08_CandyPark1.java +++ b/src/class177/Code08_CandyPark1.java @@ -165,7 +165,8 @@ public int compare(int[] a, int[] b) { } - public static void modify(int node) { + // 窗口不管是加入还是删除node,遇到node就翻转信息即可 + public static void invert(int node) { int candy = c[node]; if (vis[node]) { curAns -= (long) v[candy] * w[cnt[candy]--]; @@ -180,10 +181,10 @@ public static void moveTime(int tim) { int oldVal = c[pos]; int newVal = update[tim][1]; if (vis[pos]) { - modify(pos); + invert(pos); c[pos] = newVal; update[tim][1] = oldVal; - modify(pos); + invert(pos); } else { c[pos] = newVal; update[tim][1] = oldVal; @@ -199,16 +200,16 @@ public static void compute() { int lca = query[i][3]; int id = query[i][4]; while (winl > jobl) { - modify(seg[--winl]); + invert(seg[--winl]); } while (winr < jobr) { - modify(seg[++winr]); + invert(seg[++winr]); } while (winl < jobl) { - modify(seg[winl++]); + invert(seg[winl++]); } while (winr > jobr) { - modify(seg[winr--]); + invert(seg[winr--]); } while (wint < jobt) { moveTime(++wint); @@ -217,11 +218,11 @@ public static void compute() { moveTime(wint--); } if (lca > 0) { - modify(lca); + invert(lca); } ans[id] = curAns; if (lca > 0) { - modify(lca); + invert(lca); } } } diff --git a/src/class177/Code08_CandyPark2.java b/src/class177/Code08_CandyPark2.java index 9cca3143b..d75297324 100644 --- a/src/class177/Code08_CandyPark2.java +++ b/src/class177/Code08_CandyPark2.java @@ -109,7 +109,7 @@ // return a.t < b.t; //} // -//void modify(int node) { +//void invert(int node) { // int candy = c[node]; // if (vis[node]) { // curAns -= 1LL * v[candy] * w[cnt[candy]--]; @@ -124,10 +124,10 @@ // int oldVal = c[pos]; // int newVal = update[tim].val; // if (vis[pos]) { -// modify(pos); +// invert(pos); // c[pos] = newVal; // update[tim].val = oldVal; -// modify(pos); +// invert(pos); // } else { // c[pos] = newVal; // update[tim].val = oldVal; @@ -143,16 +143,16 @@ // int lca = query[i].lca; // int id = query[i].id; // while (winl > jobl) { -// modify(seg[--winl]); +// invert(seg[--winl]); // } // while (winr < jobr) { -// modify(seg[++winr]); +// invert(seg[++winr]); // } // while (winl < jobl) { -// modify(seg[winl++]); +// invert(seg[winl++]); // } // while (winr > jobr) { -// modify(seg[winr--]); +// invert(seg[winr--]); // } // while (wint < jobt) { // moveTime(++wint); @@ -161,11 +161,11 @@ // moveTime(wint--); // } // if (lca > 0) { -// modify(lca); +// invert(lca); // } // ans[id] = curAns; // if (lca > 0) { -// modify(lca); +// invert(lca); // } // } //} From 02f6abd1bfa21e8892087f025dca85cf6fd99006 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Sep 2025 17:05:11 +0800 Subject: [PATCH 0660/1170] modify code --- src/class177/Code07_MoOnTree1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class177/Code07_MoOnTree1.java b/src/class177/Code07_MoOnTree1.java index 2f3233403..0533df402 100644 --- a/src/class177/Code07_MoOnTree1.java +++ b/src/class177/Code07_MoOnTree1.java @@ -138,7 +138,8 @@ public int compare(int[] a, int[] b) { } - // 窗口不管是加入还是删除node,遇到node就翻转信息即可 + // 窗口不管是加入还是删除node + // 只要遇到node就翻转信息即可 public static void invert(int node) { int val = color[node]; if (vis[node]) { From dcded4c1c955c662a161d711f582fc689372c4fd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Sep 2025 17:06:29 +0800 Subject: [PATCH 0661/1170] modify code --- src/class177/Code08_CandyPark1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class177/Code08_CandyPark1.java b/src/class177/Code08_CandyPark1.java index 11b67b83f..2732fe760 100644 --- a/src/class177/Code08_CandyPark1.java +++ b/src/class177/Code08_CandyPark1.java @@ -165,7 +165,8 @@ public int compare(int[] a, int[] b) { } - // 窗口不管是加入还是删除node,遇到node就翻转信息即可 + // 窗口不管是加入还是删除node + // 只要遇到node就翻转信息即可 public static void invert(int node) { int candy = c[node]; if (vis[node]) { From 42ca4998eb1339770c9ee82d61b007b769117b2e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Sep 2025 17:32:27 +0800 Subject: [PATCH 0662/1170] modify code --- src/class177/Code08_CandyPark1.java | 8 ++++---- src/class177/Code08_CandyPark2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class177/Code08_CandyPark1.java b/src/class177/Code08_CandyPark1.java index 2732fe760..8472c1809 100644 --- a/src/class177/Code08_CandyPark1.java +++ b/src/class177/Code08_CandyPark1.java @@ -49,7 +49,7 @@ public class Code08_CandyPark1 { public static int[] bi = new int[MAXN << 1]; public static boolean[] vis = new boolean[MAXN]; public static int[] cnt = new int[MAXN]; - public static long curAns; + public static long happy; public static long[] ans = new long[MAXN]; public static void addEdge(int u, int v) { @@ -170,9 +170,9 @@ public int compare(int[] a, int[] b) { public static void invert(int node) { int candy = c[node]; if (vis[node]) { - curAns -= (long) v[candy] * w[cnt[candy]--]; + happy -= (long) v[candy] * w[cnt[candy]--]; } else { - curAns += (long) v[candy] * w[++cnt[candy]]; + happy += (long) v[candy] * w[++cnt[candy]]; } vis[node] = !vis[node]; } @@ -221,7 +221,7 @@ public static void compute() { if (lca > 0) { invert(lca); } - ans[id] = curAns; + ans[id] = happy; if (lca > 0) { invert(lca); } diff --git a/src/class177/Code08_CandyPark2.java b/src/class177/Code08_CandyPark2.java index d75297324..f4f1930bb 100644 --- a/src/class177/Code08_CandyPark2.java +++ b/src/class177/Code08_CandyPark2.java @@ -51,7 +51,7 @@ //int bi[MAXN << 1]; //bool vis[MAXN]; //int cnt[MAXN]; -//long long curAns; +//long long happy; //long long ans[MAXN]; // //void addEdge(int u, int v) { @@ -112,9 +112,9 @@ //void invert(int node) { // int candy = c[node]; // if (vis[node]) { -// curAns -= 1LL * v[candy] * w[cnt[candy]--]; +// happy -= 1LL * v[candy] * w[cnt[candy]--]; // } else { -// curAns += 1LL * v[candy] * w[++cnt[candy]]; +// happy += 1LL * v[candy] * w[++cnt[candy]]; // } // vis[node] = !vis[node]; //} @@ -163,7 +163,7 @@ // if (lca > 0) { // invert(lca); // } -// ans[id] = curAns; +// ans[id] = happy; // if (lca > 0) { // invert(lca); // } From f6fa4782145b1435cd054295b0d9d18f0d317406 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Sep 2025 18:35:43 +0800 Subject: [PATCH 0663/1170] modify code --- ...21\344\270\212\350\216\253\351\230\237.pptx" | Bin 0 -> 59825 bytes src/class177/Code08_CandyPark1.java | 10 ++++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243177\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2302-\345\233\236\346\273\232\350\216\253\351\230\237\343\200\201\346\240\221\344\270\212\350\216\253\351\230\237.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243177\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2302-\345\233\236\346\273\232\350\216\253\351\230\237\343\200\201\346\240\221\344\270\212\350\216\253\351\230\237.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243177\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2302-\345\233\236\346\273\232\350\216\253\351\230\237\343\200\201\346\240\221\344\270\212\350\216\253\351\230\237.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..83056ab8c409f15f96b0dc44ed31b2c12b4a41cc GIT binary patch literal 59825 zcmdqJV|1lmwy+)B6{BJ&72CFL+qNpHm^)_0wr$%L+h)bdmwvj>c>C$^Jg47xoPWK? z*!Q~E+P~HuYhDv;&Mhwm3Wf><1Ox@7lR&6d8EDD2@;T!N0Rn;rLIu)uG_iJ~`}Vgd zFc8w`4}bnt0LCmq8Q?@7o?!BPMB`BB5>h3(;wD|hJXdCIAoi(XVGMZC7=v@Em{VQJj_1byk!N=yf3-@}4-l;EOtl z!pAZdL8oHjZtD7B{~Kz32Uh-1VgVyuL~H%rIu0-p5b~#3jO~o%9qsI$=#1xSvs5E_Kw??71A zG8r_sUlgM%73~n5eO+kwU1^T{JLyb3I(%0z6|Sg@nyfoTpPIH?PY^$~hGXyaBJFF9 z;LJ@|Uhw-(f?ucZ$F>lOcH_z}&MRUBk*pqM^-{5ga+ zzfgEX$DmAZ<>a~4JaVFbW1sC1@ws!*QtEcGLYO3UDydbsZa z?r!d|W|0BO+ns-Tw2O~oHB&aQQZPP6mtoy?S25w+Q}V?ewXxj&0M4IxbMUGQA`c1# z1o0K6Y)K%M6dbr@r2h?D@kcC5`aI!wx0SIT2 zYG=f33dbFlBzTF772Y?B<> z-y2Af+=Nh2`{S8a!aQhC1hckVPnh890^kBR6Knh>U|XM}gGgRi4pZf!vH+FixzGW-`LXEtP0OfKw+E66C^=+Dfc?u%6>kvoN;kpv*Mx;k2 zAJdZ_VL2Zq#3E1qlNn`18J?_@xDs+D9@cy3Qu4wq85bwd9%t_oj!u2fuK5hTqZqi9 zBFp=uEie1%Jnr8^U%{UD(CHP17~Y38mEJ3_zsHt*8?1W}n@P;xrA}MzTJ*Zu@@s8F*LowD6ZWk|tv=24)X!qySW; ztX=nZtK7(#R&IS_qdp`A=ANbZIg;b5s)@?S2~ldR*33JT0YR4oqu~_bRt~;NoaQ2u zip;Q@MR5}}nKFzqamO8F9}(QFwOHoHO5YwfbE}ZsTok!i;4o zGhbX;kwPDWTKg=dN$()1-yj(lfMrM`*hA>;3=8&-!}q#tgpUcG_NRYgjJ$>5sop1C z>0yC@@c*Hef44pVs+)gli#it9Eqm!vA+NlC=I;3xmT0=Do6tk(!VMmLC9sm?Q%_GI zX?^+~Vco2}wOJ(T zC-=T*y7smQ%&+hYeQQMm;-JqrmKpZdASSf!T}uO6Zv_;FSWt2LQ0S0~((>T2`6;>K zB(a9URAd3Dl%**UisK3cG_i&ORI~iyq@^h#mYNKsP>WnM2P1+ma>0#LB+4(whwl=Q z_?!1fkbkDAqc`-egNFN*$Q75@sMnQ<}^pGG10@;w~TCPP&#ZgDEY?X~m< zOjt-ZJrb1qczx?84?EThxoniujyTmmXJbdNf+2^?a9>&yRqE~N9(g=pRyFnJnAg~s zJ7z;R#fzr3w;MneMrvzQB}mz_kfw8`-!ga>KQ2mAEt2ItD^{!4)03|@=xtujP-2#~ zF|x}pdgyjENdSTf^>l38OK6&9@r1WB#q+NC{extx> z0WnIT^}t{4*j+FoF>+R@$PZs%-TPloZ~wC+eBY-uvi?aLt`;V4|Fbk^dTe{?;UKoS zF=GFu?7e@V-mG9I6U9dN)c?~=*A%g{&gfMg#`RQF_<{Hn) zz9KVcP1~9>o^fb)!wfgm$Mr-lNQD?=;4D%m8LEL!%a>;Yp>RO{rbhZ|M~W8=?r=Uv z2a#unf-QLtZDz0>1!KeXE0%u_XPb@26WZvZjPB28V)4FW_is)T;8P0d|IlG0I~$u% z%PQdFY;Nc1^p^)?TIO%w0{E7XoI-7rg@|x?1=P-H!B>KOi!VpUz0$87odV~Q7z6uP z?)Wjw7hmZQ*o4le*>b5Q<8Z2KoP5pu_r0~P`zt3Ja~7++L?fJcQi`GvHCcKGF)b-I zv_QjQ;RcJ!#X!*JBm&RG*W+?Y{F5xSpjS-Sbf;ob`}PLLWCqJw z_Ej|Zgm8G=Y$6UM7^H3orr&oh*CNi7&8Bn{0>dXZ;w0s51H^RUho^O66cBKWB$Jql z7jAR&Ir1l9vyg#fytl{MpWrx5#;>*6oEZTJuDetCyL#h?7J_eSl2Rdi>Qnb+~yCb;W}^fBMeuRIY6vu zNH0nI%3<6eiuwNj4p;iUpw3}5#d9m-7<_jztvZKCm9Nq1ckeQjQ+-|DZRserY)Qh+ zy_K%4WGW1Jr=H)QDraC%Q$>ccv-#MXvY^qyysV_XucMxM92~1t)`*??&jzd&{@JKk z=lp2fpv3u6<06?P{EKRtq^?ba^COT9)tp)tmwj8dp}C1v{v!EPDzr#jEwTyP8V)+v z+Vxe4(Mv~*uymBypquKX{8n|9++p4uB5Dz%OLNE~9ZwfGHG(O4&?Z|F$Gpyjht>h1 zH>eidIo%*1{2%YSWh2>piS9BHJ1UTtBdQ8_&iXE0usF8x@4j@n;KdmDO*FFye#gsX}D$(+6%OQoVEQREXxw zOWJC`DZBWRlI;X5unZSG%g+cwP-$c|q$FgyM7Z;WmP)izMvK1sPW!;O-c^4)PGdY3 zlJ)ccc#&uxTUm|GVdP-FU+Qz%+6gI+=^${9Gb{dBDEV25nb(UloxruU>7i*ofql`) z!QI>ART}uA47s*{RsT5f0=w{{!dmbukpt_+bX8k%GB*A0B*IR=DO~F&KHm!U@N#ds z4~pmGz7(Ow7o?7GQhZO0+j`-LQIF_Am*-%9D1uP-8<;^qj#~r0nl7_cQ@H>x*n#Sz zPkY2Fcn@ge=rvrLeELHmvZD|$`xVT>Q8^Z&_QlQ7wyoqmGh?#&BCxev(^kcpZtcLj zaQGQJ1mo}#x9da%gShLL8^gtbg8N2<(Fb?;E_-CI+U6Oph`$~JF2{q@+1c;7N!z+K z`uFIBMdyHE)-UuAVesO0R`cEc(^@AJpFtiKE;K0rjw&98HTuODPS%n)iM7Y~ahzwv5_~P(> zT(`C!m&*{gV~dy7BD7j-2B!_yfe2b%COEE3J4rV41~~QBy9le*Caag#QJRgz=k(F5 zgT;N#JdVXiN4>wNbE0ctSB*kAA?U0Tzn)-rRP%UJSd-nZ*2Bo&P$iz$`r`YZRp!y~ zD(Rw^cqT5;<*KR(#$ja&2v00x(8yFaMZ_!>a}+7ou61ps!7}yIEwtf4{Y;2Gps#@< zMQQZ!0IkzvDhzpBdf1nTDYV{u@$pUld298gUWHWsP)xqRXGC-Y&9tF~?Fw<|Tqz^6 zFka!QX;Tz^umjvi=F<8d`q^@K{$_7X6}Jz;;^pe=A}%QmV?}cF`5B)|dJkm@g*02e zZ_zrfQi&qJgHT%t5hYBPu2L$uf?`MUkR^VHWjlhF*swn7kHX2)n1y~ma_EEyt)zz( z^F@yvB@ohybdP%_LB$2=1(`)j5259>aAv|quhv`{nG4Ongd?7DxZt;Dt8RuZb}db8 z``3`3W8z47c8ClJTt7$zUrgLRF$(5AOh;_TtLTjEz>K8`BcW)*B0}<|xG%iY(T4*$ zR>KT?%zHsxj=2bqL}%&nwS;2vU(Sca@X5psja-L=ab;xNiHkM`WHE(JL#&5q_U^_G znxxJ_dlcVB_p;`Crq8MUZF3gpD8+=!KHTf=x4y#Ykvn`3<(_|lQ->%w`blrAcMkuzw=8~1;cDP9f0r{*$<0J~7JaPh zXm8&ZpBJXTy?L~UbD6E@Yj7;Q;sB)??g?8iTSh*%g#a;*OG0uGZW z=y68xj?t6C%}3t#HF|R{#XILVkfi`9H5^RFCcVeG;E}zH7i~wq0^ySV1gYuKH^m2K z3R5qfH|R-&QtyG?g6=$$jMt(f-8rq&0ST%8pLB_{xrvPl z-5<}t_F}aE@M3%})u23e>RY*7<%`7AF?9&eu_e%bw5L%_N^&S@B@Tbzla_dq4B4hR zYn`$C_l*&nv2){w3-#D-uABBZ4@MSoWTsEztTNNX-%=Euwmd!T@7&LOyWO48a-u>{ zRuj%7;ODlaLMh;Cq9d9x?AYCaC~06E(g+EfF0X`Rw#IcB_dD8n8JbWOm@Z_U&+*3W zGWU~vG>_1unUKSMA;~Y~mVmXzMm2G_ZJp%1M3(ELlc1{hP(JmPthO9h5fEPzDTb`B zkZ|5F_RFYH!-rz3L{3fbDS2k9$ZJvsB`^%tI+FWQ1~ik{R>s$KW*5o@J+C+S6C#^F zArNb{@!Y5>ZXGyr#9(uB?`}&7fAe?~XN!DtWIp}wN;l#`%-VtRcJ1qi-E|L?@6JmR zkN5NrIkEdDkE^FUyrj5fm1w!qYLpAMct(6o-qk=ZsGWjp2)~IJmFqO6ke*XxEIZE- zpl%+?4Ln+bVjG{KWsnFy?i$Ok8YKjQVFeiKDG%s0V4S9aPcJ~VaG?RvsL?oP>>xS( zqnY?I(yG8icGjE_)xKG0onIz>I zukf*A11Ks~Xp7{}!r_L=c_^cMx$4-uw9d4!T*BNaL%zV=BKS(DD1kgA9Dwc4eitjy zz_S_^F(hcvVgJ&EYIB8zj7!;;j5j}b^Id6gDU(A|K1eK_Yu9Nl^_9DgCGb*l$0O1j zG13}d?Mu#Eh659uSpZIoXlQr~mJ|kIyawURuConxX!-svKgB5Ug>D3*C^wE-qS4E0 z`NkIo`fsvGa-*uPr5gwqWnDOrqX<(>K&K^|?n;Mz^Sz$z4eZel6pab>8X9V@jG8a6 z`c~3)3!c}oTs|KX5shejelfdOfeb?o>2E18FYHy(>~7xuwn%5Eg)k&2LOv3+MKmPm zi=P&3Y?%!k-y*c-$y1X|L#Y|SDaRG4r1MseXKdN^+PTWm*fg-z_{KPhAZm@rZEI=O zEL<^}moW)HsrhtLmf%B#kII%$v;AW{F^m+a@+JiF?EI*$dUl!fLSS>blq!unR)zOB z%s3ptbm6AX3!&{aJAqYK8M^dNbAM(XK&eT&g4qs*QF7O578*fnD6Sx#nK+<#LrvB) zPhO>17`J!kTduvm@1VArHVCiedF#g(YA{FOr&w92UrJt_Zm>RHnx2z>CL~)=q{x+7 z{u`exbaIp=Hzz^OmTRz3|Ckebf|DYeO>m{`W@bOM!N=otm>8F?0FSYM(m90Dq4Eo5 z)E;xPU|Qxx?3Gk~Yjd)ccpFSbBt!{QcMSv)r3!)up77+6muo@UmnY%)*?UK!K2d>| zbToq!i)J`TL^oCZ>rOJ&X4Ljv`H3vsa|fEQJt_@lQG46_6)J^v7wP$&bIhqz90Qz` z)1`%g`tBCyCCM1eAM8mnR_bQVN+s4rQEKs}uXO63KUCI#$c~^`@K326tj^0+vTCI5 z>y0HTgNuoK#_%;Zp3HP@KmER6fK|EEe`}~w7+8qK=i|ZtX`f(Qn;A0v^&+m$7;)&b z*2iC!2h_z;!{IrNeZW_kOb2@kcXKm&5MkO~+{o;?mU*L7#yZd8ClMM0RdjPV^42h> z*jf_tS9>sa#zEw&{ZK?);OIz)emf2nATfVpBV1_BXlZ}q?l^{MY0YTdzprtab1;HO z1Bnf?Gum)4g8u!D`ox)>e*6?H=a8Ls_NbB3-sAkLx*V02Uy_N*Dhcd`r2N)?%G}| zFJ*Y_VCXLSmQ|YH$6CWTE+M(E_uu#!pVLC)n(kG=MTx5p%fe$Xeev;i`$N`Yb6>iV zLoYzZ2wD+w1CDs@!TxyxIGW!XpZ&&5asEf_{P)RUTAc+ooxjD-zL%6>9bC^1zLA_FXVwwmv;D;#klCc1D5^v) zB)stO{8orD!uPL(J(W>bH+X8SXA~JJJ48_{8-O%!G78J7t0}wBqQ7e+|q)ko^ zF*p5^O59Bs;v!Mf8XRsvm@HdXlVCcF#tMeGL8u`#z*Yr?B$=kw8Ra785XiXsU98l- zlg{^vT$b?=F~7P;N=9Z=Yc! zcD^SxXmW>)8;?;nL6rix&dN7XEQK4DlhnTSF9T?s7dtj+n^g{0vU`?f>t>2MAo9Tv zzrHr2%@}uWH#|eKF8W#ut>exwC|J4ERgBY^u3M_E!5x_n(1EVVz5o?H$PbLNv+*Ae z9~x4_j?xM{o}x&2=NHi@txX;2#_`oEf0UaGb`?GWgS@#|e$0*0T;-tt63nUC4BVO}=8T|1Y zWMM;TVCj@0p;eK$o)|0IpfaNyHb^eQ!$%=AfMTfdCfPraFjSK)czkc?{$aY_Hq)sp z_-#L@S93!pE8HsTF>z8~!qJ_!K4o_TrXm?>ydOVCN6kwkj&v-6K)rD|zd;DCzgMLz z*i6qTn607`RkTUv)b-cu{;!1%h8-4C^@yuGx~-*^cFrwfB$pU^U7VJo;Nyr&Z{`{3 zgu{nX34weFZ1y<@Tcgu@(r3CKCrv+Ej~a-_+FOd|E$7H|3u*G`qntIKciE+t?5e4R zloAb4$>fKtRFXoCk?h?u@GBa1J#%0Re-9&i#~V#~=>qTzce)Na%x}vH7ST4gM_UOW ze|Ek5#wFbW@J4=>#Q5-CDZ0_$XG!o_$E>SKy?wN_nPXg_Wudwx>Kb`eetE)(zZw8|@! zAsg33&7#wyHXQ>?0oH;nc%-ASaLHI*s=!aqCkD?Dj=X}e_%VGy_4ykITWoT?*{Vj* z9xnL#5H=4lJO70eUizp3<)1l5vd=)^PeH(cQR1J1fPZ4eUj_kDF@M}s23`7uSG&b8 z28J@9iv)db7x(dxwVu6>oiz-x52pSO^I~F#nuEBAn#z5b!v`D zUPpeew6tpu)uypvC5!_&g!N@Ou`?v?MXHjVfVSSGde;*rGg+bsc|%26>-~a6{{?r% zD$PiN;2;kld;R4Kzwsv-@%7pMT<#bjmAYnRZ<#ojQBQa=gHyJ1g`G4!En0VLlFfnZ z0>+;mbC8c?6M8TpAY)7tHBKdAAA$cC96Dxc;{?h1|a8n>i$8_-o z(#$2!$sGpN|60!FmzxW`C&5z$ocFI-XOQuqKt>Q9;!LpJ#-ZN7_XRJQ%M_HlGdWy^ z9TKeUwHK$YhTWb{3@My=v->>gMylv&1GqY8p^&1mk+dzw z!hIF(F0c}v{^Y7{oreS8h*fr--Jejo^}dy5=w5jbnCEGc0~Upa>PyRmPCCMh+`j;* z?2TrG2x|_5!2(S#gSM`^;maIH(DY8?GwLRVe&SsDcYK5MAwTM$!GSCR_&rG{6gncz zU-=G|b6ZiFa?0hjneXx!%Y-~27ZxIsh8q?Y}I^$R4Jv)Q}OoERJSzKvPu>BQJ6@M`<3 zMfb`%{?-N0e6?jDSN^WuQ$~e{EKDVm1&p#sEt)mxZju(Z*Rc$(GFUHpB) zY=woLA*hm$x+l~AKxU10HyVoK$69e%{5JhCzs_&6NEA3WM?d2lHp6LnJ}ryR@>a8k z$#MRQJMGPdc}0}pRf!=TPHxD}K4D)e6E-m{8`uZrv0PA~ zIzPc;QpW}Ey#fJBJ3+q4tKu&$E_GZQSNR%S`y9{pDPkrxsy~f$Lasu$%<>P*4#DQe zP}hz~NS!~R#Z|-ouABEO86|gERQ+m1Hz?pJ|HK|Ov13Su59yF(T*YP87RE_$)t3II z@k0B9Ky=MhF40srVC6mN&P|;0{@MFr8VJiWwK7kEhd1 z3{A%XGyZ6XPHw(w}+Tz0TFzev`pd>ple?_#G2cj%2%^IY)&knQbSK0_J_~5 zAJ<%=ohof*+{m_+0ir6ZS?g+nMOh2rAA$v2i9AOqWkVT5p8KvW4MD$5iKZKx4*!xp8R^ z&Kep40EF%8xg+qCgD%4QD5>rLYG>THW)_oiNEtu2++vgqCr&Tu@tF=%g3OQ~ON(?PwR7)X2 zx_)s96aE~s{Sos7B1#{hg0 zixl-O-@TBU%gmh+qfhTOlmfz&-hq9Txz8SsjZIKp>e0bJiZ z-(K!%ESXUgCp)Dxx;_(NyjGo*AAUvD*TK3OaQJ!D(z_I)x}lX{qQ~8po;U?DZ*bzb zB>`pFhQS<~bla9Wy#Ra0^FOWl%YfZr&sMJP)3wk8GDwH4}3ZKW7` zNnF1W>?muJ#WLSR9IZ{Hq8xjhr*REBY=OW!fRw*aKb^VcL2;rQ(7`0$=BmXIoyiM# zP`uJ#hg5wPo$m>KF~}E4>-5B|3E0l^JwzRMZgr3m+7 zyzsn8c<7b+`Qr6-&23v_%jBI3Ft))!64Ql4STJTF%ra*T&V)Fpko@{!57957_<~j` z<~z1lsbO#9WUy5HNIrbQN@l&}OvqH%?+j`r!i8*-AVeg&ZrX6Ztdve9+7!y9nKpSc zjR9TQZJ59Xbdav0V*0bqFHlI&^XcGUlHULCi2VaE|AB}_DJiy4_{@o6+}?-%GCZ^5+?52y@$W}ea7bvW<5Ji3u)ca7 z$5DZ5zvy&JOAMZ9m&YnZ{E+Q@Xb-Ct!8Nedh2DtWadIYGNxWB~3J0?@?I`N`SFrc#~25Y$dO1%_YPW zyhZ!Qq@{@2epAJ_8<<;x!YM4}8$5(hg0#WLQts_?8PY6Jibu4JgXBs0x4uLHTUx|E*m@g~Rj zS7aq5a)@+(gS7beb$MO;BI7Dh@IhI`3*>76j3K&~5viW#NTSV-18n#Dxr`EQL6naa zshBN2Ec1l*)}n-qm32iS{54!*Pg~?oM}&6YoLYu-YE8*H(+T~7dGfiBC{k~`rqpX-BUml&?zN}}KbH&Fi-S38rRF-EP zY1zFf?%7v78pyIy*UIK3?YeI%d-;p296*SgjE(1p(^E(ty<=ythjOgf*DTK0*eqS2 zd!~2lo!j%Y$LBWUoW0|aG*;T-i}w~yTPv99#Bf=5TF)#>>s`*~yOacGYiTM3Ux2?| zO?6Gtmp+)@?Rpi%#if2g{)XOKG>k+G|HU%!;;B{_}~>+`VVzLNx!ydZhhin zrw9ZrYkONG+OJDL&N9437r%^J?RB22Ka%caCvo0kg5;+`DYZ71+6-l_fKfh) zHvkGQ^AUVv6$p~%xcNz{(96f)*?r?ec<-JE#QwJq;UAj%A4sbp)>+WR&l>ux&#SY4 zM=O@UqE&~A)Mv>t()uAP*aN~_oXtQeuCQ#p3@=2+SO1(NaSA_DN)cNHf}-OdPXHjn z7$<6mUB{VNA*fuLQh2qOWd#r-=oC1p!sijJ@GRNY{C?d(+eot(tR~*pQ-NJTbXKij(Vj3X zXbEIu&vHrp*kh$`!w2~rmUGBa`>c_ zQH2yVT;YJ1!SbM)C%kM4#gkwy7^j(NTs7|9)XsHt1um1T30q_^B-%HFxhtBZ>RU8w zMwl!?HK0@00l!rU@Yb1{7_f4~iXPfNWdCh3;Jg@++y@|YHSYQQVLeWhc^65gpDzGD zg|{3shrH>WwMK8LtzRfsZWOCoSnpl$?nRJ`wlwZ-o4X@KQL{&-Y&zP}o@Q?pCj)a5 zD-pX2oY9rLBhH@ppthMUfaXD~sjZ%!+;wMxiC5?Xqi2M&5GwaQ19@6O@h7Zb`4@_~ zC4;@Fz9?>AUYA-*_Fxwz(G4DL#flUrX^ODG*vrt%3G`fxTwYGoe!fEdZ#Djp)BYc* z@k>A8%RxUwKoj_XukoyZrSX3Y0YCF`KATkpchg1et?Eg}ZkZxy&KTgeVG3>d{8Gv! z2~B`IT9E)>8NPD8SwhmMS(iGASlSavFX2fzvq@a|p-Vn%ED@_*XWGXlSUONdCxfo4DjXxPrtIGT*!VL&Igl z$`qq2o8~D4J=6%oHDX2HF@TI(GHm9EYkcp)Tosx)qc90pBsB5yIUeA|p)}dE?pY|W z)2xIombGbHZ|Q5a2ljz~fS4I7wyMbR0{fJ6z645ke%567Yj`ocU1J=v%)`Y`l_ zJ@4EN@=+{gr95q`Q<@yQ)%&3S8&q0V(jZa&)MOe#U1n&-gwN0Xw?q}Khyn^%p!eOS z7ndJs*_Q!!(=kBhFsH|oI6bD4^cI@rzJ~*R2vR?XC?dZbBQY2Qw? z7Si9j4&?Mz|H{)WU&88Cm)AdHg{`TKrP@^K%|f?D>tHA_3a&c|JW7MTl%EOwb8HPp z^Pp}mo2AfSQlHNzYY6*`qH8O^ebH(Oo@;X1)2`tu+fL?If0+HV9MV#)M=AjnhM<@5 z7Z+lD6XNycJf5#DH>qVx-!x!%&#5a_6 z%+-<}uR1YD?^q-C%h{t^rjxwciOhcKeUkfSe*8?ph;)$3h)08*&^2Ikxs3%eBL)9V z#}e9QdL>vY0$FN9fkFyUmn???VGk&W7foMLCZLiTK>%W&zWNr6@_U2QUn(Z(CUFJ> z>K4S7q&-+=+EmymdaE+<^ggKJu!ZWh{WN!mdI=LDFT22q4q=u;LiQLFqK|%Lwt3qK z6A>b?9N%ZPk^^q{{i$;K0@qE(YGUAiG_=-s$})pTe)NlitBl3R9uDYR6>IUaa07Q+ni{k`k<9U#8bQZ4AvvTP)O4Nf5kW=%-u=${$T| zI5VQHiD@*pMfX8I6T2L(28dU>S585h>HP3zE&P7zVsn(4O*yXxrQD-;Q9Y|%8O8kJ zVyL3MNLn}2!hv2}$tZ7R>TV@j&X}yaqo8P+*V+L zjPdBW5a_Fv&Wu2Y2~da5RYfANdA*v#os%1!yne$P#l*6tBbjrE7!PoVEkEARV0?E6 z=BUg`bKGF1%L!u;KhA3&I!jV9hXk;V9DD9BipMykSk(eB1vB6_U)h=@o2I|+v?}Vz zshTv_4U;>u)H=w(*y^(7nyiWx+-Y7?o$M6ea3Nz&bYVZnbHR{`!-xrBrd$;%>5Uy-JZEn?BnzCY8x9K@a3tSs&o_DC zesFjC6yQc9z@;gLZaezstZ+Hl<<5x7t&xZY{($pac%M&WmPV(~GG=QCLhANeNNJVx zh`8|X)tu9%@=k~j3(~;de2iXpaHE;UggtEM<6s07C)aH#E%SCyH!r z%%1r^*E~UbXMjSYcYwWBc4uVogbg>?q);32E4!zzc^9@q8~3_}@(n^n$Y4}d3vHV- zr2&RB?7EP&LYS2bXPNWQpGwJ{TXf1Wx~+6W)enjEhFB8>-5Pb}k~cnGF2R=X`n?kSR5KPd6}D)-C9fe%bhA=`{E7 z7huNFZd4tr&xN87T?zjvoFW;|ThMaVHZd<(jEbpmtoe?XG{z(5aP3MM>?wsb)W=h!>^Hva1$#xa05ESvs7p4;VJqejQ2C2 zis@|0`K%brOU%a9+9>oAGmVX|wOA_sij*n-#szN`k4gS5?gxWXks!7V3ylro-t_7KPH4gF7)O+9y0JKeKr35aqZGM}@3zKh|kR&k0uCK%j(LzbD3S~I$JjBuT}JJdPBb3I;9 zD|b%rC=k1spVt*@yZZ(I^t1C)8xczA!HPX~>NVAm1?nI6VBpqOSt`oi?d zik!kMM%`X@g`piM7hqKjX4WmB!BaJQcl++S^cKd!_k{4jCC(q(_8&+bJxi#e%unJV z{9jbHar_l={!djKR43PSlX0FTGS_M@e;Q`u15mxNSZ_Fy)NJ_rXN^W3064^+JDS4O&inT2!Va!8dVN9d;1&fUdUq}{WH#M=u+(uC-X@4~qp$mwBYyDBv z)+7>6XVFUB42VLGmLf@PBBDz()-g`tGk0shyp041Q zqO_oOu2De8ZF3R&iW!}=CPd)q`2Y+Z=8;>>(HExTtAHjfmsM7uFOeDmgZ!hdc|aw2 zyj=g3RhCKJlcPz}8>YF~kkO~Xr zo82)-doqCy*_ zsQ2;vI`i-#d*U>1f{L{}3G~Y+T6o>q7j%Px+s(h3t8vnz@h0oN>F6t&VDVOMvA8-h z*nj(Mm`^sxUec5D!!qo#C(2LdJxdOYHYhRZhAom$FmjnsM0ut$=Xy{Y6Cskaf||as zpzU^XnPPaY7t&tfQ67}JdVe5k z(LI_hyfBhT^YF!dE5!}C@gX%lg3QSiBo6`Q#kGbA^zvYF)ZyeT2fL=eWkpjdM4%ux zb#D_*7am}A1f5s`Dh(>oM556tK$$O|zc2Npoyr*mvE$OA#9o)J&|5zPOr3Ttg#N0x zgpoaeSKw&0m}J-&M!M5t)@8f#pCA@lQJM3roJ(C_C<*qb*4{-~Q-1tu=f{_)DC59e z$LcpS_U;wl8+P{PRIp^g9tDiA3ZA$%k9&S>YlSW-ay9;1bYvWN(~r`)Ju8w=a`0Nv z>{)T?ktbb0LuOBOM#|tzhI?)$CAA`hW7cnq?D0miW#l(7e=n+TF0`!=oUMMY?MH)* z1d-sL`)KR=q9Mv(0hS4eo6h&l3903}S zdDtEZK!MpKFxOb0_jUP-iF4yU2PA=rl%qzA!dbJkIHln2zs?@`CD$+c&dlMliBtxb zi9)~i0wD!^=++F0Tn)V)DxiBedq3!ot7Pis@oZY^V@glV5K%OsJ3*m+gBCgY4%<7f z+e0d{;++^npL{f8oXZl~XAeSIsy=rojjr-5vNr{lv6~5u>nyR`3RFE!5pNpwc}#HgO9g zHc?II_UdnZwc#rRQcg6VO$+{nmhL!tkxRL2!6**^B%GRq2vnS!Bm}?Ja?)bQx6aA(w_(YalKlGOdFYFGG6m-DI znm_|lN)}WtWPbsaa#q2r$ADtW6#LLc9N4i!biFwv`eHWyeyImSEJP5%R>0^@Fz8E!Ba|kFxK{f< z7_>dPb_Mdb??*P%lMh@L5`b!f<*|poVTsK2uMIC4=vp02R`V}q?AqnqhE~#pG#N{E z!;h5F+MJ6PZC7)`7yZ6NB{&my*J|&pSia6)K6b|rv5WpWb=~a7jpgi(UT~bgYv#;- zj3)<)7Xv7ndoX=!p^@_%8|q6kb4cpY@D&{!%8iJ57y7hPtS}SnVMk*^F{V8$3fu~~ zO#TwfteB7o&_Rz4L3<5BcWPiuY}nPOi|=`6=`K90g_VvVwoP{d!)gsyrZfyRA5d>C zBD2iHHdE*yt$bW+bob>x-{~eh>1kUNUwG2Xla3iXuw~Tn<7a53=M-2oX~Z;=Xoijt ztr;_Q-=GjiBT3Ib%OKNWUwHAKHM%v_#&Ae3u#4haa}4&Af->2->qAoVQ5aN~ON!GA zWit)H{D>5``C&D(i2O?R zq{^ro0M|2A*fWdY`d)y~+S`JB%TuspG2eVb7CUA;_C2`Gj?KE>WrY$)U0I!vaVI=Y zl&ph&(-Ys$4qTFpms_^Weqpp@G~TNUS0IH_=&aV%MZ@p0L|7*3nGOO{kBtWa19+hp zfs%eV{V=r8v=p)-JKZ`qom|iDJtz6y_jua8g33s7O?~){QW}iX8Zy}$G7=U2!Q2;Z z!zmYNUehS#vyjbH1CBWD>jqxpj0NBvb@FoNM5*ipH*)ml z5Jof88{DKHG!gTZ44`W?o9xLc=3G_%75Vex`xkkrQZ=!vZ=OxDvRRtxXyYRHA)4?i z1k~ALS2DyqBfhk$9-ug8d@h7`2nS)~xa(FS%JKP`q{}if-$ve#W<)0tWGtvR?4^v%Y!4L;WZ;_YqAH)i`=o)x$XxTdS7AhHVWlyRWljs1Z z94kyq`{L8clbA?+_q^dU_7`2;sK7^q1Q0*mmn^lpn84{6z?A^fm9TgLpW-Agv9ylF zIpZ$$h7P4p2`kkiwaSa}a3N%#g*&j9HXyQZLraAhRg&&LCtGy`trHrl?`E`8RJSm8 zN40+dA{sKc;LS?m8#u#v6k~zyi-w?GRX!7tFFq%v6oez(tayl zMe0K5Hw^arQdfThB{wADt*F+JVv)>Em8@SR-*r(8P$4(0^ik@igFB=LeK9*>$oi5b zmd5(=2j7oWm-8E*MfP~auh%fq^<*K=| z%L=RWXFJKj#H6EfBk9joN`uxX$p#hRJd|WAHmQ|071<6#C||LHt(Fc`Tsr8#)w?P! zfgaoH?(Io=spHaF9NNAA56<2HB?JFZ|NlS+?k(G}oP08n^7B6d|1AUmvi;y(ZS}Jp z>u;$v`^Rs$zH`Ep>aOvwgGmdcZ$P17GP2Mh;QShrMNIFpzgh4P=te+DL^yJcIO5wi z5cg2H+tzs4QQbB>|3B`|DY_PJ%hoY>u)`hO*>SRC+qP}nwr$(CZQHi(-2C@ewRX;F z^;cE9_vzN#%6wccYxL2_?DHFIv7^h{RHCX=;z#{VFzQ7N6lZHGFGmw^BIccJ9(Rcn z0tp(qSQhz!*bT|KDJsGvg^5J7K!}8rq+yKCIe5^HHeO!cPT$$|z5oLo#U%dUnZ1qqW#sgx{M}bi zfuiN8plv(9D9Se7x6KC<)%8%*i2jU5Ek)-oT8VJRozF>&6N2-u5v29RhZgMQ4O1{qpo1L|j z+X2&tfp-}7nt&-a7$A)mb>*kXVhMQ4t>OhWJPEtJAFZr#Kkd?=l*v@h;V>>M(-wx( zDi%_qRrM@-=f1rA7cbm^MVxo8gPG12Ig0~N{1Q1*PhsMVz-48vOEOfI3STZ<8eAM&{Vm^OGu*z%`RTeRxl4v3XJtiSUWB>@?~@XLSZx{0QCGNQKB{-`CE&;KVzFt;BbjMKEc&jvPuTFC~u zA=V!X(g_Cz0wvu=`V_(DLuuFSIFQ)W2nK}=%d(o}r$%DPe z!R*%K-N(x0AE7W-p`p2F(bJ|f4oo3r#?R%N3 zG_$IS_ki||WwaEs)2Z~9=8m`D)_<`KfiW`p~I zF~ItQUlZ+6Lf4iD5smgzO3u1%SGO=Nb{vS}b17^0*#&i^TWqNqS0xtzNy zwiLXi!zCz-vccHcYs^DhPAKJJc^mZ^iag7lEKR6wIA&2-6ptr}nL9#c2?Jst;)toE z6e$w1&k{xlaMqzQw`MJn;g);#l11ZUFHAL=5bp`trfH0Pc=sKL^5i~S?4f1j6MVsd zKQ`EEF;@M9si{`;TewHnc1)W~9+T>|D0WMZ(~ao>5sDoyJV=GX&DqujQ_d?}sJD+) z!gu?NkR1(DE2MS%SdU`K+5#KV-<>@Qol^q29%tL(cJ+ha?hDG`_7|PGX0P1&*+t> zkbxdxuR|(8{@qO2I=Km#A^g*u%sICpCZ$7Ie+IXH9f0>2gU)h?E^Q-QxHwf))Vy+G zQnc!_0_E*mEUKgnjDbiZz5vnhZmSqEijLW0)QRM^gatoEv4-i*#}ZZJemOYhH|<$W z2E%;ETa4SZx7Ll>6RNoYH9X|{Fj|I*O^=YdnhXJv3USy~LN898w0#^&<+w+n*_L?& z1#l<)44!%7`dBp|{lFi{3<7GFcJU^YviUxDcJ;C9-rb94c9F&@xr9lh%9-wrRq~iO z+lmQ)5@gtWtnvKU;B3aC>+m+3$4z2gceH7KfjNA3>{R2h>;%_-GXDzXnYNyR6Oy5U zj3mpE`%da>*K%7T>P;YoWn?O5g;z+ZA>t&P^wzeeh(Ar*f>O|sa3&HDCh0IV`!C+{ zGGGSb9$$`>+U>TBxwO^L?M-MfCbPj0Qe9}$WX0ZQwMMn`!~TqJOtez4Uskjya~_?Z zD^#ZSkSEx`cC1X1Qi3K%aqgLW!QQjNDBZcJUwCu7`9vMd9}C}7!Z*JZR(WjMM1vIB zw8Lx9UMg#uF3!ateEM9f=N<~jTo(b4$JAOZ0m?9>A;WCqBF=lEOcikIxOsP+Zu^m2 z{0A+{uwz7@21D>EZpPXD39;*Y7Ms+)hmk-S6vKBKvp+_7PoOZBFjakBXLhMD8qu+O zuML!)ni$x&vkv?46e&y8Bu+8%!S0z+D9BR_Dn^@Y!iai3n5K!B;Z=85r}h6_JpQM~ z;vJs@tq8u0$G~?`_P;D1f18WXkRSU_asBm*hke!0yLp?AHsx2U`K@-~Jus5WV5)MI zXm7IP>s3drg|;e+_@6|3hp8D3A*IeXD}LmKapg+=(80c+p~?B=N49CXS65MfARE+{ zm-p+6FZ3+M8DRi;7wP%M_L5VyjrIDz%Q>^+y_z}UxUh+aVRn3v-Gt=qXc2|V@KiEE zf0nitWUNOOLoY$%Dv4;z@nK6Fh?W|S=9a2W`Y5MC?h9i3zY;;x45WAmZ@3tIu+4NH8_Q-+^qqZc>gG1i{Jw!De!v+ zW-nX?(sIQ;#LZxIFyTElXr=`p`BV?!u3OlfG=l~}enNL%6zOjw2|oYK=a&f0Hi7*N z^9X08%C(5j%&m8CixwNRLanv&0^nquFEb5m!zIbQ_hmw!Qn_zM#2LpNaN*xi6=&3Z zmC3_#SZRU%fFY%MH461S4+bpy84axK>q^fKl9i;*##LW)8AA5+MI`h`9_$NqNmhj! z@&lPqkE64eoac244h`7SNPDg29xO66G#2NEB%ss9!>4HB80F;df_9^OGnPBnzzuGS zL>*7;x}nzYkUnc#g=bzKT{XXNV`a27j~AV#$3RhGkA)oQ8TlRWy&4un=(NWe{A{Pq z+PoZ8G&=t8r>Qcp#3fF!ipO!|fxa--PVh3Ga&4ASVNGfZNv^iHKBKR^frdf;!rf&CAG1WPM>1G|4m)c(UCe>=NAP|}cEqe1fc%WhBw{72oGbLPSE$=gs{g@tt@|Y>C& zPs8QggCDN}SXw|#Hlq|RaYr5;frhMEbjN)H{fT>A*=pr9%xeBGM^7`akb&nx+(jRA zZk3w{Zb}MHtYG3xQ2l$^u~M^3fDBSce-zLJOqFihwHyN_72LW6__DHdv5wxz(udd^ z=zE>UPMmhcEKNia6y?$Hn3dvMiAoXr_HX~9C1CdyQsQvuX+Kt_LjM?F>72S{tNu=N!Nbp%R zV$wE{(*CXFGXN9@iUJ%)2et=@@7jmw!>6go8{`igf{DPQzZ)IGR|uP;D=%N*?3<&9 z8h%^YdIDhN(6$wMtr)Br?{MJvgLLnOK!ZwiJ!NQEQptv*az3tO%%WUb*bwIT3NXE~ z1ch6Gp-Alg+ao&QK_`!bTR4zfg+vqRnp~nB7|8|SZ%K-|EXdZQ?Rp#v*Qp-+qv8CKEr})mC1s&HBTVJNf?;l^H7)iA_b4qNZE0LgitT6YE})%kZU)8d ztdA>hA7g24I>m07vppqkI#L=eitE?k*6#@7;E;xF2>$e68RNYxxIFCyfY)9meKgpF z!j6Q&e$N@=ef+IaD>FhrS6==+?e6~zj3wp9X}9&J)h~Dw1AhT zgWH91cendB3|msYR9WC@bDyIih9hxA+%gsYgar8XsWl^y^Zu1}oJel79~~rE{&YLrN+&IC1Kubtb!m(b6%W8p?@}55Yj8DuWT-V?q zQQW!-K`;d}-M7BdQ^>HnVy6)A(+fs0EdI{)8+|%*~APxg=2?#_wrOy9d&maY&R%${`}c#Nlrq? zG|z?WAq!Hzu}WQMm+X;u6BDSOTxDobYYerNeOFG;ys!|p%3~OpwB^J$=;-vzjm`y4 z?~S1G5r?UPQ9W1jNJjDq%&5Zr15`h&+iy29fe1fHJw+M0PoeW}c)>4Wa?ug?by88` zM%<_Twnk~TS6f8&cbCYNjuTe=>>vyUPlDzdWxED)sA4En;IN+o(B@M(L<>Hs43eCY z!3)WIm@?R_zQQQOZh12Xg_1M#C2xg^`|tS8-K^ha#U|BU&C+r-bBOa3NE_p=X*+B8 z9)tDx*%^|GZ&G+Elf1Fl0Q(7Rku?)x`iNtOSo=e2kdLMA_AI&DD=R;|wPGIzuqg2^$m{9Q^Ctm@(1p3lfBc1td~VwnRT{eHkGq~Q z9rF|9S)RDfo@Y=7^$TJvi*i;%q)---ktsHmYIQ%%Ci{%^&f<(% zX^laoj@m%1(wBg;B@ahc?csRq+WqPEG=SW-`g3);bk}qkE(<#%ib1^bB=0X$q|Y}g zlEiZE-$;=P-=xTu7f*h}Z&IYi)LPOY)9g1X((Un^6xkthp8Id4Nao?6``@I<^h5$G zTM(9SQe@LXa1bWXU!+JgmR$m&=x!!q3kOH5e`o_b?``;J_$7f5O=}cp z&oQSh$Uh$NL~7gPu-uyc6DiX3?O()}?u$-L925Y+4g&xH`5&Vw|Hg>?+qU&WMNJAr z2+4D*O8J8AeBi817e6SzSk^>Z+^d@gd#&tJqR!7pF~Jy#M}#aoFc_(nSVC2JVOT~i z;d{SMSN$V8*8#OXRomn2uTWL&Tx~ArBiqAq7NgFq^U3iAv${s21^7parIE4KYI3n* zAIlMYa+jC9k(!)vcZ>Z|1?nR;qL5KmPuTqfay(5*8Fys?rt2ULIF|aVb6pI0)dA!J z|DGQUI%=VnrDOwOg#%?3I->nuS%RFcR-G}ag|GGk5JlR!B)#?CMHx9Aj$RPYD$07wj&_( zST=@RJmxcr)w!hX>PCK0l*3FQK!yq~n*}VWdFbmrba2j!GWZ~*#k&xNpY2K3o=KaX zwQXzPIUgKN<_&pGcww`*Y^}GElxk?D0ELWeIvJ@Dwo=sG zDeca^eSBvCOh< zY{eeih6G&Qr$f+{rHKfoA;`;Pdz@i83)*S%s`=q_) zShKxEgSd>IE@bfK{9St4WFlQIZn|hN-6w{J(U^7mAeHdtUDyX@%o8Ajje2CRdT*XC z9`C5rBHq5hI1k>Bb@2?3XYb{C#qwo6ZVDjX3rxCRyS4`uHBxoz3i=8fBvPFT!wRtW z2w8dAiW7%(P0SAuq=e#3I-(^FgJc8pne>fK4U46vA967CKpV2r_3~8qUXA3NB$SACcaEY8&o#tjL7XSopz#1e6wRD#LZL3M{aznG)Np2AKOJ% zPeE^}4o*kcDn!(^;*cQtR0kkK{7D8nk>&=+DuvVV=c@5ktY>t|Ytl*!S17_f(N2D< zkRDCrLQFQRXvjaC0eWX4y!kCO)d@u*cEZox|PS{`xPXK~)-lI$8eZdhU zp%8Ber%k4NlduF~$W&PF3@hIR;xanegJmu#K8b`OX<~~C2?U~kDJZSy&%>nq6+vl3 z(*}EK*y&l{!QN}t5ZhF}y(vIk*nQH0?EJ$oZsDgi5h|q&LG!qQwII4y9{Q|mlxR&i zrjh_Q1hdskMza$Cm|!4OiJQk}J2u!NlG&1{7L{bhPTrs0Y$~EnE^YG9tEohq$o2+*enM=jwTa><_P|#ea@p)jvl0 zZd8b65bx^1Xj*`lnNm)2=%61>F7n<* zf%m+68ht{3IjZHd8hg1Nm1&<8EmFfxIUwcVTk^zj4nWjjGhbUSH0LmN@t_?@oYU}O ze#gX$Wq)99>5~A>1kAcfF|s>>=}a-cXh>fX4^bQ#U?k{6#+&9PLUO^vB_nwTG1(qi z{qu-ZYDg}x;@_~Gxc^*|{~;InUwNLMzm@>;Uw!;Liu2p^_>z?1z|UHso5w}x>wf(^ zigT03;Vy;bb`Uk3%0h5m z_`FN~3w<-qSo~CWO42D2W38S_rt&f!_jz*u1&e=UmA8G_kk_*1uW$aQ+*ml%N3pgI z9mnRuX<~d0ov}D3>BcFWoPZrDjZEE!x{Uk3+-Dz3SeZS4k2Kf+Mv?yB`KYW}VhH@| zypk(_++6WnI`cb~uMDHe4-|B8_8vK3)vO_z5Kjm3-v@$`z>|l8NMJH8Qv?B-7g&!* zC~!dyma^)>bo^ts3j%HH6YQ~*vB&lGHSshNZb+r2a;IKmL2wS@sj_$|uTtyrOF43j za_ov~fe!R#^u1tA2eK`Zf92$NwL^GEwIZ#Yatc1a9IGjcfrw5(rkvA-Q+@5sTfw`)|^{SyvM z*R#$2^$AYK+J_Nb}({WQs>$BL5scEpYL&9O$s`7j`625rlnh!}0zltCeAsq$y1x9jk zp$+0CQlz>rt;$*X0o})~2nZ2s9IJ|xMW$sNI`n2OhM0ECr>6?laZ7rs?OCN39G=)V zJQXi~gO6CB%nJ1_wF%GLR<2>uGj061T3eK{^yU(>Pvr&pM|`UHsKWrh&Pn1sgPJ+8(8jND>GJb zpONmP_vgCs^o}O2DGRlQEHPTC+e(>>WnZD1=8FXiOsbrzs#7`8QTw$9L%)oK_Q4wv z-0FSPYu|Yola?r6)M@p;_dE?w&+`__$~=rWs0vgR3s$HyRC)?qxY;LAR^Y=2+Jma+ zevpYWqB0PW6GPw5hn0YDFB|5W=!zi2&H?UHJH7lM61iOCEWB5Q{^1@wnQd>#k^#tR z4jNoVR6DI;5CFnR(yOe@DUsW4G0TBE64!tZ87)F(CTPHHja7EoOf{8#XuBW)#KOoS zp*Qh)M;Gy62b()ilDoc+j%g1r)rHl$`rJ|H_RYi$6`+#nNTx=zcgUr4$QjpN9GAfx z&;MS3z+mfA@vBTmUl}7Sb0+x|9X1BtN9q*5*|D}l#9gS(K#d~$n%?rqvWNw_NvPnd z{a4Uw_%PNPHBka2Lc4eHkG8HKU2ZuC5@ZAqT_=&OGkCnL4@+AwCeBxRJ7s@9CM3O# z>Y8kdmOMCKpSA1f&@MMKb5eN~C}`wgRLYlDPC2}0*FN6`8)7l1%fYZ68r{IxKB_d~ z;IyzWx_${MCyU@58scUFtjvQ9=TUFnGj&~VY%s67u{ht49M4tc@5@6?0c1K_9A8{u zV>uRSVhB#*z+yW=(=!;|Xd*R)|0WOOniBTHgG+w$(q3~vWeT)>@%wn|U~|(I$q&mH zHvSI3%euyn5|il(W`&7nwM`Y~NKxg4vgC~htXs+kEyfXwILAsk%O;;rim-TE%0y~u zXNRG1JJ(GNJwD4xB%s!uA=>1`oAO5BZ|enZ@bptF&28rS_moETcJD+<4oL~-C?s;M z#S&>ZlvM(6g;mxgeJcO)I+6OnQIG#B0rdZ^dbr`<=fHg5rt9JS$A0E-Q$H6eYI19W zNZwm_6b!DzgcdxpR@w-0Ho_zJg(k_|Ufz^r$`O_XkiZxAV8%eO+PF=z)*`rg(a}E9 zB87l#%wI$e`fnv(IYv%II*4&}CfKYIAKDiO=QEjBQ!Hf(lbIN@`sCl(+WZpQR5Jq; zQF+kcWF;T8uS1=eiH@)8MdeK4=u z^D*$iU~d?UjuuHmvd(29WI}sn3&w!((Ko~|kQ;}V_2>bkGcRTYrYwR{-xLy|cWA>a ztxd;8mc{y_v+1DuYqEq?7H%2^jN;KLD%ceO&{a4R-=AJS-e0 zr)vQ_^v}!WdE5mqs+LZ1(d>A-o{Et%IxsYGik0_Jivb!%XRU(4L+BhiE-fN6QwHbo zHMkc^q@2Zun4g;8+%zBeg|3c~uE$bC3-$Lkuf`Vh4r{cb#K3<9Q!W;2VJ&-s-Jq!m z%Po{HhR=hMsWzUUH0u2G8~-$9TO{Q&K3ZZ#hcLyPLX*FfkEue_Oc}+7g}`q3IY0Sy z53z%5==hPFdAwG+t^Dy6h&;JKJ~UfOTA_KnHG5B0xM!S!k3|@$7kOz-MXv^gTE$dk004SNH^myU;%d!42ytHS8kJIRq=a8p3u?-=J~Ge{eAH!=1}FjXr1 zp%rF~)63An$uFo@Kd`E^XuvmZcInf^7tbZ+4}bS_{nBgR4Z}Vg!h%@HKA3ij z%v&M+kk~Fc32UoHtez%Q3PB4Z8MPe+yb3htq-ny+UEsvU-!0)Ghk3m5NpIgR?(tyF zDHtwPi*~;SJ)?@KqgZV?g`iii7!w3bqhrcx|L2{~>A;i`gs9hCozb5QAvjZdZkHX^ zm%&U8Ob@QwPc#BXq=;Q%82+`@HDL2TZkTB92rvSj;4s5{&q86CfVJjg)bxB`eR*en zKAz-QO7emd#j5VH+^#VhXTLUlVsH>>u3Oh`&L0Yei+UT{312}yr>sq=kwQX}egGdp zfC+z&E>?yBKoOES-b(A+6v-{$9~@UTaqO@u6^NO}oHX%$SCEe`BRd%3G!81*CQTdb z)9RX@(%qUe29_qT*goNLFDW;;`G}R$*IH&jW4ZDbKf?;Y23*zptjpWeyniFM_osa2 zv3{*;j1*3V1DjFRK{KTFvLu|QS&g@VwH)ppb z#?#o)*&?KtKG5LeI|Cot^x>(>2XL)XAz zbuuyudI^4gCS=rcM#U3|FeAt=e`cja(=#zhhIC}lfU-l)K~SqZW_|RvRDp{WLI&8khUvOd@& zTk+<^uO5@mW_1lsJWC5JDYg|BTVXRGp+_P3qF%w4YJp{LR$`VlsRipvzN5tol7)$e z?i$SxI&dwH6hF8eUvu@{hcPsFJy0*&i(ZN21|pXjH3A?}7)?f^`^%{}Z};`5q*f+U z^j6{>t1fUY%Ln~%#ePDGn-TFON=T&*rI8<>hMO+C|5t|ezsl(Sf7?;%{?#-y>2h#P1R5ky80%4qU?ShJ$;E2Bto5M6_s#wR0(H>UiZvz)F}QapPR6 zY&NcF3qOR+Wm7$5a3i6x01O`aSAe01%c<6J%8JGinIw7xyZnIX_2j{Lie0B&=Ss>- z$6G3_%qfaN;}MEHK~7odf$miOhA9sRlL9)L+*8EW%GnVbEpoJj3O4dQ`jMyR+^(gZ?qbR#cC#5_j76@A0!)l4xlXB;IMLv9@RR( zG6qb&W`oXh4E742rpQ~0yQYlh3qH(LR1-$1FHS$mA6v-=xlS(c zGLF8*-}ogSk>*NEmjtwsugZKN4)V;o$N5VgmPe-t7X82|z**(-g4%Kkm_!IR zKGao4DuLLxaGVF0ErT7DBJare;&@~T$KWfd;!5>-Iy2#^H=RHRt;UkBzjA7u#UiRb2SH|f7!Bni8B?o9)I~J zhC~c?U0x!KU(5RDpm&FaSOpgwfo`m)Zg2X?7a(okeq=FfjXuE5CLfLOOHohn$EO6J zwPlUl9;7z|i1724rvrtvqnn(FaK#6sAH z8#M3bLBQq9SVqAdE{T5PBuJIk51;syM*BjCFDif)*T-DDle6tf>S|ihbAX}k?^Q6{ z@2YR3P?jI}5UZ_5om-DYZZ9s?ulx3}rM>m5 zZ`&R0TI$-HL2nOU9{0wqfGPHmx}Xz4?9TYy1HPhbdRmSu+P-&4bqG~}hh-dq0`BxZ zXnSblK`Gpdp7l0t-$GG>X2tOPVsGK$^9cuh1>OSg;2X3x%u>V}O`&OSo@dsc&vvVCgkE z^~^Pp;!dVe^F^5MgyDK#-L14jU0HU$>Yi*_yLO#=-Fa#nNrJH@CpI{$&3OunMEX7B z4{+=-o5Ba*Qk#CshlQ;>Tq~!bYzxgSv$Q{_$k2fLgW;*{m2)w=GhC+owulK6hU$`c60lI zkQ?W?-97VoHPvR+U5)=$o4aXJO>a8fvZJD9$fkHA-fY(n-URVkj z7}(BrI(6NJc-FQaQ~{A6WGF9cr%V2*mVK#=_T$IlOG9`!6pK4;_)_#Dmx5 z1w0c}V1ke#zWe>t+SUbg6ZQV9OYm!a2{3G_aF*pOqWgiV)CH1%{_X_2W?uupC6y2L zKbF+LO{-ogt656pUopFCsb zOuAZRImrzt4jC4}F>S_>-?Au@a^V7#SLwMr^y#^^FBy|a3hHXQ&%=F;3JbA;`DrL{ zv1k`keQPEt3aF~{h-Ay zC`EHrB+3#Y@E59%u1x9Bee+>2qAIQ_)Q3Y4Hy`!Mf(81=uAGlc^Ev9Yk1i3Vcn0rC zuGCt&u@Q#!xK_#fyXwula@KGO~I&6$*n9o17W?G3W z-jZ;FnZr4boU#k(K(K8ygo7udgEYiRudhYJb)>isuRhh#hC7Qzzyw0h%BQ|V5s~fJ zPvN#d)Z%6tK{Kc&kDx?bu>dBxg`l66at`?grdeYW;1J62uU=0SoLW~910ls?P!l^) z;#O{0L&kuvW~LA_7)nl2&2?ISxuz7py1?X?=jX0_IJ>zWguJZnuA0dkbjrq*GEfxQ zuFMC8&V~!9pi!f60~0885-S`+6XnH1(NYC-a$-*TZ>v%%srpQ%q2N1Tg%u7*t+1F+ zsiVY@+T8gh$qjz!$HtPUh=z!hz3Gjc?l0r-W|;xJZ!8b4vo=5R?#-;x@g=TmAc+qJI|gGcK|rxjwNYrN-65 z9UTni1~y0m!CU>|?tTIa+F|4zBXBEd z-RcvN@m7;G)?u)hPLK`_6pmji=Bv9Nh}7c!GvyJ@fo}qXE=u>ZgD0M;3L4;hW8H%n z>s$c;;`3Zp6}36JdRX$j)lE5M9BgA%20Iv?OXU<|Y)`)z1a*N>_Z$&{ z%S#8S7JG%7$G^OYd-CdbC;iTPl3@PFa`?B1^M7%eu^rEsySRwx{_>*!eR2W?6PK%P zx{tXlH5v7#@hI@pKzP1L!r36Iv%H`=rmM+>Fkb}^l^I2!0huWq4H>$|^0(fhAKMu$ z^md2oR+E4193QuH$e?W)vD^yvP@PSb_gOX+u_o#%KtJdEm!%WA7;Lw*)1IOSd9>EX zC_p!H`zN4%i_lvOockin)}|F5s|(y9qL`D8mLf3eVXnt4-#oj-_@PS$^o`s)|4z*Az z&nS6+QihK6c=Ed+5rQL5wu*P}wK?vDd7s(?!a*VNY%_~q3vBFeVsJ^PVUI$g zJEo*>5=kI;kIthNOsG&}IuC(e2OHgNAPUW?{+vq@E6e-0~KS@0Sg5lBut@yx9B5W=K(<#Fy7a!0)spwQVIjJhxiMv+Xo@&c5E*+Ub36`ARLj*~9)dGxIlP>|Y)Sp9B1^5l}Ekd7cuILu*MEIS8B` zh-Zk8??0EWAsyut8VuEy5s!>Gj1B4n*g!dtePLBpM|JFm`~^oEfmeVKpligpd1q)! zc3Rmd7~A`sk>M9{aMt+#5={u-kU3nh+PLhsh!yCQBC#7qXazc~p&KO5ZK*QRWHOo# zrl}{g0J6LfJ?h=Zx6h20rHYBv&-4?w80QaGur{zo+JR@OaY}J?a62E04EJF;_%+i-GVpcnV1vkrx~t;Qv8U9|d!Q zMx?$%sJ>DoBBBtz$uh(2n4B@+P%5hIiUIsc_d8(oI6OGSH3ZUb^b1&5um?+qT2};T zx5H1nJ`w%1VMTjK#q37i+NkhjSJLgn(#*il8KE(8U5cE=*$6dj*TvL7Cy+Er9r`7X(ZY^Y}r_ z_N>F#C_TV6A_IH4RFl!vtC(4I36QOhupsV`OpBeJh0)C*E>oMe?M7A??U7ddiaEOp zQ)iIy!&H_<#cyEyj%?66RMO-oMYlI@bFeYg_lKhC`PKHbD$XaPMzCwyFQQ8heoj(r zrgnZ68I{A$Bf^`xd4L>Ef6|bNxi-8}7+hVo&8noeGHAA?CciQ`ow+qo(RWl>nrM?O zG=W0bz&@AM#XUWA{e?mp&eT=1ACbLoO7Sy2VX6V)JJ-2k1d)EhC$qUauKhi8lrD_p zP^1;V{7no{(ON4K%q!A<3fjf}OkH=4-dH?)(2;i_S4dreEoAD{fxpFQqF13t9Ix~`Ya19#W=Tl*UtYXP&fI1nqBO`0I=2s}ANSqDP#|NXz z+^rBN!r8h%>NK;|d^qwnvHXHpcLf0#Q)=!+fWrIo37_kFR;#li8ud+F^tH-t$XtiG z)XFz{9XE7y^W+}jF}}1j=7nf%%4$L}{4l$N&#R~q%E831<*;k?aNG2HZaZ+^C*+Vb zR%e=Q!nQa+c@;hOZ28%WV<+z)MR6H|Ue~Lu+elJ#S>zBl^FDHv^K&njV#6NetC;~gDpb0`a z%#QETp>Lq=s6dOE%94t*Fewi@I%i1zwdUbSGx7Ze$=vwmA(*r)#=J8~^TM26&_!rj-^jU3Y^6gp+fBnZY{kNq2Z<&rm{C2HJO7;_e zaH=EfbSN!4=|aMFQw0YHc>5yZ2H4g>IfQB4 zbQu$`c-&Guw;B&ZY0-C78!p>$|wM;8MCHt|+tMFCOt^;Dg zD!@pLmB2P?5M53=&Tf@0S?FHe36Fgbg3)wP1~A`$q&DIZF1}|d-=!dXqpf`BlP0?y zAkou8ewL?2CEJ+yws)7^G2Emt^ZLRlPd6+_WS=;|?s}`0Ljj)b`MwwqG+^PS`dszPInqK z=#6Px!y4Q?20KH+G4r5-=`a_Kxp7iWK0jBPEfhwo7s_pL$|;^)X~krLX8ir;57%yj z1%3fmP^SM7Ut$&@UyzGd;$eqek(**yCt!Cqq`l^&P&==){G*N*f`!ss%8=NfCbg?gk2@iZW8E zS}YYi&MXAsrgV09GaXA0Q^gZgfYzcrb1Z&DJpz)HG-+g@wmZ+!VzN+PQCZI>u@-{G z!acRIgyV@p;`#1}aEg?0i^IeF_Ab`l)8#i0O|(uqzMLWSg|}y#ICeHzSY>>_w%dn{ zBI_r`gt;a)F@HEY?@+*A3a!_@rweM5XAl=>F0sj3w5QVqO5`ROST>zQO$SSD@JFjAaDY*p@HouI)>18X%L&&;J)aCJ>* z3sDfM7*#yZSN+6S&l@uuhPotH6FRPfS5R$X4KWzW+AQo9H(#hk+L?qO$~QAC3nAG1 zUkI!9Z63_x7{4SgN$ib|0jtvXT{r&(6IW){nhLIyIWtGC zUb04BZNr6`UZtM(u~~l5LMW6DM2TxQErj*Aw4;2K&$H@Qukqx7(_m{q(H6>gV_!=a zc{NOyMDI->UN{|}@3gMXml!~|RGiXObVD4#sYcw|L{FbQh;8`aInw^O`V9Zy+AZ-j z36_BYu2At$xI#TylmW0@{c?o@9I_7mpxg)-KAaa9?;s={l^kXG^b<%qvIJ{h2nl>< zBR~Y10T{G8B3ujvDk>Z{N|G6FY3VvjAhciZmTz!Zv;pCcBh>V(MVIw$<&A4E4Z%!{ zR1MMC*yL(U8i~)j$r+^91iY@3i=&8X^j6L`YI`heEYC`Fr@P62 z#?s{uMGeDxRVEw2GU$8YgW&r0fxTsIp{PqAS+HAWS*;KkLTVF>Wyto;6%5Bn?Nce1 zWTxK8ERuK~$U2W8A?@*|@?Gd*ikSOAev#)o-(I#1N%N36tyTguOZ({3Z%-%{@0fA# z!hL`zl(Ra*nfE5#=k=o3Xk#|p3fkegC3mQ|@H z7ID9PB7Z{-NtRvgZ!}yMVn^c}>u;XpH}(hD^xAIM&!)dCL#0g4U-qA2;7iqIa@bVv z!5ZcbR>!;vCG{_V4z{U>mBpr_)%m`{Iv=Av=aa6UB97gOxp7N#Y(M_%^ zq>Y_n6c^OvU=C%BU=8DM8L_ByI-rZ7mHV4YJjq-laLUW^x?7_^a(4^b+XD@}_b}PX zO9Ul~f)T1?l?%(T3MT2T(u7T~(eWVYWHpfsn{r){aK62OlvL(Cj*pSZDxSjtraEGy zM!u4?KbCO0A$BmJ!0SxJ@_nOK0yH}!1KK9D+ANH5ow}2Q-z~?#Oo4uu5GEfI08NQ) z(Gs97gDFvQ38sc-n1$o@yvk71LAuziXAAVSFpnuP;3Qt*Cq75s8I2x3zZ)=afA-etGp0fV>Jvpz`dQp{f z%280yanadsP}OevXQ>J{h;OYwGJ)&yR<2{wM|`>oZ2+}G{qzA-bQ`GuR3m`KNI2byag4Q0}W zCS1l4zdWIc+Q)#6%CGDSYL43IBI0MM^%^E+57AMsu|Jk2s64Z^U!*lj)3qhqqv5uU zB#^Ez7aJYe4Un6%Rx}UCqMrB$n~dZqbD<>s(HazLXP|1-Ho+r?^|#zs^_+2tP@>73A_j;KOt*Lf2)RD zDdywbQ)lKZZK}1SMGG{cCFox9zV+QthJ3^{%u3KWF(pqhsxko_wV&k&`OGUnR3 zNHDm6z?ikqk%qJyADvnte>2N)BG;bOva;X!s2?LeGo5GwQ})ee7#w>VU&tO3e#p}w zj4+w(C8N1n^Hd%_e7!5f*WuSeE?~S0Guh!^Az4osv{!X`=-(p@d)XT9e6)OFmuuT0 zeq%`~ck52o)q$$k7~6_WeJ*FnX2Q3}*^Rvfjwo%gpG%n%<^3~ieYD|xtb%ZO=mnH3 zOQGxG_$bsn#8H;^EX(;)lJ{o|yv*lXj+1(>4R>@1Y@@g>+=TGSeQ$Y5oCFwGQhAD6a+tl z)+c-C@?iTVDoGcjkITcDAQozZ_X9_xTCCRB2W5u-S!vXkj@s3|O zuMmMtjL3?+b0oL61A;`KwF?H3lOJ_!e81|?)Owrcq%}~%g+@(?CIq{k{uOyhUd0T< z7`TKY8?mf2=G#xXu;fw62m;!(c&tfAU#T0iUW|sgkHP@|r`XtNUgJhfG#TA5;Oyyv z(3v~2>s9aBp=Q-tio34XrRWFYts6(c%MO+h!8LeWXKGBwV0Ucum z^s&RLSU`jADG5bot(FW~RfJGSc}7+9(dFr$wWb=b0diJXPkm7JvQeI0e~}C3SvnfI zCt4>P@mYrpQQfEX38sT*45pKy*RC*1VPI`2XK(NuD*BnXzfwzQeQwaM zZKw(Xj|X+6MPB*KV9O(BFpOiKdw3;xk*Y@hy%*W*omyO%zJY$KqTI=6xs%v;a+W7K z7Q5ddl4rf-N=FDOAeX@6KV7)V;-)Dg`L%*x4Ef~v2RP$nOZW$mO{u>np!MpeR}b|Z zv_ol8p*7#1{^$|Fs{01Ji`gj2w@e_&ULj7)WnP3K=moxjjHk+eKk1=eAsN`W@Ln_| z%##wW3ETidk8<5ChRTir4jX0)+JV#JNPp-^$(MBLFP6o(@oA9SD1#0Y=JuZNrVtnXGBZO^x8qB;s8sB@n;lXC$R_al<-_3NOH{VY zO%toDpGya?LWFE>S`x<1R@2mM*C53aLqV{h!~}AMha6*%uKHrt3 zyS7wM@c%3wr543jN~Bs=#&+`SPLn*cGSoc;KS zct%1UE3W-vMtTG@6gpIq8j#8mw7jr$)Hj+9!7<4DxjWL|!=8PKnU;hJ|7t{5?x#|- z76UgpCuSR3F-fn%!+?fD&uE~@@UD>Wn`&hg!*&1r$?t!zqVwS7mzoN2@~cQe;X4N5+ik?k((OsI z_0`lArH$@*sd=^U`luhGYyqd97(b-6o#10HmM8(m7%K+v;%TtbV<*3MgO8m23jaF! zW#dX<{>Y{knt;Z#VNzPj4bujD>;dhWqEgsO}T$nGc-Ey-D`(zLTty0`+dUMSdYL(@C*Be%JtL(2PJ!kXuBj5SomqpX%y zDy-I0?!j=v2+yS8YSkkpMOYQ3!C{e9urFcs`Nu`Ho>%b>d{jOxF91%bNY_Sr&8yh4 z`KJ7;O!M{17)^wRa7`#Qm|amTc1M{=dDE?l!vei%_cG2%H?q}tZ#iIJf5gMVFjgH5 zOD4ncxB`o1tGE)2%tu4>@r6=1RgQbZ^l6LLmXmoA zz41j7t5Tm>LLZ)gCyLs*hEC7{lELR=cG?Q375X-fNgBbyuOuw%hP zrPLRLwF`)&crui+QSiJX+%0)0`mU=Zi6V303m=sm3MPbbt^D;^hf(%xPbwWpD#W-_ zV(o7PTsg=Y>AI`1c*7{~=nRM$x%0k(r#JU0#0c^|37FAi%#TT-w47Mk1{D*OgFx1kig7h{=t9syi?bSN=2RiA5}$AK{x)rC^*Np@ zm?n~{CIc1{|M17zb0lS__T&%eD$9a(0})*YjDr<5(Adwjz8I6&v2k#{;_)jQMv#^J zROCopqRxRPVkJ0=SVBz$eNbri4$>y!hZu}L;oM{#B>pY9_ExbNnV4`X%@i<%I(PC| zmWVw)3O4rPCpJ0N(6c%tfiK26;u>$8TxBB`TSz21^`{UP_~PAyRj9Kon5N!+fvr|2 zs)+)_C>r6P+Ln725cBPZf=b`sZatO9vCsjGBpgPto^^I?%qS^Wzuf)MqaI7M3#!0m zhIu<7D`zl?pFpRDd~J8tu_7ko$6y+aPgjo_5w9|)c-zWB@=#3W`KFHtRDjy7Q`kA!z%2d2@NF^k#=cd*o-06T_7IvH9yw2i&{ z3}py@3(cG@6LKUHSaJB6eEF9^t4jm zO*0sbqR-75R`kOl@im&Lell5Kv9z_}v&HYL4Nja;!spN9tXwmSNbouu@6m=3*L>~a zJ<8rj`qFkK)6yCa==%NEuF!|EqJWpo^n{$xz5y|xE$4GGLWh71?2f_drER~Db1#Gs zX>%#O$m^H488j_*v(iOR$aw>ncThXt!^EOkSv2ugDS4@m=(eICVqmj|xkf=X$;!m4 zNn7SZbGTmGo5#wg!w`9E7aEH9Kqc+xrHi$ecTC2yh>Zs-6}aLjiXsmzuQhS6qa%J z$-JDym++(_qQR27glUR!#WMYgg6b4bmiE&)PU&mr_?kZNaabkb^3W*JM4~!IZ$+4_UR-Mw0|UbW<)jXy3M{~Dg472J?*&3D_gwRRvqh8{_twf z6>BQH*X-RCx@tAH6LXGvyPE}<1JRCp^)*LWGa?3}h@y4iY^)D80n=~;CZ zsFkMAgWlZI2CJREhvc40SOh8x5qH>mc@VazIw3j2>p&-tQ~hEmyojHvwGLin*#*z5 zFKcypfOG9NA8glf=lVO-*K=#+1EaJDHC%#8)Jg-ebJtx5;?fWUhu%hpB}>n$gE@0@Em&F27P0=Z2+#bn2$zKa z+7}T2u?RD%-?0eKvs7}aGJR}R53L963#`Qes|8?RfCHYV?qhIx$0AJiKNexZe_4bl z02X1ze=Nf5_PQo~%#8n7gsu8j&%#`VR2A?fpUH+S4mcg8x|}@l0smkv45R?q7hC~y zRXn;c_)qDRe#Zv=a%AQwl_zyPAhq%H5dSEhAxjj>O^8RfRZ+jWP|j%+uNc86><9Xd zj6gaW7|gRA4iFyXS!MoHY)h3>>IUW&bD1HhI^UQqRK=->?f1UE>0hqQG1D<=oub|Y zs0y9qG|cT{^+ba?nVLE*%uy?i7`U4v`<>w2>;`AG4&ELOnX|#NPIy|i9}wP?7GZVm zR2YqWe$8LQfaD+VhQfph^nm9_*Om!@0Ur_P#@NHrt&8Y4@N;O9h4wbk%xsgf_H349 zE1EXR?&l6*ot06Q=6_?$)O}t{#;e6G@1Fj{&;VA#oMy6TMXj9)1dfn3nHLF^d9Ln- z3v~5cYoR8>994#Rskm5PPf!N99^XVlsYyI*`H1ko6_HN75+B@|YkTvl<#IqOCnA1{ zgE|Bjuz4_6Uo=l8@AVdG9zSu}Qf(G0~$TQ4V+$2DPcff*0uf<)*kxwp0qKo#IFdEhRA= z;L?0)+}Td9(7Pl|*v^^jZcp^4eeiu>jkjvHjEOqZ0VOl9Lr`;=B+=%iDwjLCRYatJ zjX?Zh_OuKO>!E_5R98tfh3rnvOHJzZrJ0^$_iCb%X525=AXl*fuVzeXW}$Vsnlkci zLrPGN7?fTbS)f6=$j>O$ZXoq3yylBTOOhD4DxO0qx_C!H5wmq)H$DJCBrtQC@x+HL zM^kC!8u^*~79fDH@GeuZwH~w^IPX{(J8l>^ljCsLK(>+8ki5kELUdr)c^>-K>4dlT zJh;WbkAqEeVFF#eAcc2j*(%f~^(u|H7_{6I4HbvB-Srj5R@kU>iMA9MZkR)AX!H+} zEWzsaHtBcb{=+HF+Q;W?$+K=W)30|4X1!tAp;v)32yxfkrH#nG@srDeQeL59i)d0t zV8YTvCXIaqjc(gWily_cj3!uGJ@p$^!!#@+kn2`~?Y-O#HEhqkdu7*kicf@l)IqS2gu#EO5V~ga9ecrzKAp$(0rf zU!--DWMsx~i;-xT5Hss^^l6jeff8BeTm)rf2A+s?hXm&HT}BtbAU^DFWP7&Mm|=CYWtgV`aYoEx$neYuDP9Mb&)cMU%Rz zC<+c@@{dA6Nrq#h!m#2k|2QZLZQo36ac|Uu~T~`xtuWK5wOBLq} zlw3~fUwO(bwCENbW;5ES9L&q2Z!0xN0;gP7)VkPz0kSuoX{_6&t=s>K&a*IO_ilE^ zW*n#a=SA%6dgBy9vY{*(!h_c!`(sq7ZdvB~x!fnEU?=r3oC^sr+zP** zwAEIrCP9$kUv8a=a3wZQO=VBmeBb2622*qTY6XAVX#k$6%JcbF2FVen$6d*#M^w;P zA`%{QM#XYr6Dt{V33b36fAd@m-ml$~L|QM8p{tQuc{b)uccMN<@8nJIg1EAhG`i}_ zYlzoYo=1vV*AblWo9XG<$n^Yh_OS?vQaDeNPfPoXO}6tLl_CiNdGnf`BA4f9dxv(t z4UvaRCV_RT4|&8*5yd~9??kt>fNQ-SvOR!1PzW;97Arm>1_igE_83-)_h|zX`=ZnU zoD-R@6l+Y{RS_8IsR~QusXHoXa2(2)x76JKIi^SZ7?tF1kk5M#|{;P2+Mc6!V z6}>u7m{DD=Y!O$Eu|x}5fDuuqt5^4a&+Dss|N zQ^E=;Hd&PMHpUtH57OP!6cJ}6-zc1_8L|;fy2BVL*@eeogv4mtiHC*R4VS4G(q3-2 zOnDu=>Z1tkr*hKYQH>{_zO+H@8suK;T1S^yE^;v}F9;keXH(Xfe{M@cT5h7{Iq@to zl`|{Exkk93@rT3!0qU1gRGWpdiD%&)T~;qF1Q6AXa8IM#zji2eer0hWAFq)qWu{z^ zX66EffAgx!HNZ;NfjLC6?KeM2m4El#`ai7d|7R0P;g4OPk^&B{6VRSmoS)7l1&A`j zdGX5tj?oW@G6MK(IcCHe#DzkC9?Hg6`+~E#z3aA4G+P_z7Q#2~muc)EqaZUg;+-50 zoema~3;rw0Xj&}s90q5WIZnAog18IRecq=c*xAWxVExG6D2c1$8*;&#>~}9-kxDWN zRZCDD#rkBmk;Mo?OR{yt}v>bjFzBRCY zUBhYb4{r;_hNguB2zu?i1NJnqN{c(l&3|;FAsIEf>vWhD3r!{R2h^5>04r~JUkJV2 zcN%7g>vf|}rxHb@m7YYcNVbj?iujn=vwQaLNd72yM99slGJQ*E4lxhYAS55d6;M_t zH@iwct%0Ih&p0QYUya7!mA|}N?0su4B7XTw2f(4R>fjX8m^h|MSb{25b|4TkD?|ij zbIx_j*`>(!=IW+4*yY1Teyxk4>AD{hLBHVam*4ksAshp2O%k9`@N9d5O$ zS?F&w<`89`5t}WX^>#bdH>ZY%1wAF)-`CIc0Qv)2VSc4Ase4gP#k2Ca7gg!&JK`NI z8P-VhL^M=1El1IYv;qV;a@U%-;8+YlxuTWBx4<`Z!7L#F-ddm9O1&ADUZR6T`Y@vW zK*f!&PxYX^B6bXDLtRVslN^_md2>kb&0mO_#7!dAW=0oCA@`+?y?H_y>7dxE4}Roe zdUYWz&#`gNLG=*x%^)3cNf%x3fTXhA^mf;Esl3Zt^5XTI4N^r_L;q=ugON)-BQ7k& z*&yb4+!B0s(t~V~`p}=<;$(VJmN6{?U*k*2aC-Zs!h17cnd^Qvij>f^$y|#6iDGnB zEQU6VB8a%{2E%|S9ZQ;xm$jnK&wZ%7Nz8RzQbJRaLFJ?2o*qtz-$D{ths+>s%1qz1 zuKy|1tG(O}WDYWCPRy!3&mzpHOf8_K^qR_#NY=-cZv2hq3$oK#71q{{v;>E)=D zFmltdX6k)CTACSQ-O65`zM=>mz&L|o%LaIp1{zJ&7>Ks}f}`I$x9e1lHR*yYq15R| zM}+nC#Kl9&$olkeA$&2(ZN=-ONr`>WUV{-kbN_fhGk3cJ)x_*A)Ye#8Hd1}8b=GW9 zTzRB=+XD!tPP(0{pO|l8L~tBz+%}q@U9=neaFbJ33R9m;8eLrT!Fk@5@I*DW=M;8uzvlV~?^MQWD5-!jI{b3 zvZ6|9P5lGfQ7H$)?eYKC27&`+I79G+g8`V){40ESm$mFNa)O~*YmY`2s9evf$X4ywFy4mgMS>O{9 z7*i}MI3`0auMP{$g;+m}xz(U$$Tv|40w1-BaM(M%+B7DBo}~-qlWK^?tFsp}(>t1{ znoG?qz+71lUh$71{1BHV^)MRtf4SKFpUpe9O55r74)7+(h5N)}^K{}V<$0-DMHJUP zK=me#=V47Y4Ph_jDRIZstp(v6b2+-%;Y+?3%?wOtiU1D-XYe3qY<<+oP*tuN=25T) z``CJ0IwNT}(^zb|R}oh19aP|)Jwfp0%6j+UWuv3Z`pj7(x16kYF2S$NQzEfjdcQMI z5$9-$T=srRX~1yST^iGWrO|^4t*yY^OuiAXvjOGJ=oO#6uiKdEPZgl^f`6IzBbJtU z$C7_C|Cbn`ULg#xDEXN<(|GNM$bM0GJ4xh2zwCDcp9y>Fp4r5{6k&5Vz7#3n@c!tI z#Z?<8(&PF93f!^*ka(&-^H1Wb{Bin^ep$_(;4EhOdfqXke&}|iNP#TuZPqrh>$17& z$pgS|!3k;gr1dw6y(v;--?5wi(086{YW;xX4JX>8j!RYKD-x?)2P_pp7-r^mF?-C| z*h4O=%+E_YB_0vV(k6&`!;~#Wqa4n|;bl`4QadH6*yTJU7<+)XRAYivlZ_jXRBaLgg!0s zzS0qE&jSgs+=_*R zi<8ISRAwP0^tjSv`6B@;T;~;04#On+%GBErRPErG18^BrDA-t70X_pR5WliceNJuO z;?QnFjDAi5*L@w0?pNUHv;xRF)$*m^dsSGJ6ucGm8Y%7?oJ{6WFBfXLzXRc1QLpuf zQGgArokEvB_y8%(vI3Qj*-q~~j<+?`q)Ymo6w4NZj;%Zsf{Op}cM?fJBN+_XA-~B zY$JT>=t=iEnW3>dE#`Kw7&+GoY66`?rHd+JnZ##vS)c}$O~-ClO0q>us%FcaTicoN z!=b}xcf@uphel!;no6QcZB_~1slU**u9vxKPKY-rXN~Xi$NPTXujQ1hTu@sPE9bma z_ufMHJA7wW{D!gP-WBT{P)gZVt!nMs!nA>rN#tC=HPJIrALQpd^BZWnr~atx&9Rm@ z++Gubm(f&ebgCP?fwr*`UL6KrJQ7QmCX#&VtwoNmSrLfROdC9-h5gl)Nli*|%xqrX z-|?p_lx+J+fX zq}>TV!#ysfHDoO3QeB36Q8u zYtTSce8U|SBdw5S=NCqnh8Jcz@K@l)7|vf~_vhcypk1xiu|~dG%)4>#`Qgn< z@Beaz{y&?>i7~f!+ZXUUm~R6pE%PrMu9b$Sk&c{|y^)S3ot?1}Fc6>u_k*vU1QpXb zVL)EUD{6#2IXdPhgz=oJz|s*DrA^(dpaTSA^AaHP0>zuX-gfii&2$?_Uvn-YrZ(Lr zkEV5IJ@E7W1H(wsv%36HqNMH_M}x-`06DklET*}kIaVx_;ynE z<)2K~P;jNg^R!t|!?CfzhTehPfh}j2me3spuZN_P zxR#4$ttz0<$>*tzW+4$l7+k~A(U8k1M9)^Dqdr=?f7}N?_)L@4jwad-IuT~TXy3?9 z7aK;BcZJA5TTtI9u> z%55$_KYju;5H2$ZKgvwXh3-qaT%s-xHTX%#tV;-mA+>+^0LN};5gwCr4(!y6V1V_hP$`ItcHX4 zvrZ5u8g}$#jpk_rI8LNF-jW~ikUH=hK3BW47FMZe(^8gJSGg?60U*n+1_Dwc8<`sd z`PQr@Xk6&R`Okt+PG5l!g8wKfSqciO5Ff8BvDVJF{y51dWZiE|sYzmnXzuHc({GKS zo7f5hqlE>AK6ldp0;e@beH4NnU0mw98BKB`-qL$F3H&9a5D9$ZX50dv?+nz%&y|+C zVj7(lFh+KI*J4dobQn^=32$0_3SLBd?|d-MN3`cBv;ce`mZ841o_FpB{!y2Lu%H98 z*VW+OudyLsG8%-ikRez|q(bRQPQ*o6cZ7;p);)~4@M&5!K=n;$p|_FhBto;UTed#C zu!4lqroj@z_YWptL!);Xn!&Nn=%N8XXp(>Z)&%&$+65l>WoaP!Dn-hvl}*w)g>Fmj zHR8&EIB};ZFQ>SaZ_oyN(5sh(4pq3B`!EM2 zE!m>SCoN3_-LRm|4ZD;Y_cKnhzpT)Wk`6<9j`)EYk@1Be#aB#OI1g~(BPX=zl^pn$ zuZfMHQ41XNZ5(7o`oCnI9f^(`aLz|z4>+u-5C`zzV4=GQ@Y5xtGmiUv4K}hGIqVRa zhQDqfhgmGz1 ziZ4AHn%=U#ec+Q@RZnLw0H}S*1qj9bHJPjMo0?eZm{@&~w>Q(VRDEhP?~j=`Sz$o% z+PgxLF`-7{QxR3-shHVS+mXt!!EcfvYo0%U^EGAvloQ@KBGr=zc$$r1_T{=0X543# zj!H2_a2V-WXl|&mY<%!0xi2zm;w_EAuN~6%0SRwh-ir(YtM#6c#A6aSwv|ZgHTed4 zf(21mO9x=!cUevLAER+oEb(U810cl8p^Ba@W|FU>wS~cqm7hS%t(}qkGYrAEFO~ zC)u6wS{P-<+Un`-GeU0-wlY%16$;S7{-~rH1AkM**YB8>U_T!=y4}GI2D%Q0J^)3R zfc*X?IR*!Lm5n5Wg{0YPJi$io8?!}JVkRs48eDZt)Q2g|O@YMF2} z!$({Rj|uLTcFk#s{x`zWKp$~(he$lgH7#-}C!@8`!S!4RB{Af5we~v&ElX9Vs4JU; zZX46C(qh0M+<+km1Oy4B8cwKE=wZM%1Ng)P7>+OxHV;5Re=0WoHkv=m`qyeQX!SR58U&}v#e+AIm%*=}3%tFT!@I+}?>6@B7Mv&I$+xh?y$^f`%fLq+1 zFFU|F$S=a5Yk$ajv@b;8Hl_3e5Ve2x1qI|ka(;KnV_MoSE#O)K%@hA>&IRlo;I+2;Xln6$ulVqGY)9e|K?9=g8YF;# z2=5SpfVcr2^s765J5l_*GU%NTzYQ=CamJ252^au5WB>s)_i%AYkKpbU2Kn}D^!Mx9 zL)_CsLnt4?{U!9Dcff~aq?~Mh8NjWt2Mo*mJsL~(2>FiC--!?(;+_`DP4@`yFQNZr zSA0nJWE}yG0L*0jfRTP*s4)E_LGc`3oaiNaO-v8 z9t!1PeuR8S=k@Tes=VqWyuYPBy++xbdz%siq_zX5|NBxus6B$dEA_uFQun1!s6WE{Tk6xR)cs2L zcOThhjX&r+<+v^B?|gXlsk&d{`!0@6=Mmf=r4ONxKL7X2X5S^h()~lev%7utF}hz7 z^)4aZ=uR)*t&jR}e!F|rPH>k1#Ab01apx91Jx|;(h<6vqYI%?Ldw@K8O-~E5w!4S8 zBk1Yb;C_vzyMnCj@6mn>dUOJKT2PnUJ;WVBPe1ebD>U2{)cNTi?YE#uAM^X!yze3w zeC{Fc2zvU-zMtRvE)DDRJ=$+Uk3P)zv#Q=jtOwmg+!6Hj^LszT=v^9R$UWL`L67b% z?`Ms>i-?ZAhqxo?>D}c0Txxe|Ls9o=zXd(IgM4}nxh32~+!6HjuJL}hoV$Wt6YtS} z3wm^?__UzTjC+VXf}Y+T-jBP#E2ty$9__cFM|Xtx!#(dJLIE$_|MUKPFUsTTUEuv7 z$h)+jf_t>zf*#-b-H$Z6%g8Ce$GFo)|6#XxKmOt_Zl&TL?vJEL*P^?3?f&b6Yu!D@ zT}e;R*7vAz0b_a$w&++*C8^z?jv-#6*5r0v#wxIdEq>x6w@Qc%x5 z#$8EI&)D~kv3Df}0geHGA41(X%|2XW?;8N_0#t^99y13>i#-Dz1pomF1HLO!fq=e^ I{`&O)0G=%{;{X5v literal 0 HcmV?d00001 diff --git a/src/class177/Code08_CandyPark1.java b/src/class177/Code08_CandyPark1.java index 8472c1809..89d13f2ee 100644 --- a/src/class177/Code08_CandyPark1.java +++ b/src/class177/Code08_CandyPark1.java @@ -177,16 +177,22 @@ public static void invert(int node) { vis[node] = !vis[node]; } + // 上节课带修莫队的重要过程 + // tim为生效或者撤销的修改时间点,公园更换糖果 public static void moveTime(int tim) { int pos = update[tim][0]; int oldVal = c[pos]; int newVal = update[tim][1]; - if (vis[pos]) { + if (vis[pos]) { // 如果当前公园生效中 + // 老糖果invert效果 invert(pos); + // 新老糖果换位 c[pos] = newVal; update[tim][1] = oldVal; + // 新糖果invert效果 invert(pos); - } else { + } else { // 如果当前公园不在生效中 + // 新老糖果换位即可 c[pos] = newVal; update[tim][1] = oldVal; } From a7c7ab678bdf662956110606330a2ed343ad4a50 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Sep 2025 15:43:32 +0800 Subject: [PATCH 0664/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 203 +++++++++++++++++++++++ src/class178/Code01_MoOfflineTwice2.java | 151 +++++++++++++++++ 2 files changed, 354 insertions(+) create mode 100644 src/class178/Code01_MoOfflineTwice1.java create mode 100644 src/class178/Code01_MoOfflineTwice2.java diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java new file mode 100644 index 000000000..20147eb63 --- /dev/null +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -0,0 +1,203 @@ +package class178; + +// 莫队二次离线入门题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4887 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code01_MoOfflineTwice2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code01_MoOfflineTwice1 { + + public static int MAXN = 100001; + public static int MAXQ = 200001; + public static int MAXV = 1 << 14; + public static int n, m, k; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + + public static int[] kOneArr = new int[MAXV]; + public static int cntk; + + public static int[] bi = new int[MAXN]; + public static int[] pre = new int[MAXN]; + public static int[] cnt = new int[MAXV]; + + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXQ]; + public static int[] qid = new int[MAXQ]; + public static int[] ql = new int[MAXQ]; + public static int[] qr = new int[MAXQ]; + public static int[] qop = new int[MAXQ]; + public static int cntq; + + public static long[] ans = new long[MAXN]; + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return a[1] - b[1]; + } + } + + public static int countOne(int num) { + int ret = 0; + while (num > 0) { + ret++; + num -= num & -num; + } + return ret; + } + + public static void addQuery(int pos, int id, int l, int r, int op) { + next[++cntq] = head[pos]; + qid[cntq] = id; + ql[cntq] = l; + qr[cntq] = r; + qop[cntq] = op; + head[pos] = cntq; + } + + public static void prepare() { + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + for (int v = 0; v < MAXV; v++) { + if (countOne(v) == k) { + kOneArr[++cntk] = v; + } + } + } + + public static void compute() { + for (int i = 1; i <= n; i++) { + pre[i] = cnt[arr[i]]; + for (int j = 1; j <= cntk; j++) { + cnt[arr[i] ^ kOneArr[j]]++; + } + } + // 莫队 + int winl = 1, winr = 0; + int kIs0 = (k == 0 ? 1 : 0); + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; + if (winr < jobr) { + addQuery(winl - 1, id, winr + 1, jobr, -1); + } + while (winr < jobr) { + ans[id] += pre[++winr]; + } + if (winr > jobr) { + addQuery(winl - 1, id, jobr + 1, winr, 1); + } + while (winr > jobr) { + ans[id] -= pre[winr--]; + } + if (winl > jobl) { + addQuery(winr, id, jobl, winl - 1, 1); + } + while (winl > jobl) { + ans[id] -= pre[--winl] + kIs0; + } + if (winl < jobl) { + addQuery(winr, id, winl, jobl - 1, -1); + } + while (winl < jobl) { + ans[id] += pre[winl++] + kIs0; + } + } + // 第二次离线 + Arrays.fill(cnt, 0); + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= cntk; j++) { + cnt[arr[i] ^ kOneArr[j]]++; + } + for (int q = head[i]; q > 0; q = next[q]) { + int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + for (int x = l; x <= r; x++) { + ans[id] += (long) op * cnt[arr[x]]; + } + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + k = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 2; i <= m; i++) { + ans[query[i][2]] += ans[query[i - 1][2]]; + } + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java new file mode 100644 index 000000000..e4c6ed9b2 --- /dev/null +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -0,0 +1,151 @@ +package class178; + +// 莫队二次离线入门题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4887 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 100001; +//const int MAXQ = 200001; +//const int MAXV = 1 << 14; +// +//int n, m, k; +//int arr[MAXN]; +//Query query[MAXN]; +// +//int kOneArr[MAXV]; +//int cntk; +// +//int bi[MAXN]; +//int pre[MAXN]; +//int cnt[MAXV]; +// +//int head[MAXN]; +//int nxt[MAXQ]; +//int qid[MAXQ]; +//int ql[MAXQ]; +//int qr[MAXQ]; +//int qop[MAXQ]; +//int cntq; +// +//long long ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return a.r < b.r; +//} +// +//int countOne(int num) { +// int ret = 0; +// while (num > 0) { +// ret++; +// num -= num & -num; +// } +// return ret; +//} +// +//void addQuery(int pos, int id, int l, int r, int op) { +// nxt[++cntq] = head[pos]; +// qid[cntq] = id; +// ql[cntq] = l; +// qr[cntq] = r; +// qop[cntq] = op; +// head[pos] = cntq; +//} +// +//void prepare() { +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + m + 1, QueryCmp); +// for (int v = 0; v < MAXV; v++) { +// if (countOne(v) == k) { +// kOneArr[++cntk] = v; +// } +// } +//} +// +//void compute() { +// for (int i = 1; i <= n; i++) { +// pre[i] = cnt[arr[i]]; +// for (int j = 1; j <= cntk; j++) { +// cnt[arr[i] ^ kOneArr[j]]++; +// } +// } +// int winl = 1, winr = 0; +// int kIs0 = (k == 0 ? 1 : 0); +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; +// if (winr < jobr) { +// addQuery(winl - 1, id, winr + 1, jobr, -1); +// } +// while (winr < jobr) { +// ans[id] += pre[++winr]; +// } +// if (winr > jobr) { +// addQuery(winl - 1, id, jobr + 1, winr, 1); +// } +// while (winr > jobr) { +// ans[id] -= pre[winr--]; +// } +// if (winl > jobl) { +// addQuery(winr, id, jobl, winl - 1, 1); +// } +// while (winl > jobl) { +// ans[id] -= pre[--winl] + kIs0; +// } +// if (winl < jobl) { +// addQuery(winr, id, winl, jobl - 1, -1); +// } +// while (winl < jobl) { +// ans[id] += pre[winl++] + kIs0; +// } +// } +// memset(cnt, 0, sizeof(cnt)); +// for (int i = 1; i <= n; i++) { +// for (int j = 1; j <= cntk; j++) { +// cnt[arr[i] ^ kOneArr[j]]++; +// } +// for (int q = head[i]; q > 0; q = nxt[q]) { +// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// for (int x = l; x <= r; x++) { +// ans[id] += 1LL * op * cnt[arr[x]]; +// } +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> k; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 2; i <= m; i++) { +// ans[query[i].id] += ans[query[i - 1].id]; +// } +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 690337b36d8ad0ed36e9248f5a3442e546df5aae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Sep 2025 18:52:17 +0800 Subject: [PATCH 0665/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 6 +++--- src/class178/Code01_MoOfflineTwice2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 20147eb63..f8b8051a7 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -90,7 +90,7 @@ public static void compute() { } // 莫队 int winl = 1, winr = 0; - int kIs0 = (k == 0 ? 1 : 0); + int k0 = (k == 0 ? 1 : 0); for (int i = 1; i <= m; i++) { int jobl = query[i][0]; int jobr = query[i][1]; @@ -111,13 +111,13 @@ public static void compute() { addQuery(winr, id, jobl, winl - 1, 1); } while (winl > jobl) { - ans[id] -= pre[--winl] + kIs0; + ans[id] -= pre[--winl] + k0; } if (winl < jobl) { addQuery(winr, id, winl, jobl - 1, -1); } while (winl < jobl) { - ans[id] += pre[winl++] + kIs0; + ans[id] += pre[winl++] + k0; } } // 第二次离线 diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index e4c6ed9b2..bd3999f17 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -84,7 +84,7 @@ // } // } // int winl = 1, winr = 0; -// int kIs0 = (k == 0 ? 1 : 0); +// int k0 = (k == 0 ? 1 : 0); // for (int i = 1; i <= m; i++) { // int jobl = query[i].l; // int jobr = query[i].r; @@ -105,13 +105,13 @@ // addQuery(winr, id, jobl, winl - 1, 1); // } // while (winl > jobl) { -// ans[id] -= pre[--winl] + kIs0; +// ans[id] -= pre[--winl] + k0; // } // if (winl < jobl) { // addQuery(winr, id, winl, jobl - 1, -1); // } // while (winl < jobl) { -// ans[id] += pre[winl++] + kIs0; +// ans[id] += pre[winl++] + k0; // } // } // memset(cnt, 0, sizeof(cnt)); From e005870b03811e77ed153b0d5557f1889dea96a5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Sep 2025 22:09:14 +0800 Subject: [PATCH 0666/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 13 ++++++++----- src/class178/Code01_MoOfflineTwice2.java | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index f8b8051a7..335d89c8d 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -90,7 +90,6 @@ public static void compute() { } // 莫队 int winl = 1, winr = 0; - int k0 = (k == 0 ? 1 : 0); for (int i = 1; i <= m; i++) { int jobl = query[i][0]; int jobr = query[i][1]; @@ -111,13 +110,13 @@ public static void compute() { addQuery(winr, id, jobl, winl - 1, 1); } while (winl > jobl) { - ans[id] -= pre[--winl] + k0; + ans[id] -= pre[--winl]; } if (winl < jobl) { addQuery(winr, id, winl, jobl - 1, -1); } while (winl < jobl) { - ans[id] += pre[winl++] + k0; + ans[id] += pre[winl++]; } } // 第二次离线 @@ -128,8 +127,12 @@ public static void compute() { } for (int q = head[i]; q > 0; q = next[q]) { int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; - for (int x = l; x <= r; x++) { - ans[id] += (long) op * cnt[arr[x]]; + for (int j = l; j <= r; j++) { + if (j <= i && k == 0) { + ans[id] += (long) op * (cnt[arr[j]] - 1); + } else { + ans[id] += (long) op * cnt[arr[j]]; + } } } } diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index bd3999f17..f32c89dee 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -84,7 +84,6 @@ // } // } // int winl = 1, winr = 0; -// int k0 = (k == 0 ? 1 : 0); // for (int i = 1; i <= m; i++) { // int jobl = query[i].l; // int jobr = query[i].r; @@ -105,13 +104,13 @@ // addQuery(winr, id, jobl, winl - 1, 1); // } // while (winl > jobl) { -// ans[id] -= pre[--winl] + k0; +// ans[id] -= pre[--winl]; // } // if (winl < jobl) { // addQuery(winr, id, winl, jobl - 1, -1); // } // while (winl < jobl) { -// ans[id] += pre[winl++] + k0; +// ans[id] += pre[winl++]; // } // } // memset(cnt, 0, sizeof(cnt)); @@ -121,8 +120,12 @@ // } // for (int q = head[i]; q > 0; q = nxt[q]) { // int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; -// for (int x = l; x <= r; x++) { -// ans[id] += 1LL * op * cnt[arr[x]]; +// for (int j = l; j <= r; j++) { +// if (j <= i && k == 0) { +// ans[id] += 1LL * op * (cnt[arr[j]] - 1); +// } else { +// ans[id] += 1LL * op * cnt[arr[j]]; +// } // } // } // } From 2e2ab888163da0afe1ff00c0a686c5a1e4c55fae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Sep 2025 22:39:03 +0800 Subject: [PATCH 0667/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 335d89c8d..bd62a1c6e 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -128,9 +128,17 @@ public static void compute() { for (int q = head[i]; q > 0; q = next[q]) { int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; for (int j = l; j <= r; j++) { + // 计算j 对 1..i范围的贡献 + // 此时1..i范围上的数字都更新过cnt if (j <= i && k == 0) { + // j在1..i范围上,此时又有k==0 + // 那么arr[j]一定更新过cnt,并且(arr[j], arr[j])一定算进贡献了 + // 但是题目要求的二元组必须是不同位置,所以贡献要进行减1修正 ans[id] += (long) op * (cnt[arr[j]] - 1); } else { + // 要么j不在1..i范围上,arr[j]没更新过cnt + // 要么k!=0,(arr[j], arr[j])无法被算成贡献 + // 无论哪种情况,贡献都是正确的,不用进行减1修正 ans[id] += (long) op * cnt[arr[j]]; } } From 91a021ad175b9264fb598e21c179b6e442e70978 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Sep 2025 22:56:04 +0800 Subject: [PATCH 0668/1170] modify code --- src/class178/Code01_MoOfflineTwice2.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index f32c89dee..de444c9fc 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -16,7 +16,6 @@ //const int MAXN = 100001; //const int MAXQ = 200001; //const int MAXV = 1 << 14; -// //int n, m, k; //int arr[MAXN]; //Query query[MAXN]; From ba55ea61d3931d768dffca964d09f4917412bd88 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 5 Sep 2025 22:46:12 +0800 Subject: [PATCH 0669/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 304 +++++++++++++++++++++ src/class178/Code02_OfflineInversion2.java | 245 +++++++++++++++++ 2 files changed, 549 insertions(+) create mode 100644 src/class178/Code02_OfflineInversion1.java create mode 100644 src/class178/Code02_OfflineInversion2.java diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java new file mode 100644 index 000000000..f681da41a --- /dev/null +++ b/src/class178/Code02_OfflineInversion1.java @@ -0,0 +1,304 @@ +package class178; + +// 离线查询逆序对,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5047 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code02_OfflineInversion2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code02_OfflineInversion1 { + + public static int MAXN = 100002; + public static int MAXQ = 200001; + public static int MAXB = 401; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + + // 值的离散化 + public static int[] sorted = new int[MAXN]; + public static int cntv; + + // bi用于序列分块 + 值域分块 + // bl和br用于值域分块 + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; + + // 前后缀信息 + public static long[] pre = new long[MAXN]; + public static long[] suf = new long[MAXN]; + + // 树状数组 + public static int[] tree = new int[MAXN]; + + // 每种值加了多少词频 + public static long[] cnt = new long[MAXN]; + // 块的懒信息,整块加了多少词频 + public static long[] lazy = new long[MAXB]; + + // 链式前向星,二次离线的任务列表 + public static int[] headl = new int[MAXN]; + public static int[] headr = new int[MAXN]; + public static int[] next = new int[MAXQ]; + public static int[] qid = new int[MAXQ]; + public static int[] ql = new int[MAXQ]; + public static int[] qr = new int[MAXQ]; + public static int[] qop = new int[MAXQ]; + public static int cntq; + + public static long[] ans = new long[MAXN]; + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return a[1] - b[1]; + } + } + + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= cntv) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static void clear() { + Arrays.fill(tree, 1, cntv + 1, 0); + } + + public static void addLeftQuery(int pos, int id, int l, int r, int op) { + next[++cntq] = headl[pos]; + qid[cntq] = id; + ql[cntq] = l; + qr[cntq] = r; + qop[cntq] = op; + headl[pos] = cntq; + } + + public static void addRightQuery(int pos, int id, int l, int r, int op) { + next[++cntq] = headr[pos]; + qid[cntq] = id; + ql[cntq] = l; + qr[cntq] = r; + qop[cntq] = op; + headr[pos] = cntq; + } + + public static void addLeftCnt(int val) { + if (val <= 0) { + return; + } + for (int i = bl[bi[val]]; i <= val; i++) { + cnt[i]++; + } + for (int b = 1; b <= bi[val] - 1; b++) { + lazy[b]++; + } + } + + public static void addRightCnt(int val) { + if (val > cntv) { + return; + } + for (int i = val; i <= br[bi[val]]; i++) { + cnt[i]++; + } + for (int b = bi[val] + 1; b <= bi[cntv]; b++) { + lazy[b]++; + } + } + + public static long getCnt(int val) { + return cnt[val] + lazy[bi[val]]; + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + cntv = 1; + for (int i = 2; i <= n; i++) { + if (sorted[cntv] != sorted[i]) { + sorted[++cntv] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = kth(arr[i]); + } + int blen = (int) Math.sqrt(n); + int bnum = (n + blen - 1) / blen; + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, cntv); + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void compute() { + for (int i = 1; i <= n; i++) { + pre[i] = pre[i - 1] + sum(cntv) - sum(arr[i]); + add(arr[i], 1); + } + clear(); + for (int i = n; i >= 1; i--) { + suf[i] = suf[i + 1] + sum(arr[i] - 1); + add(arr[i], 1); + } + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; + if (winr < jobr) { + addLeftQuery(winl - 1, id, winr + 1, jobr, -1); + ans[id] += pre[jobr] - pre[winr]; + } + if (winr > jobr) { + addLeftQuery(winl - 1, id, jobr + 1, winr, 1); + ans[id] -= pre[winr] - pre[jobr]; + } + if (winl > jobl) { + addRightQuery(jobr + 1, id, jobl, winl - 1, -1); + ans[id] += suf[jobl] - suf[winl]; + } + if (winl < jobl) { + addRightQuery(jobr + 1, id, winl, jobl - 1, 1); + ans[id] -= suf[winl] - suf[jobl]; + } + winl = jobl; + winr = jobr; + } + for (int i = 1; i <= n; i++) { + addLeftCnt(arr[i] - 1); + for (int q = headl[i]; q > 0; q = next[q]) { + int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + long ret = 0; + for (int j = l; j <= r; j++) { + ret += getCnt(arr[j]); + } + ans[id] += ret * op; + } + } + Arrays.fill(lazy, 0); + Arrays.fill(cnt, 0); + for (int i = n; i >= 1; i--) { + addRightCnt(arr[i] + 1); + for (int q = headr[i]; q > 0; q = next[q]) { + int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + long ret = 0; + for (int j = l; j <= r; j++) { + ret += getCnt(arr[j]); + } + ans[id] += ret * op; + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 2; i <= m; i++) { + ans[query[i][2]] += ans[query[i - 1][2]]; + } + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java new file mode 100644 index 000000000..dad32ae4c --- /dev/null +++ b/src/class178/Code02_OfflineInversion2.java @@ -0,0 +1,245 @@ +package class178; + +// 离线查询逆序对,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5047 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 100002; +//const int MAXQ = 200001; +//const int MAXB = 401; +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +// +//int sorted[MAXN]; +//int cntv; +// +//int bi[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; +// +//long long pre[MAXN]; +//long long suf[MAXN]; +// +//int tree[MAXN]; +//long long cnt[MAXN]; +//long long lazy[MAXB]; +// +//int headl[MAXN]; +//int headr[MAXN]; +//int nxt[MAXQ]; +//int qid[MAXQ]; +//int ql[MAXQ]; +//int qr[MAXQ]; +//int qop[MAXQ]; +//int cntq; +// +//long long ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return a.r < b.r; +//} +// +//int kth(int num) { +// int left = 1, right = cntv, ret = 0; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= cntv) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void clear() { +// fill(tree + 1, tree + cntv + 1, 0); +//} +// +//void addLeftQuery(int pos, int id, int l, int r, int op) { +// nxt[++cntq] = headl[pos]; +// qid[cntq] = id; +// ql[cntq] = l; +// qr[cntq] = r; +// qop[cntq] = op; +// headl[pos] = cntq; +//} +// +//void addRightQuery(int pos, int id, int l, int r, int op) { +// nxt[++cntq] = headr[pos]; +// qid[cntq] = id; +// ql[cntq] = l; +// qr[cntq] = r; +// qop[cntq] = op; +// headr[pos] = cntq; +//} +// +//void addLeftCnt(int val) { +// if (val <= 0) { +// return; +// } +// for (int i = bl[bi[val]]; i <= val; i++) { +// cnt[i]++; +// } +// for (int b = 1; b <= bi[val] - 1; b++) { +// lazy[b]++; +// } +//} +// +//void addRightCnt(int val) { +// if (val > cntv) { +// return; +// } +// for (int i = val; i <= br[bi[val]]; i++) { +// cnt[i]++; +// } +// for (int b = bi[val] + 1; b <= bi[cntv]; b++) { +// lazy[b]++; +// } +//} +// +//long long getCnt(int val) { +// return cnt[val] + lazy[bi[val]]; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = arr[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// cntv = 1; +// for (int i = 2; i <= n; i++) { +// if (sorted[cntv] != sorted[i]) { +// sorted[++cntv] = sorted[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(arr[i]); +// } +// int blen = (int)sqrt(n); +// int bnum = (n + blen - 1) / blen; +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, cntv); +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//void compute() { +// for (int i = 1; i <= n; i++) { +// pre[i] = pre[i - 1] + sum(cntv) - sum(arr[i]); +// add(arr[i], 1); +// } +// clear(); +// for (int i = n; i >= 1; i--) { +// suf[i] = suf[i + 1] + sum(arr[i] - 1); +// add(arr[i], 1); +// } +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; +// if (winr < jobr) { +// addLeftQuery(winl - 1, id, winr + 1, jobr, -1); +// ans[id] += pre[jobr] - pre[winr]; +// } +// if (winr > jobr) { +// addLeftQuery(winl - 1, id, jobr + 1, winr, 1); +// ans[id] -= pre[winr] - pre[jobr]; +// } +// if (winl > jobl) { +// addRightQuery(jobr + 1, id, jobl, winl - 1, -1); +// ans[id] += suf[jobl] - suf[winl]; +// } +// if (winl < jobl) { +// addRightQuery(jobr + 1, id, winl, jobl - 1, 1); +// ans[id] -= suf[winl] - suf[jobl]; +// } +// winl = jobl; +// winr = jobr; +// } +// for (int i = 1; i <= n; i++) { +// addLeftCnt(arr[i] - 1); +// for (int q = headl[i]; q > 0; q = nxt[q]) { +// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// long long ret = 0; +// for (int j = l; j <= r; j++) { +// ret += getCnt(arr[j]); +// } +// ans[id] += ret * op; +// } +// } +// memset(cnt, 0, sizeof(cnt)); +// memset(lazy, 0, sizeof(lazy)); +// for (int i = n; i >= 1; i--) { +// addRightCnt(arr[i] + 1); +// for (int q = headr[i]; q > 0; q = nxt[q]) { +// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// long long ret = 0; +// for (int j = l; j <= r; j++) { +// ret += getCnt(arr[j]); +// } +// ans[id] += ret * op; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 2; i <= m; i++) { +// ans[query[i].id] += ans[query[i - 1].id]; +// } +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From df89de3b1d180a90e044d78ac16ec6103e060361 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 5 Sep 2025 22:49:04 +0800 Subject: [PATCH 0670/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index f681da41a..465a626f1 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -23,12 +23,11 @@ public class Code02_OfflineInversion1 { public static int[] arr = new int[MAXN]; public static int[][] query = new int[MAXN][3]; - // 值的离散化 + // 离散化 public static int[] sorted = new int[MAXN]; public static int cntv; - // bi用于序列分块 + 值域分块 - // bl和br用于值域分块 + // bi用于序列分块、值域分块,bl和br用于值域分块 public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; From 3ba99ccfc657af05d2c41635f80cbec2ed2251ba Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 6 Sep 2025 09:44:34 +0800 Subject: [PATCH 0671/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 8 ++++---- src/class178/Code02_OfflineInversion2.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 465a626f1..74fd2bcf2 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -32,12 +32,12 @@ public class Code02_OfflineInversion1 { public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; - // 前后缀信息 - public static long[] pre = new long[MAXN]; - public static long[] suf = new long[MAXN]; - // 树状数组 public static int[] tree = new int[MAXN]; + // 前缀信息 + public static long[] pre = new long[MAXN]; + // 后缀信息 + public static long[] suf = new long[MAXN]; // 每种值加了多少词频 public static long[] cnt = new long[MAXN]; diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index dad32ae4c..55e931257 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -27,10 +27,10 @@ //int bl[MAXB]; //int br[MAXB]; // +//int tree[MAXN]; //long long pre[MAXN]; //long long suf[MAXN]; // -//int tree[MAXN]; //long long cnt[MAXN]; //long long lazy[MAXB]; // From 8ab57655c6332231c881141e31c5b05c5d9158c8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 6 Sep 2025 22:30:43 +0800 Subject: [PATCH 0672/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 78 +++++++++---------- src/class178/Code01_MoOfflineTwice2.java | 67 ++++++++-------- src/class178/Code02_OfflineInversion1.java | 90 +++++++++++---------- src/class178/Code02_OfflineInversion2.java | 91 ++++++++++++---------- 4 files changed, 167 insertions(+), 159 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index bd62a1c6e..87190723c 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -17,30 +17,25 @@ public class Code01_MoOfflineTwice1 { public static int MAXN = 100001; - public static int MAXQ = 200001; public static int MAXV = 1 << 14; public static int n, m, k; public static int[] arr = new int[MAXN]; - public static int[][] query = new int[MAXN][3]; - public static int[] kOneArr = new int[MAXV]; public static int cntk; + // 第一次离线任务,l、r、id + // 第二次离线任务,pos、id、l、r、op + public static int[][] query1 = new int[MAXN][3]; + public static int[][] query2 = new int[MAXN << 1][5]; + public static int cntq; + public static int[] bi = new int[MAXN]; public static int[] pre = new int[MAXN]; public static int[] cnt = new int[MAXV]; - public static int[] head = new int[MAXN]; - public static int[] next = new int[MAXQ]; - public static int[] qid = new int[MAXQ]; - public static int[] ql = new int[MAXQ]; - public static int[] qr = new int[MAXQ]; - public static int[] qop = new int[MAXQ]; - public static int cntq; - public static long[] ans = new long[MAXN]; - public static class QueryCmp implements Comparator { + public static class Cmp1 implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { @@ -50,6 +45,13 @@ public int compare(int[] a, int[] b) { } } + public static class Cmp2 implements Comparator { + @Override + public int compare(int[] a, int[] b) { + return a[0] - b[0]; + } + } + public static int countOne(int num) { int ret = 0; while (num > 0) { @@ -60,12 +62,11 @@ public static int countOne(int num) { } public static void addQuery(int pos, int id, int l, int r, int op) { - next[++cntq] = head[pos]; - qid[cntq] = id; - ql[cntq] = l; - qr[cntq] = r; - qop[cntq] = op; - head[pos] = cntq; + query2[++cntq][0] = pos; + query2[cntq][1] = id; + query2[cntq][2] = l; + query2[cntq][3] = r; + query2[cntq][4] = op; } public static void prepare() { @@ -73,7 +74,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - Arrays.sort(query, 1, m + 1, new QueryCmp()); + Arrays.sort(query1, 1, m + 1, new Cmp1()); for (int v = 0; v < MAXV; v++) { if (countOne(v) == k) { kOneArr[++cntk] = v; @@ -88,12 +89,12 @@ public static void compute() { cnt[arr[i] ^ kOneArr[j]]++; } } - // 莫队 + // 第一次离线 int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { - int jobl = query[i][0]; - int jobr = query[i][1]; - int id = query[i][2]; + int jobl = query1[i][0]; + int jobr = query1[i][1]; + int id = query1[i][2]; if (winr < jobr) { addQuery(winl - 1, id, winr + 1, jobr, -1); } @@ -121,24 +122,19 @@ public static void compute() { } // 第二次离线 Arrays.fill(cnt, 0); - for (int i = 1; i <= n; i++) { - for (int j = 1; j <= cntk; j++) { - cnt[arr[i] ^ kOneArr[j]]++; + Arrays.sort(query2, 1, cntq + 1, new Cmp2()); + for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { + if (pos >= 1) { + for (int j = 1; j <= cntk; j++) { + cnt[arr[pos] ^ kOneArr[j]]++; + } } - for (int q = head[i]; q > 0; q = next[q]) { - int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + for (; qi <= cntq && query2[qi][0] == pos; qi++) { + int id = query2[qi][1], l = query2[qi][2], r = query2[qi][3], op = query2[qi][4]; for (int j = l; j <= r; j++) { - // 计算j 对 1..i范围的贡献 - // 此时1..i范围上的数字都更新过cnt - if (j <= i && k == 0) { - // j在1..i范围上,此时又有k==0 - // 那么arr[j]一定更新过cnt,并且(arr[j], arr[j])一定算进贡献了 - // 但是题目要求的二元组必须是不同位置,所以贡献要进行减1修正 + if (j <= pos && k == 0) { ans[id] += (long) op * (cnt[arr[j]] - 1); } else { - // 要么j不在1..i范围上,arr[j]没更新过cnt - // 要么k!=0,(arr[j], arr[j])无法被算成贡献 - // 无论哪种情况,贡献都是正确的,不用进行减1修正 ans[id] += (long) op * cnt[arr[j]]; } } @@ -156,14 +152,14 @@ public static void main(String[] args) throws Exception { arr[i] = in.nextInt(); } for (int i = 1; i <= m; i++) { - query[i][0] = in.nextInt(); - query[i][1] = in.nextInt(); - query[i][2] = i; + query1[i][0] = in.nextInt(); + query1[i][1] = in.nextInt(); + query1[i][2] = i; } prepare(); compute(); for (int i = 2; i <= m; i++) { - ans[query[i][2]] += ans[query[i - 1][2]]; + ans[query1[i][2]] += ans[query1[i - 1][2]]; } for (int i = 1; i <= m; i++) { out.println(ans[i]); diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index de444c9fc..42b42252f 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -9,41 +9,42 @@ // //using namespace std; // -//struct Query { +//struct Query1 { // int l, r, id; //}; // +//struct Query2 { +// int pos, id, l, r, op; +//}; +// //const int MAXN = 100001; -//const int MAXQ = 200001; //const int MAXV = 1 << 14; //int n, m, k; //int arr[MAXN]; -//Query query[MAXN]; -// //int kOneArr[MAXV]; //int cntk; // +//Query1 query1[MAXN]; +//Query2 query2[MAXN << 1]; +//int cntq; +// //int bi[MAXN]; //int pre[MAXN]; //int cnt[MAXV]; // -//int head[MAXN]; -//int nxt[MAXQ]; -//int qid[MAXQ]; -//int ql[MAXQ]; -//int qr[MAXQ]; -//int qop[MAXQ]; -//int cntq; -// //long long ans[MAXN]; // -//bool QueryCmp(Query &a, Query &b) { +//bool Cmp1(Query1 &a, Query1 &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // +//bool Cmp2(Query2 &a, Query2 &b) { +// return a.pos < b.pos; +//} +// //int countOne(int num) { // int ret = 0; // while (num > 0) { @@ -54,12 +55,11 @@ //} // //void addQuery(int pos, int id, int l, int r, int op) { -// nxt[++cntq] = head[pos]; -// qid[cntq] = id; -// ql[cntq] = l; -// qr[cntq] = r; -// qop[cntq] = op; -// head[pos] = cntq; +// query2[++cntq].pos = pos; +// query2[cntq].id = id; +// query2[cntq].l = l; +// query2[cntq].r = r; +// query2[cntq].op = op; //} // //void prepare() { @@ -67,7 +67,7 @@ // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } -// sort(query + 1, query + m + 1, QueryCmp); +// sort(query1 + 1, query1 + m + 1, Cmp1); // for (int v = 0; v < MAXV; v++) { // if (countOne(v) == k) { // kOneArr[++cntk] = v; @@ -84,9 +84,9 @@ // } // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { -// int jobl = query[i].l; -// int jobr = query[i].r; -// int id = query[i].id; +// int jobl = query1[i].l; +// int jobr = query1[i].r; +// int id = query1[i].id; // if (winr < jobr) { // addQuery(winl - 1, id, winr + 1, jobr, -1); // } @@ -113,14 +113,17 @@ // } // } // memset(cnt, 0, sizeof(cnt)); -// for (int i = 1; i <= n; i++) { -// for (int j = 1; j <= cntk; j++) { -// cnt[arr[i] ^ kOneArr[j]]++; +// sort(query2 + 1, query2 + cntq + 1, Cmp2); +// for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { +// if (pos >= 1) { +// for (int j = 1; j <= cntk; j++) { +// cnt[arr[pos] ^ kOneArr[j]]++; +// } // } -// for (int q = head[i]; q > 0; q = nxt[q]) { -// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// for (; qi <= cntq && query2[qi].pos == pos; qi++) { +// int id = query2[qi].id, l = query2[qi].l, r = query2[qi].r, op = query2[qi].op; // for (int j = l; j <= r; j++) { -// if (j <= i && k == 0) { +// if (j <= pos && k == 0) { // ans[id] += 1LL * op * (cnt[arr[j]] - 1); // } else { // ans[id] += 1LL * op * cnt[arr[j]]; @@ -138,13 +141,13 @@ // cin >> arr[i]; // } // for (int i = 1; i <= m; i++) { -// cin >> query[i].l >> query[i].r; -// query[i].id = i; +// cin >> query1[i].l >> query1[i].r; +// query1[i].id = i; // } // prepare(); // compute(); // for (int i = 2; i <= m; i++) { -// ans[query[i].id] += ans[query[i - 1].id]; +// ans[query1[i].id] += ans[query1[i - 1].id]; // } // for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 74fd2bcf2..9abe33ca8 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -17,16 +17,19 @@ public class Code02_OfflineInversion1 { public static int MAXN = 100002; - public static int MAXQ = 200001; public static int MAXB = 401; public static int n, m; public static int[] arr = new int[MAXN]; - public static int[][] query = new int[MAXN][3]; - - // 离散化 public static int[] sorted = new int[MAXN]; public static int cntv; + // 第一次离线任务,l、r、id + // 第二次离线任务,pos、id、l、r、op + public static int[][] query1 = new int[MAXN][3]; + public static int[][] lquery = new int[MAXN][5]; + public static int[][] rquery = new int[MAXN][5]; + public static int cntl, cntr; + // bi用于序列分块、值域分块,bl和br用于值域分块 public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; @@ -44,19 +47,9 @@ public class Code02_OfflineInversion1 { // 块的懒信息,整块加了多少词频 public static long[] lazy = new long[MAXB]; - // 链式前向星,二次离线的任务列表 - public static int[] headl = new int[MAXN]; - public static int[] headr = new int[MAXN]; - public static int[] next = new int[MAXQ]; - public static int[] qid = new int[MAXQ]; - public static int[] ql = new int[MAXQ]; - public static int[] qr = new int[MAXQ]; - public static int[] qop = new int[MAXQ]; - public static int cntq; - public static long[] ans = new long[MAXN]; - public static class QueryCmp implements Comparator { + public static class Cmp1 implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { @@ -66,6 +59,13 @@ public int compare(int[] a, int[] b) { } } + public static class Cmp2 implements Comparator { + @Override + public int compare(int[] a, int[] b) { + return a[0] - b[0]; + } + } + public static int kth(int num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { @@ -105,21 +105,19 @@ public static void clear() { } public static void addLeftQuery(int pos, int id, int l, int r, int op) { - next[++cntq] = headl[pos]; - qid[cntq] = id; - ql[cntq] = l; - qr[cntq] = r; - qop[cntq] = op; - headl[pos] = cntq; + lquery[++cntl][0] = pos; + lquery[cntl][1] = id; + lquery[cntl][2] = l; + lquery[cntl][3] = r; + lquery[cntl][4] = op; } public static void addRightQuery(int pos, int id, int l, int r, int op) { - next[++cntq] = headr[pos]; - qid[cntq] = id; - ql[cntq] = l; - qr[cntq] = r; - qop[cntq] = op; - headr[pos] = cntq; + rquery[++cntr][0] = pos; + rquery[cntr][1] = id; + rquery[cntr][2] = l; + rquery[cntr][3] = r; + rquery[cntr][4] = op; } public static void addLeftCnt(int val) { @@ -173,7 +171,7 @@ public static void prepare() { bl[i] = (i - 1) * blen + 1; br[i] = Math.min(i * blen, cntv); } - Arrays.sort(query, 1, m + 1, new QueryCmp()); + Arrays.sort(query1, 1, m + 1, new Cmp1()); } public static void compute() { @@ -188,9 +186,9 @@ public static void compute() { } int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { - int jobl = query[i][0]; - int jobr = query[i][1]; - int id = query[i][2]; + int jobl = query1[i][0]; + int jobr = query1[i][1]; + int id = query1[i][2]; if (winr < jobr) { addLeftQuery(winl - 1, id, winr + 1, jobr, -1); ans[id] += pre[jobr] - pre[winr]; @@ -210,10 +208,14 @@ public static void compute() { winl = jobl; winr = jobr; } - for (int i = 1; i <= n; i++) { - addLeftCnt(arr[i] - 1); - for (int q = headl[i]; q > 0; q = next[q]) { - int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + Arrays.sort(lquery, 1, cntl + 1, new Cmp2()); + Arrays.sort(rquery, 1, cntr + 1, new Cmp2()); + for (int pos = 0, qi = 1; pos <= n && qi <= cntl; pos++) { + if (pos >= 1) { + addLeftCnt(arr[pos] - 1); + } + for (; qi <= cntl && lquery[qi][0] == pos; qi++) { + int id = lquery[qi][1], l = lquery[qi][2], r = lquery[qi][3], op = lquery[qi][4]; long ret = 0; for (int j = l; j <= r; j++) { ret += getCnt(arr[j]); @@ -223,10 +225,12 @@ public static void compute() { } Arrays.fill(lazy, 0); Arrays.fill(cnt, 0); - for (int i = n; i >= 1; i--) { - addRightCnt(arr[i] + 1); - for (int q = headr[i]; q > 0; q = next[q]) { - int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + for (int pos = n + 1, qi = cntr; pos >= 1 && qi >= 1; pos--) { + if (pos <= n) { + addRightCnt(arr[pos] + 1); + } + for (; qi >= 1 && rquery[qi][0] == pos; qi--) { + int id = rquery[qi][1], l = rquery[qi][2], r = rquery[qi][3], op = rquery[qi][4]; long ret = 0; for (int j = l; j <= r; j++) { ret += getCnt(arr[j]); @@ -245,14 +249,14 @@ public static void main(String[] args) throws Exception { arr[i] = in.nextInt(); } for (int i = 1; i <= m; i++) { - query[i][0] = in.nextInt(); - query[i][1] = in.nextInt(); - query[i][2] = i; + query1[i][0] = in.nextInt(); + query1[i][1] = in.nextInt(); + query1[i][2] = i; } prepare(); compute(); for (int i = 2; i <= m; i++) { - ans[query[i][2]] += ans[query[i - 1][2]]; + ans[query1[i][2]] += ans[query1[i - 1][2]]; } for (int i = 1; i <= m; i++) { out.println(ans[i]); diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index 55e931257..ae0cc735f 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -9,20 +9,26 @@ // //using namespace std; // -//struct Query { +//struct Query1 { // int l, r, id; //}; // +//struct Query2 { +// int pos, id, l, r, op; +//}; +// //const int MAXN = 100002; -//const int MAXQ = 200001; //const int MAXB = 401; //int n, m; //int arr[MAXN]; -//Query query[MAXN]; -// //int sorted[MAXN]; //int cntv; // +//Query1 query1[MAXN]; +//Query2 lquery[MAXN]; +//Query2 rquery[MAXN]; +//int cntl, cntr; +// //int bi[MAXN]; //int bl[MAXB]; //int br[MAXB]; @@ -34,24 +40,19 @@ //long long cnt[MAXN]; //long long lazy[MAXB]; // -//int headl[MAXN]; -//int headr[MAXN]; -//int nxt[MAXQ]; -//int qid[MAXQ]; -//int ql[MAXQ]; -//int qr[MAXQ]; -//int qop[MAXQ]; -//int cntq; -// //long long ans[MAXN]; // -//bool QueryCmp(Query &a, Query &b) { +//bool Cmp1(Query1 &a, Query1 &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // +//bool Cmp2(Query2 &a, Query2 &b) { +// return a.pos < b.pos; +//} +// //int kth(int num) { // int left = 1, right = cntv, ret = 0; // while (left <= right) { @@ -87,25 +88,23 @@ //} // //void clear() { -// fill(tree + 1, tree + cntv + 1, 0); +// memset(tree + 1, 0, cntv * sizeof(int)); //} // //void addLeftQuery(int pos, int id, int l, int r, int op) { -// nxt[++cntq] = headl[pos]; -// qid[cntq] = id; -// ql[cntq] = l; -// qr[cntq] = r; -// qop[cntq] = op; -// headl[pos] = cntq; +// lquery[++cntl].pos = pos; +// lquery[cntl].id = id; +// lquery[cntl].l = l; +// lquery[cntl].r = r; +// lquery[cntl].op = op; //} // //void addRightQuery(int pos, int id, int l, int r, int op) { -// nxt[++cntq] = headr[pos]; -// qid[cntq] = id; -// ql[cntq] = l; -// qr[cntq] = r; -// qop[cntq] = op; -// headr[pos] = cntq; +// rquery[++cntr].pos = pos; +// rquery[cntr].id = id; +// rquery[cntr].l = l; +// rquery[cntr].r = r; +// rquery[cntr].op = op; //} // //void addLeftCnt(int val) { @@ -159,7 +158,7 @@ // bl[i] = (i - 1) * blen + 1; // br[i] = min(i * blen, cntv); // } -// sort(query + 1, query + m + 1, QueryCmp); +// sort(query1 + 1, query1 + m + 1, Cmp1); //} // //void compute() { @@ -174,9 +173,9 @@ // } // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { -// int jobl = query[i].l; -// int jobr = query[i].r; -// int id = query[i].id; +// int jobl = query1[i].l; +// int jobr = query1[i].r; +// int id = query1[i].id; // if (winr < jobr) { // addLeftQuery(winl - 1, id, winr + 1, jobr, -1); // ans[id] += pre[jobr] - pre[winr]; @@ -196,10 +195,14 @@ // winl = jobl; // winr = jobr; // } -// for (int i = 1; i <= n; i++) { -// addLeftCnt(arr[i] - 1); -// for (int q = headl[i]; q > 0; q = nxt[q]) { -// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// sort(lquery + 1, lquery + cntl + 1, Cmp2); +// sort(rquery + 1, rquery + cntr + 1, Cmp2); +// for (int pos = 0, qi = 1; pos <= n && qi <= cntl; pos++) { +// if (pos >= 1) { +// addLeftCnt(arr[pos] - 1); +// } +// for (; qi <= cntl && lquery[qi].pos == pos; qi++) { +// int id = lquery[qi].id, l = lquery[qi].l, r = lquery[qi].r, op = lquery[qi].op; // long long ret = 0; // for (int j = l; j <= r; j++) { // ret += getCnt(arr[j]); @@ -207,12 +210,14 @@ // ans[id] += ret * op; // } // } -// memset(cnt, 0, sizeof(cnt)); // memset(lazy, 0, sizeof(lazy)); -// for (int i = n; i >= 1; i--) { -// addRightCnt(arr[i] + 1); -// for (int q = headr[i]; q > 0; q = nxt[q]) { -// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// memset(cnt, 0, sizeof(cnt)); +// for (int pos = n + 1, qi = cntr; pos >= 1 && qi >= 1; pos--) { +// if (pos <= n) { +// addRightCnt(arr[pos] + 1); +// } +// for (; qi >= 1 && rquery[qi].pos == pos; qi--) { +// int id = rquery[qi].id, l = rquery[qi].l, r = rquery[qi].r, op = rquery[qi].op; // long long ret = 0; // for (int j = l; j <= r; j++) { // ret += getCnt(arr[j]); @@ -230,13 +235,13 @@ // cin >> arr[i]; // } // for (int i = 1; i <= m; i++) { -// cin >> query[i].l >> query[i].r; -// query[i].id = i; +// cin >> query1[i].l >> query1[i].r; +// query1[i].id = i; // } // prepare(); // compute(); // for (int i = 2; i <= m; i++) { -// ans[query[i].id] += ans[query[i - 1].id]; +// ans[query1[i].id] += ans[query1[i - 1].id]; // } // for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; From 85b4a59dc72fd7fcbc7ff5478cd1f2d69d3c9e73 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 7 Sep 2025 19:09:22 +0800 Subject: [PATCH 0673/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 2 +- src/class178/Code02_OfflineInversion2.java | 2 +- src/class178/Code04_Gosick1.java | 239 +++++++++++++++++++++ src/class178/Code04_Gosick2.java | 187 ++++++++++++++++ 4 files changed, 428 insertions(+), 2 deletions(-) create mode 100644 src/class178/Code04_Gosick1.java create mode 100644 src/class178/Code04_Gosick2.java diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 9abe33ca8..a44825299 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -197,6 +197,7 @@ public static void compute() { addLeftQuery(winl - 1, id, jobr + 1, winr, 1); ans[id] -= pre[winr] - pre[jobr]; } + winr = jobr; if (winl > jobl) { addRightQuery(jobr + 1, id, jobl, winl - 1, -1); ans[id] += suf[jobl] - suf[winl]; @@ -206,7 +207,6 @@ public static void compute() { ans[id] -= suf[winl] - suf[jobl]; } winl = jobl; - winr = jobr; } Arrays.sort(lquery, 1, cntl + 1, new Cmp2()); Arrays.sort(rquery, 1, cntr + 1, new Cmp2()); diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index ae0cc735f..8fc8a34f9 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -184,6 +184,7 @@ // addLeftQuery(winl - 1, id, jobr + 1, winr, 1); // ans[id] -= pre[winr] - pre[jobr]; // } +// winr = jobr; // if (winl > jobl) { // addRightQuery(jobr + 1, id, jobl, winl - 1, -1); // ans[id] += suf[jobl] - suf[winl]; @@ -193,7 +194,6 @@ // ans[id] -= suf[winl] - suf[jobl]; // } // winl = jobl; -// winr = jobr; // } // sort(lquery + 1, lquery + cntl + 1, Cmp2); // sort(rquery + 1, rquery + cntr + 1, Cmp2); diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java new file mode 100644 index 000000000..55bcb9620 --- /dev/null +++ b/src/class178/Code04_Gosick1.java @@ -0,0 +1,239 @@ +package class178; + +// 区间查倍数,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5398 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code04_Gosick2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code04_Gosick1 { + + public static int MAXN = 500001; + public static int MAXF = 5000001; + public static int LIMIT = 80; + public static int n, m, maxv; + public static int[] arr = new int[MAXN]; + + // l、r、id + public static int[][] query1 = new int[MAXN][3]; + // pos、id、l、r、op + public static int[][] query2 = new int[MAXN << 1][5]; + public static int cntq; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXF]; + public static int[] fac = new int[MAXF]; + public static int cntf; + + public static int[] bi = new int[MAXN]; + public static int[] fcnt = new int[MAXN]; + public static int[] xcnt = new int[MAXN]; + public static int[] pre = new int[MAXN]; + + public static int[] cnt1 = new int[MAXN]; + public static int[] cnt2 = new int[MAXN]; + + public static long[] ans = new long[MAXN]; + + // 莫队奇偶排序优化常数时间 + public static class Cmp1 implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } else { + return b[1] - a[1]; + } + } + } + + public static class Cmp2 implements Comparator { + @Override + public int compare(int[] a, int[] b) { + return a[0] - b[0]; + } + } + + public static void addFactor(int v, int f) { + nxt[++cntf] = head[v]; + fac[cntf] = f; + head[v] = cntf; + } + + public static void buildFactors(int x) { + if (head[x] > 0) { + return; + } + for (int f = 1, other; f * f <= x; f++) { + if (x % f == 0) { + addFactor(x, f); + other = x / f; + if (f != other) { + addFactor(x, other); + } + } + } + } + + public static void addQuery(int pos, int id, int l, int r, int op) { + query2[++cntq][0] = pos; + query2[cntq][1] = id; + query2[cntq][2] = l; + query2[cntq][3] = r; + query2[cntq][4] = op; + } + + public static void prepare() { + int blen = Math.max(n / (int) Math.sqrt(m), 1); + for (int i = 1, num; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + num = arr[i]; + maxv = Math.max(maxv, num); + buildFactors(num); + for (int e = head[num], f; e > 0; e = nxt[e]) { + f = fac[e]; + fcnt[f]++; + pre[i] += xcnt[f]; + } + pre[i] += pre[i - 1] + fcnt[num]; + xcnt[num]++; + } + Arrays.sort(query1, 1, m + 1, new Cmp1()); + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query1[i][0]; + int jobr = query1[i][1]; + int id = query1[i][2]; + if (winr < jobr) { + ans[id] += pre[jobr] - pre[winr]; + addQuery(winl - 1, id, winr + 1, jobr, -1); + } + if (winr > jobr) { + ans[id] -= pre[winr] - pre[jobr]; + addQuery(winl - 1, id, jobr + 1, winr, 1); + } + winr = jobr; + if (winl > jobl) { + ans[id] -= pre[winl - 1] - pre[jobl - 1]; + addQuery(winr, id, jobl, winl - 1, 1); + } + if (winl < jobl) { + ans[id] += pre[jobl - 1] - pre[winl - 1]; + addQuery(winr, id, winl, jobl - 1, -1); + } + winl = jobl; + } + Arrays.sort(query2, 1, cntq + 1, new Cmp2()); + Arrays.fill(fcnt, 0); + for (int i = 1, j = 1; i <= cntq; i++) { + int pos = query2[i][0], id = query2[i][1], l = query2[i][2], r = query2[i][3], op = query2[i][4]; + while (j <= pos) { + int x = arr[j++]; + buildFactors(x); + for (int e = head[x], f; e > 0; e = nxt[e]) { + f = fac[e]; + fcnt[f]++; + } + if (x > LIMIT) { + for (int k = x; k <= maxv; k += x) { + fcnt[k]++; + } + } + } + for (int k = l; k <= r; k++) { + ans[id] += (long) op * fcnt[arr[k]]; + } + } + for (int i = 1; i <= LIMIT; i++) { + cnt1[0] = 0; + cnt2[0] = 0; + for (int j = 1; j <= n; j++) { + cnt1[j] = cnt1[j - 1] + (arr[j] == i ? 1 : 0); + cnt2[j] = cnt2[j - 1] + (arr[j] % i == 0 ? 1 : 0); + } + for (int j = 1; j <= cntq; j++) { + int pos = query2[j][0], id = query2[j][1], l = query2[j][2], r = query2[j][3], op = query2[j][4]; + ans[id] += (long) (cnt2[r] - cnt2[l - 1]) * cnt1[pos] * op; + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query1[i][0] = in.nextInt(); + query1[i][1] = in.nextInt(); + query1[i][2] = i; + } + prepare(); + compute(); + for (int i = 2; i <= m; i++) { + ans[query1[i][2]] += ans[query1[i - 1][2]]; + } + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java new file mode 100644 index 000000000..d58ee6f75 --- /dev/null +++ b/src/class178/Code04_Gosick2.java @@ -0,0 +1,187 @@ +package class178; + +// 区间查倍数,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5398 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query1 { +// int l, r, id; +//}; +// +//struct Query2 { +// int pos, id, l, r, op; +//}; +// +//const int MAXN = 500001; +//const int MAXF = 5000001; +//const int LIMIT = 80; +//int n, m, maxv; +//int arr[MAXN]; +// +//Query1 query1[MAXN]; +//Query2 query2[MAXN << 1]; +//int cntq; +// +//int head[MAXN]; +//int nxt[MAXF]; +//int fac[MAXF]; +//int cntf; +// +//int bi[MAXN]; +//int fcnt[MAXN]; +//int xcnt[MAXN]; +//int pre[MAXN]; +// +//int cnt1[MAXN]; +//int cnt2[MAXN]; +// +//long long ans[MAXN]; +// +//bool Cmp1(Query1 &a, Query1 &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if (bi[a.l] & 1) { +// return a.r < b.r; +// } else { +// return b.r < a.r; +// } +//} +// +//bool Cmp2(Query2 &a, Query2 &b) { +// return a.pos < b.pos; +//} +// +//void addFactor(int v, int f) { +// nxt[++cntf] = head[v]; +// fac[cntf] = f; +// head[v] = cntf; +//} +// +//void buildFactors(int x) { +// if (head[x] > 0) { +// return; +// } +// for (int f = 1; 1LL * f * f <= x; f++) { +// if (x % f == 0) { +// addFactor(x, f); +// int other = x / f; +// if (f != other) { +// addFactor(x, other); +// } +// } +// } +//} +// +//void addQuery(int pos, int id, int l, int r, int op) { +// query2[++cntq].pos = pos; +// query2[cntq].id = id; +// query2[cntq].l = l; +// query2[cntq].r = r; +// query2[cntq].op = op; +//} +// +//void prepare() { +// int blen = max(n / (int)sqrt((double)m), 1); +// for (int i = 1, num; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// num = arr[i]; +// maxv = max(maxv, num); +// buildFactors(num); +// for (int e = head[num], f; e > 0; e = nxt[e]) { +// f = fac[e]; +// fcnt[f]++; +// pre[i] += xcnt[f]; +// } +// pre[i] += pre[i - 1] + fcnt[num]; +// xcnt[num]++; +// } +// sort(query1 + 1, query1 + m + 1, Cmp1); +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query1[i].l; +// int jobr = query1[i].r; +// int id = query1[i].id; +// if (winr < jobr) { +// ans[id] += pre[jobr] - pre[winr]; +// addQuery(winl - 1, id, winr + 1, jobr, -1); +// } +// if (winr > jobr) { +// ans[id] -= pre[winr] - pre[jobr]; +// addQuery(winl - 1, id, jobr + 1, winr, 1); +// } +// winr = jobr; +// if (winl > jobl) { +// ans[id] -= pre[winl - 1] - pre[jobl - 1]; +// addQuery(winr, id, jobl, winl - 1, 1); +// } +// if (winl < jobl) { +// ans[id] += pre[jobl - 1] - pre[winl - 1]; +// addQuery(winr, id, winl, jobl - 1, -1); +// } +// winl = jobl; +// } +// sort(query2 + 1, query2 + cntq + 1, Cmp2); +// memset(fcnt, 0, sizeof(fcnt)); +// for (int i = 1, j = 1; i <= cntq; i++) { +// int pos = query2[i].pos, id = query2[i].id, l = query2[i].l, r = query2[i].r, op = query2[i].op; +// while (j <= pos) { +// int x = arr[j++]; +// buildFactors(x); +// for (int e = head[x], f; e > 0; e = nxt[e]) { +// f = fac[e]; +// fcnt[f]++; +// } +// if (x > LIMIT) { +// for (int k = x; k <= maxv; k += x) { +// fcnt[k]++; +// } +// } +// } +// for (int k = l; k <= r; k++) { +// ans[id] += 1LL * op * fcnt[arr[k]]; +// } +// } +// for (int i = 1; i <= LIMIT; i++) { +// cnt1[0] = 0; +// cnt2[0] = 0; +// for (int j = 1; j <= n; j++) { +// cnt1[j] = cnt1[j - 1] + (arr[j] == i ? 1 : 0); +// cnt2[j] = cnt2[j - 1] + (arr[j] % i == 0 ? 1 : 0); +// } +// for (int j = 1; j <= cntq; j++) { +// int pos = query2[j].pos, id = query2[j].id, l = query2[j].l, r = query2[j].r, op = query2[j].op; +// ans[id] += 1LL * (cnt2[r] - cnt2[l - 1]) * cnt1[pos] * op; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query1[i].l >> query1[i].r; +// query1[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 2; i <= m; i++) { +// ans[query1[i].id] += ans[query1[i - 1].id]; +// } +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 84de4fc0293102c44fdcfe81c5bddef3f0db1eb9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Sep 2025 19:04:45 +0800 Subject: [PATCH 0674/1170] modify code --- src/class178/Code04_Gosick1.java | 143 +++++++++++++------------ src/class178/Code04_Gosick2.java | 174 ++++++++++++++++++------------- 2 files changed, 173 insertions(+), 144 deletions(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 55bcb9620..74aef4386 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -18,9 +18,16 @@ public class Code04_Gosick1 { public static int MAXN = 500001; public static int MAXF = 5000001; - public static int LIMIT = 80; + public static int LIMIT = 100; public static int n, m, maxv; public static int[] arr = new int[MAXN]; + public static int[] bi = new int[MAXN]; + + // 每个数的因子表 + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXF]; + public static int[] fac = new int[MAXF]; + public static int cntf; // l、r、id public static int[][] query1 = new int[MAXN][3]; @@ -28,22 +35,16 @@ public class Code04_Gosick1 { public static int[][] query2 = new int[MAXN << 1][5]; public static int cntq; - public static int[] head = new int[MAXN]; - public static int[] nxt = new int[MAXF]; - public static int[] fac = new int[MAXF]; - public static int cntf; - - public static int[] bi = new int[MAXN]; public static int[] fcnt = new int[MAXN]; public static int[] xcnt = new int[MAXN]; - public static int[] pre = new int[MAXN]; + public static long[] pre = new long[MAXN]; public static int[] cnt1 = new int[MAXN]; public static int[] cnt2 = new int[MAXN]; public static long[] ans = new long[MAXN]; - // 莫队奇偶排序优化常数时间 + // 莫队奇偶排序,优化一下常数 public static class Cmp1 implements Comparator { @Override public int compare(int[] a, int[] b) { @@ -65,22 +66,13 @@ public int compare(int[] a, int[] b) { } } - public static void addFactor(int v, int f) { - nxt[++cntf] = head[v]; - fac[cntf] = f; - head[v] = cntf; - } - - public static void buildFactors(int x) { - if (head[x] > 0) { - return; - } - for (int f = 1, other; f * f <= x; f++) { - if (x % f == 0) { - addFactor(x, f); - other = x / f; - if (f != other) { - addFactor(x, other); + public static void addFactors(int num) { + if (head[num] == 0) { + for (int f = 1; f * f <= num; f++) { + if (num % f == 0) { + nxt[++cntf] = head[num]; + fac[cntf] = f; + head[num] = cntf; } } } @@ -94,84 +86,97 @@ public static void addQuery(int pos, int id, int l, int r, int op) { query2[cntq][4] = op; } - public static void prepare() { - int blen = Math.max(n / (int) Math.sqrt(m), 1); - for (int i = 1, num; i <= n; i++) { - bi[i] = (i - 1) / blen + 1; - num = arr[i]; - maxv = Math.max(maxv, num); - buildFactors(num); - for (int e = head[num], f; e > 0; e = nxt[e]) { + public static void compute() { + for (int i = 1, x; i <= n; i++) { + x = arr[i]; + for (int e = head[x], f, other; e > 0; e = nxt[e]) { f = fac[e]; + other = x / f; fcnt[f]++; pre[i] += xcnt[f]; + if (other != f) { + fcnt[other]++; + pre[i] += xcnt[other]; + } } - pre[i] += pre[i - 1] + fcnt[num]; - xcnt[num]++; + pre[i] += fcnt[x] + pre[i - 1]; + xcnt[x]++; } - Arrays.sort(query1, 1, m + 1, new Cmp1()); - } - - public static void compute() { int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { int jobl = query1[i][0]; int jobr = query1[i][1]; int id = query1[i][2]; if (winr < jobr) { - ans[id] += pre[jobr] - pre[winr]; addQuery(winl - 1, id, winr + 1, jobr, -1); + ans[id] += pre[jobr] - pre[winr]; + winr = jobr; } - if (winr > jobr) { - ans[id] -= pre[winr] - pre[jobr]; - addQuery(winl - 1, id, jobr + 1, winr, 1); - } - winr = jobr; if (winl > jobl) { - ans[id] -= pre[winl - 1] - pre[jobl - 1]; addQuery(winr, id, jobl, winl - 1, 1); + ans[id] -= pre[winl - 1] - pre[jobl - 1]; + winl = jobl; + } + if (winr > jobr) { + addQuery(winl - 1, id, jobr + 1, winr, 1); + ans[id] -= pre[winr] - pre[jobr]; + winr = jobr; } if (winl < jobl) { - ans[id] += pre[jobl - 1] - pre[winl - 1]; addQuery(winr, id, winl, jobl - 1, -1); + ans[id] += pre[jobl - 1] - pre[winl - 1]; + winl = jobl; } - winl = jobl; } Arrays.sort(query2, 1, cntq + 1, new Cmp2()); Arrays.fill(fcnt, 0); - for (int i = 1, j = 1; i <= cntq; i++) { - int pos = query2[i][0], id = query2[i][1], l = query2[i][2], r = query2[i][3], op = query2[i][4]; - while (j <= pos) { - int x = arr[j++]; - buildFactors(x); - for (int e = head[x], f; e > 0; e = nxt[e]) { + for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { + if (pos >= 1) { + int num = arr[pos]; + for (int e = head[num], f, other; e > 0; e = nxt[e]) { f = fac[e]; + other = num / f; fcnt[f]++; + if (other != f) { + fcnt[other]++; + } } - if (x > LIMIT) { - for (int k = x; k <= maxv; k += x) { - fcnt[k]++; + if (num > LIMIT) { + for (int v = num; v <= maxv; v += num) { + fcnt[v]++; } } } - for (int k = l; k <= r; k++) { - ans[id] += (long) op * fcnt[arr[k]]; + for (; qi <= cntq && query2[qi][0] == pos; qi++) { + int id = query2[qi][1], l = query2[qi][2], r = query2[qi][3], op = query2[qi][4]; + for (int i = l; i <= r; i++) { + ans[id] += (long) op * fcnt[arr[i]]; + } } } - for (int i = 1; i <= LIMIT; i++) { - cnt1[0] = 0; - cnt2[0] = 0; - for (int j = 1; j <= n; j++) { - cnt1[j] = cnt1[j - 1] + (arr[j] == i ? 1 : 0); - cnt2[j] = cnt2[j - 1] + (arr[j] % i == 0 ? 1 : 0); + for (int v = 1; v <= LIMIT; v++) { + cnt1[0] = cnt2[0] = 0; + for (int i = 1; i <= n; i++) { + cnt1[i] = cnt1[i - 1] + (arr[i] == v ? 1 : 0); + cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); } - for (int j = 1; j <= cntq; j++) { - int pos = query2[j][0], id = query2[j][1], l = query2[j][2], r = query2[j][3], op = query2[j][4]; - ans[id] += (long) (cnt2[r] - cnt2[l - 1]) * cnt1[pos] * op; + for (int i = 1; i <= cntq; i++) { + int pos = query2[i][0], id = query2[i][1], l = query2[i][2], r = query2[i][3], op = query2[i][4]; + ans[id] += (long) op * cnt1[pos] * (cnt2[r] - cnt2[l - 1]); } } } + public static void prepare() { + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + maxv = Math.max(maxv, arr[i]); + addFactors(arr[i]); + } + Arrays.sort(query1, 1, m + 1, new Cmp1()); + } + public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); @@ -236,4 +241,4 @@ int nextInt() throws IOException { } } -} +} \ No newline at end of file diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index d58ee6f75..4f00e259f 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -9,6 +9,25 @@ // //using namespace std; // +//char buf[1000000], *p1 = buf, *p2 = buf; +// +//inline char getChar() { +// return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++; +//} +// +//inline int read() { +// int s = 0; +// char c = getChar(); +// while (!isdigit(c)) { +// c = getChar(); +// } +// while (isdigit(c)) { +// s = s * 10 + c - '0'; +// c = getChar(); +// } +// return s; +//} +// //struct Query1 { // int l, r, id; //}; @@ -19,23 +38,23 @@ // //const int MAXN = 500001; //const int MAXF = 5000001; -//const int LIMIT = 80; +//const int LIMIT = 100; //int n, m, maxv; //int arr[MAXN]; -// -//Query1 query1[MAXN]; -//Query2 query2[MAXN << 1]; -//int cntq; +//int bi[MAXN]; // //int head[MAXN]; //int nxt[MAXF]; //int fac[MAXF]; //int cntf; // -//int bi[MAXN]; +//Query1 query1[MAXN]; +//Query2 query2[MAXN << 1]; +//int cntq; +// //int fcnt[MAXN]; //int xcnt[MAXN]; -//int pre[MAXN]; +//long long pre[MAXN]; // //int cnt1[MAXN]; //int cnt2[MAXN]; @@ -57,122 +76,127 @@ // return a.pos < b.pos; //} // -//void addFactor(int v, int f) { -// nxt[++cntf] = head[v]; -// fac[cntf] = f; -// head[v] = cntf; -//} -// -//void buildFactors(int x) { -// if (head[x] > 0) { -// return; -// } -// for (int f = 1; 1LL * f * f <= x; f++) { -// if (x % f == 0) { -// addFactor(x, f); -// int other = x / f; -// if (f != other) { -// addFactor(x, other); +//void addFactors(int num) { +// if (head[num] == 0) { +// for (int f = 1; f * f <= num; f++) { +// if (num % f == 0) { +// nxt[++cntf] = head[num]; +// fac[cntf] = f; +// head[num] = cntf; // } // } // } //} // //void addQuery(int pos, int id, int l, int r, int op) { -// query2[++cntq].pos = pos; -// query2[cntq].id = id; -// query2[cntq].l = l; -// query2[cntq].r = r; -// query2[cntq].op = op; +// query2[++cntq].pos = pos; +// query2[cntq].id = id; +// query2[cntq].l = l; +// query2[cntq].r = r; +// query2[cntq].op = op; //} // -//void prepare() { -// int blen = max(n / (int)sqrt((double)m), 1); -// for (int i = 1, num; i <= n; i++) { -// bi[i] = (i - 1) / blen + 1; -// num = arr[i]; -// maxv = max(maxv, num); -// buildFactors(num); -// for (int e = head[num], f; e > 0; e = nxt[e]) { +//void compute() { +// for (int i = 1, x; i <= n; i++) { +// x = arr[i]; +// for (int e = head[x], f, other; e > 0; e = nxt[e]) { // f = fac[e]; +// other = x / f; // fcnt[f]++; // pre[i] += xcnt[f]; +// if (other != f) { +// fcnt[other]++; +// pre[i] += xcnt[other]; +// } // } -// pre[i] += pre[i - 1] + fcnt[num]; -// xcnt[num]++; +// pre[i] += fcnt[x] + pre[i - 1]; +// xcnt[x]++; // } -// sort(query1 + 1, query1 + m + 1, Cmp1); -//} -// -//void compute() { // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { // int jobl = query1[i].l; // int jobr = query1[i].r; // int id = query1[i].id; // if (winr < jobr) { -// ans[id] += pre[jobr] - pre[winr]; // addQuery(winl - 1, id, winr + 1, jobr, -1); +// ans[id] += pre[jobr] - pre[winr]; +// winr = jobr; // } -// if (winr > jobr) { -// ans[id] -= pre[winr] - pre[jobr]; -// addQuery(winl - 1, id, jobr + 1, winr, 1); -// } -// winr = jobr; // if (winl > jobl) { -// ans[id] -= pre[winl - 1] - pre[jobl - 1]; // addQuery(winr, id, jobl, winl - 1, 1); +// ans[id] -= pre[winl - 1] - pre[jobl - 1]; +// winl = jobl; +// } +// if (winr > jobr) { +// addQuery(winl - 1, id, jobr + 1, winr, 1); +// ans[id] -= pre[winr] - pre[jobr]; +// winr = jobr; // } // if (winl < jobl) { -// ans[id] += pre[jobl - 1] - pre[winl - 1]; // addQuery(winr, id, winl, jobl - 1, -1); +// ans[id] += pre[jobl - 1] - pre[winl - 1]; +// winl = jobl; // } -// winl = jobl; // } // sort(query2 + 1, query2 + cntq + 1, Cmp2); // memset(fcnt, 0, sizeof(fcnt)); -// for (int i = 1, j = 1; i <= cntq; i++) { -// int pos = query2[i].pos, id = query2[i].id, l = query2[i].l, r = query2[i].r, op = query2[i].op; -// while (j <= pos) { -// int x = arr[j++]; -// buildFactors(x); -// for (int e = head[x], f; e > 0; e = nxt[e]) { +// for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { +// if (pos >= 1) { +// int num = arr[pos]; +// for (int e = head[num], f, other; e > 0; e = nxt[e]) { // f = fac[e]; +// other = num / f; // fcnt[f]++; +// if (other != f) { +// fcnt[other]++; +// } // } -// if (x > LIMIT) { -// for (int k = x; k <= maxv; k += x) { -// fcnt[k]++; +// if (num > LIMIT) { +// for (int v = num; v <= maxv; v += num) { +// fcnt[v]++; // } // } // } -// for (int k = l; k <= r; k++) { -// ans[id] += 1LL * op * fcnt[arr[k]]; +// for (; qi <= cntq && query2[qi].pos == pos; qi++) { +// int id = query2[qi].id, l = query2[qi].l, r = query2[qi].r, op = query2[qi].op; +// for (int i = l; i <= r; i++) { +// ans[id] += 1LL * op * fcnt[arr[i]]; +// } // } // } -// for (int i = 1; i <= LIMIT; i++) { +// for (int v = 1; v <= LIMIT; v++) { // cnt1[0] = 0; // cnt2[0] = 0; -// for (int j = 1; j <= n; j++) { -// cnt1[j] = cnt1[j - 1] + (arr[j] == i ? 1 : 0); -// cnt2[j] = cnt2[j - 1] + (arr[j] % i == 0 ? 1 : 0); +// for (int i = 1; i <= n; i++) { +// cnt1[i] = cnt1[i - 1] + (arr[i] == v ? 1 : 0); +// cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); // } -// for (int j = 1; j <= cntq; j++) { -// int pos = query2[j].pos, id = query2[j].id, l = query2[j].l, r = query2[j].r, op = query2[j].op; -// ans[id] += 1LL * (cnt2[r] - cnt2[l - 1]) * cnt1[pos] * op; +// for (int i = 1; i <= cntq; i++) { +// int pos = query2[i].pos, id = query2[i].id, l = query2[i].l, r = query2[i].r, op = query2[i].op; +// ans[id] += 1LL * op * cnt1[pos] * (cnt2[r] - cnt2[l - 1]); // } // } //} // +//void prepare() { +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// maxv = max(maxv, arr[i]); +// addFactors(arr[i]); +// } +// sort(query1 + 1, query1 + m + 1, Cmp1); +//} +// //int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n >> m; +// n = read(); +// m = read(); // for (int i = 1; i <= n; i++) { -// cin >> arr[i]; +// arr[i] = read(); // } // for (int i = 1; i <= m; i++) { -// cin >> query1[i].l >> query1[i].r; +// query1[i].l = read(); +// query1[i].r = read(); // query1[i].id = i; // } // prepare(); @@ -181,7 +205,7 @@ // ans[query1[i].id] += ans[query1[i - 1].id]; // } // for (int i = 1; i <= m; i++) { -// cout << ans[i] << '\n'; +// printf("%lld\n", ans[i]); // } // return 0; //} \ No newline at end of file From 6617ae98b3c669d0e6bc7b18fb5df1bea25c8803 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Sep 2025 19:20:48 +0800 Subject: [PATCH 0675/1170] modify code --- src/class178/Code04_Gosick1.java | 18 ++++++++---------- src/class178/Code04_Gosick2.java | 16 +++++++--------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 74aef4386..82ea519a7 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -18,7 +18,7 @@ public class Code04_Gosick1 { public static int MAXN = 500001; public static int MAXF = 5000001; - public static int LIMIT = 100; + public static int LIMIT = 80; public static int n, m, maxv; public static int[] arr = new int[MAXN]; public static int[] bi = new int[MAXN]; @@ -44,7 +44,7 @@ public class Code04_Gosick1 { public static long[] ans = new long[MAXN]; - // 莫队奇偶排序,优化一下常数 + // 莫队奇偶排序,优化常数时间 public static class Cmp1 implements Comparator { @Override public int compare(int[] a, int[] b) { @@ -110,23 +110,21 @@ public static void compute() { if (winr < jobr) { addQuery(winl - 1, id, winr + 1, jobr, -1); ans[id] += pre[jobr] - pre[winr]; - winr = jobr; - } - if (winl > jobl) { - addQuery(winr, id, jobl, winl - 1, 1); - ans[id] -= pre[winl - 1] - pre[jobl - 1]; - winl = jobl; } if (winr > jobr) { addQuery(winl - 1, id, jobr + 1, winr, 1); ans[id] -= pre[winr] - pre[jobr]; - winr = jobr; + } + winr = jobr; + if (winl > jobl) { + addQuery(winr, id, jobl, winl - 1, 1); + ans[id] -= pre[winl - 1] - pre[jobl - 1]; } if (winl < jobl) { addQuery(winr, id, winl, jobl - 1, -1); ans[id] += pre[jobl - 1] - pre[winl - 1]; - winl = jobl; } + winl = jobl; } Arrays.sort(query2, 1, cntq + 1, new Cmp2()); Arrays.fill(fcnt, 0); diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index 4f00e259f..5e74e696c 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -38,7 +38,7 @@ // //const int MAXN = 500001; //const int MAXF = 5000001; -//const int LIMIT = 100; +//const int LIMIT = 80; //int n, m, maxv; //int arr[MAXN]; //int bi[MAXN]; @@ -120,23 +120,21 @@ // if (winr < jobr) { // addQuery(winl - 1, id, winr + 1, jobr, -1); // ans[id] += pre[jobr] - pre[winr]; -// winr = jobr; -// } -// if (winl > jobl) { -// addQuery(winr, id, jobl, winl - 1, 1); -// ans[id] -= pre[winl - 1] - pre[jobl - 1]; -// winl = jobl; // } // if (winr > jobr) { // addQuery(winl - 1, id, jobr + 1, winr, 1); // ans[id] -= pre[winr] - pre[jobr]; -// winr = jobr; +// } +// winr = jobr; +// if (winl > jobl) { +// addQuery(winr, id, jobl, winl - 1, 1); +// ans[id] -= pre[winl - 1] - pre[jobl - 1]; // } // if (winl < jobl) { // addQuery(winr, id, winl, jobl - 1, -1); // ans[id] += pre[jobl - 1] - pre[winl - 1]; -// winl = jobl; // } +// winl = jobl; // } // sort(query2 + 1, query2 + cntq + 1, Cmp2); // memset(fcnt, 0, sizeof(fcnt)); From edf09a9c8494faa4983b74e1ff1e4827f810574f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Sep 2025 19:24:04 +0800 Subject: [PATCH 0676/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 4 ++-- src/class178/Code02_OfflineInversion2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index a44825299..7007eb958 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -199,11 +199,11 @@ public static void compute() { } winr = jobr; if (winl > jobl) { - addRightQuery(jobr + 1, id, jobl, winl - 1, -1); + addRightQuery(winr + 1, id, jobl, winl - 1, -1); ans[id] += suf[jobl] - suf[winl]; } if (winl < jobl) { - addRightQuery(jobr + 1, id, winl, jobl - 1, 1); + addRightQuery(winr + 1, id, winl, jobl - 1, 1); ans[id] -= suf[winl] - suf[jobl]; } winl = jobl; diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index 8fc8a34f9..bf71b4ff7 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -186,11 +186,11 @@ // } // winr = jobr; // if (winl > jobl) { -// addRightQuery(jobr + 1, id, jobl, winl - 1, -1); +// addRightQuery(winr + 1, id, jobl, winl - 1, -1); // ans[id] += suf[jobl] - suf[winl]; // } // if (winl < jobl) { -// addRightQuery(jobr + 1, id, winl, jobl - 1, 1); +// addRightQuery(winr + 1, id, winl, jobl - 1, 1); // ans[id] -= suf[winl] - suf[jobl]; // } // winl = jobl; From 57305736daba3cbd47dce63b55cfb1b21dd5eb29 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Sep 2025 22:22:21 +0800 Subject: [PATCH 0677/1170] modify code --- src/class178/Code04_Gosick1.java | 7 +----- src/class178/Code04_Gosick2.java | 37 ++++++-------------------------- 2 files changed, 8 insertions(+), 36 deletions(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 82ea519a7..7be189708 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -44,18 +44,13 @@ public class Code04_Gosick1 { public static long[] ans = new long[MAXN]; - // 莫队奇偶排序,优化常数时间 public static class Cmp1 implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { return bi[a[0]] - bi[b[0]]; } - if ((bi[a[0]] & 1) == 1) { - return a[1] - b[1]; - } else { - return b[1] - a[1]; - } + return a[1] - b[1]; } } diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index 5e74e696c..96bd5e00b 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -9,25 +9,6 @@ // //using namespace std; // -//char buf[1000000], *p1 = buf, *p2 = buf; -// -//inline char getChar() { -// return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++; -//} -// -//inline int read() { -// int s = 0; -// char c = getChar(); -// while (!isdigit(c)) { -// c = getChar(); -// } -// while (isdigit(c)) { -// s = s * 10 + c - '0'; -// c = getChar(); -// } -// return s; -//} -// //struct Query1 { // int l, r, id; //}; @@ -65,11 +46,7 @@ // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } -// if (bi[a.l] & 1) { -// return a.r < b.r; -// } else { -// return b.r < a.r; -// } +// return a.r < b.r; //} // //bool Cmp2(Query2 &a, Query2 &b) { @@ -187,14 +164,14 @@ //} // //int main() { -// n = read(); -// m = read(); +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; // for (int i = 1; i <= n; i++) { -// arr[i] = read(); +// cin >> arr[i]; // } // for (int i = 1; i <= m; i++) { -// query1[i].l = read(); -// query1[i].r = read(); +// cin >> query1[i].l >> query1[i].r; // query1[i].id = i; // } // prepare(); @@ -203,7 +180,7 @@ // ans[query1[i].id] += ans[query1[i - 1].id]; // } // for (int i = 1; i <= m; i++) { -// printf("%lld\n", ans[i]); +// cout << ans[i] << '\n'; // } // return 0; //} \ No newline at end of file From 671fde8e94126ecdb545ecebdcdf2e91b4d02fe9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Sep 2025 22:34:30 +0800 Subject: [PATCH 0678/1170] modify code --- src/class164/Code02_Training1.java | 2 +- src/class164/Code02_Training2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class164/Code02_Training1.java b/src/class164/Code02_Training1.java index 9a1c8febc..fee7238d8 100644 --- a/src/class164/Code02_Training1.java +++ b/src/class164/Code02_Training1.java @@ -4,7 +4,7 @@ // 图里有n个点,m条无向边,每条边给定不同的边权,图里可能有若干个连通的部分 // 一开始limit = 0,接下来有q条操作,每种操作的格式如下 // 操作 1 x : 所有修改操作生效,然后limit设置成x -// 操作 2 x : 从点x出发,只能走过 边权 < limit 的边,查询最多到达几个点 +// 操作 2 x : 从点x出发,只能走 边权 >= limit 的边,查询最多到达几个点 // 操作 3 x y : 第x条边的边权修改为y,不是立刻生效,等到下次操作1发生时生效 // 题目保证边权不管如何修改,所有边权都不相等,并且每条边的边权排名不发生变化 // 1 <= n、m、q <= 4 * 10^5 diff --git a/src/class164/Code02_Training2.java b/src/class164/Code02_Training2.java index 7e8636dc9..49953549e 100644 --- a/src/class164/Code02_Training2.java +++ b/src/class164/Code02_Training2.java @@ -4,7 +4,7 @@ // 图里有n个点,m条无向边,每条边给定不同的边权,图里可能有若干个连通的部分 // 一开始limit = 0,接下来有q条操作,每种操作的格式如下 // 操作 1 x : 所有修改操作生效,然后limit设置成x -// 操作 2 x : 从点x出发,只能走过 边权 < limit 的边,查询最多到达几个点 +// 操作 2 x : 从点x出发,只能走 边权 >= limit 的边,查询最多到达几个点 // 操作 3 x y : 第x条边的边权修改为y,不是立刻生效,等到下次操作1发生时生效 // 题目保证边权不管如何修改,所有边权都不相等,并且每条边的边权排名不发生变化 // 1 <= n、m、q <= 4 * 10^5 From 9ad3cfe4ed541408dc4732711b7682c4c1efeac7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Sep 2025 23:50:07 +0800 Subject: [PATCH 0679/1170] modify code --- src/class164/Code04_Journey1.java | 11 ++++++----- src/class164/Code04_Journey2.java | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/class164/Code04_Journey1.java b/src/class164/Code04_Journey1.java index 9621d5bdc..98327c090 100644 --- a/src/class164/Code04_Journey1.java +++ b/src/class164/Code04_Journey1.java @@ -1,11 +1,12 @@ package class164; // 归程,java版 -// 图里有n个点,m条无向边,每条边给定长度l和海拔a,所有点都连通 -// 一共有q条查询,查询格式如下 -// 查询 x y : 海拔 > y的边,走过没有代价 -// 海拔 <= y的边,走过的代价为边的长度 -// 从点x出发到达1号点,打印最小的代价 +// 一共有n个点,m条无向边,原图连通,每条边有长度l和海拔a +// 一共有q条查询,格式如下 +// 查询 x y : 起初走过海拔 > y的边免费,可视为开车,但是车不能走海拔 <= y的边 +// 你可以在任意节点下车,车不能再用 +// 下车后经过每条边的长度(包括海拔 > y 的边),都算入步行长度 +// 你想从点x到1号点,打印最小步行长度 // 1 <= n <= 2 * 10^5 // 1 <= m、q <= 4 * 10^5 // 本题要求强制在线,具体规定请打开测试链接查看 diff --git a/src/class164/Code04_Journey2.java b/src/class164/Code04_Journey2.java index e91df1ecd..b661868eb 100644 --- a/src/class164/Code04_Journey2.java +++ b/src/class164/Code04_Journey2.java @@ -1,11 +1,12 @@ package class164; // 归程,C++版 -// 图里有n个点,m条无向边,每条边给定长度l和海拔a,所有点都连通 -// 一共有q条查询,查询格式如下 -// 查询 x y : 海拔 > y的边,走过没有代价 -// 海拔 <= y的边,走过的代价为边的长度 -// 从点x出发到达1号点,打印最小的代价 +// 一共有n个点,m条无向边,原图连通,每条边有长度l和海拔a +// 一共有q条查询,格式如下 +// 查询 x y : 起初走过海拔 > y的边免费,可视为开车,但是车不能走海拔 <= y的边 +// 你可以在任意节点下车,车不能再用 +// 下车后经过每条边的长度(包括海拔 > y 的边),都算入步行长度 +// 你想从点x到1号点,打印最小步行长度 // 1 <= n <= 2 * 10^5 // 1 <= m、q <= 4 * 10^5 // 本题要求强制在线,具体规定请打开测试链接查看 From a163766e04d87728f1ee6780304cb2b0ad117dc4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 9 Sep 2025 00:31:45 +0800 Subject: [PATCH 0680/1170] modify code --- ...\345\205\263\351\242\230\347\233\256.pptx" | Bin 54204 -> 54285 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243164\343\200\220\346\214\272\351\232\276\343\200\221Kruskal\351\207\215\346\236\204\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243164\343\200\220\346\214\272\351\232\276\343\200\221Kruskal\351\207\215\346\236\204\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" index 656af71ca9d046493096e90d84196503c661afeb..ec51dfcce1b1de2bbfb628952bf228d75dad3849 100644 GIT binary patch delta 5000 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 DaDBgl delta 4991 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 Kz Date: Tue, 9 Sep 2025 17:04:11 +0800 Subject: [PATCH 0681/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 74 +++---- src/class178/Code01_MoOfflineTwice2.java | 70 ++++--- src/class178/Code03_Abbi1.java | 247 +++++++++++++++++++++++ src/class178/Code03_Abbi2.java | 202 ++++++++++++++++++ 4 files changed, 520 insertions(+), 73 deletions(-) create mode 100644 src/class178/Code03_Abbi1.java create mode 100644 src/class178/Code03_Abbi2.java diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 87190723c..fc2560b30 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -23,10 +23,18 @@ public class Code01_MoOfflineTwice1 { public static int[] kOneArr = new int[MAXV]; public static int cntk; - // 第一次离线任务,l、r、id + // 莫队任务,l、r、id // 第二次离线任务,pos、id、l、r、op - public static int[][] query1 = new int[MAXN][3]; - public static int[][] query2 = new int[MAXN << 1][5]; + public static int[][] query = new int[MAXN][3]; + + // 第二次离线任务,x、id、l、r、op + // 位置x的任务列表用链式前向星表示 + public static int[] headq = new int[MAXN]; + public static int[] nextq = new int[MAXN << 1]; + public static int[] qid = new int[MAXN << 1]; + public static int[] ql = new int[MAXN << 1]; + public static int[] qr = new int[MAXN << 1]; + public static int[] qop = new int[MAXN << 1]; public static int cntq; public static int[] bi = new int[MAXN]; @@ -35,7 +43,7 @@ public class Code01_MoOfflineTwice1 { public static long[] ans = new long[MAXN]; - public static class Cmp1 implements Comparator { + public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { @@ -45,13 +53,6 @@ public int compare(int[] a, int[] b) { } } - public static class Cmp2 implements Comparator { - @Override - public int compare(int[] a, int[] b) { - return a[0] - b[0]; - } - } - public static int countOne(int num) { int ret = 0; while (num > 0) { @@ -61,12 +62,13 @@ public static int countOne(int num) { return ret; } - public static void addQuery(int pos, int id, int l, int r, int op) { - query2[++cntq][0] = pos; - query2[cntq][1] = id; - query2[cntq][2] = l; - query2[cntq][3] = r; - query2[cntq][4] = op; + public static void addOffline(int x, int id, int l, int r, int op) { + nextq[++cntq] = headq[x]; + headq[x] = cntq; + qid[cntq] = id; + ql[cntq] = l; + qr[cntq] = r; + qop[cntq] = op; } public static void prepare() { @@ -74,7 +76,7 @@ public static void prepare() { for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } - Arrays.sort(query1, 1, m + 1, new Cmp1()); + Arrays.sort(query, 1, m + 1, new QueryCmp()); for (int v = 0; v < MAXV; v++) { if (countOne(v) == k) { kOneArr[++cntk] = v; @@ -89,32 +91,31 @@ public static void compute() { cnt[arr[i] ^ kOneArr[j]]++; } } - // 第一次离线 int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { - int jobl = query1[i][0]; - int jobr = query1[i][1]; - int id = query1[i][2]; + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; if (winr < jobr) { - addQuery(winl - 1, id, winr + 1, jobr, -1); + addOffline(winl - 1, id, winr + 1, jobr, -1); } while (winr < jobr) { ans[id] += pre[++winr]; } if (winr > jobr) { - addQuery(winl - 1, id, jobr + 1, winr, 1); + addOffline(winl - 1, id, jobr + 1, winr, 1); } while (winr > jobr) { ans[id] -= pre[winr--]; } if (winl > jobl) { - addQuery(winr, id, jobl, winl - 1, 1); + addOffline(winr, id, jobl, winl - 1, 1); } while (winl > jobl) { ans[id] -= pre[--winl]; } if (winl < jobl) { - addQuery(winr, id, winl, jobl - 1, -1); + addOffline(winr, id, winl, jobl - 1, -1); } while (winl < jobl) { ans[id] += pre[winl++]; @@ -122,17 +123,16 @@ public static void compute() { } // 第二次离线 Arrays.fill(cnt, 0); - Arrays.sort(query2, 1, cntq + 1, new Cmp2()); - for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { - if (pos >= 1) { + for (int i = 0; i <= n; i++) { + if (i >= 1) { for (int j = 1; j <= cntk; j++) { - cnt[arr[pos] ^ kOneArr[j]]++; + cnt[arr[i] ^ kOneArr[j]]++; } } - for (; qi <= cntq && query2[qi][0] == pos; qi++) { - int id = query2[qi][1], l = query2[qi][2], r = query2[qi][3], op = query2[qi][4]; + for (int q = headq[i]; q > 0; q = nextq[q]) { + int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; for (int j = l; j <= r; j++) { - if (j <= pos && k == 0) { + if (j <= i && k == 0) { ans[id] += (long) op * (cnt[arr[j]] - 1); } else { ans[id] += (long) op * cnt[arr[j]]; @@ -152,14 +152,14 @@ public static void main(String[] args) throws Exception { arr[i] = in.nextInt(); } for (int i = 1; i <= m; i++) { - query1[i][0] = in.nextInt(); - query1[i][1] = in.nextInt(); - query1[i][2] = i; + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; } prepare(); compute(); for (int i = 2; i <= m; i++) { - ans[query1[i][2]] += ans[query1[i - 1][2]]; + ans[query[i][2]] += ans[query[i - 1][2]]; } for (int i = 1; i <= m; i++) { out.println(ans[i]); diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index 42b42252f..5e73aeaff 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -9,14 +9,10 @@ // //using namespace std; // -//struct Query1 { +//struct Query { // int l, r, id; //}; // -//struct Query2 { -// int pos, id, l, r, op; -//}; -// //const int MAXN = 100001; //const int MAXV = 1 << 14; //int n, m, k; @@ -24,8 +20,14 @@ //int kOneArr[MAXV]; //int cntk; // -//Query1 query1[MAXN]; -//Query2 query2[MAXN << 1]; +//Query query[MAXN]; +// +//int headq[MAXN]; +//int nextq[MAXN << 1]; +//int qid[MAXN << 1]; +//int ql[MAXN << 1]; +//int qr[MAXN << 1]; +//int qop[MAXN << 1]; //int cntq; // //int bi[MAXN]; @@ -34,17 +36,13 @@ // //long long ans[MAXN]; // -//bool Cmp1(Query1 &a, Query1 &b) { +//bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // -//bool Cmp2(Query2 &a, Query2 &b) { -// return a.pos < b.pos; -//} -// //int countOne(int num) { // int ret = 0; // while (num > 0) { @@ -54,12 +52,13 @@ // return ret; //} // -//void addQuery(int pos, int id, int l, int r, int op) { -// query2[++cntq].pos = pos; -// query2[cntq].id = id; -// query2[cntq].l = l; -// query2[cntq].r = r; -// query2[cntq].op = op; +//void addOffline(int x, int id, int l, int r, int op) { +// nextq[++cntq] = headq[x]; +// headq[x] = cntq; +// qid[cntq] = id; +// ql[cntq] = l; +// qr[cntq] = r; +// qop[cntq] = op; //} // //void prepare() { @@ -67,7 +66,7 @@ // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } -// sort(query1 + 1, query1 + m + 1, Cmp1); +// sort(query + 1, query + m + 1, QueryCmp); // for (int v = 0; v < MAXV; v++) { // if (countOne(v) == k) { // kOneArr[++cntk] = v; @@ -84,46 +83,45 @@ // } // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { -// int jobl = query1[i].l; -// int jobr = query1[i].r; -// int id = query1[i].id; +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; // if (winr < jobr) { -// addQuery(winl - 1, id, winr + 1, jobr, -1); +// addOffline(winl - 1, id, winr + 1, jobr, -1); // } // while (winr < jobr) { // ans[id] += pre[++winr]; // } // if (winr > jobr) { -// addQuery(winl - 1, id, jobr + 1, winr, 1); +// addOffline(winl - 1, id, jobr + 1, winr, 1); // } // while (winr > jobr) { // ans[id] -= pre[winr--]; // } // if (winl > jobl) { -// addQuery(winr, id, jobl, winl - 1, 1); +// addOffline(winr, id, jobl, winl - 1, 1); // } // while (winl > jobl) { // ans[id] -= pre[--winl]; // } // if (winl < jobl) { -// addQuery(winr, id, winl, jobl - 1, -1); +// addOffline(winr, id, winl, jobl - 1, -1); // } // while (winl < jobl) { // ans[id] += pre[winl++]; // } // } // memset(cnt, 0, sizeof(cnt)); -// sort(query2 + 1, query2 + cntq + 1, Cmp2); -// for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { -// if (pos >= 1) { +// for (int i = 0; i <= n; i++) { +// if (i >= 1) { // for (int j = 1; j <= cntk; j++) { -// cnt[arr[pos] ^ kOneArr[j]]++; +// cnt[arr[i] ^ kOneArr[j]]++; // } // } -// for (; qi <= cntq && query2[qi].pos == pos; qi++) { -// int id = query2[qi].id, l = query2[qi].l, r = query2[qi].r, op = query2[qi].op; +// for (int q = headq[i]; q > 0; q = nextq[q]) { +// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; // for (int j = l; j <= r; j++) { -// if (j <= pos && k == 0) { +// if (j <= i && k == 0) { // ans[id] += 1LL * op * (cnt[arr[j]] - 1); // } else { // ans[id] += 1LL * op * cnt[arr[j]]; @@ -141,13 +139,13 @@ // cin >> arr[i]; // } // for (int i = 1; i <= m; i++) { -// cin >> query1[i].l >> query1[i].r; -// query1[i].id = i; +// cin >> query[i].l >> query[i].r; +// query[i].id = i; // } // prepare(); // compute(); // for (int i = 2; i <= m; i++) { -// ans[query1[i].id] += ans[query1[i - 1].id]; +// ans[query[i].id] += ans[query[i - 1].id]; // } // for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java new file mode 100644 index 000000000..4fb358e65 --- /dev/null +++ b/src/class178/Code03_Abbi1.java @@ -0,0 +1,247 @@ +package class178; + +// 区间查询Abbi值,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5501 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code03_Abbi1 { + + public static int MAXN = 500001; + public static int MAXV = 100000; + public static int MAXB = 401; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static long[] presum = new long[MAXN]; + public static int[] bi = new int[MAXN]; + public static int[] br = new int[MAXB]; + + public static int[][] query = new int[MAXN][3]; + + public static int[] headq = new int[MAXN]; + public static int[] nextq = new int[MAXN << 1]; + public static int[] qid = new int[MAXN << 1]; + public static int[] ql = new int[MAXN << 1]; + public static int[] qr = new int[MAXN << 1]; + public static int[] qop = new int[MAXN << 1]; + public static int cntq; + + public static long[] treeCnt = new long[MAXV + 1]; + public static long[] treeSum = new long[MAXV + 1]; + + public static long[] pre = new long[MAXN]; + public static int[] cnt1 = new int[MAXB]; + public static int[] cnt2 = new int[MAXN]; + public static long[] sum1 = new long[MAXB]; + public static long[] sum2 = new long[MAXN]; + + public static long[] ans = new long[MAXN]; + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + return a[1] - b[1]; + } + } + + public static void addOffline(int x, int id, int l, int r, int op) { + nextq[++cntq] = headq[x]; + headq[x] = cntq; + qid[cntq] = id; + ql[cntq] = l; + qr[cntq] = r; + qop[cntq] = op; + } + + public static int lowbit(int x) { + return x & -x; + } + + public static void add(long[] tree, int x, int v) { + while (x <= MAXV) { + tree[x] += v; + x += lowbit(x); + } + } + + public static long sum(long[] tree, int x) { + long ret = 0; + while (x > 0) { + ret += tree[x]; + x -= lowbit(x); + } + return ret; + } + + public static void addVal(int val) { + if (val <= 0) { + return; + } + for (int b = bi[val]; b <= bi[MAXV]; b++) { + cnt1[b]++; + sum1[b] += val; + } + for (int i = val; i <= br[bi[val]]; i++) { + cnt2[i]++; + sum2[i] += val; + } + } + + public static long getSum(int x) { + if (x <= 0) { + return 0; + } + return sum1[bi[x] - 1] + sum2[x]; + } + + public static int getCnt(int x) { + if (x <= 0) { + return 0; + } + return cnt1[bi[x] - 1] + cnt2[x]; + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + presum[i] = presum[i - 1] + arr[i]; + } + int blen = (int) Math.sqrt(MAXV); + int bnum = (MAXV + blen - 1) / blen; + for (int i = 1; i <= MAXV; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int b = 1; b <= bnum; b++) { + br[b] = Math.min(b * blen, MAXV); + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void compute() { + for (int i = 1; i <= n; i++) { + pre[i] = pre[i - 1] + sum(treeCnt, arr[i] - 1) * arr[i] + sum(treeSum, MAXV) - sum(treeSum, arr[i]); + add(treeCnt, arr[i], 1); + add(treeSum, arr[i], arr[i]); + } + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; + if (winr < jobr) { + addOffline(winl - 1, id, winr + 1, jobr, -1); + ans[id] += pre[jobr] - pre[winr]; + } + if (winr > jobr) { + addOffline(winl - 1, id, jobr + 1, winr, 1); + ans[id] -= pre[winr] - pre[jobr]; + } + winr = jobr; + if (winl > jobl) { + addOffline(winr, id, jobl, winl - 1, 1); + ans[id] -= pre[winl - 1] - pre[jobl - 1]; + + } + if (winl < jobl) { + addOffline(winr, id, winl, jobl - 1, -1); + ans[id] += pre[jobl - 1] - pre[winl - 1]; + } + winl = jobl; + } + long sum = 0; + long tmp; + for (int i = 0; i <= n; i++) { + if (i >= 1) { + addVal(arr[i]); + sum += arr[i]; + } + for (int q = headq[i]; q > 0; q = nextq[q]) { + int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + for (int j = l; j <= r; j++) { + tmp = (long) getCnt(arr[j] - 1) * arr[j] + sum - getSum(arr[j]); + if (op == 1) { + ans[id] += tmp; + } else { + ans[id] -= tmp; + } + } + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 2; i <= m; i++) { + ans[query[i][2]] += ans[query[i - 1][2]]; + } + for (int i = 1; i <= m; i++) { + ans[query[i][2]] += presum[query[i][1]] - presum[query[i][0] - 1]; + } + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java new file mode 100644 index 000000000..6c3b008f2 --- /dev/null +++ b/src/class178/Code03_Abbi2.java @@ -0,0 +1,202 @@ +package class178; + +// 区间查询Abbi值,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5501 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 500001; +//const int MAXV = 100000; +//const int MAXB = 401; +// +//int n, m; +//int arr[MAXN]; +//long long presum[MAXN]; +//int bi[MAXN]; +//int br[MAXB]; +// +//Query query[MAXN]; +// +//int headq[MAXN]; +//int nextq[MAXN << 1]; +//int qid[MAXN << 1]; +//int ql[MAXN << 1]; +//int qr[MAXN << 1]; +//int qop[MAXN << 1]; +//int cntq; +// +//long long treeCnt[MAXV + 1]; +//long long treeSum[MAXV + 1]; +// +//long long pre[MAXN]; +//int cnt1[MAXB]; +//int cnt2[MAXN]; +//long long sum1[MAXB]; +//long long sum2[MAXN]; +// +//long long ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// return a.r < b.r; +//} +// +//void addOffline(int x, int id, int l, int r, int op) { +// nextq[++cntq] = headq[x]; +// headq[x] = cntq; +// qid[cntq] = id; +// ql[cntq] = l; +// qr[cntq] = r; +// qop[cntq] = op; +//} +// +//int lowbit(int x) { +// return x & -x; +//} +// +//void bitAdd(long long *tree, int x, long long v) { +// while (x <= MAXV) { +// tree[x] += v; +// x += lowbit(x); +// } +//} +// +//long long bitSum(long long *tree, int x) { +// long long ret = 0; +// while (x > 0) { +// ret += tree[x]; +// x -= lowbit(x); +// } +// return ret; +//} +// +//void addVal(int val) { +// if (val <= 0) { +// return; +// } +// for (int b = bi[val]; b <= bi[MAXV]; b++) { +// cnt1[b]++; +// sum1[b] += val; +// } +// for (int i = val; i <= br[bi[val]]; i++) { +// cnt2[i]++; +// sum2[i] += val; +// } +//} +// +//long long getSum(int x) { +// if (x <= 0) { +// return 0; +// } +// return sum1[bi[x] - 1] + sum2[x]; +//} +// +//int getCnt(int x) { +// if (x <= 0) { +// return 0; +// } +// return cnt1[bi[x] - 1] + cnt2[x]; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// presum[i] = presum[i - 1] + arr[i]; +// } +// int blen = (int)std::sqrt(MAXV); +// int bnum = (MAXV + blen - 1) / blen; +// for (int i = 1; i <= MAXV; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int b = 1; b <= bnum; b++) { +// br[b] = min(b * blen, MAXV); +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//void compute() { +// for (int i = 1; i <= n; i++) { +// pre[i] = pre[i - 1] +// + bitSum(treeCnt, arr[i] - 1) * arr[i] +// + bitSum(treeSum, MAXV) - bitSum(treeSum, arr[i]); +// bitAdd(treeCnt, arr[i], 1); +// bitAdd(treeSum, arr[i], arr[i]); +// } +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; +// if (winr < jobr) { +// addOffline(winl - 1, id, winr + 1, jobr, -1); +// ans[id] += pre[jobr] - pre[winr]; +// } +// if (winr > jobr) { +// addOffline(winl - 1, id, jobr + 1, winr, 1); +// ans[id] -= pre[winr] - pre[jobr]; +// } +// winr = jobr; +// if (winl > jobl) { +// addOffline(winr, id, jobl, winl - 1, 1); +// ans[id] -= pre[winl - 1] - pre[jobl - 1]; +// } +// if (winl < jobl) { +// addOffline(winr, id, winl, jobl - 1, -1); +// ans[id] += pre[jobl - 1] - pre[winl - 1]; +// } +// winl = jobl; +// } +// long long sum = 0; +// long long tmp; +// for (int i = 0; i <= n; i++) { +// if (i >= 1) { +// addVal(arr[i]); +// sum += arr[i]; +// } +// for (int q = headq[i]; q > 0; q = nextq[q]) { +// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// for (int j = l; j <= r; j++) { +// tmp = 1LL * getCnt(arr[j] - 1) * arr[j] + sum - getSum(arr[j]); +// if (op == 1) { +// ans[id] += tmp; +// } else { +// ans[id] -= tmp; +// } +// } +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 2; i <= m; i++) { +// ans[query[i].id] += ans[query[i - 1].id]; +// } +// for (int i = 1; i <= m; i++) { +// ans[query[i].id] += presum[query[i].r] - presum[query[i].l - 1]; +// } +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From d20384c7094c42eb9e6372150331daf15606b886 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 9 Sep 2025 17:19:21 +0800 Subject: [PATCH 0682/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 72 +++++++++++----------- src/class178/Code02_OfflineInversion2.java | 60 +++++++++--------- src/class178/Code04_Gosick1.java | 54 ++++++++-------- src/class178/Code04_Gosick2.java | 54 ++++++++-------- 4 files changed, 118 insertions(+), 122 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 7007eb958..4f5c49f31 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -23,11 +23,9 @@ public class Code02_OfflineInversion1 { public static int[] sorted = new int[MAXN]; public static int cntv; - // 第一次离线任务,l、r、id - // 第二次离线任务,pos、id、l、r、op - public static int[][] query1 = new int[MAXN][3]; - public static int[][] lquery = new int[MAXN][5]; - public static int[][] rquery = new int[MAXN][5]; + public static int[][] query = new int[MAXN][3]; + public static int[][] loffline = new int[MAXN][5]; + public static int[][] roffline = new int[MAXN][5]; public static int cntl, cntr; // bi用于序列分块、值域分块,bl和br用于值域分块 @@ -49,7 +47,7 @@ public class Code02_OfflineInversion1 { public static long[] ans = new long[MAXN]; - public static class Cmp1 implements Comparator { + public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { @@ -59,7 +57,7 @@ public int compare(int[] a, int[] b) { } } - public static class Cmp2 implements Comparator { + public static class OfflineCmp implements Comparator { @Override public int compare(int[] a, int[] b) { return a[0] - b[0]; @@ -104,20 +102,20 @@ public static void clear() { Arrays.fill(tree, 1, cntv + 1, 0); } - public static void addLeftQuery(int pos, int id, int l, int r, int op) { - lquery[++cntl][0] = pos; - lquery[cntl][1] = id; - lquery[cntl][2] = l; - lquery[cntl][3] = r; - lquery[cntl][4] = op; + public static void addLeftOffline(int pos, int id, int l, int r, int op) { + loffline[++cntl][0] = pos; + loffline[cntl][1] = id; + loffline[cntl][2] = l; + loffline[cntl][3] = r; + loffline[cntl][4] = op; } - public static void addRightQuery(int pos, int id, int l, int r, int op) { - rquery[++cntr][0] = pos; - rquery[cntr][1] = id; - rquery[cntr][2] = l; - rquery[cntr][3] = r; - rquery[cntr][4] = op; + public static void addRightOffline(int pos, int id, int l, int r, int op) { + roffline[++cntr][0] = pos; + roffline[cntr][1] = id; + roffline[cntr][2] = l; + roffline[cntr][3] = r; + roffline[cntr][4] = op; } public static void addLeftCnt(int val) { @@ -171,7 +169,7 @@ public static void prepare() { bl[i] = (i - 1) * blen + 1; br[i] = Math.min(i * blen, cntv); } - Arrays.sort(query1, 1, m + 1, new Cmp1()); + Arrays.sort(query, 1, m + 1, new QueryCmp()); } public static void compute() { @@ -186,36 +184,36 @@ public static void compute() { } int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { - int jobl = query1[i][0]; - int jobr = query1[i][1]; - int id = query1[i][2]; + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; if (winr < jobr) { - addLeftQuery(winl - 1, id, winr + 1, jobr, -1); + addLeftOffline(winl - 1, id, winr + 1, jobr, -1); ans[id] += pre[jobr] - pre[winr]; } if (winr > jobr) { - addLeftQuery(winl - 1, id, jobr + 1, winr, 1); + addLeftOffline(winl - 1, id, jobr + 1, winr, 1); ans[id] -= pre[winr] - pre[jobr]; } winr = jobr; if (winl > jobl) { - addRightQuery(winr + 1, id, jobl, winl - 1, -1); + addRightOffline(winr + 1, id, jobl, winl - 1, -1); ans[id] += suf[jobl] - suf[winl]; } if (winl < jobl) { - addRightQuery(winr + 1, id, winl, jobl - 1, 1); + addRightOffline(winr + 1, id, winl, jobl - 1, 1); ans[id] -= suf[winl] - suf[jobl]; } winl = jobl; } - Arrays.sort(lquery, 1, cntl + 1, new Cmp2()); - Arrays.sort(rquery, 1, cntr + 1, new Cmp2()); + Arrays.sort(loffline, 1, cntl + 1, new OfflineCmp()); + Arrays.sort(roffline, 1, cntr + 1, new OfflineCmp()); for (int pos = 0, qi = 1; pos <= n && qi <= cntl; pos++) { if (pos >= 1) { addLeftCnt(arr[pos] - 1); } - for (; qi <= cntl && lquery[qi][0] == pos; qi++) { - int id = lquery[qi][1], l = lquery[qi][2], r = lquery[qi][3], op = lquery[qi][4]; + for (; qi <= cntl && loffline[qi][0] == pos; qi++) { + int id = loffline[qi][1], l = loffline[qi][2], r = loffline[qi][3], op = loffline[qi][4]; long ret = 0; for (int j = l; j <= r; j++) { ret += getCnt(arr[j]); @@ -229,8 +227,8 @@ public static void compute() { if (pos <= n) { addRightCnt(arr[pos] + 1); } - for (; qi >= 1 && rquery[qi][0] == pos; qi--) { - int id = rquery[qi][1], l = rquery[qi][2], r = rquery[qi][3], op = rquery[qi][4]; + for (; qi >= 1 && roffline[qi][0] == pos; qi--) { + int id = roffline[qi][1], l = roffline[qi][2], r = roffline[qi][3], op = roffline[qi][4]; long ret = 0; for (int j = l; j <= r; j++) { ret += getCnt(arr[j]); @@ -249,14 +247,14 @@ public static void main(String[] args) throws Exception { arr[i] = in.nextInt(); } for (int i = 1; i <= m; i++) { - query1[i][0] = in.nextInt(); - query1[i][1] = in.nextInt(); - query1[i][2] = i; + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; } prepare(); compute(); for (int i = 2; i <= m; i++) { - ans[query1[i][2]] += ans[query1[i - 1][2]]; + ans[query[i][2]] += ans[query[i - 1][2]]; } for (int i = 1; i <= m; i++) { out.println(ans[i]); diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index bf71b4ff7..5c2934612 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -9,11 +9,11 @@ // //using namespace std; // -//struct Query1 { +//struct Query { // int l, r, id; //}; // -//struct Query2 { +//struct Offline { // int pos, id, l, r, op; //}; // @@ -24,9 +24,9 @@ //int sorted[MAXN]; //int cntv; // -//Query1 query1[MAXN]; -//Query2 lquery[MAXN]; -//Query2 rquery[MAXN]; +//Query query1[MAXN]; +//Offline loffline[MAXN]; +//Offline roffline[MAXN]; //int cntl, cntr; // //int bi[MAXN]; @@ -42,14 +42,14 @@ // //long long ans[MAXN]; // -//bool Cmp1(Query1 &a, Query1 &b) { +//bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // -//bool Cmp2(Query2 &a, Query2 &b) { +//bool OfflineCmp(Offline &a, Offline &b) { // return a.pos < b.pos; //} // @@ -91,20 +91,20 @@ // memset(tree + 1, 0, cntv * sizeof(int)); //} // -//void addLeftQuery(int pos, int id, int l, int r, int op) { -// lquery[++cntl].pos = pos; -// lquery[cntl].id = id; -// lquery[cntl].l = l; -// lquery[cntl].r = r; -// lquery[cntl].op = op; +//void addLeftOffline(int pos, int id, int l, int r, int op) { +// loffline[++cntl].pos = pos; +// loffline[cntl].id = id; +// loffline[cntl].l = l; +// loffline[cntl].r = r; +// loffline[cntl].op = op; //} // -//void addRightQuery(int pos, int id, int l, int r, int op) { -// rquery[++cntr].pos = pos; -// rquery[cntr].id = id; -// rquery[cntr].l = l; -// rquery[cntr].r = r; -// rquery[cntr].op = op; +//void addRightOffline(int pos, int id, int l, int r, int op) { +// roffline[++cntr].pos = pos; +// roffline[cntr].id = id; +// roffline[cntr].l = l; +// roffline[cntr].r = r; +// roffline[cntr].op = op; //} // //void addLeftCnt(int val) { @@ -158,7 +158,7 @@ // bl[i] = (i - 1) * blen + 1; // br[i] = min(i * blen, cntv); // } -// sort(query1 + 1, query1 + m + 1, Cmp1); +// sort(query1 + 1, query1 + m + 1, QueryCmp); //} // //void compute() { @@ -177,32 +177,32 @@ // int jobr = query1[i].r; // int id = query1[i].id; // if (winr < jobr) { -// addLeftQuery(winl - 1, id, winr + 1, jobr, -1); +// addLeftOffline(winl - 1, id, winr + 1, jobr, -1); // ans[id] += pre[jobr] - pre[winr]; // } // if (winr > jobr) { -// addLeftQuery(winl - 1, id, jobr + 1, winr, 1); +// addLeftOffline(winl - 1, id, jobr + 1, winr, 1); // ans[id] -= pre[winr] - pre[jobr]; // } // winr = jobr; // if (winl > jobl) { -// addRightQuery(winr + 1, id, jobl, winl - 1, -1); +// addRightOffline(winr + 1, id, jobl, winl - 1, -1); // ans[id] += suf[jobl] - suf[winl]; // } // if (winl < jobl) { -// addRightQuery(winr + 1, id, winl, jobl - 1, 1); +// addRightOffline(winr + 1, id, winl, jobl - 1, 1); // ans[id] -= suf[winl] - suf[jobl]; // } // winl = jobl; // } -// sort(lquery + 1, lquery + cntl + 1, Cmp2); -// sort(rquery + 1, rquery + cntr + 1, Cmp2); +// sort(loffline + 1, loffline + cntl + 1, OfflineCmp); +// sort(roffline + 1, roffline + cntr + 1, OfflineCmp); // for (int pos = 0, qi = 1; pos <= n && qi <= cntl; pos++) { // if (pos >= 1) { // addLeftCnt(arr[pos] - 1); // } -// for (; qi <= cntl && lquery[qi].pos == pos; qi++) { -// int id = lquery[qi].id, l = lquery[qi].l, r = lquery[qi].r, op = lquery[qi].op; +// for (; qi <= cntl && loffline[qi].pos == pos; qi++) { +// int id = loffline[qi].id, l = loffline[qi].l, r = loffline[qi].r, op = loffline[qi].op; // long long ret = 0; // for (int j = l; j <= r; j++) { // ret += getCnt(arr[j]); @@ -216,8 +216,8 @@ // if (pos <= n) { // addRightCnt(arr[pos] + 1); // } -// for (; qi >= 1 && rquery[qi].pos == pos; qi--) { -// int id = rquery[qi].id, l = rquery[qi].l, r = rquery[qi].r, op = rquery[qi].op; +// for (; qi >= 1 && roffline[qi].pos == pos; qi--) { +// int id = roffline[qi].id, l = roffline[qi].l, r = roffline[qi].r, op = roffline[qi].op; // long long ret = 0; // for (int j = l; j <= r; j++) { // ret += getCnt(arr[j]); diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 7be189708..dbcfd9f3d 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -29,10 +29,8 @@ public class Code04_Gosick1 { public static int[] fac = new int[MAXF]; public static int cntf; - // l、r、id - public static int[][] query1 = new int[MAXN][3]; - // pos、id、l、r、op - public static int[][] query2 = new int[MAXN << 1][5]; + public static int[][] query = new int[MAXN][3]; + public static int[][] offline = new int[MAXN << 1][5]; public static int cntq; public static int[] fcnt = new int[MAXN]; @@ -44,7 +42,7 @@ public class Code04_Gosick1 { public static long[] ans = new long[MAXN]; - public static class Cmp1 implements Comparator { + public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { if (bi[a[0]] != bi[b[0]]) { @@ -54,7 +52,7 @@ public int compare(int[] a, int[] b) { } } - public static class Cmp2 implements Comparator { + public static class OfflineCmp implements Comparator { @Override public int compare(int[] a, int[] b) { return a[0] - b[0]; @@ -73,12 +71,12 @@ public static void addFactors(int num) { } } - public static void addQuery(int pos, int id, int l, int r, int op) { - query2[++cntq][0] = pos; - query2[cntq][1] = id; - query2[cntq][2] = l; - query2[cntq][3] = r; - query2[cntq][4] = op; + public static void addOffline(int pos, int id, int l, int r, int op) { + offline[++cntq][0] = pos; + offline[cntq][1] = id; + offline[cntq][2] = l; + offline[cntq][3] = r; + offline[cntq][4] = op; } public static void compute() { @@ -99,29 +97,29 @@ public static void compute() { } int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { - int jobl = query1[i][0]; - int jobr = query1[i][1]; - int id = query1[i][2]; + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; if (winr < jobr) { - addQuery(winl - 1, id, winr + 1, jobr, -1); + addOffline(winl - 1, id, winr + 1, jobr, -1); ans[id] += pre[jobr] - pre[winr]; } if (winr > jobr) { - addQuery(winl - 1, id, jobr + 1, winr, 1); + addOffline(winl - 1, id, jobr + 1, winr, 1); ans[id] -= pre[winr] - pre[jobr]; } winr = jobr; if (winl > jobl) { - addQuery(winr, id, jobl, winl - 1, 1); + addOffline(winr, id, jobl, winl - 1, 1); ans[id] -= pre[winl - 1] - pre[jobl - 1]; } if (winl < jobl) { - addQuery(winr, id, winl, jobl - 1, -1); + addOffline(winr, id, winl, jobl - 1, -1); ans[id] += pre[jobl - 1] - pre[winl - 1]; } winl = jobl; } - Arrays.sort(query2, 1, cntq + 1, new Cmp2()); + Arrays.sort(offline, 1, cntq + 1, new OfflineCmp()); Arrays.fill(fcnt, 0); for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { if (pos >= 1) { @@ -140,8 +138,8 @@ public static void compute() { } } } - for (; qi <= cntq && query2[qi][0] == pos; qi++) { - int id = query2[qi][1], l = query2[qi][2], r = query2[qi][3], op = query2[qi][4]; + for (; qi <= cntq && offline[qi][0] == pos; qi++) { + int id = offline[qi][1], l = offline[qi][2], r = offline[qi][3], op = offline[qi][4]; for (int i = l; i <= r; i++) { ans[id] += (long) op * fcnt[arr[i]]; } @@ -154,7 +152,7 @@ public static void compute() { cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); } for (int i = 1; i <= cntq; i++) { - int pos = query2[i][0], id = query2[i][1], l = query2[i][2], r = query2[i][3], op = query2[i][4]; + int pos = offline[i][0], id = offline[i][1], l = offline[i][2], r = offline[i][3], op = offline[i][4]; ans[id] += (long) op * cnt1[pos] * (cnt2[r] - cnt2[l - 1]); } } @@ -167,7 +165,7 @@ public static void prepare() { maxv = Math.max(maxv, arr[i]); addFactors(arr[i]); } - Arrays.sort(query1, 1, m + 1, new Cmp1()); + Arrays.sort(query, 1, m + 1, new QueryCmp()); } public static void main(String[] args) throws Exception { @@ -179,14 +177,14 @@ public static void main(String[] args) throws Exception { arr[i] = in.nextInt(); } for (int i = 1; i <= m; i++) { - query1[i][0] = in.nextInt(); - query1[i][1] = in.nextInt(); - query1[i][2] = i; + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; } prepare(); compute(); for (int i = 2; i <= m; i++) { - ans[query1[i][2]] += ans[query1[i - 1][2]]; + ans[query[i][2]] += ans[query[i - 1][2]]; } for (int i = 1; i <= m; i++) { out.println(ans[i]); diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index 96bd5e00b..2c977cc2a 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -9,11 +9,11 @@ // //using namespace std; // -//struct Query1 { +//struct Query { // int l, r, id; //}; // -//struct Query2 { +//struct Offline { // int pos, id, l, r, op; //}; // @@ -29,8 +29,8 @@ //int fac[MAXF]; //int cntf; // -//Query1 query1[MAXN]; -//Query2 query2[MAXN << 1]; +//Query query[MAXN]; +//Offline offline[MAXN << 1]; //int cntq; // //int fcnt[MAXN]; @@ -42,14 +42,14 @@ // //long long ans[MAXN]; // -//bool Cmp1(Query1 &a, Query1 &b) { +//bool QueryCmp(Query &a, Query &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } // return a.r < b.r; //} // -//bool Cmp2(Query2 &a, Query2 &b) { +//bool OfflineCmp(Offline &a, Offline &b) { // return a.pos < b.pos; //} // @@ -65,12 +65,12 @@ // } //} // -//void addQuery(int pos, int id, int l, int r, int op) { -// query2[++cntq].pos = pos; -// query2[cntq].id = id; -// query2[cntq].l = l; -// query2[cntq].r = r; -// query2[cntq].op = op; +//void addOffline(int pos, int id, int l, int r, int op) { +// offline[++cntq].pos = pos; +// offline[cntq].id = id; +// offline[cntq].l = l; +// offline[cntq].r = r; +// offline[cntq].op = op; //} // //void compute() { @@ -91,29 +91,29 @@ // } // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { -// int jobl = query1[i].l; -// int jobr = query1[i].r; -// int id = query1[i].id; +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; // if (winr < jobr) { -// addQuery(winl - 1, id, winr + 1, jobr, -1); +// addOffline(winl - 1, id, winr + 1, jobr, -1); // ans[id] += pre[jobr] - pre[winr]; // } // if (winr > jobr) { -// addQuery(winl - 1, id, jobr + 1, winr, 1); +// addOffline(winl - 1, id, jobr + 1, winr, 1); // ans[id] -= pre[winr] - pre[jobr]; // } // winr = jobr; // if (winl > jobl) { -// addQuery(winr, id, jobl, winl - 1, 1); +// addOffline(winr, id, jobl, winl - 1, 1); // ans[id] -= pre[winl - 1] - pre[jobl - 1]; // } // if (winl < jobl) { -// addQuery(winr, id, winl, jobl - 1, -1); +// addOffline(winr, id, winl, jobl - 1, -1); // ans[id] += pre[jobl - 1] - pre[winl - 1]; // } // winl = jobl; // } -// sort(query2 + 1, query2 + cntq + 1, Cmp2); +// sort(offline + 1, offline + cntq + 1, OfflineCmp); // memset(fcnt, 0, sizeof(fcnt)); // for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { // if (pos >= 1) { @@ -132,8 +132,8 @@ // } // } // } -// for (; qi <= cntq && query2[qi].pos == pos; qi++) { -// int id = query2[qi].id, l = query2[qi].l, r = query2[qi].r, op = query2[qi].op; +// for (; qi <= cntq && offline[qi].pos == pos; qi++) { +// int id = offline[qi].id, l = offline[qi].l, r = offline[qi].r, op = offline[qi].op; // for (int i = l; i <= r; i++) { // ans[id] += 1LL * op * fcnt[arr[i]]; // } @@ -147,7 +147,7 @@ // cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); // } // for (int i = 1; i <= cntq; i++) { -// int pos = query2[i].pos, id = query2[i].id, l = query2[i].l, r = query2[i].r, op = query2[i].op; +// int pos = offline[i].pos, id = offline[i].id, l = offline[i].l, r = offline[i].r, op = offline[i].op; // ans[id] += 1LL * op * cnt1[pos] * (cnt2[r] - cnt2[l - 1]); // } // } @@ -160,7 +160,7 @@ // maxv = max(maxv, arr[i]); // addFactors(arr[i]); // } -// sort(query1 + 1, query1 + m + 1, Cmp1); +// sort(query + 1, query + m + 1, QueryCmp); //} // //int main() { @@ -171,13 +171,13 @@ // cin >> arr[i]; // } // for (int i = 1; i <= m; i++) { -// cin >> query1[i].l >> query1[i].r; -// query1[i].id = i; +// cin >> query[i].l >> query[i].r; +// query[i].id = i; // } // prepare(); // compute(); // for (int i = 2; i <= m; i++) { -// ans[query1[i].id] += ans[query1[i - 1].id]; +// ans[query[i].id] += ans[query[i - 1].id]; // } // for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; From b39734fe15ebcf5be897dbe573b281059a4b2628 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 9 Sep 2025 18:34:06 +0800 Subject: [PATCH 0683/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 67 +++++++++-------- src/class178/Code02_OfflineInversion2.java | 85 +++++++++++----------- src/class178/Code04_Gosick1.java | 65 ++++++++--------- src/class178/Code04_Gosick2.java | 66 ++++++++--------- 4 files changed, 140 insertions(+), 143 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 4f5c49f31..c9b1f31e1 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -24,9 +24,15 @@ public class Code02_OfflineInversion1 { public static int cntv; public static int[][] query = new int[MAXN][3]; - public static int[][] loffline = new int[MAXN][5]; - public static int[][] roffline = new int[MAXN][5]; - public static int cntl, cntr; + + public static int[] headl = new int[MAXN]; + public static int[] headr = new int[MAXN]; + public static int[] nextq = new int[MAXN << 1]; + public static int[] qid = new int[MAXN << 1]; + public static int[] ql = new int[MAXN << 1]; + public static int[] qr = new int[MAXN << 1]; + public static int[] qop = new int[MAXN << 1]; + public static int cntq; // bi用于序列分块、值域分块,bl和br用于值域分块 public static int[] bi = new int[MAXN]; @@ -57,13 +63,6 @@ public int compare(int[] a, int[] b) { } } - public static class OfflineCmp implements Comparator { - @Override - public int compare(int[] a, int[] b) { - return a[0] - b[0]; - } - } - public static int kth(int num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { @@ -102,20 +101,22 @@ public static void clear() { Arrays.fill(tree, 1, cntv + 1, 0); } - public static void addLeftOffline(int pos, int id, int l, int r, int op) { - loffline[++cntl][0] = pos; - loffline[cntl][1] = id; - loffline[cntl][2] = l; - loffline[cntl][3] = r; - loffline[cntl][4] = op; + public static void addLeftOffline(int x, int id, int l, int r, int op) { + nextq[++cntq] = headl[x]; + headl[x] = cntq; + qid[cntq] = id; + ql[cntq] = l; + qr[cntq] = r; + qop[cntq] = op; } - public static void addRightOffline(int pos, int id, int l, int r, int op) { - roffline[++cntr][0] = pos; - roffline[cntr][1] = id; - roffline[cntr][2] = l; - roffline[cntr][3] = r; - roffline[cntr][4] = op; + public static void addRightOffline(int x, int id, int l, int r, int op) { + nextq[++cntq] = headr[x]; + headr[x] = cntq; + qid[cntq] = id; + ql[cntq] = l; + qr[cntq] = r; + qop[cntq] = op; } public static void addLeftCnt(int val) { @@ -206,14 +207,12 @@ public static void compute() { } winl = jobl; } - Arrays.sort(loffline, 1, cntl + 1, new OfflineCmp()); - Arrays.sort(roffline, 1, cntr + 1, new OfflineCmp()); - for (int pos = 0, qi = 1; pos <= n && qi <= cntl; pos++) { - if (pos >= 1) { - addLeftCnt(arr[pos] - 1); + for (int i = 0; i <= n; i++) { + if (i >= 1) { + addLeftCnt(arr[i] - 1); } - for (; qi <= cntl && loffline[qi][0] == pos; qi++) { - int id = loffline[qi][1], l = loffline[qi][2], r = loffline[qi][3], op = loffline[qi][4]; + for (int q = headl[i]; q > 0; q = nextq[q]) { + int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; long ret = 0; for (int j = l; j <= r; j++) { ret += getCnt(arr[j]); @@ -223,12 +222,12 @@ public static void compute() { } Arrays.fill(lazy, 0); Arrays.fill(cnt, 0); - for (int pos = n + 1, qi = cntr; pos >= 1 && qi >= 1; pos--) { - if (pos <= n) { - addRightCnt(arr[pos] + 1); + for (int i = n + 1; i >= 1; i--) { + if (i <= n) { + addRightCnt(arr[i] + 1); } - for (; qi >= 1 && roffline[qi][0] == pos; qi--) { - int id = roffline[qi][1], l = roffline[qi][2], r = roffline[qi][3], op = roffline[qi][4]; + for (int q = headr[i]; q > 0; q = nextq[q]) { + int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; long ret = 0; for (int j = l; j <= r; j++) { ret += getCnt(arr[j]); diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index 5c2934612..db0740fef 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -13,21 +13,24 @@ // int l, r, id; //}; // -//struct Offline { -// int pos, id, l, r, op; -//}; -// //const int MAXN = 100002; //const int MAXB = 401; +// //int n, m; //int arr[MAXN]; //int sorted[MAXN]; //int cntv; // -//Query query1[MAXN]; -//Offline loffline[MAXN]; -//Offline roffline[MAXN]; -//int cntl, cntr; +//Query query[MAXN]; +// +//int headl[MAXN]; +//int headr[MAXN]; +//int nextq[MAXN << 1]; +//int qid[MAXN << 1]; +//int ql[MAXN << 1]; +//int qr[MAXN << 1]; +//int qop[MAXN << 1]; +//int cntq; // //int bi[MAXN]; //int bl[MAXB]; @@ -49,10 +52,6 @@ // return a.r < b.r; //} // -//bool OfflineCmp(Offline &a, Offline &b) { -// return a.pos < b.pos; -//} -// //int kth(int num) { // int left = 1, right = cntv, ret = 0; // while (left <= right) { @@ -91,20 +90,22 @@ // memset(tree + 1, 0, cntv * sizeof(int)); //} // -//void addLeftOffline(int pos, int id, int l, int r, int op) { -// loffline[++cntl].pos = pos; -// loffline[cntl].id = id; -// loffline[cntl].l = l; -// loffline[cntl].r = r; -// loffline[cntl].op = op; +//void addLeftOffline(int x, int id, int l, int r, int op) { +// nextq[++cntq] = headl[x]; +// headl[x] = cntq; +// qid[cntq] = id; +// ql[cntq] = l; +// qr[cntq] = r; +// qop[cntq] = op; //} // -//void addRightOffline(int pos, int id, int l, int r, int op) { -// roffline[++cntr].pos = pos; -// roffline[cntr].id = id; -// roffline[cntr].l = l; -// roffline[cntr].r = r; -// roffline[cntr].op = op; +//void addRightOffline(int x, int id, int l, int r, int op) { +// nextq[++cntq] = headr[x]; +// headr[x] = cntq; +// qid[cntq] = id; +// ql[cntq] = l; +// qr[cntq] = r; +// qop[cntq] = op; //} // //void addLeftCnt(int val) { @@ -158,7 +159,7 @@ // bl[i] = (i - 1) * blen + 1; // br[i] = min(i * blen, cntv); // } -// sort(query1 + 1, query1 + m + 1, QueryCmp); +// sort(query + 1, query + m + 1, QueryCmp); //} // //void compute() { @@ -173,9 +174,9 @@ // } // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { -// int jobl = query1[i].l; -// int jobr = query1[i].r; -// int id = query1[i].id; +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; // if (winr < jobr) { // addLeftOffline(winl - 1, id, winr + 1, jobr, -1); // ans[id] += pre[jobr] - pre[winr]; @@ -195,14 +196,12 @@ // } // winl = jobl; // } -// sort(loffline + 1, loffline + cntl + 1, OfflineCmp); -// sort(roffline + 1, roffline + cntr + 1, OfflineCmp); -// for (int pos = 0, qi = 1; pos <= n && qi <= cntl; pos++) { -// if (pos >= 1) { -// addLeftCnt(arr[pos] - 1); +// for (int i = 0; i <= n; i++) { +// if (i >= 1) { +// addLeftCnt(arr[i] - 1); // } -// for (; qi <= cntl && loffline[qi].pos == pos; qi++) { -// int id = loffline[qi].id, l = loffline[qi].l, r = loffline[qi].r, op = loffline[qi].op; +// for (int q = headl[i]; q > 0; q = nextq[q]) { +// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; // long long ret = 0; // for (int j = l; j <= r; j++) { // ret += getCnt(arr[j]); @@ -212,12 +211,12 @@ // } // memset(lazy, 0, sizeof(lazy)); // memset(cnt, 0, sizeof(cnt)); -// for (int pos = n + 1, qi = cntr; pos >= 1 && qi >= 1; pos--) { -// if (pos <= n) { -// addRightCnt(arr[pos] + 1); +// for (int i = n + 1; i >= 1; i--) { +// if (i <= n) { +// addRightCnt(arr[i] + 1); // } -// for (; qi >= 1 && roffline[qi].pos == pos; qi--) { -// int id = roffline[qi].id, l = roffline[qi].l, r = roffline[qi].r, op = roffline[qi].op; +// for (int q = headr[i]; q > 0; q = nextq[q]) { +// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; // long long ret = 0; // for (int j = l; j <= r; j++) { // ret += getCnt(arr[j]); @@ -235,13 +234,13 @@ // cin >> arr[i]; // } // for (int i = 1; i <= m; i++) { -// cin >> query1[i].l >> query1[i].r; -// query1[i].id = i; +// cin >> query[i].l >> query[i].r; +// query[i].id = i; // } // prepare(); // compute(); // for (int i = 2; i <= m; i++) { -// ans[query1[i].id] += ans[query1[i - 1].id]; +// ans[query[i].id] += ans[query[i - 1].id]; // } // for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index dbcfd9f3d..c7c66e9ac 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -23,14 +23,19 @@ public class Code04_Gosick1 { public static int[] arr = new int[MAXN]; public static int[] bi = new int[MAXN]; - // 每个数的因子表 - public static int[] head = new int[MAXN]; - public static int[] nxt = new int[MAXF]; + public static int[] headf = new int[MAXN]; + public static int[] nextf = new int[MAXF]; public static int[] fac = new int[MAXF]; public static int cntf; public static int[][] query = new int[MAXN][3]; - public static int[][] offline = new int[MAXN << 1][5]; + public static int[] headq = new int[MAXN]; + public static int[] nextq = new int[MAXN << 1]; + public static int[] qx = new int[MAXN << 1]; + public static int[] qid = new int[MAXN << 1]; + public static int[] ql = new int[MAXN << 1]; + public static int[] qr = new int[MAXN << 1]; + public static int[] qop = new int[MAXN << 1]; public static int cntq; public static int[] fcnt = new int[MAXN]; @@ -52,37 +57,32 @@ public int compare(int[] a, int[] b) { } } - public static class OfflineCmp implements Comparator { - @Override - public int compare(int[] a, int[] b) { - return a[0] - b[0]; - } - } - public static void addFactors(int num) { - if (head[num] == 0) { + if (headf[num] == 0) { for (int f = 1; f * f <= num; f++) { if (num % f == 0) { - nxt[++cntf] = head[num]; + nextf[++cntf] = headf[num]; fac[cntf] = f; - head[num] = cntf; + headf[num] = cntf; } } } } - public static void addOffline(int pos, int id, int l, int r, int op) { - offline[++cntq][0] = pos; - offline[cntq][1] = id; - offline[cntq][2] = l; - offline[cntq][3] = r; - offline[cntq][4] = op; + public static void addOffline(int x, int id, int l, int r, int op) { + nextq[++cntq] = headq[x]; + headq[x] = cntq; + qx[cntq] = x; + qid[cntq] = id; + ql[cntq] = l; + qr[cntq] = r; + qop[cntq] = op; } public static void compute() { for (int i = 1, x; i <= n; i++) { x = arr[i]; - for (int e = head[x], f, other; e > 0; e = nxt[e]) { + for (int e = headf[x], f, other; e > 0; e = nextf[e]) { f = fac[e]; other = x / f; fcnt[f]++; @@ -119,12 +119,11 @@ public static void compute() { } winl = jobl; } - Arrays.sort(offline, 1, cntq + 1, new OfflineCmp()); Arrays.fill(fcnt, 0); - for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { - if (pos >= 1) { - int num = arr[pos]; - for (int e = head[num], f, other; e > 0; e = nxt[e]) { + for (int i = 0; i <= n; i++) { + if (i >= 1) { + int num = arr[i]; + for (int e = headf[num], f, other; e > 0; e = nextf[e]) { f = fac[e]; other = num / f; fcnt[f]++; @@ -138,10 +137,10 @@ public static void compute() { } } } - for (; qi <= cntq && offline[qi][0] == pos; qi++) { - int id = offline[qi][1], l = offline[qi][2], r = offline[qi][3], op = offline[qi][4]; - for (int i = l; i <= r; i++) { - ans[id] += (long) op * fcnt[arr[i]]; + for (int q = headq[i]; q > 0; q = nextq[q]) { + int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + for (int j = l; j <= r; j++) { + ans[id] += (long) op * fcnt[arr[j]]; } } } @@ -152,8 +151,8 @@ public static void compute() { cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); } for (int i = 1; i <= cntq; i++) { - int pos = offline[i][0], id = offline[i][1], l = offline[i][2], r = offline[i][3], op = offline[i][4]; - ans[id] += (long) op * cnt1[pos] * (cnt2[r] - cnt2[l - 1]); + int x = qx[i], id = qid[i], l = ql[i], r = qr[i], op = qop[i]; + ans[id] += (long) op * cnt1[x] * (cnt2[r] - cnt2[l - 1]); } } } @@ -232,4 +231,4 @@ int nextInt() throws IOException { } } -} \ No newline at end of file +} diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index 2c977cc2a..a66fbb051 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -13,24 +13,27 @@ // int l, r, id; //}; // -//struct Offline { -// int pos, id, l, r, op; -//}; -// //const int MAXN = 500001; //const int MAXF = 5000001; //const int LIMIT = 80; +// //int n, m, maxv; //int arr[MAXN]; //int bi[MAXN]; // -//int head[MAXN]; -//int nxt[MAXF]; +//int headf[MAXN]; +//int nextf[MAXF]; //int fac[MAXF]; //int cntf; // //Query query[MAXN]; -//Offline offline[MAXN << 1]; +//int headq[MAXN]; +//int nextq[MAXN << 1]; +//int qx[MAXN << 1]; +//int qid[MAXN << 1]; +//int ql[MAXN << 1]; +//int qr[MAXN << 1]; +//int qop[MAXN << 1]; //int cntq; // //int fcnt[MAXN]; @@ -49,34 +52,32 @@ // return a.r < b.r; //} // -//bool OfflineCmp(Offline &a, Offline &b) { -// return a.pos < b.pos; -//} -// //void addFactors(int num) { -// if (head[num] == 0) { +// if (headf[num] == 0) { // for (int f = 1; f * f <= num; f++) { // if (num % f == 0) { -// nxt[++cntf] = head[num]; +// nextf[++cntf] = headf[num]; // fac[cntf] = f; -// head[num] = cntf; +// headf[num] = cntf; // } // } // } //} // -//void addOffline(int pos, int id, int l, int r, int op) { -// offline[++cntq].pos = pos; -// offline[cntq].id = id; -// offline[cntq].l = l; -// offline[cntq].r = r; -// offline[cntq].op = op; +//void addOffline(int x, int id, int l, int r, int op) { +// nextq[++cntq] = headq[x]; +// headq[x] = cntq; +// qx[cntq] = x; +// qid[cntq] = id; +// ql[cntq] = l; +// qr[cntq] = r; +// qop[cntq] = op; //} // //void compute() { // for (int i = 1, x; i <= n; i++) { // x = arr[i]; -// for (int e = head[x], f, other; e > 0; e = nxt[e]) { +// for (int e = headf[x], f, other; e > 0; e = nextf[e]) { // f = fac[e]; // other = x / f; // fcnt[f]++; @@ -113,12 +114,11 @@ // } // winl = jobl; // } -// sort(offline + 1, offline + cntq + 1, OfflineCmp); // memset(fcnt, 0, sizeof(fcnt)); -// for (int pos = 0, qi = 1; pos <= n && qi <= cntq; pos++) { -// if (pos >= 1) { -// int num = arr[pos]; -// for (int e = head[num], f, other; e > 0; e = nxt[e]) { +// for (int i = 0; i <= n; i++) { +// if (i >= 1) { +// int num = arr[i]; +// for (int e = headf[num], f, other; e > 0; e = nextf[e]) { // f = fac[e]; // other = num / f; // fcnt[f]++; @@ -132,10 +132,10 @@ // } // } // } -// for (; qi <= cntq && offline[qi].pos == pos; qi++) { -// int id = offline[qi].id, l = offline[qi].l, r = offline[qi].r, op = offline[qi].op; -// for (int i = l; i <= r; i++) { -// ans[id] += 1LL * op * fcnt[arr[i]]; +// for (int q = headq[i]; q > 0; q = nextq[q]) { +// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// for (int j = l; j <= r; j++) { +// ans[id] += 1LL * op * fcnt[arr[j]]; // } // } // } @@ -146,9 +146,9 @@ // cnt1[i] = cnt1[i - 1] + (arr[i] == v ? 1 : 0); // cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); // } -// for (int i = 1; i <= cntq; i++) { -// int pos = offline[i].pos, id = offline[i].id, l = offline[i].l, r = offline[i].r, op = offline[i].op; -// ans[id] += 1LL * op * cnt1[pos] * (cnt2[r] - cnt2[l - 1]); +// for(int i = 1; i <= cntq; i++) { +// int x = qx[i], id = qid[i], l = ql[i], r = qr[i], op = qop[i]; +// ans[id] += 1LL * op * cnt1[x] * (cnt2[r] - cnt2[l - 1]); // } // } //} From 6cd31f838907be1a95b0b6faf36705babd4866e7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 9 Sep 2025 18:36:57 +0800 Subject: [PATCH 0684/1170] modify code --- src/class178/Code03_Abbi1.java | 2 +- src/class178/Code03_Abbi2.java | 2 +- src/class178/Code04_Gosick1.java | 2 +- src/class178/Code04_Gosick2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 4fb358e65..44c503def 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -1,6 +1,6 @@ package class178; -// 区间查询Abbi值,java版 +// 查询Abbi值,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5501 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index 6c3b008f2..7368439e1 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -1,6 +1,6 @@ package class178; -// 区间查询Abbi值,C++版 +// 查询Abbi值,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P5501 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index c7c66e9ac..e27fa0eba 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -1,6 +1,6 @@ package class178; -// 区间查倍数,java版 +// 查询倍数,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index a66fbb051..7d8757ee1 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -1,6 +1,6 @@ package class178; -// 区间查倍数,C++版 +// 查询倍数,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 3a34c6dab10f6ea4380307a523ce57304e9255d9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 9 Sep 2025 21:10:45 +0800 Subject: [PATCH 0685/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 30 +++++++++++++----------- src/class178/Code01_MoOfflineTwice2.java | 22 +++++++---------- src/class178/Code03_Abbi1.java | 1 - 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index fc2560b30..a87cd9112 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -38,8 +38,8 @@ public class Code01_MoOfflineTwice1 { public static int cntq; public static int[] bi = new int[MAXN]; - public static int[] pre = new int[MAXN]; public static int[] cnt = new int[MAXV]; + public static long[] pre = new long[MAXN]; public static long[] ans = new long[MAXN]; @@ -86,7 +86,7 @@ public static void prepare() { public static void compute() { for (int i = 1; i <= n; i++) { - pre[i] = cnt[arr[i]]; + pre[i] = pre[i - 1] + cnt[arr[i]]; for (int j = 1; j <= cntk; j++) { cnt[arr[i] ^ kOneArr[j]]++; } @@ -98,28 +98,22 @@ public static void compute() { int id = query[i][2]; if (winr < jobr) { addOffline(winl - 1, id, winr + 1, jobr, -1); - } - while (winr < jobr) { - ans[id] += pre[++winr]; + ans[id] += pre[jobr] - pre[winr]; } if (winr > jobr) { addOffline(winl - 1, id, jobr + 1, winr, 1); + ans[id] -= pre[winr] - pre[jobr]; } - while (winr > jobr) { - ans[id] -= pre[winr--]; - } + winr = jobr; if (winl > jobl) { addOffline(winr, id, jobl, winl - 1, 1); - } - while (winl > jobl) { - ans[id] -= pre[--winl]; + ans[id] -= pre[winl - 1] - pre[jobl - 1]; } if (winl < jobl) { addOffline(winr, id, winl, jobl - 1, -1); + ans[id] += pre[jobl - 1] - pre[winl - 1]; } - while (winl < jobl) { - ans[id] += pre[winl++]; - } + winl = jobl; } // 第二次离线 Arrays.fill(cnt, 0); @@ -132,9 +126,17 @@ public static void compute() { for (int q = headq[i]; q > 0; q = nextq[q]) { int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; for (int j = l; j <= r; j++) { + // 计算j 对 1..i范围的贡献 + // 此时1..i范围上的数字都更新过cnt if (j <= i && k == 0) { + // j在1..i范围上,此时又有k==0 + // 那么arr[j]一定更新过cnt,并且(arr[j], arr[j])一定算进贡献了 + // 但是题目要求的二元组必须是不同位置,所以贡献要进行减1修正 ans[id] += (long) op * (cnt[arr[j]] - 1); } else { + // 要么j不在1..i范围上,arr[j]没更新过cnt + // 要么k!=0,(arr[j], arr[j])无法被算成贡献 + // 无论哪种情况,贡献都是正确的,不用进行减1修正 ans[id] += (long) op * cnt[arr[j]]; } } diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index 5e73aeaff..cdc0c735f 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -31,8 +31,8 @@ //int cntq; // //int bi[MAXN]; -//int pre[MAXN]; //int cnt[MAXV]; +//long long pre[MAXN]; // //long long ans[MAXN]; // @@ -76,7 +76,7 @@ // //void compute() { // for (int i = 1; i <= n; i++) { -// pre[i] = cnt[arr[i]]; +// pre[i] = pre[i - 1] + cnt[arr[i]]; // for (int j = 1; j <= cntk; j++) { // cnt[arr[i] ^ kOneArr[j]]++; // } @@ -88,28 +88,22 @@ // int id = query[i].id; // if (winr < jobr) { // addOffline(winl - 1, id, winr + 1, jobr, -1); -// } -// while (winr < jobr) { -// ans[id] += pre[++winr]; +// ans[id] += pre[jobr] - pre[winr]; // } // if (winr > jobr) { // addOffline(winl - 1, id, jobr + 1, winr, 1); +// ans[id] -= pre[winr] - pre[jobr]; // } -// while (winr > jobr) { -// ans[id] -= pre[winr--]; -// } +// winr = jobr; // if (winl > jobl) { // addOffline(winr, id, jobl, winl - 1, 1); -// } -// while (winl > jobl) { -// ans[id] -= pre[--winl]; +// ans[id] -= pre[winl - 1] - pre[jobl - 1]; // } // if (winl < jobl) { // addOffline(winr, id, winl, jobl - 1, -1); +// ans[id] += pre[jobl - 1] - pre[winl - 1]; // } -// while (winl < jobl) { -// ans[id] += pre[winl++]; -// } +// winl = jobl; // } // memset(cnt, 0, sizeof(cnt)); // for (int i = 0; i <= n; i++) { diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 44c503def..b2db74069 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -148,7 +148,6 @@ public static void compute() { if (winl > jobl) { addOffline(winr, id, jobl, winl - 1, 1); ans[id] -= pre[winl - 1] - pre[jobl - 1]; - } if (winl < jobl) { addOffline(winr, id, winl, jobl - 1, -1); From 8269643c73a560a50899e5e9fbc0a05c115066a6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 10:43:11 +0800 Subject: [PATCH 0686/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 10 +++++----- src/class178/Code02_OfflineInversion2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index c9b1f31e1..bd2375f4d 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -198,11 +198,11 @@ public static void compute() { } winr = jobr; if (winl > jobl) { - addRightOffline(winr + 1, id, jobl, winl - 1, -1); + addRightOffline(winr, id, jobl, winl - 1, -1); ans[id] += suf[jobl] - suf[winl]; } if (winl < jobl) { - addRightOffline(winr + 1, id, winl, jobl - 1, 1); + addRightOffline(winr, id, winl, jobl - 1, 1); ans[id] -= suf[winl] - suf[jobl]; } winl = jobl; @@ -223,9 +223,6 @@ public static void compute() { Arrays.fill(lazy, 0); Arrays.fill(cnt, 0); for (int i = n + 1; i >= 1; i--) { - if (i <= n) { - addRightCnt(arr[i] + 1); - } for (int q = headr[i]; q > 0; q = nextq[q]) { int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; long ret = 0; @@ -234,6 +231,9 @@ public static void compute() { } ans[id] += ret * op; } + if (i <= n) { + addRightCnt(arr[i] + 1); + } } } diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index db0740fef..405f83802 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -187,11 +187,11 @@ // } // winr = jobr; // if (winl > jobl) { -// addRightOffline(winr + 1, id, jobl, winl - 1, -1); +// addRightOffline(winr, id, jobl, winl - 1, -1); // ans[id] += suf[jobl] - suf[winl]; // } // if (winl < jobl) { -// addRightOffline(winr + 1, id, winl, jobl - 1, 1); +// addRightOffline(winr, id, winl, jobl - 1, 1); // ans[id] -= suf[winl] - suf[jobl]; // } // winl = jobl; @@ -212,9 +212,6 @@ // memset(lazy, 0, sizeof(lazy)); // memset(cnt, 0, sizeof(cnt)); // for (int i = n + 1; i >= 1; i--) { -// if (i <= n) { -// addRightCnt(arr[i] + 1); -// } // for (int q = headr[i]; q > 0; q = nextq[q]) { // int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; // long long ret = 0; @@ -223,6 +220,9 @@ // } // ans[id] += ret * op; // } +// if (i <= n) { +// addRightCnt(arr[i] + 1); +// } // } //} // From db84838385de3bb6ca3985f475b4d7b1fd6d6c86 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 10:50:44 +0800 Subject: [PATCH 0687/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 19 +++++++++---------- src/class178/Code01_MoOfflineTwice2.java | 16 ++++++++-------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index a87cd9112..85a47aaea 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -24,17 +24,16 @@ public class Code01_MoOfflineTwice1 { public static int cntk; // 莫队任务,l、r、id - // 第二次离线任务,pos、id、l、r、op public static int[][] query = new int[MAXN][3]; - // 第二次离线任务,x、id、l、r、op + // 第二次离线任务,x、l、r、op、id // 位置x的任务列表用链式前向星表示 public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; - public static int[] qid = new int[MAXN << 1]; public static int[] ql = new int[MAXN << 1]; public static int[] qr = new int[MAXN << 1]; public static int[] qop = new int[MAXN << 1]; + public static int[] qid = new int[MAXN << 1]; public static int cntq; public static int[] bi = new int[MAXN]; @@ -62,13 +61,13 @@ public static int countOne(int num) { return ret; } - public static void addOffline(int x, int id, int l, int r, int op) { + public static void addOffline(int x, int l, int r, int op, int id) { nextq[++cntq] = headq[x]; headq[x] = cntq; - qid[cntq] = id; ql[cntq] = l; qr[cntq] = r; qop[cntq] = op; + qid[cntq] = id; } public static void prepare() { @@ -97,20 +96,20 @@ public static void compute() { int jobr = query[i][1]; int id = query[i][2]; if (winr < jobr) { - addOffline(winl - 1, id, winr + 1, jobr, -1); + addOffline(winl - 1, winr + 1, jobr, -1, id); ans[id] += pre[jobr] - pre[winr]; } if (winr > jobr) { - addOffline(winl - 1, id, jobr + 1, winr, 1); + addOffline(winl - 1, jobr + 1, winr, 1, id); ans[id] -= pre[winr] - pre[jobr]; } winr = jobr; if (winl > jobl) { - addOffline(winr, id, jobl, winl - 1, 1); + addOffline(winr, jobl, winl - 1, 1, id); ans[id] -= pre[winl - 1] - pre[jobl - 1]; } if (winl < jobl) { - addOffline(winr, id, winl, jobl - 1, -1); + addOffline(winr, winl, jobl - 1, -1, id); ans[id] += pre[jobl - 1] - pre[winl - 1]; } winl = jobl; @@ -124,7 +123,7 @@ public static void compute() { } } for (int q = headq[i]; q > 0; q = nextq[q]) { - int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { // 计算j 对 1..i范围的贡献 // 此时1..i范围上的数字都更新过cnt diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index cdc0c735f..8ef6ead48 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -24,10 +24,10 @@ // //int headq[MAXN]; //int nextq[MAXN << 1]; -//int qid[MAXN << 1]; //int ql[MAXN << 1]; //int qr[MAXN << 1]; //int qop[MAXN << 1]; +//int qid[MAXN << 1]; //int cntq; // //int bi[MAXN]; @@ -52,13 +52,13 @@ // return ret; //} // -//void addOffline(int x, int id, int l, int r, int op) { +//void addOffline(int x, int l, int r, int op, int id) { // nextq[++cntq] = headq[x]; // headq[x] = cntq; -// qid[cntq] = id; // ql[cntq] = l; // qr[cntq] = r; // qop[cntq] = op; +// qid[cntq] = id; //} // //void prepare() { @@ -87,20 +87,20 @@ // int jobr = query[i].r; // int id = query[i].id; // if (winr < jobr) { -// addOffline(winl - 1, id, winr + 1, jobr, -1); +// addOffline(winl - 1, winr + 1, jobr, -1, id); // ans[id] += pre[jobr] - pre[winr]; // } // if (winr > jobr) { -// addOffline(winl - 1, id, jobr + 1, winr, 1); +// addOffline(winl - 1, jobr + 1, winr, 1, id); // ans[id] -= pre[winr] - pre[jobr]; // } // winr = jobr; // if (winl > jobl) { -// addOffline(winr, id, jobl, winl - 1, 1); +// addOffline(winr, jobl, winl - 1, 1, id); // ans[id] -= pre[winl - 1] - pre[jobl - 1]; // } // if (winl < jobl) { -// addOffline(winr, id, winl, jobl - 1, -1); +// addOffline(winr, winl, jobl - 1, -1, id); // ans[id] += pre[jobl - 1] - pre[winl - 1]; // } // winl = jobl; @@ -113,7 +113,7 @@ // } // } // for (int q = headq[i]; q > 0; q = nextq[q]) { -// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { // if (j <= i && k == 0) { // ans[id] += 1LL * op * (cnt[arr[j]] - 1); From e3d43da2fae2064607d71318f6ba13af60c2f3be Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 10:53:55 +0800 Subject: [PATCH 0688/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 10 +++++----- src/class178/Code02_OfflineInversion2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index bd2375f4d..c9b1f31e1 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -198,11 +198,11 @@ public static void compute() { } winr = jobr; if (winl > jobl) { - addRightOffline(winr, id, jobl, winl - 1, -1); + addRightOffline(winr + 1, id, jobl, winl - 1, -1); ans[id] += suf[jobl] - suf[winl]; } if (winl < jobl) { - addRightOffline(winr, id, winl, jobl - 1, 1); + addRightOffline(winr + 1, id, winl, jobl - 1, 1); ans[id] -= suf[winl] - suf[jobl]; } winl = jobl; @@ -223,6 +223,9 @@ public static void compute() { Arrays.fill(lazy, 0); Arrays.fill(cnt, 0); for (int i = n + 1; i >= 1; i--) { + if (i <= n) { + addRightCnt(arr[i] + 1); + } for (int q = headr[i]; q > 0; q = nextq[q]) { int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; long ret = 0; @@ -231,9 +234,6 @@ public static void compute() { } ans[id] += ret * op; } - if (i <= n) { - addRightCnt(arr[i] + 1); - } } } diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index 405f83802..db0740fef 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -187,11 +187,11 @@ // } // winr = jobr; // if (winl > jobl) { -// addRightOffline(winr, id, jobl, winl - 1, -1); +// addRightOffline(winr + 1, id, jobl, winl - 1, -1); // ans[id] += suf[jobl] - suf[winl]; // } // if (winl < jobl) { -// addRightOffline(winr, id, winl, jobl - 1, 1); +// addRightOffline(winr + 1, id, winl, jobl - 1, 1); // ans[id] -= suf[winl] - suf[jobl]; // } // winl = jobl; @@ -212,6 +212,9 @@ // memset(lazy, 0, sizeof(lazy)); // memset(cnt, 0, sizeof(cnt)); // for (int i = n + 1; i >= 1; i--) { +// if (i <= n) { +// addRightCnt(arr[i] + 1); +// } // for (int q = headr[i]; q > 0; q = nextq[q]) { // int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; // long long ret = 0; @@ -220,9 +223,6 @@ // } // ans[id] += ret * op; // } -// if (i <= n) { -// addRightCnt(arr[i] + 1); -// } // } //} // From 5b40e7b2e4a55af4ba82dbeaec3fde4c4b0f53f2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 10:58:34 +0800 Subject: [PATCH 0689/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 22 +++++++++++----------- src/class178/Code02_OfflineInversion2.java | 22 +++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index c9b1f31e1..6303a2149 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -28,10 +28,10 @@ public class Code02_OfflineInversion1 { public static int[] headl = new int[MAXN]; public static int[] headr = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; - public static int[] qid = new int[MAXN << 1]; public static int[] ql = new int[MAXN << 1]; public static int[] qr = new int[MAXN << 1]; public static int[] qop = new int[MAXN << 1]; + public static int[] qid = new int[MAXN << 1]; public static int cntq; // bi用于序列分块、值域分块,bl和br用于值域分块 @@ -101,22 +101,22 @@ public static void clear() { Arrays.fill(tree, 1, cntv + 1, 0); } - public static void addLeftOffline(int x, int id, int l, int r, int op) { + public static void addLeftOffline(int x, int l, int r, int op, int id) { nextq[++cntq] = headl[x]; headl[x] = cntq; - qid[cntq] = id; ql[cntq] = l; qr[cntq] = r; qop[cntq] = op; + qid[cntq] = id; } - public static void addRightOffline(int x, int id, int l, int r, int op) { + public static void addRightOffline(int x, int l, int r, int op, int id) { nextq[++cntq] = headr[x]; headr[x] = cntq; - qid[cntq] = id; ql[cntq] = l; qr[cntq] = r; qop[cntq] = op; + qid[cntq] = id; } public static void addLeftCnt(int val) { @@ -189,20 +189,20 @@ public static void compute() { int jobr = query[i][1]; int id = query[i][2]; if (winr < jobr) { - addLeftOffline(winl - 1, id, winr + 1, jobr, -1); + addLeftOffline(winl - 1, winr + 1, jobr, -1, id); ans[id] += pre[jobr] - pre[winr]; } if (winr > jobr) { - addLeftOffline(winl - 1, id, jobr + 1, winr, 1); + addLeftOffline(winl - 1, jobr + 1, winr, 1, id); ans[id] -= pre[winr] - pre[jobr]; } winr = jobr; if (winl > jobl) { - addRightOffline(winr + 1, id, jobl, winl - 1, -1); + addRightOffline(winr + 1, jobl, winl - 1, -1, id); ans[id] += suf[jobl] - suf[winl]; } if (winl < jobl) { - addRightOffline(winr + 1, id, winl, jobl - 1, 1); + addRightOffline(winr + 1, winl, jobl - 1, 1, id); ans[id] -= suf[winl] - suf[jobl]; } winl = jobl; @@ -212,7 +212,7 @@ public static void compute() { addLeftCnt(arr[i] - 1); } for (int q = headl[i]; q > 0; q = nextq[q]) { - int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; long ret = 0; for (int j = l; j <= r; j++) { ret += getCnt(arr[j]); @@ -227,7 +227,7 @@ public static void compute() { addRightCnt(arr[i] + 1); } for (int q = headr[i]; q > 0; q = nextq[q]) { - int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; long ret = 0; for (int j = l; j <= r; j++) { ret += getCnt(arr[j]); diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index db0740fef..73842ba6a 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -26,10 +26,10 @@ //int headl[MAXN]; //int headr[MAXN]; //int nextq[MAXN << 1]; -//int qid[MAXN << 1]; //int ql[MAXN << 1]; //int qr[MAXN << 1]; //int qop[MAXN << 1]; +//int qid[MAXN << 1]; //int cntq; // //int bi[MAXN]; @@ -90,22 +90,22 @@ // memset(tree + 1, 0, cntv * sizeof(int)); //} // -//void addLeftOffline(int x, int id, int l, int r, int op) { +//void addLeftOffline(int x, int l, int r, int op, int id) { // nextq[++cntq] = headl[x]; // headl[x] = cntq; -// qid[cntq] = id; // ql[cntq] = l; // qr[cntq] = r; // qop[cntq] = op; +// qid[cntq] = id; //} // -//void addRightOffline(int x, int id, int l, int r, int op) { +//void addRightOffline(int x, int l, int r, int op, int id) { // nextq[++cntq] = headr[x]; // headr[x] = cntq; -// qid[cntq] = id; // ql[cntq] = l; // qr[cntq] = r; // qop[cntq] = op; +// qid[cntq] = id; //} // //void addLeftCnt(int val) { @@ -178,20 +178,20 @@ // int jobr = query[i].r; // int id = query[i].id; // if (winr < jobr) { -// addLeftOffline(winl - 1, id, winr + 1, jobr, -1); +// addLeftOffline(winl - 1, winr + 1, jobr, -1, id); // ans[id] += pre[jobr] - pre[winr]; // } // if (winr > jobr) { -// addLeftOffline(winl - 1, id, jobr + 1, winr, 1); +// addLeftOffline(winl - 1, jobr + 1, winr, 1, id); // ans[id] -= pre[winr] - pre[jobr]; // } // winr = jobr; // if (winl > jobl) { -// addRightOffline(winr + 1, id, jobl, winl - 1, -1); +// addRightOffline(winr + 1, jobl, winl - 1, -1, id); // ans[id] += suf[jobl] - suf[winl]; // } // if (winl < jobl) { -// addRightOffline(winr + 1, id, winl, jobl - 1, 1); +// addRightOffline(winr + 1, winl, jobl - 1, 1, id); // ans[id] -= suf[winl] - suf[jobl]; // } // winl = jobl; @@ -201,7 +201,7 @@ // addLeftCnt(arr[i] - 1); // } // for (int q = headl[i]; q > 0; q = nextq[q]) { -// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // long long ret = 0; // for (int j = l; j <= r; j++) { // ret += getCnt(arr[j]); @@ -216,7 +216,7 @@ // addRightCnt(arr[i] + 1); // } // for (int q = headr[i]; q > 0; q = nextq[q]) { -// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // long long ret = 0; // for (int j = l; j <= r; j++) { // ret += getCnt(arr[j]); From b94ddf3f2e3a30bcce47ada5b8b0c3a80eb687e8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 11:05:38 +0800 Subject: [PATCH 0690/1170] modify code --- src/class178/Code03_Abbi1.java | 16 ++++++++-------- src/class178/Code03_Abbi2.java | 30 ++++++++++++++---------------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index b2db74069..610728cf7 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -26,10 +26,10 @@ public class Code03_Abbi1 { public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; - public static int[] qid = new int[MAXN << 1]; public static int[] ql = new int[MAXN << 1]; public static int[] qr = new int[MAXN << 1]; public static int[] qop = new int[MAXN << 1]; + public static int[] qid = new int[MAXN << 1]; public static int cntq; public static long[] treeCnt = new long[MAXV + 1]; @@ -53,13 +53,13 @@ public int compare(int[] a, int[] b) { } } - public static void addOffline(int x, int id, int l, int r, int op) { + public static void addOffline(int x, int l, int r, int op, int id) { nextq[++cntq] = headq[x]; headq[x] = cntq; - qid[cntq] = id; ql[cntq] = l; qr[cntq] = r; qop[cntq] = op; + qid[cntq] = id; } public static int lowbit(int x) { @@ -137,20 +137,20 @@ public static void compute() { int jobr = query[i][1]; int id = query[i][2]; if (winr < jobr) { - addOffline(winl - 1, id, winr + 1, jobr, -1); + addOffline(winl - 1, winr + 1, jobr, -1, id); ans[id] += pre[jobr] - pre[winr]; } if (winr > jobr) { - addOffline(winl - 1, id, jobr + 1, winr, 1); + addOffline(winl - 1, jobr + 1, winr, 1, id); ans[id] -= pre[winr] - pre[jobr]; } winr = jobr; if (winl > jobl) { - addOffline(winr, id, jobl, winl - 1, 1); + addOffline(winr, jobl, winl - 1, 1, id); ans[id] -= pre[winl - 1] - pre[jobl - 1]; } if (winl < jobl) { - addOffline(winr, id, winl, jobl - 1, -1); + addOffline(winr, winl, jobl - 1, -1, id); ans[id] += pre[jobl - 1] - pre[winl - 1]; } winl = jobl; @@ -163,7 +163,7 @@ public static void compute() { sum += arr[i]; } for (int q = headq[i]; q > 0; q = nextq[q]) { - int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { tmp = (long) getCnt(arr[j] - 1) * arr[j] + sum - getSum(arr[j]); if (op == 1) { diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index 7368439e1..65e6a773b 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -27,10 +27,10 @@ // //int headq[MAXN]; //int nextq[MAXN << 1]; -//int qid[MAXN << 1]; //int ql[MAXN << 1]; //int qr[MAXN << 1]; //int qop[MAXN << 1]; +//int qid[MAXN << 1]; //int cntq; // //long long treeCnt[MAXV + 1]; @@ -51,27 +51,27 @@ // return a.r < b.r; //} // -//void addOffline(int x, int id, int l, int r, int op) { +//void addOffline(int x, int l, int r, int op, int id) { // nextq[++cntq] = headq[x]; // headq[x] = cntq; -// qid[cntq] = id; // ql[cntq] = l; // qr[cntq] = r; // qop[cntq] = op; +// qid[cntq] = id; //} // //int lowbit(int x) { // return x & -x; //} // -//void bitAdd(long long *tree, int x, long long v) { +//void add(long long *tree, int x, long long v) { // while (x <= MAXV) { // tree[x] += v; // x += lowbit(x); // } //} // -//long long bitSum(long long *tree, int x) { +//long long sum(long long *tree, int x) { // long long ret = 0; // while (x > 0) { // ret += tree[x]; @@ -112,7 +112,7 @@ // for (int i = 1; i <= n; i++) { // presum[i] = presum[i - 1] + arr[i]; // } -// int blen = (int)std::sqrt(MAXV); +// int blen = (int)sqrt(MAXV); // int bnum = (MAXV + blen - 1) / blen; // for (int i = 1; i <= MAXV; i++) { // bi[i] = (i - 1) / blen + 1; @@ -125,11 +125,9 @@ // //void compute() { // for (int i = 1; i <= n; i++) { -// pre[i] = pre[i - 1] -// + bitSum(treeCnt, arr[i] - 1) * arr[i] -// + bitSum(treeSum, MAXV) - bitSum(treeSum, arr[i]); -// bitAdd(treeCnt, arr[i], 1); -// bitAdd(treeSum, arr[i], arr[i]); +// pre[i] = pre[i - 1] + sum(treeCnt, arr[i] - 1) * arr[i] + sum(treeSum, MAXV) - sum(treeSum, arr[i]); +// add(treeCnt, arr[i], 1); +// add(treeSum, arr[i], arr[i]); // } // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { @@ -137,20 +135,20 @@ // int jobr = query[i].r; // int id = query[i].id; // if (winr < jobr) { -// addOffline(winl - 1, id, winr + 1, jobr, -1); +// addOffline(winl - 1, winr + 1, jobr, -1, id); // ans[id] += pre[jobr] - pre[winr]; // } // if (winr > jobr) { -// addOffline(winl - 1, id, jobr + 1, winr, 1); +// addOffline(winl - 1, jobr + 1, winr, 1, id); // ans[id] -= pre[winr] - pre[jobr]; // } // winr = jobr; // if (winl > jobl) { -// addOffline(winr, id, jobl, winl - 1, 1); +// addOffline(winr, jobl, winl - 1, 1, id); // ans[id] -= pre[winl - 1] - pre[jobl - 1]; // } // if (winl < jobl) { -// addOffline(winr, id, winl, jobl - 1, -1); +// addOffline(winr, winl, jobl - 1, -1, id); // ans[id] += pre[jobl - 1] - pre[winl - 1]; // } // winl = jobl; @@ -163,7 +161,7 @@ // sum += arr[i]; // } // for (int q = headq[i]; q > 0; q = nextq[q]) { -// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { // tmp = 1LL * getCnt(arr[j] - 1) * arr[j] + sum - getSum(arr[j]); // if (op == 1) { From 2ae5f60fc2eaf0025374b79a73e8aa8a233437e3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 11:13:15 +0800 Subject: [PATCH 0691/1170] modify code --- src/class178/Code04_Gosick1.java | 18 +++++++++--------- src/class178/Code04_Gosick2.java | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index e27fa0eba..3b5541dad 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -32,10 +32,10 @@ public class Code04_Gosick1 { public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; public static int[] qx = new int[MAXN << 1]; - public static int[] qid = new int[MAXN << 1]; public static int[] ql = new int[MAXN << 1]; public static int[] qr = new int[MAXN << 1]; public static int[] qop = new int[MAXN << 1]; + public static int[] qid = new int[MAXN << 1]; public static int cntq; public static int[] fcnt = new int[MAXN]; @@ -69,14 +69,14 @@ public static void addFactors(int num) { } } - public static void addOffline(int x, int id, int l, int r, int op) { + public static void addOffline(int x, int l, int r, int op, int id) { nextq[++cntq] = headq[x]; headq[x] = cntq; qx[cntq] = x; - qid[cntq] = id; ql[cntq] = l; qr[cntq] = r; qop[cntq] = op; + qid[cntq] = id; } public static void compute() { @@ -101,20 +101,20 @@ public static void compute() { int jobr = query[i][1]; int id = query[i][2]; if (winr < jobr) { - addOffline(winl - 1, id, winr + 1, jobr, -1); + addOffline(winl - 1, winr + 1, jobr, -1, id); ans[id] += pre[jobr] - pre[winr]; } if (winr > jobr) { - addOffline(winl - 1, id, jobr + 1, winr, 1); + addOffline(winl - 1, jobr + 1, winr, 1, id); ans[id] -= pre[winr] - pre[jobr]; } winr = jobr; if (winl > jobl) { - addOffline(winr, id, jobl, winl - 1, 1); + addOffline(winr, jobl, winl - 1, 1, id); ans[id] -= pre[winl - 1] - pre[jobl - 1]; } if (winl < jobl) { - addOffline(winr, id, winl, jobl - 1, -1); + addOffline(winr, winl, jobl - 1, -1, id); ans[id] += pre[jobl - 1] - pre[winl - 1]; } winl = jobl; @@ -138,7 +138,7 @@ public static void compute() { } } for (int q = headq[i]; q > 0; q = nextq[q]) { - int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; + int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { ans[id] += (long) op * fcnt[arr[j]]; } @@ -151,7 +151,7 @@ public static void compute() { cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); } for (int i = 1; i <= cntq; i++) { - int x = qx[i], id = qid[i], l = ql[i], r = qr[i], op = qop[i]; + int x = qx[i], l = ql[i], r = qr[i], op = qop[i], id = qid[i]; ans[id] += (long) op * cnt1[x] * (cnt2[r] - cnt2[l - 1]); } } diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index 7d8757ee1..cb44b59c2 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -30,10 +30,10 @@ //int headq[MAXN]; //int nextq[MAXN << 1]; //int qx[MAXN << 1]; -//int qid[MAXN << 1]; //int ql[MAXN << 1]; //int qr[MAXN << 1]; //int qop[MAXN << 1]; +//int qid[MAXN << 1]; //int cntq; // //int fcnt[MAXN]; @@ -64,14 +64,14 @@ // } //} // -//void addOffline(int x, int id, int l, int r, int op) { +//void addOffline(int x, int l, int r, int op, int id) { // nextq[++cntq] = headq[x]; // headq[x] = cntq; // qx[cntq] = x; -// qid[cntq] = id; // ql[cntq] = l; // qr[cntq] = r; // qop[cntq] = op; +// qid[cntq] = id; //} // //void compute() { @@ -96,20 +96,20 @@ // int jobr = query[i].r; // int id = query[i].id; // if (winr < jobr) { -// addOffline(winl - 1, id, winr + 1, jobr, -1); +// addOffline(winl - 1, winr + 1, jobr, -1, id); // ans[id] += pre[jobr] - pre[winr]; // } // if (winr > jobr) { -// addOffline(winl - 1, id, jobr + 1, winr, 1); +// addOffline(winl - 1, jobr + 1, winr, 1, id); // ans[id] -= pre[winr] - pre[jobr]; // } // winr = jobr; // if (winl > jobl) { -// addOffline(winr, id, jobl, winl - 1, 1); +// addOffline(winr, jobl, winl - 1, 1, id); // ans[id] -= pre[winl - 1] - pre[jobl - 1]; // } // if (winl < jobl) { -// addOffline(winr, id, winl, jobl - 1, -1); +// addOffline(winr, winl, jobl - 1, -1, id); // ans[id] += pre[jobl - 1] - pre[winl - 1]; // } // winl = jobl; @@ -133,7 +133,7 @@ // } // } // for (int q = headq[i]; q > 0; q = nextq[q]) { -// int id = qid[q], l = ql[q], r = qr[q], op = qop[q]; +// int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { // ans[id] += 1LL * op * fcnt[arr[j]]; // } @@ -147,7 +147,7 @@ // cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); // } // for(int i = 1; i <= cntq; i++) { -// int x = qx[i], id = qid[i], l = ql[i], r = qr[i], op = qop[i]; +// int x = qx[i], l = ql[i], r = qr[i], op = qop[i], id = qid[i]; // ans[id] += 1LL * op * cnt1[x] * (cnt2[r] - cnt2[l - 1]); // } // } From c5b11d42409462efefa46064ecd58349a58f906f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 11:17:40 +0800 Subject: [PATCH 0692/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 6 +++++- src/class178/Code01_MoOfflineTwice2.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 85a47aaea..5d730a7c8 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -52,11 +52,15 @@ public int compare(int[] a, int[] b) { } } + public static int lowbit(int i) { + return i & -i; + } + public static int countOne(int num) { int ret = 0; while (num > 0) { ret++; - num -= num & -num; + num -= lowbit(num); } return ret; } diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index 8ef6ead48..9790edbe5 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -43,11 +43,15 @@ // return a.r < b.r; //} // +//int lowbit(int i) { +// return i & -i; +//} +// //int countOne(int num) { // int ret = 0; // while (num > 0) { // ret++; -// num -= num & -num; +// num -= lowbit(num); // } // return ret; //} From dae3c686fd431979a27c49bb9e1e4555bbb3277c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 11:27:28 +0800 Subject: [PATCH 0693/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 29 +++++++++++----------- src/class178/Code02_OfflineInversion2.java | 27 ++++++++++---------- src/class178/Code03_Abbi1.java | 1 - src/class178/Code03_Abbi2.java | 1 - 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 6303a2149..385c6818f 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -24,7 +24,6 @@ public class Code02_OfflineInversion1 { public static int cntv; public static int[][] query = new int[MAXN][3]; - public static int[] headl = new int[MAXN]; public static int[] headr = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; @@ -46,10 +45,10 @@ public class Code02_OfflineInversion1 { // 后缀信息 public static long[] suf = new long[MAXN]; + // 整块加了多少词频 + public static long[] cnt1 = new long[MAXB]; // 每种值加了多少词频 - public static long[] cnt = new long[MAXN]; - // 块的懒信息,整块加了多少词频 - public static long[] lazy = new long[MAXB]; + public static long[] cnt2 = new long[MAXN]; public static long[] ans = new long[MAXN]; @@ -123,11 +122,11 @@ public static void addLeftCnt(int val) { if (val <= 0) { return; } - for (int i = bl[bi[val]]; i <= val; i++) { - cnt[i]++; - } for (int b = 1; b <= bi[val] - 1; b++) { - lazy[b]++; + cnt1[b]++; + } + for (int i = bl[bi[val]]; i <= val; i++) { + cnt2[i]++; } } @@ -135,16 +134,16 @@ public static void addRightCnt(int val) { if (val > cntv) { return; } - for (int i = val; i <= br[bi[val]]; i++) { - cnt[i]++; - } for (int b = bi[val] + 1; b <= bi[cntv]; b++) { - lazy[b]++; + cnt1[b]++; + } + for (int i = val; i <= br[bi[val]]; i++) { + cnt2[i]++; } } public static long getCnt(int val) { - return cnt[val] + lazy[bi[val]]; + return cnt1[bi[val]] + cnt2[val]; } public static void prepare() { @@ -220,8 +219,8 @@ public static void compute() { ans[id] += ret * op; } } - Arrays.fill(lazy, 0); - Arrays.fill(cnt, 0); + Arrays.fill(cnt1, 0); + Arrays.fill(cnt2, 0); for (int i = n + 1; i >= 1; i--) { if (i <= n) { addRightCnt(arr[i] + 1); diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index 73842ba6a..862f6de45 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -22,7 +22,6 @@ //int cntv; // //Query query[MAXN]; -// //int headl[MAXN]; //int headr[MAXN]; //int nextq[MAXN << 1]; @@ -40,8 +39,8 @@ //long long pre[MAXN]; //long long suf[MAXN]; // -//long long cnt[MAXN]; -//long long lazy[MAXB]; +//long long cnt1[MAXB]; +//long long cnt2[MAXN]; // //long long ans[MAXN]; // @@ -112,11 +111,11 @@ // if (val <= 0) { // return; // } -// for (int i = bl[bi[val]]; i <= val; i++) { -// cnt[i]++; -// } // for (int b = 1; b <= bi[val] - 1; b++) { -// lazy[b]++; +// cnt1[b]++; +// } +// for (int i = bl[bi[val]]; i <= val; i++) { +// cnt2[i]++; // } //} // @@ -124,16 +123,16 @@ // if (val > cntv) { // return; // } -// for (int i = val; i <= br[bi[val]]; i++) { -// cnt[i]++; -// } // for (int b = bi[val] + 1; b <= bi[cntv]; b++) { -// lazy[b]++; +// cnt1[b]++; +// } +// for (int i = val; i <= br[bi[val]]; i++) { +// cnt2[i]++; // } //} // //long long getCnt(int val) { -// return cnt[val] + lazy[bi[val]]; +// return cnt1[bi[val]] + cnt2[val]; //} // //void prepare() { @@ -209,8 +208,8 @@ // ans[id] += ret * op; // } // } -// memset(lazy, 0, sizeof(lazy)); -// memset(cnt, 0, sizeof(cnt)); +// memset(cnt1, 0, sizeof(cnt1)); +// memset(cnt2, 0, sizeof(cnt2)); // for (int i = n + 1; i >= 1; i--) { // if (i <= n) { // addRightCnt(arr[i] + 1); diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 610728cf7..1bd413d0b 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -23,7 +23,6 @@ public class Code03_Abbi1 { public static int[] br = new int[MAXB]; public static int[][] query = new int[MAXN][3]; - public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; public static int[] ql = new int[MAXN << 1]; diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index 65e6a773b..ec1043163 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -24,7 +24,6 @@ //int br[MAXB]; // //Query query[MAXN]; -// //int headq[MAXN]; //int nextq[MAXN << 1]; //int ql[MAXN << 1]; From 6287152e3e1f1e74c25d11354a786f778e0f58cd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 11:30:02 +0800 Subject: [PATCH 0694/1170] modify code --- src/class178/Code03_Abbi1.java | 2 +- src/class178/Code03_Abbi2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 1bd413d0b..9b514c514 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -33,8 +33,8 @@ public class Code03_Abbi1 { public static long[] treeCnt = new long[MAXV + 1]; public static long[] treeSum = new long[MAXV + 1]; - public static long[] pre = new long[MAXN]; + public static int[] cnt1 = new int[MAXB]; public static int[] cnt2 = new int[MAXN]; public static long[] sum1 = new long[MAXB]; diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index ec1043163..b164b9d2c 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -34,8 +34,8 @@ // //long long treeCnt[MAXV + 1]; //long long treeSum[MAXV + 1]; -// //long long pre[MAXN]; +// //int cnt1[MAXB]; //int cnt2[MAXN]; //long long sum1[MAXB]; From 02e5f0e9402acff311dc0d6831c35764ff20f98f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 11:32:51 +0800 Subject: [PATCH 0695/1170] modify code --- src/class178/Code04_Gosick1.java | 3 ++- src/class178/Code04_Gosick2.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 3b5541dad..e840bda85 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -81,6 +81,7 @@ public static void addOffline(int x, int l, int r, int op, int id) { public static void compute() { for (int i = 1, x; i <= n; i++) { + pre[i] = pre[i - 1]; x = arr[i]; for (int e = headf[x], f, other; e > 0; e = nextf[e]) { f = fac[e]; @@ -92,7 +93,7 @@ public static void compute() { pre[i] += xcnt[other]; } } - pre[i] += fcnt[x] + pre[i - 1]; + pre[i] += fcnt[x]; xcnt[x]++; } int winl = 1, winr = 0; diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index cb44b59c2..6999de829 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -76,6 +76,7 @@ // //void compute() { // for (int i = 1, x; i <= n; i++) { +// pre[i] = pre[i - 1]; // x = arr[i]; // for (int e = headf[x], f, other; e > 0; e = nextf[e]) { // f = fac[e]; @@ -87,7 +88,7 @@ // pre[i] += xcnt[other]; // } // } -// pre[i] += fcnt[x] + pre[i - 1]; +// pre[i] += fcnt[x]; // xcnt[x]++; // } // int winl = 1, winr = 0; From d3aa1084b2b62ad2ac5345f041c52cf507a2de0f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 11:35:47 +0800 Subject: [PATCH 0696/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 5d730a7c8..2514f46cb 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -26,7 +26,7 @@ public class Code01_MoOfflineTwice1 { // 莫队任务,l、r、id public static int[][] query = new int[MAXN][3]; - // 第二次离线任务,x、l、r、op、id + // 离线任务,x、l、r、op、id // 位置x的任务列表用链式前向星表示 public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; @@ -94,6 +94,7 @@ public static void compute() { cnt[arr[i] ^ kOneArr[j]]++; } } + // 第一次离线,执行莫队 int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { int jobl = query[i][0]; @@ -118,7 +119,7 @@ public static void compute() { } winl = jobl; } - // 第二次离线 + // 第二次离线,执行离线任务 Arrays.fill(cnt, 0); for (int i = 0; i <= n; i++) { if (i >= 1) { From e0003172c75643746c9b35eb3706e5a64e8d8a1f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 11:39:02 +0800 Subject: [PATCH 0697/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 3 ++- src/class178/Code02_OfflineInversion2.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 385c6818f..c508b707a 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -1,6 +1,7 @@ package class178; -// 离线查询逆序对,java版 +// 允许离线查询逆序对,java版 +// 讲解173,题目4,必须在线查询区间逆序对,本题允许离线 // 测试链接 : https://www.luogu.com.cn/problem/P5047 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index 862f6de45..ec830ba7d 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -1,6 +1,7 @@ package class178; -// 离线查询逆序对,C++版 +// 允许离线查询逆序对,C++版 +// 讲解173,题目4,必须在线查询区间逆序对,本题允许离线 // 测试链接 : https://www.luogu.com.cn/problem/P5047 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 51822e60e633deedc421b0aa4128d1c9e93d423d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 11:41:23 +0800 Subject: [PATCH 0698/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 2 +- src/class178/Code02_OfflineInversion2.java | 2 +- src/class178/Code03_Abbi1.java | 2 +- src/class178/Code03_Abbi2.java | 2 +- src/class178/Code04_Gosick1.java | 2 +- src/class178/Code04_Gosick2.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index c508b707a..e06b34e81 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -1,6 +1,6 @@ package class178; -// 允许离线查询逆序对,java版 +// 区间逆序对,java版 // 讲解173,题目4,必须在线查询区间逆序对,本题允许离线 // 测试链接 : https://www.luogu.com.cn/problem/P5047 // 提交以下的code,提交时请把类名改成"Main" diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index ec830ba7d..b884e64aa 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -1,6 +1,6 @@ package class178; -// 允许离线查询逆序对,C++版 +// 区间逆序对,C++版 // 讲解173,题目4,必须在线查询区间逆序对,本题允许离线 // 测试链接 : https://www.luogu.com.cn/problem/P5047 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 9b514c514..9cbc05296 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -1,6 +1,6 @@ package class178; -// 查询Abbi值,java版 +// 区间Abbi值,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5501 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index b164b9d2c..1ee4d5729 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -1,6 +1,6 @@ package class178; -// 查询Abbi值,C++版 +// 区间Abbi值,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P5501 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index e840bda85..463dd1d6c 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -1,6 +1,6 @@ package class178; -// 查询倍数,java版 +// 区间倍数对,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index 6999de829..4032a849b 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -1,6 +1,6 @@ package class178; -// 查询倍数,C++版 +// 区间倍数对,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 7346c09d1592efb912cfabb5ce5532aa643da8ec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 12:17:51 +0800 Subject: [PATCH 0699/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 4 +--- src/class178/Code01_MoOfflineTwice2.java | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 2514f46cb..dd9a49c36 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -20,12 +20,12 @@ public class Code01_MoOfflineTwice1 { public static int MAXV = 1 << 14; public static int n, m, k; public static int[] arr = new int[MAXN]; + public static int[] bi = new int[MAXN]; public static int[] kOneArr = new int[MAXV]; public static int cntk; // 莫队任务,l、r、id public static int[][] query = new int[MAXN][3]; - // 离线任务,x、l、r、op、id // 位置x的任务列表用链式前向星表示 public static int[] headq = new int[MAXN]; @@ -36,10 +36,8 @@ public class Code01_MoOfflineTwice1 { public static int[] qid = new int[MAXN << 1]; public static int cntq; - public static int[] bi = new int[MAXN]; public static int[] cnt = new int[MAXV]; public static long[] pre = new long[MAXN]; - public static long[] ans = new long[MAXN]; public static class QueryCmp implements Comparator { diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index 9790edbe5..ce2c2fed3 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -17,11 +17,11 @@ //const int MAXV = 1 << 14; //int n, m, k; //int arr[MAXN]; +//int bi[MAXN]; //int kOneArr[MAXV]; //int cntk; // //Query query[MAXN]; -// //int headq[MAXN]; //int nextq[MAXN << 1]; //int ql[MAXN << 1]; @@ -30,10 +30,8 @@ //int qid[MAXN << 1]; //int cntq; // -//int bi[MAXN]; //int cnt[MAXV]; //long long pre[MAXN]; -// //long long ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { From 257405886fbade83267847d38b41470e79910281 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 13:12:00 +0800 Subject: [PATCH 0700/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 6 ++++++ src/class178/Code01_MoOfflineTwice2.java | 6 ++++++ src/class178/Code02_OfflineInversion1.java | 6 +++++- src/class178/Code02_OfflineInversion2.java | 6 +++++- src/class178/Code03_Abbi1.java | 7 +++++++ src/class178/Code03_Abbi2.java | 7 +++++++ src/class178/Code04_Gosick1.java | 7 ++++++- src/class178/Code04_Gosick2.java | 7 ++++++- 8 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index dd9a49c36..7e4df9b1d 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -1,6 +1,12 @@ package class178; // 莫队二次离线入门题,java版 +// 给定一个长度为n的数组arr,给定一个非负整数k,下面给出合法二元组的定义 +// 二元组(i, j),i和j必须是不同的,并且 arr[i]异或arr[j] 的二进制状态里有k个1 +// 二元组(i, j)和(j, i)认为是同一个二元组,不要重复统计 +// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少合法二元组 +// 1 <= n、m <= 10^5 +// 0 <= arr[i]、k < 16384(2的14次方) // 测试链接 : https://www.luogu.com.cn/problem/P4887 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index ce2c2fed3..4b6d528fd 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -1,6 +1,12 @@ package class178; // 莫队二次离线入门题,C++版 +// 给定一个长度为n的数组arr,给定一个非负整数k,下面给出合法二元组的定义 +// 二元组(i, j),i和j必须是不同的,并且 arr[i]异或arr[j] 的二进制状态里有k个1 +// 二元组(i, j)和(j, i)认为是同一个二元组,不要重复统计 +// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少合法二元组 +// 1 <= n、m <= 10^5 +// 0 <= arr[i]、k < 16384(2的14次方) // 测试链接 : https://www.luogu.com.cn/problem/P4887 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index e06b34e81..cc7ee9b5a 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -1,7 +1,11 @@ package class178; // 区间逆序对,java版 -// 讲解173,题目4,必须在线查询区间逆序对,本题允许离线 +// 给定一个长度为n的数组arr,如果i < j,并且arr[i] > arr[j],那么(i,j)就是逆序对 +// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,逆序对的数量 +// 1 <= n、m <= 10^5 +// 0 <= arr[i] <= 10^9 +// 本题允许离线,讲解173,题目4,讲了必须在线查询区间逆序对 // 测试链接 : https://www.luogu.com.cn/problem/P5047 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index b884e64aa..3aaf5ce8b 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -1,7 +1,11 @@ package class178; // 区间逆序对,C++版 -// 讲解173,题目4,必须在线查询区间逆序对,本题允许离线 +// 给定一个长度为n的数组arr,如果i < j,并且arr[i] > arr[j],那么(i,j)就是逆序对 +// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,逆序对的数量 +// 1 <= n、m <= 10^5 +// 0 <= arr[i] <= 10^9 +// 本题允许离线,讲解173,题目4,讲了必须在线查询区间逆序对 // 测试链接 : https://www.luogu.com.cn/problem/P5047 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 9cbc05296..d8ac48362 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -1,6 +1,13 @@ package class178; // 区间Abbi值,java版 +// 给定一个长度为n的数组arr,区间Abbi值的定义如下 +// 如果arr[l..r]包含数字v,并且v是第k小,那么这个数字的Abbi值 = v * k +// 区间Abbi值 = 区间内所有数字Abbi值的累加和 +// 比如[1, 2, 2, 3]的Abbi值 = 1 * 1 + 2 * 2 + 2 * 2 + 3 * 4 = 21 +// 一共有m条查询,格式为 l r : 打印arr[l..r]的区间Abbi值 +// 1 <= n、m <= 5 * 10^5 +// 1 <= arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5501 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index 1ee4d5729..239f3022d 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -1,6 +1,13 @@ package class178; // 区间Abbi值,C++版 +// 给定一个长度为n的数组arr,区间Abbi值的定义如下 +// 如果arr[l..r]包含数字v,并且v是第k小,那么这个数字的Abbi值 = v * k +// 区间Abbi值 = 区间内所有数字Abbi值的累加和 +// 比如[1, 2, 2, 3]的Abbi值 = 1 * 1 + 2 * 2 + 2 * 2 + 3 * 4 = 21 +// 一共有m条查询,格式为 l r : 打印arr[l..r]的区间Abbi值 +// 1 <= n、m <= 5 * 10^5 +// 1 <= arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5501 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 463dd1d6c..8999c6f78 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -1,6 +1,11 @@ package class178; -// 区间倍数对,java版 +// 区间倍数二元组,java版 +// 给定一个长度为n的数组arr,下面给出倍数二元组的定义 +// 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数,倍数>=1即可 +// 二元组(i, j)和(j, i)认为是不同的二元组,不要漏算 +// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少倍数二元组 +// 1 <= n、m、arr[i] <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index 4032a849b..77a911fe7 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -1,6 +1,11 @@ package class178; -// 区间倍数对,C++版 +// 区间倍数二元组,C++版 +// 给定一个长度为n的数组arr,下面给出倍数二元组的定义 +// 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数,倍数>=1即可 +// 二元组(i, j)和(j, i)认为是不同的二元组,不要漏算 +// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少倍数二元组 +// 1 <= n、m、arr[i] <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 2340fae31987395224e9279edfe262c4e142f0bb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 14:52:14 +0800 Subject: [PATCH 0701/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 4 ++-- src/class178/Code01_MoOfflineTwice2.java | 4 ++-- src/class178/Code04_Gosick1.java | 5 +++-- src/class178/Code04_Gosick2.java | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 7e4df9b1d..efeef3c72 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -2,8 +2,8 @@ // 莫队二次离线入门题,java版 // 给定一个长度为n的数组arr,给定一个非负整数k,下面给出合法二元组的定义 -// 二元组(i, j),i和j必须是不同的,并且 arr[i]异或arr[j] 的二进制状态里有k个1 -// 二元组(i, j)和(j, i)认为是同一个二元组,不要重复统计 +// 位置二元组(i, j),i和j必须是不同的,并且 arr[i]异或arr[j] 的二进制状态里有k个1 +// 当i != j时,(i, j)和(j, i)认为是相同的二元组 // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少合法二元组 // 1 <= n、m <= 10^5 // 0 <= arr[i]、k < 16384(2的14次方) diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index 4b6d528fd..0f73cff26 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -2,8 +2,8 @@ // 莫队二次离线入门题,C++版 // 给定一个长度为n的数组arr,给定一个非负整数k,下面给出合法二元组的定义 -// 二元组(i, j),i和j必须是不同的,并且 arr[i]异或arr[j] 的二进制状态里有k个1 -// 二元组(i, j)和(j, i)认为是同一个二元组,不要重复统计 +// 位置二元组(i, j),i和j必须是不同的,并且 arr[i]异或arr[j] 的二进制状态里有k个1 +// 当i != j时,(i, j)和(j, i)认为是相同的二元组 // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少合法二元组 // 1 <= n、m <= 10^5 // 0 <= arr[i]、k < 16384(2的14次方) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 8999c6f78..c9abfe466 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -2,8 +2,8 @@ // 区间倍数二元组,java版 // 给定一个长度为n的数组arr,下面给出倍数二元组的定义 -// 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数,倍数>=1即可 -// 二元组(i, j)和(j, i)认为是不同的二元组,不要漏算 +// 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数(>=1倍) +// 当i != j时,(i, j)和(j, i)认为是不同的二元组 // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少倍数二元组 // 1 <= n、m、arr[i] <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5398 @@ -174,6 +174,7 @@ public static void prepare() { } public static void main(String[] args) throws Exception { + System.out.println("测试"); FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index 77a911fe7..bdebce0b0 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -2,8 +2,8 @@ // 区间倍数二元组,C++版 // 给定一个长度为n的数组arr,下面给出倍数二元组的定义 -// 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数,倍数>=1即可 -// 二元组(i, j)和(j, i)认为是不同的二元组,不要漏算 +// 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数(>=1倍) +// 当i != j时,(i, j)和(j, i)认为是不同的二元组 // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少倍数二元组 // 1 <= n、m、arr[i] <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5398 From 741e33e657514c37bba0ae0082b16ba5ab0de982 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 16:05:39 +0800 Subject: [PATCH 0702/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 3 +++ src/class178/Code01_MoOfflineTwice2.java | 1 + 2 files changed, 4 insertions(+) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index efeef3c72..75268dc36 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -42,8 +42,11 @@ public class Code01_MoOfflineTwice1 { public static int[] qid = new int[MAXN << 1]; public static int cntq; + // cnt[v] : 当前的数字v作为第二个数,之前出现的数字作为第一个数,有多少合法的二元组 public static int[] cnt = new int[MAXV]; + // pre[i] : 单点信息的前缀和,课上重点图解了 public static long[] pre = new long[MAXN]; + public static long[] ans = new long[MAXN]; public static class QueryCmp implements Comparator { diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index 0f73cff26..b6fa69050 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -38,6 +38,7 @@ // //int cnt[MAXV]; //long long pre[MAXN]; +// //long long ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { From 22a02f5b5a5091fb42cde60ba6ce5b35abb773ee Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 16:06:50 +0800 Subject: [PATCH 0703/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 75268dc36..31c1e1bba 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -42,7 +42,7 @@ public class Code01_MoOfflineTwice1 { public static int[] qid = new int[MAXN << 1]; public static int cntq; - // cnt[v] : 当前的数字v作为第二个数,之前出现的数字作为第一个数,有多少合法的二元组 + // cnt[v] : 当前的数字v作为第二个数,之前出现的数字作为第一个数,产生多少合法二元组 public static int[] cnt = new int[MAXV]; // pre[i] : 单点信息的前缀和,课上重点图解了 public static long[] pre = new long[MAXN]; From 18d7920def647bf02c3bc0635c7b66d8ba38d6d3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 16:27:55 +0800 Subject: [PATCH 0704/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 6 +++--- src/class178/Code01_MoOfflineTwice2.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 31c1e1bba..539672608 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -1,10 +1,10 @@ package class178; // 莫队二次离线入门题,java版 -// 给定一个长度为n的数组arr,给定一个非负整数k,下面给出合法二元组的定义 +// 给定一个长度为n的数组arr,给定一个非负整数k,下面给出k1二元组的定义 // 位置二元组(i, j),i和j必须是不同的,并且 arr[i]异或arr[j] 的二进制状态里有k个1 // 当i != j时,(i, j)和(j, i)认为是相同的二元组 -// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少合法二元组 +// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少k1二元组 // 1 <= n、m <= 10^5 // 0 <= arr[i]、k < 16384(2的14次方) // 测试链接 : https://www.luogu.com.cn/problem/P4887 @@ -42,7 +42,7 @@ public class Code01_MoOfflineTwice1 { public static int[] qid = new int[MAXN << 1]; public static int cntq; - // cnt[v] : 当前的数字v作为第二个数,之前出现的数字作为第一个数,产生多少合法二元组 + // cnt[v] : 当前的数字v作为第二个数,之前出现的数字作为第一个数,产生多少k1二元组 public static int[] cnt = new int[MAXV]; // pre[i] : 单点信息的前缀和,课上重点图解了 public static long[] pre = new long[MAXN]; diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index b6fa69050..ecea2506d 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -1,10 +1,10 @@ package class178; // 莫队二次离线入门题,C++版 -// 给定一个长度为n的数组arr,给定一个非负整数k,下面给出合法二元组的定义 +// 给定一个长度为n的数组arr,给定一个非负整数k,下面给出k1二元组的定义 // 位置二元组(i, j),i和j必须是不同的,并且 arr[i]异或arr[j] 的二进制状态里有k个1 // 当i != j时,(i, j)和(j, i)认为是相同的二元组 -// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少合法二元组 +// 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少k1二元组 // 1 <= n、m <= 10^5 // 0 <= arr[i]、k < 16384(2的14次方) // 测试链接 : https://www.luogu.com.cn/problem/P4887 From 07bf36a899ea0cabb55ed8c0a10fb78a9d676b9c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 20:10:26 +0800 Subject: [PATCH 0705/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 79 +++++++++++++++--------- src/class178/Code01_MoOfflineTwice2.java | 67 ++++++++++++++------ 2 files changed, 99 insertions(+), 47 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 539672608..5be9ef09f 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -22,7 +22,7 @@ public class Code01_MoOfflineTwice1 { - public static int MAXN = 100001; + public static int MAXN = 100002; public static int MAXV = 1 << 14; public static int n, m, k; public static int[] arr = new int[MAXN]; @@ -32,9 +32,13 @@ public class Code01_MoOfflineTwice1 { // 莫队任务,l、r、id public static int[][] query = new int[MAXN][3]; + // 离线任务,x、l、r、op、id // 位置x的任务列表用链式前向星表示 - public static int[] headq = new int[MAXN]; + // headl是winr变动时,加入的离线任务 + // headr是winl变动时,加入的离线任务 + public static int[] headl = new int[MAXN]; + public static int[] headr = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; public static int[] ql = new int[MAXN << 1]; public static int[] qr = new int[MAXN << 1]; @@ -44,8 +48,10 @@ public class Code01_MoOfflineTwice1 { // cnt[v] : 当前的数字v作为第二个数,之前出现的数字作为第一个数,产生多少k1二元组 public static int[] cnt = new int[MAXV]; - // pre[i] : 单点信息的前缀和,课上重点图解了 + // 前缀和 public static long[] pre = new long[MAXN]; + // 后缀和 + public static long[] suf = new long[MAXN]; public static long[] ans = new long[MAXN]; @@ -72,9 +78,18 @@ public static int countOne(int num) { return ret; } - public static void addOffline(int x, int l, int r, int op, int id) { - nextq[++cntq] = headq[x]; - headq[x] = cntq; + public static void addLeftOffline(int x, int l, int r, int op, int id) { + nextq[++cntq] = headl[x]; + headl[x] = cntq; + ql[cntq] = l; + qr[cntq] = r; + qop[cntq] = op; + qid[cntq] = id; + } + + public static void addRightOffline(int x, int l, int r, int op, int id) { + nextq[++cntq] = headr[x]; + headr[x] = cntq; ql[cntq] = l; qr[cntq] = r; qop[cntq] = op; @@ -101,32 +116,38 @@ public static void compute() { cnt[arr[i] ^ kOneArr[j]]++; } } - // 第一次离线,执行莫队 + Arrays.fill(cnt, 0); + for (int i = n; i >= 1; i--) { + suf[i] = suf[i + 1] + cnt[arr[i]]; + for (int j = 1; j <= cntk; j++) { + cnt[arr[i] ^ kOneArr[j]]++; + } + } + // 执行莫队 int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { int jobl = query[i][0]; int jobr = query[i][1]; int id = query[i][2]; if (winr < jobr) { - addOffline(winl - 1, winr + 1, jobr, -1, id); + addLeftOffline(winl - 1, winr + 1, jobr, -1, id); ans[id] += pre[jobr] - pre[winr]; } if (winr > jobr) { - addOffline(winl - 1, jobr + 1, winr, 1, id); + addLeftOffline(winl - 1, jobr + 1, winr, 1, id); ans[id] -= pre[winr] - pre[jobr]; } winr = jobr; if (winl > jobl) { - addOffline(winr, jobl, winl - 1, 1, id); - ans[id] -= pre[winl - 1] - pre[jobl - 1]; + addRightOffline(winr + 1, jobl, winl - 1, -1, id); + ans[id] += suf[jobl] - suf[winl]; } if (winl < jobl) { - addOffline(winr, winl, jobl - 1, -1, id); - ans[id] += pre[jobl - 1] - pre[winl - 1]; + addRightOffline(winr + 1, winl, jobl - 1, 1, id); + ans[id] -= suf[winl] - suf[jobl]; } winl = jobl; } - // 第二次离线,执行离线任务 Arrays.fill(cnt, 0); for (int i = 0; i <= n; i++) { if (i >= 1) { @@ -134,22 +155,24 @@ public static void compute() { cnt[arr[i] ^ kOneArr[j]]++; } } - for (int q = headq[i]; q > 0; q = nextq[q]) { + for (int q = headl[i]; q > 0; q = nextq[q]) { + int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; + for (int j = l; j <= r; j++) { + ans[id] += (long) op * cnt[arr[j]]; + } + } + } + Arrays.fill(cnt, 0); + for (int i = n + 1; i >= 1; i--) { + if (i <= n) { + for (int j = 1; j <= cntk; j++) { + cnt[arr[i] ^ kOneArr[j]]++; + } + } + for (int q = headr[i]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { - // 计算j 对 1..i范围的贡献 - // 此时1..i范围上的数字都更新过cnt - if (j <= i && k == 0) { - // j在1..i范围上,此时又有k==0 - // 那么arr[j]一定更新过cnt,并且(arr[j], arr[j])一定算进贡献了 - // 但是题目要求的二元组必须是不同位置,所以贡献要进行减1修正 - ans[id] += (long) op * (cnt[arr[j]] - 1); - } else { - // 要么j不在1..i范围上,arr[j]没更新过cnt - // 要么k!=0,(arr[j], arr[j])无法被算成贡献 - // 无论哪种情况,贡献都是正确的,不用进行减1修正 - ans[id] += (long) op * cnt[arr[j]]; - } + ans[id] += (long) op * cnt[arr[j]]; } } } diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index ecea2506d..535c0ac4d 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -19,7 +19,7 @@ // int l, r, id; //}; // -//const int MAXN = 100001; +//const int MAXN = 100002; //const int MAXV = 1 << 14; //int n, m, k; //int arr[MAXN]; @@ -28,7 +28,9 @@ //int cntk; // //Query query[MAXN]; -//int headq[MAXN]; +// +//int headl[MAXN]; +//int headr[MAXN]; //int nextq[MAXN << 1]; //int ql[MAXN << 1]; //int qr[MAXN << 1]; @@ -38,6 +40,7 @@ // //int cnt[MAXV]; //long long pre[MAXN]; +//long long suf[MAXN]; // //long long ans[MAXN]; // @@ -48,8 +51,8 @@ // return a.r < b.r; //} // -//int lowbit(int i) { -// return i & -i; +//int lowbit(int x) { +// return x & -x; //} // //int countOne(int num) { @@ -61,9 +64,18 @@ // return ret; //} // -//void addOffline(int x, int l, int r, int op, int id) { -// nextq[++cntq] = headq[x]; -// headq[x] = cntq; +//void addLeftOffline(int x, int l, int r, int op, int id) { +// nextq[++cntq] = headl[x]; +// headl[x] = cntq; +// ql[cntq] = l; +// qr[cntq] = r; +// qop[cntq] = op; +// qid[cntq] = id; +//} +// +//void addRightOffline(int x, int l, int r, int op, int id) { +// nextq[++cntq] = headr[x]; +// headr[x] = cntq; // ql[cntq] = l; // qr[cntq] = r; // qop[cntq] = op; @@ -90,27 +102,34 @@ // cnt[arr[i] ^ kOneArr[j]]++; // } // } +// memset(cnt, 0, sizeof(cnt)); +// for (int i = n; i >= 1; i--) { +// suf[i] = suf[i + 1] + cnt[arr[i]]; +// for (int j = 1; j <= cntk; j++) { +// cnt[arr[i] ^ kOneArr[j]]++; +// } +// } // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { // int jobl = query[i].l; // int jobr = query[i].r; // int id = query[i].id; // if (winr < jobr) { -// addOffline(winl - 1, winr + 1, jobr, -1, id); +// addLeftOffline(winl - 1, winr + 1, jobr, -1, id); // ans[id] += pre[jobr] - pre[winr]; // } // if (winr > jobr) { -// addOffline(winl - 1, jobr + 1, winr, 1, id); +// addLeftOffline(winl - 1, jobr + 1, winr, 1, id); // ans[id] -= pre[winr] - pre[jobr]; // } // winr = jobr; // if (winl > jobl) { -// addOffline(winr, jobl, winl - 1, 1, id); -// ans[id] -= pre[winl - 1] - pre[jobl - 1]; +// addRightOffline(winr + 1, jobl, winl - 1, -1, id); +// ans[id] += suf[jobl] - suf[winl]; // } // if (winl < jobl) { -// addOffline(winr, winl, jobl - 1, -1, id); -// ans[id] += pre[jobl - 1] - pre[winl - 1]; +// addRightOffline(winr + 1, winl, jobl - 1, 1, id); +// ans[id] -= suf[winl] - suf[jobl]; // } // winl = jobl; // } @@ -121,14 +140,24 @@ // cnt[arr[i] ^ kOneArr[j]]++; // } // } -// for (int q = headq[i]; q > 0; q = nextq[q]) { +// for (int q = headl[i]; q > 0; q = nextq[q]) { +// int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; +// for (int j = l; j <= r; j++) { +// ans[id] += 1LL * op * cnt[arr[j]]; +// } +// } +// } +// memset(cnt, 0, sizeof(cnt)); +// for (int i = n + 1; i >= 1; i--) { +// if (i <= n) { +// for (int j = 1; j <= cntk; j++) { +// cnt[arr[i] ^ kOneArr[j]]++; +// } +// } +// for (int q = headr[i]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { -// if (j <= i && k == 0) { -// ans[id] += 1LL * op * (cnt[arr[j]] - 1); -// } else { -// ans[id] += 1LL * op * cnt[arr[j]]; -// } +// ans[id] += 1LL * op * cnt[arr[j]]; // } // } // } From 2f0c6c0e57a83cedbdb3a0ceb93ca1b057bf4ede Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 20:57:41 +0800 Subject: [PATCH 0706/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 5be9ef09f..6de10caa8 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -35,8 +35,8 @@ public class Code01_MoOfflineTwice1 { // 离线任务,x、l、r、op、id // 位置x的任务列表用链式前向星表示 - // headl是winr变动时,加入的离线任务 - // headr是winl变动时,加入的离线任务 + // headl[x],x在l~r左侧的离线任务列表 + // headr[x],x在l~r右侧的离线任务列表 public static int[] headl = new int[MAXN]; public static int[] headr = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; From 7bc5c5cd525b8ff73b864a0449ae26415735504d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 10 Sep 2025 22:14:56 +0800 Subject: [PATCH 0707/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index 6de10caa8..e1bc93855 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -194,6 +194,9 @@ public static void main(String[] args) throws Exception { } prepare(); compute(); + // ans[i]代表答案变化量 + // 所以加工出前缀和才是每个查询的答案 + // 注意在普通莫队的顺序下,去生成前缀和 for (int i = 2; i <= m; i++) { ans[query[i][2]] += ans[query[i - 1][2]]; } From 172d8e6131bafca5c2f1a6dc34010357656e7a3c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 11 Sep 2025 08:24:07 +0800 Subject: [PATCH 0708/1170] modify code --- src/class178/Code04_Gosick1.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index c9abfe466..908acf7c6 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -174,7 +174,6 @@ public static void prepare() { } public static void main(String[] args) throws Exception { - System.out.println("测试"); FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); From c1b1f05ed720fb872458830b8e9f1e2b32f8e1e9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 11 Sep 2025 13:59:39 +0800 Subject: [PATCH 0709/1170] modify code --- src/class178/Code01_MoOfflineTwice1.java | 16 ++++----- src/class178/Code01_MoOfflineTwice2.java | 16 ++++----- src/class178/Code02_OfflineInversion1.java | 38 +++++++++++----------- src/class178/Code02_OfflineInversion2.java | 34 +++++++++---------- src/class178/Code03_Abbi1.java | 30 ++++++++--------- src/class178/Code03_Abbi2.java | 30 ++++++++--------- src/class178/Code04_Gosick1.java | 20 ++++++------ src/class178/Code04_Gosick2.java | 20 ++++++------ 8 files changed, 102 insertions(+), 102 deletions(-) diff --git a/src/class178/Code01_MoOfflineTwice1.java b/src/class178/Code01_MoOfflineTwice1.java index e1bc93855..de824b37b 100644 --- a/src/class178/Code01_MoOfflineTwice1.java +++ b/src/class178/Code01_MoOfflineTwice1.java @@ -149,13 +149,13 @@ public static void compute() { winl = jobl; } Arrays.fill(cnt, 0); - for (int i = 0; i <= n; i++) { - if (i >= 1) { + for (int x = 0; x <= n; x++) { + if (x >= 1) { for (int j = 1; j <= cntk; j++) { - cnt[arr[i] ^ kOneArr[j]]++; + cnt[arr[x] ^ kOneArr[j]]++; } } - for (int q = headl[i]; q > 0; q = nextq[q]) { + for (int q = headl[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { ans[id] += (long) op * cnt[arr[j]]; @@ -163,13 +163,13 @@ public static void compute() { } } Arrays.fill(cnt, 0); - for (int i = n + 1; i >= 1; i--) { - if (i <= n) { + for (int x = n + 1; x >= 1; x--) { + if (x <= n) { for (int j = 1; j <= cntk; j++) { - cnt[arr[i] ^ kOneArr[j]]++; + cnt[arr[x] ^ kOneArr[j]]++; } } - for (int q = headr[i]; q > 0; q = nextq[q]) { + for (int q = headr[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { ans[id] += (long) op * cnt[arr[j]]; diff --git a/src/class178/Code01_MoOfflineTwice2.java b/src/class178/Code01_MoOfflineTwice2.java index 535c0ac4d..fa5b732cf 100644 --- a/src/class178/Code01_MoOfflineTwice2.java +++ b/src/class178/Code01_MoOfflineTwice2.java @@ -134,13 +134,13 @@ // winl = jobl; // } // memset(cnt, 0, sizeof(cnt)); -// for (int i = 0; i <= n; i++) { -// if (i >= 1) { +// for (int x = 0; x <= n; x++) { +// if (x >= 1) { // for (int j = 1; j <= cntk; j++) { -// cnt[arr[i] ^ kOneArr[j]]++; +// cnt[arr[x] ^ kOneArr[j]]++; // } // } -// for (int q = headl[i]; q > 0; q = nextq[q]) { +// for (int q = headl[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { // ans[id] += 1LL * op * cnt[arr[j]]; @@ -148,13 +148,13 @@ // } // } // memset(cnt, 0, sizeof(cnt)); -// for (int i = n + 1; i >= 1; i--) { -// if (i <= n) { +// for (int x = n + 1; x >= 1; x--) { +// if (x <= n) { // for (int j = 1; j <= cntk; j++) { -// cnt[arr[i] ^ kOneArr[j]]++; +// cnt[arr[x] ^ kOneArr[j]]++; // } // } -// for (int q = headr[i]; q > 0; q = nextq[q]) { +// for (int q = headr[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { // ans[id] += 1LL * op * cnt[arr[j]]; diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index cc7ee9b5a..9fcac3552 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -50,10 +50,10 @@ public class Code02_OfflineInversion1 { // 后缀信息 public static long[] suf = new long[MAXN]; - // 整块加了多少词频 - public static long[] cnt1 = new long[MAXB]; - // 每种值加了多少词频 - public static long[] cnt2 = new long[MAXN]; + // 整块增加的词频 + public static long[] blockCnt = new long[MAXB]; + // 块内单个数值的词频 + public static long[] innerCnt = new long[MAXN]; public static long[] ans = new long[MAXN]; @@ -128,10 +128,10 @@ public static void addLeftCnt(int val) { return; } for (int b = 1; b <= bi[val] - 1; b++) { - cnt1[b]++; + blockCnt[b]++; } for (int i = bl[bi[val]]; i <= val; i++) { - cnt2[i]++; + innerCnt[i]++; } } @@ -140,15 +140,15 @@ public static void addRightCnt(int val) { return; } for (int b = bi[val] + 1; b <= bi[cntv]; b++) { - cnt1[b]++; + blockCnt[b]++; } for (int i = val; i <= br[bi[val]]; i++) { - cnt2[i]++; + innerCnt[i]++; } } public static long getCnt(int val) { - return cnt1[bi[val]] + cnt2[val]; + return blockCnt[bi[val]] + innerCnt[val]; } public static void prepare() { @@ -211,11 +211,11 @@ public static void compute() { } winl = jobl; } - for (int i = 0; i <= n; i++) { - if (i >= 1) { - addLeftCnt(arr[i] - 1); + for (int x = 0; x <= n; x++) { + if (x >= 1) { + addLeftCnt(arr[x] - 1); } - for (int q = headl[i]; q > 0; q = nextq[q]) { + for (int q = headl[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; long ret = 0; for (int j = l; j <= r; j++) { @@ -224,13 +224,13 @@ public static void compute() { ans[id] += ret * op; } } - Arrays.fill(cnt1, 0); - Arrays.fill(cnt2, 0); - for (int i = n + 1; i >= 1; i--) { - if (i <= n) { - addRightCnt(arr[i] + 1); + Arrays.fill(blockCnt, 0); + Arrays.fill(innerCnt, 0); + for (int x = n + 1; x >= 1; x--) { + if (x <= n) { + addRightCnt(arr[x] + 1); } - for (int q = headr[i]; q > 0; q = nextq[q]) { + for (int q = headr[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; long ret = 0; for (int j = l; j <= r; j++) { diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index 3aaf5ce8b..066ab20e9 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -44,8 +44,8 @@ //long long pre[MAXN]; //long long suf[MAXN]; // -//long long cnt1[MAXB]; -//long long cnt2[MAXN]; +//long long blockCnt[MAXB]; +//long long innerCnt[MAXN]; // //long long ans[MAXN]; // @@ -117,10 +117,10 @@ // return; // } // for (int b = 1; b <= bi[val] - 1; b++) { -// cnt1[b]++; +// blockCnt[b]++; // } // for (int i = bl[bi[val]]; i <= val; i++) { -// cnt2[i]++; +// innerCnt[i]++; // } //} // @@ -129,15 +129,15 @@ // return; // } // for (int b = bi[val] + 1; b <= bi[cntv]; b++) { -// cnt1[b]++; +// blockCnt[b]++; // } // for (int i = val; i <= br[bi[val]]; i++) { -// cnt2[i]++; +// innerCnt[i]++; // } //} // //long long getCnt(int val) { -// return cnt1[bi[val]] + cnt2[val]; +// return blockCnt[bi[val]] + innerCnt[val]; //} // //void prepare() { @@ -200,11 +200,11 @@ // } // winl = jobl; // } -// for (int i = 0; i <= n; i++) { -// if (i >= 1) { -// addLeftCnt(arr[i] - 1); +// for (int x = 0; x <= n; x++) { +// if (x >= 1) { +// addLeftCnt(arr[x] - 1); // } -// for (int q = headl[i]; q > 0; q = nextq[q]) { +// for (int q = headl[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // long long ret = 0; // for (int j = l; j <= r; j++) { @@ -213,13 +213,13 @@ // ans[id] += ret * op; // } // } -// memset(cnt1, 0, sizeof(cnt1)); -// memset(cnt2, 0, sizeof(cnt2)); -// for (int i = n + 1; i >= 1; i--) { -// if (i <= n) { -// addRightCnt(arr[i] + 1); +// memset(blockCnt, 0, sizeof(blockCnt)); +// memset(innerCnt, 0, sizeof(innerCnt)); +// for (int x = n + 1; x >= 1; x--) { +// if (x <= n) { +// addRightCnt(arr[x] + 1); // } -// for (int q = headr[i]; q > 0; q = nextq[q]) { +// for (int q = headr[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // long long ret = 0; // for (int j = l; j <= r; j++) { diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index d8ac48362..291b9a229 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -42,10 +42,10 @@ public class Code03_Abbi1 { public static long[] treeSum = new long[MAXV + 1]; public static long[] pre = new long[MAXN]; - public static int[] cnt1 = new int[MAXB]; - public static int[] cnt2 = new int[MAXN]; - public static long[] sum1 = new long[MAXB]; - public static long[] sum2 = new long[MAXN]; + public static int[] blockCnt = new int[MAXB]; + public static int[] innerCnt = new int[MAXN]; + public static long[] blockSum = new long[MAXB]; + public static long[] innerSum = new long[MAXN]; public static long[] ans = new long[MAXN]; @@ -93,12 +93,12 @@ public static void addVal(int val) { return; } for (int b = bi[val]; b <= bi[MAXV]; b++) { - cnt1[b]++; - sum1[b] += val; + blockCnt[b]++; + blockSum[b] += val; } for (int i = val; i <= br[bi[val]]; i++) { - cnt2[i]++; - sum2[i] += val; + innerCnt[i]++; + innerSum[i] += val; } } @@ -106,14 +106,14 @@ public static long getSum(int x) { if (x <= 0) { return 0; } - return sum1[bi[x] - 1] + sum2[x]; + return blockSum[bi[x] - 1] + innerSum[x]; } public static int getCnt(int x) { if (x <= 0) { return 0; } - return cnt1[bi[x] - 1] + cnt2[x]; + return blockCnt[bi[x] - 1] + innerCnt[x]; } public static void prepare() { @@ -163,12 +163,12 @@ public static void compute() { } long sum = 0; long tmp; - for (int i = 0; i <= n; i++) { - if (i >= 1) { - addVal(arr[i]); - sum += arr[i]; + for (int x = 0; x <= n; x++) { + if (x >= 1) { + addVal(arr[x]); + sum += arr[x]; } - for (int q = headq[i]; q > 0; q = nextq[q]) { + for (int q = headq[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { tmp = (long) getCnt(arr[j] - 1) * arr[j] + sum - getSum(arr[j]); diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index 239f3022d..3da476b63 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -43,10 +43,10 @@ //long long treeSum[MAXV + 1]; //long long pre[MAXN]; // -//int cnt1[MAXB]; -//int cnt2[MAXN]; -//long long sum1[MAXB]; -//long long sum2[MAXN]; +//int blockCnt[MAXB]; +//int innerCnt[MAXN]; +//long long blockSum[MAXB]; +//long long innerSum[MAXN]; // //long long ans[MAXN]; // @@ -91,12 +91,12 @@ // return; // } // for (int b = bi[val]; b <= bi[MAXV]; b++) { -// cnt1[b]++; -// sum1[b] += val; +// blockCnt[b]++; +// blockSum[b] += val; // } // for (int i = val; i <= br[bi[val]]; i++) { -// cnt2[i]++; -// sum2[i] += val; +// innerCnt[i]++; +// innerSum[i] += val; // } //} // @@ -104,14 +104,14 @@ // if (x <= 0) { // return 0; // } -// return sum1[bi[x] - 1] + sum2[x]; +// return blockSum[bi[x] - 1] + innerSum[x]; //} // //int getCnt(int x) { // if (x <= 0) { // return 0; // } -// return cnt1[bi[x] - 1] + cnt2[x]; +// return blockCnt[bi[x] - 1] + innerCnt[x]; //} // //void prepare() { @@ -161,12 +161,12 @@ // } // long long sum = 0; // long long tmp; -// for (int i = 0; i <= n; i++) { -// if (i >= 1) { -// addVal(arr[i]); -// sum += arr[i]; +// for (int x = 0; x <= n; x++) { +// if (x >= 1) { +// addVal(arr[x]); +// sum += arr[x]; // } -// for (int q = headq[i]; q > 0; q = nextq[q]) { +// for (int q = headq[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { // tmp = 1LL * getCnt(arr[j] - 1) * arr[j] + sum - getSum(arr[j]); diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 908acf7c6..d1ec01f23 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -85,12 +85,12 @@ public static void addOffline(int x, int l, int r, int op, int id) { } public static void compute() { - for (int i = 1, x; i <= n; i++) { + for (int i = 1; i <= n; i++) { pre[i] = pre[i - 1]; - x = arr[i]; - for (int e = headf[x], f, other; e > 0; e = nextf[e]) { + int num = arr[i]; + for (int e = headf[num], f, other; e > 0; e = nextf[e]) { f = fac[e]; - other = x / f; + other = num / f; fcnt[f]++; pre[i] += xcnt[f]; if (other != f) { @@ -98,8 +98,8 @@ public static void compute() { pre[i] += xcnt[other]; } } - pre[i] += fcnt[x]; - xcnt[x]++; + pre[i] += fcnt[num]; + xcnt[num]++; } int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { @@ -126,9 +126,9 @@ public static void compute() { winl = jobl; } Arrays.fill(fcnt, 0); - for (int i = 0; i <= n; i++) { - if (i >= 1) { - int num = arr[i]; + for (int x = 0; x <= n; x++) { + if (x >= 1) { + int num = arr[x]; for (int e = headf[num], f, other; e > 0; e = nextf[e]) { f = fac[e]; other = num / f; @@ -143,7 +143,7 @@ public static void compute() { } } } - for (int q = headq[i]; q > 0; q = nextq[q]) { + for (int q = headq[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { ans[id] += (long) op * fcnt[arr[j]]; diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index bdebce0b0..6445b2948 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -80,12 +80,12 @@ //} // //void compute() { -// for (int i = 1, x; i <= n; i++) { +// for (int i = 1; i <= n; i++) { // pre[i] = pre[i - 1]; -// x = arr[i]; -// for (int e = headf[x], f, other; e > 0; e = nextf[e]) { +// int num = arr[i]; +// for (int e = headf[num], f, other; e > 0; e = nextf[e]) { // f = fac[e]; -// other = x / f; +// other = num / f; // fcnt[f]++; // pre[i] += xcnt[f]; // if (other != f) { @@ -93,8 +93,8 @@ // pre[i] += xcnt[other]; // } // } -// pre[i] += fcnt[x]; -// xcnt[x]++; +// pre[i] += fcnt[num]; +// xcnt[num]++; // } // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { @@ -121,9 +121,9 @@ // winl = jobl; // } // memset(fcnt, 0, sizeof(fcnt)); -// for (int i = 0; i <= n; i++) { -// if (i >= 1) { -// int num = arr[i]; +// for (int x = 0; x <= n; x++) { +// if (x >= 1) { +// int num = arr[x]; // for (int e = headf[num], f, other; e > 0; e = nextf[e]) { // f = fac[e]; // other = num / f; @@ -138,7 +138,7 @@ // } // } // } -// for (int q = headq[i]; q > 0; q = nextq[q]) { +// for (int q = headq[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { // ans[id] += 1LL * op * fcnt[arr[j]]; From 5cff01ff845c582d38b5c0806ee5d1b4da310824 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 11 Sep 2025 15:38:43 +0800 Subject: [PATCH 0710/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 2 +- src/class178/Code02_OfflineInversion2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 9fcac3552..7c0aaff8b 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -5,7 +5,7 @@ // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,逆序对的数量 // 1 <= n、m <= 10^5 // 0 <= arr[i] <= 10^9 -// 本题允许离线,讲解173,题目4,讲了必须在线查询区间逆序对 +// 本题允许离线,讲解173,题目4,讲了在线查询区间逆序对,但是给定的数组为排列 // 测试链接 : https://www.luogu.com.cn/problem/P5047 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index 066ab20e9..aedddc4ef 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -5,7 +5,7 @@ // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,逆序对的数量 // 1 <= n、m <= 10^5 // 0 <= arr[i] <= 10^9 -// 本题允许离线,讲解173,题目4,讲了必须在线查询区间逆序对 +// 本题允许离线,讲解173,题目4,讲了在线查询区间逆序对,但是给定的数组为排列 // 测试链接 : https://www.luogu.com.cn/problem/P5047 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 672082239ff2522acad8332690198abe2419433f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 11 Sep 2025 16:46:39 +0800 Subject: [PATCH 0711/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 12 ++++++------ src/class178/Code02_OfflineInversion2.java | 10 +++++----- src/class178/Code03_Abbi1.java | 12 ++++++------ src/class178/Code03_Abbi2.java | 12 ++++++------ 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 7c0aaff8b..6faac61ca 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -52,8 +52,8 @@ public class Code02_OfflineInversion1 { // 整块增加的词频 public static long[] blockCnt = new long[MAXB]; - // 块内单个数值的词频 - public static long[] innerCnt = new long[MAXN]; + // 单个数值的词频 + public static long[] numCnt = new long[MAXN]; public static long[] ans = new long[MAXN]; @@ -131,7 +131,7 @@ public static void addLeftCnt(int val) { blockCnt[b]++; } for (int i = bl[bi[val]]; i <= val; i++) { - innerCnt[i]++; + numCnt[i]++; } } @@ -143,12 +143,12 @@ public static void addRightCnt(int val) { blockCnt[b]++; } for (int i = val; i <= br[bi[val]]; i++) { - innerCnt[i]++; + numCnt[i]++; } } public static long getCnt(int val) { - return blockCnt[bi[val]] + innerCnt[val]; + return blockCnt[bi[val]] + numCnt[val]; } public static void prepare() { @@ -225,7 +225,7 @@ public static void compute() { } } Arrays.fill(blockCnt, 0); - Arrays.fill(innerCnt, 0); + Arrays.fill(numCnt, 0); for (int x = n + 1; x >= 1; x--) { if (x <= n) { addRightCnt(arr[x] + 1); diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index aedddc4ef..73ed02b8e 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -45,7 +45,7 @@ //long long suf[MAXN]; // //long long blockCnt[MAXB]; -//long long innerCnt[MAXN]; +//long long numCnt[MAXN]; // //long long ans[MAXN]; // @@ -120,7 +120,7 @@ // blockCnt[b]++; // } // for (int i = bl[bi[val]]; i <= val; i++) { -// innerCnt[i]++; +// numCnt[i]++; // } //} // @@ -132,12 +132,12 @@ // blockCnt[b]++; // } // for (int i = val; i <= br[bi[val]]; i++) { -// innerCnt[i]++; +// numCnt[i]++; // } //} // //long long getCnt(int val) { -// return blockCnt[bi[val]] + innerCnt[val]; +// return blockCnt[bi[val]] + numCnt[val]; //} // //void prepare() { @@ -214,7 +214,7 @@ // } // } // memset(blockCnt, 0, sizeof(blockCnt)); -// memset(innerCnt, 0, sizeof(innerCnt)); +// memset(numCnt, 0, sizeof(numCnt)); // for (int x = n + 1; x >= 1; x--) { // if (x <= n) { // addRightCnt(arr[x] + 1); diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 291b9a229..bd60aef7a 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -43,9 +43,9 @@ public class Code03_Abbi1 { public static long[] pre = new long[MAXN]; public static int[] blockCnt = new int[MAXB]; - public static int[] innerCnt = new int[MAXN]; + public static int[] numCnt = new int[MAXN]; public static long[] blockSum = new long[MAXB]; - public static long[] innerSum = new long[MAXN]; + public static long[] numSum = new long[MAXN]; public static long[] ans = new long[MAXN]; @@ -97,8 +97,8 @@ public static void addVal(int val) { blockSum[b] += val; } for (int i = val; i <= br[bi[val]]; i++) { - innerCnt[i]++; - innerSum[i] += val; + numCnt[i]++; + numSum[i] += val; } } @@ -106,14 +106,14 @@ public static long getSum(int x) { if (x <= 0) { return 0; } - return blockSum[bi[x] - 1] + innerSum[x]; + return blockSum[bi[x] - 1] + numSum[x]; } public static int getCnt(int x) { if (x <= 0) { return 0; } - return blockCnt[bi[x] - 1] + innerCnt[x]; + return blockCnt[bi[x] - 1] + numCnt[x]; } public static void prepare() { diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index 3da476b63..e889ddb2a 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -44,9 +44,9 @@ //long long pre[MAXN]; // //int blockCnt[MAXB]; -//int innerCnt[MAXN]; +//int numCnt[MAXN]; //long long blockSum[MAXB]; -//long long innerSum[MAXN]; +//long long numSum[MAXN]; // //long long ans[MAXN]; // @@ -95,8 +95,8 @@ // blockSum[b] += val; // } // for (int i = val; i <= br[bi[val]]; i++) { -// innerCnt[i]++; -// innerSum[i] += val; +// numCnt[i]++; +// numSum[i] += val; // } //} // @@ -104,14 +104,14 @@ // if (x <= 0) { // return 0; // } -// return blockSum[bi[x] - 1] + innerSum[x]; +// return blockSum[bi[x] - 1] + numSum[x]; //} // //int getCnt(int x) { // if (x <= 0) { // return 0; // } -// return blockCnt[bi[x] - 1] + innerCnt[x]; +// return blockCnt[bi[x] - 1] + numCnt[x]; //} // //void prepare() { From d74c1a55f36bd3bf156b1d93812ac46f166b8409 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 11 Sep 2025 16:48:46 +0800 Subject: [PATCH 0712/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 6 +----- src/class178/Code02_OfflineInversion2.java | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 6faac61ca..016ec3ba0 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -101,10 +101,6 @@ public static int sum(int i) { return ret; } - public static void clear() { - Arrays.fill(tree, 1, cntv + 1, 0); - } - public static void addLeftOffline(int x, int l, int r, int op, int id) { nextq[++cntq] = headl[x]; headl[x] = cntq; @@ -182,7 +178,7 @@ public static void compute() { pre[i] = pre[i - 1] + sum(cntv) - sum(arr[i]); add(arr[i], 1); } - clear(); + Arrays.fill(tree, 1, cntv + 1, 0); for (int i = n; i >= 1; i--) { suf[i] = suf[i + 1] + sum(arr[i] - 1); add(arr[i], 1); diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index 73ed02b8e..eed620174 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -90,10 +90,6 @@ // return ret; //} // -//void clear() { -// memset(tree + 1, 0, cntv * sizeof(int)); -//} -// //void addLeftOffline(int x, int l, int r, int op, int id) { // nextq[++cntq] = headl[x]; // headl[x] = cntq; @@ -171,7 +167,7 @@ // pre[i] = pre[i - 1] + sum(cntv) - sum(arr[i]); // add(arr[i], 1); // } -// clear(); +// memset(tree + 1, 0, cntv * sizeof(int)); // for (int i = n; i >= 1; i--) { // suf[i] = suf[i + 1] + sum(arr[i] - 1); // add(arr[i], 1); From daafe80bfce40a3d5a2b29cf18df95ada5a3b7eb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 11 Sep 2025 17:29:41 +0800 Subject: [PATCH 0713/1170] modify code --- src/class178/Code02_OfflineInversion1.java | 16 ++++++---------- src/class178/Code02_OfflineInversion2.java | 14 ++++---------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 016ec3ba0..2b660f744 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -119,26 +119,22 @@ public static void addRightOffline(int x, int l, int r, int op, int id) { qid[cntq] = id; } + // 增加1 ~ val-1,这些数字的词频 public static void addLeftCnt(int val) { - if (val <= 0) { - return; - } for (int b = 1; b <= bi[val] - 1; b++) { blockCnt[b]++; } - for (int i = bl[bi[val]]; i <= val; i++) { + for (int i = bl[bi[val]]; i < val; i++) { numCnt[i]++; } } + // 增加val+1 ~ cntv,这些数字的词频 public static void addRightCnt(int val) { - if (val > cntv) { - return; - } for (int b = bi[val] + 1; b <= bi[cntv]; b++) { blockCnt[b]++; } - for (int i = val; i <= br[bi[val]]; i++) { + for (int i = val + 1; i <= br[bi[val]]; i++) { numCnt[i]++; } } @@ -209,7 +205,7 @@ public static void compute() { } for (int x = 0; x <= n; x++) { if (x >= 1) { - addLeftCnt(arr[x] - 1); + addLeftCnt(arr[x]); } for (int q = headl[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; @@ -224,7 +220,7 @@ public static void compute() { Arrays.fill(numCnt, 0); for (int x = n + 1; x >= 1; x--) { if (x <= n) { - addRightCnt(arr[x] + 1); + addRightCnt(arr[x]); } for (int q = headr[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; diff --git a/src/class178/Code02_OfflineInversion2.java b/src/class178/Code02_OfflineInversion2.java index eed620174..b9595f66b 100644 --- a/src/class178/Code02_OfflineInversion2.java +++ b/src/class178/Code02_OfflineInversion2.java @@ -109,25 +109,19 @@ //} // //void addLeftCnt(int val) { -// if (val <= 0) { -// return; -// } // for (int b = 1; b <= bi[val] - 1; b++) { // blockCnt[b]++; // } -// for (int i = bl[bi[val]]; i <= val; i++) { +// for (int i = bl[bi[val]]; i < val; i++) { // numCnt[i]++; // } //} // //void addRightCnt(int val) { -// if (val > cntv) { -// return; -// } // for (int b = bi[val] + 1; b <= bi[cntv]; b++) { // blockCnt[b]++; // } -// for (int i = val; i <= br[bi[val]]; i++) { +// for (int i = val + 1; i <= br[bi[val]]; i++) { // numCnt[i]++; // } //} @@ -198,7 +192,7 @@ // } // for (int x = 0; x <= n; x++) { // if (x >= 1) { -// addLeftCnt(arr[x] - 1); +// addLeftCnt(arr[x]); // } // for (int q = headl[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; @@ -213,7 +207,7 @@ // memset(numCnt, 0, sizeof(numCnt)); // for (int x = n + 1; x >= 1; x--) { // if (x <= n) { -// addRightCnt(arr[x] + 1); +// addRightCnt(arr[x]); // } // for (int q = headr[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; From b673f7e7d8a163d593e539dfe2a4a6e09766412b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 11 Sep 2025 17:54:37 +0800 Subject: [PATCH 0714/1170] modify code --- src/class178/Code03_Abbi1.java | 1 + src/class178/Code03_Abbi2.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index bd60aef7a..5f89a8498 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -26,6 +26,7 @@ public class Code03_Abbi1 { public static int n, m; public static int[] arr = new int[MAXN]; public static long[] presum = new long[MAXN]; + public static int[] bi = new int[MAXN]; public static int[] br = new int[MAXB]; diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index e889ddb2a..4fd0495b9 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -23,10 +23,10 @@ //const int MAXN = 500001; //const int MAXV = 100000; //const int MAXB = 401; -// //int n, m; //int arr[MAXN]; //long long presum[MAXN]; +// //int bi[MAXN]; //int br[MAXB]; // From ed9e8d27eefa3b2cc09865f805e9d9ec413db784 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 11 Sep 2025 21:12:21 +0800 Subject: [PATCH 0715/1170] modify code --- src/class178/Code03_Abbi1.java | 57 ++++++++++++++++------------------ src/class178/Code03_Abbi2.java | 55 +++++++++++++++----------------- 2 files changed, 52 insertions(+), 60 deletions(-) diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 5f89a8498..8654c71dc 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -25,9 +25,10 @@ public class Code03_Abbi1 { public static int MAXB = 401; public static int n, m; public static int[] arr = new int[MAXN]; - public static long[] presum = new long[MAXN]; + public static long[] preSum = new long[MAXN]; public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; public static int[][] query = new int[MAXN][3]; @@ -43,10 +44,10 @@ public class Code03_Abbi1 { public static long[] treeSum = new long[MAXV + 1]; public static long[] pre = new long[MAXN]; - public static int[] blockCnt = new int[MAXB]; - public static int[] numCnt = new int[MAXN]; - public static long[] blockSum = new long[MAXB]; - public static long[] numSum = new long[MAXN]; + public static int[] blockLessCnt = new int[MAXB]; + public static int[] numLessCnt = new int[MAXN]; + public static long[] blockMoreSum = new long[MAXB]; + public static long[] numMoreSum = new long[MAXN]; public static long[] ans = new long[MAXN]; @@ -90,44 +91,40 @@ public static long sum(long[] tree, int x) { } public static void addVal(int val) { - if (val <= 0) { - return; + for (int b = bi[val] + 1; b <= bi[MAXV]; b++) { + blockLessCnt[b]++; } - for (int b = bi[val]; b <= bi[MAXV]; b++) { - blockCnt[b]++; - blockSum[b] += val; + for (int i = val + 1; i <= br[bi[val]]; i++) { + numLessCnt[i]++; } - for (int i = val; i <= br[bi[val]]; i++) { - numCnt[i]++; - numSum[i] += val; + for (int b = 1; b <= bi[val] - 1; b++) { + blockMoreSum[b] += val; + } + for (int i = bl[bi[val]]; i < val; i++) { + numMoreSum[i] += val; } } - public static long getSum(int x) { - if (x <= 0) { - return 0; - } - return blockSum[bi[x] - 1] + numSum[x]; + public static int lessCnt(int x) { + return blockLessCnt[bi[x]] + numLessCnt[x]; } - public static int getCnt(int x) { - if (x <= 0) { - return 0; - } - return blockCnt[bi[x] - 1] + numCnt[x]; + public static long moreSum(int x) { + return blockMoreSum[bi[x]] + numMoreSum[x]; } public static void prepare() { for (int i = 1; i <= n; i++) { - presum[i] = presum[i - 1] + arr[i]; + preSum[i] = preSum[i - 1] + arr[i]; } int blen = (int) Math.sqrt(MAXV); int bnum = (MAXV + blen - 1) / blen; for (int i = 1; i <= MAXV; i++) { bi[i] = (i - 1) / blen + 1; } - for (int b = 1; b <= bnum; b++) { - br[b] = Math.min(b * blen, MAXV); + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, MAXV); } Arrays.sort(query, 1, m + 1, new QueryCmp()); } @@ -162,17 +159,15 @@ public static void compute() { } winl = jobl; } - long sum = 0; long tmp; for (int x = 0; x <= n; x++) { if (x >= 1) { addVal(arr[x]); - sum += arr[x]; } for (int q = headq[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { - tmp = (long) getCnt(arr[j] - 1) * arr[j] + sum - getSum(arr[j]); + tmp = (long) lessCnt(arr[j]) * arr[j] + moreSum(arr[j]); if (op == 1) { ans[id] += tmp; } else { @@ -198,11 +193,13 @@ public static void main(String[] args) throws Exception { } prepare(); compute(); + // 加工前缀和 for (int i = 2; i <= m; i++) { ans[query[i][2]] += ans[query[i - 1][2]]; } + // 贡献是修正过的概念,现在补偿回来 for (int i = 1; i <= m; i++) { - ans[query[i][2]] += presum[query[i][1]] - presum[query[i][0] - 1]; + ans[query[i][2]] += preSum[query[i][1]] - preSum[query[i][0] - 1]; } for (int i = 1; i <= m; i++) { out.println(ans[i]); diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index 4fd0495b9..8c333b130 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -25,9 +25,10 @@ //const int MAXB = 401; //int n, m; //int arr[MAXN]; -//long long presum[MAXN]; +//long long preSum[MAXN]; // //int bi[MAXN]; +//int bl[MAXB]; //int br[MAXB]; // //Query query[MAXN]; @@ -43,10 +44,10 @@ //long long treeSum[MAXV + 1]; //long long pre[MAXN]; // -//int blockCnt[MAXB]; -//int numCnt[MAXN]; -//long long blockSum[MAXB]; -//long long numSum[MAXN]; +//int blockLessCnt[MAXB]; +//int numLessCnt[MAXN]; +//long long blockMoreSum[MAXB]; +//long long numMoreSum[MAXN]; // //long long ans[MAXN]; // @@ -87,44 +88,40 @@ //} // //void addVal(int val) { -// if (val <= 0) { -// return; +// for (int b = bi[val] + 1; b <= bi[MAXV]; b++) { +// blockLessCnt[b]++; // } -// for (int b = bi[val]; b <= bi[MAXV]; b++) { -// blockCnt[b]++; -// blockSum[b] += val; +// for (int i = val + 1; i <= br[bi[val]]; i++) { +// numLessCnt[i]++; // } -// for (int i = val; i <= br[bi[val]]; i++) { -// numCnt[i]++; -// numSum[i] += val; +// for (int b = 1; b <= bi[val] - 1; b++) { +// blockMoreSum[b] += val; +// } +// for (int i = bl[bi[val]]; i < val; i++) { +// numMoreSum[i] += val; // } //} // -//long long getSum(int x) { -// if (x <= 0) { -// return 0; -// } -// return blockSum[bi[x] - 1] + numSum[x]; +//int lessCnt(int x) { +// return blockLessCnt[bi[x]] + numLessCnt[x]; //} // -//int getCnt(int x) { -// if (x <= 0) { -// return 0; -// } -// return blockCnt[bi[x] - 1] + numCnt[x]; +//long long moreSum(int x) { +// return blockMoreSum[bi[x]] + numMoreSum[x]; //} // //void prepare() { // for (int i = 1; i <= n; i++) { -// presum[i] = presum[i - 1] + arr[i]; +// preSum[i] = preSum[i - 1] + arr[i]; // } // int blen = (int)sqrt(MAXV); // int bnum = (MAXV + blen - 1) / blen; // for (int i = 1; i <= MAXV; i++) { // bi[i] = (i - 1) / blen + 1; // } -// for (int b = 1; b <= bnum; b++) { -// br[b] = min(b * blen, MAXV); +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, MAXV); // } // sort(query + 1, query + m + 1, QueryCmp); //} @@ -159,17 +156,15 @@ // } // winl = jobl; // } -// long long sum = 0; // long long tmp; // for (int x = 0; x <= n; x++) { // if (x >= 1) { // addVal(arr[x]); -// sum += arr[x]; // } // for (int q = headq[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { -// tmp = 1LL * getCnt(arr[j] - 1) * arr[j] + sum - getSum(arr[j]); +// tmp = 1LL * lessCnt(arr[j]) * arr[j] + moreSum(arr[j]); // if (op == 1) { // ans[id] += tmp; // } else { @@ -197,7 +192,7 @@ // ans[query[i].id] += ans[query[i - 1].id]; // } // for (int i = 1; i <= m; i++) { -// ans[query[i].id] += presum[query[i].r] - presum[query[i].l - 1]; +// ans[query[i].id] += preSum[query[i].r] - preSum[query[i].l - 1]; // } // for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; From d5b46dd4a709f5c31f83ecf4be5b66363136c315 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 11 Sep 2025 21:18:12 +0800 Subject: [PATCH 0716/1170] modify code --- src/class178/Code03_Abbi1.java | 1 + src/class178/Code03_Abbi2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 8654c71dc..815afc8b1 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -46,6 +46,7 @@ public class Code03_Abbi1 { public static int[] blockLessCnt = new int[MAXB]; public static int[] numLessCnt = new int[MAXN]; + public static long[] blockMoreSum = new long[MAXB]; public static long[] numMoreSum = new long[MAXN]; diff --git a/src/class178/Code03_Abbi2.java b/src/class178/Code03_Abbi2.java index 8c333b130..677b5a5bf 100644 --- a/src/class178/Code03_Abbi2.java +++ b/src/class178/Code03_Abbi2.java @@ -46,6 +46,7 @@ // //int blockLessCnt[MAXB]; //int numLessCnt[MAXN]; +// //long long blockMoreSum[MAXB]; //long long numMoreSum[MAXN]; // From 5887d5ab55a9317c02527bfac1f0d5b3bf681839 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 12 Sep 2025 15:17:50 +0800 Subject: [PATCH 0717/1170] modify code --- src/class178/Code03_Abbi1.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/class178/Code03_Abbi1.java b/src/class178/Code03_Abbi1.java index 815afc8b1..9f3960459 100644 --- a/src/class178/Code03_Abbi1.java +++ b/src/class178/Code03_Abbi1.java @@ -27,10 +27,12 @@ public class Code03_Abbi1 { public static int[] arr = new int[MAXN]; public static long[] preSum = new long[MAXN]; + // 序列分块 + 值域分块 public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXB]; public static int[] br = new int[MAXB]; + // 莫队任务 + 二次离线任务(x, l, r, op) public static int[][] query = new int[MAXN][3]; public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; @@ -40,13 +42,18 @@ public class Code03_Abbi1 { public static int[] qid = new int[MAXN << 1]; public static int cntq; + // 值域树状数组,统计x所有数的累加和 public static long[] treeSum = new long[MAXV + 1]; + // 前缀信息 public static long[] pre = new long[MAXN]; + // 值域分块,统计x所有数的累加和 public static long[] blockMoreSum = new long[MAXB]; public static long[] numMoreSum = new long[MAXN]; @@ -91,6 +98,7 @@ public static long sum(long[] tree, int x) { return ret; } + // 执行二次离线的过程中,加入数字val,修改相关信息 public static void addVal(int val) { for (int b = bi[val] + 1; b <= bi[MAXV]; b++) { blockLessCnt[b]++; @@ -106,10 +114,12 @@ public static void addVal(int val) { } } + // 查询x的所有数累加和 public static long moreSum(int x) { return blockMoreSum[bi[x]] + numMoreSum[x]; } From edf7f9da24fd64922a0394d29bc8d8369114ffeb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 12 Sep 2025 17:51:30 +0800 Subject: [PATCH 0718/1170] modify code --- src/class178/Code04_Gosick1.java | 1 + src/class178/Code04_Gosick2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index d1ec01f23..b29728660 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -5,6 +5,7 @@ // 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数(>=1倍) // 当i != j时,(i, j)和(j, i)认为是不同的二元组 // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少倍数二元组 +// 比如,[1, 1, 4, 5]有10个倍数二元组 // 1 <= n、m、arr[i] <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 提交以下的code,提交时请把类名改成"Main" diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index 6445b2948..f11fb9838 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -5,6 +5,7 @@ // 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数(>=1倍) // 当i != j时,(i, j)和(j, i)认为是不同的二元组 // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少倍数二元组 +// 比如,[1, 1, 4, 5]有10个倍数二元组 // 1 <= n、m、arr[i] <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From e78f96a157aa365c734ea6a0b535d69777d258c7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 12 Sep 2025 18:04:19 +0800 Subject: [PATCH 0719/1170] modify code --- src/class178/Code04_Gosick1.java | 2 +- src/class178/Code04_Gosick2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index b29728660..230d93b6e 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -24,7 +24,7 @@ public class Code04_Gosick1 { public static int MAXN = 500001; public static int MAXF = 5000001; - public static int LIMIT = 80; + public static int LIMIT = 100; public static int n, m, maxv; public static int[] arr = new int[MAXN]; public static int[] bi = new int[MAXN]; diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index f11fb9838..cf535798c 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -21,7 +21,7 @@ // //const int MAXN = 500001; //const int MAXF = 5000001; -//const int LIMIT = 80; +//const int LIMIT = 100; // //int n, m, maxv; //int arr[MAXN]; From 128bfc25e82c5a7240375feb61473d963887585f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 12 Sep 2025 18:25:56 +0800 Subject: [PATCH 0720/1170] modify code --- src/class178/Code04_Gosick1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 230d93b6e..4d09b7a47 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -126,6 +126,7 @@ public static void compute() { } winl = jobl; } + // 二次离线阶段,fcnt[v]表示v这个数字获得的,因子的数量 + 倍数的数量 Arrays.fill(fcnt, 0); for (int x = 0; x <= n; x++) { if (x >= 1) { From 0810ea48cd17050e3ebf1e0df61fc46d3cd2bdfe Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 12 Sep 2025 18:41:52 +0800 Subject: [PATCH 0721/1170] modify code --- src/class178/Code04_Gosick1.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 4d09b7a47..e5e70c31b 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -44,8 +44,11 @@ public class Code04_Gosick1 { public static int[] qid = new int[MAXN << 1]; public static int cntq; + // 每个数分解出的因子v,都会让fcnt[v]增加计数 public static int[] fcnt = new int[MAXN]; + // 每个数x,都会让xcnt[x]增加计数 public static int[] xcnt = new int[MAXN]; + // 前缀信息 public static long[] pre = new long[MAXN]; public static int[] cnt1 = new int[MAXN]; @@ -86,6 +89,8 @@ public static void addOffline(int x, int l, int r, int op, int id) { } public static void compute() { + // 单点贡献 = (之前数, 当前数) + (当前数,之前数) + (当前数,当前数)算1次 + // 然后把每一步的单点贡献,生成前缀和数组pre for (int i = 1; i <= n; i++) { pre[i] = pre[i - 1]; int num = arr[i]; From ad385a244981d788cf63c3473789c940db29cc12 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 12 Sep 2025 22:10:54 +0800 Subject: [PATCH 0722/1170] modify code --- src/class178/Code04_Gosick1.java | 69 ++++++++++++++++++-------------- src/class178/Code04_Gosick2.java | 53 ++++++++++++------------ 2 files changed, 65 insertions(+), 57 deletions(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index e5e70c31b..b6f85627b 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -2,10 +2,11 @@ // 区间倍数二元组,java版 // 给定一个长度为n的数组arr,下面给出倍数二元组的定义 -// 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数(>=1倍) -// 当i != j时,(i, j)和(j, i)认为是不同的二元组 +// 如果arr[i]是arr[j]的倍数(>=1倍),那么(i, j)就是一个倍数二元组 +// 当i != j时,(i, j)和(j, i)认为是不同的二元组,不要漏算 +// 当i == j时,(i, j)和(j, i)认为是相同的二元组,不要多算 +// 比如[2, 4, 2, 6],有10个倍数二元组 // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少倍数二元组 -// 比如,[1, 1, 4, 5]有10个倍数二元组 // 1 <= n、m、arr[i] <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 提交以下的code,提交时请把类名改成"Main" @@ -29,12 +30,16 @@ public class Code04_Gosick1 { public static int[] arr = new int[MAXN]; public static int[] bi = new int[MAXN]; + // 每个数的因子表,用链式前向星表达 public static int[] headf = new int[MAXN]; public static int[] nextf = new int[MAXF]; public static int[] fac = new int[MAXF]; public static int cntf; + // 莫队任务 public static int[][] query = new int[MAXN][3]; + + // 二次离线的任务,也是链式前向星 public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN << 1]; public static int[] qx = new int[MAXN << 1]; @@ -44,16 +49,13 @@ public class Code04_Gosick1 { public static int[] qid = new int[MAXN << 1]; public static int cntq; - // 每个数分解出的因子v,都会让fcnt[v]增加计数 - public static int[] fcnt = new int[MAXN]; - // 每个数x,都会让xcnt[x]增加计数 + // xcnt[v] = 之前出现的数中,有多少数是此时数字v的倍数 public static int[] xcnt = new int[MAXN]; + // vcnt[v] = 之前出现的数中,数字v出现了多少次 + public static int[] vcnt = new int[MAXN]; // 前缀信息 public static long[] pre = new long[MAXN]; - public static int[] cnt1 = new int[MAXN]; - public static int[] cnt2 = new int[MAXN]; - public static long[] ans = new long[MAXN]; public static class QueryCmp implements Comparator { @@ -89,23 +91,21 @@ public static void addOffline(int x, int l, int r, int op, int id) { } public static void compute() { - // 单点贡献 = (之前数, 当前数) + (当前数,之前数) + (当前数,当前数)算1次 - // 然后把每一步的单点贡献,生成前缀和数组pre for (int i = 1; i <= n; i++) { - pre[i] = pre[i - 1]; int num = arr[i]; + pre[i] = pre[i - 1]; + pre[i] += xcnt[num]; for (int e = headf[num], f, other; e > 0; e = nextf[e]) { f = fac[e]; other = num / f; - fcnt[f]++; - pre[i] += xcnt[f]; + xcnt[f]++; + pre[i] += vcnt[f]; if (other != f) { - fcnt[other]++; - pre[i] += xcnt[other]; + xcnt[other]++; + pre[i] += vcnt[other]; } } - pre[i] += fcnt[num]; - xcnt[num]++; + vcnt[num]++; } int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { @@ -121,51 +121,55 @@ public static void compute() { ans[id] -= pre[winr] - pre[jobr]; } winr = jobr; + // 接下来是winl滑动 + // 课上重点图解了,需要考虑 (2 * 滑动窗口长度) 的修正 if (winl > jobl) { addOffline(winr, jobl, winl - 1, 1, id); - ans[id] -= pre[winl - 1] - pre[jobl - 1]; + ans[id] -= pre[winl - 1] - pre[jobl - 1] + 2 * (winl - jobl); } if (winl < jobl) { addOffline(winr, winl, jobl - 1, -1, id); - ans[id] += pre[jobl - 1] - pre[winl - 1]; + ans[id] += pre[jobl - 1] - pre[winl - 1] + 2 * (jobl - winl); } winl = jobl; } - // 二次离线阶段,fcnt[v]表示v这个数字获得的,因子的数量 + 倍数的数量 - Arrays.fill(fcnt, 0); + // 接下来的过程,v的(因子的数量 + 倍数的数量),都计入xcnt[v] + Arrays.fill(xcnt, 0); for (int x = 0; x <= n; x++) { if (x >= 1) { int num = arr[x]; for (int e = headf[num], f, other; e > 0; e = nextf[e]) { f = fac[e]; other = num / f; - fcnt[f]++; + xcnt[f]++; if (other != f) { - fcnt[other]++; + xcnt[other]++; } } + // 只关心大于LIMIT值的num,去关心num的倍数能否得到计数 if (num > LIMIT) { for (int v = num; v <= maxv; v += num) { - fcnt[v]++; + xcnt[v]++; } } } for (int q = headq[x]; q > 0; q = nextq[q]) { int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; for (int j = l; j <= r; j++) { - ans[id] += (long) op * fcnt[arr[j]]; + ans[id] += (long) op * xcnt[arr[j]]; } } } + // 1 ~ LIMIT 这些值的倍数之前是忽略的,现在计算,复用vcnt和xcnt for (int v = 1; v <= LIMIT; v++) { - cnt1[0] = cnt2[0] = 0; + vcnt[0] = xcnt[0] = 0; for (int i = 1; i <= n; i++) { - cnt1[i] = cnt1[i - 1] + (arr[i] == v ? 1 : 0); - cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); + vcnt[i] = vcnt[i - 1] + (arr[i] == v ? 1 : 0); + xcnt[i] = xcnt[i - 1] + (arr[i] % v == 0 ? 1 : 0); } for (int i = 1; i <= cntq; i++) { int x = qx[i], l = ql[i], r = qr[i], op = qop[i], id = qid[i]; - ans[id] += (long) op * cnt1[x] * (cnt2[r] - cnt2[l - 1]); + ans[id] += (long) op * vcnt[x] * (xcnt[r] - xcnt[l - 1]); } } } @@ -195,9 +199,14 @@ public static void main(String[] args) throws Exception { } prepare(); compute(); + // 加工前缀和 for (int i = 2; i <= m; i++) { ans[query[i][2]] += ans[query[i - 1][2]]; } + // 贡献是重新定义的,答案需要补偿回来 + for (int i = 1; i <= m; i++) { + ans[query[i][2]] += query[i][1] - query[i][0] + 1; + } for (int i = 1; i <= m; i++) { out.println(ans[i]); } diff --git a/src/class178/Code04_Gosick2.java b/src/class178/Code04_Gosick2.java index cf535798c..68b880172 100644 --- a/src/class178/Code04_Gosick2.java +++ b/src/class178/Code04_Gosick2.java @@ -2,10 +2,11 @@ // 区间倍数二元组,C++版 // 给定一个长度为n的数组arr,下面给出倍数二元组的定义 -// 位置二元组(i, j),i和j可以相同,并且arr[i]是arr[j]的倍数(>=1倍) -// 当i != j时,(i, j)和(j, i)认为是不同的二元组 +// 如果arr[i]是arr[j]的倍数(>=1倍),那么(i, j)就是一个倍数二元组 +// 当i != j时,(i, j)和(j, i)认为是不同的二元组,不要漏算 +// 当i == j时,(i, j)和(j, i)认为是相同的二元组,不要多算 +// 比如[2, 4, 2, 6],有10个倍数二元组 // 一共有m条查询,格式为 l r : 打印arr[l..r]范围上,有多少倍数二元组 -// 比如,[1, 1, 4, 5]有10个倍数二元组 // 1 <= n、m、arr[i] <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5398 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -22,7 +23,6 @@ //const int MAXN = 500001; //const int MAXF = 5000001; //const int LIMIT = 100; -// //int n, m, maxv; //int arr[MAXN]; //int bi[MAXN]; @@ -42,13 +42,10 @@ //int qid[MAXN << 1]; //int cntq; // -//int fcnt[MAXN]; //int xcnt[MAXN]; +//int vcnt[MAXN]; //long long pre[MAXN]; // -//int cnt1[MAXN]; -//int cnt2[MAXN]; -// //long long ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { @@ -82,20 +79,20 @@ // //void compute() { // for (int i = 1; i <= n; i++) { -// pre[i] = pre[i - 1]; // int num = arr[i]; +// pre[i] = pre[i - 1]; +// pre[i] += xcnt[num]; // for (int e = headf[num], f, other; e > 0; e = nextf[e]) { // f = fac[e]; // other = num / f; -// fcnt[f]++; -// pre[i] += xcnt[f]; +// xcnt[f]++; +// pre[i] += vcnt[f]; // if (other != f) { -// fcnt[other]++; -// pre[i] += xcnt[other]; +// xcnt[other]++; +// pre[i] += vcnt[other]; // } // } -// pre[i] += fcnt[num]; -// xcnt[num]++; +// vcnt[num]++; // } // int winl = 1, winr = 0; // for (int i = 1; i <= m; i++) { @@ -113,49 +110,48 @@ // winr = jobr; // if (winl > jobl) { // addOffline(winr, jobl, winl - 1, 1, id); -// ans[id] -= pre[winl - 1] - pre[jobl - 1]; +// ans[id] -= pre[winl - 1] - pre[jobl - 1] + 2 * (winl - jobl); // } // if (winl < jobl) { // addOffline(winr, winl, jobl - 1, -1, id); -// ans[id] += pre[jobl - 1] - pre[winl - 1]; +// ans[id] += pre[jobl - 1] - pre[winl - 1] + 2 * (jobl - winl); // } // winl = jobl; // } -// memset(fcnt, 0, sizeof(fcnt)); +// memset(xcnt, 0, sizeof(xcnt)); // for (int x = 0; x <= n; x++) { // if (x >= 1) { // int num = arr[x]; // for (int e = headf[num], f, other; e > 0; e = nextf[e]) { // f = fac[e]; // other = num / f; -// fcnt[f]++; +// xcnt[f]++; // if (other != f) { -// fcnt[other]++; +// xcnt[other]++; // } // } // if (num > LIMIT) { // for (int v = num; v <= maxv; v += num) { -// fcnt[v]++; +// xcnt[v]++; // } // } // } // for (int q = headq[x]; q > 0; q = nextq[q]) { // int l = ql[q], r = qr[q], op = qop[q], id = qid[q]; // for (int j = l; j <= r; j++) { -// ans[id] += 1LL * op * fcnt[arr[j]]; +// ans[id] += 1LL * op * xcnt[arr[j]]; // } // } // } // for (int v = 1; v <= LIMIT; v++) { -// cnt1[0] = 0; -// cnt2[0] = 0; +// vcnt[0] = xcnt[0] = 0; // for (int i = 1; i <= n; i++) { -// cnt1[i] = cnt1[i - 1] + (arr[i] == v ? 1 : 0); -// cnt2[i] = cnt2[i - 1] + (arr[i] % v == 0 ? 1 : 0); +// vcnt[i] = vcnt[i - 1] + (arr[i] == v ? 1 : 0); +// xcnt[i] = xcnt[i - 1] + (arr[i] % v == 0 ? 1 : 0); // } // for(int i = 1; i <= cntq; i++) { // int x = qx[i], l = ql[i], r = qr[i], op = qop[i], id = qid[i]; -// ans[id] += 1LL * op * cnt1[x] * (cnt2[r] - cnt2[l - 1]); +// ans[id] += 1LL * op * vcnt[x] * (xcnt[r] - xcnt[l - 1]); // } // } //} @@ -187,6 +183,9 @@ // ans[query[i].id] += ans[query[i - 1].id]; // } // for (int i = 1; i <= m; i++) { +// ans[query[i].id] += query[i].r - query[i].l + 1; +// } +// for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; // } // return 0; From 5408c9caa97360addbdbd8275f5491354715c7da Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 12 Sep 2025 22:15:57 +0800 Subject: [PATCH 0723/1170] modify code --- src/class178/Code04_Gosick1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index b6f85627b..fb904bf21 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -122,7 +122,7 @@ public static void compute() { } winr = jobr; // 接下来是winl滑动 - // 课上重点图解了,需要考虑 (2 * 滑动窗口长度) 的修正 + // 课上重点图解了,需要考虑 (2 * 滑动长度) 的修正 if (winl > jobl) { addOffline(winr, jobl, winl - 1, 1, id); ans[id] -= pre[winl - 1] - pre[jobl - 1] + 2 * (winl - jobl); From 01ebdbd09224139da9df7a09c037981984fd2c55 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 12 Sep 2025 22:42:30 +0800 Subject: [PATCH 0724/1170] modify code --- src/class178/Code04_Gosick1.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index fb904bf21..96dd2ba5a 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -107,6 +107,7 @@ public static void compute() { } vcnt[num]++; } + // 第一次离线,执行莫队 int winl = 1, winr = 0; for (int i = 1; i <= m; i++) { int jobl = query[i][0]; @@ -133,7 +134,7 @@ public static void compute() { } winl = jobl; } - // 接下来的过程,v的(因子的数量 + 倍数的数量),都计入xcnt[v] + // 第二次离线,因子的数量 + 部分num倍数的数量,都计入xcnt[v] Arrays.fill(xcnt, 0); for (int x = 0; x <= n; x++) { if (x >= 1) { @@ -160,7 +161,7 @@ public static void compute() { } } } - // 1 ~ LIMIT 这些值的倍数之前是忽略的,现在计算,复用vcnt和xcnt + // 第三次离线,1 ~ LIMIT 这些值的倍数之前是忽略的,复用vcnt和xcnt for (int v = 1; v <= LIMIT; v++) { vcnt[0] = xcnt[0] = 0; for (int i = 1; i <= n; i++) { From fdfab739b24ff1cca865b97482de2fb81d5d153f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 13 Sep 2025 14:04:30 +0800 Subject: [PATCH 0725/1170] modify code --- ...14\346\254\241\347\246\273\347\272\277.pptx" | Bin 0 -> 47603 bytes src/class178/Code04_Gosick1.java | 11 +++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243178\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2303-\350\216\253\351\230\237\344\272\214\346\254\241\347\246\273\347\272\277.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243178\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2303-\350\216\253\351\230\237\344\272\214\346\254\241\347\246\273\347\272\277.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243178\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2303-\350\216\253\351\230\237\344\272\214\346\254\241\347\246\273\347\272\277.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..13a4577e8685deb391776cf6599db1724eaee207 GIT binary patch literal 47603 zcmdqJV|1lmwy+)B72CFL+h)bKT}j2J2HMa0^*AJ@|O(2n>JGH8QxkXw#TxH2?5Qi1@CQ#1S?S zi>hbItWuiJFXN&uffbkO?+m)#YI~{V$C91SG{LVK=c^gW<-`0I9UVUpUWDL_u3bBC zJrgedod-*jF8J)HweDneApn>Gw!$7`)K|dMYy6#0c~(Z>MOiwq*OhF@XX5BWAo?Jh z0Lx4aotllesq4GLZ>aShSj9hy1&nABt@U&3IKV(a$e&^{u{Tz9vUhN1Ft&FxrT4J4 z`R{~d8zW~OEQlm}`3{rX)@VlvrgfjJf({~OSS7MLW0Z+l$b;qYM_&6wCPu8oYun_33xr%?|XBh<>!T^>?DF3YWU0^Qe4)Z0hJEm7dSTI6>BT-q) zWboL2QLMU5jAKalb)oq;l{wyTWHSlq@Lj#sxZQ6tI+D*?;!BibjcILJOgv3-mLa|mtz zVens_f-`wl8&Ct%qWTIFnvRvT_NOt<*^~o@5dg!WvYEQ6B6+H_G>=?rErV;C5q<}_ zySc;KMMk7=cLC)wuD;6EEZM*+Aq13NU+b>BiizHyQZD9bOcd@1aQ?iT+I1^P22da% zaXg^Uy`Ta)IJhu4IGH+|+PN6HSlZkD)sD_nZS7YWk%l%eRYW~`8azp%ixnGIOXW|f zRa+4aqd>LrC~EN_e4aBigM*c4>}EYoiF%el+HTjcVUZkNJ4Q+x$aPJ?aaK19taXC7 zzsA?>FTFqcxW_O3N>I?)FWwVHB98}?fc^FZGpD8lP>ahI(@g^)anwo-4opVpl|V`M zIi}@&h97Y{d91|Y;u`(2-hUh0k71c+bkoqShA{L?iZiDbp=MNi#*9V)P_a3nL$?2+ zjS^PI4t>*`$Lbm4Nfe=~ze8-#TwfOmm!*@!6etDT`WP5Y`uegXG_1j+-iW!{i7{w| zB5L$i$0y%S5Nm02Z`6|}0}T+S;;jd0mby`gBIU0?)rL^23KJb57+#lbujdKtKflP`baHmVZ^fzce)+3+wWIgs6~LFMMKs9R&ub zg<5StFcb8CU{)Y@A012BFWCsZO!9n-qcg{Xc?0t7 zrex4jH$STIXxGZK?ObXXlt`qHm*bIC_-Vu}60O{aHwa*#{&IW^{9~h}`6zr=Mrk*2 z+Fcnm<{RNa?^)oDl7hX4ndI3hlIMVBz{lNz+Jdsj*4;FyibiF35YQ8CbLTisSh0}l z5z135PVX<|c$xm1@3GK3D9cDSGGO~}o~Q5G*z|BCoK21>DY#<4@!CsOAVUVAY~u=K z!p>Guvcgme-wDMzOQCGb=Z}5vv>3^q_5DKC`$h`_9l@Qru}N^%G_|Y`8Q49`e$GcU zXF?+{BN;I!5I0iyrlN+cAy4FMYNK7tM$DH=nkkq2p?Tcp97Zzy8GzE7-8o~QC~y0R zE&DG3{$bGmihh~#a*>}r54n7g0JO&bz-78GEr~Amaq@^do-eDKdUMKa?8_aqC7E!27tpmFRWoR}0fD^lc7 zV5sTyFDJAA*$KYyQyN+SBn>x9Q}_Q_8Z$k1y^L@WTRaL%`|@+S&~j+s`^YD88zIBK z$q+9%nm~^3PT`ze@?_(Y9Ddx5ZQxySs&g2ICwk2-MwbwJau2y2PaF<8zF8r>EYQ0* zLCuBJyk+G(cR&~HO=@2QPfN*R0VW~7x`_SssWEp;VCGzro3o*7{V|?#Xnw;AH`B-S zL?cX%7;NMsRwf;$g-$1sX9}ToK=GzQ_G(Xt7Xt2hKE?o%XO4m`eGYAIv>Xj%%knEu za1LjigVqb$_@V4y&cxz<#qQty8^EU&(Ep*I#`d3E!~ z8fQO?{(T=^oBqm)#+=3KF7Zg0ogYOphuUntgP2xSS~{Q+uyBJ#Oi?_MYv_6gFn-~ zR1+*REEAEfI5{iru%R!dc~(pGVd+oBq4wx!Xn_NHNLW4otuA zTCGK%r$NFrKb3Vaw znT}uUa=0)94%~L92zCv|4=sfa&_<~9T8de=6On-%Dv~X=j@L$q_SBuUh1f@5DydCF z)uB;RxW9b6s<5eL-4;_DAGpmQPQ!KC6hs)VD075Z&yZb`^;5vOKa}wM{SB`4TS1-U z=nt>0$Yb!`#kA@iK6Qac=ij}{EY9_HdAFsbH1Z{hH}}^1^3tg=;GG8kd+OXlJxvuE zCN36ZYpTM=2lMjM4t`Ds7V&WG&RHY&7C#%XRs?6GUtRKJ?1Gc#M@@?4k_j%V<&wKL zjn0oiGSqWw)m-=OIELmXQU!|?PpQ$O>~zQ{=xVqa*lX8UAx1BqEW^`LUW0F{lk;0O z)pCdVZ-{Bcj4v%9i}bu)-8BfO;6a=0NS*RJ6CYX!MBboU?B?`?eF?t5>z9pW??>8|M@5P06fOY>5|WoA}27B*SX_<|R>j$sl`6Ndj`eY3->&T8^kIJhZyuj~v4A^?8TCnFM<3F_#}jap(l`KU!cSiNsc{ zkFJ!E5Eln@q=M#f^Pj+o06*)fEzhj$BkToC+L_Q4Ucr-$ZyYR4BdlqNo8R-+EU~f1JjADkAUi^YJ3pJhrkLm&44(e!tY` zxU~~n9NR(Y5^rAou~71}5;LzCWjc{(Y132NW&-=7k&Cyt$GbG>Lltsu|Em6R;01Q! zMUB1SRVoM8o8_vu;$&?4-C2y2aZ|L`U2?t^>fz=7>pm!+ug6lPjzF*`!b$Nx32y6! zKSn*GBSW5}#i1BN*>7Mb!+2gT^lFC8Qf<`&xDZF`i$2{E>ySO5iKEvDS&Hcop{R~R zyzEynODEMhgxVK(C%d+i^URFN;)|fxZf!d?6Na?|o5JB|>`;uuN8GLxF$|KfU+zp7 z14+3D z!YZ8bmfYqekOD}nT_GaHr?C~R8`(P-AGL!TAgtxG*#Z}XwZHUo56-?~lN&yn_SFw= z%)`(vAcF(DNZCasdGM&zon{qo$PwdiFCj94K@dp7`}5q|d0s9<*o`e-R*TW;tQnm) z*aRWybeZC~E$t-R&Ku#>+w3B&R-3L~R!3_$4xcl|tPU3UHS;+Y8z1%lp3aG>fn7BY z<%VFeLBv17?5O7RqO>8uU9E?azoAY#t@R`DJFCp2JFsD&{Iuu3hWeNP}hRWmss#f%=&kcfeQ!MTXKC&;eSf!%`Ufw)C*C2vcaY z_u}i9`t#QMNwW&6`k|O&f6tis1e#?-2ipze(4|sNY+<~@OWU?6=3oc7joh{M8}zf) z?)=T(m^yABg5}E<{vs|J40ANDb+4sW9(%6N50Sf5E2c6`H9~O(AH!2`x6X~A!D#FSO&l z(w-vAX%VbMi{7oda&i~ieTheW<8UEw&DPyaTbw%D*bc9uJ;x+b@SG4C5V-!32!5Ej zdlHnadzenxPFFD**+Cggk;Wo1L`6gtOYvX$Wn&Hpa;%4$_E`6Vd7N?)oQTiT;cJN` z626=dhZB%Xd^L6(4#Aa^Zzn0*6q3gjH4C*Fp4qz_J7|(Q2klXQ8{NyA>zO{M39!pq zn4^*qE&K4Oci6&@t+WM?J8XL%9a1RQqlIoldBj{1==?Cqg`I_i)PnvgPfKC1Zpc$F#LHzDQhd=>qV(f1#t?LS7ne~fZ}jCFjl zHUuAB=Upvs+8<%(XUhVAHm z+WP}$#5a7ZaWTe)Az)G~9rEiYKP+T*hFa#U+2!0{PXEbpd`wyQaV7&->ztlK>_s$u3# z2=kSFiZE36G)*+aoC?K5QD*{Jez@2^a~j^zu;c5`U%yc4IFB+*H*P0ZP%S5`H0GFa z71_v)xMkF40MIgO@yJ%4M`5HPs3>d|W&`eZ(gExn2ysL}izq;;AcnTUaZEsq*g&bE zhUdVq5JGf*52Xu;f0nv(VPQE51Q3vj`v1vvxLBClnlk+H{A({p_YW_|_fiAOORv6_ z$4#+FG96Qo@EltT-B))S#k3@cl1}RI_dQvOH|daFnv2dEXF%T=kvS(XZiGmW{pPw^ zfAe5e5m#pVB+e=;Bm6C8!D-9W!~V|wypQ|c2^}{o^kg;BOd>&UODdESt~NTNDbtSq z4Ty>s#v!eUu-WoT1ZHb|he^Mat@l?`$^x^6tn)ek*j?6s3eV;dMl@3jxG$vng}hR* zcG#$<9(Jvh0++}NeGF36)t;)SUeeW8!)ij3OJc>4)fG}M`^Ekl6&eIkES1Qq={+US zEERc8>Y#*Q!*q@mzLx>bB(;?ZG@aRp@j%ZT%>9JOW=ssi8f`o`Zi-(AP8u=VoZP$H z5+T?;-o)9Wm>ii;zq`_pe2}nlWWHU)->|>#f%4mVDdO{)-k~7z*yMBb@_?6?l&%sl zH(rf)#g@!Sh|Rki$OW}mQV$h0^`>^4rV=r5Zj9sP8v@kLBe{deC{b<`FtrR4!^dA^ z*;k{4A~3B0Lp|jIod%B676=#wsuwOa02;L#$4nfhhrc(IJVsd;c*@UO5W%{NH`$Vx zN}ALHR{AQiW-WvEcVwsmkzi=bX?bMjo(uPBIAW7zeB%|q)*Jw3r3ziK{8>2Ma0O3Q zbZ<93JJ;5k7Pd>68&${`m|Fxt*&iw(4~Yk0yR+XU3bgR7N5#GpHt2DFX+pKVLPEx+ zYD>YJpS$^{vbU7UC9N1N5y7+Tyq5aP+r}1jsl4MEWrG-H1F!KV=PkpLg~L1$=ZAP$ zL<^P-22p|*(aWxjEp}M>{;eS8DDZ`TB%(Mkj(L*t%WCu zkx#q*eLN|g45#uY6!Gl*sI7W-nfpR$bGei{jV4Zw|2NDy9KdYhrp_Co?KC@)U0)Tt z^iF$!W*tDKO|^pA4uw&2*J&OWN%mDzNj5WSz~F|4yk(xEO1Ut8@64}UcYEJaV=-+I zUd8LypCim@j?iDZve2-UqBz}XeY`Y1C;d!BzMfc_C$s!F0eRTuC~0m^qJ|yMV4>kL zH}V8GWekV#O4-fKeprLA=jkvBE<*txbN{4ED6?bb7pmwz))e8i%!#-wnflh|6dB1j zn2IQf5|-{72x2NV1T8$#$s=#Kg0e49q6xG2P9lBcLM`cNMkSWbaFB@Z>IB!F)04Q0`L+xr!2g$x(z`P_4?sZ(47+*H%0g@F3*7S<){SgY@x$+6a& z=Bz3uHpI~y38k+LnqJ@4*1yY-pjZk{sU57&%T=;#rR^JxC98rZIlPoW?oeCrYk| zJ%ziunKFnl?ICGw{#?tt(J5z>=lGKtjfpy@xf^+F7*k>`nFQYfjFWi~xoSTQ5f?Zn z%CX;`3k66bfW#OVT02HIfTTN~DMnU12KVo4Tozo+;4wfFgPhE^T+E<21WOnd8zp5@rWfzoY;V@kRO3Iq}j2evukAl*J-N*`-P@Jp z#^%x&G+_K3w#H9rzL%OUR6JGEfHO5KX1BB|hW$Jh27Vp?7?~0*#-{|y@!En4J_#g2 zDus;sT;TlE0+0luDkAPvlE}SWu>RTw%tBw=OV?f7OXZ~;pFIr2rNFXU^ZQt9#Kt8g z@Adwh0P}NNSbWpH8n`$~)nQpg+@&7@fqsAJI&AJsH*(kos03jvB5vRjzXRAmF962~ zx)5;Qc#A!hWp}c@s{MRU@sH8>{g)gHPWU&WxzCh(E#kk#&ay_H_O34fh@JmF`Ae&_ zprQA-*xB!r3ao?Yxxp`rTkOmx5`4D5xC1hqj2lIrxP|n5i4J{f?yToGDINe&Kt9So zNiMjEcoUXk&$>BoQSA9)WT3H#;H;#~+|a@DtC4ZULLabN^0s=iOIah3(d9iwo;zAK z9cWho4n<6EVTGYw8@?M>-pz($o@fN(jWcRZx}Chq%_ZS(SW=0*=}J;0PF91%>kpG< z$8H+JVA)u~6h8tl3ku3DS@rERY~;?j#0G8N&~cM7>L#dC;MQ5i z2Fj%f<8sp4m;Pk{UGrkc23@n-!Af?|l6>7vF&9KW_#yslBif8f*LK4*B>SSDmB>2o z{DP9T2Sdd;t=YPj`WoDk*#HCRiu?;u(Szc^C?|*D;qc*C8rV@fQKwTBDWCiz#^klB zBmH=RTGfwo3*oN9Ct#2_SF4X2FilRb^gU5*1f?o!|zXn^{QW;q}XGrN(w3xQHd(vq;~4|YjywE z!Uoe08<}S0)g8mu(n>q`mMD^IETcY7%TUO1WTg-540Ph*!>E){J_I)B9Fv{#X+7C9 z!}pV>@2y7-BxCI@Me|m3c}?*Mosze-|#1+J9c z8Sk^C_-ta=HDumCTG}iyF3_^j--JM><+sPSqwB7C(0d3Y=VALerihO;gM(<>2^Vd5 zZRenPuy>8H!+(<6XAM4T(RsG$jY+gRg*JBk%z?(LX8~O)fP)o*^!@~v=hf={ZK9=a z8dGs<+Yw^CohSkx!X*grcl`be<(cGm$y*!*FUuBj(L|ay)vM*f6>*5sL+RS*kk~(C zlStZQgX<@o%h~xl$Il!ThqQITi?3UR6N}5je>|=B%JP+iXQF1&c~O^viLC%@K^{EH zNmR6CtS(jPC-)PRS14Cr0X{)&-%mrq#=#cb93PIV(X)pOK>>u#!^_Tpp@g>~YGCUMSB$}zz7f^#35!8ttmk6E`0bLu0dY2ShPNUp zVw)SdI#*kc=H{J7EAO@#H@!ci+;OqBL4_zfnB|?DV^h|VpDV5Go5OTzE!m0U0gmB) z8P1$c$$L@iq$i-QH>p1L#3?LR=)pcv(KZIZAklxp9kI(YQzAGj!pB{Ixgu!%NltQo zwm+9UCP1yJ9o1VViDldqQOx9=?NVVc3r~mE-I{EB;I@GAXU81mK2 zlmX}cD>fPAf+vuX#D_Q&9JleP_wRin3l?$(r5-GfSK)_*D|_w5X{+J4rxQa;CqA6M z5BgDRdb$9f&RHm=XzYY=6)U>I%CZ{(bFO@IHhdIai-~AoMY}7kRA&H%dRyn=06mG? zu8YSLDz5>3S%&_V&wxdq4h3LQRHVMNJouy|yvXAVfZD-$Mue#5Fa#{f^fGwssvEw{ zX#~ySBq5`2QsgJjRX_(loG-;u{|pXf3BdnJHnGqNVgAZ*sGQfD+KgKvhxVzRUQq;d z%Z^%4JMd3-=tdu_psTuDvykZ!}VEpT$&R;Y2CKVb8> z9P-K|J}p_D>lV zp7Jo2NR}|F8d0TmecpHDYKeL`Vo5w(=EivU{n62FADnFCzQK;DWco7J!EdxM9gwM4 zyQERRRe52?h(%gRYsS)p!qji!P9d_!JCbSELw5=H1+x{F_Fq9&^fbL#_6IU+bi2_| zlt0#r!xOd{hXwV1lSiSzaX9&#)Np*Ah8NJW>@06JZ1j=64m7i7Lz7EXzvvWP}&LdMNyq# zX>qCJ(xl4I#K!k{u1^^=u~GABoEvf#x@A^ySbhjLH$Y%iM(eipH?0@C?}Xxe1$s(lg#o=Q>0XNGjh!-MI~vQ^BuihMksUScRw`(2Zb%HGiS#a1d|M%51c zla;*xG&L9TAmmxSgM{wpty}$_Znk}?2^K_a*oU~u8)-O1jB5g1R=2*n!5-}(L4sWv z|7`huU@1D~<^H1z{TZhUk%txJVV$`7{st_-pO%ml9mx;TVQ&%TUT3Vm5+M1qsv|)evZ2NJ|4cfWVPR^ZtOBEolrk=H~ z5mc150RACdu$9DjWgmMg4WuOw3mN~_S6}1Fz75a!rDgAKz3a~i`hSP}hG;R3(z2;EfC=9CM1 zS1F}zg9OB}6c>hkO0s%mEVeBSCkB=}=L1@E&dZHU2XOYVNB|&w*T4fokTlOz>VjhO z=NMwpyr=)u0Uk~ybyuLbwoEo_7-nC%isZ;(B~2}e5hXpPi0F9*)sSK-RhPRnLenTp z~dBew55s&A`)3RY{ORy1<_B9sJL;;4>NqHO)*l1e#KOfa)?{flnzl&h32 zdIj>4guss;)4`H#YtMM4HBAfSJlaS7-H!?b;N0w01x3kz445?kc1DIu$?*G~ zf?P5kRW3p#nhsMc8Zf`WA8#-R;7O>uYO_$#jeAhX$jd%^Ha!PxM;mqrxQQ)X-75}j zW_ifY6#%T}&63R~5zdVYu0?xr_%rgDR#ERamwW6Lskr5Va-E5YHvHxC#|nuRTSSLg zgoWaAXMtYmAoQt3JDO@bQ(&-iMl!;npYa}L=8XQZgd;*q#=4Q9S6}9zCn7>H)Xid; zt1@7HilRf49b-F?-iWR{lu+`s#CV|E74SO)x6=Jjh?n_awF@*LhgNcltHH__fz@ zugt6j>n{K*#|~(%W$jgk>GwK?Ay8Nly)DPb&v_kmcJOl;Y>stQO=ALDmMFl0ZRLi> zkBg+S;S~j$%D(4&Oj4QE#tXzYb>j@e+xo?MY&_IQ15ENU;H@3gAcRmlQ7z+4z}3Q? zP4zq|4;*abhR5=*jz#jhA_Ni=i(d+F_?m@qR0Dawb-uma(^|2jCQWwAW^{cf!1%2@ zsXqLRXs$!_GvEmFXk>RO!}P-{zr>7ts625CW8UB-Y)b>mu)l_IX)|nF<@5p|YQzmu zhrgM65o)qekuG&hn*)BMv=*VL)Z3XBRM%E$Hno*v7$o!jLa?W*Ns-8W4|TFJm5Fxh zZJx$8>aYU>>i|;yHvM$wng_*=YQzAObepRYOMIp%+CllscpX}WFFxNB_F|MTl-B8m zSrfRO<#&i!v?JC5Ks4Evho@|lyWlAn5F+B#AmY^^dQR<4MI+;Y9x17VgmV{j(a;)yj*s=U6DE@ZRSG5*Wl8HXzePgmRBpkn~6WWa|tU=+F zmhz1rA|^rFVB@Ivc6q+iE>KBEw!)6>G*Gtaw1*gvC?}H$ac-#>n4-RkHa}xcG({;{ z`-Cac$d%xPpH!%qXj{d$mnCB-wG>rhfvmM#^g6)bfWAV%=HLO2?ebc@zcJRQgB#{_ zybRbyU(k-844gHmp*@&?t=maqnQ2}Ja%XofJ=x<=N$9W0N=)Js>!gRYq{m-g*S*NN z3KD)$74rtc4}|%Ou47DQU^S9tyW#|Xo zTdLjxl4=JK;-+Kcxe<(%GDq*&nd@O(>-9B@^EI|h*XLg8od)L)eC-LjjW}oTIHZl0 z_5_l>MbkD)=6bO_R-HC8i?Rlnv-z$iLD@RmN+B2EZ&y=YQ;ek#W_PNDIkCkP~D@Dp5si{rhV&XXL=@(JGKCBZ*yM`{H5*>4~mDX zYX>HUgAqCVdXM!>xn9!aXo)^gd)|vF$dUAG2iDdn9!|<20Mv9ym#(gl4Wh%k?Bguc zTTJoGsP$gwspccuK6Wzq9VSSA8k9)(RNalVk&+;4&Yk$5-ssDkr3TB@LP5LZN|{sPa@03>F>tj1Z4R=Zls=~K?t zlo&5177osU-4RK>8j!W5cuIVOoWa4?N1}_?T~#6W9GhMkWP*FHfNN7?4QveQ-n-dH zz>&Eh)xtT0Onxe$Y(|`1Z;V453+P_ko&_*j$wA@V7gOESD6LyGD9hm0UX~R=h@n&B zpo*SHvct1wR}1=g|7;`6TCkpYTTcac1<_lzc}07|te_*5i#y9D_2-O}xlw?uReAuf ze^9zCMSfVE^jLb5GHnEIs?UYvg?c`{KU~a~0M;q0{r$U%|4nb-_WUO;wL*5a6vdHL+mj zUn_d(`j7**C4lo{L2@5}EHrrM?}rVzP3K*uRertz1eD%#$Q|>hbJiMtWVU{xSi4iM zW?{W|y?YcvF51z0v~BK=5J%4*m2&9m#(0^(QJxIUNv%ZgDsjhD?vA*4-Gka?wg8$3 zt*5qnc5>HUgeG303yhx;%0j6<_KXzige9M_e&t^%0`$N6qn5#CJ~akgqEo499+ow;Cu*M=*#5eUktk|s6*?&!n<{p1A74Q7eRo@QO^ zq~hpKAiYH=;mjv-;fF2-Y_PhUSP-EVRKby4VGq{4p7CPU%`(4X*!rBa@Dx3Bx13ksMoB5Es?cpS8wHKya)C{aDbQ@ zCb6o_^aA^obG`&hetyvCPxeU!0@Lk2CMw9r95kbfr9Pt5cQ&y4B~P zo*pW#DtVB&erhs}ur4#KV#4=l{#%loPGkY48_@gi(u?bNwCu}3`{`Jqa+uR&X`CK2 zX+}$J3ctev0R)+!LzGe9OpsWYCEi%E$!Dna`&jWHgd+Q@35u4fFg-|<*nfr@4#OBL z#IJd{;Z@l;SgP`%VIB>}McJ)Y z(4lCx1kWv{>}mJwDaTIcR)4s|vjWmmt!FAB6o#<3=oeQK0#lOplsrECmYdWv6?!e$ z-7{?KW5SEY7_YuZ;Yo*D0X)XSQ z+lkcz6moQVzl;N+AhhraIe##AJx@%ZX6K!-BtKZEkT}m>&(lfqXmXT7qB)c@{%XMc zXzPNX!dom@LLw78Cx3ryuOuTKliViKEibB{^yg~Fe)*8mxP1R#^Yst5{0H(?-t{}< z;ipGc@mXK}?>s7wzv63y+N#rM|J7$zlEt0;9?l>mQ>tLv9T7%hK0)@d(^-jW3BVyc z^WB^5Nm%j+!i22BRV}}Hhq-Gzf7eni46AA>;1|{16fcy8oQL}26xHi*4?gLwf!Dc~ zA0^an13aBG-HcXjeN?pd=q$mgRFr)uQLx(S-drhg*0&n`d9phgD&cCBSM8Wgx{KAj zV=9llQ!>I;oXd>br;TCxXp4n9YKg-43;k3J!TFkwMzG9FlRnGE(F4t(VG#kMoMfn(K6suYYreFr#7N4U@x@j7Jr&U=`LEW^mZkWQEt=3Tv#!jCj*K}2^ z;7?oV_v|5ZZwSBN-isu}xhU9^B^&?;*1CJD&9Rwy1JPz(op90-!g?O}O(CtRwT$C;c zyF8dNd9{+Tz#njai|z|(&C=@iS;cM*LCD-bi>Rz}ACVN^y;^X)R^Ev)U_lyrSd1~s z4{kKGnR15jd>o8`;^evy#iwVQQ9ROwr$kyH>qV1~jXAL1=UODn?hH^$^$u{h%I}Qq zop9iWm=@|H;&XcGTXbP7wehZ7s@@<(h7LwYx6rk@P#Iykz^;qPDur9CahJLL{Hc=C zxy7Igqu8eh%QfWk;&qPTf9s?Dp+EnD41s{FN<{n2Aw7R~ zko`M`aQ+oTI@DL4(mxq8rNQXs4#v*D1wGO)pKvUj<`MA%%pBH@sz?2~Q1qcM6%dV6 zBiu`x8QFi(AHNpISSjwfN;&C zPs)Ziq}rQMSy$hy5!~;EIZe%!a3p|MqZi@W<<$cOngv{l)9jpt#&vET*_oy@>(~@5 zTs-nJ>Xiz;ZMD}3YUCo_CCZK5fzI%(G}(IiioS^A{miFkIa_i$E5`Dcur;$W4!gum z<6vm**Fh{2bm~lwi2rUFT(*eshEVO_&YJ~me*Ej1NG&~IHiRGoV)nX^JbSvSv zCjnVMlL%X4$4C-`{FTt5G+-w0S-o_yo~1@(9YxF#@0?dIU&`Kv?=Z?XcCt&=D`}?klL#HH1quLW&mpy6 zLvG2m$+%Ot9c(mpAk(hqp#VjZs$6WPvQ23QV|DgSeV*oJCdR9&=k6M(dzLMM(H=t< zb9T>nvE0>a&hf{DgS&6Ya`Vw^#7a4URWhxoTPOw=(@w}fxRzaq~6scM7j8;BkER@uFGwW-u`*olmOMq<$s?xA(pC_1G+Aijg<5w5A#5|w#77@ zbqFk+Wz?Zyu`%%r=|bG5HkO3@C<+zbuf`&DAu({BKWf^V#3C3hTS=M$(a13}q)AQ0 z3_p&_Yl<|DabZmdvxjtvKko(U4lW|^)tZKX~#m?uX-yO`SW)ru13pArhQSQI~`Vi zj+=l960sGvIseMJ)b)jukN_IpU6eJ|$Dj880(r`Ej{J4({v%`W-VwdwXJ1Z*O9mWJ zzyzw`Nm}!G=f}2I7=oi#6RyQa#&I|OsZ83lq6DM|uZ7K@m6sm*(hW1@_QYpojJ{-e zgU;hG|EU63+cI!v6(L#qWTqRm56F} zH@DBR4u&Z3(pYLa?b0PWx8G~`u82<`==Nd9jp9Q_2DR9aQ(<_Q_Wifd%CxF&t9=0a}P*C;=%r(~MeOGey2GYfcZVzq%~;xPJNAfyma{hA@MtD(0;C3K%= zp9lSMwM>INzD+AbOxcMUV#)?|XDBp!Xt9%Tu)X8@J!E1lK1s2RDMuqFxolB=4j@#e zn$tJ?R6hEsXyh8W_EbhI6!H1uE2?Fq(#7=YoMh>7qN%Jge5xpKU1X^fwKCsw@5HdR zjYiNI?!XV~C#F4(nMI9sLN;J)q3-B`O7|2vBrSz?(WW`P?^S2;NcJ+)$QuF~IxdLuPX_qik=SA_L zZjs%*oZjBw-J;J}yZw+K%9`78x_55ofUw;-0wg#ZN_`v|_Qz}GrvQiE4szJaK|JE` z?@zykvQ2?IbZ#<}{HHAi#Fkq>43`Ek><^HX^uWlQK!Z?97St`}e*si-R>7*rfMUy( z`_RQ4Ik7_ZeYhk0Xyvk2(Io0DQ9~*arP$>XD18qg(qK#OFnXz~dx+z}R&T|f=XGh$ zbMX4r3Rcp}&wT9T)pM?anRK0Q(ZAC9qBYFobX0{$rgPVtDUnvK_o&ixC?vxwy$$nD z5G{)v;!p^YI}0)3gU0yk7{P57`QAX1l0k{ z;|zbp5}WB?8(uKdw?3Gx7F^2Mwa>Q;t7HUeGLh+qA1R}=Jr^(9uI7d>`hAB=cqZzh z)81FHe4V{~?13F>AMn(hLJH5#nVXqjj~px#=c80{wqXL9h?hyKV%VNzQzDNZkx&olz_Csw{1g%=KG5{D*92CThy z?@g3eUj6FS;g5<>xqSbZ*7kocM49M^{|Ax{334{I;FD}CpPBxDOSb=^ zRYB=*tqO0StqQq%{$6dD$RZYmxBwLn?r5|}enh~EsR6HySQQOx=#Iv7AO1r+>(w)Jh%SZ>jKTLH= zgg_h|y+vKZe~>8MqHE#3p=IkaTB>Ehl|89jPND-?a;!0}9Ewk)PGX}7Jo1LiIA8Q} zqk|re5<&cNU$QjjVuPk*0arpuSE7;y0?L!PB(i!^=ghm%8+ufFCG6CTG-@v*D{7*_Bj$7X*4>QMpi`|JoX09N#7&Mho` zEpP0Xvt_zRTWq(2%8vFBw`7vJag8KPylI^TV=%A)7@|IgKhz1c;DpYhvIp6nt@8-5vJ|ESF0w z*F*P|&OD{l5t`&9GtN1NRJEUc=jJn@PQl*;f2Q}dwg`aVv>&nHhc(|GAk6Z|L>Sb^ zL;!fO;*gFwpnp#pp^Ra8cZ(e-BqehY5s0C;TD4GhU14|mY$q9*m~=8}B>TBaWz_m4 z-Jk}Xhmu0gA+xfkCf`8>x%K-hidRLVt&|^FOy*(LkO6YL&n7lCh z1{4M+Cl3t*E~q74#PS~Zn~mUrVFZL!j4Q{OE1_KraSw&JZHO0WFa|+C`MgOg3O&S&M8{CQAIcDNQW*p z{le`l8KNUHuk`hEzLr-}$=np@kex+yA|;_)iC*9Lwi)k>+u+!$7=I$EV4~ujUt!(= zoWL_X+JV{UZ-k5oyaG}IMLdp=iy# zBh&wY$0z!oz|uYM4ZZFP9&19jC3O6-@>Jr8Pz!i2-tKOg-VL5L4Y|W=(gjSf#{y}o zZmc>*kxC{|ZI{=_ z)Av<28?|hlEB+Hbnp0tyq^6YRluQ>f^f47Nx^NcqU9~{>JlNLyi#VFMuyr=lxuWZY z)F+KNd)6n+0{~1Rd(?I;=7}<-R;>DoP>kYyr1sakzDCKY`Ysrj8aox%{9H)PK=D3% z)@rYq2UuVXRu>|>WF8m%36D(P)mtBxe<6qmu>a=*2x-e*MXv+Uhkx&` z1rQEhnBEu22nKY_$0^_DS8E<(HI?;A$m`zcSA6Z)t`-0FrBz3)Lr~zGBKTD??586v z-GzQZcc6xfNl3Ja(DE#4Pm#Mn24bh^#`$qaa_+o_y51OmsJrCSn;dq|%txCqL-_Pe zr-b3#C&+s43vo=B`)*I{0D1fK%BC7v(xT@@bb}R4VEPiQZAN>99)U~O919}PUiKMD zNyq>yCqF*9STnhb(t2$72y9l=w!yS{dFk@UBn3LMl)Wh?`9_wS$?M82*QMF#0$c9? zdolUH_2j@wihGLU_eN^`9c%r!8|mL39r&%PWw$_&>~pN9?xTDBYpS_G=nM=Ze4?ly z&K{{Wyw1potIO~C3j4Uhxeya;KRR`gmo4|syE`kj_E9m9hOI?)3TWXDfN1-$qAYU? z$oJ*lG+|#2jZXKp4Q0sFMZQ{ScW#wKYj>Q3hivc&C3P}~Y6@#Md0hNR-;%Y6-Woi< z2!8=TEZo>R5Zw0;*;ggSdAe3*TXOpsZ`fV{$LO+ZbBhu4N0RxvJ(L0Gl@i5Rj|^ne z5_-_wbt`?tbaX?7({WpZP!IxE7=IuEjO(nI{}wKhR{0jVDGnPIc{DDRZN)@Mimn@A z(;<~YUWmkXM|qNxd4TCjf{l}U#=!m|kd)X~N zZu^}mA=aH#(N{j@phqZZ&*R;m!HMVX{7$qZ*ZIy@r+(I2-P}6T1E5251wEDA&G4Tk zd+M`_7a)ox4bpW$7nW-I^NXGQV0nB(Rw__w*Hgne1k1?ewMi{C(>?22 z^UknAUV6KBG)%n^Axi{L6hlPX+y2;O7IH+Qg~YH4dEkLy%&-CA*Ccz?Pz_a~B;)`PB6X97DUZY<9F(GGj<}R9!~LE>bJl-6mMx0flaA>Y=g})Da&I z*&qvp`UkPCmc=lyw#p`!%NuZ)PXpb9>ui6+2DpO$xm>s^vlYE$#3!nZb->y>XemTq zO|B5&cpLX0i8;%eu1IcZKH<<-l};jxUpPkMhy-FE;fZggmME2Q$`!{1a5JE{w&yHX z;8%L}Rm9-qF3GT%lI{!MrEiIOcn_HT;lqEn+{eHrB>I8{e`2!JX0FMGt*cc}Bi^U^ zb3&g_8JqUCG+{@H*OT=((hqL9s89`NPq&{I*h;>6V*LZ;G6B0^#M~H=dg1N6Cq`5& z_BOakL0;Ukn7lG5O?bP`x9cBFj$c1aZqXU7b^Ddh&pzUZ)h6sQbmbB%C)S9e`t1`) zZ+<3}G@2lHOB@ileTLgn0gGdnT_8A(Z5heFvh@VYrol=3uDh^|*Kqtg6<&Wr>H3om z3BpoU-+bjWT=S>AD?*jawyB~co_W_W| zKA3^z*#cQ-@#SqsMqwbN!x9Zwf93V`eA#yA;M_ChHDkB9THU zLPFDP7cWKCHD87{m9~+*6sRiIJiGl^u4z7~1gHL{Kab69TI6zzb({ItzBT`cb|F}c z0HrCCfq81%JA9!&TSTH-8g`x7m)9Wk5KmS;@eydgZP7#p+?6m}V3D*bLCfDb1R8}| zM9bDO$zocu$p6lciGA@#yq`%ICWe-$BU&_8T)2eHJL40fxFM1AZP>5VIr=P zVC&bUMS{nkK0P{^^Jmvy9UjMCSi>hfdWgWR{T!T_0zG65MZVH^QeVG;-xkSe3NbP} zM>RL9T1E>AFU_LAp(9=TY5FH96+Ibm3h8jF0rRh*`?rZ%drZ_{Z1+Oj(Wy} zDIJzHF8E>E3tjr$gxlQq*iKq~Ks$F^+@NQrGng3i2^%C_0E0>a^^&y^{dR~!WZfc5!bGpcbC}?=z=mfj9AmIF=Kix(Wk^YH?Jq8 zo^LNUwf6uknK(3F=rsOtg7}_DWhQy1?z++HQe`~4YyDmyC@&)=q+@Rr_Tec;k)&0c zYV3pCC%Z&cpaE2hp}>L#?Rq#@vKqr|9SKH-x`Z|c@D87`rbT-zJs#=cJuh# zTzt0j#CMA8uTwnS>w$j1b{QGc(KD=X^+WD~ku`=h)MF+4(_CJ!x)N;kHBqJ6Qkqj9ag=380uWqe6_q*3 z&M>qz83(N9&rA2~=11YfrkF-L3O)7`Q*vWOm#D+jDulAF?5Zf(kE=#pf+W_EFjNu3 zRy32Ww3scd)L9Hr&w|_+Ck%e2fMlA;2@c=zF$X9WR#9%oQO+^kZvzatEhg{5W)zRI zkT(>s_rRZ}t@$cP zh8_FY4dHLvI9dDx4Tk)L>b@v7-bNOEMko@NiO92n{fzXEVxcXtiOVTy^6H3_ny^D_ zaPS4- z9MDn|Coka3XzM*xTGD5u1bRk!CwQ-g!yGZ|Jpn)8?Xa<^^dk{E zWDOHsmIfc0Q3#gUj(rYujNT}-^lVRmRJYBW5GkJLx}!VvWmF+oBK!Kjdtn|-L?$|N zphfS!##j!Z1YqYMGY>UR=Bt}XNTaaNGLs2FQiPK>Z3Uoge9EdN|d>DBl}xESk0rIaeo z(mpnYVRhOaumDE+th+J{3NeMMVyZ@ihjP4(cxFX{b}P_)`SuVfXabfQ9G}M`$3WUu z2uGx&XcgCWpUm{fE3tCDW)^0>2;IfU$~S!Ic^H4$-JlKE+$9JVG#Oi?mtiB{L`?&~F&VzH@?5H`Kc?a#;Rfp7prsoxIA`T1Z8&jtg9ul~ zRN$;NsGnS%+b$I~TdH`9#m>?=8kuSux`kb5$8sUKJ+6gp%hi}wO{S$eUP@g{*Gbo+ zk$xkh6|Ujq&tt7Op%AJA=BLD%vEJArjO4m4{X8AT=Z!SVrX%!Hm9j65?Y@{otqpSj zPWLY)I&mN}TM#XTFTMSQy~p@H!3N1Kh42(AzM*9Q4Kr4K6FGevHUA-?NKjPZNJg*& zKthiJ0)HW0Bf-!h*l=t_4&(i}aG?^|bVFt3Vz+>NBeba7lJ-9UX3iZuG1sbLs!7hj z1EI+eUWjyPbvM&TMrG9;sA?7yyC!U^)WuCocnM!kitb=`)hk z<4|3{(%8QvN`ph1av=sWePvJfui*=H5&>TOk`2(~5{tVKhXp=oOAiRQ$F9wZA*{Wy zJ?$U<3ydZG#&y5!8%u-q4_KOic#s_F{_k|`AC~@y#xSqQYKO$eHOt6vR!Vyx;BVWFu&MaSZ3Mg?cx^Ate6L4waA{98R3V<+(E zz~h23a!!|ry3@-DWQr6Tl)PwkI&krsX*LWEw|;?1=FZ^dzrcBZv*@P~{5>o3?``1! zU`6iK!r!->n`~iol_?d;MA62%L=#8y(wc`iEXpUT7A+9#^$4Bfj)iBEZlQ9)!r%QI z#ejti-Iu@4Y-OWhs<9wQh@z8zdl+OUhijnU%M5;5`F*=I>E(I9f%TKzC_@o=RvSAZ z7(*%@PcsD~FD-0ELzZJvL?a#%a?Q{v81&^wSJC88(!}!QgrH27H^baV4P+8Pp0NNM z$u?>(3UVSuW)z16sD)kPVyK1sFCQ^sM6VbmiK#-(6(vy>q5K~}s@fnP038`YYAvsb zL#7`&D8noUP>uzBCC>N5mH^VQ4pJZG_9*zBKf&0)ls{NLI81znHp6Q_Gd`L9Kmegl zrALfP{{tBLcz?g^{TDD2XSeimY%=@t+BWh@^cxuInvJ_{b@K_~bLw8o)48)>O5`@f z(c?y4RnD_ng3oD#oc^9Q`bP;=6kXQ74M8*mGCQ!j*6Kn8nYuJy zjRTk${+araM||+*(kM}GjHvyo$-~&TxleuP7J275zON( zITr!}QJCN0xhB9vL&q-iSi~g80QpDU!OW|LDRib$YvGHOBxhta(LcU=&(g3nm#Ld} zvhC`*1R>7LKy;T7KmBMncNc2`-x_!Z*q<8w`B}4*ZU2S6@;tnC;*!C_5O zZE1tR?!nbdZf(yUOrJ*u%GLBMR8#$_G({8v<}fCK70TI!tgv|ou4R~6%Pxhle&H#n z$y`fdyOkYw2G0@u?&YbxF81y;%yC%k{Q0xnmXeH-b&(I>TM?vcYn`sqG0nU1CO$+v zt=80}!TiTc-dzW(Ydu!}3YC!;%t(Hl|ABOYrri*|wPv4ZR|m|3;; z2dHswZ{U7PG6`X*cDg#sfJ*n>=u%+v^s)==>$IxMjkJH&ZN1ujzrKVfO^?Kkfh$hZ z{4flaK(g)`b*BzWglYt9$Y`Jm(DqXlL>nQf0Mg|M0SvtPczFLDGis)N;cG#gP^j52Ub6nEep%L zX%})9rjO@CqSunDywF4*MpU#zWd|VA=be$?*_@H8Z7@qT(wRur1Q1cT72;`XJ)G=Z zdp*6L22*;}eXg%o>|2h)<>E%iGE2AoDg28R>HkfNB(q)k4^pJcHz{)M#Yfomn-pm? zvynQ?I{!_I^nCm#MRv)Y7yJh)l6@56@S7Bwl|n@O6NKZN6xsSaEEHSdFH)ox$3Br* z+&3xmMk_`-o@n$hQlwT4Hva!v`->DQ6oda4Dbk9AQSAS|nmPL>MN*%F92_$rks^KG z{zYs*b56!2Kmh;@umAv1{xOR3AB@PqEn6=%wB)eFkbP!q)i1ctht4Vu2}6_06c_T+ zKK%^1hbu2-8Uy`RlQ+o&5)|=a5Ga&oGMeHl5EP`61M>HKnjSIve$yG#c06*XAvbdi z_xW6JPG@l(Pd-hZPil8FT4^bw80Z=72yIE$u?7~5bd#hopcispO)03fl&tsvGiu=LmGWuZ zW-aJ66}-UuGfX}p9u%T^p*AfC&*E;nU}|8r)Y9$Bhji_0iFjQ-JPBZmJ%5;$z{R^& zIwapJ6tiGe9wq}bV^3`}9jlk@n;I*m*=g9RXfK_q5;JSzCsH}6xRconQJ)}ZT0lKIl~O;YXxYe|nMy%>wA#~uI!hg& zR~EFTsou6GhN{YYLR2jb{EY!mSL^@9dr8a%i$nLd?(2*EZ9FJsV)a*AP0BIC9Vm}7!W zgwc#3r&bfwu{&rSNx$J)LwEXQtf=DWMT*ir{=_pbcBpU#P-J^ygPysbSiobC$ddH! zpMrhD;?wqV@I4lhiI9PaPcnq&Nxwzgrz!gciR}mgB zTXVUsZ8j|~slg_8K6N%Y#bPkmsE^BXWXu@b*Ha7H^UPV}B^5=X**#>jSrRO0u;vtz z)1rjoMmSJ>V=b13FwY&woqf zDe7j;YBT$C$;0E%>f+df>|8WiVF6)&Ep}U9+OWj92;VI2&EHI4jcmv@J6QrGMnWNF z_ZPLj2-(jDOI$ze8eLsNrWJwHbIAFwr9^V#0z;@6p83WdZcEZSj>-P2WdU^!#Mstm4Emvr9%M%NaMs&XpWqmUPmkHpDv ztNpH_t$mYIor71?9J_|icb%Lc%K-EE@yP3-_N{N-r{gj0YC2LG+{Vtv7m50F{{5ma zy(S>(GBb4E8_XZI8?ZA|#kOo}M@rNkrDGC)g^K~90vULOZ7rJr-pgrO3uY!;VAWCP z^LD|z^+wWtO_W3fsQ9$Zq+f0TiZr+i=MJ;{Wr0{12hPf7kHz z{dEJ7@YTnEayY*mo&d6PJotGVOzXtBBEzr$~-44S?H)2z20tr-V+f^N1 zpWB8qF&C8Kv5zIuI56`jWYxzHq$Tvwqb`LtMlHHGy)gZvpGca?OHVx|VQDbZ$WdQq zcQW9|lrB`U& z(pK>Lmti(x*~Zo6x1ULm`CrS?-?u#)8@5;?=-pRJRgc?ifh%H5<(tTA;z6R$Zhm9u z>$(h{vy+1k{K?wN-)A2Azb{*&2nrC75Br`WAY%*cfbLh_p-vjCXe7#5&S@(Tc3)?G zzC3;PymYT^twpAK;3~GmlG^UBC>zPDp^Sw3U%Xyqyw3e3Qd6ay())$33fX{SdX`98 zR*oY%P*H-g>cGu^6fk?UrcTw1n^zUSkrCa8dACO}wfInQ1h}Gh@Zy&7B2f8T@K_Q+ zjc25E9?}Iq?|XXbAe7(+ReFPJ7)sA(=%OmV?F$nQmXPaXt1&}p z-N9yW06a%YNreVCY>JsfLb=IT#*R!y{-U{VL<+TWzOp}?XD<@W(uInQPFo2U8Jt#X zQQ^h{EQ3M1&OmZ|$r%wi;wsy4?RfB%GDt`W$l*f!9BXHrKZBDEFZfXq){D+Y5guq6 z-ELbJG{LB*pDZ8ws5xP$oB2JMS$%R$_XrNRGst1%q3B@DQ4Zah#&$boNLmdoQHhAPvJ;`= zRiDh_)2!H8kTcPO0eT}doIxyt4Sts(+!V2u@%l$F-*{OnSh7Z)4xM9ScB0Kghs{w9 z)48igD>^vB`33CmqMoO|JwyP#;lnn4%8Z-^-h2ca+pb5+E*sYmsTFk~4yz10O$VPs zWV94QT;S?0s9uxK@!F!@e<3>A3HZ4VNxwe0Oi}hh1(SIb-RRE?u?f(ksjGUGsTA`v zj+$mS`cphWo6CTRIJ3Q{37|oER*r57WTUH2w$VqHKe?2Vf{zc~s}b4yyT!fXLG9-< zhU7wpauD;BWVtr$gS1J8VtTSyeQywb;t__#0%cN^WP#|~E-SAm;X#E}o3aHcuZ^Hz z*3FhQ0$ambOxKTcw*naet{NE{nK||B6W_Aww9W8OMa8kWT@GR6rn{f_?_!0S|%uLRb*6n1GLC1E7~z78FkW8*s7`N(WY;qzL@v)Rfjr>pJ` z@VkB53skcP=5lLu#Y|d;?$zi%7Qr{VbS&=N&W``ozDyX230_4KZ|ds$(&F>*vHNwW z`3oe)yEG)2^*C_idG{QQ|lB2Z>po=SD+x5Zot}qgw z-x1yWzZgOPGe!7!k)HqGDgv!7GndM@4_1i%Un|1j#&|9?Z0r_Pkw2$v>)tIgm93Af zC4?gcHRg&KDAzv#Rva*`d=f88E=nZw>sXVLQUI;gR4Wu!;pr&C%3&lVzMvYj50QKg zj<>BkBr+Q!ZUCbXg}l74I7W`SpSX|LpK>_3ibs`onWZI^l$c#JiYXLOnxcwgN>8rD zLSOgq*Zh^t?u#hQ$m3L|h;s`ZQ;NwjhLL|3^k#Js%Hiq^=v?gan zGF(G1yiSnxd>xj!Z?;xN9K6e*&kw5*i9#=!)Y>ggPjp&nEy*3suni+k>s#N_R^(kI zL7#jPb))?`7)1yfVrr>z)|5w)1B!=L*IS>1Wh$H5IhvVb9>veE?KxskTP^wH6x+`N zUi1*UJ>#{EAfl}Jhz|WVjMsX1@9K5{jKri4CRuF|S%zubk8Bv8WK$ouJoZh7mm`@4 z*$Fhayc`+Eogw-YW06c&BZ;3gI8c|swLG#a?yWtN`GC*Q!jn8Af_;S~%e)`1%>B;7 z%4Dl1Wz!5Rx>~ca9WN;Cp4{p*i!~Skf>1<_M@(aZvkWSQfl{ME{OzXDq2#07)D_|v zJXR#}KKn0mYDCk4Z1bRB!h9nQ2#BU(!EYcd2-LZYFbnPYmOp|qDc0dZBSk;FKD8DI z3%Vg(#_zQS8BD(K>p<7O*}RchYZ9%p&=|bvoXp>4GIUA8!+K#584;QzpD;XY;4FYD zGdS(9(^qiU4Y60hzk7!w=Ko?$!x&fq-9P+s1RDhysT^gJf(9@XnK2HP0S@Xr>8Fp& zq%TXQBZj_%vX2`c)3i~re3J_fp2K9dYwm$h19gT7#Tl|3nsl>p$uov#^l|9u(ux^t zx4NYDmEt%#miU7pG9dzLs9&2M^(;dbTcXkj-Rw(AHGiyxbZ+6b3qysNoGB?PLb`~F zf}5{5;%Y94p!g>nee>$(MN!O-ih-8)9VmZQg=)(bb21s$^|+R-f?arCD7yzl^jj zW@n917Z#{DzlHeGNEbBp_*J-6X+IQ>6x2vOkR)~p__NyittW)=*iIR#F$tmw01TG&D^D13O+ZwhM(`-GdsSggf!;SuBu_9~Y_}(NK zlGlS9_>JUxg8o%uc2v-Sd-AtynVwv}9_^%JSu~-U-9HaRoR3 z4r)_U5U8F%uYNecsTXqEajkxT5mOXkxieL%S|hEeE0;`@o4q8$$rTc($pildQ%O3&Af(`lUC1HL0k( zo=(W#h#b7&xE4YPRj13mInU8lu|TO|$)#iu$sEUyOz%f1y-w+D3$$x7J!W=XPNW|d z$`l0OqC+(up?dZfJ`X^Qg0E!!Ztv(eR=eVe+?cjqqnKWQ!@5kqaP<^9eibyT1sMG5 zupiQBmsr1gtO+zcSckp;b$17{1)v$^?SLxZN~O|qJ6pqTq2nE8y}aUwOHVMZ-3-nb z!508ET6iQX_DJ-Os>_nY6WBhdAV&`fltz#l4lRHN*|}X$<%;RLytR*rc}l%^`Ig3mHSk-B-&!BeF0UM~cS z>t}7FoPAoL(}rN&qVvr{%s(ERv&30^dn|{LL?VEmbCz6MzSXP#%~(}y-dpoc0TcnGorb6#geIfE` z;6MZm&=8)14x+$Pq+Z)rPDxQJs!h8T0!19VTtBmNh=XJiq$KIz zD=(Ngb+xf$^qe~%l+{%E5exz3pE3_XBL5=*qFE&mQAP$a<7?hy4>5I4OhoRk2@QdW=$5&N0 z;gZmkNd>bIz}e`eWLuay4YWlT$zhoY7=oDG=*X@{j}L-4Bt^|J6L)(_O$o`dEpy^S zZP65B5@;p@0WPwuAF5LwgM}k7BZ5_m@L~B1{tuN8Pdu0r!-Sg@bU(v~ie?zcAjx0W z%iYiC7_*1KYFFwf16HEPe{m{&{=zp#Do-MII9sLdz^rtuVJ%TmR$~Yvs@FTzQvSS!^K~FR8ECfXx${L~^wQ%V?RysI#{M9+{^Ru|w=cD$g?53|GgRzF-vU-D|9g&}H?oTyT|Fhk-v zOmQTIyLf!@xqLl2Nk~j`grb6?WFg1zlT!VS03L=N{ED-FA2!%mKSjvOC34`7jjQff zS*ax#Z%t#4O@5(JgMeR$v^^pG5V>_cqm~pCy`^0+^BZX=Hf1fUju1P7L2&jE5quc|P$wV0-;}bnnEmBu|va@wQI{_6- z3>95)w{7Wa$9tx$I|WoJ+px_{2vf&Qkree5Nd*;;68<3D>-Ubc4N8(E$2&4041gup z@6iuKs4-Afu(Q%wQL?t47}~jr4i0t=25}&L0UC;q;V94< zO5p8(!1b+qN?sr1x!Upo#(@FUKW|{^y;ZtuPPM7tbxhBv^mNZ#)@)pGp#>D1T|`4s z67<;7ULv+XO+DVd_02oNrv=oj-bo&B3z0fFcuRs6eZ1V|L7=9MM+O5W3 z>Nvrsh0Y!d@Xy@$XlLEG9&y3325iV_O;vuPMFQYNJ<}~~PSwIw_l6#6_}(?{&daFg zeqR@X4Q*pb^Om~2p1Kmy=9nEB*|!x;p`HzRF>o+4fko=k;YS*%W#wlA!N%{ce+$nD zXIsk~Kn&iwF);;yb=eQSd$6{ib$9F=l++O52^a7d+nUP@f*fea_AxaB$Pt7f;Eqha zd0oqEBoQ7OI<|H(boY6Cr+UYT)YY-e*M7j)vE4`noo8}0ae^bgLxca;+UBULoLU^K z2<)W(t{5c#>kLp>sS|kYkFhF896-tV53jMnOgdOt0HYglKAkn6_QkdvDfQwt)#IGnID)yfPypaoJv9}e`x1ohm1)q@u(c%X}pU#C%M*7$hqO1BLEf(H}fQlVDZskJ)s_Q z!UX<`8QTeQ)pgN<*kE+(m9G`^8=c!I1gGtO_?H8JG6hvMN8iro`gg43@14#6KCD?C z-zN#o@O|mMcSKyrm@R@%(VDI@IeFM3c-WXVEAv6ALTDG7I%o>{g64?OV`A5 z?8y?3yiwzzDw-cskU(8rk6dYKvJ-T|U+HH5-Ol_&wP#`ywBwNdN2zlN!78F@86|2sr<>%KmM#^Ls+~e^mBZt?Cib zf8F>yKiJGZS_C6VDHAlHBvL$ex!ytlt+K0ssVuUfAF?o@00FbMaD-+Czleq5{85j5 zEuGv46c1B}6_>vG`Vk&O^A_sgcPYse0te{^S0@unyt;lw(4$fGo5wI=DKpNVJ%vH()p}|3E zrQ2_KPYlZw@wEJ6%b9I8cl17J*I2Ic{#tW$#_B2HRAAw|2sp!imqNYt2K`ZCa> zx!Pk{L!DBJj-T)ypsqlTr*f1?X-q671FFEq39)f8c zN~VC3BmS3Azb+ZT> zOX}cm~%tef}}U|Ua)j#lmoXdx`K&h9dr6Nv|tpKl|3{ULvT*GtWWqg%8}{h~bz zx&TKJNdZenmKrX0V_ajaD#EW)l&AYFEh`9|Qn9crw-=^CD#3uAlMvm;M9#;_BWWm$ zn!^4XGABftC`C-qH|8aP8B0jR9X}pgoeec|XP_H5D#Uo{P0iZ~;9$@iia6`{VuQQ@ zEM_Q5>W4U&?%BxUq!HO_XcAYX_Xh(L0-sAwe+L6{IElLuP>!_t!TV=wcY9LVPPATS zpwIfp9x&(ci9rk|p(x;~TBDKx$+~{SZaxvAZH1DdM1%BWd?hR<1Vaq%3``Mre%W)J z5*kB0uJ1wJ8la*np<>I`mie}3cvsqYgQz;54sB#YohVsqWT>Y&45VnfKL+xb%HkLn zXNgOshlL4*jIY*V6b4ac1W|FaQk4Ce=Yql*S*{~$S5<}Fm=yKvl9bA4;}kM1&@~jy zt^WdK7}$j^M{6j8yV(|?e-GAtdtG=u&(iBStgV6L&;Ml0^*yWItg4+_Uhy&4+qk!y zcxcYp>U3{+xNx|8u>d{bV?%xatrUHQDr3t=h-W`y(f8W;x~@|8zQ{d%K`THZgU1J^ za-sBec6R4E`4oHgfX8RCsg48C4QlVV&UaT-?>23@*}b9eF{{}HUdD21{fw0g-~sE9 zHt{psQSH4JPf336nx1!A^Lf1Ip{d&?2MBu)16uLzycn=<(KkHUET-`*jmIL`LgJm8 zfj{(>E+kAiD|&YfdiVRwqvG{x{>kN7)6{^Hjq7b%9-pbcx{@kqH^I@8_?_3Jn|X(Z z7a-relZuKOSN_Ec&ZI}*>T;y0?|QJ$_WAw*cnE!~N86-Y+g$s;{p%UPw38-J*jE4; zIQ=nP!MK8qJ*)T_z)L*P=9fiaY>5kUV4=M{RI8tT164c&_GX~NpaVREP6o4dEW2CC zg$qn0h@=#lf#zCpsI3*K)|oBAK=&BL7K~>dPK|2iK-qcHxDyt4)p|f=Hbs$Ezp!AE z($#$$>^si$TkLx=nN-(7eL+RL45IWj`Psc>dNN$G5n~oGuocQY%?xqTH6dzpwQYS; z)Wi+Mud>M2pQjy;ZSJ2Mb(Hp34xi^CJxzx*GcT<>7tIFnW?Wv&Cv6C!HsV%y)Lmg( zZ{e3_sAgIdWS&H^wpy%em})B{Pn~H!7FWfkh%H?hJ46>-%S+j_-i3(mGpdyRp(w7M z{nibuZ_DIV1!@X?zqMl_$cG{>(w!J$bKY7!$$oRH;B>@{>7KSAcYomKuc9VNPwVCAi}-Pmz%Q~+m_+S57`vV zvB2o`#q2mx9LeyfEHf6r)O3R&c`_bSIw_jOJ%x%u=H65p$AJZoKo=&`H4A|S+18|U zIfT#t;qKNSxbo4sf^GHzW@aqhV@NT@h9->iASUOXd{E6*IeG65Yqxw;A(E2QAp^B5 zXsl|N%rcYF=AtFDOek*B&zHS-sb{9nZ;8I5Iw~zAKop~PX1tyXt&&B9FRzv2y?HNl8)wMs!Tg-YL|h;23jDw29` zyPybdK9Me-N{_6NGeKAm!s!%^0-(4nAPs7-txWx!#d2@w&qTi3ydDC=rG$Us%b=Xu}lRVWI@b9JJ~O<_|Yn2W9#v z%Gd}LCO}BgafqM5sEo7xJlG-*yqQ|U#tMSs#~8+t(kNyV7`)AA1-lzuDN*>WNW0G`dX=}FHm{vGLk#iagW z13`fnvh@}q2OT)`;ymQ(Q`pY)rp7RW!&?T?KwJjGfQvwQA3=$fY$%EF)`m|)W9!3OdHSnMM+4vwI%=L6T}begc)&!j{3TopC!5o9bb+{14S%^ro&|66(TP#PF+JfUQf zjWOiX;5g~LEb5N|E66!MP2154bXYkH64Eg87w{l-09T%FZvyM!8(zSkw9VCwopDI0 zN@?eYf6(*Q#ik?WQ)TAw)1%lo*T<}j;y{(@8ZH*_F8gYn^dak7atfqKet;Ff^ z?+-=8Mlm<2(ssn+0coN&UD`U$rMI6>b^<_Tr{0MG?JifI9%;{YbsSaK#IT>W=GlJT zE}SkmuW$44Z>NG714pGZD;e_|h;r`Y=F#vUq-KX#UK+1?v;PTP36r%mnriDl@#0$& zh<(1QnG$f)h37RAe#L8BMKl8%Oz-s?4~vVCu>hGTZ;BKI7v1Nhj-Ou2#ou&#noH=Y z)7J6?B6dM@&EC?gGiJmLOhZ19-FC69Sy=&WP<46CYRyMZi)DFt&tUMO)0+?UiV7n5 za;^%LXA&fiTZ|OQ2bS}ec>67Cb20sS!FGAi7*_+DbUkt>NF$83F{01G6sWSekqp1!rRGc9;Lw+JP}$?-bjF27XSY^z=$PGD2X zXI8(ZyyJ!0mA;^z_E^z-VY4Fd_n*~Jx37_5k3Et&8)#r+($Ug%p}laYJKij|3iY7< zjkyEbHe4#GA!J5;W*xs?ykHmM-4wz7^#WHQLzssw5mKGtP5(aVvFge{K}|8rsPgLE zbYrs+0HdJRP}gA^*{4bYqPJsBe^bc!FX5a?+^4C3-@*U)%=~}p;PVORt?8QO%kUNP z@JSojW{Hs!sy4d26yQ5%1HogN?q=BVCOsSFTa)`&nvXXe-Rb7@SkyYt-)wp3_sMD)WEqft+bj#kiemug3!08_0jI2MBBj zn5Dk!0p`D{2mY3@f1zRZJ;Fx+9$~ZJfrDsiZG=1GP>hd9kVY%aT_T+luQ(vOcK=zG zSeHp0w~-g8h|&^kOBPVGiA#wVkm$J4Ygv`xy`Vei8F9&&N3N(&oK2C8p83sFyYs{` z;~3-ZwYwWsQcw^@Gc>CNy)(ifzDz{MEssKhM%ZN#x+8<8FL|o0EJnj zm4{4SRRn9l={CXwbbB(}jj7(+AB(eHNql_=29op6A1NNK<<}fCBvwj%^Bb|y9S_K= zA9&8)K;5nApD^<^M%<8~=f{wIFHJS(`Bk_De3(j%pUsm9)DuNTXmCc3tJwWbZ;AWx zqLLx6vm!FG4A5t;&!$yuVW_KWA;$p)X<4I&(b@#2%<+bPXo-iZBsRA}(Zsb1>*mR~ zVqB||FK}GyjeRhyEtv^box7YxNRc3rEVQ4iSshxHDO+Mt4@1o!4<=M1jIe7+c<4wV zeySyhmPheC7X9{P!$c9)3@3Q0u`mgPkpoS}OvO9Y-&Y%W7J7rgOkN1$vltTxe?r$dT@Dsmt_?gE zQ7-&c_$_gZ!NEls1LGTSxSuZ`bWrB1g2zgtSSM{E-k_kMOn?*f{&Leyt^dwo&m>w3 zHQ7b=Yr`Ila-JeZLjj087QLMugBN+96(^xtCX}Vz`P?8-zVo{Cyz{5lGU><7UY?`r zlU*@5hRH&G4tSy<7XLU{lPAtg0pLs4apXfWRP*U?Hiwukj&g{GAZ0Id%%g!hb1}^u z+-k$wnGYh>_%TtEpRH+pg&9B-(28S(MAoFic;If3gp~RuLtY&4;lcCu;stCOG1px{ zGee#W7PO0==JZp=90vCI1YXxD&&&EU(kXT38Fkyyy>9##@+gkHz*-YmF{!dLNvt+B z+*dT;YHA<2D=Fj??HBhNZwpx2#tyh+Tf6%>uI?$aSlsFV2eIGnrzD!Sk^BwABez|t zw8B&$Y-IX0;)AnT5^Bt=O-epxx`2p^1?cfGnDRNnNVD7mX=AHSHqFO*0J)JrdFIpc z=^e`6Q~8jNa&ervyh;dSy&LzSGqTAjk_jPpv>#Y|#U_c$k9hQ4h@caduxMB~BVl`u zAyEyX)=(0KWGyU=0?$}Xvz_|_k-I>Qjwe|s=ibQ0eqSTZnOk-clQr2r5W0z#R4B5v%c1b8(mP=z9DdCE` zMpq>g>Y_rDWEZ96+M`AC9^<{&IWuQIz5l*vK4y%M=R4nXp7WgN%sJ2V`{nzge`B2E zkH~r;m-3ir=9^c&|FtAnw)U5TT@{_Td=g3)M_mz^{g{xi5+8mL%C_%NV*zFyGh~K) z=Dx4>m`UD^3hW??F{Don+v8`|y-*`!mxgRZUb&qO)6>~4lCBc@m}rCaEbH%0_(kxY zdB^we{*R%%>>RID``=^p-A)L-ZGAq4c{19l;Q8ptK-%}eSi%tVgKp_)3yb>=r_Z1q zJng@>*MH$W{EK}Iim+AUH-kuz##X-8JZxccwW#7>7By%EO8BCpjZfRTKBfg`2rXJDpcfk9>-WjZ?%CR9ACH3(tL5F2wzWrS7*K`E_)IH9~ z@m$pZ)cXR58e)t&>SMNMYF(_*%?M@8#T>zs${hW*dC2tH?N5*w!CznN1MlOA>C#Yg-$Z z)qa=OJF6aNy`;KY`XhVc_>EH@Pu})eDre>d)z_M3Nt{|hRSY8}NlGJ+b%^JK7TrQi zQBUTIY^<^+YRhvC_(kv4i8~0HJxClE9*g3tlq2=7Y8sH@gPLuRWLkY4j<-VTdTzicM!eVtaFR!{M1SeCrp`8M7mJ0of^Y7ZiG zmDplN{&Fm{T3G7I%y@ZSUbwsXP{O2<)%~17)X6@6LTJgf#LChx(IK5a<6_mD_x;dn z@@uX`9v2Nv@8-7oRZE4(9mMdX^t*Gc|CAdjukbitk-Zu*WbJ?FIJtP@dX{LPk!bS^ z_u(`}Wt{(=eD2=tQnVFMQ~&d4NwsM54nH+UkcnFu_Db!7Cf4~z$3yYQLDGu$ub%(6c;>fzc<)lkae16dgpC96O7w|qJ5^T z;X2d#rxP?)N|S<*^&ZByRk(56lHQdI1leg@wrIxL@cUzaL#EXp`|ClujINYY70$7n zJoo7tb0^cUiUic<7*-Nnhu54}jH@7>^8 zwQW){U+6gRQlq_!y*<8Tx-K_3SfgLvAtH%em#fpWa;tG~--zE}^i5*c$+WmM9gfP| z`!dDZVjsQ`U*=rit@~&}P5X$Q*6XY4envw*OKcrkrh^>aaw4jTMDaIOjz&8=ncNHr ziYLrdnL;>-vJIxr40+-M&W|2kv=zH&5p6rKoGj2hJokyztIumt_$AjcdR~Xz@h#=e z8>dB`9^|4pc4w(9YJR{eHr{f;DJ-6;Ws59I8F9s_vF`x83iqH!)dvn19EVfF%8Z$R z;MLE4*nq&5a(SNQEpMVdw6T{aOD44|f)uOxRS|j>OleEYYRsL?AF8TGQ&aym>bX-D zIz9{ z^mGhn|ESj`%>F}-`zlXNNK5{)%X+kx*br&C`^EIrce%c{IO!s0KDo?iNS(V)jeWhh6mBW%p} zP_ovl03tS73r#}E^dz0{Y*6$Hn?B%kL(D?bLXxD7oZ$&ut{QJsV*^s#kBA^e=JQ#R z*Q*oBqu8iSqB>@~r)U_Zt1 z*Lu%|?4K?TcBZ5kHk-5@mA<+ad3Ib+g7*+}o&=l7g|+mZO>G2KcIQTRyqxT-W`}1p z2SlDW5k_9Uu5Z`5Hyb%*?{;lMJ)L|-Mn-vWf7c&YrB|LGY2w2Mf6$e3VU&348EAZ6 z-Pf3qacNrE#I}vX#@y6yF|J zXO_$9dCl~c=-vVcg=VvcMc256NXI80`LV_FGY20={)pg?RT@Xfo|L|^MwY*4QtwJ3ZOrIeEbcHa3D9fM)fS?*&8 zy3e08%Hfc;JK8EAbZN3*qeO5!QT=EuZ;D-<|GaS8Y1Jo(5S0rJ^ zCb2$ED@>|hGcjb`q7IxX{Br_z^PGoLKk)7Zu;Z}-uh3;;`m1fx;*-jlqf=1_zoDxbX>_(*mic%I~U)3#ZlQ?N$3ZV8KW4M`K`gCOR_LzkSOKqIyH{IsG$-Jjz)Czl07xq7?LO!ENZC?Lk5XbE*?SQ zz~E>^H?K%glcCut!J5ir9KRg#&m-Udm;f%A_F2b zj2OV6!K$!*9evf;#xOiuRrxYe zzu-2=ptD=pW&{m`1SU9mfwm$zC=&JY4SG!-jF|O|2P2+gaM|__(N!v9Rzlr z=nF9tAPA5U{i6YN9yVBrArwNR2*Dlz=nLgXLl7V#`fVOM`wT3U7XzVDgkYOFbV>pk z(H0LufQ0C`Z0JCJFpV)0LZb-5HfHFMOE4lV6@mZ>(Qm)dafo1AbsB_55rRFlgbw)t zBa*Tq2#^r{vq|Vc2r#WV2STF=!Ja|V--j$o5Clkw{#hgRMi5xYqHu#obz6wK(L*mj gf&s|u3=A-rB25gLfUn^U4649GANW$ARl5G}KS<6kegFUf literal 0 HcmV?d00001 diff --git a/src/class178/Code04_Gosick1.java b/src/class178/Code04_Gosick1.java index 96dd2ba5a..47c8f117a 100644 --- a/src/class178/Code04_Gosick1.java +++ b/src/class178/Code04_Gosick1.java @@ -134,7 +134,7 @@ public static void compute() { } winl = jobl; } - // 第二次离线,因子的数量 + 部分num倍数的数量,都计入xcnt[v] + // 第二次离线,num倍数的数量 + num一部分因子的数量,都计入xcnt[num] Arrays.fill(xcnt, 0); for (int x = 0; x <= n; x++) { if (x >= 1) { @@ -147,7 +147,7 @@ public static void compute() { xcnt[other]++; } } - // 只关心大于LIMIT值的num,去关心num的倍数能否得到计数 + // 只处理大于LIMIT值的num if (num > LIMIT) { for (int v = num; v <= maxv; v += num) { xcnt[v]++; @@ -161,8 +161,11 @@ public static void compute() { } } } - // 第三次离线,1 ~ LIMIT 这些值的倍数之前是忽略的,复用vcnt和xcnt + // 第三次离线,1 ~ LIMIT 这些因子是少算了的,如今补回来 for (int v = 1; v <= LIMIT; v++) { + // 复用vcnt和xcnt + // vcnt[i],当前表示,1~i范围上,v出现的次数 + // xcnt[i],当前表示,1~i范围上,v的倍数出现的次数 vcnt[0] = xcnt[0] = 0; for (int i = 1; i <= n; i++) { vcnt[i] = vcnt[i - 1] + (arr[i] == v ? 1 : 0); @@ -200,7 +203,7 @@ public static void main(String[] args) throws Exception { } prepare(); compute(); - // 加工前缀和 + // 答案变化量生成前缀和 for (int i = 2; i <= m; i++) { ans[query[i][2]] += ans[query[i - 1][2]]; } From 22bd49ce1ae2184e1a20fdee889de9bfb4b66253 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 15 Sep 2025 22:48:33 +0800 Subject: [PATCH 0726/1170] modify code --- src/class179/Code01_QueryMatch1.java | 203 +++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 src/class179/Code01_QueryMatch1.java diff --git a/src/class179/Code01_QueryMatch1.java b/src/class179/Code01_QueryMatch1.java new file mode 100644 index 000000000..80c9a8e50 --- /dev/null +++ b/src/class179/Code01_QueryMatch1.java @@ -0,0 +1,203 @@ +package class179; + +// 区间最大匹配,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4477 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code01_QueryMatch1 { + + public static int MAXN = 152502; + public static int MAXM = 52502; + public static int MAXQ = 52502; + public static int n, m, z, q; + public static int[] a = new int[MAXN]; + public static int[] b = new int[MAXM]; + public static int[][] query = new int[MAXQ][3]; + public static int[] bi = new int[MAXM]; + + public static int[] match = new int[MAXN << 2]; + public static int[] resta = new int[MAXN << 2]; + public static int[] overb = new int[MAXN << 2]; + + public static int[] ans = new int[MAXQ]; + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } else { + return b[1] - a[1]; + } + } + } + + public static void up(int i) { + int l = i << 1; + int r = i << 1 | 1; + int newMatch = Math.min(resta[l], overb[r]); + resta[i] = resta[l] + resta[r] - newMatch; + overb[i] = overb[l] + overb[r] - newMatch; + match[i] = match[l] + match[r] + newMatch; + } + + public static void build(int l, int r, int i) { + if (l == r) { + resta[i] = 1; + } else { + int mid = (l + r) >> 1; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void add(int jobv, int l, int r, int i) { + if (l == r) { + if (resta[i] == 1) { + resta[i] = 0; + match[i] = 1; + } else if (resta[i] == 0) { + overb[i]++; + } + } else { + int mid = (l + r) >> 1; + if (jobv + a[mid + 1] <= z) { + add(jobv, mid + 1, r, i << 1 | 1); + } else if (jobv + a[l] <= z) { + add(jobv, l, mid, i << 1); + } + up(i); + } + } + + public static void del(int jobv, int l, int r, int i) { + if (l == r) { + if (overb[i] == 0) { + match[i] = 0; + resta[i] = 1; + } else { + overb[i]--; + match[i] = 1; + resta[i] = 0; + } + } else { + int mid = (l + r) >> 1; + if (jobv + a[mid + 1] <= z) { + del(jobv, mid + 1, r, i << 1 | 1); + } else if (jobv + a[l] <= z) { + del(jobv, l, mid, i << 1); + } + up(i); + } + } + + public static void prepare() { + Arrays.sort(a, 1, n + 1); + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= m; i++) { + bi[i] = (i - 1) / blen + 1; + } + Arrays.sort(query, 1, q + 1, new QueryCmp()); + build(1, n, 1); + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= q; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; + while (winl > jobl) { + add(b[--winl], 1, n, 1); + } + while (winr < jobr) { + add(b[++winr], 1, n, 1); + } + while (winl < jobl) { + del(b[winl++], 1, n, 1); + } + while (winr > jobr) { + del(b[winr--], 1, n, 1); + } + ans[id] = match[1]; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + z = in.nextInt(); + for (int i = 1; i <= n; i++) { + a[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + b[i] = in.nextInt(); + } + q = in.nextInt(); + for (int i = 1; i <= q; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= q; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From a3787ea35454b1a3780a58675568375378da6af7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 16 Sep 2025 01:17:05 +0800 Subject: [PATCH 0727/1170] modify code --- src/class179/Code01_QueryMatch1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class179/Code01_QueryMatch1.java b/src/class179/Code01_QueryMatch1.java index 80c9a8e50..4d5f02f65 100644 --- a/src/class179/Code01_QueryMatch1.java +++ b/src/class179/Code01_QueryMatch1.java @@ -53,7 +53,9 @@ public static void up(int i) { public static void build(int l, int r, int i) { if (l == r) { + match[i] = 0; resta[i] = 1; + overb[i] = 0; } else { int mid = (l + r) >> 1; build(l, mid, i << 1); @@ -65,9 +67,9 @@ public static void build(int l, int r, int i) { public static void add(int jobv, int l, int r, int i) { if (l == r) { if (resta[i] == 1) { - resta[i] = 0; match[i] = 1; - } else if (resta[i] == 0) { + resta[i] = 0; + } else { overb[i]++; } } else { @@ -88,8 +90,6 @@ public static void del(int jobv, int l, int r, int i) { resta[i] = 1; } else { overb[i]--; - match[i] = 1; - resta[i] = 0; } } else { int mid = (l + r) >> 1; From a56069cb755d586bcace7d6f49fd42c89392eda1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 16 Sep 2025 17:22:06 +0800 Subject: [PATCH 0728/1170] modify code --- ...yMatch1.java => Code01_MaximumMatch1.java} | 2 +- src/class179/Code02_SimpleQuery1.java | 163 ++++++++++++++++++ 2 files changed, 164 insertions(+), 1 deletion(-) rename src/class179/{Code01_QueryMatch1.java => Code01_MaximumMatch1.java} (99%) create mode 100644 src/class179/Code02_SimpleQuery1.java diff --git a/src/class179/Code01_QueryMatch1.java b/src/class179/Code01_MaximumMatch1.java similarity index 99% rename from src/class179/Code01_QueryMatch1.java rename to src/class179/Code01_MaximumMatch1.java index 4d5f02f65..42c7a47fa 100644 --- a/src/class179/Code01_QueryMatch1.java +++ b/src/class179/Code01_MaximumMatch1.java @@ -11,7 +11,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code01_QueryMatch1 { +public class Code01_MaximumMatch1 { public static int MAXN = 152502; public static int MAXM = 52502; diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java new file mode 100644 index 000000000..df41b72cc --- /dev/null +++ b/src/class179/Code02_SimpleQuery1.java @@ -0,0 +1,163 @@ +package class179; + +// 一个简单的询问,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5268 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code02_SimpleQuery1 { + + public static int MAXN = 50001; + public static int n, m, cntq; + public static int[] arr = new int[MAXN]; + // siz1、siz2、op、id + public static int[][] query = new int[MAXN << 2][4]; + + public static int[] bi = new int[MAXN]; + public static int[] cntl = new int[MAXN]; + public static int[] cntr = new int[MAXN]; + + public static long sum = 0; + public static long[] ans = new long[MAXN]; + + public static void addQuery(int siz1, int siz2, int op, int id) { + query[++cntq][0] = siz1; + query[cntq][1] = siz2; + query[cntq][2] = op; + query[cntq][3] = id; + } + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } else { + return b[1] - a[1]; + } + } + } + + public static void compute() { + // 注意win1和win2 + // 不代表普通莫队中,一前一后的一段区间 + // 代表的是arr中两个覆盖的区域,并且一开始都没覆盖到数字 + // 同理job1和job2也不代表一段区间 + // 而是代表两个区域在arr中要覆盖多大 + int win1 = 0, win2 = 0; + for (int i = 1; i <= cntq; i++) { + int job1 = query[i][0]; + int job2 = query[i][1]; + int op = query[i][2]; + int id = query[i][3]; + while (win1 < job1) { + ++cntl[arr[++win1]]; + sum += cntr[arr[win1]]; + } + while (win1 > job1) { + --cntl[arr[win1]]; + sum -= cntr[arr[win1--]]; + } + while (win2 < job2) { + ++cntr[arr[++win2]]; + sum += cntl[arr[win2]]; + } + while (win2 > job2) { + --cntr[arr[win2]]; + sum -= cntl[arr[win2--]]; + } + ans[id] += sum * op; + } + } + + public static void prepare() { + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= cntq; i++) { + if (query[i][0] > query[i][1]) { + int tmp = query[i][0]; + query[i][0] = query[i][1]; + query[i][1] = tmp; + } + } + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + m = in.nextInt(); + for (int i = 1, l1, r1, l2, r2; i <= m; i++) { + l1 = in.nextInt(); + r1 = in.nextInt(); + l2 = in.nextInt(); + r2 = in.nextInt(); + addQuery(r1, r2, 1, i); + addQuery(r1, l2 - 1, -1, i); + addQuery(l1 - 1, r2, -1, i); + addQuery(l1 - 1, l2 - 1, 1, i); + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 3b3b2f4a57fa9af01f734a108a114325b2523ac0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 16 Sep 2025 17:25:00 +0800 Subject: [PATCH 0729/1170] modify code --- src/class179/Code02_SimpleQuery1.java | 43 +++++++++++++-------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java index df41b72cc..520e6b87e 100644 --- a/src/class179/Code02_SimpleQuery1.java +++ b/src/class179/Code02_SimpleQuery1.java @@ -16,23 +16,17 @@ public class Code02_SimpleQuery1 { public static int MAXN = 50001; public static int n, m, cntq; public static int[] arr = new int[MAXN]; + // siz1、siz2、op、id public static int[][] query = new int[MAXN << 2][4]; public static int[] bi = new int[MAXN]; - public static int[] cntl = new int[MAXN]; - public static int[] cntr = new int[MAXN]; + public static int[] cnt1 = new int[MAXN]; + public static int[] cnt2 = new int[MAXN]; public static long sum = 0; public static long[] ans = new long[MAXN]; - public static void addQuery(int siz1, int siz2, int op, int id) { - query[++cntq][0] = siz1; - query[cntq][1] = siz2; - query[cntq][2] = op; - query[cntq][3] = id; - } - public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { @@ -47,12 +41,17 @@ public int compare(int[] a, int[] b) { } } + public static void addQuery(int siz1, int siz2, int op, int id) { + query[++cntq][0] = siz1; + query[cntq][1] = siz2; + query[cntq][2] = op; + query[cntq][3] = id; + } + public static void compute() { - // 注意win1和win2 - // 不代表普通莫队中,一前一后的一段区间 - // 代表的是arr中两个覆盖的区域,并且一开始都没覆盖到数字 - // 同理job1和job2也不代表一段区间 - // 而是代表两个区域在arr中要覆盖多大 + // 注意win1和win2不代表一段区间,而是代表arr中的两个覆盖区域 + // win1 = 0,win2 = 0,表示两个覆盖区域一开始都没有数字 + // 同理job1和job2也不代表区间,而是代表两个区域在arr中要覆盖多大 int win1 = 0, win2 = 0; for (int i = 1; i <= cntq; i++) { int job1 = query[i][0]; @@ -60,20 +59,20 @@ public static void compute() { int op = query[i][2]; int id = query[i][3]; while (win1 < job1) { - ++cntl[arr[++win1]]; - sum += cntr[arr[win1]]; + ++cnt1[arr[++win1]]; + sum += cnt2[arr[win1]]; } while (win1 > job1) { - --cntl[arr[win1]]; - sum -= cntr[arr[win1--]]; + --cnt1[arr[win1]]; + sum -= cnt2[arr[win1--]]; } while (win2 < job2) { - ++cntr[arr[++win2]]; - sum += cntl[arr[win2]]; + ++cnt2[arr[++win2]]; + sum += cnt1[arr[win2]]; } while (win2 > job2) { - --cntr[arr[win2]]; - sum -= cntl[arr[win2--]]; + --cnt2[arr[win2]]; + sum -= cnt1[arr[win2--]]; } ans[id] += sum * op; } From 1fd1627b786260962adaf595856c696196c3844d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 16 Sep 2025 17:26:29 +0800 Subject: [PATCH 0730/1170] modify code --- src/class179/Code02_SimpleQuery1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java index 520e6b87e..eafb44146 100644 --- a/src/class179/Code02_SimpleQuery1.java +++ b/src/class179/Code02_SimpleQuery1.java @@ -48,10 +48,10 @@ public static void addQuery(int siz1, int siz2, int op, int id) { query[cntq][3] = id; } + // 注意win1和win2不代表一段区间,而是代表arr中的两个覆盖区域 + // win1 = 0,win2 = 0,表示两个覆盖区域一开始都没有数字 + // 同理job1和job2也不代表区间,而是代表两个区域在arr中各自覆盖多大 public static void compute() { - // 注意win1和win2不代表一段区间,而是代表arr中的两个覆盖区域 - // win1 = 0,win2 = 0,表示两个覆盖区域一开始都没有数字 - // 同理job1和job2也不代表区间,而是代表两个区域在arr中要覆盖多大 int win1 = 0, win2 = 0; for (int i = 1; i <= cntq; i++) { int job1 = query[i][0]; From 5175c967f1388b3f2bb9bd1338db4cb9f582a443 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 16 Sep 2025 17:31:52 +0800 Subject: [PATCH 0731/1170] modify code --- src/class179/Code02_SimpleQuery1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java index eafb44146..bb06f63b2 100644 --- a/src/class179/Code02_SimpleQuery1.java +++ b/src/class179/Code02_SimpleQuery1.java @@ -48,9 +48,9 @@ public static void addQuery(int siz1, int siz2, int op, int id) { query[cntq][3] = id; } - // 注意win1和win2不代表一段区间,而是代表arr中的两个覆盖区域 - // win1 = 0,win2 = 0,表示两个覆盖区域一开始都没有数字 - // 同理job1和job2也不代表区间,而是代表两个区域在arr中各自覆盖多大 + // 注意win1和win2不代表一段区间,而是代表两个独立的区域,各自覆盖arr + // 初始时,win1 = 0,win2 = 0,表示两个覆盖区域一开始都没有数字 + // 同理job1和job2也不代表区间,而是代表这两个区域各自覆盖多大 public static void compute() { int win1 = 0, win2 = 0; for (int i = 1; i <= cntq; i++) { From bb402a9c785c11486403654730ecec4b4cdcd30d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 16 Sep 2025 17:32:58 +0800 Subject: [PATCH 0732/1170] modify code --- src/class179/Code02_SimpleQuery1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java index bb06f63b2..28342eaab 100644 --- a/src/class179/Code02_SimpleQuery1.java +++ b/src/class179/Code02_SimpleQuery1.java @@ -1,6 +1,6 @@ package class179; -// 一个简单的询问,java版 +// 简单的询问,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5268 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From d9f176953496f20d4ff3e51120b95302984994cb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 16 Sep 2025 17:35:08 +0800 Subject: [PATCH 0733/1170] modify code --- src/class179/Code02_SimpleQuery1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java index 28342eaab..74af8eeb1 100644 --- a/src/class179/Code02_SimpleQuery1.java +++ b/src/class179/Code02_SimpleQuery1.java @@ -48,9 +48,9 @@ public static void addQuery(int siz1, int siz2, int op, int id) { query[cntq][3] = id; } - // 注意win1和win2不代表一段区间,而是代表两个独立的区域,各自覆盖arr - // 初始时,win1 = 0,win2 = 0,表示两个覆盖区域一开始都没有数字 - // 同理job1和job2也不代表区间,而是代表这两个区域各自覆盖多大 + // win1和win2不代表一段区间,而是代表两个独立区域各自去覆盖arr + // win1 = 0,win2 = 0,表示两个覆盖区域一开始都没有数字 + // job1和job2也不代表区间,而是代表两个区域各自要覆盖多大 public static void compute() { int win1 = 0, win2 = 0; for (int i = 1; i <= cntq; i++) { From 4f6f5676a2e3995f49aa87088701a8b9adc3d38c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 16 Sep 2025 18:59:06 +0800 Subject: [PATCH 0734/1170] modify code --- src/class179/Code03_NiceDay1.java | 177 ++++++++++++++++++++++++++++++ src/class179/Code03_NiceDay2.java | 111 +++++++++++++++++++ 2 files changed, 288 insertions(+) create mode 100644 src/class179/Code03_NiceDay1.java create mode 100644 src/class179/Code03_NiceDay2.java diff --git a/src/class179/Code03_NiceDay1.java b/src/class179/Code03_NiceDay1.java new file mode 100644 index 000000000..216550a2a --- /dev/null +++ b/src/class179/Code03_NiceDay1.java @@ -0,0 +1,177 @@ +package class179; + +// 美好的每一天,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3604 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code03_NiceDay2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code03_NiceDay1 { + + public static int MAXN = 60002; + public static int MAXV = 1 << 26; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][3]; + public static int[] bi = new int[MAXN]; + + public static short[] cnt = new short[MAXV]; + public static long num = 0; + public static long[] ans = new long[MAXN]; + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } else { + return b[1] - a[1]; + } + } + } + + public static void add(int s) { + num += cnt[s]++; + for (int i = 0; i < 26; i++) { + num += cnt[s ^ (1 << i)]; + } + } + + public static void del(int s) { + num -= --cnt[s]; + for (int i = 0; i < 26; i++) { + num -= cnt[s ^ (1 << i)]; + } + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); + } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + ans[id] = num; + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + arr[i] ^= arr[i - 1]; + } + for (int i = n; i >= 0; i--) { + arr[i + 1] = arr[i]; + } + n++; + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= m; i++) { + query[i][1]++; + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + char c; + for (int i = 1; i <= n; i++) { + c = in.nextLowerCase(); + arr[i] = 1 << (c - 'a'); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextLowerCase() throws IOException { + int c; + while (true) { + c = readByte(); + if (c >= 'a' && c <= 'z') + return (char) c; + } + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class179/Code03_NiceDay2.java b/src/class179/Code03_NiceDay2.java new file mode 100644 index 000000000..8d3d36615 --- /dev/null +++ b/src/class179/Code03_NiceDay2.java @@ -0,0 +1,111 @@ +package class179; + +// 美好的每一天,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3604 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 60002; +//const int MAXV = 1 << 26; +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +// +//int bi[MAXN]; +//short cnt[MAXV]; +//long long num = 0; +//long long ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if (bi[a.l] & 1) { +// return a.r < b.r; +// } else { +// return a.r > b.r; +// } +//} +// +//void add(int s) { +// num += cnt[s]++; +// for (int i = 0; i < 26; i++) { +// num += cnt[s ^ (1 << i)]; +// } +//} +// +//void del(int s) { +// num -= --cnt[s]; +// for (int i = 0; i < 26; i++) { +// num -= cnt[s ^ (1 << i)]; +// } +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// while (winr < jobr) { +// add(arr[++winr]); +// } +// while (winl < jobl) { +// del(arr[winl++]); +// } +// while (winr > jobr) { +// del(arr[winr--]); +// } +// ans[id] = num; +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// arr[i] ^= arr[i - 1]; +// } +// for (int i = n; i >= 0; i--) { +// arr[i + 1] = arr[i]; +// } +// n++; +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= m; i++) { +// query[i].r++; +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// char c; +// for (int i = 1; i <= n; i++) { +// cin >> c; +// arr[i] = 1 << (c - 'a'); +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 3ce65bef379d60286331955582b08441023fec78 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 18 Sep 2025 15:22:24 +0800 Subject: [PATCH 0735/1170] modify code --- src/class179/Code04_SubsequenceSum1.java | 216 +++++++++++++++++++++++ src/class179/Code04_SubsequenceSum2.java | 158 +++++++++++++++++ 2 files changed, 374 insertions(+) create mode 100644 src/class179/Code04_SubsequenceSum1.java create mode 100644 src/class179/Code04_SubsequenceSum2.java diff --git a/src/class179/Code04_SubsequenceSum1.java b/src/class179/Code04_SubsequenceSum1.java new file mode 100644 index 000000000..f1534ad55 --- /dev/null +++ b/src/class179/Code04_SubsequenceSum1.java @@ -0,0 +1,216 @@ +package class179; + +// 区间子序列的和,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5072 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code04_SubsequenceSum2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code04_SubsequenceSum1 { + + public static int MAXN = 100001; + public static int MAXB = 401; + public static int n, m; + public static int[] arr = new int[MAXN]; + // 每条查询的格式 : l、r、mod、id + public static int[][] query = new int[MAXN][4]; + public static int[] bi = new int[MAXN]; + + public static int head; + public static int[] last = new int[MAXN]; + public static int[] next = new int[MAXN]; + + public static int[] cnt = new int[MAXN]; + public static long[] sum = new long[MAXN]; + + public static long[] inpow = new long[MAXB]; + public static long[] outpow = new long[MAXB]; + + public static long[] ans = new long[MAXN]; + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } else { + return b[1] - a[1]; + } + } + } + + public static void addNode(int x) { + last[head] = x; + next[x] = head; + head = x; + } + + public static void removeNode(int x) { + if (x == head) { + head = next[head]; + last[head] = next[x] = 0; + } else { + next[last[x]] = next[x]; + last[next[x]] = last[x]; + last[x] = next[x] = 0; + } + } + + public static void add(int num) { + if (cnt[num] > 0) { + sum[cnt[num]] -= num; + } + if (cnt[num] > 0 && sum[cnt[num]] == 0) { + removeNode(cnt[num]); + } + cnt[num]++; + if (cnt[num] > 0 && sum[cnt[num]] == 0) { + addNode(cnt[num]); + } + if (cnt[num] > 0) { + sum[cnt[num]] += num; + } + } + + public static void del(int num) { + if (cnt[num] > 0) { + sum[cnt[num]] -= num; + } + if (cnt[num] > 0 && sum[cnt[num]] == 0) { + removeNode(cnt[num]); + } + cnt[num]--; + if (cnt[num] > 0 && sum[cnt[num]] == 0) { + addNode(cnt[num]); + } + if (cnt[num] > 0) { + sum[cnt[num]] += num; + } + } + + public static long getAns(int len, int mod) { + int blen = (int) Math.sqrt(len); + int bnum = (len + blen - 1) / blen; + inpow[0] = 1; + for (int i = 1; i <= blen; i++) { + inpow[i] = (inpow[i - 1] << 1) % mod; + } + outpow[0] = 1; + for (int i = 1; i <= bnum; i++) { + outpow[i] = (outpow[i - 1] * inpow[blen]) % mod; + } + long ret = 0, tmp; + for (int p = head; p > 0; p = next[p]) { + tmp = outpow[len / blen] * inpow[len % blen] % mod; + tmp -= outpow[(len - p) / blen] * inpow[(len - p) % blen] % mod; + tmp = (tmp * sum[p]) % mod; + ret = ((ret + tmp) % mod + mod) % mod; + } + return ret; + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int mod = query[i][2]; + int id = query[i][3]; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); + } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + ans[id] = getAns(jobr - jobl + 1, mod); + } + } + + public static void prepare() { + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = in.nextInt(); + query[i][3] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class179/Code04_SubsequenceSum2.java b/src/class179/Code04_SubsequenceSum2.java new file mode 100644 index 000000000..81e74570c --- /dev/null +++ b/src/class179/Code04_SubsequenceSum2.java @@ -0,0 +1,158 @@ +package class179; + +// 区间子序列的和,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5072 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, mod, id; +//}; +// +//const int MAXN = 100001; +//const int MAXB = 401; +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +//int bi[MAXN]; +// +//int head; +//int lst[MAXN]; +//int nxt[MAXN]; +// +//int cnt[MAXN]; +//long long sum[MAXN]; +// +//long long inpow[MAXB]; +//long long outpow[MAXB]; +// +//long long ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if ((bi[a.l] & 1) == 1) { +// return a.r < b.r; +// } else { +// return a.r > b.r; +// } +//} +// +//void addNode(int x) { +// lst[head] = x; +// nxt[x] = head; +// head = x; +//} +// +//void removeNode(int x) { +// if (x == head) { +// head = nxt[head]; +// lst[head] = 0; +// nxt[x] = 0; +// } else { +// nxt[lst[x]] = nxt[x]; +// lst[nxt[x]] = lst[x]; +// lst[x] = 0; +// nxt[x] = 0; +// } +//} +// +//void add(int num) { +// if (cnt[num] > 0) { +// sum[cnt[num]] -= num; +// } +// if (cnt[num] > 0 && sum[cnt[num]] == 0) { +// removeNode(cnt[num]); +// } +// cnt[num]++; +// if (cnt[num] > 0 && sum[cnt[num]] == 0) { +// addNode(cnt[num]); +// } +// if (cnt[num] > 0) { +// sum[cnt[num]] += num; +// } +//} +// +//void del(int num) { +// if (cnt[num] > 0) { +// sum[cnt[num]] -= num; +// } +// if (cnt[num] > 0 && sum[cnt[num]] == 0) { +// removeNode(cnt[num]); +// } +// cnt[num]--; +// if (cnt[num] > 0 && sum[cnt[num]] == 0) { +// addNode(cnt[num]); +// } +// if (cnt[num] > 0) { +// sum[cnt[num]] += num; +// } +//} +// +//long long getAns(int len, int mod) { +// int blen = (int)sqrt(len); +// int bnum = (len + blen - 1) / blen; +// inpow[0] = 1; +// for (int i = 1; i <= blen; i++) { +// inpow[i] = (inpow[i - 1] << 1) % mod; +// } +// outpow[0] = 1; +// for (int i = 1; i <= bnum; i++) { +// outpow[i] = (outpow[i - 1] * inpow[blen]) % mod; +// } +// long long ret = 0, tmp; +// for (int p = head; p > 0; p = nxt[p]) { +// tmp = outpow[len / blen] * inpow[len % blen] % mod; +// tmp -= outpow[(len - p) / blen] * inpow[(len - p) % blen] % mod; +// tmp = (tmp * sum[p]) % mod; +// ret = ((ret + tmp) % mod + mod) % mod; +// } +// return ret; +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int mod = query[i].mod; +// int id = query[i].id; +// while (winl > jobl) add(arr[--winl]); +// while (winr < jobr) add(arr[++winr]); +// while (winl < jobl) del(arr[winl++]); +// while (winr > jobr) del(arr[winr--]); +// ans[id] = getAns(jobr - jobl + 1, mod); +// } +//} +// +//void prepare() { +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r >> query[i].mod; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 701f59944199ce999019764a9a64d4432eee0137 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 18 Sep 2025 15:24:46 +0800 Subject: [PATCH 0736/1170] modify code --- src/class179/Code04_SubsequenceSum1.java | 6 +++--- src/class179/Code04_SubsequenceSum2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class179/Code04_SubsequenceSum1.java b/src/class179/Code04_SubsequenceSum1.java index f1534ad55..393433d67 100644 --- a/src/class179/Code04_SubsequenceSum1.java +++ b/src/class179/Code04_SubsequenceSum1.java @@ -56,7 +56,7 @@ public static void addNode(int x) { head = x; } - public static void removeNode(int x) { + public static void delNode(int x) { if (x == head) { head = next[head]; last[head] = next[x] = 0; @@ -72,7 +72,7 @@ public static void add(int num) { sum[cnt[num]] -= num; } if (cnt[num] > 0 && sum[cnt[num]] == 0) { - removeNode(cnt[num]); + delNode(cnt[num]); } cnt[num]++; if (cnt[num] > 0 && sum[cnt[num]] == 0) { @@ -88,7 +88,7 @@ public static void del(int num) { sum[cnt[num]] -= num; } if (cnt[num] > 0 && sum[cnt[num]] == 0) { - removeNode(cnt[num]); + delNode(cnt[num]); } cnt[num]--; if (cnt[num] > 0 && sum[cnt[num]] == 0) { diff --git a/src/class179/Code04_SubsequenceSum2.java b/src/class179/Code04_SubsequenceSum2.java index 81e74570c..96645987a 100644 --- a/src/class179/Code04_SubsequenceSum2.java +++ b/src/class179/Code04_SubsequenceSum2.java @@ -49,7 +49,7 @@ // head = x; //} // -//void removeNode(int x) { +//void delNode(int x) { // if (x == head) { // head = nxt[head]; // lst[head] = 0; @@ -67,7 +67,7 @@ // sum[cnt[num]] -= num; // } // if (cnt[num] > 0 && sum[cnt[num]] == 0) { -// removeNode(cnt[num]); +// delNode(cnt[num]); // } // cnt[num]++; // if (cnt[num] > 0 && sum[cnt[num]] == 0) { @@ -83,7 +83,7 @@ // sum[cnt[num]] -= num; // } // if (cnt[num] > 0 && sum[cnt[num]] == 0) { -// removeNode(cnt[num]); +// delNode(cnt[num]); // } // cnt[num]--; // if (cnt[num] > 0 && sum[cnt[num]] == 0) { From 8a0189c5863355a6f674b7196dc63bf94d06359a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 18 Sep 2025 15:33:38 +0800 Subject: [PATCH 0737/1170] modify code --- src/class179/Code04_SubsequenceSum1.java | 16 ++++++++-------- src/class179/Code04_SubsequenceSum2.java | 20 ++++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/class179/Code04_SubsequenceSum1.java b/src/class179/Code04_SubsequenceSum1.java index 393433d67..47dd54248 100644 --- a/src/class179/Code04_SubsequenceSum1.java +++ b/src/class179/Code04_SubsequenceSum1.java @@ -31,8 +31,8 @@ public class Code04_SubsequenceSum1 { public static int[] cnt = new int[MAXN]; public static long[] sum = new long[MAXN]; - public static long[] inpow = new long[MAXB]; - public static long[] outpow = new long[MAXB]; + public static long[] smlPow = new long[MAXB]; + public static long[] bigPow = new long[MAXB]; public static long[] ans = new long[MAXN]; @@ -102,18 +102,18 @@ public static void del(int num) { public static long getAns(int len, int mod) { int blen = (int) Math.sqrt(len); int bnum = (len + blen - 1) / blen; - inpow[0] = 1; + smlPow[0] = 1; for (int i = 1; i <= blen; i++) { - inpow[i] = (inpow[i - 1] << 1) % mod; + smlPow[i] = (smlPow[i - 1] << 1) % mod; } - outpow[0] = 1; + bigPow[0] = 1; for (int i = 1; i <= bnum; i++) { - outpow[i] = (outpow[i - 1] * inpow[blen]) % mod; + bigPow[i] = (bigPow[i - 1] * smlPow[blen]) % mod; } long ret = 0, tmp; for (int p = head; p > 0; p = next[p]) { - tmp = outpow[len / blen] * inpow[len % blen] % mod; - tmp -= outpow[(len - p) / blen] * inpow[(len - p) % blen] % mod; + tmp = bigPow[len / blen] * smlPow[len % blen] % mod; + tmp -= bigPow[(len - p) / blen] * smlPow[(len - p) % blen] % mod; tmp = (tmp * sum[p]) % mod; ret = ((ret + tmp) % mod + mod) % mod; } diff --git a/src/class179/Code04_SubsequenceSum2.java b/src/class179/Code04_SubsequenceSum2.java index 96645987a..71cc0b6d9 100644 --- a/src/class179/Code04_SubsequenceSum2.java +++ b/src/class179/Code04_SubsequenceSum2.java @@ -27,8 +27,8 @@ //int cnt[MAXN]; //long long sum[MAXN]; // -//long long inpow[MAXB]; -//long long outpow[MAXB]; +//long long smlPow[MAXB]; +//long long bigPow[MAXB]; // //long long ans[MAXN]; // @@ -97,18 +97,18 @@ //long long getAns(int len, int mod) { // int blen = (int)sqrt(len); // int bnum = (len + blen - 1) / blen; -// inpow[0] = 1; +// smlPow[0] = 1; // for (int i = 1; i <= blen; i++) { -// inpow[i] = (inpow[i - 1] << 1) % mod; +// smlPow[i] = (smlPow[i - 1] << 1) % mod; // } -// outpow[0] = 1; +// bigPow[0] = 1; // for (int i = 1; i <= bnum; i++) { -// outpow[i] = (outpow[i - 1] * inpow[blen]) % mod; +// bigPow[i] = (bigPow[i - 1] * smlPow[blen]) % mod; // } // long long ret = 0, tmp; // for (int p = head; p > 0; p = nxt[p]) { -// tmp = outpow[len / blen] * inpow[len % blen] % mod; -// tmp -= outpow[(len - p) / blen] * inpow[(len - p) % blen] % mod; +// tmp = bigPow[len / blen] * smlPow[len % blen] % mod; +// tmp -= bigPow[(len - p) / blen] * smlPow[(len - p) % blen] % mod; // tmp = (tmp * sum[p]) % mod; // ret = ((ret + tmp) % mod + mod) % mod; // } @@ -120,8 +120,8 @@ // for (int i = 1; i <= m; i++) { // int jobl = query[i].l; // int jobr = query[i].r; -// int mod = query[i].mod; -// int id = query[i].id; +// int mod = query[i].mod; +// int id = query[i].id; // while (winl > jobl) add(arr[--winl]); // while (winr < jobr) add(arr[++winr]); // while (winl < jobl) del(arr[winl++]); From 425c136ee23b444cb1b085a78aca94196ed6fb93 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 18 Sep 2025 15:40:01 +0800 Subject: [PATCH 0738/1170] modify code --- src/class179/Code04_SubsequenceSum2.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/class179/Code04_SubsequenceSum2.java b/src/class179/Code04_SubsequenceSum2.java index 71cc0b6d9..d5d0c5199 100644 --- a/src/class179/Code04_SubsequenceSum2.java +++ b/src/class179/Code04_SubsequenceSum2.java @@ -122,10 +122,18 @@ // int jobr = query[i].r; // int mod = query[i].mod; // int id = query[i].id; -// while (winl > jobl) add(arr[--winl]); -// while (winr < jobr) add(arr[++winr]); -// while (winl < jobl) del(arr[winl++]); -// while (winr > jobr) del(arr[winr--]); +// while (winl > jobl) { +// add(arr[--winl]); +// } +// while (winr < jobr) { +// add(arr[++winr]); +// } +// while (winl < jobl) { +// del(arr[winl++]); +// } +// while (winr > jobr) { +// del(arr[winr--]); +// } // ans[id] = getAns(jobr - jobl + 1, mod); // } //} From 6a6a96d14ff23665bd90944811009af938980163 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 18 Sep 2025 21:39:02 +0800 Subject: [PATCH 0739/1170] modify code --- src/class179/Code04_SubsequenceSum1.java | 10 +- src/class179/Code04_SubsequenceSum2.java | 10 +- src/class179/Code05_Homework1.java | 191 +++++++++++++++++++++++ 3 files changed, 201 insertions(+), 10 deletions(-) create mode 100644 src/class179/Code05_Homework1.java diff --git a/src/class179/Code04_SubsequenceSum1.java b/src/class179/Code04_SubsequenceSum1.java index 47dd54248..105426317 100644 --- a/src/class179/Code04_SubsequenceSum1.java +++ b/src/class179/Code04_SubsequenceSum1.java @@ -99,7 +99,7 @@ public static void del(int num) { } } - public static long getAns(int len, int mod) { + public static void setAns(int len, int mod, int id) { int blen = (int) Math.sqrt(len); int bnum = (len + blen - 1) / blen; smlPow[0] = 1; @@ -110,14 +110,14 @@ public static long getAns(int len, int mod) { for (int i = 1; i <= bnum; i++) { bigPow[i] = (bigPow[i - 1] * smlPow[blen]) % mod; } - long ret = 0, tmp; + long res = 0, tmp; for (int p = head; p > 0; p = next[p]) { tmp = bigPow[len / blen] * smlPow[len % blen] % mod; tmp -= bigPow[(len - p) / blen] * smlPow[(len - p) % blen] % mod; tmp = (tmp * sum[p]) % mod; - ret = ((ret + tmp) % mod + mod) % mod; + res = ((res + tmp) % mod + mod) % mod; } - return ret; + ans[id] = res; } public static void compute() { @@ -139,7 +139,7 @@ public static void compute() { while (winr > jobr) { del(arr[winr--]); } - ans[id] = getAns(jobr - jobl + 1, mod); + setAns(jobr - jobl + 1, mod, id); } } diff --git a/src/class179/Code04_SubsequenceSum2.java b/src/class179/Code04_SubsequenceSum2.java index d5d0c5199..9645e270d 100644 --- a/src/class179/Code04_SubsequenceSum2.java +++ b/src/class179/Code04_SubsequenceSum2.java @@ -94,7 +94,7 @@ // } //} // -//long long getAns(int len, int mod) { +//void setAns(int len, int mod, int id) { // int blen = (int)sqrt(len); // int bnum = (len + blen - 1) / blen; // smlPow[0] = 1; @@ -105,14 +105,14 @@ // for (int i = 1; i <= bnum; i++) { // bigPow[i] = (bigPow[i - 1] * smlPow[blen]) % mod; // } -// long long ret = 0, tmp; +// long long res = 0, tmp; // for (int p = head; p > 0; p = nxt[p]) { // tmp = bigPow[len / blen] * smlPow[len % blen] % mod; // tmp -= bigPow[(len - p) / blen] * smlPow[(len - p) % blen] % mod; // tmp = (tmp * sum[p]) % mod; -// ret = ((ret + tmp) % mod + mod) % mod; +// res = ((res + tmp) % mod + mod) % mod; // } -// return ret; +// ans[id] = res; //} // //void compute() { @@ -134,7 +134,7 @@ // while (winr > jobr) { // del(arr[winr--]); // } -// ans[id] = getAns(jobr - jobl + 1, mod); +// setAns(jobr - jobl + 1, mod, id); // } //} // diff --git a/src/class179/Code05_Homework1.java b/src/class179/Code05_Homework1.java new file mode 100644 index 000000000..73bca379b --- /dev/null +++ b/src/class179/Code05_Homework1.java @@ -0,0 +1,191 @@ +package class179; + +// 作业,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4396 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code05_Homework1 { + + public static int MAXN = 100001; + public static int n, m; + public static int[] arr = new int[MAXN]; + // l、r、a、b、id + public static int[][] query = new int[MAXN][5]; + public static int[] bi = new int[MAXN]; + public static int[] bl = new int[MAXN]; + public static int[] br = new int[MAXN]; + + public static int[] numCnt = new int[MAXN]; + public static int[] blockCnt = new int[MAXN]; + public static int[] blockKind = new int[MAXN]; + + public static int[] ans1 = new int[MAXN]; + public static int[] ans2 = new int[MAXN]; + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } else { + return b[1] - a[1]; + } + } + } + + public static void add(int x) { + numCnt[x]++; + blockCnt[bi[x]]++; + if (numCnt[x] == 1) { + blockKind[bi[x]]++; + } + } + + public static void del(int x) { + numCnt[x]--; + blockCnt[bi[x]]--; + if (numCnt[x] == 0) { + blockKind[bi[x]]--; + } + } + + public static void setAns(int a, int b, int id) { + if (bi[a] == bi[b]) { + for (int i = a; i <= b; i++) { + if (numCnt[i] > 0) { + ans1[id] += numCnt[i]; + ans2[id]++; + } + } + } else { + for (int i = a; i <= br[bi[a]]; i++) { + if (numCnt[i] > 0) { + ans1[id] += numCnt[i]; + ans2[id]++; + } + } + for (int i = bl[bi[b]]; i <= b; i++) { + if (numCnt[i] > 0) { + ans1[id] += numCnt[i]; + ans2[id]++; + } + } + for (int i = bi[a] + 1; i <= bi[b] - 1; i++) { + ans1[id] += blockCnt[i]; + ans2[id] += blockKind[i]; + } + } + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int joba = query[i][2]; + int jobb = query[i][3]; + int id = query[i][4]; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); + } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + setAns(joba, jobb, id); + } + } + + public static void prepare() { + int limit = MAXN - 1; + int blen = (int) Math.sqrt(limit); + int bnum = (limit + blen - 1) / blen; + for (int i = 1; i <= limit; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= bnum; i++) { + bl[i] = (i - 1) * blen + 1; + br[i] = Math.min(i * blen, limit); + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = in.nextInt(); + query[i][3] = in.nextInt(); + query[i][4] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans1[i] + " " + ans2[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 40032f7f0e014ee135403fc867153e5551d57833 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 18 Sep 2025 21:39:53 +0800 Subject: [PATCH 0740/1170] modify code --- src/class179/Code05_Homework1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class179/Code05_Homework1.java b/src/class179/Code05_Homework1.java index 73bca379b..b43a2b38c 100644 --- a/src/class179/Code05_Homework1.java +++ b/src/class179/Code05_Homework1.java @@ -112,15 +112,15 @@ public static void compute() { } public static void prepare() { - int limit = MAXN - 1; - int blen = (int) Math.sqrt(limit); - int bnum = (limit + blen - 1) / blen; - for (int i = 1; i <= limit; i++) { + int nv = MAXN - 1; + int blen = (int) Math.sqrt(nv); + int bnum = (nv + blen - 1) / blen; + for (int i = 1; i <= nv; i++) { bi[i] = (i - 1) / blen + 1; } for (int i = 1; i <= bnum; i++) { bl[i] = (i - 1) * blen + 1; - br[i] = Math.min(i * blen, limit); + br[i] = Math.min(i * blen, nv); } Arrays.sort(query, 1, m + 1, new QueryCmp()); } From e523b908fe3fd0ebca2c9ddbb625af93c777e617 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 24 Sep 2025 11:59:51 +0900 Subject: [PATCH 0741/1170] modify code --- src/class179/Code06_LCP1.java | 214 ++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 src/class179/Code06_LCP1.java diff --git a/src/class179/Code06_LCP1.java b/src/class179/Code06_LCP1.java new file mode 100644 index 000000000..80f269a02 --- /dev/null +++ b/src/class179/Code06_LCP1.java @@ -0,0 +1,214 @@ +package class179; + +// 区间LCP达标对,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5112 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code06_LCP1 { + + public static int MAXN = 3000001; + public static int MAXM = 100001; + public static int n, m, k; + public static long[] arr = new long[MAXN]; + public static int[][] query = new int[MAXM][3]; + + public static int base = 499; + public static long[] pow = new long[MAXN]; + public static long[] hash = new long[MAXN]; + + public static long[] sorted = new long[MAXN]; + public static int[] val = new int[MAXN]; + public static int[] bi = new int[MAXN]; + + public static long[] cnt = new long[MAXN]; + public static long curAns; + public static long[] ans = new long[MAXM]; + + public static int kth(int len, long num) { + int left = 1, right = len, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } else { + return b[1] - a[1]; + } + } + } + + public static void add(int x) { + curAns -= cnt[x] * cnt[x]; + cnt[x]++; + curAns += cnt[x] * cnt[x]; + } + + public static void del(int x) { + curAns -= cnt[x] * cnt[x]; + cnt[x]--; + curAns += cnt[x] * cnt[x]; + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= m; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; + if (jobl > jobr) { + ans[id] = 0; + } else { + while (winl > jobl) { + add(val[--winl]); + } + while (winr < jobr) { + add(val[++winr]); + } + while (winl < jobl) { + del(val[winl++]); + } + while (winr > jobr) { + del(val[winr--]); + } + ans[id] = (curAns - (jobr - jobl + 1)) / 2; + } + } + } + + public static void prepare() { + pow[0] = 1; + for (int i = 1; i <= n; i++) { + pow[i] = pow[i - 1] * base; + hash[i] = hash[i - 1] * base + arr[i]; + } + for (int l = 1, r = k; r <= n; l++, r++) { + arr[l] = hash[r] - hash[l - 1] * pow[r - l + 1]; + sorted[l] = arr[l]; + } + n = n - k + 1; + Arrays.sort(sorted, 1, n + 1); + int len = 1; + for (int i = 2; i <= n; i++) { + if (sorted[len] != sorted[i]) { + sorted[++len] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + val[i] = kth(len, arr[i]); + } + int blen = Math.max(1, (int) ((double) n / Math.sqrt(m))); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= m; i++) { + query[i][1] = Math.min(query[i][1], n); + } + Arrays.sort(query, 1, m + 1, new QueryCmp()); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + k = in.nextInt(); + char c; + for (int i = 1; i <= n; i++) { + c = in.nextLowerCase(); + arr[i] = c - 'a' + 1; + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = i; + } + prepare(); + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextLowerCase() throws IOException { + int c; + while (true) { + c = readByte(); + if (c >= 'a' && c <= 'z') + return (char) c; + } + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} From 70ce3085527e654b258ff5263e605f4006792c8a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 24 Sep 2025 14:16:21 +0900 Subject: [PATCH 0742/1170] modify code --- src/class179/Code06_LCP1.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/class179/Code06_LCP1.java b/src/class179/Code06_LCP1.java index 80f269a02..dda179658 100644 --- a/src/class179/Code06_LCP1.java +++ b/src/class179/Code06_LCP1.java @@ -105,9 +105,11 @@ public static void prepare() { } for (int l = 1, r = k; r <= n; l++, r++) { arr[l] = hash[r] - hash[l - 1] * pow[r - l + 1]; - sorted[l] = arr[l]; } n = n - k + 1; + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } Arrays.sort(sorted, 1, n + 1); int len = 1; for (int i = 2; i <= n; i++) { From e5c28120e7f15c3d0cbbb65e363d123ff1468b79 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 24 Sep 2025 14:28:43 +0900 Subject: [PATCH 0743/1170] modify code --- src/class179/Code06_LCP1.java | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/class179/Code06_LCP1.java b/src/class179/Code06_LCP1.java index dda179658..4a3c127ac 100644 --- a/src/class179/Code06_LCP1.java +++ b/src/class179/Code06_LCP1.java @@ -16,15 +16,17 @@ public class Code06_LCP1 { public static int MAXN = 3000001; public static int MAXM = 100001; public static int n, m, k; - public static long[] arr = new long[MAXN]; + + public static char[] str = new char[MAXN]; public static int[][] query = new int[MAXM][3]; public static int base = 499; public static long[] pow = new long[MAXN]; public static long[] hash = new long[MAXN]; + public static long[] val = new long[MAXN]; public static long[] sorted = new long[MAXN]; - public static int[] val = new int[MAXN]; + public static int[] arr = new int[MAXN]; public static int[] bi = new int[MAXN]; public static long[] cnt = new long[MAXN]; @@ -81,16 +83,16 @@ public static void compute() { ans[id] = 0; } else { while (winl > jobl) { - add(val[--winl]); + add(arr[--winl]); } while (winr < jobr) { - add(val[++winr]); + add(arr[++winr]); } while (winl < jobl) { - del(val[winl++]); + del(arr[winl++]); } while (winr > jobr) { - del(val[winr--]); + del(arr[winr--]); } ans[id] = (curAns - (jobr - jobl + 1)) / 2; } @@ -101,14 +103,14 @@ public static void prepare() { pow[0] = 1; for (int i = 1; i <= n; i++) { pow[i] = pow[i - 1] * base; - hash[i] = hash[i - 1] * base + arr[i]; + hash[i] = hash[i - 1] * base + (str[i] - 'a' + 1); } for (int l = 1, r = k; r <= n; l++, r++) { - arr[l] = hash[r] - hash[l - 1] * pow[r - l + 1]; + val[l] = hash[r] - hash[l - 1] * pow[r - l + 1]; } n = n - k + 1; for (int i = 1; i <= n; i++) { - sorted[i] = arr[i]; + sorted[i] = val[i]; } Arrays.sort(sorted, 1, n + 1); int len = 1; @@ -118,7 +120,7 @@ public static void prepare() { } } for (int i = 1; i <= n; i++) { - val[i] = kth(len, arr[i]); + arr[i] = kth(len, val[i]); } int blen = Math.max(1, (int) ((double) n / Math.sqrt(m))); for (int i = 1; i <= n; i++) { @@ -136,10 +138,8 @@ public static void main(String[] args) throws Exception { n = in.nextInt(); m = in.nextInt(); k = in.nextInt(); - char c; for (int i = 1; i <= n; i++) { - c = in.nextLowerCase(); - arr[i] = c - 'a' + 1; + str[i] = in.nextLowerCase(); } for (int i = 1; i <= m; i++) { query[i][0] = in.nextInt(); From 79b7038e6edcc342f99d3815b7e9c5418da7bea2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 26 Sep 2025 11:38:25 +0800 Subject: [PATCH 0744/1170] modify code --- src/class179/Code06_LCP1.java | 75 +++++++++++++++++------------------ 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/src/class179/Code06_LCP1.java b/src/class179/Code06_LCP1.java index 4a3c127ac..feefa8896 100644 --- a/src/class179/Code06_LCP1.java +++ b/src/class179/Code06_LCP1.java @@ -17,6 +17,7 @@ public class Code06_LCP1 { public static int MAXM = 100001; public static int n, m, k; + public static int len, cntq; public static char[] str = new char[MAXN]; public static int[][] query = new int[MAXM][3]; @@ -33,8 +34,8 @@ public class Code06_LCP1 { public static long curAns; public static long[] ans = new long[MAXM]; - public static int kth(int len, long num) { - int left = 1, right = len, mid, ret = 0; + public static int kth(int siz, long num) { + int left = 1, right = siz, mid, ret = 0; while (left <= right) { mid = (left + right) / 2; if (sorted[mid] <= num) { @@ -75,27 +76,23 @@ public static void del(int x) { public static void compute() { int winl = 1, winr = 0; - for (int i = 1; i <= m; i++) { + for (int i = 1; i <= cntq; i++) { int jobl = query[i][0]; int jobr = query[i][1]; int id = query[i][2]; - if (jobl > jobr) { - ans[id] = 0; - } else { - while (winl > jobl) { - add(arr[--winl]); - } - while (winr < jobr) { - add(arr[++winr]); - } - while (winl < jobl) { - del(arr[winl++]); - } - while (winr > jobr) { - del(arr[winr--]); - } - ans[id] = (curAns - (jobr - jobl + 1)) / 2; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + ans[id] = (curAns - (jobr - jobl + 1)) / 2; } } @@ -108,28 +105,24 @@ public static void prepare() { for (int l = 1, r = k; r <= n; l++, r++) { val[l] = hash[r] - hash[l - 1] * pow[r - l + 1]; } - n = n - k + 1; - for (int i = 1; i <= n; i++) { + for (int i = 1; i <= len; i++) { sorted[i] = val[i]; } - Arrays.sort(sorted, 1, n + 1); - int len = 1; - for (int i = 2; i <= n; i++) { - if (sorted[len] != sorted[i]) { - sorted[++len] = sorted[i]; + Arrays.sort(sorted, 1, len + 1); + int cntv = 1; + for (int i = 2; i <= len; i++) { + if (sorted[cntv] != sorted[i]) { + sorted[++cntv] = sorted[i]; } } - for (int i = 1; i <= n; i++) { - arr[i] = kth(len, val[i]); + for (int i = 1; i <= len; i++) { + arr[i] = kth(cntv, val[i]); } - int blen = Math.max(1, (int) ((double) n / Math.sqrt(m))); - for (int i = 1; i <= n; i++) { + int blen = Math.max(1, (int) ((double) len / Math.sqrt(cntq))); + for (int i = 1; i <= len; i++) { bi[i] = (i - 1) / blen + 1; } - for (int i = 1; i <= m; i++) { - query[i][1] = Math.min(query[i][1], n); - } - Arrays.sort(query, 1, m + 1, new QueryCmp()); + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); } public static void main(String[] args) throws Exception { @@ -141,10 +134,16 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { str[i] = in.nextLowerCase(); } - for (int i = 1; i <= m; i++) { - query[i][0] = in.nextInt(); - query[i][1] = in.nextInt(); - query[i][2] = i; + len = n - k + 1; + cntq = 0; + for (int i = 1, l, r; i <= m; i++) { + l = in.nextInt(); + r = in.nextInt(); + if (l <= len) { + query[++cntq][0] = l; + query[cntq][1] = Math.min(r, len); + query[cntq][2] = i; + } } prepare(); compute(); From 92a30669c1da8fc15a5d7dc1c601c5b7af136ead Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 27 Sep 2025 13:17:37 +0800 Subject: [PATCH 0745/1170] modify code --- src/class179/Code06_LCP1.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/class179/Code06_LCP1.java b/src/class179/Code06_LCP1.java index feefa8896..8ddda89a6 100644 --- a/src/class179/Code06_LCP1.java +++ b/src/class179/Code06_LCP1.java @@ -16,8 +16,7 @@ public class Code06_LCP1 { public static int MAXN = 3000001; public static int MAXM = 100001; public static int n, m, k; - - public static int len, cntq; + public static int len, cntq, cntv; public static char[] str = new char[MAXN]; public static int[][] query = new int[MAXM][3]; @@ -34,8 +33,8 @@ public class Code06_LCP1 { public static long curAns; public static long[] ans = new long[MAXM]; - public static int kth(int siz, long num) { - int left = 1, right = siz, mid, ret = 0; + public static int kth(long num) { + int left = 1, right = cntv, mid, ret = 0; while (left <= right) { mid = (left + right) / 2; if (sorted[mid] <= num) { @@ -109,14 +108,14 @@ public static void prepare() { sorted[i] = val[i]; } Arrays.sort(sorted, 1, len + 1); - int cntv = 1; + cntv = 1; for (int i = 2; i <= len; i++) { if (sorted[cntv] != sorted[i]) { sorted[++cntv] = sorted[i]; } } for (int i = 1; i <= len; i++) { - arr[i] = kth(cntv, val[i]); + arr[i] = kth(val[i]); } int blen = Math.max(1, (int) ((double) len / Math.sqrt(cntq))); for (int i = 1; i <= len; i++) { From 8d45faf889b284cb66ee4f55fd82694068e76291 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 27 Sep 2025 17:00:35 +0800 Subject: [PATCH 0746/1170] modify code --- src/class179/Code07_RabbitHole1.java | 240 +++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 src/class179/Code07_RabbitHole1.java diff --git a/src/class179/Code07_RabbitHole1.java b/src/class179/Code07_RabbitHole1.java new file mode 100644 index 000000000..29a5a2957 --- /dev/null +++ b/src/class179/Code07_RabbitHole1.java @@ -0,0 +1,240 @@ +package class179; + +// 掉进兔子洞,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4688 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; + +public class Code07_RabbitHole1 { + + static class BitSet { + + final int POW = 6; + + final int MASK = 63; + + int len; + + long[] status; + + public BitSet(int siz) { + len = (siz + MASK) >> POW; + status = new long[len]; + } + + public void clear() { + for (int i = 0; i < len; i++) { + status[i] = 0; + } + } + + public void clone(BitSet obj) { + for (int i = 0; i < len; i++) { + status[i] = obj.status[i]; + } + } + + public void and(BitSet obj) { + for (int i = 0; i < len; i++) { + status[i] &= obj.status[i]; + } + } + + public void setOne(int bit) { + status[bit >> POW] |= 1L << (bit & MASK); + } + + public void setZero(int bit) { + status[bit >> POW] &= ~(1L << (bit & MASK)); + } + + public int getOnes() { + int ret = 0; + for (int i = 0; i < len; i++) { + ret += Long.bitCount(status[i]); + } + return ret; + } + } + + public static int MAXN = 100001; + public static int MAXT = 30001; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXT * 3][3]; + public static int[] sorted = new int[MAXN]; + public static int[] bi = new int[MAXN]; + + public static int[] cnt = new int[MAXN]; + public static boolean[] hasSet = new boolean[MAXT]; + public static BitSet[] bitSet = new BitSet[MAXT]; + public static BitSet curSet; + + public static int[] ans = new int[MAXT]; + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; + } + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; + } else { + return b[1] - a[1]; + } + } + } + + public static int kth(int num) { + int left = 1, right = n, mid, ret = -1; + while (left <= right) { + mid = (left + right) >> 1; + if (sorted[mid] >= num) { + ret = mid; + right = mid - 1; + } else { + left = mid + 1; + } + } + return ret; + } + + public static void add(int x) { + cnt[x]++; + curSet.setOne(x + cnt[x] - 1); + } + + public static void del(int x) { + cnt[x]--; + curSet.setZero(x + cnt[x]); + } + + public static void compute(int q) { + int winl = 1, winr = 0; + for (int i = 1; i <= q; i++) { + int jobl = query[i][0]; + int jobr = query[i][1]; + int id = query[i][2]; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); + } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + if (!hasSet[id]) { + hasSet[id] = true; + bitSet[id].clone(curSet); + } else { + bitSet[id].and(curSet); + } + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + for (int i = 1; i <= n; i++) { + arr[i] = kth(arr[i]); + } + int blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i < MAXT; i++) { + bitSet[i] = new BitSet(n + 1); + } + curSet = new BitSet(n + 1); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + prepare(); + for (int t = MAXT - 1; m > 0; m -= t) { + int k = Math.min(m, t); + Arrays.fill(cnt, 1, n + 1, 0); + Arrays.fill(hasSet, 1, k + 1, false); + Arrays.fill(ans, 1, k + 1, 0); + curSet.clear(); + int cntq = 0; + for (int i = 1; i <= k; i++) { + for (int j = 1; j <= 3; j++) { + query[++cntq][0] = in.nextInt(); + query[cntq][1] = in.nextInt(); + query[cntq][2] = i; + ans[i] += query[cntq][1] - query[cntq][0] + 1; + } + } + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + compute(cntq); + for (int i = 1; i <= k; i++) { + ans[i] -= bitSet[i].getOnes() * 3; + } + for (int i = 1; i <= k; i++) { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 49035037e9cca92a9e1df5da701a74e736538090 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 27 Sep 2025 17:56:50 +0800 Subject: [PATCH 0747/1170] modify code --- src/class179/Code07_RabbitHole1.java | 5 +++-- src/class179/Code08_CornField1.java | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 src/class179/Code08_CornField1.java diff --git a/src/class179/Code07_RabbitHole1.java b/src/class179/Code07_RabbitHole1.java index 29a5a2957..1b736f27b 100644 --- a/src/class179/Code07_RabbitHole1.java +++ b/src/class179/Code07_RabbitHole1.java @@ -34,7 +34,7 @@ public void clear() { } } - public void clone(BitSet obj) { + public void copy(BitSet obj) { for (int i = 0; i < len; i++) { status[i] = obj.status[i]; } @@ -61,6 +61,7 @@ public int getOnes() { } return ret; } + } public static int MAXN = 100001; @@ -136,7 +137,7 @@ public static void compute(int q) { } if (!hasSet[id]) { hasSet[id] = true; - bitSet[id].clone(curSet); + bitSet[id].copy(curSet); } else { bitSet[id].and(curSet); } diff --git a/src/class179/Code08_CornField1.java b/src/class179/Code08_CornField1.java new file mode 100644 index 000000000..905bdd8ff --- /dev/null +++ b/src/class179/Code08_CornField1.java @@ -0,0 +1,8 @@ +package class179; + +// 由乃的玉米田,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5355 + +public class Code08_CornField1 { + +} From 12f00242a375479c99f7ecd90a1c401c035c0ea8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 27 Sep 2025 21:49:34 +0800 Subject: [PATCH 0748/1170] modify code --- src/class179/Code07_RabbitHole1.java | 12 +- src/class179/Code08_CornField1.java | 303 +++++++++++++++++++++++++++ 2 files changed, 306 insertions(+), 9 deletions(-) diff --git a/src/class179/Code07_RabbitHole1.java b/src/class179/Code07_RabbitHole1.java index 1b736f27b..03a2115a2 100644 --- a/src/class179/Code07_RabbitHole1.java +++ b/src/class179/Code07_RabbitHole1.java @@ -14,17 +14,11 @@ public class Code07_RabbitHole1 { static class BitSet { - - final int POW = 6; - - final int MASK = 63; - int len; - long[] status; public BitSet(int siz) { - len = (siz + MASK) >> POW; + len = (siz + 63) >> 6; status = new long[len]; } @@ -47,11 +41,11 @@ public void and(BitSet obj) { } public void setOne(int bit) { - status[bit >> POW] |= 1L << (bit & MASK); + status[bit >> 6] |= 1L << (bit & 63); } public void setZero(int bit) { - status[bit >> POW] &= ~(1L << (bit & MASK)); + status[bit >> 6] &= ~(1L << (bit & 63)); } public int getOnes() { diff --git a/src/class179/Code08_CornField1.java b/src/class179/Code08_CornField1.java index 905bdd8ff..7c0ccdf84 100644 --- a/src/class179/Code08_CornField1.java +++ b/src/class179/Code08_CornField1.java @@ -2,7 +2,310 @@ // 由乃的玉米田,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5355 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Comparator; public class Code08_CornField1 { + static class BitSet { + int len; + long[] status; + + public BitSet(int siz) { + len = (siz + 63) >> 6; + status = new long[len]; + } + + public void setOne(int bit) { + status[bit >> 6] |= 1L << (bit & 63); + } + + public void setZero(int bit) { + status[bit >> 6] &= ~(1L << (bit & 63)); + } + + public boolean status(int bit) { + return ((status[bit >> 6] >> (bit & 63)) & 1L) != 0L; + } + + public boolean andOther(BitSet other) { + for (int i = 0; i < len; i++) { + if ((status[i] & other.status[i]) != 0L) { + return true; + } + } + return false; + } + + // 检查 自己 & 自己左移k位 是否有非零位 + public boolean andSelfMoveLeft(int k) { + int ws = k >> 6; + int bs = k & 63; + for (int i = len - 1; i >= 0; i--) { + int src = i - ws; + if (src < 0) { + break; + } + long shifted = (status[src] << bs); + if (bs != 0 && src - 1 >= 0) { + shifted |= (status[src - 1] >>> (64 - bs)); + } + if ((status[i] & shifted) != 0L) { + return true; + } + } + return false; + } + + // 检查 自己 & other右移k位 是否有非零位 + public boolean andOtherMoveRight(BitSet other, int k) { + int ws = k >> 6; + int bs = k & 63; + for (int i = 0; i < len; i++) { + int src = i + ws; + if (src >= len) { + break; + } + long shifted = (other.status[src] >>> bs); + if (bs != 0 && src + 1 < len) { + shifted |= (other.status[src + 1] << (64 - bs)); + } + if ((status[i] & shifted) != 0L) { + return true; + } + } + return false; + } + + } + + public static int MAXN = 100001; + public static int MAXV = 100000; + public static int MAXB = 401; + public static int n, m, blen; + public static int[] arr = new int[MAXN]; + public static int[] bi = new int[MAXN]; + + // 普通查询,op、l、r、x、id + public static int[][] query = new int[MAXN][5]; + public static int cntq; + + // 特别查询,l、r、id + public static int[] headq = new int[MAXB]; + public static int[] nextq = new int[MAXN]; + public static int[] ql = new int[MAXN]; + public static int[] qr = new int[MAXN]; + public static int[] qid = new int[MAXN]; + public static int cnts; + + public static BitSet bitSet1 = new BitSet(MAXN); + public static BitSet bitSet2 = new BitSet(MAXN); + + public static int[] cnt = new int[MAXN]; + public static int[] pre = new int[MAXN]; + public static int[] maxLeft = new int[MAXN]; + + public static boolean[] ans = new boolean[MAXN]; + + public static void addSpecial(int x, int l, int r, int id) { + nextq[++cnts] = headq[x]; + headq[x] = cnts; + ql[cnts] = l; + qr[cnts] = r; + qid[cnts] = id; + } + + public static class QueryCmp implements Comparator { + @Override + public int compare(int[] a, int[] b) { + if (bi[a[1]] != bi[b[1]]) { + return bi[a[1]] - bi[b[1]]; + } + if ((bi[a[1]] & 1) == 1) { + return a[2] - b[2]; + } else { + return b[2] - a[2]; + } + } + } + + public static void add(int x) { + cnt[x]++; + if (cnt[x] == 1) { + bitSet1.setOne(x); + bitSet2.setOne(MAXV - x); + } + } + + public static void del(int x) { + cnt[x]--; + if (cnt[x] == 0) { + bitSet1.setZero(x); + bitSet2.setZero(MAXV - x); + } + } + + public static boolean getAns(int op, int x) { + if (op == 1) { + return bitSet1.andSelfMoveLeft(x); + } else if (op == 2) { + return bitSet1.andOtherMoveRight(bitSet2, MAXV - x); + } else if (op == 3) { + for (int d = 1; d * d <= x; d++) { + if (x % d == 0) { + if (bitSet1.status(d) && bitSet1.status(x / d)) { + return true; + } + } + } + return false; + } else { + if (x >= 1) { + for (int i = 1; i * x <= MAXV; i++) { + if (bitSet1.status(i) && bitSet1.status(i * x)) { + return true; + } + } + } + return false; + } + } + + public static void compute() { + int winl = 1, winr = 0; + for (int i = 1; i <= cntq; i++) { + int op = query[i][0]; + int jobl = query[i][1]; + int jobr = query[i][2]; + int jobx = query[i][3]; + int id = query[i][4]; + while (winl > jobl) { + add(arr[--winl]); + } + while (winr < jobr) { + add(arr[++winr]); + } + while (winl < jobl) { + del(arr[winl++]); + } + while (winr > jobr) { + del(arr[winr--]); + } + ans[id] = getAns(op, jobx); + } + } + + public static void special() { + for (int x = 1; x < blen; x++) { + if (headq[x] != 0) { + Arrays.fill(pre, 0); + Arrays.fill(maxLeft, 0); + int last = 0; + for (int i = 1; i <= n; i++) { + int val = arr[i]; + pre[val] = i; + if (val * x <= MAXV) { + last = Math.max(last, pre[val * x]); + } + if (val % x == 0) { + last = Math.max(last, pre[val / x]); + } + maxLeft[i] = last; + } + for (int q = headq[x]; q > 0; q = nextq[q]) { + int l = ql[q]; + int r = qr[q]; + int id = qid[q]; + ans[id] = l <= maxLeft[r]; + } + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + blen = (int) Math.sqrt(n); + for (int i = 1; i <= n; i++) { + bi[i] = (i - 1) / blen + 1; + } + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1, op, l, r, x; i <= m; i++) { + op = in.nextInt(); + l = in.nextInt(); + r = in.nextInt(); + x = in.nextInt(); + if (op == 4 && x < blen) { + addSpecial(x, l, r, i); + } else { + query[++cntq][0] = op; + query[cntq][1] = l; + query[cntq][2] = r; + query[cntq][3] = x; + query[cntq][4] = i; + } + } + Arrays.sort(query, 1, cntq + 1, new QueryCmp()); + compute(); + special(); + for (int i = 1; i <= m; i++) { + if (ans[i]) { + out.println("yuno"); + } else { + out.println("yumi"); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From 7b59d0f474ef6ae3a25deddaff3fa068dd8eeecf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 27 Sep 2025 21:52:38 +0800 Subject: [PATCH 0749/1170] modify code --- src/class179/Code08_CornField1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class179/Code08_CornField1.java b/src/class179/Code08_CornField1.java index 7c0ccdf84..8ebc21cb6 100644 --- a/src/class179/Code08_CornField1.java +++ b/src/class179/Code08_CornField1.java @@ -108,7 +108,7 @@ public boolean andOtherMoveRight(BitSet other, int k) { public static BitSet bitSet2 = new BitSet(MAXN); public static int[] cnt = new int[MAXN]; - public static int[] pre = new int[MAXN]; + public static int[] lastPos = new int[MAXN]; public static int[] maxLeft = new int[MAXN]; public static boolean[] ans = new boolean[MAXN]; @@ -204,17 +204,17 @@ public static void compute() { public static void special() { for (int x = 1; x < blen; x++) { if (headq[x] != 0) { - Arrays.fill(pre, 0); + Arrays.fill(lastPos, 0); Arrays.fill(maxLeft, 0); int last = 0; for (int i = 1; i <= n; i++) { int val = arr[i]; - pre[val] = i; + lastPos[val] = i; if (val * x <= MAXV) { - last = Math.max(last, pre[val * x]); + last = Math.max(last, lastPos[val * x]); } if (val % x == 0) { - last = Math.max(last, pre[val / x]); + last = Math.max(last, lastPos[val / x]); } maxLeft[i] = last; } From dfc8d68f18bed083ee7ef47a2d01b43c6389002f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 27 Sep 2025 21:56:04 +0800 Subject: [PATCH 0750/1170] modify code --- .../{Code08_CornField1.java => Code08_YnoiCornfield1.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/class179/{Code08_CornField1.java => Code08_YnoiCornfield1.java} (99%) diff --git a/src/class179/Code08_CornField1.java b/src/class179/Code08_YnoiCornfield1.java similarity index 99% rename from src/class179/Code08_CornField1.java rename to src/class179/Code08_YnoiCornfield1.java index 8ebc21cb6..6274f954b 100644 --- a/src/class179/Code08_CornField1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -11,7 +11,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code08_CornField1 { +public class Code08_YnoiCornfield1 { static class BitSet { int len; From 35cf1733992a0087a00d8127ad1bdc91fbd0b520 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 27 Sep 2025 22:03:18 +0800 Subject: [PATCH 0751/1170] modify code --- .../{Code04_SubsequenceSum1.java => Code04_NotForget1.java} | 6 +++--- .../{Code04_SubsequenceSum2.java => Code04_NotForget2.java} | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/class179/{Code04_SubsequenceSum1.java => Code04_NotForget1.java} (96%) rename src/class179/{Code04_SubsequenceSum2.java => Code04_NotForget2.java} (99%) diff --git a/src/class179/Code04_SubsequenceSum1.java b/src/class179/Code04_NotForget1.java similarity index 96% rename from src/class179/Code04_SubsequenceSum1.java rename to src/class179/Code04_NotForget1.java index 105426317..fdcaa0032 100644 --- a/src/class179/Code04_SubsequenceSum1.java +++ b/src/class179/Code04_NotForget1.java @@ -1,10 +1,10 @@ package class179; -// 区间子序列的和,java版 +// 盼君勿忘,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5072 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code04_SubsequenceSum2文件就是C++的实现 +// 想通过用C++实现,本节课Code04_NotForget2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -14,7 +14,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code04_SubsequenceSum1 { +public class Code04_NotForget1 { public static int MAXN = 100001; public static int MAXB = 401; diff --git a/src/class179/Code04_SubsequenceSum2.java b/src/class179/Code04_NotForget2.java similarity index 99% rename from src/class179/Code04_SubsequenceSum2.java rename to src/class179/Code04_NotForget2.java index 9645e270d..e56e4220c 100644 --- a/src/class179/Code04_SubsequenceSum2.java +++ b/src/class179/Code04_NotForget2.java @@ -1,6 +1,6 @@ package class179; -// 区间子序列的和,C++版 +// 盼君勿忘,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P5072 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From ee0927efafc9b31b4489e61d4518cfed8ae6cb8d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 28 Sep 2025 09:10:06 +0800 Subject: [PATCH 0752/1170] modify code --- src/class179/Code08_YnoiCornfield1.java | 30 ++++++++++++------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/class179/Code08_YnoiCornfield1.java b/src/class179/Code08_YnoiCornfield1.java index 6274f954b..328cc80d2 100644 --- a/src/class179/Code08_YnoiCornfield1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -92,11 +92,11 @@ public boolean andOtherMoveRight(BitSet other, int k) { public static int[] arr = new int[MAXN]; public static int[] bi = new int[MAXN]; - // 普通查询,op、l、r、x、id + // 普通查询,l、r、x、op、id public static int[][] query = new int[MAXN][5]; public static int cntq; - // 特别查询,l、r、id + // 特别查询,x的问题列表 : l、r、id public static int[] headq = new int[MAXB]; public static int[] nextq = new int[MAXN]; public static int[] ql = new int[MAXN]; @@ -124,13 +124,13 @@ public static void addSpecial(int x, int l, int r, int id) { public static class QueryCmp implements Comparator { @Override public int compare(int[] a, int[] b) { - if (bi[a[1]] != bi[b[1]]) { - return bi[a[1]] - bi[b[1]]; + if (bi[a[0]] != bi[b[0]]) { + return bi[a[0]] - bi[b[0]]; } - if ((bi[a[1]] & 1) == 1) { - return a[2] - b[2]; + if ((bi[a[0]] & 1) == 1) { + return a[1] - b[1]; } else { - return b[2] - a[2]; + return b[1] - a[1]; } } } @@ -180,10 +180,10 @@ public static boolean getAns(int op, int x) { public static void compute() { int winl = 1, winr = 0; for (int i = 1; i <= cntq; i++) { - int op = query[i][0]; - int jobl = query[i][1]; - int jobr = query[i][2]; - int jobx = query[i][3]; + int jobl = query[i][0]; + int jobr = query[i][1]; + int jobx = query[i][2]; + int op = query[i][3]; int id = query[i][4]; while (winl > jobl) { add(arr[--winl]); @@ -248,10 +248,10 @@ public static void main(String[] args) throws Exception { if (op == 4 && x < blen) { addSpecial(x, l, r, i); } else { - query[++cntq][0] = op; - query[cntq][1] = l; - query[cntq][2] = r; - query[cntq][3] = x; + query[++cntq][0] = l; + query[cntq][1] = r; + query[cntq][2] = x; + query[cntq][3] = op; query[cntq][4] = i; } } From 7cd4b8d7434b5817f7b3bcd37889c6bc95d23a05 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 28 Sep 2025 09:11:58 +0800 Subject: [PATCH 0753/1170] modify code --- src/class179/Code08_YnoiCornfield1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class179/Code08_YnoiCornfield1.java b/src/class179/Code08_YnoiCornfield1.java index 328cc80d2..fc0d7b3d2 100644 --- a/src/class179/Code08_YnoiCornfield1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -151,7 +151,7 @@ public static void del(int x) { } } - public static boolean getAns(int op, int x) { + public static boolean calc(int op, int x) { if (op == 1) { return bitSet1.andSelfMoveLeft(x); } else if (op == 2) { @@ -197,7 +197,7 @@ public static void compute() { while (winr > jobr) { del(arr[winr--]); } - ans[id] = getAns(op, jobx); + ans[id] = calc(op, jobx); } } From 38b512b04db2931c7b934a4ef492bdeee96eb0af Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 29 Sep 2025 15:18:50 +0800 Subject: [PATCH 0754/1170] modify code --- src/class179/Code01_MaximumMatch2.java | 155 +++++++++++++++++++++++++ src/class179/Code02_SimpleQuery2.java | 107 +++++++++++++++++ src/class179/Code05_Homework2.java | 142 ++++++++++++++++++++++ src/class179/Code06_LCP1.java | 12 +- src/class179/Code06_LCP2.java | 150 ++++++++++++++++++++++++ 5 files changed, 560 insertions(+), 6 deletions(-) create mode 100644 src/class179/Code01_MaximumMatch2.java create mode 100644 src/class179/Code02_SimpleQuery2.java create mode 100644 src/class179/Code05_Homework2.java create mode 100644 src/class179/Code06_LCP2.java diff --git a/src/class179/Code01_MaximumMatch2.java b/src/class179/Code01_MaximumMatch2.java new file mode 100644 index 000000000..8c0314e8b --- /dev/null +++ b/src/class179/Code01_MaximumMatch2.java @@ -0,0 +1,155 @@ +package class179; + +// 区间最大匹配,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4477 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 152502; +//const int MAXM = 52502; +//const int MAXQ = 52502; +//int n, m, z, q; +//int a[MAXN]; +//int b[MAXM]; +//Query querys[MAXQ]; +//int bi[MAXM]; +// +//int match[MAXN << 2]; +//int resta[MAXN << 2]; +//int overb[MAXN << 2]; +// +//int ans[MAXQ]; +// +//bool QueryCmp(Query &A, Query &B) { +// if (bi[A.l] != bi[B.l]) { +// return bi[A.l] < bi[B.l]; +// } +// if ((bi[A.l] & 1) == 1) { +// return A.r < B.r; +// } else { +// return A.r > B.r; +// } +//} +// +//void up(int i) { +// int l = i << 1; +// int r = i << 1 | 1; +// int newMatch = min(resta[l], overb[r]); +// resta[i] = resta[l] + resta[r] - newMatch; +// overb[i] = overb[l] + overb[r] - newMatch; +// match[i] = match[l] + match[r] + newMatch; +//} +// +//void build(int l, int r, int i) { +// if (l == r) { +// match[i] = 0; +// resta[i] = 1; +// overb[i] = 0; +// } else { +// int mid = (l + r) >> 1; +// build(l, mid, i << 1); +// build(mid + 1, r, i << 1 | 1); +// up(i); +// } +//} +// +//void add(int jobv, int l, int r, int i) { +// if (l == r) { +// if (resta[i] == 1) { +// match[i] = 1; +// resta[i] = 0; +// } else { +// overb[i]++; +// } +// } else { +// int mid = (l + r) >> 1; +// if (jobv + a[mid + 1] <= z) { +// add(jobv, mid + 1, r, i << 1 | 1); +// } else if (jobv + a[l] <= z) { +// add(jobv, l, mid, i << 1); +// } +// up(i); +// } +//} +// +//void del(int jobv, int l, int r, int i) { +// if (l == r) { +// if (overb[i] == 0) { +// match[i] = 0; +// resta[i] = 1; +// } else { +// overb[i]--; +// } +// } else { +// int mid = (l + r) >> 1; +// if (jobv + a[mid + 1] <= z) { +// del(jobv, mid + 1, r, i << 1 | 1); +// } else if (jobv + a[l] <= z) { +// del(jobv, l, mid, i << 1); +// } +// up(i); +// } +//} +// +//void prepare() { +// sort(a + 1, a + n + 1); +// int blen = (int)sqrt(n); +// for (int i = 1; i <= m; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(querys + 1, querys + q + 1, QueryCmp); +// build(1, n, 1); +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= q; i++) { +// int jobl = querys[i].l; +// int jobr = querys[i].r; +// int id = querys[i].id; +// while (winl > jobl) { +// add(b[--winl], 1, n, 1); +// } +// while (winr < jobr) { +// add(b[++winr], 1, n, 1); +// } +// while (winl < jobl) { +// del(b[winl++], 1, n, 1); +// } +// while (winr > jobr) { +// del(b[winr--], 1, n, 1); +// } +// ans[id] = match[1]; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> z; +// for (int i = 1; i <= n; i++) { +// cin >> a[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> b[i]; +// } +// cin >> q; +// for (int i = 1; i <= q; i++) { +// cin >> querys[i].l >> querys[i].r; +// querys[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= q; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class179/Code02_SimpleQuery2.java b/src/class179/Code02_SimpleQuery2.java new file mode 100644 index 000000000..ae8a3a31c --- /dev/null +++ b/src/class179/Code02_SimpleQuery2.java @@ -0,0 +1,107 @@ +package class179; + +// 简单的询问,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5268 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int siz1, siz2, op, id; +//}; +// +//const int MAXN = 50001; +//int n, m, cntq; +//int arr[MAXN]; +//Query query[MAXN << 2]; +// +//int bi[MAXN]; +//int cnt1[MAXN]; +//int cnt2[MAXN]; +// +//long long sumv = 0; +//long long ans[MAXN]; +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.siz1] != bi[b.siz1]) { +// return bi[a.siz1] < bi[b.siz1]; +// } +// if ((bi[a.siz1] & 1) == 1) { +// return a.siz2 < b.siz2; +// } else { +// return a.siz2 > b.siz2; +// } +//} +// +//void addQuery(int siz1, int siz2, int op, int id) { +// query[++cntq].siz1 = siz1; +// query[cntq].siz2 = siz2; +// query[cntq].op = op; +// query[cntq].id = id; +//} +// +//void compute() { +// int win1 = 0, win2 = 0; +// for (int i = 1; i <= cntq; i++) { +// int job1 = query[i].siz1; +// int job2 = query[i].siz2; +// int op = query[i].op; +// int id = query[i].id; +// while (win1 < job1) { +// ++cnt1[arr[++win1]]; +// sumv += cnt2[arr[win1]]; +// } +// while (win1 > job1) { +// --cnt1[arr[win1]]; +// sumv -= cnt2[arr[win1--]]; +// } +// while (win2 < job2) { +// ++cnt2[arr[++win2]]; +// sumv += cnt1[arr[win2]]; +// } +// while (win2 > job2) { +// --cnt2[arr[win2]]; +// sumv -= cnt1[arr[win2--]]; +// } +// ans[id] += sumv * op; +// } +//} +// +//void prepare() { +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= cntq; i++) { +// if (query[i].siz1 > query[i].siz2) { +// swap(query[i].siz1, query[i].siz2); +// } +// } +// sort(query + 1, query + cntq + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// cin >> m; +// for (int i = 1, l1, r1, l2, r2; i <= m; i++) { +// cin >> l1 >> r1 >> l2 >> r2; +// addQuery(r1, r2, 1, i); +// addQuery(r1, l2 - 1, -1, i); +// addQuery(l1 - 1, r2, -1, i); +// addQuery(l1 - 1, l2 - 1, 1, i); +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class179/Code05_Homework2.java b/src/class179/Code05_Homework2.java new file mode 100644 index 000000000..54a378763 --- /dev/null +++ b/src/class179/Code05_Homework2.java @@ -0,0 +1,142 @@ +package class179; + +// 作业,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4396 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, a, b, id; +//}; +// +//const int MAXN = 100001; +// +//int n, m; +//int arr[MAXN]; +//Query query[MAXN]; +//int bi[MAXN]; +//int bl[MAXN]; +//int br[MAXN]; +// +//int numCnt[MAXN]; +//int blockCnt[MAXN]; +//int blockKind[MAXN]; +// +//int ans1[MAXN]; +//int ans2[MAXN]; +// +//bool QueryCmp(Query &A, Query &B) { +// if (bi[A.l] != bi[B.l]) { +// return bi[A.l] < bi[B.l]; +// } +// if ((bi[A.l] & 1) == 1) { +// return A.r < B.r; +// } else { +// return A.r > B.r; +// } +//} +// +//void add(int x) { +// numCnt[x]++; +// blockCnt[bi[x]]++; +// if (numCnt[x] == 1) { +// blockKind[bi[x]]++; +// } +//} +// +//void del(int x) { +// numCnt[x]--; +// blockCnt[bi[x]]--; +// if (numCnt[x] == 0) { +// blockKind[bi[x]]--; +// } +//} +// +//void setAns(int a, int b, int id) { +// if (bi[a] == bi[b]) { +// for (int i = a; i <= b; i++) { +// if (numCnt[i] > 0) { +// ans1[id] += numCnt[i]; +// ans2[id]++; +// } +// } +// } else { +// for (int i = a; i <= br[bi[a]]; i++) { +// if (numCnt[i] > 0) { +// ans1[id] += numCnt[i]; +// ans2[id]++; +// } +// } +// for (int i = bl[bi[b]]; i <= b; i++) { +// if (numCnt[i] > 0) { +// ans1[id] += numCnt[i]; +// ans2[id]++; +// } +// } +// for (int i = bi[a] + 1; i <= bi[b] - 1; i++) { +// ans1[id] += blockCnt[i]; +// ans2[id] += blockKind[i]; +// } +// } +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= m; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int joba = query[i].a; +// int jobb = query[i].b; +// int id = query[i].id; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// while (winr < jobr) { +// add(arr[++winr]); +// } +// while (winl < jobl) { +// del(arr[winl++]); +// } +// while (winr > jobr) { +// del(arr[winr--]); +// } +// setAns(joba, jobb, id); +// } +//} +// +//void prepare() { +// int nv = MAXN - 1; +// int blen = (int)sqrt(nv); +// int bnum = (nv + blen - 1) / blen; +// for (int i = 1; i <= nv; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= bnum; i++) { +// bl[i] = (i - 1) * blen + 1; +// br[i] = min(i * blen, nv); +// } +// sort(query + 1, query + m + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i].l >> query[i].r >> query[i].a >> query[i].b; +// query[i].id = i; +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans1[i] << ' ' << ans2[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class179/Code06_LCP1.java b/src/class179/Code06_LCP1.java index 8ddda89a6..f77ceb91b 100644 --- a/src/class179/Code06_LCP1.java +++ b/src/class179/Code06_LCP1.java @@ -21,8 +21,8 @@ public class Code06_LCP1 { public static int[][] query = new int[MAXM][3]; public static int base = 499; - public static long[] pow = new long[MAXN]; - public static long[] hash = new long[MAXN]; + public static long[] basePower = new long[MAXN]; + public static long[] hashValue = new long[MAXN]; public static long[] val = new long[MAXN]; public static long[] sorted = new long[MAXN]; @@ -96,13 +96,13 @@ public static void compute() { } public static void prepare() { - pow[0] = 1; + basePower[0] = 1; for (int i = 1; i <= n; i++) { - pow[i] = pow[i - 1] * base; - hash[i] = hash[i - 1] * base + (str[i] - 'a' + 1); + basePower[i] = basePower[i - 1] * base; + hashValue[i] = hashValue[i - 1] * base + (str[i] - 'a' + 1); } for (int l = 1, r = k; r <= n; l++, r++) { - val[l] = hash[r] - hash[l - 1] * pow[r - l + 1]; + val[l] = hashValue[r] - hashValue[l - 1] * basePower[r - l + 1]; } for (int i = 1; i <= len; i++) { sorted[i] = val[i]; diff --git a/src/class179/Code06_LCP2.java b/src/class179/Code06_LCP2.java new file mode 100644 index 000000000..fa564f938 --- /dev/null +++ b/src/class179/Code06_LCP2.java @@ -0,0 +1,150 @@ +package class179; + +// 区间LCP达标对,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5112 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 3000001; +//const int MAXM = 100001; +//int n, m, k; +//int len, cntq, cntv; +//char str[MAXN]; +//Query query[MAXM]; +// +//int base = 499; +//long long basePower[MAXN]; +//long long hashValue[MAXN]; +// +//long long val[MAXN]; +//long long sorted[MAXN]; +//int arr[MAXN]; +//int bi[MAXN]; +// +//long long cnt[MAXN]; +//long long curAns; +//long long ans[MAXM]; +// +//int kth(long long num) { +// int left = 1, right = cntv, ret = 0; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if ((bi[a.l] & 1) == 1) { +// return a.r < b.r; +// } else { +// return a.r > b.r; +// } +//} +// +//void add(int x) { +// curAns -= cnt[x] * cnt[x]; +// cnt[x]++; +// curAns += cnt[x] * cnt[x]; +//} +// +//void del(int x) { +// curAns -= cnt[x] * cnt[x]; +// cnt[x]--; +// curAns += cnt[x] * cnt[x]; +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= cntq; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// while (winr < jobr) { +// add(arr[++winr]); +// } +// while (winl < jobl) { +// del(arr[winl++]); +// } +// while (winr > jobr) { +// del(arr[winr--]); +// } +// ans[id] = (curAns - (jobr - jobl + 1)) / 2; +// } +//} +// +//void prepare() { +// basePower[0] = 1; +// for (int i = 1; i <= n; i++) { +// basePower[i] = basePower[i - 1] * base; +// hashValue[i] = hashValue[i - 1] * base + (str[i] - 'a' + 1); +// } +// for (int l = 1, r = k; r <= n; l++, r++) { +// val[l] = hashValue[r] - hashValue[l - 1] * basePower[r - l + 1]; +// } +// for (int i = 1; i <= len; i++) { +// sorted[i] = val[i]; +// } +// sort(sorted + 1, sorted + len + 1); +// cntv = 1; +// for (int i = 2; i <= len; i++) { +// if (sorted[cntv] != sorted[i]) { +// sorted[++cntv] = sorted[i]; +// } +// } +// for (int i = 1; i <= len; i++) { +// arr[i] = kth(val[i]); +// } +// int blen = max(1, (int)((double)len / sqrt((double)cntq))); +// for (int i = 1; i <= len; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// sort(query + 1, query + cntq + 1, QueryCmp); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> k; +// string s; +// s.reserve(n); +// cin >> s; +// for (int i = 1; i <= n; i++) { +// str[i] = s[i - 1]; +// } +// len = n - k + 1; +// cntq = 0; +// for (int i = 1, l, r; i <= m; i++) { +// cin >> l >> r; +// if (l <= len) { +// query[++cntq].l = l; +// query[cntq].r = min(r, len); +// query[cntq].id = i; +// } +// } +// prepare(); +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From c1130cc477d33edb2f5de19f818e65b37425edc9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 29 Sep 2025 15:32:22 +0800 Subject: [PATCH 0755/1170] modify code --- src/class179/Code07_RabbitHole2.java | 140 +++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/class179/Code07_RabbitHole2.java diff --git a/src/class179/Code07_RabbitHole2.java b/src/class179/Code07_RabbitHole2.java new file mode 100644 index 000000000..30cc835f3 --- /dev/null +++ b/src/class179/Code07_RabbitHole2.java @@ -0,0 +1,140 @@ +package class179; + +// 掉进兔子洞,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4688 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//const int MAXN = 100001; +//const int MAXT = 30001; +//int n, m; +//int arr[MAXN]; +//int sorted[MAXN]; +//int bi[MAXN]; +// +//int cnt[MAXN]; +//bool hasSet[MAXT]; +//bitset bitSet[MAXT]; +//bitset curSet; +// +//Query query[MAXT * 3]; +// +//int ans[MAXT]; +// +//int kth(int num) { +// int left = 1, right = n, ret = -1; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sorted[mid] >= num) { +// ret = mid; +// right = mid - 1; +// } else { +// left = mid + 1; +// } +// } +// return ret; +//} +// +//bool QueryCmp(const Query& a, const Query& b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if ((bi[a.l] & 1) == 1) { +// return a.r < b.r; +// } else { +// return a.r > b.r; +// } +//} +// +//void add(int x) { +// cnt[x]++; +// curSet[x + cnt[x] - 1] = 1; +//} +// +//void del(int x) { +// cnt[x]--; +// curSet[x + cnt[x]] = 0; +//} +// +//void compute(int q) { +// int winl = 1, winr = 0; +// for (int i = 1; i <= q; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// while (winr < jobr) { +// add(arr[++winr]); +// } +// while (winl < jobl) { +// del(arr[winl++]); +// } +// while (winr > jobr) { +// del(arr[winr--]); +// } +// if (!hasSet[id]) { +// hasSet[id] = true; +// bitSet[id] = curSet; +// } else { +// bitSet[id] &= curSet; +// } +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = arr[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(arr[i]); +// } +// int blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// for (int t = MAXT - 1; m > 0; m -= t) { +// int k = min(m, t); +// memset(cnt, 0, sizeof(int) * (n + 2)); +// memset(hasSet, 0, sizeof(bool) * (k + 2)); +// memset(ans, 0, sizeof(int) * (k + 2)); +// curSet.reset(); +// int cntq = 0, l, r; +// for (int i = 1; i <= k; i++) { +// for (int j = 1; j <= 3; j++) { +// cin >> l >> r; +// query[++cntq] = { l, r, i }; +// ans[i] += r - l + 1; +// } +// } +// sort(query + 1, query + cntq + 1, QueryCmp); +// compute(cntq); +// for (int i = 1; i <= k; i++) { +// ans[i] -= bitSet[i].count() * 3; +// } +// for (int i = 1; i <= k; i++) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 957f55286897562c452b77aee9d5827843a105d4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 29 Sep 2025 15:47:17 +0800 Subject: [PATCH 0756/1170] modify code --- src/class179/Code08_YnoiCornfield2.java | 173 ++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 src/class179/Code08_YnoiCornfield2.java diff --git a/src/class179/Code08_YnoiCornfield2.java b/src/class179/Code08_YnoiCornfield2.java new file mode 100644 index 000000000..8096154d5 --- /dev/null +++ b/src/class179/Code08_YnoiCornfield2.java @@ -0,0 +1,173 @@ +package class179; + +// 由乃的玉米田,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5355 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, x, op, id; +//}; +// +//const int MAXN = 100001; +//const int MAXV = 100000; +//const int MAXB = 401; +//int n, m, blen; +//int arr[MAXN]; +//int bi[MAXN]; +// +//Query query[MAXN]; +//int cntq = 0; +// +//int headq[MAXB]; +//int nextq[MAXN]; +//int ql[MAXN]; +//int qr[MAXN]; +//int qid[MAXN]; +//int cnts = 0; +// +//bitset bitSet1; +//bitset bitSet2; +// +//int cnt[MAXN]; +//int lastPos[MAXN]; +//int maxLeft[MAXN]; +// +//bool ans[MAXN]; +// +//void addSpecial(int x, int l, int r, int id) { +// nextq[++cnts] = headq[x]; +// headq[x] = cnts; +// ql[cnts] = l; +// qr[cnts] = r; +// qid[cnts] = id; +//} +// +//bool QueryCmp(const Query &a, const Query &b) { +// if (bi[a.l] != bi[b.l]) return bi[a.l] < bi[b.l]; +// if ((bi[a.l] & 1) == 1) return a.r < b.r; +// return a.r > b.r; +//} +// +//void add(int x) { +// cnt[x]++; +// if (cnt[x] == 1) { +// bitSet1[x] = 1; +// bitSet2[MAXV - x] = 1; +// } +//} +// +//void del(int x) { +// cnt[x]--; +// if (cnt[x] == 0) { +// bitSet1[x] = 0; +// bitSet2[MAXV - x] = 0; +// } +//} +// +//bool calc(int op, int x) { +// if (op == 1) { +// return (bitSet1 & (bitSet1 << x)).any(); +// } else if (op == 2) { +// return (bitSet1 & (bitSet2 >> (MAXV - x))).any(); +// } else if (op == 3) { +// for (int d = 1; d * d <= x; d++) { +// if (x % d == 0) { +// if (bitSet1[d] && bitSet1[x / d]) { +// return true; +// } +// } +// } +// return false; +// } else { +// for (int i = 1; i * x <= MAXV; i++) { +// if (bitSet1[i] && bitSet1[i * x]) { +// return true; +// } +// } +// return false; +// } +//} +// +//void compute() { +// int winl = 1, winr = 0; +// for (int i = 1; i <= cntq; i++) { +// int jobl = query[i].l; +// int jobr = query[i].r; +// int jobx = query[i].x; +// int op = query[i].op; +// int id = query[i].id; +// while (winl > jobl) { +// add(arr[--winl]); +// } +// while (winr < jobr) { +// add(arr[++winr]); +// } +// while (winl < jobl) { +// del(arr[winl++]); +// } +// while (winr > jobr) { +// del(arr[winr--]); +// } +// ans[id] = calc(op, jobx); +// } +//} +// +//void special() { +// for (int x = 1; x < blen; x++) { +// if (headq[x] != 0) { +// memset(lastPos, 0, sizeof(int) * (MAXV + 1)); +// memset(maxLeft, 0, sizeof(int) * (n + 1)); +// int last = 0; +// for (int i = 1; i <= n; i++) { +// int val = arr[i]; +// lastPos[val] = i; +// if (1LL * val * x <= MAXV) { +// last = max(last, lastPos[val * x]); +// } +// if (val % x == 0) { +// last = max(last, lastPos[val / x]); +// } +// maxLeft[i] = last; +// } +// for (int q = headq[x]; q > 0; q = nextq[q]) { +// int l = ql[q]; +// int r = qr[q]; +// int id = qid[q]; +// ans[id] = (l <= maxLeft[r]); +// } +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// blen = (int)sqrt(n); +// for (int i = 1; i <= n; i++) { +// bi[i] = (i - 1) / blen + 1; +// } +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1, op, l, r, x; i <= m; i++) { +// cin >> op >> l >> r >> x; +// if (op == 4 && x < blen) { +// addSpecial(x, l, r, i); +// } else { +// query[++cntq] = {l, r, x, op, i}; +// } +// } +// sort(query + 1, query + cntq + 1, QueryCmp); +// compute(); +// special(); +// for (int i = 1; i <= m; i++) { +// cout << (ans[i] ? "yuno" : "yumi") << '\n'; +// } +// return 0; +//} \ No newline at end of file From fb30e8ad0b02a478b8b43ef7518c96b42911148f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 10:11:18 +0800 Subject: [PATCH 0757/1170] modify code --- src/class179/Code01_MaximumMatch1.java | 7 +++++++ src/class179/Code01_MaximumMatch2.java | 19 +++++++++++++------ src/class179/Code02_SimpleQuery1.java | 18 +++++++++++------- src/class179/Code02_SimpleQuery2.java | 19 ++++++++++++------- src/class179/Code03_NiceDay1.java | 6 ++++-- src/class179/Code03_NiceDay2.java | 6 ++++-- src/class179/Code04_NotForget2.java | 2 +- src/class179/Code05_Homework2.java | 12 ++++++------ src/class179/Code06_LCP2.java | 2 +- src/class179/Code07_RabbitHole2.java | 6 +++--- src/class179/Code08_YnoiCornfield2.java | 11 ++++++++--- 11 files changed, 70 insertions(+), 38 deletions(-) diff --git a/src/class179/Code01_MaximumMatch1.java b/src/class179/Code01_MaximumMatch1.java index 42c7a47fa..58ccb10a6 100644 --- a/src/class179/Code01_MaximumMatch1.java +++ b/src/class179/Code01_MaximumMatch1.java @@ -1,6 +1,13 @@ package class179; // 区间最大匹配,java版 +// 给定长度为n的数组a、长度为m的数组b、一个正数z +// 数组a中数字x、数组b中数字y,如果x + y <= z,那么构成一个匹配 +// 已经匹配的数字,不可以重复使用,一共有q条查询,格式如下 +// 查询 l r : 数组b[l..r]范围上的数字,随意选择数组a中的数字,打印最多匹配数 +// 1 <= n <= 152501 +// 1 <= m、q <= 52501 +// 1 <= a[i]、b[i]、z <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4477 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class179/Code01_MaximumMatch2.java b/src/class179/Code01_MaximumMatch2.java index 8c0314e8b..6fe2f30cf 100644 --- a/src/class179/Code01_MaximumMatch2.java +++ b/src/class179/Code01_MaximumMatch2.java @@ -1,6 +1,13 @@ package class179; // 区间最大匹配,C++版 +// 给定长度为n的数组a、长度为m的数组b、一个正数z +// 数组a中数字x、数组b中数字y,如果x + y <= z,那么构成一个匹配 +// 已经匹配的数字,不可以重复使用,一共有q条查询,格式如下 +// 查询 l r : 数组b[l..r]范围上的数字,随意选择数组a中的数字,打印最多匹配数 +// 1 <= n <= 152501 +// 1 <= m、q <= 52501 +// 1 <= a[i]、b[i]、z <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4477 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -28,14 +35,14 @@ // //int ans[MAXQ]; // -//bool QueryCmp(Query &A, Query &B) { -// if (bi[A.l] != bi[B.l]) { -// return bi[A.l] < bi[B.l]; +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; // } -// if ((bi[A.l] & 1) == 1) { -// return A.r < B.r; +// if (bi[a.l] & 1) { +// return a.r < b.r; // } else { -// return A.r > B.r; +// return a.r > b.r; // } //} // diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java index 74af8eeb1..5bfab3c42 100644 --- a/src/class179/Code02_SimpleQuery1.java +++ b/src/class179/Code02_SimpleQuery1.java @@ -1,6 +1,12 @@ package class179; // 简单的询问,java版 +// 给定一个长度为n的数组arr,下标从1到n +// 函数get(l, r, x) = arr[l..r]范围上,数组x出现的次数 +// 接下来有q条查询,格式如下 +// 查询 l1 r1 l2 r2 : 每种x都算,打印 get(l1, r1, x) * get(l2, r2, x) 的累加和 +// 1 <= n、q <= 5 * 10^4 +// 1 <= arr[i] <= n // 测试链接 : https://www.luogu.com.cn/problem/P5268 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,16 +20,14 @@ public class Code02_SimpleQuery1 { public static int MAXN = 50001; - public static int n, m, cntq; + public static int n, q, cntq; public static int[] arr = new int[MAXN]; - // siz1、siz2、op、id public static int[][] query = new int[MAXN << 2][4]; - public static int[] bi = new int[MAXN]; + public static int[] cnt1 = new int[MAXN]; public static int[] cnt2 = new int[MAXN]; - public static long sum = 0; public static long[] ans = new long[MAXN]; @@ -100,8 +104,8 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } - m = in.nextInt(); - for (int i = 1, l1, r1, l2, r2; i <= m; i++) { + q = in.nextInt(); + for (int i = 1, l1, r1, l2, r2; i <= q; i++) { l1 = in.nextInt(); r1 = in.nextInt(); l2 = in.nextInt(); @@ -113,7 +117,7 @@ public static void main(String[] args) throws Exception { } prepare(); compute(); - for (int i = 1; i <= m; i++) { + for (int i = 1; i <= q; i++) { out.println(ans[i]); } out.flush(); diff --git a/src/class179/Code02_SimpleQuery2.java b/src/class179/Code02_SimpleQuery2.java index ae8a3a31c..a11f5337b 100644 --- a/src/class179/Code02_SimpleQuery2.java +++ b/src/class179/Code02_SimpleQuery2.java @@ -1,6 +1,12 @@ package class179; // 简单的询问,C++版 +// 给定一个长度为n的数组arr,下标从1到n +// 函数get(l, r, x) = arr[l..r]范围上,数组x出现的次数 +// 接下来有q条查询,格式如下 +// 查询 l1 r1 l2 r2 : 每种x都算,打印 get(l1, r1, x) * get(l2, r2, x) 的累加和 +// 1 <= n、q <= 5 * 10^4 +// 1 <= arr[i] <= n // 测试链接 : https://www.luogu.com.cn/problem/P5268 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -14,14 +20,13 @@ //}; // //const int MAXN = 50001; -//int n, m, cntq; +//int n, q, cntq; //int arr[MAXN]; //Query query[MAXN << 2]; -// //int bi[MAXN]; +// //int cnt1[MAXN]; //int cnt2[MAXN]; -// //long long sumv = 0; //long long ans[MAXN]; // @@ -29,7 +34,7 @@ // if (bi[a.siz1] != bi[b.siz1]) { // return bi[a.siz1] < bi[b.siz1]; // } -// if ((bi[a.siz1] & 1) == 1) { +// if (bi[a.siz1] & 1) { // return a.siz2 < b.siz2; // } else { // return a.siz2 > b.siz2; @@ -90,8 +95,8 @@ // for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } -// cin >> m; -// for (int i = 1, l1, r1, l2, r2; i <= m; i++) { +// cin >> q; +// for (int i = 1, l1, r1, l2, r2; i <= q; i++) { // cin >> l1 >> r1 >> l2 >> r2; // addQuery(r1, r2, 1, i); // addQuery(r1, l2 - 1, -1, i); @@ -100,7 +105,7 @@ // } // prepare(); // compute(); -// for (int i = 1; i <= m; i++) { +// for (int i = 1; i <= q; i++) { // cout << ans[i] << '\n'; // } // return 0; diff --git a/src/class179/Code03_NiceDay1.java b/src/class179/Code03_NiceDay1.java index 216550a2a..9e26b64b5 100644 --- a/src/class179/Code03_NiceDay1.java +++ b/src/class179/Code03_NiceDay1.java @@ -42,14 +42,16 @@ public int compare(int[] a, int[] b) { } public static void add(int s) { - num += cnt[s]++; + num += cnt[s]; + cnt[s]++; for (int i = 0; i < 26; i++) { num += cnt[s ^ (1 << i)]; } } public static void del(int s) { - num -= --cnt[s]; + cnt[s]--; + num -= cnt[s]; for (int i = 0; i < 26; i++) { num -= cnt[s ^ (1 << i)]; } diff --git a/src/class179/Code03_NiceDay2.java b/src/class179/Code03_NiceDay2.java index 8d3d36615..507fb8527 100644 --- a/src/class179/Code03_NiceDay2.java +++ b/src/class179/Code03_NiceDay2.java @@ -36,14 +36,16 @@ //} // //void add(int s) { -// num += cnt[s]++; +// num += cnt[s]; +// cnt[s]++; // for (int i = 0; i < 26; i++) { // num += cnt[s ^ (1 << i)]; // } //} // //void del(int s) { -// num -= --cnt[s]; +// cnt[s]--; +// num -= cnt[s]; // for (int i = 0; i < 26; i++) { // num -= cnt[s ^ (1 << i)]; // } diff --git a/src/class179/Code04_NotForget2.java b/src/class179/Code04_NotForget2.java index e56e4220c..1618f1eec 100644 --- a/src/class179/Code04_NotForget2.java +++ b/src/class179/Code04_NotForget2.java @@ -36,7 +36,7 @@ // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } -// if ((bi[a.l] & 1) == 1) { +// if (bi[a.l] & 1) { // return a.r < b.r; // } else { // return a.r > b.r; diff --git a/src/class179/Code05_Homework2.java b/src/class179/Code05_Homework2.java index 54a378763..6a313d1f5 100644 --- a/src/class179/Code05_Homework2.java +++ b/src/class179/Code05_Homework2.java @@ -29,14 +29,14 @@ //int ans1[MAXN]; //int ans2[MAXN]; // -//bool QueryCmp(Query &A, Query &B) { -// if (bi[A.l] != bi[B.l]) { -// return bi[A.l] < bi[B.l]; +//bool QueryCmp(Query &a, Query &b) { +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; // } -// if ((bi[A.l] & 1) == 1) { -// return A.r < B.r; +// if (bi[a.l] & 1) { +// return a.r < b.r; // } else { -// return A.r > B.r; +// return a.r > b.r; // } //} // diff --git a/src/class179/Code06_LCP2.java b/src/class179/Code06_LCP2.java index fa564f938..e00f17a38 100644 --- a/src/class179/Code06_LCP2.java +++ b/src/class179/Code06_LCP2.java @@ -51,7 +51,7 @@ // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } -// if ((bi[a.l] & 1) == 1) { +// if (bi[a.l] & 1) { // return a.r < b.r; // } else { // return a.r > b.r; diff --git a/src/class179/Code07_RabbitHole2.java b/src/class179/Code07_RabbitHole2.java index 30cc835f3..4743b38fb 100644 --- a/src/class179/Code07_RabbitHole2.java +++ b/src/class179/Code07_RabbitHole2.java @@ -43,14 +43,14 @@ // return ret; //} // -//bool QueryCmp(const Query& a, const Query& b) { +//bool QueryCmp(const Query &a, const Query &b) { // if (bi[a.l] != bi[b.l]) { // return bi[a.l] < bi[b.l]; // } -// if ((bi[a.l] & 1) == 1) { +// if (bi[a.l] & 1) { // return a.r < b.r; // } else { -// return a.r > b.r; +// return a.r > b.r; // } //} // diff --git a/src/class179/Code08_YnoiCornfield2.java b/src/class179/Code08_YnoiCornfield2.java index 8096154d5..f68d9206d 100644 --- a/src/class179/Code08_YnoiCornfield2.java +++ b/src/class179/Code08_YnoiCornfield2.java @@ -48,9 +48,14 @@ //} // //bool QueryCmp(const Query &a, const Query &b) { -// if (bi[a.l] != bi[b.l]) return bi[a.l] < bi[b.l]; -// if ((bi[a.l] & 1) == 1) return a.r < b.r; -// return a.r > b.r; +// if (bi[a.l] != bi[b.l]) { +// return bi[a.l] < bi[b.l]; +// } +// if (bi[a.l] & 1) { +// return a.r < b.r; +// } else { +// return a.r > b.r; +// } //} // //void add(int x) { From 5587e20f6e06997b0c458936fb8987af1d189b69 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 10:35:19 +0800 Subject: [PATCH 0758/1170] modify code --- src/class179/Code03_NiceDay1.java | 4 ++++ src/class179/Code03_NiceDay2.java | 4 ++++ src/class179/{Code06_LCP1.java => Code04_LCP1.java} | 2 +- src/class179/{Code06_LCP2.java => Code04_LCP2.java} | 0 .../{Code04_NotForget1.java => Code06_NotForget1.java} | 4 ++-- .../{Code04_NotForget2.java => Code06_NotForget2.java} | 0 6 files changed, 11 insertions(+), 3 deletions(-) rename src/class179/{Code06_LCP1.java => Code04_LCP1.java} (99%) rename src/class179/{Code06_LCP2.java => Code04_LCP2.java} (100%) rename src/class179/{Code04_NotForget1.java => Code06_NotForget1.java} (98%) rename src/class179/{Code04_NotForget2.java => Code06_NotForget2.java} (100%) diff --git a/src/class179/Code03_NiceDay1.java b/src/class179/Code03_NiceDay1.java index 9e26b64b5..979d812ef 100644 --- a/src/class179/Code03_NiceDay1.java +++ b/src/class179/Code03_NiceDay1.java @@ -1,6 +1,10 @@ package class179; // 美好的每一天,java版 +// 给定一个长度为n的字符串str,其中都是小写字母 +// 如果一个子串重新排列字符之后能成为回文串,那么该子串叫做达标子串 +// 接下来有m条操作,格式为 l r : 打印str[l..r]范围上有多少达标子串 +// 1 <= n、m <= 6 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P3604 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class179/Code03_NiceDay2.java b/src/class179/Code03_NiceDay2.java index 507fb8527..228ed0d26 100644 --- a/src/class179/Code03_NiceDay2.java +++ b/src/class179/Code03_NiceDay2.java @@ -1,6 +1,10 @@ package class179; // 美好的每一天,C++版 +// 给定一个长度为n的字符串str,其中都是小写字母 +// 如果一个子串重新排列字符之后能成为回文串,那么该子串叫做达标子串 +// 接下来有m条操作,格式为 l r : 打印str[l..r]范围上有多少达标子串 +// 1 <= n、m <= 6 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P3604 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class179/Code06_LCP1.java b/src/class179/Code04_LCP1.java similarity index 99% rename from src/class179/Code06_LCP1.java rename to src/class179/Code04_LCP1.java index f77ceb91b..1c3c07d98 100644 --- a/src/class179/Code06_LCP1.java +++ b/src/class179/Code04_LCP1.java @@ -11,7 +11,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code06_LCP1 { +public class Code04_LCP1 { public static int MAXN = 3000001; public static int MAXM = 100001; diff --git a/src/class179/Code06_LCP2.java b/src/class179/Code04_LCP2.java similarity index 100% rename from src/class179/Code06_LCP2.java rename to src/class179/Code04_LCP2.java diff --git a/src/class179/Code04_NotForget1.java b/src/class179/Code06_NotForget1.java similarity index 98% rename from src/class179/Code04_NotForget1.java rename to src/class179/Code06_NotForget1.java index fdcaa0032..faa86cce1 100644 --- a/src/class179/Code04_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P5072 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code04_NotForget2文件就是C++的实现 +// 想通过用C++实现,本节课Code06_NotForget2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -14,7 +14,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code04_NotForget1 { +public class Code06_NotForget1 { public static int MAXN = 100001; public static int MAXB = 401; diff --git a/src/class179/Code04_NotForget2.java b/src/class179/Code06_NotForget2.java similarity index 100% rename from src/class179/Code04_NotForget2.java rename to src/class179/Code06_NotForget2.java From 74055ba7bd4dc12332a1faf5c8dbad40c8319988 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 10:56:56 +0800 Subject: [PATCH 0759/1170] modify code --- src/class179/Code03_NiceDay1.java | 2 +- src/class179/Code03_NiceDay2.java | 2 +- src/class179/Code04_LCP1.java | 8 +++++++- src/class179/Code04_LCP2.java | 8 +++++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/class179/Code03_NiceDay1.java b/src/class179/Code03_NiceDay1.java index 979d812ef..ee5759480 100644 --- a/src/class179/Code03_NiceDay1.java +++ b/src/class179/Code03_NiceDay1.java @@ -3,7 +3,7 @@ // 美好的每一天,java版 // 给定一个长度为n的字符串str,其中都是小写字母 // 如果一个子串重新排列字符之后能成为回文串,那么该子串叫做达标子串 -// 接下来有m条操作,格式为 l r : 打印str[l..r]范围上有多少达标子串 +// 接下来有m条查询,格式为 l r : 打印str[l..r]范围上有多少达标子串 // 1 <= n、m <= 6 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P3604 // 提交以下的code,提交时请把类名改成"Main" diff --git a/src/class179/Code03_NiceDay2.java b/src/class179/Code03_NiceDay2.java index 228ed0d26..c95f62221 100644 --- a/src/class179/Code03_NiceDay2.java +++ b/src/class179/Code03_NiceDay2.java @@ -3,7 +3,7 @@ // 美好的每一天,C++版 // 给定一个长度为n的字符串str,其中都是小写字母 // 如果一个子串重新排列字符之后能成为回文串,那么该子串叫做达标子串 -// 接下来有m条操作,格式为 l r : 打印str[l..r]范围上有多少达标子串 +// 接下来有m条查询,格式为 l r : 打印str[l..r]范围上有多少达标子串 // 1 <= n、m <= 6 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P3604 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class179/Code04_LCP1.java b/src/class179/Code04_LCP1.java index 1c3c07d98..ab5d63290 100644 --- a/src/class179/Code04_LCP1.java +++ b/src/class179/Code04_LCP1.java @@ -1,6 +1,12 @@ package class179; -// 区间LCP达标对,java版 +// 区间lcp达标对,java版 +// 给定一个长度为n的字符串str,还有一个参数k +// 位置a开头的字符串 和 位置b开头的字符串,如果最长公共前缀 >= k,则(a, b)构成达标对 +// 构成达标对的必须是不同的两个位置,并且(a, b)和(b, a)只算一个达标对,不要重复统计 +// 接下来有m条查询,格式为 l r : str[l..r]范围上,可以任选开头位置,打印达标对的数量 +// 1 <= n、k <= 3 * 10^6 1 <= m <= 10^5 +// 1 <= n * n * m <= 10^15 字符集为 f z o u t s y // 测试链接 : https://www.luogu.com.cn/problem/P5112 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class179/Code04_LCP2.java b/src/class179/Code04_LCP2.java index e00f17a38..79c2cb351 100644 --- a/src/class179/Code04_LCP2.java +++ b/src/class179/Code04_LCP2.java @@ -1,6 +1,12 @@ package class179; -// 区间LCP达标对,C++版 +// 区间lcp达标对,C++版 +// 给定一个长度为n的字符串str,还有一个参数k +// 位置a开头的字符串 和 位置b开头的字符串,如果最长公共前缀 >= k,则(a, b)构成达标对 +// 构成达标对的必须是不同的两个位置,并且(a, b)和(b, a)只算一个达标对,不要重复统计 +// 接下来有m条查询,格式为 l r : str[l..r]范围上,可以任选开头位置,打印达标对的数量 +// 1 <= n、k <= 3 * 10^6 1 <= m <= 10^5 +// 1 <= n * n * m <= 10^15 字符集为 f z o u t s y // 测试链接 : https://www.luogu.com.cn/problem/P5112 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 383ee5bb53b78cc03be5a4a285ebfcc981ac14a0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 11:05:45 +0800 Subject: [PATCH 0760/1170] modify code --- src/class179/Code05_Homework1.java | 5 +++++ src/class179/Code05_Homework2.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/class179/Code05_Homework1.java b/src/class179/Code05_Homework1.java index b43a2b38c..7cba8f9c2 100644 --- a/src/class179/Code05_Homework1.java +++ b/src/class179/Code05_Homework1.java @@ -1,6 +1,11 @@ package class179; // 作业,java版 +// 给定一个长度为n的数组arr,接下来有m条查询,格式如下 +// 查询 l r a b : 打印arr[l..r]范围上的两个答案 +// 答案1,数值范围在[a, b]的数字个数 +// 答案2,数值范围在[a, b]的数字种数 +// 1 <= n、m、arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4396 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class179/Code05_Homework2.java b/src/class179/Code05_Homework2.java index 6a313d1f5..e88e3efe6 100644 --- a/src/class179/Code05_Homework2.java +++ b/src/class179/Code05_Homework2.java @@ -1,6 +1,11 @@ package class179; // 作业,C++版 +// 给定一个长度为n的数组arr,接下来有m条查询,格式如下 +// 查询 l r a b : 打印arr[l..r]范围上的两个答案 +// 答案1,数值范围在[a, b]的数字个数 +// 答案2,数值范围在[a, b]的数字种数 +// 1 <= n、m、arr[i] <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4396 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From ee466b4862afe205b408c046c1ac32c3b30db4e2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 11:27:29 +0800 Subject: [PATCH 0761/1170] modify code --- src/class179/Code06_NotForget1.java | 21 +++++++++++++-------- src/class179/Code06_NotForget2.java | 21 +++++++++++++-------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/class179/Code06_NotForget1.java b/src/class179/Code06_NotForget1.java index faa86cce1..461545d4e 100644 --- a/src/class179/Code06_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -1,6 +1,11 @@ package class179; // 盼君勿忘,java版 +// 一个序列中每种数字只保留一个,得到的累加和,叫做去重累加和 +// 给定一个长度为n的数组arr,接下来是m条查询,查询格式如下 +// 查询 l r p : arr[l..r]范围上,累加每个子序列的去重累加和 % p 的结果打印 +// 1 <= n、m、arr[i] <= 10^5 +// 1 <= p <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5072 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 @@ -31,8 +36,8 @@ public class Code06_NotForget1 { public static int[] cnt = new int[MAXN]; public static long[] sum = new long[MAXN]; - public static long[] smlPow = new long[MAXB]; - public static long[] bigPow = new long[MAXB]; + public static long[] smlPower = new long[MAXB]; + public static long[] bigPower = new long[MAXB]; public static long[] ans = new long[MAXN]; @@ -102,18 +107,18 @@ public static void del(int num) { public static void setAns(int len, int mod, int id) { int blen = (int) Math.sqrt(len); int bnum = (len + blen - 1) / blen; - smlPow[0] = 1; + smlPower[0] = 1; for (int i = 1; i <= blen; i++) { - smlPow[i] = (smlPow[i - 1] << 1) % mod; + smlPower[i] = (smlPower[i - 1] << 1) % mod; } - bigPow[0] = 1; + bigPower[0] = 1; for (int i = 1; i <= bnum; i++) { - bigPow[i] = (bigPow[i - 1] * smlPow[blen]) % mod; + bigPower[i] = (bigPower[i - 1] * smlPower[blen]) % mod; } long res = 0, tmp; for (int p = head; p > 0; p = next[p]) { - tmp = bigPow[len / blen] * smlPow[len % blen] % mod; - tmp -= bigPow[(len - p) / blen] * smlPow[(len - p) % blen] % mod; + tmp = bigPower[len / blen] * smlPower[len % blen] % mod; + tmp -= bigPower[(len - p) / blen] * smlPower[(len - p) % blen] % mod; tmp = (tmp * sum[p]) % mod; res = ((res + tmp) % mod + mod) % mod; } diff --git a/src/class179/Code06_NotForget2.java b/src/class179/Code06_NotForget2.java index 1618f1eec..cd851a8ad 100644 --- a/src/class179/Code06_NotForget2.java +++ b/src/class179/Code06_NotForget2.java @@ -1,6 +1,11 @@ package class179; // 盼君勿忘,C++版 +// 一个序列中每种数字只保留一个,得到的累加和,叫做去重累加和 +// 给定一个长度为n的数组arr,接下来是m条查询,查询格式如下 +// 查询 l r p : arr[l..r]范围上,累加每个子序列的去重累加和 % p 的结果打印 +// 1 <= n、m、arr[i] <= 10^5 +// 1 <= p <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5072 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -27,8 +32,8 @@ //int cnt[MAXN]; //long long sum[MAXN]; // -//long long smlPow[MAXB]; -//long long bigPow[MAXB]; +//long long smlPower[MAXB]; +//long long bigPower[MAXB]; // //long long ans[MAXN]; // @@ -97,18 +102,18 @@ //void setAns(int len, int mod, int id) { // int blen = (int)sqrt(len); // int bnum = (len + blen - 1) / blen; -// smlPow[0] = 1; +// smlPower[0] = 1; // for (int i = 1; i <= blen; i++) { -// smlPow[i] = (smlPow[i - 1] << 1) % mod; +// smlPower[i] = (smlPower[i - 1] << 1) % mod; // } -// bigPow[0] = 1; +// bigPower[0] = 1; // for (int i = 1; i <= bnum; i++) { -// bigPow[i] = (bigPow[i - 1] * smlPow[blen]) % mod; +// bigPower[i] = (bigPower[i - 1] * smlPower[blen]) % mod; // } // long long res = 0, tmp; // for (int p = head; p > 0; p = nxt[p]) { -// tmp = bigPow[len / blen] * smlPow[len % blen] % mod; -// tmp -= bigPow[(len - p) / blen] * smlPow[(len - p) % blen] % mod; +// tmp = bigPower[len / blen] * smlPower[len % blen] % mod; +// tmp -= bigPower[(len - p) / blen] * smlPower[(len - p) % blen] % mod; // tmp = (tmp * sum[p]) % mod; // res = ((res + tmp) % mod + mod) % mod; // } From c4a36c12557465b840ea94cfa1fd12745ecf0380 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 11:41:10 +0800 Subject: [PATCH 0762/1170] modify code --- src/class179/Code07_RabbitHole1.java | 8 ++++++++ src/class179/Code07_RabbitHole2.java | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/class179/Code07_RabbitHole1.java b/src/class179/Code07_RabbitHole1.java index 03a2115a2..9815ae5a5 100644 --- a/src/class179/Code07_RabbitHole1.java +++ b/src/class179/Code07_RabbitHole1.java @@ -1,6 +1,14 @@ package class179; // 掉进兔子洞,java版 +// 三个区间同时出现的数,一个一个删掉,直到无法再删,剩下数字的个数叫做 剩余个数 +// A = [1 2 2 3 3 3] B = [1 2 2 3 3 3] C = [1 1 2 3 3] +// 删除的过程为,一起删掉一个1、一起删掉一个2、一起删掉2个3,然后状况为 +// A = [2 3] B = [2 3] C = [1],剩余个数为5 +// 给定一个长度为n的数组arr,下来有m条查询,格式如下 +// 查询 l1 r1 l2 r2 l3 r3 : 给定了三个区间,打印剩余个数 +// 1 <= n、m <= 10^5 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4688 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class179/Code07_RabbitHole2.java b/src/class179/Code07_RabbitHole2.java index 4743b38fb..83e249411 100644 --- a/src/class179/Code07_RabbitHole2.java +++ b/src/class179/Code07_RabbitHole2.java @@ -1,6 +1,14 @@ package class179; // 掉进兔子洞,C++版 +// 三个区间同时出现的数,一个一个删掉,直到无法再删,剩下数字的个数叫做 剩余个数 +// A = [1 2 2 3 3 3] B = [1 2 2 3 3 3] C = [1 1 2 3 3] +// 删除的过程为,一起删掉一个1、一起删掉一个2、一起删掉2个3,然后状况为 +// A = [2 3] B = [2 3] C = [1],剩余个数为5 +// 给定一个长度为n的数组arr,下来有m条查询,格式如下 +// 查询 l1 r1 l2 r2 l3 r3 : 给定了三个区间,打印剩余个数 +// 1 <= n、m <= 10^5 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4688 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 92184d0d5f25e86d947a0dcec5e2585b5cc9d6f7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 11:50:43 +0800 Subject: [PATCH 0763/1170] modify code --- src/class179/Code08_YnoiCornfield1.java | 7 +++++++ src/class179/Code08_YnoiCornfield2.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/class179/Code08_YnoiCornfield1.java b/src/class179/Code08_YnoiCornfield1.java index fc0d7b3d2..336f5079a 100644 --- a/src/class179/Code08_YnoiCornfield1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -1,6 +1,13 @@ package class179; // 由乃的玉米田,java版 +// 给定一个长度为n的数组arr,接下来有m条查询,查询格式如下 +// 查询 1 l r x : 打印arr[l..r]范围上能否选出两个数,减的结果为x +// 查询 2 l r x : 打印arr[l..r]范围上能否选出两个数,加的结果为x +// 查询 3 l r x : 打印arr[l..r]范围上能否选出两个数,乘的结果为x +// 查询 4 l r x : 打印arr[l..r]范围上能否选出两个数,除的结果为x,并且没有余数 +// 选出的这两个数可以是同一个位置的数,答案如果为是,打印 "yuno",否则打印 "yumi" +// 1 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5355 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class179/Code08_YnoiCornfield2.java b/src/class179/Code08_YnoiCornfield2.java index f68d9206d..bedc3de69 100644 --- a/src/class179/Code08_YnoiCornfield2.java +++ b/src/class179/Code08_YnoiCornfield2.java @@ -1,6 +1,13 @@ package class179; // 由乃的玉米田,C++版 +// 给定一个长度为n的数组arr,接下来有m条查询,查询格式如下 +// 查询 1 l r x : 打印arr[l..r]范围上能否选出两个数,减的结果为x +// 查询 2 l r x : 打印arr[l..r]范围上能否选出两个数,加的结果为x +// 查询 3 l r x : 打印arr[l..r]范围上能否选出两个数,乘的结果为x +// 查询 4 l r x : 打印arr[l..r]范围上能否选出两个数,除的结果为x,并且没有余数 +// 选出的这两个数可以是同一个位置的数,答案如果为是,打印 "yuno",否则打印 "yumi" +// 1 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5355 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From f15a3f9df1864edda8fc9b4580b2f6080f681b20 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 12:32:40 +0800 Subject: [PATCH 0764/1170] modify code --- src/class179/Code07_RabbitHole1.java | 4 ++-- src/class179/Code07_RabbitHole2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class179/Code07_RabbitHole1.java b/src/class179/Code07_RabbitHole1.java index 9815ae5a5..b1ac8f65b 100644 --- a/src/class179/Code07_RabbitHole1.java +++ b/src/class179/Code07_RabbitHole1.java @@ -2,9 +2,9 @@ // 掉进兔子洞,java版 // 三个区间同时出现的数,一个一个删掉,直到无法再删,剩下数字的个数叫做 剩余个数 -// A = [1 2 2 3 3 3] B = [1 2 2 3 3 3] C = [1 1 2 3 3] +// A = [1 2 2 3 3 3] B = [1 2 2 3 3 3] C = [1 1 2 3 3] // 删除的过程为,一起删掉一个1、一起删掉一个2、一起删掉2个3,然后状况为 -// A = [2 3] B = [2 3] C = [1],剩余个数为5 +// A = [2 3] B = [2 3] C = [1] 剩余个数为5 // 给定一个长度为n的数组arr,下来有m条查询,格式如下 // 查询 l1 r1 l2 r2 l3 r3 : 给定了三个区间,打印剩余个数 // 1 <= n、m <= 10^5 diff --git a/src/class179/Code07_RabbitHole2.java b/src/class179/Code07_RabbitHole2.java index 83e249411..703130278 100644 --- a/src/class179/Code07_RabbitHole2.java +++ b/src/class179/Code07_RabbitHole2.java @@ -2,9 +2,9 @@ // 掉进兔子洞,C++版 // 三个区间同时出现的数,一个一个删掉,直到无法再删,剩下数字的个数叫做 剩余个数 -// A = [1 2 2 3 3 3] B = [1 2 2 3 3 3] C = [1 1 2 3 3] +// A = [1 2 2 3 3 3] B = [1 2 2 3 3 3] C = [1 1 2 3 3] // 删除的过程为,一起删掉一个1、一起删掉一个2、一起删掉2个3,然后状况为 -// A = [2 3] B = [2 3] C = [1],剩余个数为5 +// A = [2 3] B = [2 3] C = [1] 剩余个数为5 // 给定一个长度为n的数组arr,下来有m条查询,格式如下 // 查询 l1 r1 l2 r2 l3 r3 : 给定了三个区间,打印剩余个数 // 1 <= n、m <= 10^5 From 428627d8af4bcce3577b2fd9d9ca4362360d005f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 14:46:05 +0800 Subject: [PATCH 0765/1170] modify code --- src/class179/Code04_LCP1.java | 6 +++--- src/class179/Code04_LCP2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class179/Code04_LCP1.java b/src/class179/Code04_LCP1.java index ab5d63290..341319b45 100644 --- a/src/class179/Code04_LCP1.java +++ b/src/class179/Code04_LCP1.java @@ -2,9 +2,9 @@ // 区间lcp达标对,java版 // 给定一个长度为n的字符串str,还有一个参数k -// 位置a开头的字符串 和 位置b开头的字符串,如果最长公共前缀 >= k,则(a, b)构成达标对 -// 构成达标对的必须是不同的两个位置,并且(a, b)和(b, a)只算一个达标对,不要重复统计 -// 接下来有m条查询,格式为 l r : str[l..r]范围上,可以任选开头位置,打印达标对的数量 +// 位置a开头和位置b开头的字符串,如果最长公共前缀的长度 >= k,那么(a, b)构成lcp达标对 +// 构成lcp达标对,必须是不同的位置,并且(a, b)和(b, a)只算一个达标对,不要重复统计 +// 接下来有m条查询,格式为 l r : str[l..r]范围上,可以任选开头位置,打印lcp达标对的数量 // 1 <= n、k <= 3 * 10^6 1 <= m <= 10^5 // 1 <= n * n * m <= 10^15 字符集为 f z o u t s y // 测试链接 : https://www.luogu.com.cn/problem/P5112 diff --git a/src/class179/Code04_LCP2.java b/src/class179/Code04_LCP2.java index 79c2cb351..7952d06be 100644 --- a/src/class179/Code04_LCP2.java +++ b/src/class179/Code04_LCP2.java @@ -2,9 +2,9 @@ // 区间lcp达标对,C++版 // 给定一个长度为n的字符串str,还有一个参数k -// 位置a开头的字符串 和 位置b开头的字符串,如果最长公共前缀 >= k,则(a, b)构成达标对 -// 构成达标对的必须是不同的两个位置,并且(a, b)和(b, a)只算一个达标对,不要重复统计 -// 接下来有m条查询,格式为 l r : str[l..r]范围上,可以任选开头位置,打印达标对的数量 +// 位置a开头和位置b开头的字符串,如果最长公共前缀的长度 >= k,那么(a, b)构成lcp达标对 +// 构成lcp达标对,必须是不同的位置,并且(a, b)和(b, a)只算一个达标对,不要重复统计 +// 接下来有m条查询,格式为 l r : str[l..r]范围上,可以任选开头位置,打印lcp达标对的数量 // 1 <= n、k <= 3 * 10^6 1 <= m <= 10^5 // 1 <= n * n * m <= 10^15 字符集为 f z o u t s y // 测试链接 : https://www.luogu.com.cn/problem/P5112 From 0bb201808993acaefe861ffcc4385fd2d09789a0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 15:03:31 +0800 Subject: [PATCH 0766/1170] modify code --- src/class179/Code01_MaximumMatch1.java | 6 +++++- src/class179/Code01_MaximumMatch2.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/class179/Code01_MaximumMatch1.java b/src/class179/Code01_MaximumMatch1.java index 58ccb10a6..1f09c807b 100644 --- a/src/class179/Code01_MaximumMatch1.java +++ b/src/class179/Code01_MaximumMatch1.java @@ -29,6 +29,10 @@ public class Code01_MaximumMatch1 { public static int[][] query = new int[MAXQ][3]; public static int[] bi = new int[MAXM]; + // 关于数组a的线段树,a[l..r]和b数组的数字进行匹配,l..r对应的信息在i位置 + // match[i] = v,表示a[l..r]和b数组的数字,一共匹配了v对 + // resta[i] = v,表示a[l..r]中还有v个数,可用于匹配b数组的数字 + // overb[i] = v,表示a[l..r]已经没有可用数字,并且有v个b数组的数字等待匹配 public static int[] match = new int[MAXN << 2]; public static int[] resta = new int[MAXN << 2]; public static int[] overb = new int[MAXN << 2]; @@ -111,7 +115,7 @@ public static void del(int jobv, int l, int r, int i) { public static void prepare() { Arrays.sort(a, 1, n + 1); - int blen = (int) Math.sqrt(n); + int blen = (int) Math.sqrt(m); for (int i = 1; i <= m; i++) { bi[i] = (i - 1) / blen + 1; } diff --git a/src/class179/Code01_MaximumMatch2.java b/src/class179/Code01_MaximumMatch2.java index 6fe2f30cf..3a56775f5 100644 --- a/src/class179/Code01_MaximumMatch2.java +++ b/src/class179/Code01_MaximumMatch2.java @@ -108,7 +108,7 @@ // //void prepare() { // sort(a + 1, a + n + 1); -// int blen = (int)sqrt(n); +// int blen = (int)sqrt(m); // for (int i = 1; i <= m; i++) { // bi[i] = (i - 1) / blen + 1; // } From 21ac0572f13bb9d2c4a607fdfd2125725a5f4051 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 15:08:49 +0800 Subject: [PATCH 0767/1170] modify code --- src/class179/Code01_MaximumMatch1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class179/Code01_MaximumMatch1.java b/src/class179/Code01_MaximumMatch1.java index 1f09c807b..b5d07e448 100644 --- a/src/class179/Code01_MaximumMatch1.java +++ b/src/class179/Code01_MaximumMatch1.java @@ -29,10 +29,10 @@ public class Code01_MaximumMatch1 { public static int[][] query = new int[MAXQ][3]; public static int[] bi = new int[MAXM]; - // 关于数组a的线段树,a[l..r]和b数组的数字进行匹配,l..r对应的信息在i位置 + // 线段树维护匹配信息,a[l..r]和b数组的数字进行匹配,l..r对应的信息在i位置 // match[i] = v,表示a[l..r]和b数组的数字,一共匹配了v对 // resta[i] = v,表示a[l..r]中还有v个数,可用于匹配b数组的数字 - // overb[i] = v,表示a[l..r]已经没有可用数字,并且有v个b数组的数字等待匹配 + // overb[i] = v,表示a[l..r]已经耗尽,但是还有v个b数组的数字需要匹配 public static int[] match = new int[MAXN << 2]; public static int[] resta = new int[MAXN << 2]; public static int[] overb = new int[MAXN << 2]; From 5318a79ff519a2c53c2d0b959eaac3bfd2f66dec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 15:14:09 +0800 Subject: [PATCH 0768/1170] modify code --- src/class179/Code01_MaximumMatch1.java | 6 +++--- src/class179/Code01_MaximumMatch2.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/class179/Code01_MaximumMatch1.java b/src/class179/Code01_MaximumMatch1.java index b5d07e448..00c7a925e 100644 --- a/src/class179/Code01_MaximumMatch1.java +++ b/src/class179/Code01_MaximumMatch1.java @@ -96,11 +96,11 @@ public static void add(int jobv, int l, int r, int i) { public static void del(int jobv, int l, int r, int i) { if (l == r) { - if (overb[i] == 0) { + if (overb[i] > 0) { + overb[i]--; + } else { match[i] = 0; resta[i] = 1; - } else { - overb[i]--; } } else { int mid = (l + r) >> 1; diff --git a/src/class179/Code01_MaximumMatch2.java b/src/class179/Code01_MaximumMatch2.java index 3a56775f5..09a04c36d 100644 --- a/src/class179/Code01_MaximumMatch2.java +++ b/src/class179/Code01_MaximumMatch2.java @@ -89,11 +89,11 @@ // //void del(int jobv, int l, int r, int i) { // if (l == r) { -// if (overb[i] == 0) { -// match[i] = 0; -// resta[i] = 1; -// } else { +// if (overb[i] > 0) { // overb[i]--; +// } else { +// match[i] = 0; +// resta[i] = 1; // } // } else { // int mid = (l + r) >> 1; From 27c43a0658c061b669a693bebe9cbbcabc5894e3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 30 Sep 2025 17:36:41 +0800 Subject: [PATCH 0769/1170] modify code --- src/class179/{Code03_NiceDay1.java => Code01_NiceDay1.java} | 4 ++-- src/class179/{Code03_NiceDay2.java => Code01_NiceDay2.java} | 0 src/class179/{Code04_LCP1.java => Code03_LCP1.java} | 2 +- src/class179/{Code04_LCP2.java => Code03_LCP2.java} | 0 .../{Code01_MaximumMatch1.java => Code04_MaximumMatch1.java} | 2 +- .../{Code01_MaximumMatch2.java => Code04_MaximumMatch2.java} | 0 6 files changed, 4 insertions(+), 4 deletions(-) rename src/class179/{Code03_NiceDay1.java => Code01_NiceDay1.java} (97%) rename src/class179/{Code03_NiceDay2.java => Code01_NiceDay2.java} (100%) rename src/class179/{Code04_LCP1.java => Code03_LCP1.java} (99%) rename src/class179/{Code04_LCP2.java => Code03_LCP2.java} (100%) rename src/class179/{Code01_MaximumMatch1.java => Code04_MaximumMatch1.java} (99%) rename src/class179/{Code01_MaximumMatch2.java => Code04_MaximumMatch2.java} (100%) diff --git a/src/class179/Code03_NiceDay1.java b/src/class179/Code01_NiceDay1.java similarity index 97% rename from src/class179/Code03_NiceDay1.java rename to src/class179/Code01_NiceDay1.java index ee5759480..bccbfb9db 100644 --- a/src/class179/Code03_NiceDay1.java +++ b/src/class179/Code01_NiceDay1.java @@ -8,7 +8,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P3604 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code03_NiceDay2文件就是C++的实现 +// 想通过用C++实现,本节课Code01_NiceDay2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -18,7 +18,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code03_NiceDay1 { +public class Code01_NiceDay1 { public static int MAXN = 60002; public static int MAXV = 1 << 26; diff --git a/src/class179/Code03_NiceDay2.java b/src/class179/Code01_NiceDay2.java similarity index 100% rename from src/class179/Code03_NiceDay2.java rename to src/class179/Code01_NiceDay2.java diff --git a/src/class179/Code04_LCP1.java b/src/class179/Code03_LCP1.java similarity index 99% rename from src/class179/Code04_LCP1.java rename to src/class179/Code03_LCP1.java index 341319b45..546902d51 100644 --- a/src/class179/Code04_LCP1.java +++ b/src/class179/Code03_LCP1.java @@ -17,7 +17,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code04_LCP1 { +public class Code03_LCP1 { public static int MAXN = 3000001; public static int MAXM = 100001; diff --git a/src/class179/Code04_LCP2.java b/src/class179/Code03_LCP2.java similarity index 100% rename from src/class179/Code04_LCP2.java rename to src/class179/Code03_LCP2.java diff --git a/src/class179/Code01_MaximumMatch1.java b/src/class179/Code04_MaximumMatch1.java similarity index 99% rename from src/class179/Code01_MaximumMatch1.java rename to src/class179/Code04_MaximumMatch1.java index 00c7a925e..eae88e726 100644 --- a/src/class179/Code01_MaximumMatch1.java +++ b/src/class179/Code04_MaximumMatch1.java @@ -18,7 +18,7 @@ import java.util.Arrays; import java.util.Comparator; -public class Code01_MaximumMatch1 { +public class Code04_MaximumMatch1 { public static int MAXN = 152502; public static int MAXM = 52502; diff --git a/src/class179/Code01_MaximumMatch2.java b/src/class179/Code04_MaximumMatch2.java similarity index 100% rename from src/class179/Code01_MaximumMatch2.java rename to src/class179/Code04_MaximumMatch2.java From 8c6e895e68f0ccf96a57146362b7787e5865586d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 1 Oct 2025 10:32:47 +0800 Subject: [PATCH 0770/1170] modify code --- src/class149/SkipList2.java | 9 ++------- src/class179/Code04_MaximumMatch2.java | 4 ++-- src/class179/Code06_NotForget1.java | 22 +++++++++++----------- src/class179/Code06_NotForget2.java | 24 ++++++++++++------------ src/class179/Code07_RabbitHole2.java | 2 +- 5 files changed, 28 insertions(+), 33 deletions(-) diff --git a/src/class149/SkipList2.java b/src/class149/SkipList2.java index 29dab5a16..c2ea1cc14 100644 --- a/src/class149/SkipList2.java +++ b/src/class149/SkipList2.java @@ -14,12 +14,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -//#include -//#include -//#include -//#include -//#include -//#include +//#include // //using namespace std; // @@ -52,7 +47,7 @@ // //int randomLevel() { // int ans = 1; -// while ((std::rand() / double(RAND_MAX)) < 0.5) { +// while ((rand() / double(RAND_MAX)) < 0.5) { // ans++; // } // return min(ans, MAXL); diff --git a/src/class179/Code04_MaximumMatch2.java b/src/class179/Code04_MaximumMatch2.java index 09a04c36d..f0250d01b 100644 --- a/src/class179/Code04_MaximumMatch2.java +++ b/src/class179/Code04_MaximumMatch2.java @@ -57,7 +57,7 @@ // //void build(int l, int r, int i) { // if (l == r) { -// match[i] = 0; +// match[i] = 0; // resta[i] = 1; // overb[i] = 0; // } else { @@ -71,7 +71,7 @@ //void add(int jobv, int l, int r, int i) { // if (l == r) { // if (resta[i] == 1) { -// match[i] = 1; +// match[i] = 1; // resta[i] = 0; // } else { // overb[i]++; diff --git a/src/class179/Code06_NotForget1.java b/src/class179/Code06_NotForget1.java index 461545d4e..22893d1f7 100644 --- a/src/class179/Code06_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -25,7 +25,7 @@ public class Code06_NotForget1 { public static int MAXB = 401; public static int n, m; public static int[] arr = new int[MAXN]; - // 每条查询的格式 : l、r、mod、id + // 每条查询的格式 : l、r、p、id public static int[][] query = new int[MAXN][4]; public static int[] bi = new int[MAXN]; @@ -104,23 +104,23 @@ public static void del(int num) { } } - public static void setAns(int len, int mod, int id) { + public static void setAns(int len, int p, int id) { int blen = (int) Math.sqrt(len); int bnum = (len + blen - 1) / blen; smlPower[0] = 1; for (int i = 1; i <= blen; i++) { - smlPower[i] = (smlPower[i - 1] << 1) % mod; + smlPower[i] = (smlPower[i - 1] << 1) % p; } bigPower[0] = 1; for (int i = 1; i <= bnum; i++) { - bigPower[i] = (bigPower[i - 1] * smlPower[blen]) % mod; + bigPower[i] = (bigPower[i - 1] * smlPower[blen]) % p; } long res = 0, tmp; - for (int p = head; p > 0; p = next[p]) { - tmp = bigPower[len / blen] * smlPower[len % blen] % mod; - tmp -= bigPower[(len - p) / blen] * smlPower[(len - p) % blen] % mod; - tmp = (tmp * sum[p]) % mod; - res = ((res + tmp) % mod + mod) % mod; + for (int t = head; t > 0; t = next[t]) { + tmp = bigPower[len / blen] * smlPower[len % blen] % p; + tmp -= bigPower[(len - t) / blen] * smlPower[(len - t) % blen] % p; + tmp = (tmp * sum[t]) % p; + res = ((res + tmp) % p + p) % p; } ans[id] = res; } @@ -130,7 +130,7 @@ public static void compute() { for (int i = 1; i <= m; i++) { int jobl = query[i][0]; int jobr = query[i][1]; - int mod = query[i][2]; + int jobp = query[i][2]; int id = query[i][3]; while (winl > jobl) { add(arr[--winl]); @@ -144,7 +144,7 @@ public static void compute() { while (winr > jobr) { del(arr[winr--]); } - setAns(jobr - jobl + 1, mod, id); + setAns(jobr - jobl + 1, jobp, id); } } diff --git a/src/class179/Code06_NotForget2.java b/src/class179/Code06_NotForget2.java index cd851a8ad..cc0c70ab7 100644 --- a/src/class179/Code06_NotForget2.java +++ b/src/class179/Code06_NotForget2.java @@ -15,7 +15,7 @@ //using namespace std; // //struct Query { -// int l, r, mod, id; +// int l, r, p, id; //}; // //const int MAXN = 100001; @@ -99,23 +99,23 @@ // } //} // -//void setAns(int len, int mod, int id) { +//void setAns(int len, int p, int id) { // int blen = (int)sqrt(len); // int bnum = (len + blen - 1) / blen; // smlPower[0] = 1; // for (int i = 1; i <= blen; i++) { -// smlPower[i] = (smlPower[i - 1] << 1) % mod; +// smlPower[i] = (smlPower[i - 1] << 1) % p; // } // bigPower[0] = 1; // for (int i = 1; i <= bnum; i++) { -// bigPower[i] = (bigPower[i - 1] * smlPower[blen]) % mod; +// bigPower[i] = (bigPower[i - 1] * smlPower[blen]) % p; // } // long long res = 0, tmp; -// for (int p = head; p > 0; p = nxt[p]) { -// tmp = bigPower[len / blen] * smlPower[len % blen] % mod; -// tmp -= bigPower[(len - p) / blen] * smlPower[(len - p) % blen] % mod; -// tmp = (tmp * sum[p]) % mod; -// res = ((res + tmp) % mod + mod) % mod; +// for (int t = head; t > 0; t = nxt[t]) { +// tmp = bigPower[len / blen] * smlPower[len % blen] % p; +// tmp -= bigPower[(len - t) / blen] * smlPower[(len - t) % blen] % p; +// tmp = (tmp * sum[t]) % p; +// res = ((res + tmp) % p + p) % p; // } // ans[id] = res; //} @@ -125,7 +125,7 @@ // for (int i = 1; i <= m; i++) { // int jobl = query[i].l; // int jobr = query[i].r; -// int mod = query[i].mod; +// int jobp = query[i].p; // int id = query[i].id; // while (winl > jobl) { // add(arr[--winl]); @@ -139,7 +139,7 @@ // while (winr > jobr) { // del(arr[winr--]); // } -// setAns(jobr - jobl + 1, mod, id); +// setAns(jobr - jobl + 1, jobp, id); // } //} // @@ -159,7 +159,7 @@ // cin >> arr[i]; // } // for (int i = 1; i <= m; i++) { -// cin >> query[i].l >> query[i].r >> query[i].mod; +// cin >> query[i].l >> query[i].r >> query[i].p; // query[i].id = i; // } // prepare(); diff --git a/src/class179/Code07_RabbitHole2.java b/src/class179/Code07_RabbitHole2.java index 703130278..ca8b90594 100644 --- a/src/class179/Code07_RabbitHole2.java +++ b/src/class179/Code07_RabbitHole2.java @@ -101,7 +101,7 @@ // //void prepare() { // for (int i = 1; i <= n; i++) { -// sorted[i] = arr[i]; +// sorted[i] = arr[i]; // } // sort(sorted + 1, sorted + n + 1); // for (int i = 1; i <= n; i++) { From 50caf64190db0614a069b744958e81383965b15b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 1 Oct 2025 11:00:13 +0800 Subject: [PATCH 0771/1170] modify code --- src/class179/Code01_NiceDay1.java | 2 +- src/class179/Code01_NiceDay2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class179/Code01_NiceDay1.java b/src/class179/Code01_NiceDay1.java index bccbfb9db..db5b0bd5f 100644 --- a/src/class179/Code01_NiceDay1.java +++ b/src/class179/Code01_NiceDay1.java @@ -27,7 +27,7 @@ public class Code01_NiceDay1 { public static int[][] query = new int[MAXN][3]; public static int[] bi = new int[MAXN]; - public static short[] cnt = new short[MAXV]; + public static int[] cnt = new int[MAXV]; public static long num = 0; public static long[] ans = new long[MAXN]; diff --git a/src/class179/Code01_NiceDay2.java b/src/class179/Code01_NiceDay2.java index c95f62221..277c4da5a 100644 --- a/src/class179/Code01_NiceDay2.java +++ b/src/class179/Code01_NiceDay2.java @@ -24,7 +24,7 @@ //Query query[MAXN]; // //int bi[MAXN]; -//short cnt[MAXV]; +//int cnt[MAXV]; //long long num = 0; //long long ans[MAXN]; // From 32f7d1531edbfbc9d94f5296ee5b66cf3add321a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 1 Oct 2025 11:12:16 +0800 Subject: [PATCH 0772/1170] modify code --- src/class179/Code02_SimpleQuery1.java | 16 ++++++++++------ src/class179/Code02_SimpleQuery2.java | 16 ++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java index 5bfab3c42..893706391 100644 --- a/src/class179/Code02_SimpleQuery1.java +++ b/src/class179/Code02_SimpleQuery1.java @@ -63,20 +63,24 @@ public static void compute() { int op = query[i][2]; int id = query[i][3]; while (win1 < job1) { - ++cnt1[arr[++win1]]; + win1++; + cnt1[arr[win1]]++; sum += cnt2[arr[win1]]; } while (win1 > job1) { - --cnt1[arr[win1]]; - sum -= cnt2[arr[win1--]]; + cnt1[arr[win1]]--; + sum -= cnt2[arr[win1]]; + win1--; } while (win2 < job2) { - ++cnt2[arr[++win2]]; + win2++; + cnt2[arr[win2]]++; sum += cnt1[arr[win2]]; } while (win2 > job2) { - --cnt2[arr[win2]]; - sum -= cnt1[arr[win2--]]; + cnt2[arr[win2]]--; + sum -= cnt1[arr[win2]]; + win2--; } ans[id] += sum * op; } diff --git a/src/class179/Code02_SimpleQuery2.java b/src/class179/Code02_SimpleQuery2.java index a11f5337b..9980be569 100644 --- a/src/class179/Code02_SimpleQuery2.java +++ b/src/class179/Code02_SimpleQuery2.java @@ -56,20 +56,24 @@ // int op = query[i].op; // int id = query[i].id; // while (win1 < job1) { -// ++cnt1[arr[++win1]]; +// win1++; +// cnt1[arr[win1]]++; // sumv += cnt2[arr[win1]]; // } // while (win1 > job1) { -// --cnt1[arr[win1]]; -// sumv -= cnt2[arr[win1--]]; +// cnt1[arr[win1]]--; +// sumv -= cnt2[arr[win1]]; +// win1--; // } // while (win2 < job2) { -// ++cnt2[arr[++win2]]; +// win2++; +// cnt2[arr[win2]]++; // sumv += cnt1[arr[win2]]; // } // while (win2 > job2) { -// --cnt2[arr[win2]]; -// sumv -= cnt1[arr[win2--]]; +// cnt2[arr[win2]]--; +// sumv -= cnt1[arr[win2]]; +// win2--; // } // ans[id] += sumv * op; // } From 044de193037365d386fe2dc0818bd091c77df687 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 1 Oct 2025 11:18:19 +0800 Subject: [PATCH 0773/1170] modify code --- src/class179/Code03_LCP2.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/class179/Code03_LCP2.java b/src/class179/Code03_LCP2.java index 7952d06be..36ec5f3d5 100644 --- a/src/class179/Code03_LCP2.java +++ b/src/class179/Code03_LCP2.java @@ -99,22 +99,22 @@ //} // //void prepare() { -// basePower[0] = 1; +// basePower[0] = 1; // for (int i = 1; i <= n; i++) { -// basePower[i] = basePower[i - 1] * base; -// hashValue[i] = hashValue[i - 1] * base + (str[i] - 'a' + 1); +// basePower[i] = basePower[i - 1] * base; +// hashValue[i] = hashValue[i - 1] * base + (str[i] - 'a' + 1); // } // for (int l = 1, r = k; r <= n; l++, r++) { // val[l] = hashValue[r] - hashValue[l - 1] * basePower[r - l + 1]; // } // for (int i = 1; i <= len; i++) { -// sorted[i] = val[i]; +// sorted[i] = val[i]; // } // sort(sorted + 1, sorted + len + 1); // cntv = 1; // for (int i = 2; i <= len; i++) { // if (sorted[cntv] != sorted[i]) { -// sorted[++cntv] = sorted[i]; +// sorted[++cntv] = sorted[i]; // } // } // for (int i = 1; i <= len; i++) { @@ -131,11 +131,8 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m >> k; -// string s; -// s.reserve(n); -// cin >> s; // for (int i = 1; i <= n; i++) { -// str[i] = s[i - 1]; +// cin >> str[i]; // } // len = n - k + 1; // cntq = 0; From ca56b6b8f57788e3ecf10bd9c028ee12eb68a59e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 1 Oct 2025 11:20:12 +0800 Subject: [PATCH 0774/1170] modify code --- src/class179/Code04_MaximumMatch2.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/class179/Code04_MaximumMatch2.java b/src/class179/Code04_MaximumMatch2.java index f0250d01b..a7a08f3fe 100644 --- a/src/class179/Code04_MaximumMatch2.java +++ b/src/class179/Code04_MaximumMatch2.java @@ -26,7 +26,7 @@ //int n, m, z, q; //int a[MAXN]; //int b[MAXM]; -//Query querys[MAXQ]; +//Query query[MAXQ]; //int bi[MAXM]; // //int match[MAXN << 2]; @@ -112,16 +112,16 @@ // for (int i = 1; i <= m; i++) { // bi[i] = (i - 1) / blen + 1; // } -// sort(querys + 1, querys + q + 1, QueryCmp); +// sort(query + 1, query + q + 1, QueryCmp); // build(1, n, 1); //} // //void compute() { // int winl = 1, winr = 0; // for (int i = 1; i <= q; i++) { -// int jobl = querys[i].l; -// int jobr = querys[i].r; -// int id = querys[i].id; +// int jobl = query[i].l; +// int jobr = query[i].r; +// int id = query[i].id; // while (winl > jobl) { // add(b[--winl], 1, n, 1); // } @@ -150,8 +150,8 @@ // } // cin >> q; // for (int i = 1; i <= q; i++) { -// cin >> querys[i].l >> querys[i].r; -// querys[i].id = i; +// cin >> query[i].l >> query[i].r; +// query[i].id = i; // } // prepare(); // compute(); From 8bc4f93bde02fdbb9b0abbeba398ec84fa80ec51 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 1 Oct 2025 11:48:39 +0800 Subject: [PATCH 0775/1170] modify code --- src/class179/Code02_SimpleQuery1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java index 893706391..87df58a98 100644 --- a/src/class179/Code02_SimpleQuery1.java +++ b/src/class179/Code02_SimpleQuery1.java @@ -22,7 +22,7 @@ public class Code02_SimpleQuery1 { public static int MAXN = 50001; public static int n, q, cntq; public static int[] arr = new int[MAXN]; - // siz1、siz2、op、id + // 查询任务,siz1、siz2、op、id public static int[][] query = new int[MAXN << 2][4]; public static int[] bi = new int[MAXN]; From 4e9fb35165c221ba13360f3f941887e650dd6a14 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 1 Oct 2025 11:52:46 +0800 Subject: [PATCH 0776/1170] modify code --- src/class179/Code05_Homework1.java | 2 +- src/class179/Code06_NotForget1.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class179/Code05_Homework1.java b/src/class179/Code05_Homework1.java index 7cba8f9c2..82729a64a 100644 --- a/src/class179/Code05_Homework1.java +++ b/src/class179/Code05_Homework1.java @@ -21,7 +21,7 @@ public class Code05_Homework1 { public static int MAXN = 100001; public static int n, m; public static int[] arr = new int[MAXN]; - // l、r、a、b、id + // 查询任务,l、r、a、b、id public static int[][] query = new int[MAXN][5]; public static int[] bi = new int[MAXN]; public static int[] bl = new int[MAXN]; diff --git a/src/class179/Code06_NotForget1.java b/src/class179/Code06_NotForget1.java index 22893d1f7..ca9bc2960 100644 --- a/src/class179/Code06_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -25,7 +25,7 @@ public class Code06_NotForget1 { public static int MAXB = 401; public static int n, m; public static int[] arr = new int[MAXN]; - // 每条查询的格式 : l、r、p、id + // 查询任务,l、r、p、id public static int[][] query = new int[MAXN][4]; public static int[] bi = new int[MAXN]; From 1bc05b33f1d60e2a5a8a693fb051bdf6a82386c7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 1 Oct 2025 14:54:55 +0800 Subject: [PATCH 0777/1170] modify code --- src/class179/Code01_NiceDay1.java | 12 ++++++------ src/class179/Code01_NiceDay2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class179/Code01_NiceDay1.java b/src/class179/Code01_NiceDay1.java index db5b0bd5f..df6fdbe19 100644 --- a/src/class179/Code01_NiceDay1.java +++ b/src/class179/Code01_NiceDay1.java @@ -28,7 +28,7 @@ public class Code01_NiceDay1 { public static int[] bi = new int[MAXN]; public static int[] cnt = new int[MAXV]; - public static long num = 0; + public static long curAns = 0; public static long[] ans = new long[MAXN]; public static class QueryCmp implements Comparator { @@ -46,18 +46,18 @@ public int compare(int[] a, int[] b) { } public static void add(int s) { - num += cnt[s]; + curAns += cnt[s]; cnt[s]++; for (int i = 0; i < 26; i++) { - num += cnt[s ^ (1 << i)]; + curAns += cnt[s ^ (1 << i)]; } } public static void del(int s) { cnt[s]--; - num -= cnt[s]; + curAns -= cnt[s]; for (int i = 0; i < 26; i++) { - num -= cnt[s ^ (1 << i)]; + curAns -= cnt[s ^ (1 << i)]; } } @@ -79,7 +79,7 @@ public static void compute() { while (winr > jobr) { del(arr[winr--]); } - ans[id] = num; + ans[id] = curAns; } } diff --git a/src/class179/Code01_NiceDay2.java b/src/class179/Code01_NiceDay2.java index 277c4da5a..ea16c0247 100644 --- a/src/class179/Code01_NiceDay2.java +++ b/src/class179/Code01_NiceDay2.java @@ -25,7 +25,7 @@ // //int bi[MAXN]; //int cnt[MAXV]; -//long long num = 0; +//long long curAns = 0; //long long ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { @@ -40,18 +40,18 @@ //} // //void add(int s) { -// num += cnt[s]; +// curAns += cnt[s]; // cnt[s]++; // for (int i = 0; i < 26; i++) { -// num += cnt[s ^ (1 << i)]; +// curAns += cnt[s ^ (1 << i)]; // } //} // //void del(int s) { // cnt[s]--; -// num -= cnt[s]; +// curAns -= cnt[s]; // for (int i = 0; i < 26; i++) { -// num -= cnt[s ^ (1 << i)]; +// curAns -= cnt[s ^ (1 << i)]; // } //} // @@ -73,7 +73,7 @@ // while (winr > jobr) { // del(arr[winr--]); // } -// ans[id] = num; +// ans[id] = curAns; // } //} // From 0a730c10d8402ddb9b418971aae528e20eb3ef4e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Oct 2025 13:31:56 +0800 Subject: [PATCH 0778/1170] modify code --- src/class179/Code02_SimpleQuery1.java | 15 +++++++++------ src/class179/Code02_SimpleQuery2.java | 12 ++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/class179/Code02_SimpleQuery1.java b/src/class179/Code02_SimpleQuery1.java index 87df58a98..ca739911d 100644 --- a/src/class179/Code02_SimpleQuery1.java +++ b/src/class179/Code02_SimpleQuery1.java @@ -26,9 +26,12 @@ public class Code02_SimpleQuery1 { public static int[][] query = new int[MAXN << 2][4]; public static int[] bi = new int[MAXN]; + // cnt1 : arr[1..siz1]范围内每种数字出现的次数 + // cnt2 : arr[1..siz2]范围内每种数字出现的次数 public static int[] cnt1 = new int[MAXN]; public static int[] cnt2 = new int[MAXN]; - public static long sum = 0; + public static long curAns = 0; + public static long[] ans = new long[MAXN]; public static class QueryCmp implements Comparator { @@ -65,24 +68,24 @@ public static void compute() { while (win1 < job1) { win1++; cnt1[arr[win1]]++; - sum += cnt2[arr[win1]]; + curAns += cnt2[arr[win1]]; } while (win1 > job1) { cnt1[arr[win1]]--; - sum -= cnt2[arr[win1]]; + curAns -= cnt2[arr[win1]]; win1--; } while (win2 < job2) { win2++; cnt2[arr[win2]]++; - sum += cnt1[arr[win2]]; + curAns += cnt1[arr[win2]]; } while (win2 > job2) { cnt2[arr[win2]]--; - sum -= cnt1[arr[win2]]; + curAns -= cnt1[arr[win2]]; win2--; } - ans[id] += sum * op; + ans[id] += curAns * op; } } diff --git a/src/class179/Code02_SimpleQuery2.java b/src/class179/Code02_SimpleQuery2.java index 9980be569..0379bc455 100644 --- a/src/class179/Code02_SimpleQuery2.java +++ b/src/class179/Code02_SimpleQuery2.java @@ -27,7 +27,7 @@ // //int cnt1[MAXN]; //int cnt2[MAXN]; -//long long sumv = 0; +//long long curAns = 0; //long long ans[MAXN]; // //bool QueryCmp(Query &a, Query &b) { @@ -58,24 +58,24 @@ // while (win1 < job1) { // win1++; // cnt1[arr[win1]]++; -// sumv += cnt2[arr[win1]]; +// curAns += cnt2[arr[win1]]; // } // while (win1 > job1) { // cnt1[arr[win1]]--; -// sumv -= cnt2[arr[win1]]; +// curAns -= cnt2[arr[win1]]; // win1--; // } // while (win2 < job2) { // win2++; // cnt2[arr[win2]]++; -// sumv += cnt1[arr[win2]]; +// curAns += cnt1[arr[win2]]; // } // while (win2 > job2) { // cnt2[arr[win2]]--; -// sumv -= cnt1[arr[win2]]; +// curAns -= cnt1[arr[win2]]; // win2--; // } -// ans[id] += sumv * op; +// ans[id] += curAns * op; // } //} // From e0942670a2fd503b6104cf382b98c2edc3429ac7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Oct 2025 14:19:24 +0800 Subject: [PATCH 0779/1170] modify code --- src/class179/Code03_LCP1.java | 5 +++-- src/class179/Code03_LCP2.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/class179/Code03_LCP1.java b/src/class179/Code03_LCP1.java index 546902d51..d9451a655 100644 --- a/src/class179/Code03_LCP1.java +++ b/src/class179/Code03_LCP1.java @@ -123,8 +123,9 @@ public static void prepare() { for (int i = 1; i <= len; i++) { arr[i] = kth(val[i]); } - int blen = Math.max(1, (int) ((double) len / Math.sqrt(cntq))); - for (int i = 1; i <= len; i++) { + // 块长优化 + int blen = Math.max(1, (int) ((double) n / Math.sqrt(m))); + for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } Arrays.sort(query, 1, cntq + 1, new QueryCmp()); diff --git a/src/class179/Code03_LCP2.java b/src/class179/Code03_LCP2.java index 36ec5f3d5..3bddfcaee 100644 --- a/src/class179/Code03_LCP2.java +++ b/src/class179/Code03_LCP2.java @@ -120,8 +120,8 @@ // for (int i = 1; i <= len; i++) { // arr[i] = kth(val[i]); // } -// int blen = max(1, (int)((double)len / sqrt((double)cntq))); -// for (int i = 1; i <= len; i++) { +// int blen = max(1, (int)((double)n / sqrt((double)m))); +// for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } // sort(query + 1, query + cntq + 1, QueryCmp); From 77b2c2e969b13a0451736e1553e09ce2e72c201b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Oct 2025 14:37:50 +0800 Subject: [PATCH 0780/1170] modify code --- src/class179/Code03_LCP1.java | 8 +++----- src/class179/Code03_LCP2.java | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/class179/Code03_LCP1.java b/src/class179/Code03_LCP1.java index d9451a655..390c4514d 100644 --- a/src/class179/Code03_LCP1.java +++ b/src/class179/Code03_LCP1.java @@ -68,15 +68,13 @@ public int compare(int[] a, int[] b) { } public static void add(int x) { - curAns -= cnt[x] * cnt[x]; + curAns += cnt[x]; cnt[x]++; - curAns += cnt[x] * cnt[x]; } public static void del(int x) { - curAns -= cnt[x] * cnt[x]; cnt[x]--; - curAns += cnt[x] * cnt[x]; + curAns -= cnt[x]; } public static void compute() { @@ -97,7 +95,7 @@ public static void compute() { while (winr > jobr) { del(arr[winr--]); } - ans[id] = (curAns - (jobr - jobl + 1)) / 2; + ans[id] = curAns; } } diff --git a/src/class179/Code03_LCP2.java b/src/class179/Code03_LCP2.java index 3bddfcaee..2947a62bd 100644 --- a/src/class179/Code03_LCP2.java +++ b/src/class179/Code03_LCP2.java @@ -65,15 +65,13 @@ //} // //void add(int x) { -// curAns -= cnt[x] * cnt[x]; +// curAns += cnt[x]; // cnt[x]++; -// curAns += cnt[x] * cnt[x]; //} // //void del(int x) { -// curAns -= cnt[x] * cnt[x]; // cnt[x]--; -// curAns += cnt[x] * cnt[x]; +// curAns -= cnt[x]; //} // //void compute() { @@ -94,7 +92,7 @@ // while (winr > jobr) { // del(arr[winr--]); // } -// ans[id] = (curAns - (jobr - jobl + 1)) / 2; +// ans[id] = curAns; // } //} // From 6dc85e8cb5468d9bdfdbd66c19323a91f8cf42b7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Oct 2025 14:54:20 +0800 Subject: [PATCH 0781/1170] modify code --- src/class179/Code03_LCP1.java | 8 ++++++-- src/class179/Code03_LCP2.java | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/class179/Code03_LCP1.java b/src/class179/Code03_LCP1.java index 390c4514d..7991882f0 100644 --- a/src/class179/Code03_LCP1.java +++ b/src/class179/Code03_LCP1.java @@ -26,16 +26,18 @@ public class Code03_LCP1 { public static char[] str = new char[MAXN]; public static int[][] query = new int[MAXM][3]; + // 字符串哈希 public static int base = 499; public static long[] basePower = new long[MAXN]; public static long[] hashValue = new long[MAXN]; + // 哈希值离散化,用哈希值替代字符串,再用排名替代哈希值 public static long[] val = new long[MAXN]; public static long[] sorted = new long[MAXN]; public static int[] arr = new int[MAXN]; public static int[] bi = new int[MAXN]; - public static long[] cnt = new long[MAXN]; + public static int[] cnt = new int[MAXN]; public static long curAns; public static long[] ans = new long[MAXM]; @@ -121,7 +123,7 @@ public static void prepare() { for (int i = 1; i <= len; i++) { arr[i] = kth(val[i]); } - // 块长优化 + // 优化块长 int blen = Math.max(1, (int) ((double) n / Math.sqrt(m))); for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; @@ -138,11 +140,13 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { str[i] = in.nextLowerCase(); } + // 有效开头的个数,剩下的开头舍弃 len = n - k + 1; cntq = 0; for (int i = 1, l, r; i <= m; i++) { l = in.nextInt(); r = in.nextInt(); + // 过滤查询并调整查询参数 if (l <= len) { query[++cntq][0] = l; query[cntq][1] = Math.min(r, len); diff --git a/src/class179/Code03_LCP2.java b/src/class179/Code03_LCP2.java index 2947a62bd..548f6200c 100644 --- a/src/class179/Code03_LCP2.java +++ b/src/class179/Code03_LCP2.java @@ -35,7 +35,7 @@ //int arr[MAXN]; //int bi[MAXN]; // -//long long cnt[MAXN]; +//int cnt[MAXN]; //long long curAns; //long long ans[MAXM]; // From 13151a7ed1deaf620d88760eade0f8905d431194 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Oct 2025 17:00:52 +0800 Subject: [PATCH 0782/1170] modify code --- src/class179/Code04_MaximumMatch1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class179/Code04_MaximumMatch1.java b/src/class179/Code04_MaximumMatch1.java index eae88e726..f540dd9c4 100644 --- a/src/class179/Code04_MaximumMatch1.java +++ b/src/class179/Code04_MaximumMatch1.java @@ -30,9 +30,9 @@ public class Code04_MaximumMatch1 { public static int[] bi = new int[MAXM]; // 线段树维护匹配信息,a[l..r]和b数组的数字进行匹配,l..r对应的信息在i位置 - // match[i] = v,表示a[l..r]和b数组的数字,一共匹配了v对 - // resta[i] = v,表示a[l..r]中还有v个数,可用于匹配b数组的数字 - // overb[i] = v,表示a[l..r]已经耗尽,但是还有v个b数组的数字需要匹配 + // match[i] = v,a[l..r]和b数组的数字,一共匹配了v对 + // resta[i] = v,a[l..r]中还有v个数,可用于匹配b数组的数字 + // overb[i] = v,a[l..r]已经耗尽,但是还有v个b数组的数字需要匹配 public static int[] match = new int[MAXN << 2]; public static int[] resta = new int[MAXN << 2]; public static int[] overb = new int[MAXN << 2]; From 8935a9532847fdce0ef3f4dc9f69152b647a0bb1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Oct 2025 18:44:43 +0800 Subject: [PATCH 0783/1170] modify code --- src/class179/Code04_MaximumMatch1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class179/Code04_MaximumMatch1.java b/src/class179/Code04_MaximumMatch1.java index f540dd9c4..202331baa 100644 --- a/src/class179/Code04_MaximumMatch1.java +++ b/src/class179/Code04_MaximumMatch1.java @@ -32,7 +32,7 @@ public class Code04_MaximumMatch1 { // 线段树维护匹配信息,a[l..r]和b数组的数字进行匹配,l..r对应的信息在i位置 // match[i] = v,a[l..r]和b数组的数字,一共匹配了v对 // resta[i] = v,a[l..r]中还有v个数,可用于匹配b数组的数字 - // overb[i] = v,a[l..r]已经耗尽,但是还有v个b数组的数字需要匹配 + // overb[i] = v,a[l..r]已经耗尽,但是还有v个b数组的数字没有满足 public static int[] match = new int[MAXN << 2]; public static int[] resta = new int[MAXN << 2]; public static int[] overb = new int[MAXN << 2]; From cdfbf04bc074446bee5b53eeadd5f8c032aa1c04 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Oct 2025 18:49:22 +0800 Subject: [PATCH 0784/1170] modify code --- src/class179/Code05_Homework1.java | 2 +- src/class179/Code05_Homework2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class179/Code05_Homework1.java b/src/class179/Code05_Homework1.java index 82729a64a..35ab7635c 100644 --- a/src/class179/Code05_Homework1.java +++ b/src/class179/Code05_Homework1.java @@ -5,7 +5,7 @@ // 查询 l r a b : 打印arr[l..r]范围上的两个答案 // 答案1,数值范围在[a, b]的数字个数 // 答案2,数值范围在[a, b]的数字种数 -// 1 <= n、m、arr[i] <= 10^5 +// 1 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4396 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class179/Code05_Homework2.java b/src/class179/Code05_Homework2.java index e88e3efe6..8e1e34026 100644 --- a/src/class179/Code05_Homework2.java +++ b/src/class179/Code05_Homework2.java @@ -5,7 +5,7 @@ // 查询 l r a b : 打印arr[l..r]范围上的两个答案 // 答案1,数值范围在[a, b]的数字个数 // 答案2,数值范围在[a, b]的数字种数 -// 1 <= n、m、arr[i] <= 10^5 +// 1 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4396 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 4a8f6c3a437d48ad1ac46d33c9b50ccd8de95d64 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Oct 2025 18:52:52 +0800 Subject: [PATCH 0785/1170] modify code --- src/class179/Code05_Homework1.java | 10 +++++----- src/class179/Code05_Homework2.java | 11 +++++------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/class179/Code05_Homework1.java b/src/class179/Code05_Homework1.java index 35ab7635c..e7c722c29 100644 --- a/src/class179/Code05_Homework1.java +++ b/src/class179/Code05_Homework1.java @@ -19,6 +19,7 @@ public class Code05_Homework1 { public static int MAXN = 100001; + public static int MAXV = 100000; public static int n, m; public static int[] arr = new int[MAXN]; // 查询任务,l、r、a、b、id @@ -117,15 +118,14 @@ public static void compute() { } public static void prepare() { - int nv = MAXN - 1; - int blen = (int) Math.sqrt(nv); - int bnum = (nv + blen - 1) / blen; - for (int i = 1; i <= nv; i++) { + int blen = (int) Math.sqrt(MAXV); + int bnum = (MAXV + blen - 1) / blen; + for (int i = 1; i <= MAXV; i++) { bi[i] = (i - 1) / blen + 1; } for (int i = 1; i <= bnum; i++) { bl[i] = (i - 1) * blen + 1; - br[i] = Math.min(i * blen, nv); + br[i] = Math.min(i * blen, MAXV); } Arrays.sort(query, 1, m + 1, new QueryCmp()); } diff --git a/src/class179/Code05_Homework2.java b/src/class179/Code05_Homework2.java index 8e1e34026..36c516ec6 100644 --- a/src/class179/Code05_Homework2.java +++ b/src/class179/Code05_Homework2.java @@ -19,7 +19,7 @@ //}; // //const int MAXN = 100001; -// +//const int MAXV = 100000; //int n, m; //int arr[MAXN]; //Query query[MAXN]; @@ -114,15 +114,14 @@ //} // //void prepare() { -// int nv = MAXN - 1; -// int blen = (int)sqrt(nv); -// int bnum = (nv + blen - 1) / blen; -// for (int i = 1; i <= nv; i++) { +// int blen = (int)sqrt(MAXV); +// int bnum = (MAXV + blen - 1) / blen; +// for (int i = 1; i <= MAXV; i++) { // bi[i] = (i - 1) / blen + 1; // } // for (int i = 1; i <= bnum; i++) { // bl[i] = (i - 1) * blen + 1; -// br[i] = min(i * blen, nv); +// br[i] = min(i * blen, MAXV); // } // sort(query + 1, query + m + 1, QueryCmp); //} From 640b237fc254e3aaf5148febbeb23722ead048f4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Oct 2025 19:12:35 +0800 Subject: [PATCH 0786/1170] modify code --- src/class179/Code05_Homework1.java | 9 +++++---- src/class179/Code05_Homework2.java | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/class179/Code05_Homework1.java b/src/class179/Code05_Homework1.java index e7c722c29..fd7630692 100644 --- a/src/class179/Code05_Homework1.java +++ b/src/class179/Code05_Homework1.java @@ -20,17 +20,18 @@ public class Code05_Homework1 { public static int MAXN = 100001; public static int MAXV = 100000; + public static int MAXB = 401; public static int n, m; public static int[] arr = new int[MAXN]; // 查询任务,l、r、a、b、id public static int[][] query = new int[MAXN][5]; public static int[] bi = new int[MAXN]; - public static int[] bl = new int[MAXN]; - public static int[] br = new int[MAXN]; + public static int[] bl = new int[MAXB]; + public static int[] br = new int[MAXB]; public static int[] numCnt = new int[MAXN]; - public static int[] blockCnt = new int[MAXN]; - public static int[] blockKind = new int[MAXN]; + public static int[] blockCnt = new int[MAXB]; + public static int[] blockKind = new int[MAXB]; public static int[] ans1 = new int[MAXN]; public static int[] ans2 = new int[MAXN]; diff --git a/src/class179/Code05_Homework2.java b/src/class179/Code05_Homework2.java index 36c516ec6..e36803ddf 100644 --- a/src/class179/Code05_Homework2.java +++ b/src/class179/Code05_Homework2.java @@ -20,16 +20,17 @@ // //const int MAXN = 100001; //const int MAXV = 100000; +//const int MAXB = 401; //int n, m; //int arr[MAXN]; //Query query[MAXN]; //int bi[MAXN]; -//int bl[MAXN]; -//int br[MAXN]; +//int bl[MAXB]; +//int br[MAXB]; // //int numCnt[MAXN]; -//int blockCnt[MAXN]; -//int blockKind[MAXN]; +//int blockCnt[MAXB]; +//int blockKind[MAXB]; // //int ans1[MAXN]; //int ans2[MAXN]; From 7f4ecca8316b0d1d3b8e8d373fb447c9eebd98a5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 09:54:08 +0800 Subject: [PATCH 0787/1170] modify code --- src/class179/Code06_NotForget1.java | 21 ++++++++++++++------- src/class179/Code06_NotForget2.java | 14 +++++++------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/class179/Code06_NotForget1.java b/src/class179/Code06_NotForget1.java index ca9bc2960..0a201778b 100644 --- a/src/class179/Code06_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -29,13 +29,20 @@ public class Code06_NotForget1 { public static int[][] query = new int[MAXN][4]; public static int[] bi = new int[MAXN]; + // 次数桶组成的链表 + // 有数字进入次数桶,该次数桶才进入链表,链表内部不需要有序组织 public static int head; public static int[] last = new int[MAXN]; public static int[] next = new int[MAXN]; + // cnt[v] = c,表示v这个数出现了c次,也可以说v在c次桶里 + // sum[c] = x,表示c次桶内的所有数字,每种数字只统计一次,累加和为x public static int[] cnt = new int[MAXN]; public static long[] sum = new long[MAXN]; + // 假设[l..r]范围长度len,blockLen为块的长度,blockNum为块的数量 + // smlPower[i],表示p的i次方的值,i <= blockLen + // bigPower[i],表示p的(i * blockLen)次方的值,i <= blockNum public static long[] smlPower = new long[MAXB]; public static long[] bigPower = new long[MAXB]; @@ -105,20 +112,20 @@ public static void del(int num) { } public static void setAns(int len, int p, int id) { - int blen = (int) Math.sqrt(len); - int bnum = (len + blen - 1) / blen; + int blockLen = (int) Math.sqrt(len); + int blockNum = (len + blockLen - 1) / blockLen; smlPower[0] = 1; - for (int i = 1; i <= blen; i++) { + for (int i = 1; i <= blockLen; i++) { smlPower[i] = (smlPower[i - 1] << 1) % p; } bigPower[0] = 1; - for (int i = 1; i <= bnum; i++) { - bigPower[i] = (bigPower[i - 1] * smlPower[blen]) % p; + for (int i = 1; i <= blockNum; i++) { + bigPower[i] = (bigPower[i - 1] * smlPower[blockLen]) % p; } long res = 0, tmp; for (int t = head; t > 0; t = next[t]) { - tmp = bigPower[len / blen] * smlPower[len % blen] % p; - tmp -= bigPower[(len - t) / blen] * smlPower[(len - t) % blen] % p; + tmp = bigPower[len / blockLen] * smlPower[len % blockLen] % p; + tmp -= bigPower[(len - t) / blockLen] * smlPower[(len - t) % blockLen] % p; tmp = (tmp * sum[t]) % p; res = ((res + tmp) % p + p) % p; } diff --git a/src/class179/Code06_NotForget2.java b/src/class179/Code06_NotForget2.java index cc0c70ab7..7d9b74740 100644 --- a/src/class179/Code06_NotForget2.java +++ b/src/class179/Code06_NotForget2.java @@ -100,20 +100,20 @@ //} // //void setAns(int len, int p, int id) { -// int blen = (int)sqrt(len); -// int bnum = (len + blen - 1) / blen; +// int blockLen = (int)sqrt(len); +// int blockNum = (len + blockLen - 1) / blockLen; // smlPower[0] = 1; -// for (int i = 1; i <= blen; i++) { +// for (int i = 1; i <= blockLen; i++) { // smlPower[i] = (smlPower[i - 1] << 1) % p; // } // bigPower[0] = 1; -// for (int i = 1; i <= bnum; i++) { -// bigPower[i] = (bigPower[i - 1] * smlPower[blen]) % p; +// for (int i = 1; i <= blockNum; i++) { +// bigPower[i] = (bigPower[i - 1] * smlPower[blockLen]) % p; // } // long long res = 0, tmp; // for (int t = head; t > 0; t = nxt[t]) { -// tmp = bigPower[len / blen] * smlPower[len % blen] % p; -// tmp -= bigPower[(len - t) / blen] * smlPower[(len - t) % blen] % p; +// tmp = bigPower[len / blockLen] * smlPower[len % blockLen] % p; +// tmp -= bigPower[(len - t) / blockLen] * smlPower[(len - t) % blockLen] % p; // tmp = (tmp * sum[t]) % p; // res = ((res + tmp) % p + p) % p; // } From f085d46a59bccaf604f3a631aa72a6644a3fe8a9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 09:56:55 +0800 Subject: [PATCH 0788/1170] modify code --- src/class179/Code06_NotForget1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class179/Code06_NotForget1.java b/src/class179/Code06_NotForget1.java index 0a201778b..1b4605518 100644 --- a/src/class179/Code06_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -36,7 +36,7 @@ public class Code06_NotForget1 { public static int[] next = new int[MAXN]; // cnt[v] = c,表示v这个数出现了c次,也可以说v在c次桶里 - // sum[c] = x,表示c次桶内的所有数字,每种数字只统计一次,累加和为x + // sum[c] = x,表示c次桶内的数字,每种数字只统计一次,累加和为x public static int[] cnt = new int[MAXN]; public static long[] sum = new long[MAXN]; From 90059de11c3bc50b34fe923dc5f74f44fbb59b10 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 10:27:07 +0800 Subject: [PATCH 0789/1170] modify code --- src/class179/Code08_YnoiCornfield1.java | 25 ++++++++++++------------- src/class179/Code08_YnoiCornfield2.java | 25 ++++++++++++------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/class179/Code08_YnoiCornfield1.java b/src/class179/Code08_YnoiCornfield1.java index 336f5079a..53b8f2c96 100644 --- a/src/class179/Code08_YnoiCornfield1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -115,8 +115,8 @@ public boolean andOtherMoveRight(BitSet other, int k) { public static BitSet bitSet2 = new BitSet(MAXN); public static int[] cnt = new int[MAXN]; - public static int[] lastPos = new int[MAXN]; - public static int[] maxLeft = new int[MAXN]; + public static int[] pre = new int[MAXN]; + public static int[] dp = new int[MAXN]; public static boolean[] ans = new boolean[MAXN]; @@ -211,25 +211,24 @@ public static void compute() { public static void special() { for (int x = 1; x < blen; x++) { if (headq[x] != 0) { - Arrays.fill(lastPos, 0); - Arrays.fill(maxLeft, 0); - int last = 0; + Arrays.fill(pre, 0); + Arrays.fill(dp, 0); for (int i = 1; i <= n; i++) { - int val = arr[i]; - lastPos[val] = i; - if (val * x <= MAXV) { - last = Math.max(last, lastPos[val * x]); + int v = arr[i]; + pre[v] = i; + dp[i] = dp[i - 1]; + if (v * x <= MAXV) { + dp[i] = Math.max(dp[i], pre[v * x]); } - if (val % x == 0) { - last = Math.max(last, lastPos[val / x]); + if (v % x == 0) { + dp[i] = Math.max(dp[i], pre[v / x]); } - maxLeft[i] = last; } for (int q = headq[x]; q > 0; q = nextq[q]) { int l = ql[q]; int r = qr[q]; int id = qid[q]; - ans[id] = l <= maxLeft[r]; + ans[id] = l <= dp[r]; } } } diff --git a/src/class179/Code08_YnoiCornfield2.java b/src/class179/Code08_YnoiCornfield2.java index bedc3de69..ec3240b34 100644 --- a/src/class179/Code08_YnoiCornfield2.java +++ b/src/class179/Code08_YnoiCornfield2.java @@ -41,8 +41,8 @@ //bitset bitSet2; // //int cnt[MAXN]; -//int lastPos[MAXN]; -//int maxLeft[MAXN]; +//int pre[MAXN]; +//int dp[MAXN]; // //bool ans[MAXN]; // @@ -132,25 +132,24 @@ //void special() { // for (int x = 1; x < blen; x++) { // if (headq[x] != 0) { -// memset(lastPos, 0, sizeof(int) * (MAXV + 1)); -// memset(maxLeft, 0, sizeof(int) * (n + 1)); -// int last = 0; +// memset(pre, 0, sizeof(int) * (MAXV + 1)); +// memset(dp, 0, sizeof(int) * (n + 1)); // for (int i = 1; i <= n; i++) { -// int val = arr[i]; -// lastPos[val] = i; -// if (1LL * val * x <= MAXV) { -// last = max(last, lastPos[val * x]); +// int v = arr[i]; +// pre[v] = i; +// dp[i] = dp[i-1]; +// if (v * x <= MAXV) { +// dp[i] = max(dp[i], pre[v * x]); // } -// if (val % x == 0) { -// last = max(last, lastPos[val / x]); +// if (v % x == 0) { +// dp[i] = max(dp[i], pre[v / x]); // } -// maxLeft[i] = last; // } // for (int q = headq[x]; q > 0; q = nextq[q]) { // int l = ql[q]; // int r = qr[q]; // int id = qid[q]; -// ans[id] = (l <= maxLeft[r]); +// ans[id] = (l <= dp[r]); // } // } // } From 0859a3d813d8ae4188af46685244b8eaeae8b6c0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 10:42:12 +0800 Subject: [PATCH 0790/1170] modify code --- src/class179/Code08_YnoiCornfield1.java | 6 +++--- src/class179/Code08_YnoiCornfield2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class179/Code08_YnoiCornfield1.java b/src/class179/Code08_YnoiCornfield1.java index 53b8f2c96..e3657feed 100644 --- a/src/class179/Code08_YnoiCornfield1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -164,9 +164,9 @@ public static boolean calc(int op, int x) { } else if (op == 2) { return bitSet1.andOtherMoveRight(bitSet2, MAXV - x); } else if (op == 3) { - for (int d = 1; d * d <= x; d++) { - if (x % d == 0) { - if (bitSet1.status(d) && bitSet1.status(x / d)) { + for (int f = 1; f * f <= x; f++) { + if (x % f == 0) { + if (bitSet1.status(f) && bitSet1.status(x / f)) { return true; } } diff --git a/src/class179/Code08_YnoiCornfield2.java b/src/class179/Code08_YnoiCornfield2.java index ec3240b34..d186c8b09 100644 --- a/src/class179/Code08_YnoiCornfield2.java +++ b/src/class179/Code08_YnoiCornfield2.java @@ -87,9 +87,9 @@ // } else if (op == 2) { // return (bitSet1 & (bitSet2 >> (MAXV - x))).any(); // } else if (op == 3) { -// for (int d = 1; d * d <= x; d++) { -// if (x % d == 0) { -// if (bitSet1[d] && bitSet1[x / d]) { +// for (int f = 1; f * f <= x; f++) { +// if (x % f == 0) { +// if (bitSet1[f] && bitSet1[x / f]) { // return true; // } // } From 22492a73cc6df052e63292adb8eab13755f717e9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 11:04:03 +0800 Subject: [PATCH 0791/1170] modify code --- src/class179/Code06_NotForget1.java | 2 +- src/class179/Code06_NotForget2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class179/Code06_NotForget1.java b/src/class179/Code06_NotForget1.java index 1b4605518..2f5fb22c3 100644 --- a/src/class179/Code06_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -3,7 +3,7 @@ // 盼君勿忘,java版 // 一个序列中每种数字只保留一个,得到的累加和,叫做去重累加和 // 给定一个长度为n的数组arr,接下来是m条查询,查询格式如下 -// 查询 l r p : arr[l..r]范围上,累加每个子序列的去重累加和 % p 的结果打印 +// 查询 l r p : arr[l..r]范围上,每个子序列的去重累加和,都累加起来 % p 的结果打印 // 1 <= n、m、arr[i] <= 10^5 // 1 <= p <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5072 diff --git a/src/class179/Code06_NotForget2.java b/src/class179/Code06_NotForget2.java index 7d9b74740..0d5a56ba3 100644 --- a/src/class179/Code06_NotForget2.java +++ b/src/class179/Code06_NotForget2.java @@ -3,7 +3,7 @@ // 盼君勿忘,C++版 // 一个序列中每种数字只保留一个,得到的累加和,叫做去重累加和 // 给定一个长度为n的数组arr,接下来是m条查询,查询格式如下 -// 查询 l r p : arr[l..r]范围上,累加每个子序列的去重累加和 % p 的结果打印 +// 查询 l r p : arr[l..r]范围上,每个子序列的去重累加和,都累加起来 % p 的结果打印 // 1 <= n、m、arr[i] <= 10^5 // 1 <= p <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5072 From 421c7b76e64a4764a5c558b01de2fcf46e12001e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 12:42:15 +0800 Subject: [PATCH 0792/1170] modify code --- src/class179/Code06_NotForget1.java | 8 ++++---- src/class179/Code06_NotForget2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class179/Code06_NotForget1.java b/src/class179/Code06_NotForget1.java index 2f5fb22c3..3a3623939 100644 --- a/src/class179/Code06_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -122,11 +122,11 @@ public static void setAns(int len, int p, int id) { for (int i = 1; i <= blockNum; i++) { bigPower[i] = (bigPower[i - 1] * smlPower[blockLen]) % p; } - long res = 0, tmp; + long res = 0, p1, p2, tmp; + p1 = bigPower[len / blockLen] * smlPower[len % blockLen] % p; for (int t = head; t > 0; t = next[t]) { - tmp = bigPower[len / blockLen] * smlPower[len % blockLen] % p; - tmp -= bigPower[(len - t) / blockLen] * smlPower[(len - t) % blockLen] % p; - tmp = (tmp * sum[t]) % p; + p2 = bigPower[(len - t) / blockLen] * smlPower[(len - t) % blockLen] % p; + tmp = (p1 - p2) * sum[t] % p; res = ((res + tmp) % p + p) % p; } ans[id] = res; diff --git a/src/class179/Code06_NotForget2.java b/src/class179/Code06_NotForget2.java index 0d5a56ba3..53ff0b97b 100644 --- a/src/class179/Code06_NotForget2.java +++ b/src/class179/Code06_NotForget2.java @@ -110,11 +110,11 @@ // for (int i = 1; i <= blockNum; i++) { // bigPower[i] = (bigPower[i - 1] * smlPower[blockLen]) % p; // } -// long long res = 0, tmp; +// long long res = 0, p1, p2, tmp; +// p1 = bigPower[len / blockLen] * smlPower[len % blockLen] % p; // for (int t = head; t > 0; t = nxt[t]) { -// tmp = bigPower[len / blockLen] * smlPower[len % blockLen] % p; -// tmp -= bigPower[(len - t) / blockLen] * smlPower[(len - t) % blockLen] % p; -// tmp = (tmp * sum[t]) % p; +// p2 = bigPower[(len - t) / blockLen] * smlPower[(len - t) % blockLen] % p; +// tmp = (p1 - p2) * sum[t] % p; // res = ((res + tmp) % p + p) % p; // } // ans[id] = res; From fc6b663dbdebabc2dbf11d79da80b3542145e44b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 13:24:49 +0800 Subject: [PATCH 0793/1170] modify code --- src/class179/Code06_NotForget1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class179/Code06_NotForget1.java b/src/class179/Code06_NotForget1.java index 3a3623939..627e6ec8a 100644 --- a/src/class179/Code06_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -29,7 +29,7 @@ public class Code06_NotForget1 { public static int[][] query = new int[MAXN][4]; public static int[] bi = new int[MAXN]; - // 次数桶组成的链表 + // 有效次数桶组成的双向链表 // 有数字进入次数桶,该次数桶才进入链表,链表内部不需要有序组织 public static int head; public static int[] last = new int[MAXN]; @@ -122,6 +122,7 @@ public static void setAns(int len, int p, int id) { for (int i = 1; i <= blockNum; i++) { bigPower[i] = (bigPower[i - 1] * smlPower[blockLen]) % p; } + // t次桶的贡献 = [2的len次方 - 2的(len-t)次方] * sum[t] long res = 0, p1, p2, tmp; p1 = bigPower[len / blockLen] * smlPower[len % blockLen] % p; for (int t = head; t > 0; t = next[t]) { From 486088e54a2316acde6e6c1384674950dd890716 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 15:37:21 +0800 Subject: [PATCH 0794/1170] modify code --- src/class179/Code07_RabbitHole1.java | 9 ++++++++- src/class179/Code07_RabbitHole2.java | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/class179/Code07_RabbitHole1.java b/src/class179/Code07_RabbitHole1.java index b1ac8f65b..60c8f0545 100644 --- a/src/class179/Code07_RabbitHole1.java +++ b/src/class179/Code07_RabbitHole1.java @@ -71,13 +71,20 @@ public int getOnes() { public static int n, m; public static int[] arr = new int[MAXN]; public static int[][] query = new int[MAXT * 3][3]; + + // 排序之后不去重 + // 得到每个数字的排名 public static int[] sorted = new int[MAXN]; public static int[] bi = new int[MAXN]; + // cnt[v] = c,表示窗口中数字v出现c次 public static int[] cnt = new int[MAXN]; + // 当前窗口的位图 + public static BitSet curSet; + // 问题从来没获得位图就拷贝,问题获得过位图就做&运算 public static boolean[] hasSet = new boolean[MAXT]; + // 每个问题的位图 public static BitSet[] bitSet = new BitSet[MAXT]; - public static BitSet curSet; public static int[] ans = new int[MAXT]; diff --git a/src/class179/Code07_RabbitHole2.java b/src/class179/Code07_RabbitHole2.java index ca8b90594..bab7f4ebc 100644 --- a/src/class179/Code07_RabbitHole2.java +++ b/src/class179/Code07_RabbitHole2.java @@ -25,13 +25,14 @@ //const int MAXT = 30001; //int n, m; //int arr[MAXN]; +// //int sorted[MAXN]; //int bi[MAXN]; // //int cnt[MAXN]; +//bitset curSet; //bool hasSet[MAXT]; //bitset bitSet[MAXT]; -//bitset curSet; // //Query query[MAXT * 3]; // From 916e033436320a7699ac49c2a453ad1dcc5dabea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 16:05:44 +0800 Subject: [PATCH 0795/1170] modify code --- src/class179/Code08_YnoiCornfield1.java | 28 ++++--------------------- src/class179/Code08_YnoiCornfield2.java | 2 +- 2 files changed, 5 insertions(+), 25 deletions(-) diff --git a/src/class179/Code08_YnoiCornfield1.java b/src/class179/Code08_YnoiCornfield1.java index e3657feed..ddae22a49 100644 --- a/src/class179/Code08_YnoiCornfield1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -50,27 +50,7 @@ public boolean andOther(BitSet other) { return false; } - // 检查 自己 & 自己左移k位 是否有非零位 - public boolean andSelfMoveLeft(int k) { - int ws = k >> 6; - int bs = k & 63; - for (int i = len - 1; i >= 0; i--) { - int src = i - ws; - if (src < 0) { - break; - } - long shifted = (status[src] << bs); - if (bs != 0 && src - 1 >= 0) { - shifted |= (status[src - 1] >>> (64 - bs)); - } - if ((status[i] & shifted) != 0L) { - return true; - } - } - return false; - } - - // 检查 自己 & other右移k位 是否有非零位 + // 检查 自己 & other右移k位 是否有1存在 public boolean andOtherMoveRight(BitSet other, int k) { int ws = k >> 6; int bs = k & 63; @@ -79,9 +59,9 @@ public boolean andOtherMoveRight(BitSet other, int k) { if (src >= len) { break; } - long shifted = (other.status[src] >>> bs); + long shifted = other.status[src] >>> bs; if (bs != 0 && src + 1 < len) { - shifted |= (other.status[src + 1] << (64 - bs)); + shifted |= other.status[src + 1] << (64 - bs); } if ((status[i] & shifted) != 0L) { return true; @@ -160,7 +140,7 @@ public static void del(int x) { public static boolean calc(int op, int x) { if (op == 1) { - return bitSet1.andSelfMoveLeft(x); + return bitSet1.andOtherMoveRight(bitSet1, x); } else if (op == 2) { return bitSet1.andOtherMoveRight(bitSet2, MAXV - x); } else if (op == 3) { diff --git a/src/class179/Code08_YnoiCornfield2.java b/src/class179/Code08_YnoiCornfield2.java index d186c8b09..c4fbda333 100644 --- a/src/class179/Code08_YnoiCornfield2.java +++ b/src/class179/Code08_YnoiCornfield2.java @@ -83,7 +83,7 @@ // //bool calc(int op, int x) { // if (op == 1) { -// return (bitSet1 & (bitSet1 << x)).any(); +// return (bitSet1 & (bitSet1 >> x)).any(); // } else if (op == 2) { // return (bitSet1 & (bitSet2 >> (MAXV - x))).any(); // } else if (op == 3) { From e688fa7dc36216af0e81344d32426dc0720d86f5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 17:35:05 +0800 Subject: [PATCH 0796/1170] modify code --- src/class179/Code08_YnoiCornfield1.java | 6 ++---- src/class179/Code08_YnoiCornfield2.java | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/class179/Code08_YnoiCornfield1.java b/src/class179/Code08_YnoiCornfield1.java index ddae22a49..c26add98c 100644 --- a/src/class179/Code08_YnoiCornfield1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -145,10 +145,8 @@ public static boolean calc(int op, int x) { return bitSet1.andOtherMoveRight(bitSet2, MAXV - x); } else if (op == 3) { for (int f = 1; f * f <= x; f++) { - if (x % f == 0) { - if (bitSet1.status(f) && bitSet1.status(x / f)) { - return true; - } + if (x % f == 0 && bitSet1.status(f) && bitSet1.status(x / f)) { + return true; } } return false; diff --git a/src/class179/Code08_YnoiCornfield2.java b/src/class179/Code08_YnoiCornfield2.java index c4fbda333..e5586a9d5 100644 --- a/src/class179/Code08_YnoiCornfield2.java +++ b/src/class179/Code08_YnoiCornfield2.java @@ -88,10 +88,8 @@ // return (bitSet1 & (bitSet2 >> (MAXV - x))).any(); // } else if (op == 3) { // for (int f = 1; f * f <= x; f++) { -// if (x % f == 0) { -// if (bitSet1[f] && bitSet1[x / f]) { +// if (x % f == 0 && bitSet1[f] && bitSet1[x / f]) { // return true; -// } // } // } // return false; From a140ab6be60765e2f6ce74536c60b6f6d99340ea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 17:56:18 +0800 Subject: [PATCH 0797/1170] modify code --- src/class179/Code08_YnoiCornfield1.java | 25 +++++++++---------------- src/class179/Code08_YnoiCornfield2.java | 2 +- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/class179/Code08_YnoiCornfield1.java b/src/class179/Code08_YnoiCornfield1.java index c26add98c..83aeb6f02 100644 --- a/src/class179/Code08_YnoiCornfield1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -37,23 +37,14 @@ public void setZero(int bit) { status[bit >> 6] &= ~(1L << (bit & 63)); } - public boolean status(int bit) { + public boolean getStatus(int bit) { return ((status[bit >> 6] >> (bit & 63)) & 1L) != 0L; } - public boolean andOther(BitSet other) { - for (int i = 0; i < len; i++) { - if ((status[i] & other.status[i]) != 0L) { - return true; - } - } - return false; - } - // 检查 自己 & other右移k位 是否有1存在 - public boolean andOtherMoveRight(BitSet other, int k) { - int ws = k >> 6; - int bs = k & 63; + public boolean andOtherMoveRight(BitSet other, int move) { + int ws = move >> 6; + int bs = move & 63; for (int i = 0; i < len; i++) { int src = i + ws; if (src >= len) { @@ -91,10 +82,12 @@ public boolean andOtherMoveRight(BitSet other, int k) { public static int[] qid = new int[MAXN]; public static int cnts; + // 数字出现的词频 + public static int[] cnt = new int[MAXN]; public static BitSet bitSet1 = new BitSet(MAXN); public static BitSet bitSet2 = new BitSet(MAXN); - public static int[] cnt = new int[MAXN]; + // 特别查询的dp过程 public static int[] pre = new int[MAXN]; public static int[] dp = new int[MAXN]; @@ -145,7 +138,7 @@ public static boolean calc(int op, int x) { return bitSet1.andOtherMoveRight(bitSet2, MAXV - x); } else if (op == 3) { for (int f = 1; f * f <= x; f++) { - if (x % f == 0 && bitSet1.status(f) && bitSet1.status(x / f)) { + if (x % f == 0 && bitSet1.getStatus(f) && bitSet1.getStatus(x / f)) { return true; } } @@ -153,7 +146,7 @@ public static boolean calc(int op, int x) { } else { if (x >= 1) { for (int i = 1; i * x <= MAXV; i++) { - if (bitSet1.status(i) && bitSet1.status(i * x)) { + if (bitSet1.getStatus(i) && bitSet1.getStatus(i * x)) { return true; } } diff --git a/src/class179/Code08_YnoiCornfield2.java b/src/class179/Code08_YnoiCornfield2.java index e5586a9d5..cca64204f 100644 --- a/src/class179/Code08_YnoiCornfield2.java +++ b/src/class179/Code08_YnoiCornfield2.java @@ -37,10 +37,10 @@ //int qid[MAXN]; //int cnts = 0; // +//int cnt[MAXN]; //bitset bitSet1; //bitset bitSet2; // -//int cnt[MAXN]; //int pre[MAXN]; //int dp[MAXN]; // From 931d279d81d5258ff7fb38321f538ba0ef99b127 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 18:04:13 +0800 Subject: [PATCH 0798/1170] modify code --- src/class179/Code08_YnoiCornfield1.java | 2 +- src/class179/Code08_YnoiCornfield2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class179/Code08_YnoiCornfield1.java b/src/class179/Code08_YnoiCornfield1.java index 83aeb6f02..d97b8ee75 100644 --- a/src/class179/Code08_YnoiCornfield1.java +++ b/src/class179/Code08_YnoiCornfield1.java @@ -210,7 +210,7 @@ public static void main(String[] args) throws Exception { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); m = in.nextInt(); - blen = (int) Math.sqrt(n); + blen = (int) Math.sqrt(MAXV); for (int i = 1; i <= n; i++) { bi[i] = (i - 1) / blen + 1; } diff --git a/src/class179/Code08_YnoiCornfield2.java b/src/class179/Code08_YnoiCornfield2.java index cca64204f..ccd8851fd 100644 --- a/src/class179/Code08_YnoiCornfield2.java +++ b/src/class179/Code08_YnoiCornfield2.java @@ -157,7 +157,7 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m; -// blen = (int)sqrt(n); +// blen = (int)sqrt(MAXV); // for (int i = 1; i <= n; i++) { // bi[i] = (i - 1) / blen + 1; // } From addd8092bcebf84a878fca5d197c40f7fa3bc6d7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 18:23:56 +0800 Subject: [PATCH 0799/1170] modify code --- ...74\345\220\210\345\272\224\347\224\250.pptx" | Bin 0 -> 54011 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243179\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2304-\350\216\253\351\230\237\347\273\274\345\220\210\345\272\224\347\224\250.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243179\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2304-\350\216\253\351\230\237\347\273\274\345\220\210\345\272\224\347\224\250.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243179\343\200\220\346\214\272\351\232\276\343\200\221\350\216\253\351\230\237\344\270\223\351\242\2304-\350\216\253\351\230\237\347\273\274\345\220\210\345\272\224\347\224\250.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..873f6938995dd6bdf5928935257a63413e3cb5b4 GIT binary patch literal 54011 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%0AfCz5Vjmf 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 Mfc=uM%@?2k2Mi?>SpWb4 literal 0 HcmV?d00001 From d31e15fdc55b416bac353e118fdb2252a6b01f2b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Oct 2025 19:56:09 +0800 Subject: [PATCH 0800/1170] modify code --- src/class179/Code06_NotForget1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class179/Code06_NotForget1.java b/src/class179/Code06_NotForget1.java index 627e6ec8a..28c9efe44 100644 --- a/src/class179/Code06_NotForget1.java +++ b/src/class179/Code06_NotForget1.java @@ -40,6 +40,7 @@ public class Code06_NotForget1 { public static int[] cnt = new int[MAXN]; public static long[] sum = new long[MAXN]; + // 光速幂 // 假设[l..r]范围长度len,blockLen为块的长度,blockNum为块的数量 // smlPower[i],表示p的i次方的值,i <= blockLen // bigPower[i],表示p的(i * blockLen)次方的值,i <= blockNum @@ -112,6 +113,8 @@ public static void del(int num) { } public static void setAns(int len, int p, int id) { + // 光速幂 + // 构建smlPower和bigPower int blockLen = (int) Math.sqrt(len); int blockNum = (len + blockLen - 1) / blockLen; smlPower[0] = 1; From ad968808d99e36145ef8122913563bc455851e4b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 5 Oct 2025 22:34:54 +0800 Subject: [PATCH 0801/1170] modify code --- src/class180/Code01_VirtualTree1.java | 270 ++++++++++++++++++++++++++ src/class180/Code02_War1.java | 246 +++++++++++++++++++++++ 2 files changed, 516 insertions(+) create mode 100644 src/class180/Code01_VirtualTree1.java create mode 100644 src/class180/Code02_War1.java diff --git a/src/class180/Code01_VirtualTree1.java b/src/class180/Code01_VirtualTree1.java new file mode 100644 index 000000000..303b8c086 --- /dev/null +++ b/src/class180/Code01_VirtualTree1.java @@ -0,0 +1,270 @@ +package class180; + +// 虚树模版题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF613D +// 测试链接 : https://codeforces.com/problemset/problem/613/D +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_VirtualTree1 { + + public static int MAXN = 100001; + public static int MAXP = 20; + public static int n, q, k; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXN << 1]; + public static int[] tog = new int[MAXN << 1]; + public static int cntg; + + public static int[] headv = new int[MAXN]; + public static int[] nextv = new int[MAXN]; + public static int[] tov = new int[MAXN]; + public static int cntv; + + public static int[] dep = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + public static int cntd; + + // 节点编号、dfn序 + public static int[][] arr = new int[MAXN][2]; + public static boolean[] isKey = new boolean[MAXN]; + + // 第一种建树方式 + public static int[][] tmp = new int[MAXN << 1][2]; + + // 第二种建树方式 + public static int[] stack = new int[MAXN]; + public static int top; + + public static int[] siz = new int[MAXN]; + public static int[] dp = new int[MAXN]; + + public static void addEdgeG(int u, int v) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + headg[u] = cntg; + } + + public static void addEdgeV(int u, int v) { + nextv[++cntv] = headv[u]; + tov[cntv] = v; + headv[u] = cntv; + } + + public static void dfs(int u, int fa) { + dep[u] = dep[fa] + 1; + dfn[u] = ++cntd; + stjump[u][0] = fa; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = headg[u]; e > 0; e = nextg[e]) { + if (tog[e] != fa) { + dfs(tog[e], u); + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + // 二次排序 + LCA连边的方式建立虚树 + public static void buildVirtualTree1() { + Arrays.sort(arr, 1, k + 1, (a, b) -> a[1] - b[1]); + int len = 0; + for (int i = 1; i < k; i++) { + tmp[++len][0] = arr[i][0]; + tmp[len][1] = arr[i][1]; + int lca = getLca(arr[i][0], arr[i + 1][0]); + tmp[++len][0] = lca; + tmp[len][1] = dfn[lca]; + } + tmp[++len][0] = arr[k][0]; + tmp[len][1] = arr[k][1]; + tmp[++len][0] = 1; + tmp[len][1] = dfn[1]; + Arrays.sort(tmp, 1, len + 1, (a, b) -> a[1] - b[1]); + int unique = 1; + for (int i = 2; i <= len; i++) { + if (tmp[unique][0] != tmp[i][0]) { + tmp[++unique][0] = tmp[i][0]; + tmp[unique][1] = tmp[i][1]; + } + } + cntv = 0; + for (int i = 1; i <= unique; i++) { + headv[tmp[i][0]] = 0; + } + for (int i = 1; i < unique; i++) { + addEdgeV(getLca(tmp[i][0], tmp[i + 1][0]), tmp[i + 1][0]); + } + } + + // 单调栈的方式建立虚树 + public static void buildVirtualTree2() { + Arrays.sort(arr, 1, k + 1, (a, b) -> a[1] - b[1]); + cntv = 0; + top = 0; + headv[1] = 0; + stack[++top] = 1; + for (int i = 1; i <= k; i++) { + int x = arr[i][0]; + if (x == 1) { + continue; + } + int y = stack[top]; + int lca = getLca(x, y); + while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { + addEdgeV(stack[top - 1], stack[top]); + top--; + } + if (lca != stack[top]) { + headv[lca] = 0; + addEdgeV(lca, stack[top]); + top--; + stack[++top] = lca; + } + headv[x] = 0; + stack[++top] = x; + } + while (top > 1) { + addEdgeV(stack[top - 1], stack[top]); + top--; + } + } + + public static void dpOnTree(int u, int fa) { + dp[u] = siz[u] = 0; + for (int e = headv[u], v; e > 0; e = nextv[e]) { + v = tov[e]; + if (v != fa) { + dpOnTree(v, u); + dp[u] += dp[v]; + siz[u] += siz[v]; + } + } + if (isKey[u]) { + dp[u] += siz[u]; + siz[u] = 1; + } else if (siz[u] > 1) { + dp[u]++; + siz[u] = 0; + } + } + + public static int compute() { + for (int i = 1; i <= k; i++) { + isKey[arr[i][0]] = true; + } + boolean check = true; + for (int i = 1; i <= k; i++) { + if (isKey[stjump[arr[i][0]][0]]) { + check = false; + break; + } + } + int ans = -1; + if (check) { + // buildVirtualTree1(); + buildVirtualTree2(); + dpOnTree(1, 0); + ans = dp[1]; + } + for (int i = 1; i <= k; i++) { + isKey[arr[i][0]] = false; + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdgeG(u, v); + addEdgeG(v, u); + } + dfs(1, 0); + q = in.nextInt(); + for (int t = 1; t <= q; t++) { + k = in.nextInt(); + for (int i = 1, node; i <= k; i++) { + node = in.nextInt(); + arr[i][0] = node; + arr[i][1] = dfn[node]; + } + out.println(compute()); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class180/Code02_War1.java b/src/class180/Code02_War1.java new file mode 100644 index 000000000..64cc76b71 --- /dev/null +++ b/src/class180/Code02_War1.java @@ -0,0 +1,246 @@ +package class180; + +// 消耗战,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2495 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code02_War1 { + + public static int MAXN = 300001; + public static int MAXP = 20; + public static int n, m, k; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXN << 1]; + public static int[] tog = new int[MAXN << 1]; + public static int[] weightg = new int[MAXN << 1]; + public static int cntg; + + public static int[] headv = new int[MAXN]; + public static int[] nextv = new int[MAXN]; + public static int[] tov = new int[MAXN]; + public static int[] weightv = new int[MAXN]; + public static int cntv; + + public static int[] dep = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + public static int[][] mindist = new int[MAXN][MAXP]; + public static int cntd; + + // 节点编号、dfn序 + public static int[][] arr = new int[MAXN][2]; + public static boolean[] isKey = new boolean[MAXN]; + public static int[] stack = new int[MAXN]; + public static int top; + + public static long[] dp = new long[MAXN]; + + public static void addEdgeG(int u, int v, int w) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + weightg[cntg] = w; + headg[u] = cntg; + } + + public static void addEdgeV(int u, int v, int w) { + nextv[++cntv] = headv[u]; + tov[cntv] = v; + weightv[cntv] = w; + headv[u] = cntv; + } + + public static void dfs(int u, int fa, int w) { + dep[u] = dep[fa] + 1; + dfn[u] = ++cntd; + stjump[u][0] = fa; + mindist[u][0] = w; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + mindist[u][p] = Math.min(mindist[u][p - 1], mindist[stjump[u][p - 1]][p - 1]); + } + for (int e = headg[u]; e > 0; e = nextg[e]) { + if (tog[e] != fa) { + dfs(tog[e], u, weightg[e]); + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static int getDist(int a, int b) { + int dist = 100000001; + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + dist = Math.min(dist, mindist[a][p]); + a = stjump[a][p]; + } + } + if (a == b) { + return dist; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + dist = Math.min(dist, Math.min(mindist[a][p], mindist[b][p])); + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return dist; + } + + public static void buildVirtualTree() { + Arrays.sort(arr, 1, k + 1, (a, b) -> a[1] - b[1]); + cntv = 0; + top = 0; + headv[1] = 0; + stack[++top] = 1; + for (int i = 1; i <= k; i++) { + int x = arr[i][0]; + int y = stack[top]; + int lca = getLca(x, y); + while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { + addEdgeV(stack[top - 1], stack[top], getDist(stack[top - 1], stack[top])); + top--; + } + if (lca != stack[top]) { + headv[lca] = 0; + addEdgeV(lca, stack[top], getDist(lca, stack[top])); + top--; + stack[++top] = lca; + } + headv[x] = 0; + stack[++top] = x; + } + while (top > 1) { + addEdgeV(stack[top - 1], stack[top], getDist(stack[top - 1], stack[top])); + top--; + } + } + + public static void dpOnTree(int u) { + for (int e = headv[u]; e > 0; e = nextv[e]) { + dpOnTree(tov[e]); + } + dp[u] = 0; + for (int e = headv[u], v, w; e > 0; e = nextv[e]) { + v = tov[e]; + w = weightv[e]; + if (isKey[v]) { + dp[u] += w; + } else { + dp[u] += Math.min(dp[v], w); + } + } + } + + public static long compute() { + buildVirtualTree(); + for (int i = 1; i <= k; i++) { + isKey[arr[i][0]] = true; + } + dpOnTree(1); + for (int i = 1; i <= k; i++) { + isKey[arr[i][0]] = false; + } + return dp[1]; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdgeG(u, v, w); + addEdgeG(v, u, w); + } + dfs(1, 0, 0); + m = in.nextInt(); + for (int t = 1; t <= m; t++) { + k = in.nextInt(); + for (int i = 1, node; i <= k; i++) { + node = in.nextInt(); + arr[i][0] = node; + arr[i][1] = dfn[node]; + } + out.println(compute()); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 0ef834afd986b2ffaecbc452d81c7832f6d71fa5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 5 Oct 2025 22:36:20 +0800 Subject: [PATCH 0802/1170] modify code --- src/class180/Code02_War1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class180/Code02_War1.java b/src/class180/Code02_War1.java index 64cc76b71..81f8f7b58 100644 --- a/src/class180/Code02_War1.java +++ b/src/class180/Code02_War1.java @@ -121,6 +121,7 @@ public static int getDist(int a, int b) { return dist; } + // 单调栈的方式建立虚树 public static void buildVirtualTree() { Arrays.sort(arr, 1, k + 1, (a, b) -> a[1] - b[1]); cntv = 0; From 809d2bfc3ce5224f77aa42ada26ab35ff0c7da45 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 6 Oct 2025 09:19:21 +0800 Subject: [PATCH 0803/1170] modify code --- src/class142/Code04_Measurer1.java | 32 ++++++++++++++++++++---------- src/class142/Code04_Measurer2.java | 5 ++++- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/class142/Code04_Measurer1.java b/src/class142/Code04_Measurer1.java index 9fa58f560..11a1a7e00 100644 --- a/src/class142/Code04_Measurer1.java +++ b/src/class142/Code04_Measurer1.java @@ -105,7 +105,10 @@ public static boolean check(double limit) { // 倍杀关系的建边 for (int i = 1; i <= m1; i++) { if (vow[i][0] == 1) { - addEdge(vow[i][1], vow[i][2], -Math.log(-limit + vow[i][3])); + // 课上的代码没有这个判断,加上才是正确的,防止log里出现负数 + if (-limit + vow[i][3] >= 0) { + addEdge(vow[i][1], vow[i][2], -Math.log(-limit + vow[i][3])); + } } else { // 因为类型2的誓言是<关系,所以减去最小精度后,就可以认为是<=关系 addEdge(vow[i][1], vow[i][2], Math.log(limit + vow[i][3] - sml)); @@ -152,18 +155,27 @@ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - in.nextToken(); n = (int) in.nval; - in.nextToken(); m1 = (int) in.nval; - in.nextToken(); m2 = (int) in.nval; + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m1 = (int) in.nval; + in.nextToken(); + m2 = (int) in.nval; for (int i = 1; i <= m1; i++) { - in.nextToken(); vow[i][0] = (int) in.nval; - in.nextToken(); vow[i][1] = (int) in.nval; - in.nextToken(); vow[i][2] = (int) in.nval; - in.nextToken(); vow[i][3] = (int) in.nval; + in.nextToken(); + vow[i][0] = (int) in.nval; + in.nextToken(); + vow[i][1] = (int) in.nval; + in.nextToken(); + vow[i][2] = (int) in.nval; + in.nextToken(); + vow[i][3] = (int) in.nval; } for (int i = 1; i <= m2; i++) { - in.nextToken(); score[i][0] = (int) in.nval; - in.nextToken(); score[i][1] = (int) in.nval; + in.nextToken(); + score[i][0] = (int) in.nval; + in.nextToken(); + score[i][1] = (int) in.nval; } double ans = compute(); if (ans == 0) { diff --git a/src/class142/Code04_Measurer2.java b/src/class142/Code04_Measurer2.java index e31364eba..7e4ec34a6 100644 --- a/src/class142/Code04_Measurer2.java +++ b/src/class142/Code04_Measurer2.java @@ -89,7 +89,10 @@ public static boolean check(double limit) { } for (int i = 1; i <= m1; i++) { if (vow[i][0] == 1) { - addEdge(vow[i][1], vow[i][2], -Math.log(-limit + vow[i][3])); + // 课上的代码没有这个判断,加上才是正确的,防止log里出现负数 + if (-limit + vow[i][3] >= 0) { + addEdge(vow[i][1], vow[i][2], -Math.log(-limit + vow[i][3])); + } } else { addEdge(vow[i][1], vow[i][2], Math.log(limit + vow[i][3])); } From a4775115a1dfcfb0c5bc11af4efad941c929992b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 6 Oct 2025 09:47:45 +0800 Subject: [PATCH 0804/1170] modify code --- src/class180/Code01_VirtualTree1.java | 65 +++++++++++++++------------ src/class180/Code02_War1.java | 35 ++++++++++----- 2 files changed, 60 insertions(+), 40 deletions(-) diff --git a/src/class180/Code01_VirtualTree1.java b/src/class180/Code01_VirtualTree1.java index 303b8c086..bd7a1b5e1 100644 --- a/src/class180/Code01_VirtualTree1.java +++ b/src/class180/Code01_VirtualTree1.java @@ -9,7 +9,6 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.util.Arrays; public class Code01_VirtualTree1 { @@ -32,12 +31,11 @@ public class Code01_VirtualTree1 { public static int[][] stjump = new int[MAXN][MAXP]; public static int cntd; - // 节点编号、dfn序 - public static int[][] arr = new int[MAXN][2]; + public static int[] arr = new int[MAXN]; public static boolean[] isKey = new boolean[MAXN]; // 第一种建树方式 - public static int[][] tmp = new int[MAXN << 1][2]; + public static int[] tmp = new int[MAXN << 1]; // 第二种建树方式 public static int[] stack = new int[MAXN]; @@ -58,6 +56,23 @@ public static void addEdgeV(int u, int v) { headv[u] = cntv; } + // nums中的数,根据dfn的大小排序,手撸双指针快排 + public static void sortByDfn(int[] nums, int l, int r) { + if (l >= r) return; + int i = l, j = r; + int pivot = nums[(l + r) >> 1]; + while (i <= j) { + while (dfn[nums[i]] < dfn[pivot]) i++; + while (dfn[nums[j]] > dfn[pivot]) j--; + if (i <= j) { + int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; + i++; j--; + } + } + sortByDfn(nums, l, j); + sortByDfn(nums, i, r); + } + public static void dfs(int u, int fa) { dep[u] = dep[fa] + 1; dfn[u] = ++cntd; @@ -97,45 +112,39 @@ public static int getLca(int a, int b) { // 二次排序 + LCA连边的方式建立虚树 public static void buildVirtualTree1() { - Arrays.sort(arr, 1, k + 1, (a, b) -> a[1] - b[1]); + sortByDfn(arr, 1, k); int len = 0; for (int i = 1; i < k; i++) { - tmp[++len][0] = arr[i][0]; - tmp[len][1] = arr[i][1]; - int lca = getLca(arr[i][0], arr[i + 1][0]); - tmp[++len][0] = lca; - tmp[len][1] = dfn[lca]; + tmp[++len] = arr[i]; + tmp[++len] = getLca(arr[i], arr[i + 1]); } - tmp[++len][0] = arr[k][0]; - tmp[len][1] = arr[k][1]; - tmp[++len][0] = 1; - tmp[len][1] = dfn[1]; - Arrays.sort(tmp, 1, len + 1, (a, b) -> a[1] - b[1]); + tmp[++len] = arr[k]; + tmp[++len] = 1; + sortByDfn(tmp, 1, len); int unique = 1; for (int i = 2; i <= len; i++) { - if (tmp[unique][0] != tmp[i][0]) { - tmp[++unique][0] = tmp[i][0]; - tmp[unique][1] = tmp[i][1]; + if (tmp[unique] != tmp[i]) { + tmp[++unique] = tmp[i]; } } cntv = 0; for (int i = 1; i <= unique; i++) { - headv[tmp[i][0]] = 0; + headv[tmp[i]] = 0; } for (int i = 1; i < unique; i++) { - addEdgeV(getLca(tmp[i][0], tmp[i + 1][0]), tmp[i + 1][0]); + addEdgeV(getLca(tmp[i], tmp[i + 1]), tmp[i + 1]); } } // 单调栈的方式建立虚树 public static void buildVirtualTree2() { - Arrays.sort(arr, 1, k + 1, (a, b) -> a[1] - b[1]); + sortByDfn(arr, 1, k); cntv = 0; top = 0; headv[1] = 0; stack[++top] = 1; for (int i = 1; i <= k; i++) { - int x = arr[i][0]; + int x = arr[i]; if (x == 1) { continue; } @@ -181,11 +190,11 @@ public static void dpOnTree(int u, int fa) { public static int compute() { for (int i = 1; i <= k; i++) { - isKey[arr[i][0]] = true; + isKey[arr[i]] = true; } boolean check = true; for (int i = 1; i <= k; i++) { - if (isKey[stjump[arr[i][0]][0]]) { + if (isKey[stjump[arr[i]][0]]) { check = false; break; } @@ -198,7 +207,7 @@ public static int compute() { ans = dp[1]; } for (int i = 1; i <= k; i++) { - isKey[arr[i][0]] = false; + isKey[arr[i]] = false; } return ans; } @@ -217,10 +226,8 @@ public static void main(String[] args) throws Exception { q = in.nextInt(); for (int t = 1; t <= q; t++) { k = in.nextInt(); - for (int i = 1, node; i <= k; i++) { - node = in.nextInt(); - arr[i][0] = node; - arr[i][1] = dfn[node]; + for (int i = 1; i <= k; i++) { + arr[i] = in.nextInt(); } out.println(compute()); } diff --git a/src/class180/Code02_War1.java b/src/class180/Code02_War1.java index 81f8f7b58..fc7498f27 100644 --- a/src/class180/Code02_War1.java +++ b/src/class180/Code02_War1.java @@ -8,7 +8,6 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.util.Arrays; public class Code02_War1 { @@ -34,8 +33,7 @@ public class Code02_War1 { public static int[][] mindist = new int[MAXN][MAXP]; public static int cntd; - // 节点编号、dfn序 - public static int[][] arr = new int[MAXN][2]; + public static int[] arr = new int[MAXN]; public static boolean[] isKey = new boolean[MAXN]; public static int[] stack = new int[MAXN]; public static int top; @@ -56,6 +54,23 @@ public static void addEdgeV(int u, int v, int w) { headv[u] = cntv; } + // nums中的数,根据dfn的大小排序,手撸双指针快排 + public static void sortByDfn(int[] nums, int l, int r) { + if (l >= r) return; + int i = l, j = r; + int pivot = nums[(l + r) >> 1]; + while (i <= j) { + while (dfn[nums[i]] < dfn[pivot]) i++; + while (dfn[nums[j]] > dfn[pivot]) j--; + if (i <= j) { + int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; + i++; j--; + } + } + sortByDfn(nums, l, j); + sortByDfn(nums, i, r); + } + public static void dfs(int u, int fa, int w) { dep[u] = dep[fa] + 1; dfn[u] = ++cntd; @@ -123,13 +138,13 @@ public static int getDist(int a, int b) { // 单调栈的方式建立虚树 public static void buildVirtualTree() { - Arrays.sort(arr, 1, k + 1, (a, b) -> a[1] - b[1]); + sortByDfn(arr, 1, k); cntv = 0; top = 0; headv[1] = 0; stack[++top] = 1; for (int i = 1; i <= k; i++) { - int x = arr[i][0]; + int x = arr[i]; int y = stack[top]; int lca = getLca(x, y); while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { @@ -170,11 +185,11 @@ public static void dpOnTree(int u) { public static long compute() { buildVirtualTree(); for (int i = 1; i <= k; i++) { - isKey[arr[i][0]] = true; + isKey[arr[i]] = true; } dpOnTree(1); for (int i = 1; i <= k; i++) { - isKey[arr[i][0]] = false; + isKey[arr[i]] = false; } return dp[1]; } @@ -194,10 +209,8 @@ public static void main(String[] args) throws Exception { m = in.nextInt(); for (int t = 1; t <= m; t++) { k = in.nextInt(); - for (int i = 1, node; i <= k; i++) { - node = in.nextInt(); - arr[i][0] = node; - arr[i][1] = dfn[node]; + for (int i = 1; i <= k; i++) { + arr[i] = in.nextInt(); } out.println(compute()); } From c4f4fb4a43419807e2bdfd5e65ba1555a1869d4c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 6 Oct 2025 09:48:15 +0800 Subject: [PATCH 0805/1170] modify code --- src/class180/Code02_War1.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class180/Code02_War1.java b/src/class180/Code02_War1.java index fc7498f27..679c7c945 100644 --- a/src/class180/Code02_War1.java +++ b/src/class180/Code02_War1.java @@ -54,7 +54,6 @@ public static void addEdgeV(int u, int v, int w) { headv[u] = cntv; } - // nums中的数,根据dfn的大小排序,手撸双指针快排 public static void sortByDfn(int[] nums, int l, int r) { if (l >= r) return; int i = l, j = r; From 23c9dd536f863864166502aca416308c514110c0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 6 Oct 2025 09:55:50 +0800 Subject: [PATCH 0806/1170] modify code --- src/class180/Code02_War1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class180/Code02_War1.java b/src/class180/Code02_War1.java index 679c7c945..68f8cb45d 100644 --- a/src/class180/Code02_War1.java +++ b/src/class180/Code02_War1.java @@ -144,6 +144,9 @@ public static void buildVirtualTree() { stack[++top] = 1; for (int i = 1; i <= k; i++) { int x = arr[i]; + if (x == 1) { + continue; + } int y = stack[top]; int lca = getLca(x, y); while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { From f42b690631dc99c7b0fd6b75692d2abec905b1e0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 6 Oct 2025 15:46:49 +0800 Subject: [PATCH 0807/1170] modify code --- src/class180/Code01_VirtualTree1.java | 3 +-- src/class180/Code02_War1.java | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/class180/Code01_VirtualTree1.java b/src/class180/Code01_VirtualTree1.java index bd7a1b5e1..50d7b9c3d 100644 --- a/src/class180/Code01_VirtualTree1.java +++ b/src/class180/Code01_VirtualTree1.java @@ -39,7 +39,6 @@ public class Code01_VirtualTree1 { // 第二种建树方式 public static int[] stack = new int[MAXN]; - public static int top; public static int[] siz = new int[MAXN]; public static int[] dp = new int[MAXN]; @@ -140,8 +139,8 @@ public static void buildVirtualTree1() { public static void buildVirtualTree2() { sortByDfn(arr, 1, k); cntv = 0; - top = 0; headv[1] = 0; + int top = 0; stack[++top] = 1; for (int i = 1; i <= k; i++) { int x = arr[i]; diff --git a/src/class180/Code02_War1.java b/src/class180/Code02_War1.java index 68f8cb45d..8127cb731 100644 --- a/src/class180/Code02_War1.java +++ b/src/class180/Code02_War1.java @@ -36,8 +36,6 @@ public class Code02_War1 { public static int[] arr = new int[MAXN]; public static boolean[] isKey = new boolean[MAXN]; public static int[] stack = new int[MAXN]; - public static int top; - public static long[] dp = new long[MAXN]; public static void addEdgeG(int u, int v, int w) { @@ -139,8 +137,8 @@ public static int getDist(int a, int b) { public static void buildVirtualTree() { sortByDfn(arr, 1, k); cntv = 0; - top = 0; headv[1] = 0; + int top = 0; stack[++top] = 1; for (int i = 1; i <= k; i++) { int x = arr[i]; From 8e6833ecbd5bd90d396b762033cb1b8796ff4a13 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 7 Oct 2025 10:53:26 +0800 Subject: [PATCH 0808/1170] modify code --- src/class106/HashFunction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class106/HashFunction.java b/src/class106/HashFunction.java index 271bd35ea..aa1964e00 100644 --- a/src/class106/HashFunction.java +++ b/src/class106/HashFunction.java @@ -99,7 +99,7 @@ public static void main(String[] args) { // for (String str : set) { // System.out.println(str); // } - System.out.println("不同哈希值的数量 : " + strs.size()); + System.out.println("不同哈希值的数量 : " + set.size()); System.out.println(); int m = 13; From 75d9745247be1540d9723fb8cf30fcdf8e179110 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 7 Oct 2025 11:05:56 +0800 Subject: [PATCH 0809/1170] modify code --- src/class105/{Code06_LikeLotusRoot.java => Code06_DNA.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/class105/{Code06_LikeLotusRoot.java => Code06_DNA.java} (98%) diff --git a/src/class105/Code06_LikeLotusRoot.java b/src/class105/Code06_DNA.java similarity index 98% rename from src/class105/Code06_LikeLotusRoot.java rename to src/class105/Code06_DNA.java index a35690401..3f6773cd4 100644 --- a/src/class105/Code06_LikeLotusRoot.java +++ b/src/class105/Code06_DNA.java @@ -15,7 +15,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code06_LikeLotusRoot { +public class Code06_DNA { public static int MAXN = 100001; From 1f7a9f2a11116f6b07323511d94db65386c449a2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 8 Oct 2025 21:23:30 +0800 Subject: [PATCH 0810/1170] modify code --- src/class180/Code01_VirtualTree1.java | 34 +++++++++---------- src/class180/Code02_War1.java | 48 ++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/src/class180/Code01_VirtualTree1.java b/src/class180/Code01_VirtualTree1.java index 50d7b9c3d..e8758fa57 100644 --- a/src/class180/Code01_VirtualTree1.java +++ b/src/class180/Code01_VirtualTree1.java @@ -110,7 +110,7 @@ public static int getLca(int a, int b) { } // 二次排序 + LCA连边的方式建立虚树 - public static void buildVirtualTree1() { + public static int buildVirtualTree1() { sortByDfn(arr, 1, k); int len = 0; for (int i = 1; i < k; i++) { @@ -118,7 +118,6 @@ public static void buildVirtualTree1() { tmp[++len] = getLca(arr[i], arr[i + 1]); } tmp[++len] = arr[k]; - tmp[++len] = 1; sortByDfn(tmp, 1, len); int unique = 1; for (int i = 2; i <= len; i++) { @@ -133,20 +132,18 @@ public static void buildVirtualTree1() { for (int i = 1; i < unique; i++) { addEdgeV(getLca(tmp[i], tmp[i + 1]), tmp[i + 1]); } + return tmp[1]; } // 单调栈的方式建立虚树 - public static void buildVirtualTree2() { + public static int buildVirtualTree2() { sortByDfn(arr, 1, k); cntv = 0; - headv[1] = 0; + headv[arr[1]] = 0; int top = 0; - stack[++top] = 1; - for (int i = 1; i <= k; i++) { + stack[++top] = arr[1]; + for (int i = 2; i <= k; i++) { int x = arr[i]; - if (x == 1) { - continue; - } int y = stack[top]; int lca = getLca(x, y); while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { @@ -166,17 +163,16 @@ public static void buildVirtualTree2() { addEdgeV(stack[top - 1], stack[top]); top--; } + return stack[1]; } - public static void dpOnTree(int u, int fa) { + public static void dpOnTree(int u) { dp[u] = siz[u] = 0; for (int e = headv[u], v; e > 0; e = nextv[e]) { v = tov[e]; - if (v != fa) { - dpOnTree(v, u); - dp[u] += dp[v]; - siz[u] += siz[v]; - } + dpOnTree(v); + dp[u] += dp[v]; + siz[u] += siz[v]; } if (isKey[u]) { dp[u] += siz[u]; @@ -200,10 +196,10 @@ public static int compute() { } int ans = -1; if (check) { - // buildVirtualTree1(); - buildVirtualTree2(); - dpOnTree(1, 0); - ans = dp[1]; + int tree = buildVirtualTree1(); + // int tree = buildVirtualTree2(); + dpOnTree(tree); + ans = dp[tree]; } for (int i = 1; i <= k; i++) { isKey[arr[i]] = false; diff --git a/src/class180/Code02_War1.java b/src/class180/Code02_War1.java index 8127cb731..ea1d99d89 100644 --- a/src/class180/Code02_War1.java +++ b/src/class180/Code02_War1.java @@ -34,8 +34,9 @@ public class Code02_War1 { public static int cntd; public static int[] arr = new int[MAXN]; - public static boolean[] isKey = new boolean[MAXN]; + public static int[] tmp = new int[MAXN << 1]; public static int[] stack = new int[MAXN]; + public static boolean[] isKey = new boolean[MAXN]; public static long[] dp = new long[MAXN]; public static void addEdgeG(int u, int v, int w) { @@ -133,18 +134,47 @@ public static int getDist(int a, int b) { return dist; } + // 二次排序 + LCA连边的方式建立虚树 + public static int buildVirtualTree1() { + sortByDfn(arr, 1, k); + int len = 0; + for (int i = 1; i < k; i++) { + tmp[++len] = arr[i]; + tmp[++len] = getLca(arr[i], arr[i + 1]); + } + tmp[++len] = arr[k]; + // 因为题目是让所有关键点不能和1号点连通 + // 所以一定要让1号点加入 + tmp[++len] = 1; + sortByDfn(tmp, 1, len); + int unique = 1; + for (int i = 2; i <= len; i++) { + if (tmp[unique] != tmp[i]) { + tmp[++unique] = tmp[i]; + } + } + cntv = 0; + for (int i = 1; i <= unique; i++) { + headv[tmp[i]] = 0; + } + for (int i = 1; i < unique; i++) { + int lca = getLca(tmp[i], tmp[i + 1]); + addEdgeV(lca, tmp[i + 1], getDist(lca, tmp[i + 1])); + } + return tmp[1]; + } + // 单调栈的方式建立虚树 - public static void buildVirtualTree() { + public static int buildVirtualTree2() { sortByDfn(arr, 1, k); + // 因为题目是让所有关键点不能和1号点连通 + // 所以一定要让1号点加入 cntv = 0; headv[1] = 0; int top = 0; stack[++top] = 1; for (int i = 1; i <= k; i++) { int x = arr[i]; - if (x == 1) { - continue; - } int y = stack[top]; int lca = getLca(x, y); while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { @@ -164,6 +194,7 @@ public static void buildVirtualTree() { addEdgeV(stack[top - 1], stack[top], getDist(stack[top - 1], stack[top])); top--; } + return stack[1]; } public static void dpOnTree(int u) { @@ -183,15 +214,16 @@ public static void dpOnTree(int u) { } public static long compute() { - buildVirtualTree(); for (int i = 1; i <= k; i++) { isKey[arr[i]] = true; } - dpOnTree(1); + int tree = buildVirtualTree1(); + // int tree = buildVirtualTree2(); + dpOnTree(tree); for (int i = 1; i <= k; i++) { isKey[arr[i]] = false; } - return dp[1]; + return dp[tree]; } public static void main(String[] args) throws Exception { From 850c34a9088cd71a75e69dab09c0579c1879cda9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 8 Oct 2025 22:49:52 +0800 Subject: [PATCH 0811/1170] modify code --- src/class180/Code03_BigProject1.java | 327 +++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 src/class180/Code03_BigProject1.java diff --git a/src/class180/Code03_BigProject1.java b/src/class180/Code03_BigProject1.java new file mode 100644 index 000000000..071cbfb73 --- /dev/null +++ b/src/class180/Code03_BigProject1.java @@ -0,0 +1,327 @@ +package class180; + +// 大工程,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4103 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code03_BigProject1 { + + public static int MAXN = 1000001; + public static int MAXP = 21; + public static long INF = 1L << 60; + public static int n, q, k; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXN << 1]; + public static int[] tog = new int[MAXN << 1]; + public static int cntg; + + public static int[] headv = new int[MAXN]; + public static int[] nextv = new int[MAXN]; + public static int[] tov = new int[MAXN]; + public static int cntv; + + public static int[] dep = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + public static int cntd; + + public static int[] arr = new int[MAXN]; + public static boolean[] isKey = new boolean[MAXN]; + public static int[] tmp = new int[MAXN << 1]; + + public static int[] siz = new int[MAXN]; + public static long[] dp = new long[MAXN]; + public static long[] minv = new long[MAXN]; + public static long[] maxv = new long[MAXN]; + public static long costSum, costMin, costMax; + + // dfs过程和dp过程,C++同学可以使用递归版 + // 但是java同学必须改迭代版否则会爆栈 + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + // ufe不仅用于dfs改迭代,也用于dp改迭代 + public static int[][] ufe = new int[MAXN][3]; + + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + public static void addEdgeG(int u, int v) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + headg[u] = cntg; + } + + public static void addEdgeV(int u, int v) { + nextv[++cntv] = headv[u]; + tov[cntv] = v; + headv[u] = cntv; + } + + // nums中的数,根据dfn的大小排序,手撸双指针快排 + public static void sortByDfn(int[] nums, int l, int r) { + if (l >= r) return; + int i = l, j = r; + int pivot = nums[(l + r) >> 1]; + while (i <= j) { + while (dfn[nums[i]] < dfn[pivot]) i++; + while (dfn[nums[j]] > dfn[pivot]) j--; + if (i <= j) { + int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; + i++; j--; + } + } + sortByDfn(nums, l, j); + sortByDfn(nums, i, r); + } + + // dfs递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa) { + dep[u] = dep[fa] + 1; + dfn[u] = ++cntd; + stjump[u][0] = fa; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = headg[u]; e > 0; e = nextg[e]) { + if (tog[e] != fa) { + dfs1(tog[e], u); + } + } + } + + // dfs1的迭代版 + public static void dfs2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dep[u] = dep[f] + 1; + dfn[u] = ++cntd; + stjump[u][0] = f; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + e = headg[u]; + } else { + e = nextg[e]; + } + if (e != 0) { + push(u, f, e); + if (tog[e] != f) { + push(tog[e], u, -1); + } + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static int buildVirtualTree() { + sortByDfn(arr, 1, k); + int len = 0; + for (int i = 1; i < k; i++) { + tmp[++len] = arr[i]; + tmp[++len] = getLca(arr[i], arr[i + 1]); + } + tmp[++len] = arr[k]; + sortByDfn(tmp, 1, len); + int unique = 1; + for (int i = 2; i <= len; i++) { + if (tmp[unique] != tmp[i]) { + tmp[++unique] = tmp[i]; + } + } + cntv = 0; + for (int i = 1; i <= unique; i++) { + headv[tmp[i]] = 0; + } + for (int i = 1; i < unique; i++) { + addEdgeV(getLca(tmp[i], tmp[i + 1]), tmp[i + 1]); + } + return tmp[1]; + } + + // dp递归版,java会爆栈,C++可以通过 + public static void dpOnTree1(int u) { + siz[u] = isKey[u] ? 1 : 0; + dp[u] = 0; + if (isKey[u]) { + maxv[u] = minv[u] = 0; + } else { + minv[u] = INF; + maxv[u] = -INF; + } + for (int e = headv[u]; e > 0; e = nextv[e]) { + dpOnTree1(tov[e]); + } + for (int ei = headv[u]; ei > 0; ei = nextv[ei]) { + int v = tov[ei]; + long len = dep[v] - dep[u]; + costSum += (dp[u] + 1L * siz[u] * len) * siz[v] + dp[v] * siz[u]; + siz[u] += siz[v]; + dp[u] += dp[v] + len * siz[v]; + costMin = Math.min(costMin, minv[u] + minv[v] + len); + costMax = Math.max(costMax, maxv[u] + maxv[v] + len); + minv[u] = Math.min(minv[u], minv[v] + len); + maxv[u] = Math.max(maxv[u], maxv[v] + len); + } + } + + // dpOnTree1的迭代版 + public static void dpOnTree2(int tree) { + stacksize = 0; + push(tree, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = isKey[u] ? 1 : 0; + dp[u] = 0; + if (isKey[u]) { + maxv[u] = minv[u] = 0; + } else { + minv[u] = INF; + maxv[u] = -INF; + } + e = headv[u]; + } else { + e = nextv[e]; + } + if (e != 0) { + push(u, 0, e); + push(tov[e], 0, -1); + } else { + for (int ei = headv[u]; ei > 0; ei = nextv[ei]) { + int v = tov[ei]; + long len = dep[v] - dep[u]; + costSum += (dp[u] + 1L * siz[u] * len) * siz[v] + dp[v] * siz[u]; + siz[u] += siz[v]; + dp[u] += dp[v] + len * siz[v]; + costMin = Math.min(costMin, minv[u] + minv[v] + len); + costMax = Math.max(costMax, maxv[u] + maxv[v] + len); + minv[u] = Math.min(minv[u], minv[v] + len); + maxv[u] = Math.max(maxv[u], maxv[v] + len); + } + } + } + } + + public static void compute() { + for (int i = 1; i <= k; i++) { + isKey[arr[i]] = true; + } + int tree = buildVirtualTree(); + costSum = 0; + costMin = INF; + costMax = -INF; + // dpOnTree1(tree); + dpOnTree2(tree); + for (int i = 1; i <= k; i++) { + isKey[arr[i]] = false; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdgeG(u, v); + addEdgeG(v, u); + } + // dfs1(1, 0); + dfs2(); + q = in.nextInt(); + for (int t = 1; t <= q; t++) { + k = in.nextInt(); + for (int i = 1; i <= k; i++) { + arr[i] = in.nextInt(); + } + compute(); + out.println(costSum + " " + costMin + " " + costMax); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 3593f93e51fb0e3dd9e7bddc2b4f653b7ae31b69 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 9 Oct 2025 20:08:20 +0800 Subject: [PATCH 0812/1170] modify code --- src/class180/Code04_WorldTree1.java | 274 ++++++++++++++++++++++++++++ src/class180/Code04_WorldTree2.java | 209 +++++++++++++++++++++ 2 files changed, 483 insertions(+) create mode 100644 src/class180/Code04_WorldTree1.java create mode 100644 src/class180/Code04_WorldTree2.java diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java new file mode 100644 index 000000000..c427c6050 --- /dev/null +++ b/src/class180/Code04_WorldTree1.java @@ -0,0 +1,274 @@ +package class180; + +// 世界树,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3233 +// 提交以下的code,提交时请把类名改成"Main" +// 本题递归函数较多,java版不改成迭代会爆栈,导致无法通过 +// 但是改动其实没啥价值,因为和算法无关,纯粹语言歧视,索性不改了 +// 想通过用C++实现,本节课Code04_WorldTree2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code04_WorldTree1 { + + public static int MAXN = 300001; + public static int MAXP = 20; + public static int INF = 1000000001; + public static int n, q, k; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXN << 1]; + public static int[] tog = new int[MAXN << 1]; + public static int cntg; + + public static int[] headv = new int[MAXN]; + public static int[] nextv = new int[MAXN]; + public static int[] tov = new int[MAXN]; + public static int cntv; + + public static int[] dep = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + public static int cntd; + + public static int[] order = new int[MAXN]; + public static int[] arr = new int[MAXN]; + public static boolean[] isKey = new boolean[MAXN]; + public static int[] tmp = new int[MAXN << 1]; + public static int[] dp = new int[MAXN]; + public static int[] pick = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + public static void addEdgeG(int u, int v) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + headg[u] = cntg; + } + + public static void addEdgeV(int u, int v) { + nextv[++cntv] = headv[u]; + tov[cntv] = v; + headv[u] = cntv; + } + + // nums中的数,根据dfn的大小排序,手撸双指针快排 + public static void sortByDfn(int[] nums, int l, int r) { + if (l >= r) return; + int i = l, j = r; + int pivot = nums[(l + r) >> 1]; + while (i <= j) { + while (dfn[nums[i]] < dfn[pivot]) i++; + while (dfn[nums[j]] > dfn[pivot]) j--; + if (i <= j) { + int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; + i++; j--; + } + } + sortByDfn(nums, l, j); + sortByDfn(nums, i, r); + } + + public static void dfs(int u, int fa) { + dep[u] = dep[fa] + 1; + siz[u] = 1; + dfn[u] = ++cntd; + stjump[u][0] = fa; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (v != fa) { + dfs(v, u); + siz[u] += siz[v]; + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static int buildVirtualTree() { + sortByDfn(arr, 1, k); + int len = 0; + for (int i = 1; i < k; i++) { + tmp[++len] = arr[i]; + tmp[++len] = getLca(arr[i], arr[i + 1]); + } + tmp[++len] = arr[k]; + // 一定要加入1号点 + // 因为题目问的是所有节点的归属问题 + tmp[++len] = 1; + sortByDfn(tmp, 1, len); + int unique = 1; + for (int i = 2; i <= len; i++) { + if (tmp[unique] != tmp[i]) { + tmp[++unique] = tmp[i]; + } + } + cntv = 0; + for (int i = 1; i <= unique; i++) { + headv[tmp[i]] = 0; + } + for (int i = 1; i < unique; i++) { + addEdgeV(getLca(tmp[i], tmp[i + 1]), tmp[i + 1]); + } + return tmp[1]; + } + + public static void dp1(int u) { + dp[u] = INF; + for (int e = headv[u]; e > 0; e = nextv[e]) { + int v = tov[e]; + dp1(v); + int dis = dep[v] - dep[u]; + if (dp[u] > dp[v] + dis) { + dp[u] = dp[v] + dis; + pick[u] = pick[v]; + } else if (dp[u] == dp[v] + dis) { + pick[u] = Math.min(pick[u], pick[v]); + } + } + if (isKey[u]) { + dp[u] = 0; + pick[u] = u; + } + } + + public static void calc(int x, int y) { + int b = y; + for (int p = MAXP - 1; p >= 0; p--) { + int l = dep[y] - dep[stjump[b][p]] + dp[y]; + int r = dep[stjump[b][p]] - dep[x] + dp[x]; + if (dep[stjump[b][p]] > dep[x] && (l < r || (l == r && pick[y] < pick[x]))) { + b = stjump[b][p]; + } + } + ans[pick[y]] += siz[b] - siz[y]; + ans[pick[x]] -= siz[b]; + } + + public static void dp2(int u) { + for (int e = headv[u]; e > 0; e = nextv[e]) { + int v = tov[e]; + int dis = dep[v] - dep[u]; + if (dp[v] > dp[u] + dis) { + dp[v] = dp[u] + dis; + pick[v] = pick[u]; + } else if (dp[v] == dp[u] + dis) { + pick[v] = Math.min(pick[v], pick[u]); + } + calc(u, v); + dp2(v); + } + ans[pick[u]] += siz[u]; + } + + public static void compute() { + for (int i = 1; i <= k; i++) { + arr[i] = order[i]; + } + for (int i = 1; i <= k; i++) { + isKey[arr[i]] = true; + ans[arr[i]] = 0; + } + int tree = buildVirtualTree(); + dp1(tree); + dp2(tree); + for (int i = 1; i <= k; i++) { + isKey[arr[i]] = false; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdgeG(u, v); + addEdgeG(v, u); + } + dfs(1, 0); + q = in.nextInt(); + for (int t = 1; t <= q; t++) { + k = in.nextInt(); + for (int i = 1; i <= k; i++) { + order[i] = in.nextInt(); + } + compute(); + for (int i = 1; i <= k; i++) { + out.print(ans[order[i]] + " "); + } + out.println(); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java new file mode 100644 index 000000000..e79d432f0 --- /dev/null +++ b/src/class180/Code04_WorldTree2.java @@ -0,0 +1,209 @@ +package class180; + +// 世界树,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3233 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//const int MAXP = 20; +//const int INF = 1000000001; +//int n, q, k; +// +//int headg[MAXN]; +//int nextg[MAXN << 1]; +//int tog[MAXN << 1]; +//int cntg; +// +//int headv[MAXN]; +//int nextv[MAXN]; +//int tov[MAXN]; +//int cntv; +// +//int dep[MAXN]; +//int siz[MAXN]; +//int dfn[MAXN]; +//int stjump[MAXN][MAXP]; +//int cntd; +// +//int order[MAXN]; +//int arr[MAXN]; +//bool isKey[MAXN]; +//int tmp[MAXN << 1]; +// +//int dp[MAXN]; +//int pick[MAXN]; +//int ans[MAXN]; +// +//void addEdgeG(int u, int v) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// headg[u] = cntg; +//} +// +//void addEdgeV(int u, int v) { +// nextv[++cntv] = headv[u]; +// tov[cntv] = v; +// headv[u] = cntv; +//} +// +//bool cmp(int x, int y) { +// return dfn[x] < dfn[y]; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// siz[u] = 1; +// dfn[u] = ++cntd; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = headg[u]; e; e = nextg[e]) { +// int v = tog[e]; +// if (v != fa) { +// dfs(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//int buildVirtualTree() { +// sort(arr + 1, arr + k + 1, cmp); +// int len = 0; +// for (int i = 1; i < k; i++) { +// tmp[++len] = arr[i]; +// tmp[++len] = getLca(arr[i], arr[i + 1]); +// } +// tmp[++len] = arr[k]; +// tmp[++len] = 1; +// sort(tmp + 1, tmp + len + 1, cmp); +// int unique = 1; +// for (int i = 2; i <= len; i++) { +// if (tmp[unique] != tmp[i]) { +// tmp[++unique] = tmp[i]; +// } +// } +// cntv = 0; +// for (int i = 1; i <= unique; i++) { +// headv[tmp[i]] = 0; +// } +// for (int i = 1; i < unique; i++) { +// addEdgeV(getLca(tmp[i], tmp[i + 1]), tmp[i + 1]); +// } +// return tmp[1]; +//} +// +//void dp1(int u) { +// dp[u] = INF; +// for (int e = headv[u]; e; e = nextv[e]) { +// int v = tov[e]; +// dp1(v); +// int dis = dep[v] - dep[u]; +// if (dp[u] > dp[v] + dis) { +// dp[u] = dp[v] + dis; +// pick[u] = pick[v]; +// } else if (dp[u] == dp[v] + dis) { +// pick[u] = min(pick[u], pick[v]); +// } +// } +// if (isKey[u]) { +// dp[u] = 0; +// pick[u] = u; +// } +//} +// +//void calc(int x, int y) { +// int b = y; +// for (int p = MAXP - 1; p >= 0; p--) { +// int l = (dep[y] - dep[stjump[b][p]]) + dp[y]; +// int r = (dep[stjump[b][p]] - dep[x]) + dp[x]; +// if (dep[stjump[b][p]] > dep[x] && (l < r || (l == r && pick[y] < pick[x]))) { +// b = stjump[b][p]; +// } +// } +// ans[pick[y]] += siz[b] - siz[y]; +// ans[pick[x]] -= siz[b]; +//} +// +//void dp2(int u) { +// for (int e = headv[u]; e; e = nextv[e]) { +// int v = tov[e]; +// int dis = dep[v] - dep[u]; +// if (dp[v] > dp[u] + dis) { +// dp[v] = dp[u] + dis; +// pick[v] = pick[u]; +// } else if (dp[v] == dp[u] + dis) { +// pick[v] = min(pick[v], pick[u]); +// } +// calc(u, v); +// dp2(v); +// } +// ans[pick[u]] += siz[u]; +//} +// +//void compute() { +// for (int i = 1; i <= k; i++) { +// arr[i] = order[i]; +// } +// for (int i = 1; i <= k; i++) { +// isKey[arr[i]] = true; +// ans[arr[i]] = 0; +// } +// int tree = buildVirtualTree(); +// dp1(tree); +// dp2(tree); +// for (int i = 1; i <= k; i++) { +// isKey[arr[i]] = false; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdgeG(u, v); +// addEdgeG(v, u); +// } +// dfs(1, 0); +// cin >> q; +// for (int t = 1; t <= q; t++) { +// cin >> k; +// for (int i = 1; i <= k; i++) { +// cin >> order[i]; +// } +// compute(); +// for (int i = 1; i <= k; i++) { +// cout << ans[order[i]] << ' '; +// } +// cout << '\n'; +// } +// return 0; +//} \ No newline at end of file From 28382ec99581344704c1daa90134a0dc0c945fd9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 9 Oct 2025 20:09:36 +0800 Subject: [PATCH 0813/1170] modify code --- src/class180/Code04_WorldTree1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index c427c6050..270a09fd6 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P3233 // 提交以下的code,提交时请把类名改成"Main" // 本题递归函数较多,java版不改成迭代会爆栈,导致无法通过 -// 但是改动其实没啥价值,因为和算法无关,纯粹语言歧视,索性不改了 +// 但是这种改动没啥价值,因为和算法无关,纯粹语言歧视,索性不改了 // 想通过用C++实现,本节课Code04_WorldTree2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 From 901ef146e8e6ee1190e17e68f30e7770a1d93b69 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Oct 2025 11:32:29 +0800 Subject: [PATCH 0814/1170] modify code --- .../{Code03_BigProject1.java => Code02_BigProject1.java} | 2 +- src/class180/{Code02_War1.java => Code03_War1.java} | 8 ++++---- src/class180/Code04_WorldTree1.java | 6 +++--- src/class180/Code04_WorldTree2.java | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) rename src/class180/{Code03_BigProject1.java => Code02_BigProject1.java} (99%) rename src/class180/{Code02_War1.java => Code03_War1.java} (99%) diff --git a/src/class180/Code03_BigProject1.java b/src/class180/Code02_BigProject1.java similarity index 99% rename from src/class180/Code03_BigProject1.java rename to src/class180/Code02_BigProject1.java index 071cbfb73..a1c14e3ec 100644 --- a/src/class180/Code03_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code03_BigProject1 { +public class Code02_BigProject1 { public static int MAXN = 1000001; public static int MAXP = 21; diff --git a/src/class180/Code02_War1.java b/src/class180/Code03_War1.java similarity index 99% rename from src/class180/Code02_War1.java rename to src/class180/Code03_War1.java index ea1d99d89..4e8b5aae8 100644 --- a/src/class180/Code02_War1.java +++ b/src/class180/Code03_War1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_War1 { +public class Code03_War1 { public static int MAXN = 300001; public static int MAXP = 20; @@ -137,15 +137,15 @@ public static int getDist(int a, int b) { // 二次排序 + LCA连边的方式建立虚树 public static int buildVirtualTree1() { sortByDfn(arr, 1, k); + // 因为题目是让所有关键点不能和1号点连通 + // 所以一定要让1号点加入 int len = 0; + tmp[++len] = 1; for (int i = 1; i < k; i++) { tmp[++len] = arr[i]; tmp[++len] = getLca(arr[i], arr[i + 1]); } tmp[++len] = arr[k]; - // 因为题目是让所有关键点不能和1号点连通 - // 所以一定要让1号点加入 - tmp[++len] = 1; sortByDfn(tmp, 1, len); int unique = 1; for (int i = 2; i <= len; i++) { diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index 270a09fd6..176335e9b 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -115,15 +115,15 @@ public static int getLca(int a, int b) { public static int buildVirtualTree() { sortByDfn(arr, 1, k); + // 一定要加入1号点 + // 因为题目问的是所有节点的归属问题 int len = 0; + tmp[++len] = 1; for (int i = 1; i < k; i++) { tmp[++len] = arr[i]; tmp[++len] = getLca(arr[i], arr[i + 1]); } tmp[++len] = arr[k]; - // 一定要加入1号点 - // 因为题目问的是所有节点的归属问题 - tmp[++len] = 1; sortByDfn(tmp, 1, len); int unique = 1; for (int i = 2; i <= len; i++) { diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index e79d432f0..ea654dc0c 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -96,12 +96,12 @@ //int buildVirtualTree() { // sort(arr + 1, arr + k + 1, cmp); // int len = 0; +// tmp[++len] = 1; // for (int i = 1; i < k; i++) { // tmp[++len] = arr[i]; // tmp[++len] = getLca(arr[i], arr[i + 1]); // } // tmp[++len] = arr[k]; -// tmp[++len] = 1; // sort(tmp + 1, tmp + len + 1, cmp); // int unique = 1; // for (int i = 2; i <= len; i++) { From e332177a4d49adf8eaec484c20ded0c6bfbfe4a0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Oct 2025 13:06:19 +0800 Subject: [PATCH 0815/1170] modify code --- src/class180/Code05_TreasureHunt1.java | 228 +++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 src/class180/Code05_TreasureHunt1.java diff --git a/src/class180/Code05_TreasureHunt1.java b/src/class180/Code05_TreasureHunt1.java new file mode 100644 index 000000000..481f997e1 --- /dev/null +++ b/src/class180/Code05_TreasureHunt1.java @@ -0,0 +1,228 @@ +package class180; + +// 寻宝游戏,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3320 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.TreeSet; + +public class Code05_TreasureHunt1 { + + public static int MAXN = 100001; + public static int MAXP = 20; + public static int n, m; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static int[] dep = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int[] seg = new int[MAXN]; + public static long[] dist = new long[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + public static int cntd; + + public static int[] arr = new int[MAXN]; + public static boolean[] vis = new boolean[MAXN]; + public static TreeSet set = new TreeSet<>(); + public static long[] ans = new long[MAXN]; + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + // dfs递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa, int w) { + dep[u] = dep[fa] + 1; + dfn[u] = ++cntd; + seg[cntd] = u; + dist[u] = dist[fa] + w; + stjump[u][0] = fa; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = head[u]; e > 0; e = nxt[e]) { + if (to[e] != fa) { + dfs1(to[e], u, weight[e]); + } + } + } + + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + public static int[][] ufwe = new int[MAXN][4]; + + public static int stacksize, u, f, w, e; + + public static void push(int u, int f, int w, int e) { + ufwe[stacksize][0] = u; + ufwe[stacksize][1] = f; + ufwe[stacksize][2] = w; + ufwe[stacksize][3] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufwe[stacksize][0]; + f = ufwe[stacksize][1]; + w = ufwe[stacksize][2]; + e = ufwe[stacksize][3]; + } + + // dfs1的迭代版 + public static void dfs2() { + stacksize = 0; + push(1, 0, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dep[u] = dep[f] + 1; + dfn[u] = ++cntd; + seg[cntd] = u; + dist[u] = dist[f] + w; + stjump[u][0] = f; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, w, e); + if (to[e] != f) { + push(to[e], u, weight[e], -1); + } + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static long getDist(int x, int y) { + return dist[x] + dist[y] - 2 * dist[getLca(x, y)]; + } + + public static void compute() { + long curAns = 0; + for (int i = 1; i <= m; i++) { + int nodeId = arr[i]; + int dfnId = dfn[nodeId]; + if (!vis[nodeId]) { + set.add(dfnId); + } + int pre = set.lower(dfnId) != null ? set.lower(dfnId) : set.last(); + int post = set.higher(dfnId) != null ? set.higher(dfnId) : set.first(); + if (vis[nodeId]) { + set.remove(dfnId); + } + pre = seg[pre]; + post = seg[post]; + long curDist = getDist(nodeId, pre) + getDist(nodeId, post) - getDist(pre, post); + if (!vis[nodeId]) { + vis[nodeId] = true; + curAns += curDist; + } else { + vis[nodeId] = false; + curAns -= curDist; + } + ans[i] = curAns; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); + } + // dfs1(1, 0, 0); + dfs2(); + for (int i = 1; i <= m; i++) { + arr[i] = in.nextInt(); + } + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From fb3b696ed7c6178f9933313c5c5a4073b512622d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Oct 2025 13:11:16 +0800 Subject: [PATCH 0816/1170] modify code --- src/class180/Code05_TreasureHunt1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class180/Code05_TreasureHunt1.java b/src/class180/Code05_TreasureHunt1.java index 481f997e1..c041eeb16 100644 --- a/src/class180/Code05_TreasureHunt1.java +++ b/src/class180/Code05_TreasureHunt1.java @@ -31,7 +31,9 @@ public class Code05_TreasureHunt1 { public static int[] arr = new int[MAXN]; public static boolean[] vis = new boolean[MAXN]; + // 这里为了方便,使用语言自带的有序表 public static TreeSet set = new TreeSet<>(); + public static long[] ans = new long[MAXN]; public static void addEdge(int u, int v, int w) { From 4d2e11f2d59d630686b227a1d0cf9c093520f6e0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Oct 2025 13:22:17 +0800 Subject: [PATCH 0817/1170] modify code --- src/class180/Code02_BigProject1.java | 38 ++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index a1c14e3ec..832ebb475 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -34,6 +34,7 @@ public class Code02_BigProject1 { public static int[] arr = new int[MAXN]; public static boolean[] isKey = new boolean[MAXN]; public static int[] tmp = new int[MAXN << 1]; + public static int[] stack = new int[MAXN]; public static int[] siz = new int[MAXN]; public static long[] dp = new long[MAXN]; @@ -156,7 +157,8 @@ public static int getLca(int a, int b) { return stjump[a][0]; } - public static int buildVirtualTree() { + // 二次排序 + LCA连边的方式建立虚树 + public static int buildVirtualTree1() { sortByDfn(arr, 1, k); int len = 0; for (int i = 1; i < k; i++) { @@ -181,6 +183,37 @@ public static int buildVirtualTree() { return tmp[1]; } + // 单调栈的方式建立虚树 + public static int buildVirtualTree2() { + sortByDfn(arr, 1, k); + cntv = 0; + headv[arr[1]] = 0; + int top = 0; + stack[++top] = arr[1]; + for (int i = 2; i <= k; i++) { + int x = arr[i]; + int y = stack[top]; + int lca = getLca(x, y); + while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { + addEdgeV(stack[top - 1], stack[top]); + top--; + } + if (lca != stack[top]) { + headv[lca] = 0; + addEdgeV(lca, stack[top]); + top--; + stack[++top] = lca; + } + headv[x] = 0; + stack[++top] = x; + } + while (top > 1) { + addEdgeV(stack[top - 1], stack[top]); + top--; + } + return stack[1]; + } + // dp递归版,java会爆栈,C++可以通过 public static void dpOnTree1(int u) { siz[u] = isKey[u] ? 1 : 0; @@ -249,7 +282,8 @@ public static void compute() { for (int i = 1; i <= k; i++) { isKey[arr[i]] = true; } - int tree = buildVirtualTree(); + int tree = buildVirtualTree1(); + // int tree = buildVirtualTree2(); costSum = 0; costMin = INF; costMax = -INF; From 0f1bb1a01460afe9153a33e4d39bd331db95906b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Oct 2025 13:23:25 +0800 Subject: [PATCH 0818/1170] modify code --- src/class180/Code02_BigProject1.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index 832ebb475..b8e67a691 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -76,7 +76,6 @@ public static void addEdgeV(int u, int v) { headv[u] = cntv; } - // nums中的数,根据dfn的大小排序,手撸双指针快排 public static void sortByDfn(int[] nums, int l, int r) { if (l >= r) return; int i = l, j = r; From c6c191dcd0838a1240d38805c401295c06320b79 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Oct 2025 17:19:55 +0800 Subject: [PATCH 0819/1170] modify code --- src/class180/Code06_TreelandAndViruses1.java | 280 +++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 src/class180/Code06_TreelandAndViruses1.java diff --git a/src/class180/Code06_TreelandAndViruses1.java b/src/class180/Code06_TreelandAndViruses1.java new file mode 100644 index 000000000..7f597e4f8 --- /dev/null +++ b/src/class180/Code06_TreelandAndViruses1.java @@ -0,0 +1,280 @@ +package class180; + +// 树上病毒传播,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1320E +// 测试链接 : https://codeforces.com/problemset/problem/1320/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.PriorityQueue; + +public class Code06_TreelandAndViruses1 { + + public static int MAXN = 200001; + public static int MAXP = 20; + public static int n, q, k, m; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXN << 1]; + public static int[] tog = new int[MAXN << 1]; + public static int cntg; + + public static int[] headv = new int[MAXN]; + public static int[] nextv = new int[MAXN << 1]; + public static int[] tov = new int[MAXN << 1]; + public static int cntv; + + public static int[] dep = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + public static int cntd; + + public static int[] start = new int[MAXN]; + public static int[] speed = new int[MAXN]; + public static int[] order = new int[MAXN]; + public static int[] key = new int[MAXN]; + + public static int[] arr = new int[MAXN << 1]; + public static int[] tmp = new int[MAXN << 2]; + public static int unique; + + // dijkstra算法需要 + public static boolean[] vis = new boolean[MAXN]; + public static int[] bestDist = new int[MAXN]; + public static int[] bestTime = new int[MAXN]; + public static int[] bestPre = new int[MAXN]; + + public static void addEdgeG(int u, int v) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + headg[u] = cntg; + } + + public static void addEdgeV(int u, int v) { + nextv[++cntv] = headv[u]; + tov[cntv] = v; + headv[u] = cntv; + } + + public static void sortByDfn(int[] nums, int l, int r) { + if (l >= r) return; + int i = l, j = r; + int pivot = nums[(l + r) >> 1]; + while (i <= j) { + while (dfn[nums[i]] < dfn[pivot]) i++; + while (dfn[nums[j]] > dfn[pivot]) j--; + if (i <= j) { + int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; + i++; j--; + } + } + sortByDfn(nums, l, j); + sortByDfn(nums, i, r); + } + + public static void dfs(int u, int fa) { + dep[u] = dep[fa] + 1; + dfn[u] = ++cntd; + stjump[u][0] = fa; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = headg[u]; e > 0; e = nextg[e]) { + if (tog[e] != fa) { + dfs(tog[e], u); + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; a = b; b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static int buildVirtualTree() { + int tot = 0; + for (int i = 1; i <= k; i++) { + arr[++tot] = start[i]; + } + for (int i = 1; i <= m; i++) { + arr[++tot] = key[i]; + } + sortByDfn(arr, 1, tot); + int len = 0; + for (int i = 1; i < tot; i++) { + tmp[++len] = arr[i]; + tmp[++len] = getLca(arr[i], arr[i + 1]); + } + tmp[++len] = arr[tot]; + sortByDfn(tmp, 1, len); + unique = 1; + for (int i = 2; i <= len; i++) { + if (tmp[unique] != tmp[i]) { + tmp[++unique] = tmp[i]; + } + } + cntv = 0; + for (int i = 1; i <= unique; i++) { + headv[tmp[i]] = 0; + } + for (int i = 1; i < unique; i++) { + // 这里要两个方向加边 + // 因为病毒感染既可以向上也可以向下 + // 所以跑dijkstra算法时需要无向图 + int lca = getLca(tmp[i], tmp[i + 1]); + addEdgeV(lca, tmp[i + 1]); + addEdgeV(tmp[i + 1], lca); + } + return tmp[1]; + } + + static class Node { + int id, dist, time, pre; + + Node(int id_, int dist_, int time_, int pre_) { + id = id_; + dist = dist_; + time = time_; + pre = pre_; + } + } + + public static int getTime(int dist, int pre) { + return (dist + speed[pre] - 1) / speed[pre]; + } + + public static void dijkstra() { + PriorityQueue heap = new PriorityQueue<>((a, b) -> { + if (a.time != b.time) { + return a.time - b.time; + } + return order[a.pre] - order[b.pre]; + }); + for (int i = 1; i <= unique; i++) { + int u = tmp[i]; + bestDist[u] = n + 1; + bestTime[u] = n + 1; + bestPre[u] = 0; + vis[u] = false; + } + for (int i = 1; i <= k; i++) { + int s = start[i]; + bestDist[s] = 0; + bestPre[s] = s; + bestTime[s] = 0; + heap.add(new Node(s, 0, 0, s)); + } + while (!heap.isEmpty()) { + Node cur = heap.poll(); + int u = cur.id; + if (!vis[u]) { + vis[u] = true; + for (int e = headv[u]; e > 0; e = nextv[e]) { + int v = tov[e]; + int dist = cur.dist + Math.abs(dep[u] - dep[v]); + int pre = cur.pre; + int time = getTime(dist, pre); + if (!vis[v] && (time < bestTime[v] || (time == bestTime[v] && order[pre] < order[bestPre[v]]))) { + bestTime[v] = time; + bestDist[v] = dist; + bestPre[v] = pre; + heap.add(new Node(v, dist, time, pre)); + } + } + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i < n; i++) { + int x = in.nextInt(); + int y = in.nextInt(); + addEdgeG(x, y); + addEdgeG(y, x); + } + dfs(1, 0); + q = in.nextInt(); + for (int t = 1; t <= q; t++) { + k = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= k; i++) { + start[i] = in.nextInt(); + speed[start[i]] = in.nextInt(); + order[start[i]] = i; + } + for (int i = 1; i <= m; i++) { + key[i] = in.nextInt(); + } + buildVirtualTree(); + dijkstra(); + for (int i = 1; i <= m; i++) { + out.print(order[bestPre[key[i]]] + " "); + } + out.println(); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 865ad5f19343edc745fa57ef71603c740faf41da Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Oct 2025 17:26:37 +0800 Subject: [PATCH 0820/1170] modify code --- src/class180/Code06_TreelandAndViruses1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class180/Code06_TreelandAndViruses1.java b/src/class180/Code06_TreelandAndViruses1.java index 7f597e4f8..f8c66a6a9 100644 --- a/src/class180/Code06_TreelandAndViruses1.java +++ b/src/class180/Code06_TreelandAndViruses1.java @@ -173,14 +173,14 @@ public static void dijkstra() { int u = tmp[i]; bestDist[u] = n + 1; bestTime[u] = n + 1; - bestPre[u] = 0; + bestPre[u] = n + 1; vis[u] = false; } for (int i = 1; i <= k; i++) { int s = start[i]; bestDist[s] = 0; - bestPre[s] = s; bestTime[s] = 0; + bestPre[s] = s; heap.add(new Node(s, 0, 0, s)); } while (!heap.isEmpty()) { From 9799df92696a05e1cbb522b3e6a3082305e294d9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Oct 2025 18:29:05 +0800 Subject: [PATCH 0821/1170] modify code --- src/class180/Code06_TreelandAndViruses1.java | 78 ++++++++++---------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/src/class180/Code06_TreelandAndViruses1.java b/src/class180/Code06_TreelandAndViruses1.java index f8c66a6a9..166506f48 100644 --- a/src/class180/Code06_TreelandAndViruses1.java +++ b/src/class180/Code06_TreelandAndViruses1.java @@ -9,10 +9,33 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.util.Comparator; import java.util.PriorityQueue; public class Code06_TreelandAndViruses1 { + static class Node { + int id, dist, time, source, sourceOrder; + + Node(int id_, int dist_, int time_, int source_, int sourceOrder_) { + id = id_; + dist = dist_; + time = time_; + source = source_; + sourceOrder = sourceOrder_; + } + } + + static class NodeCmp implements Comparator { + @Override + public int compare(Node o1, Node o2) { + if (o1.time != o2.time) { + return o1.time - o2.time; + } + return o1.sourceOrder - o2.sourceOrder; + } + } + public static int MAXN = 200001; public static int MAXP = 20; public static int n, q, k, m; @@ -42,10 +65,10 @@ public class Code06_TreelandAndViruses1 { public static int unique; // dijkstra算法需要 + public static PriorityQueue heap = new PriorityQueue<>(new NodeCmp()); public static boolean[] vis = new boolean[MAXN]; - public static int[] bestDist = new int[MAXN]; - public static int[] bestTime = new int[MAXN]; - public static int[] bestPre = new int[MAXN]; + public static int[] minTime = new int[MAXN]; + public static int[] bestSource = new int[MAXN]; public static void addEdgeG(int u, int v) { nextg[++cntg] = headg[u]; @@ -147,57 +170,38 @@ public static int buildVirtualTree() { return tmp[1]; } - static class Node { - int id, dist, time, pre; - - Node(int id_, int dist_, int time_, int pre_) { - id = id_; - dist = dist_; - time = time_; - pre = pre_; - } - } - - public static int getTime(int dist, int pre) { - return (dist + speed[pre] - 1) / speed[pre]; + public static int getTime(int dist, int source) { + return (dist + speed[source] - 1) / speed[source]; } public static void dijkstra() { - PriorityQueue heap = new PriorityQueue<>((a, b) -> { - if (a.time != b.time) { - return a.time - b.time; - } - return order[a.pre] - order[b.pre]; - }); for (int i = 1; i <= unique; i++) { int u = tmp[i]; - bestDist[u] = n + 1; - bestTime[u] = n + 1; - bestPre[u] = n + 1; + minTime[u] = n + 1; + bestSource[u] = n + 1; vis[u] = false; } for (int i = 1; i <= k; i++) { int s = start[i]; - bestDist[s] = 0; - bestTime[s] = 0; - bestPre[s] = s; - heap.add(new Node(s, 0, 0, s)); + minTime[s] = 0; + bestSource[s] = s; + heap.add(new Node(s, 0, 0, s, order[s])); } while (!heap.isEmpty()) { Node cur = heap.poll(); int u = cur.id; + int source = cur.source; + int sourceOrder = cur.sourceOrder; if (!vis[u]) { vis[u] = true; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; int dist = cur.dist + Math.abs(dep[u] - dep[v]); - int pre = cur.pre; - int time = getTime(dist, pre); - if (!vis[v] && (time < bestTime[v] || (time == bestTime[v] && order[pre] < order[bestPre[v]]))) { - bestTime[v] = time; - bestDist[v] = dist; - bestPre[v] = pre; - heap.add(new Node(v, dist, time, pre)); + int time = getTime(dist, source); + if (!vis[v] && (time < minTime[v] || (time == minTime[v] && sourceOrder < order[bestSource[v]]))) { + minTime[v] = time; + bestSource[v] = source; + heap.add(new Node(v, dist, time, source, sourceOrder)); } } } @@ -230,7 +234,7 @@ public static void main(String[] args) throws Exception { buildVirtualTree(); dijkstra(); for (int i = 1; i <= m; i++) { - out.print(order[bestPre[key[i]]] + " "); + out.print(order[bestSource[key[i]]] + " "); } out.println(); } From 362186170e42d2c9d356f86dc2a7f1080d49f068 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 12:24:35 +0800 Subject: [PATCH 0822/1170] modify code --- src/class180/Code06_TreelandAndViruses1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class180/Code06_TreelandAndViruses1.java b/src/class180/Code06_TreelandAndViruses1.java index 166506f48..d2f3734a4 100644 --- a/src/class180/Code06_TreelandAndViruses1.java +++ b/src/class180/Code06_TreelandAndViruses1.java @@ -58,7 +58,7 @@ public int compare(Node o1, Node o2) { public static int[] start = new int[MAXN]; public static int[] speed = new int[MAXN]; public static int[] order = new int[MAXN]; - public static int[] key = new int[MAXN]; + public static int[] query = new int[MAXN]; public static int[] arr = new int[MAXN << 1]; public static int[] tmp = new int[MAXN << 2]; @@ -139,7 +139,7 @@ public static int buildVirtualTree() { arr[++tot] = start[i]; } for (int i = 1; i <= m; i++) { - arr[++tot] = key[i]; + arr[++tot] = query[i]; } sortByDfn(arr, 1, tot); int len = 0; @@ -229,12 +229,12 @@ public static void main(String[] args) throws Exception { order[start[i]] = i; } for (int i = 1; i <= m; i++) { - key[i] = in.nextInt(); + query[i] = in.nextInt(); } buildVirtualTree(); dijkstra(); for (int i = 1; i <= m; i++) { - out.print(order[bestSource[key[i]]] + " "); + out.print(order[bestSource[query[i]]] + " "); } out.println(); } From e56f4ea62b968ff7779a0fa713d869c462701eb4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 12:38:20 +0800 Subject: [PATCH 0823/1170] modify code --- src/class180/Code05_TreasureHunt1.java | 10 ++++---- src/class180/Code06_TreelandAndViruses1.java | 27 ++++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/class180/Code05_TreasureHunt1.java b/src/class180/Code05_TreasureHunt1.java index c041eeb16..d651e5798 100644 --- a/src/class180/Code05_TreasureHunt1.java +++ b/src/class180/Code05_TreasureHunt1.java @@ -144,14 +144,14 @@ public static void compute() { if (!vis[nodeId]) { set.add(dfnId); } - int pre = set.lower(dfnId) != null ? set.lower(dfnId) : set.last(); - int post = set.higher(dfnId) != null ? set.higher(dfnId) : set.first(); + int low = set.lower(dfnId) != null ? set.lower(dfnId) : set.last(); + int high = set.higher(dfnId) != null ? set.higher(dfnId) : set.first(); if (vis[nodeId]) { set.remove(dfnId); } - pre = seg[pre]; - post = seg[post]; - long curDist = getDist(nodeId, pre) + getDist(nodeId, post) - getDist(pre, post); + low = seg[low]; + high = seg[high]; + long curDist = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); if (!vis[nodeId]) { vis[nodeId] = true; curAns += curDist; diff --git a/src/class180/Code06_TreelandAndViruses1.java b/src/class180/Code06_TreelandAndViruses1.java index d2f3734a4..65d6c6de3 100644 --- a/src/class180/Code06_TreelandAndViruses1.java +++ b/src/class180/Code06_TreelandAndViruses1.java @@ -57,8 +57,8 @@ public int compare(Node o1, Node o2) { public static int[] start = new int[MAXN]; public static int[] speed = new int[MAXN]; - public static int[] order = new int[MAXN]; public static int[] query = new int[MAXN]; + public static int[] order = new int[MAXN]; public static int[] arr = new int[MAXN << 1]; public static int[] tmp = new int[MAXN << 2]; @@ -70,6 +70,8 @@ public int compare(Node o1, Node o2) { public static int[] minTime = new int[MAXN]; public static int[] bestSource = new int[MAXN]; + public static int[] ans = new int[MAXN]; + public static void addEdgeG(int u, int v) { nextg[++cntg] = headg[u]; tog[cntg] = v; @@ -170,10 +172,6 @@ public static int buildVirtualTree() { return tmp[1]; } - public static int getTime(int dist, int source) { - return (dist + speed[source] - 1) / speed[source]; - } - public static void dijkstra() { for (int i = 1; i <= unique; i++) { int u = tmp[i]; @@ -197,7 +195,7 @@ public static void dijkstra() { for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; int dist = cur.dist + Math.abs(dep[u] - dep[v]); - int time = getTime(dist, source); + int time = (dist + speed[source] - 1) / speed[source]; if (!vis[v] && (time < minTime[v] || (time == minTime[v] && sourceOrder < order[bestSource[v]]))) { minTime[v] = time; bestSource[v] = source; @@ -208,6 +206,17 @@ public static void dijkstra() { } } + public static void compute() { + for (int i = 1; i <= k; i++) { + order[start[i]] = i; + } + buildVirtualTree(); + dijkstra(); + for (int i = 1; i <= m; i++) { + ans[i] = order[bestSource[query[i]]]; + } + } + public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); @@ -226,15 +235,13 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= k; i++) { start[i] = in.nextInt(); speed[start[i]] = in.nextInt(); - order[start[i]] = i; } for (int i = 1; i <= m; i++) { query[i] = in.nextInt(); } - buildVirtualTree(); - dijkstra(); + compute(); for (int i = 1; i <= m; i++) { - out.print(order[bestSource[query[i]]] + " "); + out.print(ans[i] + " "); } out.println(); } From 40c61dab2f46fac16c88c6788f4de40e82625a15 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 13:16:45 +0800 Subject: [PATCH 0824/1170] modify code --- src/class180/Code01_VirtualTree1.java | 27 ++-- src/class180/Code01_VirtualTree2.java | 205 +++++++++++++++++++++++++ src/class180/Code02_BigProject1.java | 27 ++-- src/class180/Code02_BigProject2.java | 207 ++++++++++++++++++++++++++ src/class180/Code04_WorldTree1.java | 1 + 5 files changed, 439 insertions(+), 28 deletions(-) create mode 100644 src/class180/Code01_VirtualTree2.java create mode 100644 src/class180/Code02_BigProject2.java diff --git a/src/class180/Code01_VirtualTree1.java b/src/class180/Code01_VirtualTree1.java index e8758fa57..7f5643b44 100644 --- a/src/class180/Code01_VirtualTree1.java +++ b/src/class180/Code01_VirtualTree1.java @@ -36,9 +36,8 @@ public class Code01_VirtualTree1 { // 第一种建树方式 public static int[] tmp = new int[MAXN << 1]; - // 第二种建树方式 - public static int[] stack = new int[MAXN]; + public static int[] stk = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[] dp = new int[MAXN]; @@ -88,9 +87,7 @@ public static void dfs(int u, int fa) { public static int getLca(int a, int b) { if (dep[a] < dep[b]) { - int tmp = a; - a = b; - b = tmp; + int tmp = a; a = b; b = tmp; } for (int p = MAXP - 1; p >= 0; p--) { if (dep[stjump[a][p]] >= dep[b]) { @@ -141,29 +138,29 @@ public static int buildVirtualTree2() { cntv = 0; headv[arr[1]] = 0; int top = 0; - stack[++top] = arr[1]; + stk[++top] = arr[1]; for (int i = 2; i <= k; i++) { int x = arr[i]; - int y = stack[top]; + int y = stk[top]; int lca = getLca(x, y); - while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { - addEdgeV(stack[top - 1], stack[top]); + while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { + addEdgeV(stk[top - 1], stk[top]); top--; } - if (lca != stack[top]) { + if (lca != stk[top]) { headv[lca] = 0; - addEdgeV(lca, stack[top]); + addEdgeV(lca, stk[top]); top--; - stack[++top] = lca; + stk[++top] = lca; } headv[x] = 0; - stack[++top] = x; + stk[++top] = x; } while (top > 1) { - addEdgeV(stack[top - 1], stack[top]); + addEdgeV(stk[top - 1], stk[top]); top--; } - return stack[1]; + return stk[1]; } public static void dpOnTree(int u) { diff --git a/src/class180/Code01_VirtualTree2.java b/src/class180/Code01_VirtualTree2.java new file mode 100644 index 000000000..99e71ff16 --- /dev/null +++ b/src/class180/Code01_VirtualTree2.java @@ -0,0 +1,205 @@ +package class180; + +// 虚树模版题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF613D +// 测试链接 : https://codeforces.com/problemset/problem/613/D +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXP = 20; +//int n, q, k; +// +//int headg[MAXN]; +//int nextg[MAXN << 1]; +//int tog[MAXN << 1]; +//int cntg; +// +//int headv[MAXN]; +//int nextv[MAXN]; +//int tov[MAXN]; +//int cntv; +// +//int dep[MAXN]; +//int dfn[MAXN]; +//int stjump[MAXN][MAXP]; +//int cntd; +// +//int arr[MAXN]; +//bool isKey[MAXN]; +// +//int tmp[MAXN << 1]; +//int stk[MAXN]; +// +//int siz[MAXN]; +//int dp[MAXN]; +// +//bool cmp(int x, int y) { +// return dfn[x] < dfn[y]; +//} +// +//void addEdgeG(int u, int v) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// headg[u] = cntg; +//} +// +//void addEdgeV(int u, int v) { +// nextv[++cntv] = headv[u]; +// tov[cntv] = v; +// headv[u] = cntv; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// dfn[u] = ++cntd; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = headg[u]; e; e = nextg[e]) { +// if (tog[e] != fa) { +// dfs(tog[e], u); +// } +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) a = stjump[a][p]; +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//int buildVirtualTree1() { +// sort(arr + 1, arr + k + 1, cmp); +// int len = 0; +// for (int i = 1; i < k; i++) { +// tmp[++len] = arr[i]; +// tmp[++len] = getLca(arr[i], arr[i + 1]); +// } +// tmp[++len] = arr[k]; +// sort(tmp + 1, tmp + len + 1, cmp); +// int unique = 1; +// for (int i = 2; i <= len; i++) { +// if (tmp[unique] != tmp[i]) { +// tmp[++unique] = tmp[i]; +// } +// } +// cntv = 0; +// for (int i = 1; i <= unique; i++) { +// headv[tmp[i]] = 0; +// } +// for (int i = 1; i < unique; i++) { +// addEdgeV(getLca(tmp[i], tmp[i + 1]), tmp[i + 1]); +// } +// return tmp[1]; +//} +// +//int buildVirtualTree2() { +// sort(arr + 1, arr + k + 1, cmp); +// cntv = 0; +// headv[arr[1]] = 0; +// int top = 0; +// stk[++top] = arr[1]; +// for (int i = 2; i <= k; i++) { +// int x = arr[i]; +// int y = stk[top]; +// int lca = getLca(x, y); +// while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { +// addEdgeV(stk[top - 1], stk[top]); +// top--; +// } +// if (lca != stk[top]) { +// headv[lca] = 0; +// addEdgeV(lca, stk[top]); +// top--; +// stk[++top] = lca; +// } +// headv[x] = 0; +// stk[++top] = x; +// } +// while (top > 1) { +// addEdgeV(stk[top - 1], stk[top]); +// top--; +// } +// return stk[1]; +//} +// +//void dpOnTree(int u) { +// dp[u] = siz[u] = 0; +// for (int e = headv[u]; e; e = nextv[e]) { +// int v = tov[e]; +// dpOnTree(v); +// dp[u] += dp[v]; +// siz[u] += siz[v]; +// } +// if (isKey[u]) { +// dp[u] += siz[u]; +// siz[u] = 1; +// } else if (siz[u] > 1) { +// dp[u] += 1; +// siz[u] = 0; +// } +//} +// +//int compute() { +// for (int i = 1; i <= k; i++) { +// isKey[arr[i]] = true; +// } +// bool check = true; +// for (int i = 1; i <= k; i++) { +// if (isKey[stjump[arr[i]][0]]) { +// check = false; +// break; +// } +// } +// int ans = -1; +// if (check) { +// int tree = buildVirtualTree1(); +// // int tree = buildVirtualTree2(); +// dpOnTree(tree); +// ans = dp[tree]; +// } +// for (int i = 1; i <= k; i++) { +// isKey[arr[i]] = false; +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdgeG(u, v); +// addEdgeG(v, u); +// } +// dfs(1, 0); +// cin >> q; +// for (int t = 1; t <= q; t++) { +// cin >> k; +// for (int i = 1; i <= k; i++) { +// cin >> arr[i]; +// } +// cout << compute() << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index b8e67a691..18ff72b33 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -33,8 +33,9 @@ public class Code02_BigProject1 { public static int[] arr = new int[MAXN]; public static boolean[] isKey = new boolean[MAXN]; + public static int[] tmp = new int[MAXN << 1]; - public static int[] stack = new int[MAXN]; + public static int[] stk = new int[MAXN]; public static int[] siz = new int[MAXN]; public static long[] dp = new long[MAXN]; @@ -188,29 +189,29 @@ public static int buildVirtualTree2() { cntv = 0; headv[arr[1]] = 0; int top = 0; - stack[++top] = arr[1]; + stk[++top] = arr[1]; for (int i = 2; i <= k; i++) { int x = arr[i]; - int y = stack[top]; + int y = stk[top]; int lca = getLca(x, y); - while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { - addEdgeV(stack[top - 1], stack[top]); + while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { + addEdgeV(stk[top - 1], stk[top]); top--; } - if (lca != stack[top]) { + if (lca != stk[top]) { headv[lca] = 0; - addEdgeV(lca, stack[top]); + addEdgeV(lca, stk[top]); top--; - stack[++top] = lca; + stk[++top] = lca; } headv[x] = 0; - stack[++top] = x; + stk[++top] = x; } while (top > 1) { - addEdgeV(stack[top - 1], stack[top]); + addEdgeV(stk[top - 1], stk[top]); top--; } - return stack[1]; + return stk[1]; } // dp递归版,java会爆栈,C++可以通过 @@ -226,8 +227,8 @@ public static void dpOnTree1(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { dpOnTree1(tov[e]); } - for (int ei = headv[u]; ei > 0; ei = nextv[ei]) { - int v = tov[ei]; + for (int e = headv[u]; e > 0; e = nextv[e]) { + int v = tov[e]; long len = dep[v] - dep[u]; costSum += (dp[u] + 1L * siz[u] * len) * siz[v] + dp[v] * siz[u]; siz[u] += siz[v]; diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java new file mode 100644 index 000000000..f6a8abe82 --- /dev/null +++ b/src/class180/Code02_BigProject2.java @@ -0,0 +1,207 @@ +package class180; + +// 大工程,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4103 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1000001; +//const int MAXP = 21; +//const long long INF = 1LL << 60; +//int n, q, k; +// +//int headg[MAXN]; +//int nextg[MAXN << 1]; +//int tog[MAXN << 1]; +//int cntg; +// +//int headv[MAXN]; +//int nextv[MAXN]; +//int tov[MAXN]; +//int cntv; +// +//int dep[MAXN]; +//int dfn[MAXN]; +//int stjump[MAXN][MAXP]; +//int cntd; +// +//int arr[MAXN]; +//bool isKey[MAXN]; +// +//int tmp[MAXN << 1]; +//int stk[MAXN]; +// +//int siz[MAXN]; +//long long dp[MAXN]; +//long long minv[MAXN]; +//long long maxv[MAXN]; +//long long costSum, costMin, costMax; +// +//bool cmp(int x, int y) { +// return dfn[x] < dfn[y]; +//} +// +//void addEdgeG(int u, int v) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// headg[u] = cntg; +//} +// +//void addEdgeV(int u, int v) { +// nextv[++cntv] = headv[u]; +// tov[cntv] = v; +// headv[u] = cntv; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// dfn[u] = ++cntd; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[ stjump[u][p - 1] ][p - 1]; +// } +// for (int e = headg[u]; e; e = nextg[e]) { +// int v = tog[e]; +// if (v != fa) dfs(v, u); +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[ stjump[a][p] ] >= dep[b]) a = stjump[a][p]; +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//int buildVirtualTree1() { +// sort(arr + 1, arr + k + 1, cmp); +// int len = 0; +// for (int i = 1; i < k; i++) { +// tmp[++len] = arr[i]; +// tmp[++len] = getLca(arr[i], arr[i + 1]); +// } +// tmp[++len] = arr[k]; +// sort(tmp + 1, tmp + len + 1, cmp); +// int unique = 1; +// for (int i = 2; i <= len; i++) { +// if (tmp[unique] != tmp[i]) { +// tmp[++unique] = tmp[i]; +// } +// } +// cntv = 0; +// for (int i = 1; i <= unique; i++) { +// headv[tmp[i]] = 0; +// } +// for (int i = 1; i < unique; i++) { +// addEdgeV(getLca(tmp[i], tmp[i + 1]), tmp[i + 1]); +// } +// return tmp[1]; +//} +// +//int buildVirtualTree2() { +// sort(arr + 1, arr + k + 1, cmp); +// cntv = 0; +// headv[arr[1]] = 0; +// int top = 0; +// stk[++top] = arr[1]; +// for (int i = 2; i <= k; i++) { +// int x = arr[i]; +// int y = stk[top]; +// int lca = getLca(x, y); +// while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { +// addEdgeV(stk[top - 1], stk[top]); +// top--; +// } +// if (lca != stk[top]) { +// headv[lca] = 0; +// addEdgeV(lca, stk[top]); +// top--; +// stk[++top] = lca; +// } +// headv[x] = 0; +// stk[++top] = x; +// } +// while (top > 1) { +// addEdgeV(stk[top - 1], stk[top]); +// top--; +// } +// return stk[1]; +//} +// +//void dpOnTree(int u) { +// siz[u] = isKey[u] ? 1 : 0; +// dp[u] = 0; +// if (isKey[u]) { +// minv[u] = maxv[u] = 0; +// } else { +// minv[u] = INF; +// maxv[u] = -INF; +// } +// for (int e = headv[u]; e; e = nextv[e]) { +// dpOnTree(tov[e]); +// } +// for (int e = headv[u]; e; e = nextv[e]) { +// int v = tov[e]; +// long long len = (long long)dep[v] - dep[u]; +// costSum += (dp[u] + 1LL * siz[u] * len) * siz[v] + dp[v] * siz[u]; +// siz[u] += siz[v]; +// dp[u] += dp[v] + len * siz[v]; +// costMin = min(costMin, minv[u] + minv[v] + len); +// costMax = max(costMax, maxv[u] + maxv[v] + len); +// minv[u] = min(minv[u], minv[v] + len); +// maxv[u] = max(maxv[u], maxv[v] + len); +// } +//} +// +//void compute() { +// for (int i = 1; i <= k; i++) { +// isKey[arr[i]] = true; +// } +// int tree = buildVirtualTree1(); +// // int tree = buildVirtualTree2(); +// costSum = 0; +// costMin = INF; +// costMax = -INF; +// dpOnTree(tree); +// for (int i = 1; i <= k; i++) { +// isKey[arr[i]] = false; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdgeG(u, v); +// addEdgeG(v, u); +// } +// dfs(1, 0); +// cin >> q; +// for (int t = 1; t <= q; t++) { +// cin >> k; +// for (int i = 1; i <= k; i++) { +// cin >> arr[i]; +// } +// compute(); +// cout << costSum << ' ' << costMin << ' ' << costMax << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index 176335e9b..e4c500542 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -40,6 +40,7 @@ public class Code04_WorldTree1 { public static int[] arr = new int[MAXN]; public static boolean[] isKey = new boolean[MAXN]; public static int[] tmp = new int[MAXN << 1]; + public static int[] dp = new int[MAXN]; public static int[] pick = new int[MAXN]; public static int[] ans = new int[MAXN]; From 613a8db8598fe56d3c4f8a30d1e7b3452af61de6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 13:36:07 +0800 Subject: [PATCH 0825/1170] modify code --- src/class180/Code02_BigProject2.java | 4 +- src/class180/Code03_War1.java | 30 ++-- src/class180/Code03_War2.java | 219 +++++++++++++++++++++++++++ src/class180/Code04_WorldTree2.java | 8 +- 4 files changed, 240 insertions(+), 21 deletions(-) create mode 100644 src/class180/Code03_War2.java diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index f6a8abe82..0d3e6c94c 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -90,7 +90,7 @@ //} // //int buildVirtualTree1() { -// sort(arr + 1, arr + k + 1, cmp); +// sort(arr + 1, arr + k + 1, cmp); // int len = 0; // for (int i = 1; i < k; i++) { // tmp[++len] = arr[i]; @@ -115,7 +115,7 @@ //} // //int buildVirtualTree2() { -// sort(arr + 1, arr + k + 1, cmp); +// sort(arr + 1, arr + k + 1, cmp); // cntv = 0; // headv[arr[1]] = 0; // int top = 0; diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index 4e8b5aae8..88a53e6f0 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -13,7 +13,7 @@ public class Code03_War1 { public static int MAXN = 300001; public static int MAXP = 20; - public static int n, m, k; + public static int n, q, k; public static int[] headg = new int[MAXN]; public static int[] nextg = new int[MAXN << 1]; @@ -34,9 +34,9 @@ public class Code03_War1 { public static int cntd; public static int[] arr = new int[MAXN]; - public static int[] tmp = new int[MAXN << 1]; - public static int[] stack = new int[MAXN]; public static boolean[] isKey = new boolean[MAXN]; + public static int[] tmp = new int[MAXN << 1]; + public static int[] stk = new int[MAXN]; public static long[] dp = new long[MAXN]; public static void addEdgeG(int u, int v, int w) { @@ -172,29 +172,29 @@ public static int buildVirtualTree2() { cntv = 0; headv[1] = 0; int top = 0; - stack[++top] = 1; + stk[++top] = 1; for (int i = 1; i <= k; i++) { int x = arr[i]; - int y = stack[top]; + int y = stk[top]; int lca = getLca(x, y); - while (top > 1 && dfn[stack[top - 1]] >= dfn[lca]) { - addEdgeV(stack[top - 1], stack[top], getDist(stack[top - 1], stack[top])); + while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { + addEdgeV(stk[top - 1], stk[top], getDist(stk[top - 1], stk[top])); top--; } - if (lca != stack[top]) { + if (lca != stk[top]) { headv[lca] = 0; - addEdgeV(lca, stack[top], getDist(lca, stack[top])); + addEdgeV(lca, stk[top], getDist(lca, stk[top])); top--; - stack[++top] = lca; + stk[++top] = lca; } headv[x] = 0; - stack[++top] = x; + stk[++top] = x; } while (top > 1) { - addEdgeV(stack[top - 1], stack[top], getDist(stack[top - 1], stack[top])); + addEdgeV(stk[top - 1], stk[top], getDist(stk[top - 1], stk[top])); top--; } - return stack[1]; + return stk[1]; } public static void dpOnTree(int u) { @@ -238,8 +238,8 @@ public static void main(String[] args) throws Exception { addEdgeG(v, u, w); } dfs(1, 0, 0); - m = in.nextInt(); - for (int t = 1; t <= m; t++) { + q = in.nextInt(); + for (int t = 1; t <= q; t++) { k = in.nextInt(); for (int i = 1; i <= k; i++) { arr[i] = in.nextInt(); diff --git a/src/class180/Code03_War2.java b/src/class180/Code03_War2.java new file mode 100644 index 000000000..7f83a8813 --- /dev/null +++ b/src/class180/Code03_War2.java @@ -0,0 +1,219 @@ +package class180; + +// 消耗战,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2495 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//const int MAXP = 20; +//int n, q, k; +// +//int headg[MAXN]; +//int nextg[MAXN << 1]; +//int tog[MAXN << 1]; +//int weightg[MAXN << 1]; +//int cntg; +// +//int headv[MAXN]; +//int nextv[MAXN]; +//int tov[MAXN]; +//int weightv[MAXN]; +//int cntv; +// +//int dep[MAXN]; +//int dfn[MAXN]; +//int stjump[MAXN][MAXP]; +//int mindist[MAXN][MAXP]; +//int cntd; +// +//int arr[MAXN]; +//bool isKey[MAXN]; +//int tmp[MAXN << 1]; +//int stk[MAXN]; +//long long dp[MAXN]; +// +//bool cmp(int x, int y) { +// return dfn[x] < dfn[y]; +//} +// +//void addEdgeG(int u, int v, int w) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// weightg[cntg] = w; +// headg[u] = cntg; +//} +// +//void addEdgeV(int u, int v, int w) { +// nextv[++cntv] = headv[u]; +// tov[cntv] = v; +// weightv[cntv] = w; +// headv[u] = cntv; +//} +// +//void dfs(int u, int fa, int w) { +// dep[u] = dep[fa] + 1; +// dfn[u] = ++cntd; +// stjump[u][0] = fa; +// mindist[u][0] = w; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// mindist[u][p] = min(mindist[u][p - 1], mindist[stjump[u][p - 1]][p - 1]); +// } +// for (int e = headg[u]; e; e = nextg[e]) { +// int v = tog[e]; +// if (v != fa) dfs(v, u, weightg[e]); +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//int getDist(int a, int b) { +// int dist = 100000001; +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// dist = min(dist, mindist[a][p]); +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return dist; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// dist = min(dist, min(mindist[a][p], mindist[b][p])); +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return dist; +//} +// +//int buildVirtualTree1() { +// sort(arr + 1, arr + k + 1, cmp); +// int len = 0; +// tmp[++len] = 1; +// for (int i = 1; i < k; i++) { +// tmp[++len] = arr[i]; +// tmp[++len] = getLca(arr[i], arr[i + 1]); +// } +// tmp[++len] = arr[k]; +// sort(tmp + 1, tmp + len + 1, cmp); +// int uniqueCnt = 1; +// for (int i = 2; i <= len; i++) { +// if (tmp[uniqueCnt] != tmp[i]) tmp[++uniqueCnt] = tmp[i]; +// } +// cntv = 0; +// for (int i = 1; i <= uniqueCnt; i++) headv[tmp[i]] = 0; +// for (int i = 1; i < uniqueCnt; i++) { +// int lca = getLca(tmp[i], tmp[i + 1]); +// addEdgeV(lca, tmp[i + 1], getDist(lca, tmp[i + 1])); +// } +// return tmp[1]; +//} +// +//int buildVirtualTree2() { +// sort(arr + 1, arr + k + 1, cmp); +// cntv = 0; +// headv[1] = 0; +// int top = 0; +// stk[++top] = 1; +// for (int i = 1; i <= k; i++) { +// int x = arr[i]; +// int y = stk[top]; +// int lca = getLca(x, y); +// while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { +// addEdgeV(stk[top - 1], stk[top], getDist(stk[top - 1], stk[top])); +// top--; +// } +// if (lca != stk[top]) { +// headv[lca] = 0; +// addEdgeV(lca, stk[top], getDist(lca, stk[top])); +// top--; +// stk[++top] = lca; +// } +// headv[x] = 0; +// stk[++top] = x; +// } +// while (top > 1) { +// addEdgeV(stk[top - 1], stk[top], getDist(stk[top - 1], stk[top])); +// top--; +// } +// return stk[1]; +//} +// +//void dpOnTree(int u) { +// for (int e = headv[u]; e; e = nextv[e]) { +// dpOnTree(tov[e]); +// } +// dp[u] = 0; +// for (int e = headv[u]; e; e = nextv[e]) { +// int v = tov[e]; +// int w = weightv[e]; +// if (isKey[v]) { +// dp[u] += w; +// } else { +// dp[u] += min(dp[v], (long long)w); +// } +// } +//} +// +//long long compute() { +// for (int i = 1; i <= k; i++) { +// isKey[arr[i]] = true; +// } +// int tree = buildVirtualTree1(); +// // int tree = buildVirtualTree2(); +// dpOnTree(tree); +// for (int i = 1; i <= k; i++) { +// isKey[arr[i]] = false; +// } +// return dp[tree]; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdgeG(u, v, w); +// addEdgeG(v, u, w); +// } +// dfs(1, 0, 0); +// cin >> q; +// for (int t = 1; t <= q; t++) { +// cin >> k; +// for (int i = 1; i <= k; i++) { +// cin >> arr[i]; +// } +// cout << compute() << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index ea654dc0c..238d883e0 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -39,6 +39,10 @@ //int pick[MAXN]; //int ans[MAXN]; // +//bool cmp(int x, int y) { +// return dfn[x] < dfn[y]; +//} +// //void addEdgeG(int u, int v) { // nextg[++cntg] = headg[u]; // tog[cntg] = v; @@ -51,10 +55,6 @@ // headv[u] = cntv; //} // -//bool cmp(int x, int y) { -// return dfn[x] < dfn[y]; -//} -// //void dfs(int u, int fa) { // dep[u] = dep[fa] + 1; // siz[u] = 1; From dc11d7319309cc5c826f4c07923cfd576eec0c10 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 13:58:09 +0800 Subject: [PATCH 0826/1170] modify code --- src/class180/Code05_TreasureHunt1.java | 6 +- src/class180/Code05_TreasureHunt2.java | 130 +++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 src/class180/Code05_TreasureHunt2.java diff --git a/src/class180/Code05_TreasureHunt1.java b/src/class180/Code05_TreasureHunt1.java index d651e5798..ebded195f 100644 --- a/src/class180/Code05_TreasureHunt1.java +++ b/src/class180/Code05_TreasureHunt1.java @@ -151,13 +151,13 @@ public static void compute() { } low = seg[low]; high = seg[high]; - long curDist = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); + long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); if (!vis[nodeId]) { vis[nodeId] = true; - curAns += curDist; + curAns += delta; } else { vis[nodeId] = false; - curAns -= curDist; + curAns -= delta; } ans[i] = curAns; } diff --git a/src/class180/Code05_TreasureHunt2.java b/src/class180/Code05_TreasureHunt2.java new file mode 100644 index 000000000..aca0add39 --- /dev/null +++ b/src/class180/Code05_TreasureHunt2.java @@ -0,0 +1,130 @@ +package class180; + +// 寻宝游戏,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3320 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXP = 20; +//int n, m; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//int dep[MAXN]; +//int dfn[MAXN]; +//int seg[MAXN]; +//long long dist[MAXN]; +//int stjump[MAXN][MAXP]; +//int cntd; +// +//int arr[MAXN]; +//bool vis[MAXN]; +//std::set st; +//std::set::iterator it; +// +//long long ans[MAXN]; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void dfs(int u, int fa, int w) { +// dep[u] = dep[fa] + 1; +// dfn[u] = ++cntd; +// seg[cntd] = u; +// dist[u] = dist[fa] + w; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// dfs(v, u, weight[e]); +// } +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//long long getDist(int x, int y) { +// return dist[x] + dist[y] - 2LL * dist[getLca(x, y)]; +//} +// +//void compute() { +// long long curAns = 0; +// for (int i = 1; i <= m; i++) { +// int nodeId = arr[i]; +// int dfnId = dfn[nodeId]; +// if (!vis[nodeId]) { +// st.insert(dfnId); +// } +// int low = (it = st.lower_bound(dfnId)) == st.begin() ? *--st.end() : *--it; +// int high = (it = st.upper_bound(dfnId)) == st.end() ? *st.begin() : *it; +// if (vis[nodeId]) { +// st.erase(dfnId); +// } +// low = seg[low]; +// high = seg[high]; +// long long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); +// if (!vis[nodeId]) { +// vis[nodeId] = true; +// curAns += delta; +// } else { +// vis[nodeId] = false; +// curAns -= delta; +// } +// ans[i] = curAns; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); +// } +// dfs(1, 0, 0); +// for (int i = 1; i <= m; i++) { +// cin >> arr[i]; +// } +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 7c30d1123e66bb3e81db60a71b4a645f10b9e213 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 14:43:27 +0800 Subject: [PATCH 0827/1170] modify code --- src/class180/Code03_War2.java | 12 +- src/class180/Code06_TreelandAndViruses1.java | 14 +- src/class180/Code06_TreelandAndViruses2.java | 215 +++++++++++++++++++ 3 files changed, 231 insertions(+), 10 deletions(-) create mode 100644 src/class180/Code06_TreelandAndViruses2.java diff --git a/src/class180/Code03_War2.java b/src/class180/Code03_War2.java index 7f83a8813..a5e1caf0c 100644 --- a/src/class180/Code03_War2.java +++ b/src/class180/Code03_War2.java @@ -125,13 +125,17 @@ // } // tmp[++len] = arr[k]; // sort(tmp + 1, tmp + len + 1, cmp); -// int uniqueCnt = 1; +// int unique = 1; // for (int i = 2; i <= len; i++) { -// if (tmp[uniqueCnt] != tmp[i]) tmp[++uniqueCnt] = tmp[i]; +// if (tmp[unique] != tmp[i]) { +// tmp[++unique] = tmp[i]; +// } // } // cntv = 0; -// for (int i = 1; i <= uniqueCnt; i++) headv[tmp[i]] = 0; -// for (int i = 1; i < uniqueCnt; i++) { +// for (int i = 1; i <= unique; i++) { +// headv[tmp[i]] = 0; +// } +// for (int i = 1; i < unique; i++) { // int lca = getLca(tmp[i], tmp[i + 1]); // addEdgeV(lca, tmp[i + 1], getDist(lca, tmp[i + 1])); // } diff --git a/src/class180/Code06_TreelandAndViruses1.java b/src/class180/Code06_TreelandAndViruses1.java index 65d6c6de3..5d9aa1db2 100644 --- a/src/class180/Code06_TreelandAndViruses1.java +++ b/src/class180/Code06_TreelandAndViruses1.java @@ -62,9 +62,8 @@ public int compare(Node o1, Node o2) { public static int[] arr = new int[MAXN << 1]; public static int[] tmp = new int[MAXN << 2]; - public static int unique; + public static int len; - // dijkstra算法需要 public static PriorityQueue heap = new PriorityQueue<>(new NodeCmp()); public static boolean[] vis = new boolean[MAXN]; public static int[] minTime = new int[MAXN]; @@ -92,7 +91,9 @@ public static void sortByDfn(int[] nums, int l, int r) { while (dfn[nums[i]] < dfn[pivot]) i++; while (dfn[nums[j]] > dfn[pivot]) j--; if (i <= j) { - int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; i++; j--; } } @@ -144,14 +145,14 @@ public static int buildVirtualTree() { arr[++tot] = query[i]; } sortByDfn(arr, 1, tot); - int len = 0; + len = 0; for (int i = 1; i < tot; i++) { tmp[++len] = arr[i]; tmp[++len] = getLca(arr[i], arr[i + 1]); } tmp[++len] = arr[tot]; sortByDfn(tmp, 1, len); - unique = 1; + int unique = 1; for (int i = 2; i <= len; i++) { if (tmp[unique] != tmp[i]) { tmp[++unique] = tmp[i]; @@ -169,11 +170,12 @@ public static int buildVirtualTree() { addEdgeV(lca, tmp[i + 1]); addEdgeV(tmp[i + 1], lca); } + len = unique; return tmp[1]; } public static void dijkstra() { - for (int i = 1; i <= unique; i++) { + for (int i = 1; i <= len; i++) { int u = tmp[i]; minTime[u] = n + 1; bestSource[u] = n + 1; diff --git a/src/class180/Code06_TreelandAndViruses2.java b/src/class180/Code06_TreelandAndViruses2.java new file mode 100644 index 000000000..62b0ed402 --- /dev/null +++ b/src/class180/Code06_TreelandAndViruses2.java @@ -0,0 +1,215 @@ +package class180; + +// 树上病毒传播,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1320E +// 测试链接 : https://codeforces.com/problemset/problem/1320/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int id, dist, time, source, sourceOrder; +// bool operator<(const Node &other) const { +// if (time != other.time) { +// return time > other.time; +// } +// return sourceOrder > other.sourceOrder; +// } +//}; +// +//const int MAXN = 200001; +//const int MAXP = 20; +//int n, q, k, m; +// +//int headg[MAXN]; +//int nextg[MAXN << 1]; +//int tog[MAXN << 1]; +//int cntg; +// +//int headv[MAXN]; +//int nextv[MAXN << 1]; +//int tov[MAXN << 1]; +//int cntv; +// +//int dep[MAXN]; +//int dfn[MAXN]; +//int stjump[MAXN][MAXP]; +//int cntd; +// +//int start[MAXN]; +//int speed[MAXN]; +//int query[MAXN]; +//int order[MAXN]; +// +//int arr[MAXN << 1]; +//int tmp[MAXN << 2]; +//int len; +// +//priority_queue heap; +//bool vis[MAXN]; +//int minTime[MAXN]; +//int bestSource[MAXN]; +//int ans[MAXN]; +// +//bool cmp(int x, int y) { +// return dfn[x] < dfn[y]; +//} +// +//void addEdgeG(int u, int v) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// headg[u] = cntg; +//} +// +//void addEdgeV(int u, int v) { +// nextv[++cntv] = headv[u]; +// tov[cntv] = v; +// headv[u] = cntv; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// dfn[u] = ++cntd; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = headg[u]; e; e = nextg[e]) { +// if (tog[e] != fa) { +// dfs(tog[e], u); +// } +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//int buildVirtualTree() { +// int tot = 0; +// for (int i = 1; i <= k; i++) { +// arr[++tot] = start[i]; +// } +// for (int i = 1; i <= m; i++) { +// arr[++tot] = query[i]; +// } +// sort(arr + 1, arr + tot + 1, cmp); +// len = 0; +// for (int i = 1; i < tot; i++) { +// tmp[++len] = arr[i]; +// tmp[++len] = getLca(arr[i], arr[i + 1]); +// } +// tmp[++len] = arr[tot]; +// sort(tmp + 1, tmp + len + 1, cmp); +// int unique = 1; +// for (int i = 2; i <= len; i++) { +// if (tmp[unique] != tmp[i]) { +// tmp[++unique] = tmp[i]; +// } +// } +// cntv = 0; +// for (int i = 1; i <= unique; i++) { +// headv[tmp[i]] = 0; +// } +// for (int i = 1; i < unique; i++) { +// int lca = getLca(tmp[i], tmp[i + 1]); +// addEdgeV(lca, tmp[i + 1]); +// addEdgeV(tmp[i + 1], lca); +// } +// len = unique; +// return tmp[1]; +//} +// +//void dijkstra() { +// for (int i = 1; i <= len; i++) { +// int u = tmp[i]; +// minTime[u] = n + 1; +// bestSource[u] = n + 1; +// vis[u] = false; +// } +// for (int i = 1; i <= k; i++) { +// int s = start[i]; +// minTime[s] = 0; +// bestSource[s] = s; +// heap.push(Node{s, 0, 0, s, order[s]}); +// } +// while (!heap.empty()) { +// Node cur = heap.top(); +// heap.pop(); +// int u = cur.id; +// if (!vis[u]) { +// vis[u] = true; +// for (int e = headv[u]; e; e = nextv[e]) { +// int v = tov[e]; +// int dist = cur.dist + abs(dep[u] - dep[v]); +// int time = (dist + speed[cur.source] - 1) / speed[cur.source]; +// if (!vis[v] && (time < minTime[v] || (time == minTime[v] && cur.sourceOrder < order[bestSource[v]]))) { +// minTime[v] = time; +// bestSource[v] = cur.source; +// heap.push(Node{v, dist, time, cur.source, cur.sourceOrder}); +// } +// } +// } +// } +//} +// +//void compute() { +// for (int i = 1; i <= k; i++) { +// order[start[i]] = i; +// } +// buildVirtualTree(); +// dijkstra(); +// for (int i = 1; i <= m; i++) { +// ans[i] = order[bestSource[query[i]]]; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdgeG(u, v); +// addEdgeG(v, u); +// } +// dfs(1, 0); +// cin >> q; +// for (int t = 1; t <= q; t++) { +// cin >> k >> m; +// for (int i = 1, s, v; i <= k; i++) { +// cin >> s >> v; +// start[i] = s; +// speed[s] = v; +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i]; +// } +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << ' '; +// } +// cout << '\n'; +// } +// return 0; +//} \ No newline at end of file From 19823912bdf54493a12ecbeecb07eea0f65cb325 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 14:48:38 +0800 Subject: [PATCH 0828/1170] modify code --- ...TreelandAndViruses1.java => Code05_TreelandAndViruses1.java} | 2 +- ...TreelandAndViruses2.java => Code05_TreelandAndViruses2.java} | 0 .../{Code05_TreasureHunt1.java => Code06_TreasureHunt1.java} | 2 +- .../{Code05_TreasureHunt2.java => Code06_TreasureHunt2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class180/{Code06_TreelandAndViruses1.java => Code05_TreelandAndViruses1.java} (99%) rename src/class180/{Code06_TreelandAndViruses2.java => Code05_TreelandAndViruses2.java} (100%) rename src/class180/{Code05_TreasureHunt1.java => Code06_TreasureHunt1.java} (99%) rename src/class180/{Code05_TreasureHunt2.java => Code06_TreasureHunt2.java} (100%) diff --git a/src/class180/Code06_TreelandAndViruses1.java b/src/class180/Code05_TreelandAndViruses1.java similarity index 99% rename from src/class180/Code06_TreelandAndViruses1.java rename to src/class180/Code05_TreelandAndViruses1.java index 5d9aa1db2..db2d05685 100644 --- a/src/class180/Code06_TreelandAndViruses1.java +++ b/src/class180/Code05_TreelandAndViruses1.java @@ -12,7 +12,7 @@ import java.util.Comparator; import java.util.PriorityQueue; -public class Code06_TreelandAndViruses1 { +public class Code05_TreelandAndViruses1 { static class Node { int id, dist, time, source, sourceOrder; diff --git a/src/class180/Code06_TreelandAndViruses2.java b/src/class180/Code05_TreelandAndViruses2.java similarity index 100% rename from src/class180/Code06_TreelandAndViruses2.java rename to src/class180/Code05_TreelandAndViruses2.java diff --git a/src/class180/Code05_TreasureHunt1.java b/src/class180/Code06_TreasureHunt1.java similarity index 99% rename from src/class180/Code05_TreasureHunt1.java rename to src/class180/Code06_TreasureHunt1.java index ebded195f..34fedadc1 100644 --- a/src/class180/Code05_TreasureHunt1.java +++ b/src/class180/Code06_TreasureHunt1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.TreeSet; -public class Code05_TreasureHunt1 { +public class Code06_TreasureHunt1 { public static int MAXN = 100001; public static int MAXP = 20; diff --git a/src/class180/Code05_TreasureHunt2.java b/src/class180/Code06_TreasureHunt2.java similarity index 100% rename from src/class180/Code05_TreasureHunt2.java rename to src/class180/Code06_TreasureHunt2.java From 0fc93ff1cfb4978337763ff1dae88eec4308a073 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 17:15:11 +0800 Subject: [PATCH 0829/1170] modify code --- src/class180/Code05_TreelandAndViruses1.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class180/Code05_TreelandAndViruses1.java b/src/class180/Code05_TreelandAndViruses1.java index db2d05685..01b344ea6 100644 --- a/src/class180/Code05_TreelandAndViruses1.java +++ b/src/class180/Code05_TreelandAndViruses1.java @@ -163,9 +163,8 @@ public static int buildVirtualTree() { headv[tmp[i]] = 0; } for (int i = 1; i < unique; i++) { - // 这里要两个方向加边 + // 虚树的边不是单向的,是双向的 // 因为病毒感染既可以向上也可以向下 - // 所以跑dijkstra算法时需要无向图 int lca = getLca(tmp[i], tmp[i + 1]); addEdgeV(lca, tmp[i + 1]); addEdgeV(tmp[i + 1], lca); From cfaaaae0936107329e1e864404a744c927c664fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 18:08:18 +0800 Subject: [PATCH 0830/1170] modify code --- src/class180/Code01_VirtualTree1.java | 26 ++++++++++++------- src/class180/Code01_VirtualTree2.java | 26 ++++++++++++------- src/class180/Code02_BigProject1.java | 36 +++++++++++++++++---------- src/class180/Code02_BigProject2.java | 24 ++++++++++++------ 4 files changed, 74 insertions(+), 38 deletions(-) diff --git a/src/class180/Code01_VirtualTree1.java b/src/class180/Code01_VirtualTree1.java index 7f5643b44..af367a905 100644 --- a/src/class180/Code01_VirtualTree1.java +++ b/src/class180/Code01_VirtualTree1.java @@ -1,6 +1,14 @@ package class180; // 虚树模版题,java版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 一共有q条查询,每条查询格式如下 +// 查询 k a1 a2 ... ak : 给出了k个不同的重要点,其他点是非重要点 +// 你可以攻占非重要点,被攻占的点无法通行 +// 要让重要点两两之间不再连通,打印至少需要攻占几个非重要点 +// 如果攻占非重要点无法达成目标,打印-1 +// 1 <= n、q <= 10^5 +// 1 <= 所有查询给出的点的总数 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF613D // 测试链接 : https://codeforces.com/problemset/problem/613/D // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -40,7 +48,7 @@ public class Code01_VirtualTree1 { public static int[] stk = new int[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] dp = new int[MAXN]; + public static int[] cost = new int[MAXN]; public static void addEdgeG(int u, int v) { nextg[++cntg] = headg[u]; @@ -163,19 +171,19 @@ public static int buildVirtualTree2() { return stk[1]; } - public static void dpOnTree(int u) { - dp[u] = siz[u] = 0; + public static void dp(int u) { + cost[u] = siz[u] = 0; for (int e = headv[u], v; e > 0; e = nextv[e]) { v = tov[e]; - dpOnTree(v); - dp[u] += dp[v]; + dp(v); + cost[u] += cost[v]; siz[u] += siz[v]; } if (isKey[u]) { - dp[u] += siz[u]; + cost[u] += siz[u]; siz[u] = 1; } else if (siz[u] > 1) { - dp[u]++; + cost[u]++; siz[u] = 0; } } @@ -195,8 +203,8 @@ public static int compute() { if (check) { int tree = buildVirtualTree1(); // int tree = buildVirtualTree2(); - dpOnTree(tree); - ans = dp[tree]; + dp(tree); + ans = cost[tree]; } for (int i = 1; i <= k; i++) { isKey[arr[i]] = false; diff --git a/src/class180/Code01_VirtualTree2.java b/src/class180/Code01_VirtualTree2.java index 99e71ff16..7a025398f 100644 --- a/src/class180/Code01_VirtualTree2.java +++ b/src/class180/Code01_VirtualTree2.java @@ -1,6 +1,14 @@ package class180; // 虚树模版题,C++版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 一共有q条查询,每条查询格式如下 +// 查询 k a1 a2 ... ak : 给出了k个不同的重要点,其他点是非重要点 +// 你可以攻占非重要点,被攻占的点无法通行 +// 要让重要点两两之间不再连通,打印至少需要攻占几个非重要点 +// 如果攻占非重要点无法达成目标,打印-1 +// 1 <= n、q <= 10^5 +// 1 <= 所有查询给出的点的总数 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF613D // 测试链接 : https://codeforces.com/problemset/problem/613/D // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -36,7 +44,7 @@ //int stk[MAXN]; // //int siz[MAXN]; -//int dp[MAXN]; +//int cost[MAXN]; // //bool cmp(int x, int y) { // return dfn[x] < dfn[y]; @@ -142,19 +150,19 @@ // return stk[1]; //} // -//void dpOnTree(int u) { -// dp[u] = siz[u] = 0; +//void dp(int u) { +// cost[u] = siz[u] = 0; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; -// dpOnTree(v); -// dp[u] += dp[v]; +// dp(v); +// cost[u] += cost[v]; // siz[u] += siz[v]; // } // if (isKey[u]) { -// dp[u] += siz[u]; +// cost[u] += siz[u]; // siz[u] = 1; // } else if (siz[u] > 1) { -// dp[u] += 1; +// cost[u] += 1; // siz[u] = 0; // } //} @@ -174,8 +182,8 @@ // if (check) { // int tree = buildVirtualTree1(); // // int tree = buildVirtualTree2(); -// dpOnTree(tree); -// ans = dp[tree]; +// dp(tree); +// ans = cost[tree]; // } // for (int i = 1; i <= k; i++) { // isKey[arr[i]] = false; diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index 18ff72b33..af4c42fbc 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -1,6 +1,16 @@ package class180; // 大工程,java版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 如果在节点a和节点b之间建立新通道,那么代价是两个节点在树上的距离 +// 一共有q条查询,每条查询格式如下 +// 查询 k a1 a2 ... ak : 给出了k个不同的节点,任意两个节点之间都会建立新通道 +// 打印新通道的代价和 +// 打印新通道中代价最小的值 +// 打印新通道中代价最大的值 +// 1 <= n <= 10^6 +// 1 <= q <= 5 * 10^4 +// 1 <= 所有查询给出的点的总数 <= 2 * n // 测试链接 : https://www.luogu.com.cn/problem/P4103 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -38,7 +48,7 @@ public class Code02_BigProject1 { public static int[] stk = new int[MAXN]; public static int[] siz = new int[MAXN]; - public static long[] dp = new long[MAXN]; + public static long[] sum = new long[MAXN]; public static long[] minv = new long[MAXN]; public static long[] maxv = new long[MAXN]; public static long costSum, costMin, costMax; @@ -215,9 +225,9 @@ public static int buildVirtualTree2() { } // dp递归版,java会爆栈,C++可以通过 - public static void dpOnTree1(int u) { + public static void dp1(int u) { siz[u] = isKey[u] ? 1 : 0; - dp[u] = 0; + sum[u] = 0; if (isKey[u]) { maxv[u] = minv[u] = 0; } else { @@ -225,14 +235,14 @@ public static void dpOnTree1(int u) { maxv[u] = -INF; } for (int e = headv[u]; e > 0; e = nextv[e]) { - dpOnTree1(tov[e]); + dp1(tov[e]); } for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; long len = dep[v] - dep[u]; - costSum += (dp[u] + 1L * siz[u] * len) * siz[v] + dp[v] * siz[u]; + costSum += (sum[u] + 1L * siz[u] * len) * siz[v] + sum[v] * siz[u]; siz[u] += siz[v]; - dp[u] += dp[v] + len * siz[v]; + sum[u] += sum[v] + len * siz[v]; costMin = Math.min(costMin, minv[u] + minv[v] + len); costMax = Math.max(costMax, maxv[u] + maxv[v] + len); minv[u] = Math.min(minv[u], minv[v] + len); @@ -240,15 +250,15 @@ public static void dpOnTree1(int u) { } } - // dpOnTree1的迭代版 - public static void dpOnTree2(int tree) { + // dp1的迭代版 + public static void dp2(int tree) { stacksize = 0; push(tree, 0, -1); while (stacksize > 0) { pop(); if (e == -1) { siz[u] = isKey[u] ? 1 : 0; - dp[u] = 0; + sum[u] = 0; if (isKey[u]) { maxv[u] = minv[u] = 0; } else { @@ -266,9 +276,9 @@ public static void dpOnTree2(int tree) { for (int ei = headv[u]; ei > 0; ei = nextv[ei]) { int v = tov[ei]; long len = dep[v] - dep[u]; - costSum += (dp[u] + 1L * siz[u] * len) * siz[v] + dp[v] * siz[u]; + costSum += (sum[u] + 1L * siz[u] * len) * siz[v] + sum[v] * siz[u]; siz[u] += siz[v]; - dp[u] += dp[v] + len * siz[v]; + sum[u] += sum[v] + len * siz[v]; costMin = Math.min(costMin, minv[u] + minv[v] + len); costMax = Math.max(costMax, maxv[u] + maxv[v] + len); minv[u] = Math.min(minv[u], minv[v] + len); @@ -287,8 +297,8 @@ public static void compute() { costSum = 0; costMin = INF; costMax = -INF; - // dpOnTree1(tree); - dpOnTree2(tree); + // dp1(tree); + dp2(tree); for (int i = 1; i <= k; i++) { isKey[arr[i]] = false; } diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index 0d3e6c94c..20acba1db 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -1,6 +1,16 @@ package class180; // 大工程,C++版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 如果在节点a和节点b之间建立新通道,那么代价是两个节点在树上的距离 +// 一共有q条查询,每条查询格式如下 +// 查询 k a1 a2 ... ak : 给出了k个不同的节点,任意两个节点之间都会建立新通道 +// 打印新通道的代价和 +// 打印新通道中代价最小的值 +// 打印新通道中代价最大的值 +// 1 <= n <= 10^6 +// 1 <= q <= 5 * 10^4 +// 1 <= 所有查询给出的点的总数 <= 2 * n // 测试链接 : https://www.luogu.com.cn/problem/P4103 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -36,7 +46,7 @@ //int stk[MAXN]; // //int siz[MAXN]; -//long long dp[MAXN]; +//long long sum[MAXN]; //long long minv[MAXN]; //long long maxv[MAXN]; //long long costSum, costMin, costMax; @@ -144,9 +154,9 @@ // return stk[1]; //} // -//void dpOnTree(int u) { +//void dp(int u) { // siz[u] = isKey[u] ? 1 : 0; -// dp[u] = 0; +// sum[u] = 0; // if (isKey[u]) { // minv[u] = maxv[u] = 0; // } else { @@ -154,14 +164,14 @@ // maxv[u] = -INF; // } // for (int e = headv[u]; e; e = nextv[e]) { -// dpOnTree(tov[e]); +// dp(tov[e]); // } // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // long long len = (long long)dep[v] - dep[u]; -// costSum += (dp[u] + 1LL * siz[u] * len) * siz[v] + dp[v] * siz[u]; +// costSum += (sum[u] + 1LL * siz[u] * len) * siz[v] + sum[v] * siz[u]; // siz[u] += siz[v]; -// dp[u] += dp[v] + len * siz[v]; +// sum[u] += sum[v] + len * siz[v]; // costMin = min(costMin, minv[u] + minv[v] + len); // costMax = max(costMax, maxv[u] + maxv[v] + len); // minv[u] = min(minv[u], minv[v] + len); @@ -178,7 +188,7 @@ // costSum = 0; // costMin = INF; // costMax = -INF; -// dpOnTree(tree); +// dp(tree); // for (int i = 1; i <= k; i++) { // isKey[arr[i]] = false; // } From 8157f3a570ac6170a3b2c6c73eff68c4f0dbd9ae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 18:36:07 +0800 Subject: [PATCH 0831/1170] modify code --- src/class180/Code01_VirtualTree1.java | 2 +- src/class180/Code01_VirtualTree2.java | 2 +- src/class180/Code02_BigProject1.java | 2 +- src/class180/Code02_BigProject2.java | 2 +- src/class180/Code03_War1.java | 26 +++++++++++++++++--------- src/class180/Code03_War2.java | 26 +++++++++++++++++--------- 6 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/class180/Code01_VirtualTree1.java b/src/class180/Code01_VirtualTree1.java index af367a905..f697bdede 100644 --- a/src/class180/Code01_VirtualTree1.java +++ b/src/class180/Code01_VirtualTree1.java @@ -1,7 +1,7 @@ package class180; // 虚树模版题,java版 -// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的重要点,其他点是非重要点 // 你可以攻占非重要点,被攻占的点无法通行 diff --git a/src/class180/Code01_VirtualTree2.java b/src/class180/Code01_VirtualTree2.java index 7a025398f..164d1c40b 100644 --- a/src/class180/Code01_VirtualTree2.java +++ b/src/class180/Code01_VirtualTree2.java @@ -1,7 +1,7 @@ package class180; // 虚树模版题,C++版 -// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的重要点,其他点是非重要点 // 你可以攻占非重要点,被攻占的点无法通行 diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index af4c42fbc..11d4d6ec9 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -1,7 +1,7 @@ package class180; // 大工程,java版 -// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 // 如果在节点a和节点b之间建立新通道,那么代价是两个节点在树上的距离 // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的节点,任意两个节点之间都会建立新通道 diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index 20acba1db..be47ad5f4 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -1,7 +1,7 @@ package class180; // 大工程,C++版 -// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 // 如果在节点a和节点b之间建立新通道,那么代价是两个节点在树上的距离 // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的节点,任意两个节点之间都会建立新通道 diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index 88a53e6f0..d434c360a 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -1,6 +1,13 @@ package class180; // 消耗战,java版 +// 一共有n个节点,给定n-1条无向边,每条边有边权,所有节点组成一棵树 +// 一共有q条查询,每条查询格式如下 +// 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,并且一定不包含1号节点 +// 你可以随意选择边进行切断,切断的代价就是边权 +// 目的是让所有关键点都无法到达1号节点,打印最小总代价 +// 1 <= n、m <= 5 * 10^5 +// 1 <= 所有查询给出的点的总数 <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2495 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -11,7 +18,7 @@ public class Code03_War1 { - public static int MAXN = 300001; + public static int MAXN = 500001; public static int MAXP = 20; public static int n, q, k; @@ -37,7 +44,8 @@ public class Code03_War1 { public static boolean[] isKey = new boolean[MAXN]; public static int[] tmp = new int[MAXN << 1]; public static int[] stk = new int[MAXN]; - public static long[] dp = new long[MAXN]; + + public static long[] cut = new long[MAXN]; public static void addEdgeG(int u, int v, int w) { nextg[++cntg] = headg[u]; @@ -197,18 +205,18 @@ public static int buildVirtualTree2() { return stk[1]; } - public static void dpOnTree(int u) { + public static void dp(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { - dpOnTree(tov[e]); + dp(tov[e]); } - dp[u] = 0; + cut[u] = 0; for (int e = headv[u], v, w; e > 0; e = nextv[e]) { v = tov[e]; w = weightv[e]; if (isKey[v]) { - dp[u] += w; + cut[u] += w; } else { - dp[u] += Math.min(dp[v], w); + cut[u] += Math.min(cut[v], w); } } } @@ -219,11 +227,11 @@ public static long compute() { } int tree = buildVirtualTree1(); // int tree = buildVirtualTree2(); - dpOnTree(tree); + dp(tree); for (int i = 1; i <= k; i++) { isKey[arr[i]] = false; } - return dp[tree]; + return cut[tree]; } public static void main(String[] args) throws Exception { diff --git a/src/class180/Code03_War2.java b/src/class180/Code03_War2.java index a5e1caf0c..3b2371615 100644 --- a/src/class180/Code03_War2.java +++ b/src/class180/Code03_War2.java @@ -1,6 +1,13 @@ package class180; // 消耗战,C++版 +// 一共有n个节点,给定n-1条无向边,每条边有边权,所有节点组成一棵树 +// 一共有q条查询,每条查询格式如下 +// 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,并且一定不包含1号节点 +// 你可以随意选择边进行切断,切断的代价就是边权 +// 目的是让所有关键点都无法到达1号节点,打印最小总代价 +// 1 <= n、m <= 5 * 10^5 +// 1 <= 所有查询给出的点的总数 <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2495 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -9,7 +16,7 @@ // //using namespace std; // -//const int MAXN = 300001; +//const int MAXN = 500001; //const int MAXP = 20; //int n, q, k; // @@ -35,7 +42,8 @@ //bool isKey[MAXN]; //int tmp[MAXN << 1]; //int stk[MAXN]; -//long long dp[MAXN]; +// +//long long cut[MAXN]; // //bool cmp(int x, int y) { // return dfn[x] < dfn[y]; @@ -172,18 +180,18 @@ // return stk[1]; //} // -//void dpOnTree(int u) { +//void dp(int u) { // for (int e = headv[u]; e; e = nextv[e]) { -// dpOnTree(tov[e]); +// dp(tov[e]); // } -// dp[u] = 0; +// cut[u] = 0; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // int w = weightv[e]; // if (isKey[v]) { -// dp[u] += w; +// cut[u] += w; // } else { -// dp[u] += min(dp[v], (long long)w); +// cut[u] += min(cut[v], (long long)w); // } // } //} @@ -194,11 +202,11 @@ // } // int tree = buildVirtualTree1(); // // int tree = buildVirtualTree2(); -// dpOnTree(tree); +// dp(tree); // for (int i = 1; i <= k; i++) { // isKey[arr[i]] = false; // } -// return dp[tree]; +// return cut[tree]; //} // //int main() { From c8aa8aa61f2af4c5a1d50172a8094b2f6ef458fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 18:51:26 +0800 Subject: [PATCH 0832/1170] modify code --- src/class180/Code03_War1.java | 2 +- src/class180/Code03_War2.java | 2 +- src/class180/Code04_WorldTree1.java | 29 ++++++++++++++++++----------- src/class180/Code04_WorldTree2.java | 29 ++++++++++++++++++----------- 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index d434c360a..7bba45b91 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -6,7 +6,7 @@ // 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,并且一定不包含1号节点 // 你可以随意选择边进行切断,切断的代价就是边权 // 目的是让所有关键点都无法到达1号节点,打印最小总代价 -// 1 <= n、m <= 5 * 10^5 +// 1 <= n、q <= 5 * 10^5 // 1 <= 所有查询给出的点的总数 <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2495 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class180/Code03_War2.java b/src/class180/Code03_War2.java index 3b2371615..e4ec2eada 100644 --- a/src/class180/Code03_War2.java +++ b/src/class180/Code03_War2.java @@ -6,7 +6,7 @@ // 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,并且一定不包含1号节点 // 你可以随意选择边进行切断,切断的代价就是边权 // 目的是让所有关键点都无法到达1号节点,打印最小总代价 -// 1 <= n、m <= 5 * 10^5 +// 1 <= n、q <= 5 * 10^5 // 1 <= 所有查询给出的点的总数 <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2495 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index e4c500542..82ce09fbb 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -1,6 +1,13 @@ package class180; // 世界树,java版 +// 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 +// 一共有q条查询,每条查询格式如下 +// 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,树上每个点都找最近的关键点来管理自己 +// 最近的关键点如果有多个,选择编号最小的关键点 +// 打印每个关键点的管理节点数量 +// 1 <= n、q <= 3 * 10^5 +// 1 <= 所有查询给出的点的总数 <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3233 // 提交以下的code,提交时请把类名改成"Main" // 本题递归函数较多,java版不改成迭代会爆栈,导致无法通过 @@ -41,7 +48,7 @@ public class Code04_WorldTree1 { public static boolean[] isKey = new boolean[MAXN]; public static int[] tmp = new int[MAXN << 1]; - public static int[] dp = new int[MAXN]; + public static int[] mindist = new int[MAXN]; public static int[] pick = new int[MAXN]; public static int[] ans = new int[MAXN]; @@ -143,20 +150,20 @@ public static int buildVirtualTree() { } public static void dp1(int u) { - dp[u] = INF; + mindist[u] = INF; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; dp1(v); int dis = dep[v] - dep[u]; - if (dp[u] > dp[v] + dis) { - dp[u] = dp[v] + dis; + if (mindist[u] > mindist[v] + dis) { + mindist[u] = mindist[v] + dis; pick[u] = pick[v]; - } else if (dp[u] == dp[v] + dis) { + } else if (mindist[u] == mindist[v] + dis) { pick[u] = Math.min(pick[u], pick[v]); } } if (isKey[u]) { - dp[u] = 0; + mindist[u] = 0; pick[u] = u; } } @@ -164,8 +171,8 @@ public static void dp1(int u) { public static void calc(int x, int y) { int b = y; for (int p = MAXP - 1; p >= 0; p--) { - int l = dep[y] - dep[stjump[b][p]] + dp[y]; - int r = dep[stjump[b][p]] - dep[x] + dp[x]; + int l = dep[y] - dep[stjump[b][p]] + mindist[y]; + int r = dep[stjump[b][p]] - dep[x] + mindist[x]; if (dep[stjump[b][p]] > dep[x] && (l < r || (l == r && pick[y] < pick[x]))) { b = stjump[b][p]; } @@ -178,10 +185,10 @@ public static void dp2(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; int dis = dep[v] - dep[u]; - if (dp[v] > dp[u] + dis) { - dp[v] = dp[u] + dis; + if (mindist[v] > mindist[u] + dis) { + mindist[v] = mindist[u] + dis; pick[v] = pick[u]; - } else if (dp[v] == dp[u] + dis) { + } else if (mindist[v] == mindist[u] + dis) { pick[v] = Math.min(pick[v], pick[u]); } calc(u, v); diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 238d883e0..3fb964aaf 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -1,6 +1,13 @@ package class180; // 世界树,C++版 +// 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 +// 一共有q条查询,每条查询格式如下 +// 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,树上每个点都找最近的关键点来管理自己 +// 最近的关键点如果有多个,选择编号最小的关键点 +// 打印每个关键点的管理节点数量 +// 1 <= n、q <= 3 * 10^5 +// 1 <= 所有查询给出的点的总数 <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3233 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -35,7 +42,7 @@ //bool isKey[MAXN]; //int tmp[MAXN << 1]; // -//int dp[MAXN]; +//int mindist[MAXN]; //int pick[MAXN]; //int ans[MAXN]; // @@ -120,20 +127,20 @@ //} // //void dp1(int u) { -// dp[u] = INF; +// mindist[u] = INF; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // dp1(v); // int dis = dep[v] - dep[u]; -// if (dp[u] > dp[v] + dis) { -// dp[u] = dp[v] + dis; +// if (mindist[u] > mindist[v] + dis) { +// mindist[u] = mindist[v] + dis; // pick[u] = pick[v]; -// } else if (dp[u] == dp[v] + dis) { +// } else if (mindist[u] == mindist[v] + dis) { // pick[u] = min(pick[u], pick[v]); // } // } // if (isKey[u]) { -// dp[u] = 0; +// mindist[u] = 0; // pick[u] = u; // } //} @@ -141,8 +148,8 @@ //void calc(int x, int y) { // int b = y; // for (int p = MAXP - 1; p >= 0; p--) { -// int l = (dep[y] - dep[stjump[b][p]]) + dp[y]; -// int r = (dep[stjump[b][p]] - dep[x]) + dp[x]; +// int l = (dep[y] - dep[stjump[b][p]]) + mindist[y]; +// int r = (dep[stjump[b][p]] - dep[x]) + mindist[x]; // if (dep[stjump[b][p]] > dep[x] && (l < r || (l == r && pick[y] < pick[x]))) { // b = stjump[b][p]; // } @@ -155,10 +162,10 @@ // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // int dis = dep[v] - dep[u]; -// if (dp[v] > dp[u] + dis) { -// dp[v] = dp[u] + dis; +// if (mindist[v] > mindist[u] + dis) { +// mindist[v] = mindist[u] + dis; // pick[v] = pick[u]; -// } else if (dp[v] == dp[u] + dis) { +// } else if (mindist[v] == mindist[u] + dis) { // pick[v] = min(pick[v], pick[u]); // } // calc(u, v); From f6c8731fdd0fd748eb662939db83f2445f380030 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 19:24:02 +0800 Subject: [PATCH 0833/1170] modify code --- src/class180/Code05_TreelandAndViruses1.java | 9 +++++++++ src/class180/Code05_TreelandAndViruses2.java | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/class180/Code05_TreelandAndViruses1.java b/src/class180/Code05_TreelandAndViruses1.java index 01b344ea6..3d1d95288 100644 --- a/src/class180/Code05_TreelandAndViruses1.java +++ b/src/class180/Code05_TreelandAndViruses1.java @@ -1,6 +1,15 @@ package class180; // 树上病毒传播,java版 +// 一共有n个城市,有n-1条无向边,所有城市组成一棵树,一共有q条查询,每条查询数据如下 +// 首先给定k种病毒,每种病毒有初次感染的城市start[i],还有传播速度speed[i] +// 然后给定m个关键城市,打印每个城市被第几号病毒感染,病毒传播的规则如下 +// 病毒的传播按轮次进行,每一轮病毒1先传播,然后是病毒2 .. 直到病毒k,下一轮又从病毒1开始 +// 如果第i种病毒已经感染了城市x,当自己传播时,想要感染城市y的条件如下 +// 1,城市x到城市y的路径包含的边数 <= speed[i] +// 2,城市x到城市y的路径上,除了城市x之外,所有城市都未被感染 +// 一旦城市被某种病毒感染就永久保持,不会再被其他病毒感染,传播一直持续,直到所有城市都被感染 +// 1 <= n、q、所有查询病毒总数、所有查询关键城市总数 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1320E // 测试链接 : https://codeforces.com/problemset/problem/1320/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class180/Code05_TreelandAndViruses2.java b/src/class180/Code05_TreelandAndViruses2.java index 62b0ed402..b99c096e0 100644 --- a/src/class180/Code05_TreelandAndViruses2.java +++ b/src/class180/Code05_TreelandAndViruses2.java @@ -1,6 +1,15 @@ package class180; // 树上病毒传播,C++版 +// 一共有n个城市,有n-1条无向边,所有城市组成一棵树,一共有q条查询,每条查询数据如下 +// 首先给定k种病毒,每种病毒有初次感染的城市start[i],还有传播速度speed[i] +// 然后给定m个关键城市,打印每个城市被第几号病毒感染,病毒传播的规则如下 +// 病毒的传播按轮次进行,每一轮病毒1先传播,然后是病毒2 .. 直到病毒k,下一轮又从病毒1开始 +// 如果第i种病毒已经感染了城市x,当自己传播时,想要感染城市y的条件如下 +// 1,城市x到城市y的路径包含的边数 <= speed[i] +// 2,城市x到城市y的路径上,除了城市x之外,所有城市都未被感染 +// 一旦城市被某种病毒感染就永久保持,不会再被其他病毒感染,传播一直持续,直到所有城市都被感染 +// 1 <= n、q、所有查询病毒总数、所有查询关键城市总数 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1320E // 测试链接 : https://codeforces.com/problemset/problem/1320/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 8f373473e52a3aefabad8ebabba36e32dba9f4c3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 19:28:22 +0800 Subject: [PATCH 0834/1170] modify code --- src/class180/Code02_BigProject1.java | 2 +- src/class180/Code02_BigProject2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index 11d4d6ec9..4a753e7b4 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -22,7 +22,7 @@ public class Code02_BigProject1 { public static int MAXN = 1000001; - public static int MAXP = 21; + public static int MAXP = 20; public static long INF = 1L << 60; public static int n, q, k; diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index be47ad5f4..637119bdf 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -20,7 +20,7 @@ //using namespace std; // //const int MAXN = 1000001; -//const int MAXP = 21; +//const int MAXP = 20; //const long long INF = 1LL << 60; //int n, q, k; // From 716a588ee7a927bca6a6acee04124c0515d3a9e9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Oct 2025 21:54:42 +0800 Subject: [PATCH 0835/1170] modify code --- src/class180/Code06_TreasureHunt1.java | 15 +++++++++------ src/class180/Code06_TreasureHunt2.java | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/class180/Code06_TreasureHunt1.java b/src/class180/Code06_TreasureHunt1.java index 34fedadc1..e66f04f05 100644 --- a/src/class180/Code06_TreasureHunt1.java +++ b/src/class180/Code06_TreasureHunt1.java @@ -1,6 +1,12 @@ package class180; // 寻宝游戏,java版 +// 一共有n个节点,给定n-1条无向边,每条边有边权,所有节点组成一棵树 +// 一开始所有的节点都没有宝物,接下来有m条操作,每条操作格式如下 +// 操作 x : 如果x号点上无宝物,那么变成有宝物,如果x号点上有宝物,那么变成无宝物 +// 每次操作后,树上会形成新的宝物分布,所以每次你都可以选择任何点作为出发点 +// 目标是拿完当前状况下的所有宝物,最后回到出发点,打印最小的总路程,一共有m条打印 +// 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3320 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -143,14 +149,11 @@ public static void compute() { int dfnId = dfn[nodeId]; if (!vis[nodeId]) { set.add(dfnId); - } - int low = set.lower(dfnId) != null ? set.lower(dfnId) : set.last(); - int high = set.higher(dfnId) != null ? set.higher(dfnId) : set.first(); - if (vis[nodeId]) { + } else { set.remove(dfnId); } - low = seg[low]; - high = seg[high]; + int low = seg[set.lower(dfnId) != null ? set.lower(dfnId) : set.last()]; + int high = seg[set.higher(dfnId) != null ? set.higher(dfnId) : set.first()]; long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); if (!vis[nodeId]) { vis[nodeId] = true; diff --git a/src/class180/Code06_TreasureHunt2.java b/src/class180/Code06_TreasureHunt2.java index aca0add39..8d1990eab 100644 --- a/src/class180/Code06_TreasureHunt2.java +++ b/src/class180/Code06_TreasureHunt2.java @@ -1,6 +1,12 @@ package class180; // 寻宝游戏,C++版 +// 一共有n个节点,给定n-1条无向边,每条边有边权,所有节点组成一棵树 +// 一开始所有的节点都没有宝物,接下来有m条操作,每条操作格式如下 +// 操作 x : 如果x号点上无宝物,那么变成有宝物,如果x号点上有宝物,那么变成无宝物 +// 每次操作后,树上会形成新的宝物分布,所以每次你都可以选择任何点作为出发点 +// 目标是拿完当前状况下的所有宝物,最后回到出发点,打印最小的总路程,一共有m条打印 +// 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3320 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -89,14 +95,11 @@ // int dfnId = dfn[nodeId]; // if (!vis[nodeId]) { // st.insert(dfnId); -// } -// int low = (it = st.lower_bound(dfnId)) == st.begin() ? *--st.end() : *--it; -// int high = (it = st.upper_bound(dfnId)) == st.end() ? *st.begin() : *it; -// if (vis[nodeId]) { +// } else { // st.erase(dfnId); // } -// low = seg[low]; -// high = seg[high]; +// int low = seg[(it = st.lower_bound(dfnId)) == st.begin() ? *--st.end() : *--it]; +// int high = seg[(it = st.upper_bound(dfnId)) == st.end() ? *st.begin() : *it]; // long long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); // if (!vis[nodeId]) { // vis[nodeId] = true; From d80c5708b5d5759c6259767c34e05549debfeb6f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 12 Oct 2025 08:16:26 +0800 Subject: [PATCH 0836/1170] modify code --- src/class180/Code06_TreasureHunt1.java | 20 ++++++++++++-------- src/class180/Code06_TreasureHunt2.java | 20 ++++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/class180/Code06_TreasureHunt1.java b/src/class180/Code06_TreasureHunt1.java index e66f04f05..58e0357c9 100644 --- a/src/class180/Code06_TreasureHunt1.java +++ b/src/class180/Code06_TreasureHunt1.java @@ -148,19 +148,23 @@ public static void compute() { int nodeId = arr[i]; int dfnId = dfn[nodeId]; if (!vis[nodeId]) { + vis[nodeId] = true; set.add(dfnId); } else { + vis[nodeId] = false; set.remove(dfnId); } - int low = seg[set.lower(dfnId) != null ? set.lower(dfnId) : set.last()]; - int high = seg[set.higher(dfnId) != null ? set.higher(dfnId) : set.first()]; - long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); - if (!vis[nodeId]) { - vis[nodeId] = true; - curAns += delta; + if (set.size() <= 1) { + curAns = 0; } else { - vis[nodeId] = false; - curAns -= delta; + int low = seg[set.lower(dfnId) != null ? set.lower(dfnId) : set.last()]; + int high = seg[set.higher(dfnId) != null ? set.higher(dfnId) : set.first()]; + long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); + if (vis[nodeId]) { + curAns += delta; + } else { + curAns -= delta; + } } ans[i] = curAns; } diff --git a/src/class180/Code06_TreasureHunt2.java b/src/class180/Code06_TreasureHunt2.java index 8d1990eab..91bbf5fcc 100644 --- a/src/class180/Code06_TreasureHunt2.java +++ b/src/class180/Code06_TreasureHunt2.java @@ -94,19 +94,23 @@ // int nodeId = arr[i]; // int dfnId = dfn[nodeId]; // if (!vis[nodeId]) { +// vis[nodeId] = true; // st.insert(dfnId); // } else { +// vis[nodeId] = false; // st.erase(dfnId); // } -// int low = seg[(it = st.lower_bound(dfnId)) == st.begin() ? *--st.end() : *--it]; -// int high = seg[(it = st.upper_bound(dfnId)) == st.end() ? *st.begin() : *it]; -// long long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); -// if (!vis[nodeId]) { -// vis[nodeId] = true; -// curAns += delta; +// if (st.size() <= 1) { +// curAns = 0; // } else { -// vis[nodeId] = false; -// curAns -= delta; +// int low = seg[(it = st.lower_bound(dfnId)) == st.begin() ? *--st.end() : *--it]; +// int high = seg[(it = st.upper_bound(dfnId)) == st.end() ? *st.begin() : *it]; +// long long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); +// if (vis[nodeId]) { +// curAns += delta; +// } else { +// curAns -= delta; +// } // } // ans[i] = curAns; // } From 6f22a36c3d4bae8d741b87ae9b13b88458c3fc31 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 12 Oct 2025 13:52:27 +0800 Subject: [PATCH 0837/1170] modify code --- src/class180/Code04_WorldTree1.java | 18 +++++++++--------- src/class180/Code04_WorldTree2.java | 24 ++++++++++++------------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index 82ce09fbb..9cfb3be02 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -5,7 +5,7 @@ // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,树上每个点都找最近的关键点来管理自己 // 最近的关键点如果有多个,选择编号最小的关键点 -// 打印每个关键点的管理节点数量 +// 打印每个关键点所管理的节点数量 // 1 <= n、q <= 3 * 10^5 // 1 <= 所有查询给出的点的总数 <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3233 @@ -169,19 +169,20 @@ public static void dp1(int u) { } public static void calc(int x, int y) { - int b = y; + int f = y; for (int p = MAXP - 1; p >= 0; p--) { - int l = dep[y] - dep[stjump[b][p]] + mindist[y]; - int r = dep[stjump[b][p]] - dep[x] + mindist[x]; - if (dep[stjump[b][p]] > dep[x] && (l < r || (l == r && pick[y] < pick[x]))) { - b = stjump[b][p]; + int tox = dep[stjump[f][p]] - dep[x] + mindist[x]; + int toy = dep[y] - dep[stjump[f][p]] + mindist[y]; + if (dep[x] < dep[stjump[f][p]] && (toy < tox || (toy == tox && pick[y] < pick[x]))) { + f = stjump[f][p]; } } - ans[pick[y]] += siz[b] - siz[y]; - ans[pick[x]] -= siz[b]; + ans[pick[y]] += siz[f] - siz[y]; + ans[pick[x]] -= siz[f]; } public static void dp2(int u) { + ans[pick[u]] += siz[u]; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; int dis = dep[v] - dep[u]; @@ -194,7 +195,6 @@ public static void dp2(int u) { calc(u, v); dp2(v); } - ans[pick[u]] += siz[u]; } public static void compute() { diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 3fb964aaf..463e17af9 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -5,7 +5,7 @@ // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,树上每个点都找最近的关键点来管理自己 // 最近的关键点如果有多个,选择编号最小的关键点 -// 打印每个关键点的管理节点数量 +// 打印每个关键点所管理的节点数量 // 1 <= n、q <= 3 * 10^5 // 1 <= 所有查询给出的点的总数 <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3233 @@ -105,15 +105,15 @@ // int len = 0; // tmp[++len] = 1; // for (int i = 1; i < k; i++) { -// tmp[++len] = arr[i]; -// tmp[++len] = getLca(arr[i], arr[i + 1]); +// tmp[++len] = arr[i]; +// tmp[++len] = getLca(arr[i], arr[i + 1]); // } // tmp[++len] = arr[k]; // sort(tmp + 1, tmp + len + 1, cmp); // int unique = 1; // for (int i = 2; i <= len; i++) { // if (tmp[unique] != tmp[i]) { -// tmp[++unique] = tmp[i]; +// tmp[++unique] = tmp[i]; // } // } // cntv = 0; @@ -146,19 +146,20 @@ //} // //void calc(int x, int y) { -// int b = y; +// int f = y; // for (int p = MAXP - 1; p >= 0; p--) { -// int l = (dep[y] - dep[stjump[b][p]]) + mindist[y]; -// int r = (dep[stjump[b][p]] - dep[x]) + mindist[x]; -// if (dep[stjump[b][p]] > dep[x] && (l < r || (l == r && pick[y] < pick[x]))) { -// b = stjump[b][p]; +// int tox = (dep[stjump[f][p]] - dep[x]) + mindist[x]; +// int toy = (dep[y] - dep[stjump[f][p]]) + mindist[y]; +// if (dep[x] < dep[stjump[f][p]] && (toy < tox || (toy == tox && pick[y] < pick[x]))) { +// f = stjump[f][p]; // } // } -// ans[pick[y]] += siz[b] - siz[y]; -// ans[pick[x]] -= siz[b]; +// ans[pick[y]] += siz[f] - siz[y]; +// ans[pick[x]] -= siz[f]; //} // //void dp2(int u) { +// ans[pick[u]] += siz[u]; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // int dis = dep[v] - dep[u]; @@ -171,7 +172,6 @@ // calc(u, v); // dp2(v); // } -// ans[pick[u]] += siz[u]; //} // //void compute() { From ce6474cc9d655805d5cea85188febbd54fdef676 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 12 Oct 2025 14:11:13 +0800 Subject: [PATCH 0838/1170] modify code --- src/class180/Code05_TreelandAndViruses1.java | 23 ++++++++++---------- src/class180/Code05_TreelandAndViruses2.java | 17 ++++++++++----- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/class180/Code05_TreelandAndViruses1.java b/src/class180/Code05_TreelandAndViruses1.java index 3d1d95288..5c6b9a733 100644 --- a/src/class180/Code05_TreelandAndViruses1.java +++ b/src/class180/Code05_TreelandAndViruses1.java @@ -100,9 +100,7 @@ public static void sortByDfn(int[] nums, int l, int r) { while (dfn[nums[i]] < dfn[pivot]) i++; while (dfn[nums[j]] > dfn[pivot]) j--; if (i <= j) { - int tmp = nums[i]; - nums[i] = nums[j]; - nums[j] = tmp; + int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; i++; j--; } } @@ -198,18 +196,21 @@ public static void dijkstra() { while (!heap.isEmpty()) { Node cur = heap.poll(); int u = cur.id; - int source = cur.source; - int sourceOrder = cur.sourceOrder; + int udist = cur.dist; + int usource = cur.source; + int usourceOrder = cur.sourceOrder; if (!vis[u]) { vis[u] = true; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; - int dist = cur.dist + Math.abs(dep[u] - dep[v]); - int time = (dist + speed[source] - 1) / speed[source]; - if (!vis[v] && (time < minTime[v] || (time == minTime[v] && sourceOrder < order[bestSource[v]]))) { - minTime[v] = time; - bestSource[v] = source; - heap.add(new Node(v, dist, time, source, sourceOrder)); + if (!vis[v]) { + int vdist = udist + Math.abs(dep[u] - dep[v]); + int vtime = (vdist + speed[usource] - 1) / speed[usource]; + if (vtime < minTime[v] || (vtime == minTime[v] && usourceOrder < order[bestSource[v]])) { + minTime[v] = vtime; + bestSource[v] = usource; + heap.add(new Node(v, vdist, vtime, usource, usourceOrder)); + } } } } diff --git a/src/class180/Code05_TreelandAndViruses2.java b/src/class180/Code05_TreelandAndViruses2.java index b99c096e0..dc58a7da2 100644 --- a/src/class180/Code05_TreelandAndViruses2.java +++ b/src/class180/Code05_TreelandAndViruses2.java @@ -166,16 +166,21 @@ // Node cur = heap.top(); // heap.pop(); // int u = cur.id; +// int udist = cur.dist; +// int usource = cur.source; +// int usourceOrder = cur.sourceOrder; // if (!vis[u]) { // vis[u] = true; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; -// int dist = cur.dist + abs(dep[u] - dep[v]); -// int time = (dist + speed[cur.source] - 1) / speed[cur.source]; -// if (!vis[v] && (time < minTime[v] || (time == minTime[v] && cur.sourceOrder < order[bestSource[v]]))) { -// minTime[v] = time; -// bestSource[v] = cur.source; -// heap.push(Node{v, dist, time, cur.source, cur.sourceOrder}); +// if (!vis[v]) { +// int vdist = udist + abs(dep[u] - dep[v]); +// int vtime = (vdist + speed[usource] - 1) / speed[usource]; +// if (vtime < minTime[v] || (vtime == minTime[v] && usourceOrder < order[bestSource[v]])) { +// minTime[v] = vtime; +// bestSource[v] = usource; +// heap.push(Node{v, vdist, vtime, usource, usourceOrder}); +// } // } // } // } From 700bc0aa5c0b9773f09a1fcba9c6ec484dbe11b6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 12 Oct 2025 14:13:49 +0800 Subject: [PATCH 0839/1170] modify code --- src/class180/Code02_BigProject1.java | 4 +--- src/class180/Code03_War1.java | 4 +--- src/class180/Code04_WorldTree1.java | 4 +--- src/class180/Code06_TreasureHunt1.java | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index 4a753e7b4..f09a051d7 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -146,9 +146,7 @@ public static void dfs2() { public static int getLca(int a, int b) { if (dep[a] < dep[b]) { - int tmp = a; - a = b; - b = tmp; + int tmp = a; a = b; b = tmp; } for (int p = MAXP - 1; p >= 0; p--) { if (dep[stjump[a][p]] >= dep[b]) { diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index 7bba45b91..95ceb49f5 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -95,9 +95,7 @@ public static void dfs(int u, int fa, int w) { public static int getLca(int a, int b) { if (dep[a] < dep[b]) { - int tmp = a; - a = b; - b = tmp; + int tmp = a; a = b; b = tmp; } for (int p = MAXP - 1; p >= 0; p--) { if (dep[stjump[a][p]] >= dep[b]) { diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index 9cfb3be02..ff2bf840e 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -100,9 +100,7 @@ public static void dfs(int u, int fa) { public static int getLca(int a, int b) { if (dep[a] < dep[b]) { - int tmp = a; - a = b; - b = tmp; + int tmp = a; a = b; b = tmp; } for (int p = MAXP - 1; p >= 0; p--) { if (dep[stjump[a][p]] >= dep[b]) { diff --git a/src/class180/Code06_TreasureHunt1.java b/src/class180/Code06_TreasureHunt1.java index 58e0357c9..551785654 100644 --- a/src/class180/Code06_TreasureHunt1.java +++ b/src/class180/Code06_TreasureHunt1.java @@ -117,9 +117,7 @@ public static void dfs2() { public static int getLca(int a, int b) { if (dep[a] < dep[b]) { - int tmp = a; - a = b; - b = tmp; + int tmp = a; a = b; b = tmp; } for (int p = MAXP - 1; p >= 0; p--) { if (dep[stjump[a][p]] >= dep[b]) { From bc4636f27b06240fbb52e817644b6a75de8bf1d9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 12 Oct 2025 14:18:17 +0800 Subject: [PATCH 0840/1170] modify code --- src/class180/Code01_VirtualTree1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class180/Code01_VirtualTree1.java b/src/class180/Code01_VirtualTree1.java index f697bdede..10887d432 100644 --- a/src/class180/Code01_VirtualTree1.java +++ b/src/class180/Code01_VirtualTree1.java @@ -173,8 +173,8 @@ public static int buildVirtualTree2() { public static void dp(int u) { cost[u] = siz[u] = 0; - for (int e = headv[u], v; e > 0; e = nextv[e]) { - v = tov[e]; + for (int e = headv[u]; e > 0; e = nextv[e]) { + int v = tov[e]; dp(v); cost[u] += cost[v]; siz[u] += siz[v]; From c6fe9e62125b5abcb0966461cb7b4802557f5637 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 12 Oct 2025 14:20:38 +0800 Subject: [PATCH 0841/1170] modify code --- src/class180/Code01_VirtualTree2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class180/Code01_VirtualTree2.java b/src/class180/Code01_VirtualTree2.java index 164d1c40b..c9d4f4a0c 100644 --- a/src/class180/Code01_VirtualTree2.java +++ b/src/class180/Code01_VirtualTree2.java @@ -162,7 +162,7 @@ // cost[u] += siz[u]; // siz[u] = 1; // } else if (siz[u] > 1) { -// cost[u] += 1; +// cost[u]++; // siz[u] = 0; // } //} From 661cd0b73185ec0e72a193aea5b583bb1b293841 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 12 Oct 2025 21:50:56 +0800 Subject: [PATCH 0842/1170] modify code --- src/class180/Code03_War1.java | 4 +--- src/class180/Code04_WorldTree1.java | 19 ++++++++++--------- src/class180/Code04_WorldTree2.java | 18 ++++++++++-------- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index 95ceb49f5..631468285 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -117,9 +117,7 @@ public static int getLca(int a, int b) { public static int getDist(int a, int b) { int dist = 100000001; if (dep[a] < dep[b]) { - int tmp = a; - a = b; - b = tmp; + int tmp = a; a = b; b = tmp; } for (int p = MAXP - 1; p >= 0; p--) { if (dep[stjump[a][p]] >= dep[b]) { diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index ff2bf840e..a20da36d7 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -64,7 +64,6 @@ public static void addEdgeV(int u, int v) { headv[u] = cntv; } - // nums中的数,根据dfn的大小排序,手撸双指针快排 public static void sortByDfn(int[] nums, int l, int r) { if (l >= r) return; int i = l, j = r; @@ -166,17 +165,18 @@ public static void dp1(int u) { } } - public static void calc(int x, int y) { - int f = y; + public static void calc(int u, int v) { + int x = v; for (int p = MAXP - 1; p >= 0; p--) { - int tox = dep[stjump[f][p]] - dep[x] + mindist[x]; - int toy = dep[y] - dep[stjump[f][p]] + mindist[y]; - if (dep[x] < dep[stjump[f][p]] && (toy < tox || (toy == tox && pick[y] < pick[x]))) { - f = stjump[f][p]; + int tou = dep[stjump[x][p]] - dep[u] + mindist[u]; + int tov = dep[v] - dep[stjump[x][p]] + mindist[v]; + if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && pick[v] < pick[u]))) { + x = stjump[x][p]; } } - ans[pick[y]] += siz[f] - siz[y]; - ans[pick[x]] -= siz[f]; + int delta = siz[x] - siz[v]; + ans[pick[u]] -= delta; + ans[pick[v]] += delta; } public static void dp2(int u) { @@ -191,6 +191,7 @@ public static void dp2(int u) { pick[v] = Math.min(pick[v], pick[u]); } calc(u, v); + ans[pick[u]] -= siz[v]; dp2(v); } } diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 463e17af9..49621c1b3 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -145,17 +145,18 @@ // } //} // -//void calc(int x, int y) { -// int f = y; +//void calc(int u, int v) { +// int x = v; // for (int p = MAXP - 1; p >= 0; p--) { -// int tox = (dep[stjump[f][p]] - dep[x]) + mindist[x]; -// int toy = (dep[y] - dep[stjump[f][p]]) + mindist[y]; -// if (dep[x] < dep[stjump[f][p]] && (toy < tox || (toy == tox && pick[y] < pick[x]))) { -// f = stjump[f][p]; +// int tou = (dep[stjump[x][p]] - dep[u]) + mindist[u]; +// int tov = (dep[v] - dep[stjump[x][p]]) + mindist[v]; +// if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && pick[v] < pick[u]))) { +// x = stjump[x][p]; // } // } -// ans[pick[y]] += siz[f] - siz[y]; -// ans[pick[x]] -= siz[f]; +// int delta = siz[x] - siz[v]; +// ans[pick[u]] -= delta; +// ans[pick[v]] += delta; //} // //void dp2(int u) { @@ -170,6 +171,7 @@ // pick[v] = min(pick[v], pick[u]); // } // calc(u, v); +// ans[pick[u]] -= siz[v]; // dp2(v); // } //} From 9408b44080fc3839f2da15500923f329c0c981ac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 12 Oct 2025 21:56:20 +0800 Subject: [PATCH 0843/1170] modify code --- src/class180/Code02_BigProject1.java | 37 ++-------------------------- src/class180/Code02_BigProject2.java | 35 ++------------------------ 2 files changed, 4 insertions(+), 68 deletions(-) diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index f09a051d7..9ba54d975 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -165,8 +165,7 @@ public static int getLca(int a, int b) { return stjump[a][0]; } - // 二次排序 + LCA连边的方式建立虚树 - public static int buildVirtualTree1() { + public static int buildVirtualTree() { sortByDfn(arr, 1, k); int len = 0; for (int i = 1; i < k; i++) { @@ -191,37 +190,6 @@ public static int buildVirtualTree1() { return tmp[1]; } - // 单调栈的方式建立虚树 - public static int buildVirtualTree2() { - sortByDfn(arr, 1, k); - cntv = 0; - headv[arr[1]] = 0; - int top = 0; - stk[++top] = arr[1]; - for (int i = 2; i <= k; i++) { - int x = arr[i]; - int y = stk[top]; - int lca = getLca(x, y); - while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { - addEdgeV(stk[top - 1], stk[top]); - top--; - } - if (lca != stk[top]) { - headv[lca] = 0; - addEdgeV(lca, stk[top]); - top--; - stk[++top] = lca; - } - headv[x] = 0; - stk[++top] = x; - } - while (top > 1) { - addEdgeV(stk[top - 1], stk[top]); - top--; - } - return stk[1]; - } - // dp递归版,java会爆栈,C++可以通过 public static void dp1(int u) { siz[u] = isKey[u] ? 1 : 0; @@ -290,8 +258,7 @@ public static void compute() { for (int i = 1; i <= k; i++) { isKey[arr[i]] = true; } - int tree = buildVirtualTree1(); - // int tree = buildVirtualTree2(); + int tree = buildVirtualTree(); costSum = 0; costMin = INF; costMax = -INF; diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index 637119bdf..d90a73fd1 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -99,7 +99,7 @@ // return stjump[a][0]; //} // -//int buildVirtualTree1() { +//int buildVirtualTree() { // sort(arr + 1, arr + k + 1, cmp); // int len = 0; // for (int i = 1; i < k; i++) { @@ -124,36 +124,6 @@ // return tmp[1]; //} // -//int buildVirtualTree2() { -// sort(arr + 1, arr + k + 1, cmp); -// cntv = 0; -// headv[arr[1]] = 0; -// int top = 0; -// stk[++top] = arr[1]; -// for (int i = 2; i <= k; i++) { -// int x = arr[i]; -// int y = stk[top]; -// int lca = getLca(x, y); -// while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { -// addEdgeV(stk[top - 1], stk[top]); -// top--; -// } -// if (lca != stk[top]) { -// headv[lca] = 0; -// addEdgeV(lca, stk[top]); -// top--; -// stk[++top] = lca; -// } -// headv[x] = 0; -// stk[++top] = x; -// } -// while (top > 1) { -// addEdgeV(stk[top - 1], stk[top]); -// top--; -// } -// return stk[1]; -//} -// //void dp(int u) { // siz[u] = isKey[u] ? 1 : 0; // sum[u] = 0; @@ -183,8 +153,7 @@ // for (int i = 1; i <= k; i++) { // isKey[arr[i]] = true; // } -// int tree = buildVirtualTree1(); -// // int tree = buildVirtualTree2(); +// int tree = buildVirtualTree(); // costSum = 0; // costMin = INF; // costMax = -INF; From e0aab67ef4210638fc90c8541f6551f52fc4d8ac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Oct 2025 12:55:42 +0800 Subject: [PATCH 0844/1170] modify code --- src/class180/Code02_BigProject1.java | 37 ++++++++++++++++++++++++++-- src/class180/Code02_BigProject2.java | 35 ++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index 9ba54d975..f09a051d7 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -165,7 +165,8 @@ public static int getLca(int a, int b) { return stjump[a][0]; } - public static int buildVirtualTree() { + // 二次排序 + LCA连边的方式建立虚树 + public static int buildVirtualTree1() { sortByDfn(arr, 1, k); int len = 0; for (int i = 1; i < k; i++) { @@ -190,6 +191,37 @@ public static int buildVirtualTree() { return tmp[1]; } + // 单调栈的方式建立虚树 + public static int buildVirtualTree2() { + sortByDfn(arr, 1, k); + cntv = 0; + headv[arr[1]] = 0; + int top = 0; + stk[++top] = arr[1]; + for (int i = 2; i <= k; i++) { + int x = arr[i]; + int y = stk[top]; + int lca = getLca(x, y); + while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { + addEdgeV(stk[top - 1], stk[top]); + top--; + } + if (lca != stk[top]) { + headv[lca] = 0; + addEdgeV(lca, stk[top]); + top--; + stk[++top] = lca; + } + headv[x] = 0; + stk[++top] = x; + } + while (top > 1) { + addEdgeV(stk[top - 1], stk[top]); + top--; + } + return stk[1]; + } + // dp递归版,java会爆栈,C++可以通过 public static void dp1(int u) { siz[u] = isKey[u] ? 1 : 0; @@ -258,7 +290,8 @@ public static void compute() { for (int i = 1; i <= k; i++) { isKey[arr[i]] = true; } - int tree = buildVirtualTree(); + int tree = buildVirtualTree1(); + // int tree = buildVirtualTree2(); costSum = 0; costMin = INF; costMax = -INF; diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index d90a73fd1..637119bdf 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -99,7 +99,7 @@ // return stjump[a][0]; //} // -//int buildVirtualTree() { +//int buildVirtualTree1() { // sort(arr + 1, arr + k + 1, cmp); // int len = 0; // for (int i = 1; i < k; i++) { @@ -124,6 +124,36 @@ // return tmp[1]; //} // +//int buildVirtualTree2() { +// sort(arr + 1, arr + k + 1, cmp); +// cntv = 0; +// headv[arr[1]] = 0; +// int top = 0; +// stk[++top] = arr[1]; +// for (int i = 2; i <= k; i++) { +// int x = arr[i]; +// int y = stk[top]; +// int lca = getLca(x, y); +// while (top > 1 && dfn[stk[top - 1]] >= dfn[lca]) { +// addEdgeV(stk[top - 1], stk[top]); +// top--; +// } +// if (lca != stk[top]) { +// headv[lca] = 0; +// addEdgeV(lca, stk[top]); +// top--; +// stk[++top] = lca; +// } +// headv[x] = 0; +// stk[++top] = x; +// } +// while (top > 1) { +// addEdgeV(stk[top - 1], stk[top]); +// top--; +// } +// return stk[1]; +//} +// //void dp(int u) { // siz[u] = isKey[u] ? 1 : 0; // sum[u] = 0; @@ -153,7 +183,8 @@ // for (int i = 1; i <= k; i++) { // isKey[arr[i]] = true; // } -// int tree = buildVirtualTree(); +// int tree = buildVirtualTree1(); +// // int tree = buildVirtualTree2(); // costSum = 0; // costMin = INF; // costMax = -INF; From b0347304627c6a4262ab4d35d6250c3a0d0aa817 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Oct 2025 13:05:05 +0800 Subject: [PATCH 0845/1170] modify code --- ...Code01_VirtualTree1.java => Code01_KingdomAndCities1.java} | 4 ++-- ...Code01_VirtualTree2.java => Code01_KingdomAndCities2.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/class180/{Code01_VirtualTree1.java => Code01_KingdomAndCities1.java} (98%) rename src/class180/{Code01_VirtualTree2.java => Code01_KingdomAndCities2.java} (99%) diff --git a/src/class180/Code01_VirtualTree1.java b/src/class180/Code01_KingdomAndCities1.java similarity index 98% rename from src/class180/Code01_VirtualTree1.java rename to src/class180/Code01_KingdomAndCities1.java index 10887d432..93eda99e6 100644 --- a/src/class180/Code01_VirtualTree1.java +++ b/src/class180/Code01_KingdomAndCities1.java @@ -1,6 +1,6 @@ package class180; -// 虚树模版题,java版 +// 王国和城市,java版 // 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的重要点,其他点是非重要点 @@ -18,7 +18,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code01_VirtualTree1 { +public class Code01_KingdomAndCities1 { public static int MAXN = 100001; public static int MAXP = 20; diff --git a/src/class180/Code01_VirtualTree2.java b/src/class180/Code01_KingdomAndCities2.java similarity index 99% rename from src/class180/Code01_VirtualTree2.java rename to src/class180/Code01_KingdomAndCities2.java index c9d4f4a0c..77ac8403f 100644 --- a/src/class180/Code01_VirtualTree2.java +++ b/src/class180/Code01_KingdomAndCities2.java @@ -1,6 +1,6 @@ package class180; -// 虚树模版题,C++版 +// 王国和城市,C++版 // 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的重要点,其他点是非重要点 From 15afdd4ed834ec366cd1303267a59f3eff798c75 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Oct 2025 13:19:39 +0800 Subject: [PATCH 0846/1170] modify code --- src/class180/Code02_BigProject1.java | 4 +--- src/class180/Code02_BigProject2.java | 4 +--- src/class180/Code05_TreelandAndViruses1.java | 3 +-- src/class180/Code05_TreelandAndViruses2.java | 3 +-- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index f09a051d7..6da430b9e 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -5,9 +5,7 @@ // 如果在节点a和节点b之间建立新通道,那么代价是两个节点在树上的距离 // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的节点,任意两个节点之间都会建立新通道 -// 打印新通道的代价和 -// 打印新通道中代价最小的值 -// 打印新通道中代价最大的值 +// 打印新通道的代价和、新通道中代价最小的值、新通道中代价最大的值 // 1 <= n <= 10^6 // 1 <= q <= 5 * 10^4 // 1 <= 所有查询给出的点的总数 <= 2 * n diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index 637119bdf..3db875281 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -5,9 +5,7 @@ // 如果在节点a和节点b之间建立新通道,那么代价是两个节点在树上的距离 // 一共有q条查询,每条查询格式如下 // 查询 k a1 a2 ... ak : 给出了k个不同的节点,任意两个节点之间都会建立新通道 -// 打印新通道的代价和 -// 打印新通道中代价最小的值 -// 打印新通道中代价最大的值 +// 打印新通道的代价和、新通道中代价最小的值、新通道中代价最大的值 // 1 <= n <= 10^6 // 1 <= q <= 5 * 10^4 // 1 <= 所有查询给出的点的总数 <= 2 * n diff --git a/src/class180/Code05_TreelandAndViruses1.java b/src/class180/Code05_TreelandAndViruses1.java index 5c6b9a733..8207d084d 100644 --- a/src/class180/Code05_TreelandAndViruses1.java +++ b/src/class180/Code05_TreelandAndViruses1.java @@ -6,8 +6,7 @@ // 然后给定m个关键城市,打印每个城市被第几号病毒感染,病毒传播的规则如下 // 病毒的传播按轮次进行,每一轮病毒1先传播,然后是病毒2 .. 直到病毒k,下一轮又从病毒1开始 // 如果第i种病毒已经感染了城市x,当自己传播时,想要感染城市y的条件如下 -// 1,城市x到城市y的路径包含的边数 <= speed[i] -// 2,城市x到城市y的路径上,除了城市x之外,所有城市都未被感染 +// 城市x到城市y的路径包含的边数<=speed[i],城市x到城市y的路径上,除了x所有城市都未被感染 // 一旦城市被某种病毒感染就永久保持,不会再被其他病毒感染,传播一直持续,直到所有城市都被感染 // 1 <= n、q、所有查询病毒总数、所有查询关键城市总数 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1320E diff --git a/src/class180/Code05_TreelandAndViruses2.java b/src/class180/Code05_TreelandAndViruses2.java index dc58a7da2..ea9dadb70 100644 --- a/src/class180/Code05_TreelandAndViruses2.java +++ b/src/class180/Code05_TreelandAndViruses2.java @@ -6,8 +6,7 @@ // 然后给定m个关键城市,打印每个城市被第几号病毒感染,病毒传播的规则如下 // 病毒的传播按轮次进行,每一轮病毒1先传播,然后是病毒2 .. 直到病毒k,下一轮又从病毒1开始 // 如果第i种病毒已经感染了城市x,当自己传播时,想要感染城市y的条件如下 -// 1,城市x到城市y的路径包含的边数 <= speed[i] -// 2,城市x到城市y的路径上,除了城市x之外,所有城市都未被感染 +// 城市x到城市y的路径包含的边数<=speed[i],城市x到城市y的路径上,除了x所有城市都未被感染 // 一旦城市被某种病毒感染就永久保持,不会再被其他病毒感染,传播一直持续,直到所有城市都被感染 // 1 <= n、q、所有查询病毒总数、所有查询关键城市总数 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1320E From 2c812ff0eec9b6ec1b995dc20da3c8cd0b8bf155 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Oct 2025 13:27:37 +0800 Subject: [PATCH 0847/1170] modify code --- src/class180/Code04_WorldTree1.java | 26 +++++++++++++++++--------- src/class180/Code04_WorldTree2.java | 26 +++++++++++++++++--------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index a20da36d7..ade402f15 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -165,6 +165,20 @@ public static void dp1(int u) { } } + public static void dp2(int u) { + for (int e = headv[u]; e > 0; e = nextv[e]) { + int v = tov[e]; + int dis = dep[v] - dep[u]; + if (mindist[v] > mindist[u] + dis) { + mindist[v] = mindist[u] + dis; + pick[v] = pick[u]; + } else if (mindist[v] == mindist[u] + dis) { + pick[v] = Math.min(pick[v], pick[u]); + } + dp2(v); + } + } + public static void calc(int u, int v) { int x = v; for (int p = MAXP - 1; p >= 0; p--) { @@ -179,20 +193,13 @@ public static void calc(int u, int v) { ans[pick[v]] += delta; } - public static void dp2(int u) { + public static void dp3(int u) { ans[pick[u]] += siz[u]; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; - int dis = dep[v] - dep[u]; - if (mindist[v] > mindist[u] + dis) { - mindist[v] = mindist[u] + dis; - pick[v] = pick[u]; - } else if (mindist[v] == mindist[u] + dis) { - pick[v] = Math.min(pick[v], pick[u]); - } calc(u, v); ans[pick[u]] -= siz[v]; - dp2(v); + dp3(v); } } @@ -207,6 +214,7 @@ public static void compute() { int tree = buildVirtualTree(); dp1(tree); dp2(tree); + dp3(tree); for (int i = 1; i <= k; i++) { isKey[arr[i]] = false; } diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 49621c1b3..7b14ff653 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -145,6 +145,20 @@ // } //} // +//void dp2(int u) { +// for (int e = headv[u]; e; e = nextv[e]) { +// int v = tov[e]; +// int dis = dep[v] - dep[u]; +// if (mindist[v] > mindist[u] + dis) { +// mindist[v] = mindist[u] + dis; +// pick[v] = pick[u]; +// } else if (mindist[v] == mindist[u] + dis) { +// pick[v] = min(pick[v], pick[u]); +// } +// dp2(v); +// } +//} +// //void calc(int u, int v) { // int x = v; // for (int p = MAXP - 1; p >= 0; p--) { @@ -159,20 +173,13 @@ // ans[pick[v]] += delta; //} // -//void dp2(int u) { +//void dp3(int u) { // ans[pick[u]] += siz[u]; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; -// int dis = dep[v] - dep[u]; -// if (mindist[v] > mindist[u] + dis) { -// mindist[v] = mindist[u] + dis; -// pick[v] = pick[u]; -// } else if (mindist[v] == mindist[u] + dis) { -// pick[v] = min(pick[v], pick[u]); -// } // calc(u, v); // ans[pick[u]] -= siz[v]; -// dp2(v); +// dp3(v); // } //} // @@ -187,6 +194,7 @@ // int tree = buildVirtualTree(); // dp1(tree); // dp2(tree); +// dp3(tree); // for (int i = 1; i <= k; i++) { // isKey[arr[i]] = false; // } From 322d9c5530caceb06fb473ed57e65467861f4d5f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Oct 2025 14:00:51 +0800 Subject: [PATCH 0848/1170] modify code --- src/class180/Code01_KingdomAndCities1.java | 3 +-- src/class180/Code01_KingdomAndCities2.java | 3 +-- src/class180/Code02_BigProject1.java | 3 +-- src/class180/Code02_BigProject2.java | 3 +-- src/class180/Code03_War1.java | 3 +-- src/class180/Code03_War2.java | 3 +-- 6 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/class180/Code01_KingdomAndCities1.java b/src/class180/Code01_KingdomAndCities1.java index 93eda99e6..bafeff6e8 100644 --- a/src/class180/Code01_KingdomAndCities1.java +++ b/src/class180/Code01_KingdomAndCities1.java @@ -158,8 +158,7 @@ public static int buildVirtualTree2() { if (lca != stk[top]) { headv[lca] = 0; addEdgeV(lca, stk[top]); - top--; - stk[++top] = lca; + stk[top] = lca; } headv[x] = 0; stk[++top] = x; diff --git a/src/class180/Code01_KingdomAndCities2.java b/src/class180/Code01_KingdomAndCities2.java index 77ac8403f..94aca1b51 100644 --- a/src/class180/Code01_KingdomAndCities2.java +++ b/src/class180/Code01_KingdomAndCities2.java @@ -137,8 +137,7 @@ // if (lca != stk[top]) { // headv[lca] = 0; // addEdgeV(lca, stk[top]); -// top--; -// stk[++top] = lca; +// stk[top] = lca; // } // headv[x] = 0; // stk[++top] = x; diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index 6da430b9e..da83af8b3 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -207,8 +207,7 @@ public static int buildVirtualTree2() { if (lca != stk[top]) { headv[lca] = 0; addEdgeV(lca, stk[top]); - top--; - stk[++top] = lca; + stk[top] = lca; } headv[x] = 0; stk[++top] = x; diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index 3db875281..cd00884d8 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -139,8 +139,7 @@ // if (lca != stk[top]) { // headv[lca] = 0; // addEdgeV(lca, stk[top]); -// top--; -// stk[++top] = lca; +// stk[top] = lca; // } // headv[x] = 0; // stk[++top] = x; diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index 631468285..ecc2c00a4 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -188,8 +188,7 @@ public static int buildVirtualTree2() { if (lca != stk[top]) { headv[lca] = 0; addEdgeV(lca, stk[top], getDist(lca, stk[top])); - top--; - stk[++top] = lca; + stk[top] = lca; } headv[x] = 0; stk[++top] = x; diff --git a/src/class180/Code03_War2.java b/src/class180/Code03_War2.java index e4ec2eada..5f337d515 100644 --- a/src/class180/Code03_War2.java +++ b/src/class180/Code03_War2.java @@ -167,8 +167,7 @@ // if (lca != stk[top]) { // headv[lca] = 0; // addEdgeV(lca, stk[top], getDist(lca, stk[top])); -// top--; -// stk[++top] = lca; +// stk[top] = lca; // } // headv[x] = 0; // stk[++top] = x; From 8a306e50a823422890fde2b3e81d351d1237fc5f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Oct 2025 14:10:39 +0800 Subject: [PATCH 0849/1170] modify code --- src/class180/Code01_KingdomAndCities1.java | 2 +- src/class180/Code01_KingdomAndCities2.java | 2 +- src/class180/Code02_BigProject1.java | 2 +- src/class180/Code02_BigProject2.java | 6 ++++-- src/class180/Code03_War1.java | 2 +- src/class180/Code03_War2.java | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/class180/Code01_KingdomAndCities1.java b/src/class180/Code01_KingdomAndCities1.java index bafeff6e8..139c25a78 100644 --- a/src/class180/Code01_KingdomAndCities1.java +++ b/src/class180/Code01_KingdomAndCities1.java @@ -155,7 +155,7 @@ public static int buildVirtualTree2() { addEdgeV(stk[top - 1], stk[top]); top--; } - if (lca != stk[top]) { + if (dfn[stk[top]] > dfn[lca]) { headv[lca] = 0; addEdgeV(lca, stk[top]); stk[top] = lca; diff --git a/src/class180/Code01_KingdomAndCities2.java b/src/class180/Code01_KingdomAndCities2.java index 94aca1b51..93442566d 100644 --- a/src/class180/Code01_KingdomAndCities2.java +++ b/src/class180/Code01_KingdomAndCities2.java @@ -134,7 +134,7 @@ // addEdgeV(stk[top - 1], stk[top]); // top--; // } -// if (lca != stk[top]) { +// if (dfn[stk[top]] > dfn[lca]) { // headv[lca] = 0; // addEdgeV(lca, stk[top]); // stk[top] = lca; diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index da83af8b3..ce13b48d4 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -204,7 +204,7 @@ public static int buildVirtualTree2() { addEdgeV(stk[top - 1], stk[top]); top--; } - if (lca != stk[top]) { + if (dfn[stk[top]] > dfn[lca]) { headv[lca] = 0; addEdgeV(lca, stk[top]); stk[top] = lca; diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index cd00884d8..28c08a866 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -83,7 +83,9 @@ // swap(a, b); // } // for (int p = MAXP - 1; p >= 0; p--) { -// if (dep[ stjump[a][p] ] >= dep[b]) a = stjump[a][p]; +// if (dep[ stjump[a][p] ] >= dep[b]) { +// a = stjump[a][p]; +// } // } // if (a == b) { // return a; @@ -136,7 +138,7 @@ // addEdgeV(stk[top - 1], stk[top]); // top--; // } -// if (lca != stk[top]) { +// if (dfn[stk[top]] > dfn[lca]) { // headv[lca] = 0; // addEdgeV(lca, stk[top]); // stk[top] = lca; diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index ecc2c00a4..cdf4de14e 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -185,7 +185,7 @@ public static int buildVirtualTree2() { addEdgeV(stk[top - 1], stk[top], getDist(stk[top - 1], stk[top])); top--; } - if (lca != stk[top]) { + if (dfn[stk[top]] > dfn[lca]) { headv[lca] = 0; addEdgeV(lca, stk[top], getDist(lca, stk[top])); stk[top] = lca; diff --git a/src/class180/Code03_War2.java b/src/class180/Code03_War2.java index 5f337d515..ce3e9d9da 100644 --- a/src/class180/Code03_War2.java +++ b/src/class180/Code03_War2.java @@ -164,7 +164,7 @@ // addEdgeV(stk[top - 1], stk[top], getDist(stk[top - 1], stk[top])); // top--; // } -// if (lca != stk[top]) { +// if (dfn[stk[top]] > dfn[lca]) { // headv[lca] = 0; // addEdgeV(lca, stk[top], getDist(lca, stk[top])); // stk[top] = lca; From 6b5e91c67a5e4af157bc66b9234d538917308665 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Oct 2025 15:15:14 +0800 Subject: [PATCH 0850/1170] modify code --- src/class180/Code01_KingdomAndCities1.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/class180/Code01_KingdomAndCities1.java b/src/class180/Code01_KingdomAndCities1.java index 139c25a78..5e2366edc 100644 --- a/src/class180/Code01_KingdomAndCities1.java +++ b/src/class180/Code01_KingdomAndCities1.java @@ -24,22 +24,27 @@ public class Code01_KingdomAndCities1 { public static int MAXP = 20; public static int n, q, k; + // 原始树 public static int[] headg = new int[MAXN]; public static int[] nextg = new int[MAXN << 1]; public static int[] tog = new int[MAXN << 1]; public static int cntg; + // 虚树 public static int[] headv = new int[MAXN]; public static int[] nextv = new int[MAXN]; public static int[] tov = new int[MAXN]; public static int cntv; + // 树上倍增求LCA + 生成dfn序 public static int[] dep = new int[MAXN]; public static int[] dfn = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXP]; public static int cntd; + // 关键点数组 public static int[] arr = new int[MAXN]; + // 标记节点是否是关键点 public static boolean[] isKey = new boolean[MAXN]; // 第一种建树方式 @@ -47,15 +52,20 @@ public class Code01_KingdomAndCities1 { // 第二种建树方式 public static int[] stk = new int[MAXN]; + // 动态规划相关 + // siz[u],表示还有几个关键点与u相连 + // cost[u],表示节点u的子树中,做到关键点之间不连通,至少需要攻占几个点 public static int[] siz = new int[MAXN]; public static int[] cost = new int[MAXN]; + // 原始树连边 public static void addEdgeG(int u, int v) { nextg[++cntg] = headg[u]; tog[cntg] = v; headg[u] = cntg; } + // 虚树连边 public static void addEdgeV(int u, int v) { nextv[++cntv] = headv[u]; tov[cntv] = v; @@ -79,6 +89,7 @@ public static void sortByDfn(int[] nums, int l, int r) { sortByDfn(nums, i, r); } + // 树上倍增的dfs过程 public static void dfs(int u, int fa) { dep[u] = dep[fa] + 1; dfn[u] = ++cntd; @@ -93,6 +104,7 @@ public static void dfs(int u, int fa) { } } + // 返回a和b的最低公共祖先 public static int getLca(int a, int b) { if (dep[a] < dep[b]) { int tmp = a; a = b; b = tmp; @@ -170,6 +182,7 @@ public static int buildVirtualTree2() { return stk[1]; } + // 树型dp的过程 public static void dp(int u) { cost[u] = siz[u] = 0; for (int e = headv[u]; e > 0; e = nextv[e]) { @@ -188,11 +201,15 @@ public static void dp(int u) { } public static int compute() { + // 节点标记关键点信息 for (int i = 1; i <= k; i++) { isKey[arr[i]] = true; } boolean check = true; for (int i = 1; i <= k; i++) { + // 只能通过攻占非关键点的方式,来隔开关键点 + // 所以如果 a 和 a的父节点 都是关键点,这是怎么也隔不开的 + // 直接返回-1即可 if (isKey[stjump[arr[i]][0]]) { check = false; break; @@ -205,6 +222,7 @@ public static int compute() { dp(tree); ans = cost[tree]; } + // 节点撤销关键点信息 for (int i = 1; i <= k; i++) { isKey[arr[i]] = false; } From 25dfd6c62b9081cf68ad13b1531cf5f03f84b99e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Oct 2025 15:30:37 +0800 Subject: [PATCH 0851/1170] modify code --- src/class180/Code01_KingdomAndCities1.java | 2 +- src/class180/Code01_KingdomAndCities2.java | 2 +- src/class180/Code02_BigProject1.java | 2 +- src/class180/Code02_BigProject2.java | 2 +- src/class180/Code03_War1.java | 2 +- src/class180/Code03_War2.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class180/Code01_KingdomAndCities1.java b/src/class180/Code01_KingdomAndCities1.java index 5e2366edc..d0acdce75 100644 --- a/src/class180/Code01_KingdomAndCities1.java +++ b/src/class180/Code01_KingdomAndCities1.java @@ -167,7 +167,7 @@ public static int buildVirtualTree2() { addEdgeV(stk[top - 1], stk[top]); top--; } - if (dfn[stk[top]] > dfn[lca]) { + if (lca != stk[top]) { headv[lca] = 0; addEdgeV(lca, stk[top]); stk[top] = lca; diff --git a/src/class180/Code01_KingdomAndCities2.java b/src/class180/Code01_KingdomAndCities2.java index 93442566d..94aca1b51 100644 --- a/src/class180/Code01_KingdomAndCities2.java +++ b/src/class180/Code01_KingdomAndCities2.java @@ -134,7 +134,7 @@ // addEdgeV(stk[top - 1], stk[top]); // top--; // } -// if (dfn[stk[top]] > dfn[lca]) { +// if (lca != stk[top]) { // headv[lca] = 0; // addEdgeV(lca, stk[top]); // stk[top] = lca; diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index ce13b48d4..da83af8b3 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -204,7 +204,7 @@ public static int buildVirtualTree2() { addEdgeV(stk[top - 1], stk[top]); top--; } - if (dfn[stk[top]] > dfn[lca]) { + if (lca != stk[top]) { headv[lca] = 0; addEdgeV(lca, stk[top]); stk[top] = lca; diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index 28c08a866..a35238356 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -138,7 +138,7 @@ // addEdgeV(stk[top - 1], stk[top]); // top--; // } -// if (dfn[stk[top]] > dfn[lca]) { +// if (lca != stk[top]) { // headv[lca] = 0; // addEdgeV(lca, stk[top]); // stk[top] = lca; diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index cdf4de14e..ecc2c00a4 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -185,7 +185,7 @@ public static int buildVirtualTree2() { addEdgeV(stk[top - 1], stk[top], getDist(stk[top - 1], stk[top])); top--; } - if (dfn[stk[top]] > dfn[lca]) { + if (lca != stk[top]) { headv[lca] = 0; addEdgeV(lca, stk[top], getDist(lca, stk[top])); stk[top] = lca; diff --git a/src/class180/Code03_War2.java b/src/class180/Code03_War2.java index ce3e9d9da..5f337d515 100644 --- a/src/class180/Code03_War2.java +++ b/src/class180/Code03_War2.java @@ -164,7 +164,7 @@ // addEdgeV(stk[top - 1], stk[top], getDist(stk[top - 1], stk[top])); // top--; // } -// if (dfn[stk[top]] > dfn[lca]) { +// if (lca != stk[top]) { // headv[lca] = 0; // addEdgeV(lca, stk[top], getDist(lca, stk[top])); // stk[top] = lca; From 8721c91216bd115ab9883b29a01ffbb3f7143cd2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Oct 2025 16:09:25 +0800 Subject: [PATCH 0852/1170] modify code --- src/class180/Code01_KingdomAndCities1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class180/Code01_KingdomAndCities1.java b/src/class180/Code01_KingdomAndCities1.java index d0acdce75..240bb55db 100644 --- a/src/class180/Code01_KingdomAndCities1.java +++ b/src/class180/Code01_KingdomAndCities1.java @@ -53,7 +53,7 @@ public class Code01_KingdomAndCities1 { public static int[] stk = new int[MAXN]; // 动态规划相关 - // siz[u],表示还有几个关键点与u相连 + // siz[u],表示节点u的子树中,有几个重要点和u相连 // cost[u],表示节点u的子树中,做到关键点之间不连通,至少需要攻占几个点 public static int[] siz = new int[MAXN]; public static int[] cost = new int[MAXN]; From 202af1666d4532f9e5c7aeeeb11e6cfbf216edca Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Oct 2025 16:15:22 +0800 Subject: [PATCH 0853/1170] modify code --- src/class180/Code01_KingdomAndCities1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class180/Code01_KingdomAndCities1.java b/src/class180/Code01_KingdomAndCities1.java index 240bb55db..a851114fd 100644 --- a/src/class180/Code01_KingdomAndCities1.java +++ b/src/class180/Code01_KingdomAndCities1.java @@ -53,7 +53,7 @@ public class Code01_KingdomAndCities1 { public static int[] stk = new int[MAXN]; // 动态规划相关 - // siz[u],表示节点u的子树中,有几个重要点和u相连 + // siz[u],表示节点u的子树中,还有几个重要点和u相连 // cost[u],表示节点u的子树中,做到关键点之间不连通,至少需要攻占几个点 public static int[] siz = new int[MAXN]; public static int[] cost = new int[MAXN]; From 1cba939c6a0bb1f01ae4f73160cc6f6d2b854fa2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Oct 2025 17:09:50 +0800 Subject: [PATCH 0854/1170] modify code --- src/class180/Code01_KingdomAndCities1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class180/Code01_KingdomAndCities1.java b/src/class180/Code01_KingdomAndCities1.java index a851114fd..bd79ebc37 100644 --- a/src/class180/Code01_KingdomAndCities1.java +++ b/src/class180/Code01_KingdomAndCities1.java @@ -53,8 +53,8 @@ public class Code01_KingdomAndCities1 { public static int[] stk = new int[MAXN]; // 动态规划相关 - // siz[u],表示节点u的子树中,还有几个重要点和u相连 - // cost[u],表示节点u的子树中,做到关键点之间不连通,至少需要攻占几个点 + // siz[u],还有几个重要点没和u断开,值为0或者1 + // cost[u],表示节点u的子树中,做到不违规,至少需要攻占几个非重要点 public static int[] siz = new int[MAXN]; public static int[] cost = new int[MAXN]; From 4ca85b553d581c3ded72a4909b6da3fd1aa2c613 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Oct 2025 17:57:15 +0800 Subject: [PATCH 0855/1170] modify code --- src/class180/Code02_BigProject1.java | 38 ++++++++++++++++------------ src/class180/Code02_BigProject2.java | 18 ++++++------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/class180/Code02_BigProject1.java b/src/class180/Code02_BigProject1.java index da83af8b3..50c937ed6 100644 --- a/src/class180/Code02_BigProject1.java +++ b/src/class180/Code02_BigProject1.java @@ -45,10 +45,16 @@ public class Code02_BigProject1 { public static int[] tmp = new int[MAXN << 1]; public static int[] stk = new int[MAXN]; + // siz[u]表示子树u上,关键点的数量 + // sum[u]表示子树u上,所有关键点到u的总距离 + // near[u]表示子树u上,到u最近关键点的距离 + // far[u]表示子树u上,到u最远关键点的距离 public static int[] siz = new int[MAXN]; public static long[] sum = new long[MAXN]; - public static long[] minv = new long[MAXN]; - public static long[] maxv = new long[MAXN]; + public static long[] near = new long[MAXN]; + public static long[] far = new long[MAXN]; + + // 新通道的代价和、新通道中代价最小的值、新通道中代价最大的值 public static long costSum, costMin, costMax; // dfs过程和dp过程,C++同学可以使用递归版 @@ -224,10 +230,10 @@ public static void dp1(int u) { siz[u] = isKey[u] ? 1 : 0; sum[u] = 0; if (isKey[u]) { - maxv[u] = minv[u] = 0; + far[u] = near[u] = 0; } else { - minv[u] = INF; - maxv[u] = -INF; + near[u] = INF; + far[u] = -INF; } for (int e = headv[u]; e > 0; e = nextv[e]) { dp1(tov[e]); @@ -238,10 +244,10 @@ public static void dp1(int u) { costSum += (sum[u] + 1L * siz[u] * len) * siz[v] + sum[v] * siz[u]; siz[u] += siz[v]; sum[u] += sum[v] + len * siz[v]; - costMin = Math.min(costMin, minv[u] + minv[v] + len); - costMax = Math.max(costMax, maxv[u] + maxv[v] + len); - minv[u] = Math.min(minv[u], minv[v] + len); - maxv[u] = Math.max(maxv[u], maxv[v] + len); + costMin = Math.min(costMin, near[u] + near[v] + len); + costMax = Math.max(costMax, far[u] + far[v] + len); + near[u] = Math.min(near[u], near[v] + len); + far[u] = Math.max(far[u], far[v] + len); } } @@ -255,10 +261,10 @@ public static void dp2(int tree) { siz[u] = isKey[u] ? 1 : 0; sum[u] = 0; if (isKey[u]) { - maxv[u] = minv[u] = 0; + far[u] = near[u] = 0; } else { - minv[u] = INF; - maxv[u] = -INF; + near[u] = INF; + far[u] = -INF; } e = headv[u]; } else { @@ -274,10 +280,10 @@ public static void dp2(int tree) { costSum += (sum[u] + 1L * siz[u] * len) * siz[v] + sum[v] * siz[u]; siz[u] += siz[v]; sum[u] += sum[v] + len * siz[v]; - costMin = Math.min(costMin, minv[u] + minv[v] + len); - costMax = Math.max(costMax, maxv[u] + maxv[v] + len); - minv[u] = Math.min(minv[u], minv[v] + len); - maxv[u] = Math.max(maxv[u], maxv[v] + len); + costMin = Math.min(costMin, near[u] + near[v] + len); + costMax = Math.max(costMax, far[u] + far[v] + len); + near[u] = Math.min(near[u], near[v] + len); + far[u] = Math.max(far[u], far[v] + len); } } } diff --git a/src/class180/Code02_BigProject2.java b/src/class180/Code02_BigProject2.java index a35238356..9c1a581db 100644 --- a/src/class180/Code02_BigProject2.java +++ b/src/class180/Code02_BigProject2.java @@ -45,8 +45,8 @@ // //int siz[MAXN]; //long long sum[MAXN]; -//long long minv[MAXN]; -//long long maxv[MAXN]; +//long long near[MAXN]; +//long long far[MAXN]; //long long costSum, costMin, costMax; // //bool cmp(int x, int y) { @@ -157,10 +157,10 @@ // siz[u] = isKey[u] ? 1 : 0; // sum[u] = 0; // if (isKey[u]) { -// minv[u] = maxv[u] = 0; +// near[u] = far[u] = 0; // } else { -// minv[u] = INF; -// maxv[u] = -INF; +// near[u] = INF; +// far[u] = -INF; // } // for (int e = headv[u]; e; e = nextv[e]) { // dp(tov[e]); @@ -171,10 +171,10 @@ // costSum += (sum[u] + 1LL * siz[u] * len) * siz[v] + sum[v] * siz[u]; // siz[u] += siz[v]; // sum[u] += sum[v] + len * siz[v]; -// costMin = min(costMin, minv[u] + minv[v] + len); -// costMax = max(costMax, maxv[u] + maxv[v] + len); -// minv[u] = min(minv[u], minv[v] + len); -// maxv[u] = max(maxv[u], maxv[v] + len); +// costMin = min(costMin, near[u] + near[v] + len); +// costMax = max(costMax, far[u] + far[v] + len); +// near[u] = min(near[u], near[v] + len); +// far[u] = max(far[u], far[v] + len); // } //} // From e8e0b4fd6f8e18a79820734f29b652b7d419b792 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Oct 2025 20:27:42 +0800 Subject: [PATCH 0856/1170] modify code --- src/class180/Code03_War1.java | 22 +++++----------------- src/class180/Code03_War2.java | 21 ++++----------------- 2 files changed, 9 insertions(+), 34 deletions(-) diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index ecc2c00a4..625e91070 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -114,25 +114,13 @@ public static int getLca(int a, int b) { return stjump[a][0]; } - public static int getDist(int a, int b) { + // 已知u一定是v的祖先节点,返回u到v路径上的最小边权 + public static int getDist(int u, int v) { int dist = 100000001; - if (dep[a] < dep[b]) { - int tmp = a; a = b; b = tmp; - } for (int p = MAXP - 1; p >= 0; p--) { - if (dep[stjump[a][p]] >= dep[b]) { - dist = Math.min(dist, mindist[a][p]); - a = stjump[a][p]; - } - } - if (a == b) { - return dist; - } - for (int p = MAXP - 1; p >= 0; p--) { - if (stjump[a][p] != stjump[b][p]) { - dist = Math.min(dist, Math.min(mindist[a][p], mindist[b][p])); - a = stjump[a][p]; - b = stjump[b][p]; + if (dep[stjump[v][p]] >= dep[u]) { + dist = Math.min(dist, mindist[v][p]); + v = stjump[v][p]; } } return dist; diff --git a/src/class180/Code03_War2.java b/src/class180/Code03_War2.java index 5f337d515..b6cb42444 100644 --- a/src/class180/Code03_War2.java +++ b/src/class180/Code03_War2.java @@ -99,25 +99,12 @@ // return stjump[a][0]; //} // -//int getDist(int a, int b) { +//int getDist(int u, int v) { // int dist = 100000001; -// if (dep[a] < dep[b]) { -// swap(a, b); -// } // for (int p = MAXP - 1; p >= 0; p--) { -// if (dep[stjump[a][p]] >= dep[b]) { -// dist = min(dist, mindist[a][p]); -// a = stjump[a][p]; -// } -// } -// if (a == b) { -// return dist; -// } -// for (int p = MAXP - 1; p >= 0; p--) { -// if (stjump[a][p] != stjump[b][p]) { -// dist = min(dist, min(mindist[a][p], mindist[b][p])); -// a = stjump[a][p]; -// b = stjump[b][p]; +// if (dep[stjump[v][p]] >= dep[u]) { +// dist = min(dist, mindist[v][p]); +// v = stjump[v][p]; // } // } // return dist; From 4d99c9db9e152b1f45d8505e9f4d6c21ca06469f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 10:56:23 +0800 Subject: [PATCH 0857/1170] modify code --- src/class180/Code04_WorldTree1.java | 24 ++++++++++++++++++++++-- src/class180/Code04_WorldTree2.java | 7 +++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index ade402f15..b1cc32dd0 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -38,6 +38,7 @@ public class Code04_WorldTree1 { public static int cntv; public static int[] dep = new int[MAXN]; + // 注意siz[u]表示在原树里,子树u有几个节点 public static int[] siz = new int[MAXN]; public static int[] dfn = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXP]; @@ -48,8 +49,11 @@ public class Code04_WorldTree1 { public static boolean[] isKey = new boolean[MAXN]; public static int[] tmp = new int[MAXN << 1]; + // mindist[u]表示u节点到管理点的最短距离 public static int[] mindist = new int[MAXN]; + // mindist[u]表示u节点的最近管理点 public static int[] pick = new int[MAXN]; + // ans[i]表示i这个管理点,管理了几个点 public static int[] ans = new int[MAXN]; public static void addEdgeG(int u, int v) { @@ -146,6 +150,8 @@ public static int buildVirtualTree() { return tmp[1]; } + // 从下往上更新最近管理点 + // 节点u根据孩子的管理点,找到离u最近的管理点 public static void dp1(int u) { mindist[u] = INF; for (int e = headv[u]; e > 0; e = nextv[e]) { @@ -165,6 +171,8 @@ public static void dp1(int u) { } } + // 从上往下更新最近管理点 + // 根据u找到的最近管理点,更新每个孩子节点v的最近管理点 public static void dp2(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; @@ -179,7 +187,13 @@ public static void dp2(int u) { } } - public static void calc(int u, int v) { + // 已知u一定是v的祖先节点,u到v之间的大量节点没有被纳入到虚树 + // 这部分节点之前都分配给了pick[u],现在根据最近距离做重新分配 + // 可能有若干节点会重新分配给pick[v],修正相关的计数 + public static void amend(int u, int v) { + if (pick[u] == pick[v]) { + return; + } int x = v; for (int p = MAXP - 1; p >= 0; p--) { int tou = dep[stjump[x][p]] - dep[u] + mindist[u]; @@ -193,12 +207,18 @@ public static void calc(int u, int v) { ans[pick[v]] += delta; } + // 每个点都有了最近的管理点,更新相关的管理点的计数 public static void dp3(int u) { + // 管理u的关键节点,先获得原树里子树u的所有节点 + // 然后经历修正的过程,把管理节点的数量更新正确 ans[pick[u]] += siz[u]; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; - calc(u, v); + // 修正的过程 + amend(u, v); + // 马上去往v执行dp3的过程,所以子树v的节点现在扣除 ans[pick[u]] -= siz[v]; + // 子树v怎么分配节点,那是后续dp3(v)的事情 dp3(v); } } diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 7b14ff653..10d7041e8 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -159,7 +159,10 @@ // } //} // -//void calc(int u, int v) { +//void amend(int u, int v) { +// if (pick[u] == pick[v]) { +// return; +// } // int x = v; // for (int p = MAXP - 1; p >= 0; p--) { // int tou = (dep[stjump[x][p]] - dep[u]) + mindist[u]; @@ -177,7 +180,7 @@ // ans[pick[u]] += siz[u]; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; -// calc(u, v); +// amend(u, v); // ans[pick[u]] -= siz[v]; // dp3(v); // } From 5ea40105ba524188096a3746721aaf6df62c456e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 11:02:37 +0800 Subject: [PATCH 0858/1170] modify code --- src/class180/Code03_War1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index 625e91070..8651b0a18 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -45,6 +45,7 @@ public class Code03_War1 { public static int[] tmp = new int[MAXN << 1]; public static int[] stk = new int[MAXN]; + // cut[u]表示子树u上的所有关键节点,都连不上u的话,需要切除边的最小代价 public static long[] cut = new long[MAXN]; public static void addEdgeG(int u, int v, int w) { From 07cbaa3fe476d7ea213049789c8a24d7ebe6d442 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 11:04:21 +0800 Subject: [PATCH 0859/1170] modify code --- src/class180/Code03_War1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index 8651b0a18..e0174f907 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -37,6 +37,7 @@ public class Code03_War1 { public static int[] dep = new int[MAXN]; public static int[] dfn = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXP]; + // 上方最小距离的倍增表 public static int[][] mindist = new int[MAXN][MAXP]; public static int cntd; From 5f5ffa500ae5c1870752a3bdc189f5b205cffb27 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 11:32:14 +0800 Subject: [PATCH 0860/1170] modify code --- src/class180/Code03_War1.java | 12 ++++++------ src/class180/Code03_War2.java | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class180/Code03_War1.java b/src/class180/Code03_War1.java index e0174f907..199f7f24b 100644 --- a/src/class180/Code03_War1.java +++ b/src/class180/Code03_War1.java @@ -46,8 +46,8 @@ public class Code03_War1 { public static int[] tmp = new int[MAXN << 1]; public static int[] stk = new int[MAXN]; - // cut[u]表示子树u上的所有关键节点,都连不上u的话,需要切除边的最小代价 - public static long[] cut = new long[MAXN]; + // cost[u]表示虚树中,u下方的所有关键节点,都连不上u的话,最小总代价 + public static long[] cost = new long[MAXN]; public static void addEdgeG(int u, int v, int w) { nextg[++cntg] = headg[u]; @@ -194,14 +194,14 @@ public static void dp(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { dp(tov[e]); } - cut[u] = 0; + cost[u] = 0; for (int e = headv[u], v, w; e > 0; e = nextv[e]) { v = tov[e]; w = weightv[e]; if (isKey[v]) { - cut[u] += w; + cost[u] += w; } else { - cut[u] += Math.min(cut[v], w); + cost[u] += Math.min(cost[v], w); } } } @@ -216,7 +216,7 @@ public static long compute() { for (int i = 1; i <= k; i++) { isKey[arr[i]] = false; } - return cut[tree]; + return cost[tree]; } public static void main(String[] args) throws Exception { diff --git a/src/class180/Code03_War2.java b/src/class180/Code03_War2.java index b6cb42444..ada035e28 100644 --- a/src/class180/Code03_War2.java +++ b/src/class180/Code03_War2.java @@ -43,7 +43,7 @@ //int tmp[MAXN << 1]; //int stk[MAXN]; // -//long long cut[MAXN]; +//long long cost[MAXN]; // //bool cmp(int x, int y) { // return dfn[x] < dfn[y]; @@ -170,14 +170,14 @@ // for (int e = headv[u]; e; e = nextv[e]) { // dp(tov[e]); // } -// cut[u] = 0; +// cost[u] = 0; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // int w = weightv[e]; // if (isKey[v]) { -// cut[u] += w; +// cost[u] += w; // } else { -// cut[u] += min(cut[v], (long long)w); +// cost[u] += min(cost[v], (long long)w); // } // } //} @@ -192,7 +192,7 @@ // for (int i = 1; i <= k; i++) { // isKey[arr[i]] = false; // } -// return cut[tree]; +// return cost[tree]; //} // //int main() { From 09fdface1cfcde4380ebf1a7a511bb80d04d231e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 12:24:56 +0800 Subject: [PATCH 0861/1170] modify code --- src/class180/Code04_WorldTree1.java | 54 ++++++++++++++--------------- src/class180/Code04_WorldTree2.java | 46 ++++++++++++------------ 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index b1cc32dd0..8ae845a14 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -49,10 +49,10 @@ public class Code04_WorldTree1 { public static boolean[] isKey = new boolean[MAXN]; public static int[] tmp = new int[MAXN << 1]; - // mindist[u]表示u节点到管理点的最短距离 - public static int[] mindist = new int[MAXN]; - // mindist[u]表示u节点的最近管理点 - public static int[] pick = new int[MAXN]; + // near[u]表示u节点的最近管理点 + public static int[] near = new int[MAXN]; + // dist[u]表示u节点到最近管理点的距离 + public static int[] dist = new int[MAXN]; // ans[i]表示i这个管理点,管理了几个点 public static int[] ans = new int[MAXN]; @@ -153,21 +153,21 @@ public static int buildVirtualTree() { // 从下往上更新最近管理点 // 节点u根据孩子的管理点,找到离u最近的管理点 public static void dp1(int u) { - mindist[u] = INF; + dist[u] = INF; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; dp1(v); int dis = dep[v] - dep[u]; - if (mindist[u] > mindist[v] + dis) { - mindist[u] = mindist[v] + dis; - pick[u] = pick[v]; - } else if (mindist[u] == mindist[v] + dis) { - pick[u] = Math.min(pick[u], pick[v]); + if (dist[u] > dist[v] + dis) { + dist[u] = dist[v] + dis; + near[u] = near[v]; + } else if (dist[u] == dist[v] + dis) { + near[u] = Math.min(near[u], near[v]); } } if (isKey[u]) { - mindist[u] = 0; - pick[u] = u; + dist[u] = 0; + near[u] = u; } } @@ -177,47 +177,47 @@ public static void dp2(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; int dis = dep[v] - dep[u]; - if (mindist[v] > mindist[u] + dis) { - mindist[v] = mindist[u] + dis; - pick[v] = pick[u]; - } else if (mindist[v] == mindist[u] + dis) { - pick[v] = Math.min(pick[v], pick[u]); + if (dist[v] > dist[u] + dis) { + dist[v] = dist[u] + dis; + near[v] = near[u]; + } else if (dist[v] == dist[u] + dis) { + near[v] = Math.min(near[v], near[u]); } dp2(v); } } // 已知u一定是v的祖先节点,u到v之间的大量节点没有被纳入到虚树 - // 这部分节点之前都分配给了pick[u],现在根据最近距离做重新分配 - // 可能有若干节点会重新分配给pick[v],修正相关的计数 + // 这部分节点之前都分配给了near[u],现在根据最近距离做重新分配 + // 可能若干节点会重新分配给near[v],修正相关的计数 public static void amend(int u, int v) { - if (pick[u] == pick[v]) { + if (near[u] == near[v]) { return; } int x = v; for (int p = MAXP - 1; p >= 0; p--) { - int tou = dep[stjump[x][p]] - dep[u] + mindist[u]; - int tov = dep[v] - dep[stjump[x][p]] + mindist[v]; - if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && pick[v] < pick[u]))) { + int tou = dep[stjump[x][p]] - dep[u] + dist[u]; + int tov = dep[v] - dep[stjump[x][p]] + dist[v]; + if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && near[v] < near[u]))) { x = stjump[x][p]; } } int delta = siz[x] - siz[v]; - ans[pick[u]] -= delta; - ans[pick[v]] += delta; + ans[near[u]] -= delta; + ans[near[v]] += delta; } // 每个点都有了最近的管理点,更新相关的管理点的计数 public static void dp3(int u) { // 管理u的关键节点,先获得原树里子树u的所有节点 // 然后经历修正的过程,把管理节点的数量更新正确 - ans[pick[u]] += siz[u]; + ans[near[u]] += siz[u]; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; // 修正的过程 amend(u, v); // 马上去往v执行dp3的过程,所以子树v的节点现在扣除 - ans[pick[u]] -= siz[v]; + ans[near[u]] -= siz[v]; // 子树v怎么分配节点,那是后续dp3(v)的事情 dp3(v); } diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 10d7041e8..2b1de7b10 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -42,8 +42,8 @@ //bool isKey[MAXN]; //int tmp[MAXN << 1]; // -//int mindist[MAXN]; -//int pick[MAXN]; +//int near[MAXN]; +//int dist[MAXN]; //int ans[MAXN]; // //bool cmp(int x, int y) { @@ -127,21 +127,21 @@ //} // //void dp1(int u) { -// mindist[u] = INF; +// dist[u] = INF; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // dp1(v); // int dis = dep[v] - dep[u]; -// if (mindist[u] > mindist[v] + dis) { -// mindist[u] = mindist[v] + dis; -// pick[u] = pick[v]; -// } else if (mindist[u] == mindist[v] + dis) { -// pick[u] = min(pick[u], pick[v]); +// if (dist[u] > dist[v] + dis) { +// dist[u] = dist[v] + dis; +// near[u] = near[v]; +// } else if (dist[u] == dist[v] + dis) { +// near[u] = min(near[u], near[v]); // } // } // if (isKey[u]) { -// mindist[u] = 0; -// pick[u] = u; +// dist[u] = 0; +// near[u] = u; // } //} // @@ -149,39 +149,39 @@ // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // int dis = dep[v] - dep[u]; -// if (mindist[v] > mindist[u] + dis) { -// mindist[v] = mindist[u] + dis; -// pick[v] = pick[u]; -// } else if (mindist[v] == mindist[u] + dis) { -// pick[v] = min(pick[v], pick[u]); +// if (dist[v] > dist[u] + dis) { +// dist[v] = dist[u] + dis; +// near[v] = near[u]; +// } else if (dist[v] == dist[u] + dis) { +// near[v] = min(near[v], near[u]); // } // dp2(v); // } //} // //void amend(int u, int v) { -// if (pick[u] == pick[v]) { +// if (near[u] == near[v]) { // return; // } // int x = v; // for (int p = MAXP - 1; p >= 0; p--) { -// int tou = (dep[stjump[x][p]] - dep[u]) + mindist[u]; -// int tov = (dep[v] - dep[stjump[x][p]]) + mindist[v]; -// if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && pick[v] < pick[u]))) { +// int tou = (dep[stjump[x][p]] - dep[u]) + dist[u]; +// int tov = (dep[v] - dep[stjump[x][p]]) + dist[v]; +// if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && near[v] < near[u]))) { // x = stjump[x][p]; // } // } // int delta = siz[x] - siz[v]; -// ans[pick[u]] -= delta; -// ans[pick[v]] += delta; +// ans[near[u]] -= delta; +// ans[near[v]] += delta; //} // //void dp3(int u) { -// ans[pick[u]] += siz[u]; +// ans[near[u]] += siz[u]; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // amend(u, v); -// ans[pick[u]] -= siz[v]; +// ans[near[u]] -= siz[v]; // dp3(v); // } //} From 87b81ad46f557f4db3fb545c0c3434b42b89a33f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 12:34:39 +0800 Subject: [PATCH 0862/1170] modify code --- src/class180/Code04_WorldTree1.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index 8ae845a14..de6938e40 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -150,8 +150,7 @@ public static int buildVirtualTree() { return tmp[1]; } - // 从下往上更新最近管理点 - // 节点u根据孩子的管理点,找到离u最近的管理点 + // 下方找最近管理点,节点u根据孩子的管理点,找到离u最近的管理点 public static void dp1(int u) { dist[u] = INF; for (int e = headv[u]; e > 0; e = nextv[e]) { @@ -171,8 +170,7 @@ public static void dp1(int u) { } } - // 从上往下更新最近管理点 - // 根据u找到的最近管理点,更新每个孩子节点v的最近管理点 + // 上方找最近管理点,根据u找到的最近管理点,更新每个孩子节点v的最近管理点 public static void dp2(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; From f7dddd58b2a9ac590812db61086318cdd349280c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 12:37:07 +0800 Subject: [PATCH 0863/1170] modify code --- src/class180/Code04_WorldTree1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index de6938e40..a30044572 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -49,7 +49,7 @@ public class Code04_WorldTree1 { public static boolean[] isKey = new boolean[MAXN]; public static int[] tmp = new int[MAXN << 1]; - // near[u]表示u节点的最近管理点 + // near[u]表示u节点找到的最近管理点 public static int[] near = new int[MAXN]; // dist[u]表示u节点到最近管理点的距离 public static int[] dist = new int[MAXN]; @@ -207,7 +207,7 @@ public static void amend(int u, int v) { // 每个点都有了最近的管理点,更新相关的管理点的计数 public static void dp3(int u) { - // 管理u的关键节点,先获得原树里子树u的所有节点 + // u的管理节点,先获得原树里子树u的所有节点 // 然后经历修正的过程,把管理节点的数量更新正确 ans[near[u]] += siz[u]; for (int e = headv[u]; e > 0; e = nextv[e]) { From 98c031af29d9d4c6d7ed1b946a8b3ef515d85afe Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 12:45:22 +0800 Subject: [PATCH 0864/1170] modify code --- src/class180/Code04_WorldTree1.java | 46 ++++++++++++++--------------- src/class180/Code04_WorldTree2.java | 40 ++++++++++++------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index a30044572..ae1e08f78 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -49,8 +49,8 @@ public class Code04_WorldTree1 { public static boolean[] isKey = new boolean[MAXN]; public static int[] tmp = new int[MAXN << 1]; - // near[u]表示u节点找到的最近管理点 - public static int[] near = new int[MAXN]; + // manager[u]表示u节点找到的最近管理点 + public static int[] manager = new int[MAXN]; // dist[u]表示u节点到最近管理点的距离 public static int[] dist = new int[MAXN]; // ans[i]表示i这个管理点,管理了几个点 @@ -156,17 +156,17 @@ public static void dp1(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; dp1(v); - int dis = dep[v] - dep[u]; - if (dist[u] > dist[v] + dis) { - dist[u] = dist[v] + dis; - near[u] = near[v]; - } else if (dist[u] == dist[v] + dis) { - near[u] = Math.min(near[u], near[v]); + int w = dep[v] - dep[u]; + if (dist[u] > dist[v] + w) { + dist[u] = dist[v] + w; + manager[u] = manager[v]; + } else if (dist[u] == dist[v] + w) { + manager[u] = Math.min(manager[u], manager[v]); } } if (isKey[u]) { dist[u] = 0; - near[u] = u; + manager[u] = u; } } @@ -174,48 +174,48 @@ public static void dp1(int u) { public static void dp2(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; - int dis = dep[v] - dep[u]; - if (dist[v] > dist[u] + dis) { - dist[v] = dist[u] + dis; - near[v] = near[u]; - } else if (dist[v] == dist[u] + dis) { - near[v] = Math.min(near[v], near[u]); + int w = dep[v] - dep[u]; + if (dist[v] > dist[u] + w) { + dist[v] = dist[u] + w; + manager[v] = manager[u]; + } else if (dist[v] == dist[u] + w) { + manager[v] = Math.min(manager[v], manager[u]); } dp2(v); } } // 已知u一定是v的祖先节点,u到v之间的大量节点没有被纳入到虚树 - // 这部分节点之前都分配给了near[u],现在根据最近距离做重新分配 - // 可能若干节点会重新分配给near[v],修正相关的计数 + // 这部分节点之前都分配给了manager[u],现在根据最近距离做重新分配 + // 可能若干节点会重新分配给manager[v],修正相关的计数 public static void amend(int u, int v) { - if (near[u] == near[v]) { + if (manager[u] == manager[v]) { return; } int x = v; for (int p = MAXP - 1; p >= 0; p--) { int tou = dep[stjump[x][p]] - dep[u] + dist[u]; int tov = dep[v] - dep[stjump[x][p]] + dist[v]; - if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && near[v] < near[u]))) { + if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && manager[v] < manager[u]))) { x = stjump[x][p]; } } int delta = siz[x] - siz[v]; - ans[near[u]] -= delta; - ans[near[v]] += delta; + ans[manager[u]] -= delta; + ans[manager[v]] += delta; } // 每个点都有了最近的管理点,更新相关的管理点的计数 public static void dp3(int u) { // u的管理节点,先获得原树里子树u的所有节点 // 然后经历修正的过程,把管理节点的数量更新正确 - ans[near[u]] += siz[u]; + ans[manager[u]] += siz[u]; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; // 修正的过程 amend(u, v); // 马上去往v执行dp3的过程,所以子树v的节点现在扣除 - ans[near[u]] -= siz[v]; + ans[manager[u]] -= siz[v]; // 子树v怎么分配节点,那是后续dp3(v)的事情 dp3(v); } diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 2b1de7b10..0fea14df1 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -42,7 +42,7 @@ //bool isKey[MAXN]; //int tmp[MAXN << 1]; // -//int near[MAXN]; +//int manager[MAXN]; //int dist[MAXN]; //int ans[MAXN]; // @@ -131,57 +131,57 @@ // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // dp1(v); -// int dis = dep[v] - dep[u]; -// if (dist[u] > dist[v] + dis) { -// dist[u] = dist[v] + dis; -// near[u] = near[v]; -// } else if (dist[u] == dist[v] + dis) { -// near[u] = min(near[u], near[v]); +// int w = dep[v] - dep[u]; +// if (dist[u] > dist[v] + w) { +// dist[u] = dist[v] + w; +// manager[u] = manager[v]; +// } else if (dist[u] == dist[v] + w) { +// manager[u] = min(manager[u], manager[v]); // } // } // if (isKey[u]) { // dist[u] = 0; -// near[u] = u; +// manager[u] = u; // } //} // //void dp2(int u) { // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; -// int dis = dep[v] - dep[u]; -// if (dist[v] > dist[u] + dis) { -// dist[v] = dist[u] + dis; -// near[v] = near[u]; -// } else if (dist[v] == dist[u] + dis) { -// near[v] = min(near[v], near[u]); +// int w = dep[v] - dep[u]; +// if (dist[v] > dist[u] + w) { +// dist[v] = dist[u] + w; +// manager[v] = manager[u]; +// } else if (dist[v] == dist[u] + w) { +// manager[v] = min(manager[v], manager[u]); // } // dp2(v); // } //} // //void amend(int u, int v) { -// if (near[u] == near[v]) { +// if (manager[u] == manager[v]) { // return; // } // int x = v; // for (int p = MAXP - 1; p >= 0; p--) { // int tou = (dep[stjump[x][p]] - dep[u]) + dist[u]; // int tov = (dep[v] - dep[stjump[x][p]]) + dist[v]; -// if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && near[v] < near[u]))) { +// if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && manager[v] < manager[u]))) { // x = stjump[x][p]; // } // } // int delta = siz[x] - siz[v]; -// ans[near[u]] -= delta; -// ans[near[v]] += delta; +// ans[manager[u]] -= delta; +// ans[manager[v]] += delta; //} // //void dp3(int u) { -// ans[near[u]] += siz[u]; +// ans[manager[u]] += siz[u]; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // amend(u, v); -// ans[near[u]] -= siz[v]; +// ans[manager[u]] -= siz[v]; // dp3(v); // } //} From 760f512e533a22f609a4e88e3bef336ca158f396 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 12:52:22 +0800 Subject: [PATCH 0865/1170] modify code --- src/class180/Code04_WorldTree1.java | 6 +++--- src/class180/Code04_WorldTree2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index ae1e08f78..76b336e36 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -3,9 +3,9 @@ // 世界树,java版 // 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 // 一共有q条查询,每条查询格式如下 -// 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,树上每个点都找最近的关键点来管理自己 -// 最近的关键点如果有多个,选择编号最小的关键点 -// 打印每个关键点所管理的节点数量 +// 查询 k a1 a2 ... ak : 给出了k个不同的管理点,树上每个点都找最近的管理点来管理自己 +// 如果某个节点的最近管理点有多个,选择编号最小的管理点 +// 打印每个管理点,管理的节点数量 // 1 <= n、q <= 3 * 10^5 // 1 <= 所有查询给出的点的总数 <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3233 diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 0fea14df1..3f389fd66 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -3,9 +3,9 @@ // 世界树,C++版 // 一共有n个节点,给定n-1条无向边,所有节点组成一棵树 // 一共有q条查询,每条查询格式如下 -// 查询 k a1 a2 ... ak : 给出了k个不同的关键节点,树上每个点都找最近的关键点来管理自己 -// 最近的关键点如果有多个,选择编号最小的关键点 -// 打印每个关键点所管理的节点数量 +// 查询 k a1 a2 ... ak : 给出了k个不同的管理点,树上每个点都找最近的管理点来管理自己 +// 如果某个节点的最近管理点有多个,选择编号最小的管理点 +// 打印每个管理点,管理的节点数量 // 1 <= n、q <= 3 * 10^5 // 1 <= 所有查询给出的点的总数 <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3233 From c06e440348fa71cabb8f0ee9220cb83997b43c8f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 13:19:17 +0800 Subject: [PATCH 0866/1170] modify code --- src/class180/Code04_WorldTree1.java | 8 ++------ src/class180/Code04_WorldTree2.java | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index 76b336e36..c2420f093 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -157,11 +157,9 @@ public static void dp1(int u) { int v = tov[e]; dp1(v); int w = dep[v] - dep[u]; - if (dist[u] > dist[v] + w) { + if (dist[v] + w < dist[u] || (dist[v] + w == dist[u] && manager[v] < manager[u])) { dist[u] = dist[v] + w; manager[u] = manager[v]; - } else if (dist[u] == dist[v] + w) { - manager[u] = Math.min(manager[u], manager[v]); } } if (isKey[u]) { @@ -175,11 +173,9 @@ public static void dp2(int u) { for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; int w = dep[v] - dep[u]; - if (dist[v] > dist[u] + w) { + if (dist[u] + w < dist[v] || (dist[u] + w == dist[v] && manager[u] < manager[v])) { dist[v] = dist[u] + w; manager[v] = manager[u]; - } else if (dist[v] == dist[u] + w) { - manager[v] = Math.min(manager[v], manager[u]); } dp2(v); } diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 3f389fd66..ac75e1214 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -132,11 +132,9 @@ // int v = tov[e]; // dp1(v); // int w = dep[v] - dep[u]; -// if (dist[u] > dist[v] + w) { +// if (dist[v] + w < dist[u] || (dist[v] + w == dist[u] && manager[v] < manager[u])) { // dist[u] = dist[v] + w; // manager[u] = manager[v]; -// } else if (dist[u] == dist[v] + w) { -// manager[u] = min(manager[u], manager[v]); // } // } // if (isKey[u]) { @@ -149,11 +147,9 @@ // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // int w = dep[v] - dep[u]; -// if (dist[v] > dist[u] + w) { +// if (dist[u] + w < dist[v] || (dist[u] + w == dist[v] && manager[u] < manager[v])) { // dist[v] = dist[u] + w; // manager[v] = manager[u]; -// } else if (dist[v] == dist[u] + w) { -// manager[v] = min(manager[v], manager[u]); // } // dp2(v); // } From 4ca26b13d1b502d6fa6ca70a988e43b59a938a71 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 13:20:48 +0800 Subject: [PATCH 0867/1170] modify code --- src/class180/Code04_WorldTree1.java | 3 +-- src/class180/Code04_WorldTree2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index c2420f093..48875c81e 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -24,7 +24,6 @@ public class Code04_WorldTree1 { public static int MAXN = 300001; public static int MAXP = 20; - public static int INF = 1000000001; public static int n, q, k; public static int[] headg = new int[MAXN]; @@ -152,7 +151,7 @@ public static int buildVirtualTree() { // 下方找最近管理点,节点u根据孩子的管理点,找到离u最近的管理点 public static void dp1(int u) { - dist[u] = INF; + dist[u] = 1000000001; for (int e = headv[u]; e > 0; e = nextv[e]) { int v = tov[e]; dp1(v); diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index ac75e1214..7e6445b12 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -18,7 +18,6 @@ // //const int MAXN = 300001; //const int MAXP = 20; -//const int INF = 1000000001; //int n, q, k; // //int headg[MAXN]; @@ -127,7 +126,7 @@ //} // //void dp1(int u) { -// dist[u] = INF; +// dist[u] = 1000000001; // for (int e = headv[u]; e; e = nextv[e]) { // int v = tov[e]; // dp1(v); From cdc805516f3e5121cfd8b818664376e13c2993f4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 15:12:17 +0800 Subject: [PATCH 0868/1170] modify code --- src/class180/Code04_WorldTree1.java | 15 +++++++++------ src/class180/Code04_WorldTree2.java | 11 +++++++---- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/class180/Code04_WorldTree1.java b/src/class180/Code04_WorldTree1.java index 48875c81e..11938fdc8 100644 --- a/src/class180/Code04_WorldTree1.java +++ b/src/class180/Code04_WorldTree1.java @@ -189,10 +189,13 @@ public static void amend(int u, int v) { } int x = v; for (int p = MAXP - 1; p >= 0; p--) { - int tou = dep[stjump[x][p]] - dep[u] + dist[u]; - int tov = dep[v] - dep[stjump[x][p]] + dist[v]; - if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && manager[v] < manager[u]))) { - x = stjump[x][p]; + int jump = stjump[x][p]; + if (dep[u] < dep[jump]) { + int tou = dep[jump] - dep[u] + dist[u]; + int tov = dep[v] - dep[jump] + dist[v]; + if (tov < tou || (tov == tou && manager[v] < manager[u])) { + x = jump; + } } } int delta = siz[x] - siz[v]; @@ -200,7 +203,7 @@ public static void amend(int u, int v) { ans[manager[v]] += delta; } - // 每个点都有了最近的管理点,更新相关的管理点的计数 + // 每个点都有了最近的管理点,更新相关管理点的管理节点计数 public static void dp3(int u) { // u的管理节点,先获得原树里子树u的所有节点 // 然后经历修正的过程,把管理节点的数量更新正确 @@ -209,7 +212,7 @@ public static void dp3(int u) { int v = tov[e]; // 修正的过程 amend(u, v); - // 马上去往v执行dp3的过程,所以子树v的节点现在扣除 + // 马上要执行dp3(v),所以子树v的节点现在扣除 ans[manager[u]] -= siz[v]; // 子树v怎么分配节点,那是后续dp3(v)的事情 dp3(v); diff --git a/src/class180/Code04_WorldTree2.java b/src/class180/Code04_WorldTree2.java index 7e6445b12..c2ee977d5 100644 --- a/src/class180/Code04_WorldTree2.java +++ b/src/class180/Code04_WorldTree2.java @@ -160,10 +160,13 @@ // } // int x = v; // for (int p = MAXP - 1; p >= 0; p--) { -// int tou = (dep[stjump[x][p]] - dep[u]) + dist[u]; -// int tov = (dep[v] - dep[stjump[x][p]]) + dist[v]; -// if (dep[u] < dep[stjump[x][p]] && (tov < tou || (tov == tou && manager[v] < manager[u]))) { -// x = stjump[x][p]; +// int jump = stjump[x][p]; +// if (dep[u] < dep[jump]) { +// int tou = dep[jump] - dep[u] + dist[u]; +// int tov = dep[v] - dep[jump] + dist[v]; +// if (tov < tou || (tov == tou && manager[v] < manager[u])) { +// x = jump; +// } // } // } // int delta = siz[x] - siz[v]; From e3bdd9ce348ff40ab8c67f1e54fb702d4fd01b39 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 16:55:18 +0800 Subject: [PATCH 0869/1170] modify code --- src/class180/Code05_TreelandAndViruses1.java | 30 ++++++++++---------- src/class180/Code05_TreelandAndViruses2.java | 26 ++++++++--------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/class180/Code05_TreelandAndViruses1.java b/src/class180/Code05_TreelandAndViruses1.java index 8207d084d..f9056068e 100644 --- a/src/class180/Code05_TreelandAndViruses1.java +++ b/src/class180/Code05_TreelandAndViruses1.java @@ -23,14 +23,14 @@ public class Code05_TreelandAndViruses1 { static class Node { - int id, dist, time, source, sourceOrder; + int id, dist, time, source, virus; - Node(int id_, int dist_, int time_, int source_, int sourceOrder_) { + Node(int id_, int dist_, int time_, int source_, int virus_) { id = id_; dist = dist_; time = time_; source = source_; - sourceOrder = sourceOrder_; + virus = virus_; } } @@ -40,7 +40,7 @@ public int compare(Node o1, Node o2) { if (o1.time != o2.time) { return o1.time - o2.time; } - return o1.sourceOrder - o2.sourceOrder; + return o1.virus - o2.virus; } } @@ -66,7 +66,7 @@ public int compare(Node o1, Node o2) { public static int[] start = new int[MAXN]; public static int[] speed = new int[MAXN]; public static int[] query = new int[MAXN]; - public static int[] order = new int[MAXN]; + public static int[] virusId = new int[MAXN]; public static int[] arr = new int[MAXN << 1]; public static int[] tmp = new int[MAXN << 2]; @@ -75,7 +75,7 @@ public int compare(Node o1, Node o2) { public static PriorityQueue heap = new PriorityQueue<>(new NodeCmp()); public static boolean[] vis = new boolean[MAXN]; public static int[] minTime = new int[MAXN]; - public static int[] bestSource = new int[MAXN]; + public static int[] sourceCity = new int[MAXN]; public static int[] ans = new int[MAXN]; @@ -183,21 +183,21 @@ public static void dijkstra() { for (int i = 1; i <= len; i++) { int u = tmp[i]; minTime[u] = n + 1; - bestSource[u] = n + 1; + sourceCity[u] = n + 1; vis[u] = false; } for (int i = 1; i <= k; i++) { int s = start[i]; minTime[s] = 0; - bestSource[s] = s; - heap.add(new Node(s, 0, 0, s, order[s])); + sourceCity[s] = s; + heap.add(new Node(s, 0, 0, s, virusId[s])); } while (!heap.isEmpty()) { Node cur = heap.poll(); int u = cur.id; int udist = cur.dist; int usource = cur.source; - int usourceOrder = cur.sourceOrder; + int uvirus = cur.virus; if (!vis[u]) { vis[u] = true; for (int e = headv[u]; e > 0; e = nextv[e]) { @@ -205,10 +205,10 @@ public static void dijkstra() { if (!vis[v]) { int vdist = udist + Math.abs(dep[u] - dep[v]); int vtime = (vdist + speed[usource] - 1) / speed[usource]; - if (vtime < minTime[v] || (vtime == minTime[v] && usourceOrder < order[bestSource[v]])) { + if (vtime < minTime[v] || (vtime == minTime[v] && uvirus < virusId[sourceCity[v]])) { minTime[v] = vtime; - bestSource[v] = usource; - heap.add(new Node(v, vdist, vtime, usource, usourceOrder)); + sourceCity[v] = usource; + heap.add(new Node(v, vdist, vtime, usource, uvirus)); } } } @@ -218,12 +218,12 @@ public static void dijkstra() { public static void compute() { for (int i = 1; i <= k; i++) { - order[start[i]] = i; + virusId[start[i]] = i; } buildVirtualTree(); dijkstra(); for (int i = 1; i <= m; i++) { - ans[i] = order[bestSource[query[i]]]; + ans[i] = virusId[sourceCity[query[i]]]; } } diff --git a/src/class180/Code05_TreelandAndViruses2.java b/src/class180/Code05_TreelandAndViruses2.java index ea9dadb70..9ae3a3f53 100644 --- a/src/class180/Code05_TreelandAndViruses2.java +++ b/src/class180/Code05_TreelandAndViruses2.java @@ -19,12 +19,12 @@ //using namespace std; // //struct Node { -// int id, dist, time, source, sourceOrder; +// int id, dist, time, source, virus; // bool operator<(const Node &other) const { // if (time != other.time) { // return time > other.time; // } -// return sourceOrder > other.sourceOrder; +// return virus > other.virus; // } //}; // @@ -50,7 +50,7 @@ //int start[MAXN]; //int speed[MAXN]; //int query[MAXN]; -//int order[MAXN]; +//int virusId[MAXN]; // //int arr[MAXN << 1]; //int tmp[MAXN << 2]; @@ -59,7 +59,7 @@ //priority_queue heap; //bool vis[MAXN]; //int minTime[MAXN]; -//int bestSource[MAXN]; +//int sourceCity[MAXN]; //int ans[MAXN]; // //bool cmp(int x, int y) { @@ -152,14 +152,14 @@ // for (int i = 1; i <= len; i++) { // int u = tmp[i]; // minTime[u] = n + 1; -// bestSource[u] = n + 1; +// sourceCity[u] = n + 1; // vis[u] = false; // } // for (int i = 1; i <= k; i++) { // int s = start[i]; // minTime[s] = 0; -// bestSource[s] = s; -// heap.push(Node{s, 0, 0, s, order[s]}); +// sourceCity[s] = s; +// heap.push(Node{s, 0, 0, s, virusId[s]}); // } // while (!heap.empty()) { // Node cur = heap.top(); @@ -167,7 +167,7 @@ // int u = cur.id; // int udist = cur.dist; // int usource = cur.source; -// int usourceOrder = cur.sourceOrder; +// int uvirus = cur.virus; // if (!vis[u]) { // vis[u] = true; // for (int e = headv[u]; e; e = nextv[e]) { @@ -175,10 +175,10 @@ // if (!vis[v]) { // int vdist = udist + abs(dep[u] - dep[v]); // int vtime = (vdist + speed[usource] - 1) / speed[usource]; -// if (vtime < minTime[v] || (vtime == minTime[v] && usourceOrder < order[bestSource[v]])) { +// if (vtime < minTime[v] || (vtime == minTime[v] && uvirus < virusId[sourceCity[v]])) { // minTime[v] = vtime; -// bestSource[v] = usource; -// heap.push(Node{v, vdist, vtime, usource, usourceOrder}); +// sourceCity[v] = usource; +// heap.push(Node{v, vdist, vtime, usource, uvirus}); // } // } // } @@ -188,12 +188,12 @@ // //void compute() { // for (int i = 1; i <= k; i++) { -// order[start[i]] = i; +// virusId[start[i]] = i; // } // buildVirtualTree(); // dijkstra(); // for (int i = 1; i <= m; i++) { -// ans[i] = order[bestSource[query[i]]]; +// ans[i] = virusId[sourceCity[query[i]]]; // } //} // From 632fc7a1f27382eea2a5b81d3687199eabc7b4d1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 17:27:27 +0800 Subject: [PATCH 0870/1170] modify code --- src/class180/Code05_TreelandAndViruses1.java | 33 +++++++------------- src/class180/Code05_TreelandAndViruses2.java | 32 +++++++------------ 2 files changed, 22 insertions(+), 43 deletions(-) diff --git a/src/class180/Code05_TreelandAndViruses1.java b/src/class180/Code05_TreelandAndViruses1.java index f9056068e..4b0c3cffd 100644 --- a/src/class180/Code05_TreelandAndViruses1.java +++ b/src/class180/Code05_TreelandAndViruses1.java @@ -65,8 +65,8 @@ public int compare(Node o1, Node o2) { public static int[] start = new int[MAXN]; public static int[] speed = new int[MAXN]; + public static int[] order = new int[MAXN]; public static int[] query = new int[MAXN]; - public static int[] virusId = new int[MAXN]; public static int[] arr = new int[MAXN << 1]; public static int[] tmp = new int[MAXN << 2]; @@ -75,9 +75,7 @@ public int compare(Node o1, Node o2) { public static PriorityQueue heap = new PriorityQueue<>(new NodeCmp()); public static boolean[] vis = new boolean[MAXN]; public static int[] minTime = new int[MAXN]; - public static int[] sourceCity = new int[MAXN]; - - public static int[] ans = new int[MAXN]; + public static int[] findVirus = new int[MAXN]; public static void addEdgeG(int u, int v) { nextg[++cntg] = headg[u]; @@ -183,14 +181,14 @@ public static void dijkstra() { for (int i = 1; i <= len; i++) { int u = tmp[i]; minTime[u] = n + 1; - sourceCity[u] = n + 1; + findVirus[u] = k + 1; vis[u] = false; } for (int i = 1; i <= k; i++) { int s = start[i]; minTime[s] = 0; - sourceCity[s] = s; - heap.add(new Node(s, 0, 0, s, virusId[s])); + findVirus[s] = order[s]; + heap.add(new Node(s, 0, 0, s, order[s])); } while (!heap.isEmpty()) { Node cur = heap.poll(); @@ -205,9 +203,9 @@ public static void dijkstra() { if (!vis[v]) { int vdist = udist + Math.abs(dep[u] - dep[v]); int vtime = (vdist + speed[usource] - 1) / speed[usource]; - if (vtime < minTime[v] || (vtime == minTime[v] && uvirus < virusId[sourceCity[v]])) { + if (vtime < minTime[v] || (vtime == minTime[v] && uvirus < findVirus[v])) { minTime[v] = vtime; - sourceCity[v] = usource; + findVirus[v] = uvirus; heap.add(new Node(v, vdist, vtime, usource, uvirus)); } } @@ -216,17 +214,6 @@ public static void dijkstra() { } } - public static void compute() { - for (int i = 1; i <= k; i++) { - virusId[start[i]] = i; - } - buildVirtualTree(); - dijkstra(); - for (int i = 1; i <= m; i++) { - ans[i] = virusId[sourceCity[query[i]]]; - } - } - public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); @@ -245,13 +232,15 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= k; i++) { start[i] = in.nextInt(); speed[start[i]] = in.nextInt(); + order[start[i]] = i; } for (int i = 1; i <= m; i++) { query[i] = in.nextInt(); } - compute(); + buildVirtualTree(); + dijkstra(); for (int i = 1; i <= m; i++) { - out.print(ans[i] + " "); + out.print(findVirus[query[i]] + " "); } out.println(); } diff --git a/src/class180/Code05_TreelandAndViruses2.java b/src/class180/Code05_TreelandAndViruses2.java index 9ae3a3f53..1c0c71b47 100644 --- a/src/class180/Code05_TreelandAndViruses2.java +++ b/src/class180/Code05_TreelandAndViruses2.java @@ -49,8 +49,8 @@ // //int start[MAXN]; //int speed[MAXN]; +//int order[MAXN]; //int query[MAXN]; -//int virusId[MAXN]; // //int arr[MAXN << 1]; //int tmp[MAXN << 2]; @@ -59,8 +59,7 @@ //priority_queue heap; //bool vis[MAXN]; //int minTime[MAXN]; -//int sourceCity[MAXN]; -//int ans[MAXN]; +//int findVirus[MAXN]; // //bool cmp(int x, int y) { // return dfn[x] < dfn[y]; @@ -152,14 +151,14 @@ // for (int i = 1; i <= len; i++) { // int u = tmp[i]; // minTime[u] = n + 1; -// sourceCity[u] = n + 1; +// findVirus[u] = k + 1; // vis[u] = false; // } // for (int i = 1; i <= k; i++) { // int s = start[i]; // minTime[s] = 0; -// sourceCity[s] = s; -// heap.push(Node{s, 0, 0, s, virusId[s]}); +// findVirus[s] = order[s]; +// heap.push(Node{s, 0, 0, s, order[s]}); // } // while (!heap.empty()) { // Node cur = heap.top(); @@ -175,9 +174,9 @@ // if (!vis[v]) { // int vdist = udist + abs(dep[u] - dep[v]); // int vtime = (vdist + speed[usource] - 1) / speed[usource]; -// if (vtime < minTime[v] || (vtime == minTime[v] && uvirus < virusId[sourceCity[v]])) { +// if (vtime < minTime[v] || (vtime == minTime[v] && uvirus < findVirus[v])) { // minTime[v] = vtime; -// sourceCity[v] = usource; +// findVirus[v] = uvirus; // heap.push(Node{v, vdist, vtime, usource, uvirus}); // } // } @@ -186,17 +185,6 @@ // } //} // -//void compute() { -// for (int i = 1; i <= k; i++) { -// virusId[start[i]] = i; -// } -// buildVirtualTree(); -// dijkstra(); -// for (int i = 1; i <= m; i++) { -// ans[i] = virusId[sourceCity[query[i]]]; -// } -//} -// //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); @@ -214,13 +202,15 @@ // cin >> s >> v; // start[i] = s; // speed[s] = v; +// order[s] = i; // } // for (int i = 1; i <= m; i++) { // cin >> query[i]; // } -// compute(); +// buildVirtualTree(); +// dijkstra(); // for (int i = 1; i <= m; i++) { -// cout << ans[i] << ' '; +// cout << findVirus[query[i]] << ' '; // } // cout << '\n'; // } From 1ac3a7b373858b426e0e8b33888ec81a47690d02 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 18:03:22 +0800 Subject: [PATCH 0871/1170] modify code --- src/class180/Code05_TreelandAndViruses1.java | 18 +++++++----------- src/class180/Code05_TreelandAndViruses2.java | 17 ++++++----------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/class180/Code05_TreelandAndViruses1.java b/src/class180/Code05_TreelandAndViruses1.java index 4b0c3cffd..3259bc83e 100644 --- a/src/class180/Code05_TreelandAndViruses1.java +++ b/src/class180/Code05_TreelandAndViruses1.java @@ -23,13 +23,12 @@ public class Code05_TreelandAndViruses1 { static class Node { - int id, dist, time, source, virus; + int id, dist, time, virus; - Node(int id_, int dist_, int time_, int source_, int virus_) { + Node(int id_, int dist_, int time_, int virus_) { id = id_; dist = dist_; time = time_; - source = source_; virus = virus_; } } @@ -65,7 +64,6 @@ public int compare(Node o1, Node o2) { public static int[] start = new int[MAXN]; public static int[] speed = new int[MAXN]; - public static int[] order = new int[MAXN]; public static int[] query = new int[MAXN]; public static int[] arr = new int[MAXN << 1]; @@ -187,14 +185,13 @@ public static void dijkstra() { for (int i = 1; i <= k; i++) { int s = start[i]; minTime[s] = 0; - findVirus[s] = order[s]; - heap.add(new Node(s, 0, 0, s, order[s])); + findVirus[s] = i; + heap.add(new Node(s, 0, 0, i)); } while (!heap.isEmpty()) { Node cur = heap.poll(); int u = cur.id; int udist = cur.dist; - int usource = cur.source; int uvirus = cur.virus; if (!vis[u]) { vis[u] = true; @@ -202,11 +199,11 @@ public static void dijkstra() { int v = tov[e]; if (!vis[v]) { int vdist = udist + Math.abs(dep[u] - dep[v]); - int vtime = (vdist + speed[usource] - 1) / speed[usource]; + int vtime = (vdist + speed[uvirus] - 1) / speed[uvirus]; if (vtime < minTime[v] || (vtime == minTime[v] && uvirus < findVirus[v])) { minTime[v] = vtime; findVirus[v] = uvirus; - heap.add(new Node(v, vdist, vtime, usource, uvirus)); + heap.add(new Node(v, vdist, vtime, uvirus)); } } } @@ -231,8 +228,7 @@ public static void main(String[] args) throws Exception { m = in.nextInt(); for (int i = 1; i <= k; i++) { start[i] = in.nextInt(); - speed[start[i]] = in.nextInt(); - order[start[i]] = i; + speed[i] = in.nextInt(); } for (int i = 1; i <= m; i++) { query[i] = in.nextInt(); diff --git a/src/class180/Code05_TreelandAndViruses2.java b/src/class180/Code05_TreelandAndViruses2.java index 1c0c71b47..d300e6626 100644 --- a/src/class180/Code05_TreelandAndViruses2.java +++ b/src/class180/Code05_TreelandAndViruses2.java @@ -19,7 +19,7 @@ //using namespace std; // //struct Node { -// int id, dist, time, source, virus; +// int id, dist, time, virus; // bool operator<(const Node &other) const { // if (time != other.time) { // return time > other.time; @@ -49,7 +49,6 @@ // //int start[MAXN]; //int speed[MAXN]; -//int order[MAXN]; //int query[MAXN]; // //int arr[MAXN << 1]; @@ -157,15 +156,14 @@ // for (int i = 1; i <= k; i++) { // int s = start[i]; // minTime[s] = 0; -// findVirus[s] = order[s]; -// heap.push(Node{s, 0, 0, s, order[s]}); +// findVirus[s] = i; +// heap.push(Node{s, 0, 0, i}); // } // while (!heap.empty()) { // Node cur = heap.top(); // heap.pop(); // int u = cur.id; // int udist = cur.dist; -// int usource = cur.source; // int uvirus = cur.virus; // if (!vis[u]) { // vis[u] = true; @@ -173,11 +171,11 @@ // int v = tov[e]; // if (!vis[v]) { // int vdist = udist + abs(dep[u] - dep[v]); -// int vtime = (vdist + speed[usource] - 1) / speed[usource]; +// int vtime = (vdist + speed[uvirus] - 1) / speed[uvirus]; // if (vtime < minTime[v] || (vtime == minTime[v] && uvirus < findVirus[v])) { // minTime[v] = vtime; // findVirus[v] = uvirus; -// heap.push(Node{v, vdist, vtime, usource, uvirus}); +// heap.push(Node{v, vdist, vtime, uvirus}); // } // } // } @@ -199,10 +197,7 @@ // for (int t = 1; t <= q; t++) { // cin >> k >> m; // for (int i = 1, s, v; i <= k; i++) { -// cin >> s >> v; -// start[i] = s; -// speed[s] = v; -// order[s] = i; +// cin >> start[i] >> speed[i]; // } // for (int i = 1; i <= m; i++) { // cin >> query[i]; From 63e8aaaa0d4aae50b68e30dff9f106e430754797 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 18:57:20 +0800 Subject: [PATCH 0872/1170] modify code --- src/class180/Code06_TreasureHunt1.java | 10 +++++----- src/class180/Code06_TreasureHunt2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class180/Code06_TreasureHunt1.java b/src/class180/Code06_TreasureHunt1.java index 551785654..6ed91a09b 100644 --- a/src/class180/Code06_TreasureHunt1.java +++ b/src/class180/Code06_TreasureHunt1.java @@ -36,7 +36,7 @@ public class Code06_TreasureHunt1 { public static int cntd; public static int[] arr = new int[MAXN]; - public static boolean[] vis = new boolean[MAXN]; + public static boolean[] treasure = new boolean[MAXN]; // 这里为了方便,使用语言自带的有序表 public static TreeSet set = new TreeSet<>(); @@ -145,11 +145,11 @@ public static void compute() { for (int i = 1; i <= m; i++) { int nodeId = arr[i]; int dfnId = dfn[nodeId]; - if (!vis[nodeId]) { - vis[nodeId] = true; + if (!treasure[nodeId]) { + treasure[nodeId] = true; set.add(dfnId); } else { - vis[nodeId] = false; + treasure[nodeId] = false; set.remove(dfnId); } if (set.size() <= 1) { @@ -158,7 +158,7 @@ public static void compute() { int low = seg[set.lower(dfnId) != null ? set.lower(dfnId) : set.last()]; int high = seg[set.higher(dfnId) != null ? set.higher(dfnId) : set.first()]; long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); - if (vis[nodeId]) { + if (treasure[nodeId]) { curAns += delta; } else { curAns -= delta; diff --git a/src/class180/Code06_TreasureHunt2.java b/src/class180/Code06_TreasureHunt2.java index 91bbf5fcc..0841bb8a0 100644 --- a/src/class180/Code06_TreasureHunt2.java +++ b/src/class180/Code06_TreasureHunt2.java @@ -33,7 +33,7 @@ //int cntd; // //int arr[MAXN]; -//bool vis[MAXN]; +//bool treasure[MAXN]; //std::set st; //std::set::iterator it; // @@ -93,11 +93,11 @@ // for (int i = 1; i <= m; i++) { // int nodeId = arr[i]; // int dfnId = dfn[nodeId]; -// if (!vis[nodeId]) { -// vis[nodeId] = true; +// if (!treasure[nodeId]) { +// treasure[nodeId] = true; // st.insert(dfnId); // } else { -// vis[nodeId] = false; +// treasure[nodeId] = false; // st.erase(dfnId); // } // if (st.size() <= 1) { @@ -106,7 +106,7 @@ // int low = seg[(it = st.lower_bound(dfnId)) == st.begin() ? *--st.end() : *--it]; // int high = seg[(it = st.upper_bound(dfnId)) == st.end() ? *st.begin() : *it]; // long long delta = getDist(nodeId, low) + getDist(nodeId, high) - getDist(low, high); -// if (vis[nodeId]) { +// if (treasure[nodeId]) { // curAns += delta; // } else { // curAns -= delta; From d21a7713c2d6b77c5619480bc92c1b70e9608515 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Oct 2025 21:56:52 +0800 Subject: [PATCH 0873/1170] modify code --- src/class180/Code06_TreasureHunt1.java | 8 ++++---- src/class180/Code06_TreasureHunt2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class180/Code06_TreasureHunt1.java b/src/class180/Code06_TreasureHunt1.java index 6ed91a09b..c786425ff 100644 --- a/src/class180/Code06_TreasureHunt1.java +++ b/src/class180/Code06_TreasureHunt1.java @@ -2,10 +2,10 @@ // 寻宝游戏,java版 // 一共有n个节点,给定n-1条无向边,每条边有边权,所有节点组成一棵树 -// 一开始所有的节点都没有宝物,接下来有m条操作,每条操作格式如下 -// 操作 x : 如果x号点上无宝物,那么变成有宝物,如果x号点上有宝物,那么变成无宝物 -// 每次操作后,树上会形成新的宝物分布,所以每次你都可以选择任何点作为出发点 -// 目标是拿完当前状况下的所有宝物,最后回到出发点,打印最小的总路程,一共有m条打印 +// 开始时所有节点都是无宝点,接下来有m条操作,每条操作格式如下 +// 操作 x : 如果x号点是无宝点,那么变成有宝点,如果x号点是有宝点,那么变成无宝点 +// 每次操作后,每个有宝点都会刷新宝物,你可以瞬移到任何地点作为出发点,瞬移无代价 +// 然后你需要走路去拿所有的宝物,最后回到出发点,打印最小的行走总路程,一共m条打印 // 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3320 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class180/Code06_TreasureHunt2.java b/src/class180/Code06_TreasureHunt2.java index 0841bb8a0..16165bb46 100644 --- a/src/class180/Code06_TreasureHunt2.java +++ b/src/class180/Code06_TreasureHunt2.java @@ -2,10 +2,10 @@ // 寻宝游戏,C++版 // 一共有n个节点,给定n-1条无向边,每条边有边权,所有节点组成一棵树 -// 一开始所有的节点都没有宝物,接下来有m条操作,每条操作格式如下 -// 操作 x : 如果x号点上无宝物,那么变成有宝物,如果x号点上有宝物,那么变成无宝物 -// 每次操作后,树上会形成新的宝物分布,所以每次你都可以选择任何点作为出发点 -// 目标是拿完当前状况下的所有宝物,最后回到出发点,打印最小的总路程,一共有m条打印 +// 开始时所有节点都是无宝点,接下来有m条操作,每条操作格式如下 +// 操作 x : 如果x号点是无宝点,那么变成有宝点,如果x号点是有宝点,那么变成无宝点 +// 每次操作后,每个有宝点都会刷新宝物,你可以瞬移到任何地点作为出发点,瞬移无代价 +// 然后你需要走路去拿所有的宝物,最后回到出发点,打印最小的行走总路程,一共m条打印 // 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3320 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 802d1da3451e891acc5f8e5acc78b51a49899b51 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Oct 2025 10:23:53 +0800 Subject: [PATCH 0874/1170] modify code --- src/class180/Code06_TreasureHunt1.java | 13 +++++++------ src/class180/Code06_TreasureHunt2.java | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/class180/Code06_TreasureHunt1.java b/src/class180/Code06_TreasureHunt1.java index c786425ff..d510b0693 100644 --- a/src/class180/Code06_TreasureHunt1.java +++ b/src/class180/Code06_TreasureHunt1.java @@ -1,11 +1,12 @@ package class180; // 寻宝游戏,java版 -// 一共有n个节点,给定n-1条无向边,每条边有边权,所有节点组成一棵树 -// 开始时所有节点都是无宝点,接下来有m条操作,每条操作格式如下 -// 操作 x : 如果x号点是无宝点,那么变成有宝点,如果x号点是有宝点,那么变成无宝点 -// 每次操作后,每个有宝点都会刷新宝物,你可以瞬移到任何地点作为出发点,瞬移无代价 -// 然后你需要走路去拿所有的宝物,最后回到出发点,打印最小的行走总路程,一共m条打印 +// 一共有n个节点,节点有两种类型,刷宝的点 和 不刷宝的点 +// 一共有n-1条无向边,每条边有边权,所有节点组成一棵树 +// 开始时所有节点都是不刷宝的点,接下来有m条操作,格式如下 +// 操作 x : x号点的类型翻转,刷宝的点 变成 不刷宝的点,不刷宝的点 变成 刷宝的点 +// 一次操作后,每个刷宝的点都会产生宝物,你可以瞬移到任何点作为出发点,瞬移是无代价的 +// 你需要走路拿到所有的宝物,最后回到出发点,打印最小的行走总路程,一共有m条打印 // 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3320 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -29,9 +30,9 @@ public class Code06_TreasureHunt1 { public static int cntg; public static int[] dep = new int[MAXN]; + public static long[] dist = new long[MAXN]; public static int[] dfn = new int[MAXN]; public static int[] seg = new int[MAXN]; - public static long[] dist = new long[MAXN]; public static int[][] stjump = new int[MAXN][MAXP]; public static int cntd; diff --git a/src/class180/Code06_TreasureHunt2.java b/src/class180/Code06_TreasureHunt2.java index 16165bb46..6781fde1a 100644 --- a/src/class180/Code06_TreasureHunt2.java +++ b/src/class180/Code06_TreasureHunt2.java @@ -1,11 +1,12 @@ package class180; // 寻宝游戏,C++版 -// 一共有n个节点,给定n-1条无向边,每条边有边权,所有节点组成一棵树 -// 开始时所有节点都是无宝点,接下来有m条操作,每条操作格式如下 -// 操作 x : 如果x号点是无宝点,那么变成有宝点,如果x号点是有宝点,那么变成无宝点 -// 每次操作后,每个有宝点都会刷新宝物,你可以瞬移到任何地点作为出发点,瞬移无代价 -// 然后你需要走路去拿所有的宝物,最后回到出发点,打印最小的行走总路程,一共m条打印 +// 一共有n个节点,节点有两种类型,刷宝的点 和 不刷宝的点 +// 一共有n-1条无向边,每条边有边权,所有节点组成一棵树 +// 开始时所有节点都是不刷宝的点,接下来有m条操作,格式如下 +// 操作 x : x号点的类型翻转,刷宝的点 变成 不刷宝的点,不刷宝的点 变成 刷宝的点 +// 一次操作后,每个刷宝的点都会产生宝物,你可以瞬移到任何点作为出发点,瞬移是无代价的 +// 你需要走路拿到所有的宝物,最后回到出发点,打印最小的行走总路程,一共有m条打印 // 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3320 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -26,9 +27,9 @@ //int cntg; // //int dep[MAXN]; +//long long dist[MAXN]; //int dfn[MAXN]; //int seg[MAXN]; -//long long dist[MAXN]; //int stjump[MAXN][MAXP]; //int cntd; // From fac5642e6fadecf0f4590bdeaf51488ba3a12e42 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Oct 2025 12:06:51 +0800 Subject: [PATCH 0875/1170] modify code --- ...70\345\205\263\351\242\230\347\233\256.pptx" | Bin 0 -> 52151 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243180\343\200\220\346\214\272\351\232\276\343\200\221\350\231\232\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243180\343\200\220\346\214\272\351\232\276\343\200\221\350\231\232\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243180\343\200\220\346\214\272\351\232\276\343\200\221\350\231\232\346\240\221\347\232\204\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..2664c00f8c87eab92a67153481687309d16e2b08 GIT binary patch literal 52151 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 Date: Fri, 17 Oct 2025 13:35:20 +0800 Subject: [PATCH 0876/1170] modify code --- src/class181/Code01_PromotionCounting1.java | 255 ++++++++++++++++++++ src/class181/Code01_PromotionCounting2.java | 162 +++++++++++++ 2 files changed, 417 insertions(+) create mode 100644 src/class181/Code01_PromotionCounting1.java create mode 100644 src/class181/Code01_PromotionCounting2.java diff --git a/src/class181/Code01_PromotionCounting1.java b/src/class181/Code01_PromotionCounting1.java new file mode 100644 index 000000000..3e1313639 --- /dev/null +++ b/src/class181/Code01_PromotionCounting1.java @@ -0,0 +1,255 @@ +package class181; + +// 晋升者计数,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3605 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code01_PromotionCounting1 { + + public static int MAXN = 100001; + public static int MAXT = MAXN * 40; + public static int n; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static int[] arr = new int[MAXN]; + public static int[] sorted = new int[MAXN]; + public static int cntv; + + public static int[] root = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] siz = new int[MAXT]; + public static int cntt; + + public static int[] ans = new int[MAXN]; + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static void up(int i) { + siz[i] = siz[ls[i]] + siz[rs[i]]; + } + + public static int insert(int jobi, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = ++cntt; + } + if (l == r) { + siz[rt]++; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + ls[rt] = insert(jobi, l, mid, ls[rt]); + } else { + rs[rt] = insert(jobi, mid + 1, r, rs[rt]); + } + up(rt); + } + return rt; + } + + public static int merge(int l, int r, int t1, int t2) { + if (t1 == 0 || t2 == 0) { + return t1 + t2; + } + if (l == r) { + siz[t1] += siz[t2]; + } else { + int mid = (l + r) / 2; + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + up(t1); + } + return t1; + } + + public static int query(int jobl, int jobr, int l, int r, int i) { + if (jobl > jobr || i == 0) { + return 0; + } + if (jobl <= l && r <= jobr) { + return siz[i]; + } + int mid = (l + r) / 2; + int ret = 0; + if (jobl <= mid) { + ret += query(jobl, jobr, l, mid, ls[i]); + } + if (jobr > mid) { + ret += query(jobl, jobr, mid + 1, r, rs[i]); + } + return ret; + } + + // 递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa) { + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + dfs1(v, u); + } + } + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + root[u] = merge(1, cntv, root[u], root[v]); + } + } + ans[u] = query(arr[u] + 1, cntv, 1, cntv, root[u]); + } + + public static int[][] ufe = new int[MAXN][3]; + + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + // dfs1改的迭代版 + public static void dfs2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f) { + root[u] = merge(1, cntv, root[u], root[v]); + } + } + ans[u] = query(arr[u] + 1, cntv, 1, cntv, root[u]); + } + } + } + + public static void compute() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + cntv = 1; + for (int i = 2; i <= n; i++) { + if (sorted[cntv] != sorted[i]) { + sorted[++cntv] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = kth(arr[i]); + } + for (int i = 1; i <= n; i++) { + root[i] = insert(arr[i], 1, cntv, root[i]); + } + // dfs1(1, 0); + dfs2(); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 2, fa; i <= n; i++) { + fa = in.nextInt(); + addEdge(fa, i); + addEdge(i, fa); + } + compute(); + for (int i = 1; i <= n; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class181/Code01_PromotionCounting2.java b/src/class181/Code01_PromotionCounting2.java new file mode 100644 index 000000000..9f0322682 --- /dev/null +++ b/src/class181/Code01_PromotionCounting2.java @@ -0,0 +1,162 @@ +package class181; + +// 晋升者计数,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3605 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXT = MAXN * 40; +//int n; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int arr[MAXN]; +//int sorted[MAXN]; +//int cntv; +// +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int siz[MAXT]; +//int cntt; +// +//int ans[MAXN]; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//int kth(int num) { +// int left = 1, right = cntv, ret = 0; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//void up(int i) { +// siz[i] = siz[ls[i]] + siz[rs[i]]; +//} +// +//int insert(int jobi, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = ++cntt; +// } +// if (l == r) { +// siz[rt]++; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = insert(jobi, l, mid, ls[rt]); +// } else { +// rs[rt] = insert(jobi, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//int merge(int l, int r, int t1, int t2) { +// if (t1 == 0 || t2 == 0) { +// return t1 + t2; +// } +// if (l == r) { +// siz[t1] += siz[t2]; +// } else { +// int mid = (l + r) >> 1; +// ls[t1] = merge(l, mid, ls[t1], ls[t2]); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); +// up(t1); +// } +// return t1; +//} +// +//int query(int jobl, int jobr, int l, int r, int i) { +// if (jobl > jobr || i == 0) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return siz[i]; +// } +// int mid = (l + r) >> 1; +// int ret = 0; +// if (jobl <= mid) { +// ret += query(jobl, jobr, l, mid, ls[i]); +// } +// if (jobr > mid) { +// ret += query(jobl, jobr, mid + 1, r, rs[i]); +// } +// return ret; +//} +// +//void dfs(int u, int fa) { +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// dfs(v, u); +// } +// } +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// root[u] = merge(1, cntv, root[u], root[v]); +// } +// } +// ans[u] = query(arr[u] + 1, cntv, 1, cntv, root[u]); +//} +// +//void compute() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = arr[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// cntv = 1; +// for (int i = 2; i <= n; i++) { +// if (sorted[cntv] != sorted[i]) { +// sorted[++cntv] = sorted[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(arr[i]); +// } +// for (int i = 1; i <= n; i++) { +// root[i] = insert(arr[i], 1, cntv, root[i]); +// } +// dfs(1, 0); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 2, fa; i <= n; i++) { +// cin >> fa; +// addEdge(fa, i); +// addEdge(i, fa); +// } +// compute(); +// for (int i = 1; i <= n; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 9ab33e1b918fd06e2cb2f9487b83cf3e004e46b0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 17 Oct 2025 13:37:34 +0800 Subject: [PATCH 0877/1170] modify code --- src/class181/Code01_PromotionCounting1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class181/Code01_PromotionCounting1.java b/src/class181/Code01_PromotionCounting1.java index 3e1313639..94d26cc2d 100644 --- a/src/class181/Code01_PromotionCounting1.java +++ b/src/class181/Code01_PromotionCounting1.java @@ -109,7 +109,7 @@ public static int query(int jobl, int jobr, int l, int r, int i) { return ret; } - // 递归版,java会爆栈,C++可以通过 + // dfs递归版,java会爆栈,C++可以通过 public static void dfs1(int u, int fa) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -144,7 +144,7 @@ public static void pop() { e = ufe[stacksize][2]; } - // dfs1改的迭代版 + // dfs1改迭代 public static void dfs2() { stacksize = 0; push(1, 0, -1); From eb58c9ea0703e37f69c9a13dec4c09fead9e6cd6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 17 Oct 2025 17:44:32 +0800 Subject: [PATCH 0878/1170] modify code --- src/class181/Code01_PromotionCounting1.java | 8 +- src/class181/Code01_PromotionCounting2.java | 8 +- src/class181/Code02_TailOfRainyDay1.java | 302 ++++++++++++++++++++ 3 files changed, 310 insertions(+), 8 deletions(-) create mode 100644 src/class181/Code02_TailOfRainyDay1.java diff --git a/src/class181/Code01_PromotionCounting1.java b/src/class181/Code01_PromotionCounting1.java index 94d26cc2d..9324ad95d 100644 --- a/src/class181/Code01_PromotionCounting1.java +++ b/src/class181/Code01_PromotionCounting1.java @@ -57,7 +57,7 @@ public static void up(int i) { siz[i] = siz[ls[i]] + siz[rs[i]]; } - public static int insert(int jobi, int l, int r, int i) { + public static int add(int jobi, int l, int r, int i) { int rt = i; if (rt == 0) { rt = ++cntt; @@ -67,9 +67,9 @@ public static int insert(int jobi, int l, int r, int i) { } else { int mid = (l + r) / 2; if (jobi <= mid) { - ls[rt] = insert(jobi, l, mid, ls[rt]); + ls[rt] = add(jobi, l, mid, ls[rt]); } else { - rs[rt] = insert(jobi, mid + 1, r, rs[rt]); + rs[rt] = add(jobi, mid + 1, r, rs[rt]); } up(rt); } @@ -187,7 +187,7 @@ public static void compute() { arr[i] = kth(arr[i]); } for (int i = 1; i <= n; i++) { - root[i] = insert(arr[i], 1, cntv, root[i]); + root[i] = add(arr[i], 1, cntv, root[i]); } // dfs1(1, 0); dfs2(); diff --git a/src/class181/Code01_PromotionCounting2.java b/src/class181/Code01_PromotionCounting2.java index 9f0322682..d6e185c1b 100644 --- a/src/class181/Code01_PromotionCounting2.java +++ b/src/class181/Code01_PromotionCounting2.java @@ -54,7 +54,7 @@ // siz[i] = siz[ls[i]] + siz[rs[i]]; //} // -//int insert(int jobi, int l, int r, int i) { +//int add(int jobi, int l, int r, int i) { // int rt = i; // if (rt == 0) { // rt = ++cntt; @@ -64,9 +64,9 @@ // } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { -// ls[rt] = insert(jobi, l, mid, ls[rt]); +// ls[rt] = add(jobi, l, mid, ls[rt]); // } else { -// rs[rt] = insert(jobi, mid + 1, r, rs[rt]); +// rs[rt] = add(jobi, mid + 1, r, rs[rt]); // } // up(rt); // } @@ -137,7 +137,7 @@ // arr[i] = kth(arr[i]); // } // for (int i = 1; i <= n; i++) { -// root[i] = insert(arr[i], 1, cntv, root[i]); +// root[i] = add(arr[i], 1, cntv, root[i]); // } // dfs(1, 0); //} diff --git a/src/class181/Code02_TailOfRainyDay1.java b/src/class181/Code02_TailOfRainyDay1.java new file mode 100644 index 000000000..87f7b9172 --- /dev/null +++ b/src/class181/Code02_TailOfRainyDay1.java @@ -0,0 +1,302 @@ +package class181; + +// 雨天的尾巴,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4556 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code02_TailOfRainyDay1 { + + public static int MAXN = 100001; + public static int MAXV = 100000; + public static int MAXT = MAXN * 80; + public static int MAXP = 20; + public static int n, m; + public static int[][] query = new int[MAXN][3]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static int[] dep = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + + public static int[] root = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] maxCnt = new int[MAXT]; + public static int cntt; + + public static int[] ans = new int[MAXN]; + + // 递归改迭代需要 + public static int[][] ufe = new int[MAXN][3]; + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void dfs1(int u, int fa) { + dep[u] = dep[fa] + 1; + stjump[u][0] = fa; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + dfs1(v, u); + } + } + } + + // dfs1改迭代 + public static void dfs2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dep[u] = dep[f] + 1; + stjump[u][0] = f; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static void up(int i) { + maxCnt[i] = Math.max(maxCnt[ls[i]], maxCnt[rs[i]]); + } + + public static int add(int jobi, int jobv, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = ++cntt; + } + if (l == r) { + maxCnt[rt] += jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + ls[rt] = add(jobi, jobv, l, mid, ls[rt]); + } else { + rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); + } + up(rt); + } + return rt; + } + + public static int merge(int l, int r, int t1, int t2) { + if (t1 == 0 || t2 == 0) { + return t1 + t2; + } + if (l == r) { + maxCnt[t1] += maxCnt[t2]; + } else { + int mid = (l + r) / 2; + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + up(t1); + } + return t1; + } + + public static int query(int l, int r, int i) { + if (l == r) { + return l; + } + int mid = (l + r) / 2; + if (maxCnt[i] == maxCnt[ls[i]]) { + return query(l, mid, ls[i]); + } else { + return query(mid + 1, r, rs[i]); + } + } + + public static void calc1(int u, int fa) { + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + calc1(v, u); + } + } + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != fa) { + root[u] = merge(1, MAXV, root[u], root[v]); + } + } + if (maxCnt[root[u]] > 0) { + ans[u] = query(1, MAXV, root[u]); + } + } + + // calc1改迭代 + public static void calc2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f) { + root[u] = merge(1, MAXV, root[u], root[v]); + } + } + if (maxCnt[root[u]] > 0) { + ans[u] = query(1, MAXV, root[u]); + } + } + } + } + + public static void compute() { + // dfs1(1, 0); + dfs2(); + for (int i = 1; i <= m; i++) { + int x = query[i][0]; + int y = query[i][1]; + int food = query[i][2]; + int lca = getLca(x, y); + int lcafa = stjump[lca][0]; + root[x] = add(food, 1, 1, MAXV, root[x]); + root[y] = add(food, 1, 1, MAXV, root[y]); + root[lca] = add(food, -1, 1, MAXV, root[lca]); + root[lcafa] = add(food, -1, 1, MAXV, root[lcafa]); + } + // calc1(1, 0); + calc2(); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + query[i][2] = in.nextInt(); + } + compute(); + for (int i = 1; i <= n; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 3334becf3bbaf09a8d007c6d3cfa51e003c1a1ec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 17 Oct 2025 22:38:32 +0800 Subject: [PATCH 0879/1170] modify code --- .../{Code02_TailOfRainyDay1.java => Code02_RainDayTail1.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/class181/{Code02_TailOfRainyDay1.java => Code02_RainDayTail1.java} (98%) diff --git a/src/class181/Code02_TailOfRainyDay1.java b/src/class181/Code02_RainDayTail1.java similarity index 98% rename from src/class181/Code02_TailOfRainyDay1.java rename to src/class181/Code02_RainDayTail1.java index 87f7b9172..10f7b1681 100644 --- a/src/class181/Code02_TailOfRainyDay1.java +++ b/src/class181/Code02_RainDayTail1.java @@ -9,11 +9,11 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_TailOfRainyDay1 { +public class Code02_RainDayTail1 { public static int MAXN = 100001; public static int MAXV = 100000; - public static int MAXT = MAXN * 80; + public static int MAXT = MAXN * 50; public static int MAXP = 20; public static int n, m; public static int[][] query = new int[MAXN][3]; From 86ffcb36e4e7cd38f91a67d2f9ca619cbe3fba27 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Oct 2025 14:49:08 +0800 Subject: [PATCH 0880/1170] modify code --- .../{Code02_RainDayTail1.java => Code02_RainyDayTail1.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/class181/{Code02_RainDayTail1.java => Code02_RainyDayTail1.java} (99%) diff --git a/src/class181/Code02_RainDayTail1.java b/src/class181/Code02_RainyDayTail1.java similarity index 99% rename from src/class181/Code02_RainDayTail1.java rename to src/class181/Code02_RainyDayTail1.java index 10f7b1681..0b9c4fe05 100644 --- a/src/class181/Code02_RainDayTail1.java +++ b/src/class181/Code02_RainyDayTail1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_RainDayTail1 { +public class Code02_RainyDayTail1 { public static int MAXN = 100001; public static int MAXV = 100000; From 1afa50acf0ebedbddc2743be1ec42aa4e705b0bd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Oct 2025 15:37:58 +0800 Subject: [PATCH 0881/1170] modify code --- src/class181/Code01_PromotionCounting1.java | 22 +- src/class181/Code01_PromotionCounting2.java | 6 +- src/class181/Code02_RainyDayTail1.java | 8 +- src/class181/Code03_LoveRunning1.java | 308 ++++++++++++++++++++ 4 files changed, 327 insertions(+), 17 deletions(-) create mode 100644 src/class181/Code03_LoveRunning1.java diff --git a/src/class181/Code01_PromotionCounting1.java b/src/class181/Code01_PromotionCounting1.java index 9324ad95d..bf8c5d47e 100644 --- a/src/class181/Code01_PromotionCounting1.java +++ b/src/class181/Code01_PromotionCounting1.java @@ -42,7 +42,7 @@ public static void addEdge(int u, int v) { public static int kth(int num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; @@ -65,7 +65,7 @@ public static int add(int jobi, int l, int r, int i) { if (l == r) { siz[rt]++; } else { - int mid = (l + r) / 2; + int mid = (l + r) >> 1; if (jobi <= mid) { ls[rt] = add(jobi, l, mid, ls[rt]); } else { @@ -83,7 +83,7 @@ public static int merge(int l, int r, int t1, int t2) { if (l == r) { siz[t1] += siz[t2]; } else { - int mid = (l + r) / 2; + int mid = (l + r) >> 1; ls[t1] = merge(l, mid, ls[t1], ls[t2]); rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); up(t1); @@ -98,7 +98,7 @@ public static int query(int jobl, int jobr, int l, int r, int i) { if (jobl <= l && r <= jobr) { return siz[i]; } - int mid = (l + r) / 2; + int mid = (l + r) >> 1; int ret = 0; if (jobl <= mid) { ret += query(jobl, jobr, l, mid, ls[i]); @@ -109,12 +109,12 @@ public static int query(int jobl, int jobr, int l, int r, int i) { return ret; } - // dfs递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa) { + // 递归版,java会爆栈,C++可以通过 + public static void calc1(int u, int fa) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa) { - dfs1(v, u); + calc1(v, u); } } for (int e = head[u]; e > 0; e = nxt[e]) { @@ -144,8 +144,8 @@ public static void pop() { e = ufe[stacksize][2]; } - // dfs1改迭代 - public static void dfs2() { + // calc1改迭代 + public static void calc2() { stacksize = 0; push(1, 0, -1); while (stacksize > 0) { @@ -189,8 +189,8 @@ public static void compute() { for (int i = 1; i <= n; i++) { root[i] = add(arr[i], 1, cntv, root[i]); } - // dfs1(1, 0); - dfs2(); + // calc1(1, 0); + calc2(); } public static void main(String[] args) throws Exception { diff --git a/src/class181/Code01_PromotionCounting2.java b/src/class181/Code01_PromotionCounting2.java index d6e185c1b..ce63ac8b9 100644 --- a/src/class181/Code01_PromotionCounting2.java +++ b/src/class181/Code01_PromotionCounting2.java @@ -106,11 +106,11 @@ // return ret; //} // -//void dfs(int u, int fa) { +//void calc(int u, int fa) { // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa) { -// dfs(v, u); +// calc(v, u); // } // } // for (int e = head[u]; e; e = nxt[e]) { @@ -139,7 +139,7 @@ // for (int i = 1; i <= n; i++) { // root[i] = add(arr[i], 1, cntv, root[i]); // } -// dfs(1, 0); +// calc(1, 0); //} // //int main() { diff --git a/src/class181/Code02_RainyDayTail1.java b/src/class181/Code02_RainyDayTail1.java index 0b9c4fe05..9b9052aea 100644 --- a/src/class181/Code02_RainyDayTail1.java +++ b/src/class181/Code02_RainyDayTail1.java @@ -58,6 +58,7 @@ public static void addEdge(int u, int v) { head[u] = cntg; } + // 递归版,java会爆栈,C++可以通过 public static void dfs1(int u, int fa) { dep[u] = dep[fa] + 1; stjump[u][0] = fa; @@ -132,7 +133,7 @@ public static int add(int jobi, int jobv, int l, int r, int i) { if (l == r) { maxCnt[rt] += jobv; } else { - int mid = (l + r) / 2; + int mid = (l + r) >> 1; if (jobi <= mid) { ls[rt] = add(jobi, jobv, l, mid, ls[rt]); } else { @@ -150,7 +151,7 @@ public static int merge(int l, int r, int t1, int t2) { if (l == r) { maxCnt[t1] += maxCnt[t2]; } else { - int mid = (l + r) / 2; + int mid = (l + r) >> 1; ls[t1] = merge(l, mid, ls[t1], ls[t2]); rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); up(t1); @@ -162,7 +163,7 @@ public static int query(int l, int r, int i) { if (l == r) { return l; } - int mid = (l + r) / 2; + int mid = (l + r) >> 1; if (maxCnt[i] == maxCnt[ls[i]]) { return query(l, mid, ls[i]); } else { @@ -170,6 +171,7 @@ public static int query(int l, int r, int i) { } } + // 递归版,java会爆栈,C++可以通过 public static void calc1(int u, int fa) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; diff --git a/src/class181/Code03_LoveRunning1.java b/src/class181/Code03_LoveRunning1.java new file mode 100644 index 000000000..e5c8d5df6 --- /dev/null +++ b/src/class181/Code03_LoveRunning1.java @@ -0,0 +1,308 @@ +package class181; + +// 天天爱跑步,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1600 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code03_LoveRunning1 { + + public static int MAXN = 300001; + public static int MAXT = MAXN * 50; + public static int MAXP = 20; + public static int n, m; + public static int[] arr = new int[MAXN]; + public static int[][] query = new int[MAXN][2]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static int[] dep = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXP]; + + public static int[] rootl = new int[MAXN]; + public static int[] rootr = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] sum = new int[MAXT]; + public static int cntt; + + public static int[] ans = new int[MAXN]; + + // 递归改迭代需要 + public static int[][] ufe = new int[MAXN][3]; + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + // 递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa) { + dep[u] = dep[fa] + 1; + stjump[u][0] = fa; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + dfs1(v, u); + } + } + } + + // dfs1改迭代 + public static void dfs2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dep[u] = dep[f] + 1; + stjump[u][0] = f; + for (int p = 1; p < MAXP; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXP - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static void up(int i) { + sum[i] = sum[ls[i]] + sum[rs[i]]; + } + + public static int add(int jobi, int jobv, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = ++cntt; + } + if (l == r) { + sum[rt] += jobv; + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = add(jobi, jobv, l, mid, ls[rt]); + } else { + rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); + } + up(rt); + } + return rt; + } + + public static int merge(int l, int r, int t1, int t2) { + if (t1 == 0 || t2 == 0) { + return t1 + t2; + } + if (l == r) { + sum[t1] += sum[t2]; + } else { + int mid = (l + r) >> 1; + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + up(t1); + } + return t1; + } + + public static int query(int jobi, int l, int r, int i) { + if (jobi < l || jobi > r || i == 0) { + return 0; + } + if (l == r) { + return sum[i]; + } + int mid = (l + r) >> 1; + if (jobi <= mid) { + return query(jobi, l, mid, ls[i]); + } else { + return query(jobi, mid + 1, r, rs[i]); + } + } + + // 递归版,java会爆栈,C++可以通过 + public static void calc1(int u, int fa) { + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + calc1(v, u); + } + } + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != fa) { + rootl[u] = merge(1, n, rootl[u], rootl[v]); + rootr[u] = merge(-n, n, rootr[u], rootr[v]); + } + } + ans[u] = query(dep[u] + arr[u], 1, n, rootl[u]) + query(dep[u] - arr[u], -n, n, rootr[u]); + } + + // calc1改迭代 + public static void calc2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f) { + rootl[u] = merge(1, n, rootl[u], rootl[v]); + rootr[u] = merge(-n, n, rootr[u], rootr[v]); + } + } + ans[u] = query(dep[u] + arr[u], 1, n, rootl[u]) + query(dep[u] - arr[u], -n, n, rootr[u]); + } + } + } + + public static void compute() { + // dfs1(1, 0); + dfs2(); + for (int i = 1; i <= m; i++) { + int x = query[i][0]; + int y = query[i][1]; + int lca = getLca(x, y); + int lcafa = stjump[lca][0]; + rootl[x] = add(dep[x], 1, 1, n, rootl[x]); + rootl[lca] = add(dep[x], -1, 1, n, rootl[lca]); + rootr[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rootr[y]); + rootr[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rootr[lcafa]); + } + // calc1(1, 0); + calc2(); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + query[i][0] = in.nextInt(); + query[i][1] = in.nextInt(); + } + compute(); + for (int i = 1; i <= n; i++) { + out.print(ans[i] + " "); + } + out.println(); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 5dafcdbb3645efc4fe6b6c5e013374fc4cd66cef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Oct 2025 15:55:25 +0800 Subject: [PATCH 0882/1170] modify code --- src/class176/Code04_BloodyString1.java | 2 +- src/class176/Code08_MachineLearning1.java | 2 +- src/class177/Code01_MoAddUndo1.java | 2 +- src/class177/Code02_ThresholdMajority1.java | 2 +- src/class177/Code03_SameNumberMaxDist1.java | 2 +- src/class177/Code04_ZeroQuery1.java | 2 +- src/class177/Code07_MoOnTree1.java | 2 +- src/class177/Code07_MoOnTree2.java | 2 +- src/class178/Code02_OfflineInversion1.java | 2 +- src/class179/Code03_LCP1.java | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class176/Code04_BloodyString1.java b/src/class176/Code04_BloodyString1.java index 77e842ffb..ebc8d6044 100644 --- a/src/class176/Code04_BloodyString1.java +++ b/src/class176/Code04_BloodyString1.java @@ -48,7 +48,7 @@ public int compare(int[] a, int[] b) { public static int kth(int len, int num) { int left = 1, right = len, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; diff --git a/src/class176/Code08_MachineLearning1.java b/src/class176/Code08_MachineLearning1.java index dde8f622f..0f24823c4 100644 --- a/src/class176/Code08_MachineLearning1.java +++ b/src/class176/Code08_MachineLearning1.java @@ -53,7 +53,7 @@ public int compare(int[] a, int[] b) { public static int kth(int len, int num) { int left = 1, right = len, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; diff --git a/src/class177/Code01_MoAddUndo1.java b/src/class177/Code01_MoAddUndo1.java index 30bdb5a71..51984ed57 100644 --- a/src/class177/Code01_MoAddUndo1.java +++ b/src/class177/Code01_MoAddUndo1.java @@ -56,7 +56,7 @@ public int compare(int[] a, int[] b) { public static int kth(int num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; diff --git a/src/class177/Code02_ThresholdMajority1.java b/src/class177/Code02_ThresholdMajority1.java index e6d3a1bd9..c0bddda48 100644 --- a/src/class177/Code02_ThresholdMajority1.java +++ b/src/class177/Code02_ThresholdMajority1.java @@ -51,7 +51,7 @@ public int compare(int[] a, int[] b) { public static int kth(int num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; diff --git a/src/class177/Code03_SameNumberMaxDist1.java b/src/class177/Code03_SameNumberMaxDist1.java index a28a9afbb..b39f0c71d 100644 --- a/src/class177/Code03_SameNumberMaxDist1.java +++ b/src/class177/Code03_SameNumberMaxDist1.java @@ -54,7 +54,7 @@ public int compare(int[] a, int[] b) { public static int kth(int num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; diff --git a/src/class177/Code04_ZeroQuery1.java b/src/class177/Code04_ZeroQuery1.java index 88c31b2f8..ed2d5a4a9 100644 --- a/src/class177/Code04_ZeroQuery1.java +++ b/src/class177/Code04_ZeroQuery1.java @@ -50,7 +50,7 @@ public int compare(int[] a, int[] b) { public static int kth(int num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; diff --git a/src/class177/Code07_MoOnTree1.java b/src/class177/Code07_MoOnTree1.java index 0533df402..095b90b32 100644 --- a/src/class177/Code07_MoOnTree1.java +++ b/src/class177/Code07_MoOnTree1.java @@ -73,7 +73,7 @@ public static void addEdge(int u, int v) { public static int kth(int num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; diff --git a/src/class177/Code07_MoOnTree2.java b/src/class177/Code07_MoOnTree2.java index 31201b655..c4e515538 100644 --- a/src/class177/Code07_MoOnTree2.java +++ b/src/class177/Code07_MoOnTree2.java @@ -59,7 +59,7 @@ //int kth(int num) { // int left = 1, right = cntv, mid, ret = 0; // while (left <= right) { -// mid = (left + right) / 2; +// mid = (left + right) >> 1; // if (sorted[mid] <= num) { // ret = mid; // left = mid + 1; diff --git a/src/class178/Code02_OfflineInversion1.java b/src/class178/Code02_OfflineInversion1.java index 2b660f744..d032bdcd3 100644 --- a/src/class178/Code02_OfflineInversion1.java +++ b/src/class178/Code02_OfflineInversion1.java @@ -70,7 +70,7 @@ public int compare(int[] a, int[] b) { public static int kth(int num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; diff --git a/src/class179/Code03_LCP1.java b/src/class179/Code03_LCP1.java index 7991882f0..6eed590cf 100644 --- a/src/class179/Code03_LCP1.java +++ b/src/class179/Code03_LCP1.java @@ -44,7 +44,7 @@ public class Code03_LCP1 { public static int kth(long num) { int left = 1, right = cntv, mid, ret = 0; while (left <= right) { - mid = (left + right) / 2; + mid = (left + right) >> 1; if (sorted[mid] <= num) { ret = mid; left = mid + 1; From 90872a29fa16b005f91765e4359940dd41f2a4fc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Oct 2025 21:38:20 +0800 Subject: [PATCH 0883/1170] modify code --- src/class181/Code02_RainyDayTail1.java | 36 ++--- src/class181/Code03_LoveRunning1.java | 33 ++--- src/class181/Code04_NeverLand1.java | 196 +++++++++++++++++++++++++ 3 files changed, 221 insertions(+), 44 deletions(-) create mode 100644 src/class181/Code04_NeverLand1.java diff --git a/src/class181/Code02_RainyDayTail1.java b/src/class181/Code02_RainyDayTail1.java index 9b9052aea..952a33774 100644 --- a/src/class181/Code02_RainyDayTail1.java +++ b/src/class181/Code02_RainyDayTail1.java @@ -16,7 +16,6 @@ public class Code02_RainyDayTail1 { public static int MAXT = MAXN * 50; public static int MAXP = 20; public static int n, m; - public static int[][] query = new int[MAXN][3]; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -220,24 +219,6 @@ public static void calc2() { } } - public static void compute() { - // dfs1(1, 0); - dfs2(); - for (int i = 1; i <= m; i++) { - int x = query[i][0]; - int y = query[i][1]; - int food = query[i][2]; - int lca = getLca(x, y); - int lcafa = stjump[lca][0]; - root[x] = add(food, 1, 1, MAXV, root[x]); - root[y] = add(food, 1, 1, MAXV, root[y]); - root[lca] = add(food, -1, 1, MAXV, root[lca]); - root[lcafa] = add(food, -1, 1, MAXV, root[lcafa]); - } - // calc1(1, 0); - calc2(); - } - public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); @@ -249,12 +230,21 @@ public static void main(String[] args) throws Exception { addEdge(u, v); addEdge(v, u); } + // dfs1(1, 0); + dfs2(); for (int i = 1; i <= m; i++) { - query[i][0] = in.nextInt(); - query[i][1] = in.nextInt(); - query[i][2] = in.nextInt(); + int x = in.nextInt(); + int y = in.nextInt(); + int food = in.nextInt(); + int lca = getLca(x, y); + int lcafa = stjump[lca][0]; + root[x] = add(food, 1, 1, MAXV, root[x]); + root[y] = add(food, 1, 1, MAXV, root[y]); + root[lca] = add(food, -1, 1, MAXV, root[lca]); + root[lcafa] = add(food, -1, 1, MAXV, root[lcafa]); } - compute(); + // calc1(1, 0); + calc2(); for (int i = 1; i <= n; i++) { out.println(ans[i]); } diff --git a/src/class181/Code03_LoveRunning1.java b/src/class181/Code03_LoveRunning1.java index e5c8d5df6..cf1b557b5 100644 --- a/src/class181/Code03_LoveRunning1.java +++ b/src/class181/Code03_LoveRunning1.java @@ -16,7 +16,6 @@ public class Code03_LoveRunning1 { public static int MAXP = 20; public static int n, m; public static int[] arr = new int[MAXN]; - public static int[][] query = new int[MAXN][2]; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -222,23 +221,6 @@ public static void calc2() { } } - public static void compute() { - // dfs1(1, 0); - dfs2(); - for (int i = 1; i <= m; i++) { - int x = query[i][0]; - int y = query[i][1]; - int lca = getLca(x, y); - int lcafa = stjump[lca][0]; - rootl[x] = add(dep[x], 1, 1, n, rootl[x]); - rootl[lca] = add(dep[x], -1, 1, n, rootl[lca]); - rootr[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rootr[y]); - rootr[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rootr[lcafa]); - } - // calc1(1, 0); - calc2(); - } - public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); @@ -253,11 +235,20 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } + // dfs1(1, 0); + dfs2(); for (int i = 1; i <= m; i++) { - query[i][0] = in.nextInt(); - query[i][1] = in.nextInt(); + int x = in.nextInt(); + int y = in.nextInt(); + int lca = getLca(x, y); + int lcafa = stjump[lca][0]; + rootl[x] = add(dep[x], 1, 1, n, rootl[x]); + rootl[lca] = add(dep[x], -1, 1, n, rootl[lca]); + rootr[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rootr[y]); + rootr[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rootr[lcafa]); } - compute(); + // calc1(1, 0); + calc2(); for (int i = 1; i <= n; i++) { out.print(ans[i] + " "); } diff --git a/src/class181/Code04_NeverLand1.java b/src/class181/Code04_NeverLand1.java new file mode 100644 index 000000000..b6134e501 --- /dev/null +++ b/src/class181/Code04_NeverLand1.java @@ -0,0 +1,196 @@ +package class181; + +// 永无乡,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3224 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code04_NeverLand1 { + + public static int MAXN = 100001; + public static int MAXT = MAXN * 40; + public static int n, m, q; + public static int[] pos = new int[MAXN]; + + public static int[] root = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] sum = new int[MAXT]; + public static int cntt; + + public static int[] father = new int[MAXN]; + + public static void up(int i) { + sum[i] = sum[ls[i]] + sum[rs[i]]; + } + + public static int add(int jobi, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = ++cntt; + } + if (l == r) { + sum[rt]++; + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = add(jobi, l, mid, ls[rt]); + } else { + rs[rt] = add(jobi, mid + 1, r, rs[rt]); + } + up(rt); + } + return rt; + } + + public static int merge(int l, int r, int t1, int t2) { + if (t1 == 0 || t2 == 0) { + return t1 + t2; + } + if (l == r) { + sum[t1] += sum[t2]; + } else { + int mid = (l + r) >> 1; + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + up(t1); + } + return t1; + } + + public static int query(int jobk, int l, int r, int i) { + if (i == 0 || jobk > sum[i]) { + return -1; + } + if (l == r) { + return pos[l]; + } + int mid = (l + r) >> 1; + if (sum[ls[i]] >= jobk) { + return query(jobk, l, mid, ls[i]); + } else { + return query(jobk - sum[ls[i]], mid + 1, r, rs[i]); + } + } + + public static int find(int i) { + if (i != father[i]) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static void union(int x, int y) { + int xfa = find(x); + int yfa = find(y); + if (xfa != yfa) { + father[xfa] = yfa; + root[yfa] = merge(1, n, root[yfa], root[xfa]); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + int num; + for (int i = 1; i <= n; i++) { + num = in.nextInt(); + pos[num] = i; + father[i] = i; + root[i] = add(num, 1, n, root[i]); + } + for (int i = 1, x, y; i <= m; i++) { + x = in.nextInt(); + y = in.nextInt(); + union(x, y); + } + q = in.nextInt(); + char op; + int x, y, k; + for (int i = 1; i <= q; i++) { + op = in.nextChar(); + if (op == 'B') { + x = in.nextInt(); + y = in.nextInt(); + union(x, y); + } else { + x = in.nextInt(); + k = in.nextInt(); + out.println(query(k, 1, n, root[find(x)])); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} From 3781315fc047d8d92736953efcb229a07a38a7e4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Oct 2025 15:04:41 +0800 Subject: [PATCH 0884/1170] modify code --- src/class181/Code05_LeadersGroup1.java | 187 +++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 src/class181/Code05_LeadersGroup1.java diff --git a/src/class181/Code05_LeadersGroup1.java b/src/class181/Code05_LeadersGroup1.java new file mode 100644 index 000000000..ffe86c5fd --- /dev/null +++ b/src/class181/Code05_LeadersGroup1.java @@ -0,0 +1,187 @@ +package class181; + +// 领导集团问题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4577 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code05_LeadersGroup1 { + + public static int MAXN = 200001; + public static int MAXV = 1000000000; + public static int MAXT = MAXN * 40; + public static int n; + public static int[] arr = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN]; + public static int[] to = new int[MAXN]; + public static int cntg; + + public static int[] root = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] max = new int[MAXT]; + // 懒更新信息,不是对整个区间加,而是对已存在的节点统一加 + public static int[] addTag = new int[MAXT]; + public static int cntt; + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void up(int i) { + max[i] = Math.max(max[ls[i]], max[rs[i]]); + } + + public static void lazy(int i, int v) { + if (i != 0) { + max[i] += v; + addTag[i] += v; + } + } + + public static void down(int i) { + if (addTag[i] > 0) { + lazy(ls[i], addTag[i]); + lazy(rs[i], addTag[i]); + addTag[i] = 0; + } + } + + public static int add(int jobi, int jobv, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = ++cntt; + } + if (l == r) { + max[rt] = Math.max(max[rt], jobv); + } else { + down(rt); + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = add(jobi, jobv, l, mid, ls[rt]); + } else { + rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); + } + up(rt); + } + return rt; + } + + public static int merge(int l, int r, int t1, int t2, int t1max, int t2max) { + if (t1 == 0 || t2 == 0) { + if (t1 != 0) { + lazy(t1, t2max); + } + if (t2 != 0) { + lazy(t2, t1max); + } + return t1 + t2; + } + if (l == r) { + max[t1] = Math.max(max[t1], t1max) + Math.max(max[t2], t2max); + } else { + down(t1); + down(t2); + int mid = (l + r) >> 1; + ls[t1] = merge(l, mid, ls[t1], ls[t2], Math.max(max[rs[t1]], t1max), Math.max(max[rs[t2]], t2max)); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], t1max, t2max); + up(t1); + } + return t1; + } + + public static int query(int jobl, int jobr, int l, int r, int i) { + if (i == 0) { + return 0; + } + if (jobl <= l && r <= jobr) { + return max[i]; + } + down(i); + int mid = (l + r) >> 1; + int ans = 0; + if (jobl <= mid) { + ans = Math.max(ans, query(jobl, jobr, l, mid, ls[i])); + } + if (jobr > mid) { + ans = Math.max(ans, query(jobl, jobr, mid + 1, r, rs[i])); + } + return ans; + } + + public static void dp(int u) { + int val = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + dp(v); + val += query(arr[u], MAXV, 1, MAXV, root[v]); + root[u] = merge(1, MAXV, root[u], root[v], 0, 0); + } + root[u] = add(arr[u], val, 1, MAXV, root[u]); + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 2, fa; i <= n; i++) { + fa = in.nextInt(); + addEdge(fa, i); + } + dp(1); + out.println(max[root[1]]); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 3284681a2e5eef3c4cf9b3f9064e2f7990776824 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Oct 2025 15:10:33 +0800 Subject: [PATCH 0885/1170] modify code --- src/class181/Code05_LeadersGroup1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class181/Code05_LeadersGroup1.java b/src/class181/Code05_LeadersGroup1.java index ffe86c5fd..60b3c71ac 100644 --- a/src/class181/Code05_LeadersGroup1.java +++ b/src/class181/Code05_LeadersGroup1.java @@ -41,6 +41,9 @@ public static void up(int i) { } public static void lazy(int i, int v) { + // 如果区间信息不存在 + // 说明没有插入过节点 + // 那么无需保留懒信息 if (i != 0) { max[i] += v; addTag[i] += v; From d4f001a366ac845de447c65ca00b0edbbd97354c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Oct 2025 17:02:10 +0800 Subject: [PATCH 0886/1170] modify code --- src/class181/Code05_LeadersGroup1.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/class181/Code05_LeadersGroup1.java b/src/class181/Code05_LeadersGroup1.java index 60b3c71ac..e1e59c659 100644 --- a/src/class181/Code05_LeadersGroup1.java +++ b/src/class181/Code05_LeadersGroup1.java @@ -26,7 +26,6 @@ public class Code05_LeadersGroup1 { public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static int[] max = new int[MAXT]; - // 懒更新信息,不是对整个区间加,而是对已存在的节点统一加 public static int[] addTag = new int[MAXT]; public static int cntt; @@ -41,9 +40,7 @@ public static void up(int i) { } public static void lazy(int i, int v) { - // 如果区间信息不存在 - // 说明没有插入过节点 - // 那么无需保留懒信息 + // 如果区间信息不存在,说明没有建立过dp信息,那么不需要加v if (i != 0) { max[i] += v; addTag[i] += v; @@ -78,24 +75,24 @@ public static int add(int jobi, int jobv, int l, int r, int i) { return rt; } - public static int merge(int l, int r, int t1, int t2, int t1max, int t2max) { + public static int merge(int l, int r, int t1, int t2, int rmax1, int rmax2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { - lazy(t1, t2max); + lazy(t1, rmax2); } if (t2 != 0) { - lazy(t2, t1max); + lazy(t2, rmax1); } return t1 + t2; } if (l == r) { - max[t1] = Math.max(max[t1], t1max) + Math.max(max[t2], t2max); + max[t1] = Math.max(max[t1], rmax1) + Math.max(max[t2], rmax2); } else { down(t1); down(t2); int mid = (l + r) >> 1; - ls[t1] = merge(l, mid, ls[t1], ls[t2], Math.max(max[rs[t1]], t1max), Math.max(max[rs[t2]], t2max)); - rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], t1max, t2max); + ls[t1] = merge(l, mid, ls[t1], ls[t2], Math.max(max[rs[t1]], rmax1), Math.max(max[rs[t2]], rmax2)); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], rmax1, rmax2); up(t1); } return t1; From 36408b63f71874b049f61f896ad80a524e115f86 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Oct 2025 21:26:54 +0800 Subject: [PATCH 0887/1170] modify code --- .../{Code05_LeadersGroup1.java => Code01_LeadersGroup1.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/class181/{Code05_LeadersGroup1.java => Code01_LeadersGroup1.java} (100%) diff --git a/src/class181/Code05_LeadersGroup1.java b/src/class181/Code01_LeadersGroup1.java similarity index 100% rename from src/class181/Code05_LeadersGroup1.java rename to src/class181/Code01_LeadersGroup1.java From c903779aac984f1c0ff136ba325635f059fd660b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Oct 2025 21:27:00 +0800 Subject: [PATCH 0888/1170] modify code --- src/class181/Code05_MinimizeInversion1.java | 130 ++++++++++++++++++ src/class181/Code05_MinimizeInversion2.java | 82 +++++++++++ .../Code01_LeadersGroup1.java | 4 +- 3 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 src/class181/Code05_MinimizeInversion1.java create mode 100644 src/class181/Code05_MinimizeInversion2.java rename src/{class181 => class182}/Code01_LeadersGroup1.java (98%) diff --git a/src/class181/Code05_MinimizeInversion1.java b/src/class181/Code05_MinimizeInversion1.java new file mode 100644 index 000000000..aaabdb116 --- /dev/null +++ b/src/class181/Code05_MinimizeInversion1.java @@ -0,0 +1,130 @@ +package class181; + +// 最小化逆序对,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3521 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code05_MinimizeInversion2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code05_MinimizeInversion1 { + + public static int MAXT = 5000001; + public static int n; + + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] siz = new int[MAXT]; + public static int cntt; + + public static long ans, u, v; + + public static void up(int i) { + siz[i] = siz[ls[i]] + siz[rs[i]]; + } + + public static int build(int jobi, int l, int r) { + int rt = ++cntt; + if (l == r) { + siz[rt]++; + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = build(jobi, l, mid); + } else { + rs[rt] = build(jobi, mid + 1, r); + } + up(rt); + } + return rt; + } + + public static int merge(int l, int r, int t1, int t2) { + if (t1 == 0 || t2 == 0) { + return t1 + t2; + } + if (l == r) { + siz[t1] += siz[t2]; + } else { + u += (long) siz[rs[t1]] * siz[ls[t2]]; + v += (long) siz[ls[t1]] * siz[rs[t2]]; + int mid = (l + r) >> 1; + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + up(t1); + } + return t1; + } + + public static int dfs() throws IOException { + int rt; + int val = in.nextInt(); + if (val == 0) { + int left = dfs(); + int right = dfs(); + u = v = 0; + rt = merge(1, n, left, right); + ans += Math.min(u, v); + } else { + rt = build(val, 1, n); + } + return rt; + } + + public static FastReader in = new FastReader(System.in); + + public static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + + public static void main(String[] args) throws Exception { + n = in.nextInt(); + dfs(); + out.println(ans); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class181/Code05_MinimizeInversion2.java b/src/class181/Code05_MinimizeInversion2.java new file mode 100644 index 000000000..a075d1bf1 --- /dev/null +++ b/src/class181/Code05_MinimizeInversion2.java @@ -0,0 +1,82 @@ +package class181; + +// 最小化逆序对,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3521 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXT = 5000001; +//int n; +// +//int ls[MAXT]; +//int rs[MAXT]; +//int siz[MAXT]; +//int cntt; +// +//long long ans, u, v; +// +//void up(int i) { +// siz[i] = siz[ls[i]] + siz[rs[i]]; +//} +// +//int build(int jobi, int l, int r) { +// int rt = ++cntt; +// if (l == r) { +// siz[rt]++; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = build(jobi, l, mid); +// } else { +// rs[rt] = build(jobi, mid + 1, r); +// } +// up(rt); +// } +// return rt; +//} +// +//int merge(int l, int r, int t1, int t2) { +// if (t1 == 0 || t2 == 0) { +// return t1 + t2; +// } +// if (l == r) { +// siz[t1] += siz[t2]; +// } else { +// u += 1LL * siz[rs[t1]] * siz[ls[t2]]; +// v += 1LL * siz[ls[t1]] * siz[rs[t2]]; +// int mid = (l + r) >> 1; +// ls[t1] = merge(l, mid, ls[t1], ls[t2]); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); +// up(t1); +// } +// return t1; +//} +// +//int dfs() { +// int rt; +// int val; +// cin >> val; +// if (val == 0) { +// int left = dfs(); +// int right = dfs(); +// u = v = 0; +// rt = merge(1, n, left, right); +// ans += min(u, v); +// } else { +// rt = build(val, 1, n); +// } +// return rt; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// dfs(); +// cout << ans << '\n'; +// return 0; +//} \ No newline at end of file diff --git a/src/class181/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java similarity index 98% rename from src/class181/Code01_LeadersGroup1.java rename to src/class182/Code01_LeadersGroup1.java index e1e59c659..fc8c50922 100644 --- a/src/class181/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -1,4 +1,4 @@ -package class181; +package class182; // 领导集团问题,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4577 @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_LeadersGroup1 { +public class Code01_LeadersGroup1 { public static int MAXN = 200001; public static int MAXV = 1000000000; From f77b98264be7c650b56dfd876c133a28285ff888 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Oct 2025 11:50:44 +0800 Subject: [PATCH 0889/1170] modify code --- src/class182/Code02_Minimax1.java | 251 ++++++++++++++++++++++++++++++ src/class182/Code02_Minimax2.java | 204 ++++++++++++++++++++++++ 2 files changed, 455 insertions(+) create mode 100644 src/class182/Code02_Minimax1.java create mode 100644 src/class182/Code02_Minimax2.java diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java new file mode 100644 index 000000000..c34be7940 --- /dev/null +++ b/src/class182/Code02_Minimax1.java @@ -0,0 +1,251 @@ +package class182; + +// 根节点的概率问题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5298 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code02_Minimax2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code02_Minimax1 { + + public static int MAXN = 300001; + public static int MAXT = MAXN * 40; + public static int MOD = 998244353; + public static int n; + + public static int[] fa = new int[MAXN]; + public static int[] val = new int[MAXN]; + public static int[] sorted = new int[MAXN]; + public static int cntv; + + public static int[] childCnt = new int[MAXN]; + public static int[][] child = new int[MAXN][2]; + + public static int[] root = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static long[] sum = new long[MAXT]; + public static long[] mul = new long[MAXT]; + public static int cntt; + + public static long[] d = new long[MAXN]; + + public static long power(long x, int p) { + long ans = 1; + while (p != 0) { + if ((p & 1) != 0) { + ans = ans * x % MOD; + } + p >>= 1; + x = x * x % MOD; + } + return ans; + } + + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) >> 1; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + + public static void up(int i) { + sum[i] = (sum[ls[i]] + sum[rs[i]]) % MOD; + } + + public static void lazy(int i, long v) { + if (i != 0) { + sum[i] = sum[i] * v % MOD; + mul[i] = mul[i] * v % MOD; + } + } + + public static void down(int i) { + if (mul[i] != 1) { + lazy(ls[i], mul[i]); + lazy(rs[i], mul[i]); + mul[i] = 1; + } + } + + public static int update(int jobi, int jobv, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = ++cntt; + mul[rt] = 1; + } + if (l == r) { + sum[rt] = jobv % MOD; + } else { + down(rt); + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = update(jobi, jobv, l, mid, ls[rt]); + } else { + rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); + } + up(rt); + } + return rt; + } + + public static int merge(int l, int r, int t1, int t2, long mul1, long mul2, long v) { + if (t1 == 0 || t2 == 0) { + if (t1 != 0) { + lazy(t1, mul1); + } + if (t2 != 0) { + lazy(t2, mul2); + } + return t1 + t2; + } + down(t1); + down(t2); + int mid = (l + r) >> 1; + int ls1 = ls[t1]; + int rs1 = rs[t1]; + int ls2 = ls[t2]; + int rs2 = rs[t2]; + long lsum1 = sum[ls1]; + long rsum1 = sum[rs1]; + long lsum2 = sum[ls2]; + long rsum2 = sum[rs2]; + long tmp = (1 - v + MOD) % MOD; + ls[t1] = merge(l, mid, ls1, ls2, (mul1 + rsum2 * tmp) % MOD, (mul2 + rsum1 * tmp) % MOD, v); + rs[t1] = merge(mid + 1, r, rs1, rs2, (mul1 + lsum2 * v) % MOD, (mul2 + lsum1 * v) % MOD, v); + up(t1); + return t1; + } + + public static void dfs(int u) { + if (childCnt[u] == 0) { + root[u] = update(val[u], 1, 1, cntv, root[u]); + } else if (childCnt[u] == 1) { + dfs(child[u][0]); + root[u] = root[child[u][0]]; + } else { + dfs(child[u][0]); + dfs(child[u][1]); + root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], 0, 0, val[u]); + } + } + + public static void getd(int l, int r, int i) { + if (i == 0) { + return; + } + if (l == r) { + d[l] = sum[i] % MOD; + } else { + down(i); + int mid = (l + r) >> 1; + getd(l, mid, ls[i]); + getd(mid + 1, r, rs[i]); + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + if (fa[i] != 0) { + child[fa[i]][childCnt[fa[i]]++] = i; + } + } + long inv = power(10000, MOD - 2); + for (int i = 1; i <= n; i++) { + if (childCnt[i] == 0) { + sorted[++cntv] = val[i]; + } else { + val[i] = (int) (inv * val[i] % MOD); + } + } + Arrays.sort(sorted, 1, cntv + 1); + int len = 1; + for (int i = 2; i <= cntv; i++) { + if (sorted[len] != sorted[i]) { + sorted[++len] = sorted[i]; + } + } + cntv = len; + for (int i = 1; i <= n; i++) { + if (childCnt[i] == 0) { + val[i] = kth(val[i]); + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + fa[i] = in.nextInt(); + } + for (int i = 1; i <= n; i++) { + val[i] = in.nextInt(); + } + prepare(); + dfs(1); + getd(1, cntv, root[1]); + long ans = 0; + for (int i = 1; i <= cntv; i++) { + ans = (ans + 1L * i * sorted[i] % MOD * d[i] % MOD * d[i]) % MOD; + } + out.println(ans); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java new file mode 100644 index 000000000..176f36160 --- /dev/null +++ b/src/class182/Code02_Minimax2.java @@ -0,0 +1,204 @@ +package class182; + +// 根节点的概率问题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5298 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//const int MAXT = MAXN * 40; +//const int MOD = 998244353; +//int n; +// +//int fa[MAXN]; +//int val[MAXN]; +//int sorted[MAXN]; +//int cntv; +// +//int childCnt[MAXN]; +//int child[MAXN][2]; +// +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int cntt; +// +//long long sum[MAXT]; +//long long mul[MAXT]; +// +//long long d[MAXN]; +// +//long long power(long long x, int p) { +// long long ans = 1; +// while (p) { +// if (p & 1) { +// ans = ans * x % MOD; +// } +// x = x * x % MOD; +// p >>= 1; +// } +// return ans; +//} +// +//int kth(int num) { +// int left = 1, right = cntv, ret = 0; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// +//void up(int i) { +// sum[i] = (sum[ls[i]] + sum[rs[i]]) % MOD; +//} +// +//void lazy(int i, long long v) { +// if (i) { +// sum[i] = sum[i] * v % MOD; +// mul[i] = mul[i] * v % MOD; +// } +//} +// +//void down(int i) { +// if (mul[i] != 1) { +// lazy(ls[i], mul[i]); +// lazy(rs[i], mul[i]); +// mul[i] = 1; +// } +//} +// +//int update(int jobi, int jobv, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = ++cntt; +// mul[rt] = 1; +// } +// if (l == r) { +// sum[rt] = jobv % MOD; +// } else { +// down(rt); +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//int merge(int l, int r, int t1, int t2, long long mul1, long long mul2, long long v) { +// if (t1 == 0 || t2 == 0) { +// if (t1) { +// lazy(t1, mul1); +// } +// if (t2) { +// lazy(t2, mul2); +// } +// return t1 + t2; +// } +// down(t1); +// down(t2); +// int mid = (l + r) >> 1; +// int ls1 = ls[t1]; +// int rs1 = rs[t1]; +// int ls2 = ls[t2]; +// int rs2 = rs[t2]; +// long long lsum1 = sum[ls1]; +// long long rsum1 = sum[rs1]; +// long long lsum2 = sum[ls2]; +// long long rsum2 = sum[rs2]; +// long long tmp = (1 - v + MOD) % MOD; +// ls[t1] = merge(l, mid, ls1, ls2, (mul1 + rsum2 * tmp) % MOD, (mul2 + rsum1 * tmp) % MOD, v); +// rs[t1] = merge(mid + 1, r, rs1, rs2, (mul1 + lsum2 * v) % MOD, (mul2 + lsum1 * v) % MOD, v); +// up(t1); +// return t1; +//} +// +//void dfs(int u) { +// if (childCnt[u] == 0) { +// root[u] = update(val[u], 1, 1, cntv, root[u]); +// } else if (childCnt[u] == 1) { +// dfs(child[u][0]); +// root[u] = root[child[u][0]]; +// } else { +// dfs(child[u][0]); +// dfs(child[u][1]); +// root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], 0, 0, val[u]); +// } +//} +// +//void getd(int l, int r, int i) { +// if (i == 0) { +// return; +// } +// if (l == r) { +// d[l] = sum[i] % MOD; +// } else { +// down(i); +// int mid = (l + r) >> 1; +// getd(l, mid, ls[i]); +// getd(mid + 1, r, rs[i]); +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// if (fa[i] != 0) { +// child[fa[i]][childCnt[fa[i]]++] = i; +// } +// } +// long long inv = power(10000, MOD - 2); +// for (int i = 1; i <= n; i++) { +// if (childCnt[i] == 0) { +// sorted[++cntv] = val[i]; +// } else { +// val[i] = (int)(inv * val[i] % MOD); +// } +// } +// sort(sorted + 1, sorted + cntv + 1); +// int len = 1; +// for (int i = 2; i <= cntv; i++) { +// if (sorted[len] != sorted[i]) { +// sorted[++len] = sorted[i]; +// } +// } +// cntv = len; +// for (int i = 1; i <= n; i++) { +// if (childCnt[i] == 0) { +// val[i] = kth(val[i]); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> fa[i]; +// } +// for (int i = 1; i <= n; i++) { +// cin >> val[i]; +// } +// prepare(); +// dfs(1); +// getd(1, cntv, root[1]); +// long long ans = 0; +// for (int i = 1; i <= cntv; i++) { +// ans = (ans + (1LL * i * sorted[i]) % MOD * d[i] % MOD * d[i] % MOD) % MOD; +// } +// cout << ans << '\n'; +// return 0; +//} \ No newline at end of file From cdcf285fba7e584ea0ec38b5487e26ddfcab8791 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Oct 2025 12:12:53 +0800 Subject: [PATCH 0890/1170] modify code --- src/class182/Code02_Minimax1.java | 49 +++++++++++++++++++++++++++---- src/class182/Code02_Minimax2.java | 2 +- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index c34be7940..fae588352 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -1,6 +1,6 @@ package class182; -// 根节点的概率问题,java版 +// 根节点的概率,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5298 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 @@ -131,19 +131,55 @@ public static int merge(int l, int r, int t1, int t2, long mul1, long mul2, long return t1; } - public static void dfs(int u) { + // 递归版,java会爆栈,C++可以通过 + public static void dfs1(int u) { if (childCnt[u] == 0) { root[u] = update(val[u], 1, 1, cntv, root[u]); } else if (childCnt[u] == 1) { - dfs(child[u][0]); + dfs1(child[u][0]); root[u] = root[child[u][0]]; } else { - dfs(child[u][0]); - dfs(child[u][1]); + dfs1(child[u][0]); + dfs1(child[u][1]); root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], 0, 0, val[u]); } } + // dfs1改成迭代版 + public static void dfs2() { + int[][] stack = new int[n][2]; + int siz = 0; + stack[++siz][0] = 1; + stack[siz][1] = 0; + while (siz > 0) { + int u = stack[siz][0]; + int s = stack[siz--][1]; + if (childCnt[u] == 0) { + root[u] = update(val[u], 1, 1, cntv, root[u]); + } else if (childCnt[u] == 1) { + if (s == 0) { + stack[++siz][0] = u; + stack[siz][1] = 1; + stack[++siz][0] = child[u][0]; + stack[siz][1] = 0; + } else { + root[u] = root[child[u][0]]; + } + } else { + if (s == 0) { + stack[++siz][0] = u; + stack[siz][1] = 1; + stack[++siz][0] = child[u][1]; + stack[siz][1] = 0; + stack[++siz][0] = child[u][0]; + stack[siz][1] = 0; + } else { + root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], 0, 0, val[u]); + } + } + } + } + public static void getd(int l, int r, int i) { if (i == 0) { return; @@ -198,7 +234,8 @@ public static void main(String[] args) throws Exception { val[i] = in.nextInt(); } prepare(); - dfs(1); + // dfs1(1); + dfs2(); getd(1, cntv, root[1]); long ans = 0; for (int i = 1; i <= cntv; i++) { diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 176f36160..168fe591a 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -1,6 +1,6 @@ package class182; -// 根节点的概率问题,C++版 +// 根节点的概率,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P5298 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 5cc8569af5f72a96b965813c7884983e5568ec4c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Oct 2025 12:21:25 +0800 Subject: [PATCH 0891/1170] modify code --- src/class182/Code02_Minimax1.java | 59 ++++++------------------------- src/class182/Code02_Minimax2.java | 8 ++--- 2 files changed, 15 insertions(+), 52 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index fae588352..dca86afd5 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -3,8 +3,8 @@ // 根节点的概率,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5298 // 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code02_Minimax2文件就是C++的实现 +// java实现的逻辑一定是正确的,但是递归函数会爆栈,即便改了迭代,也会卡常超时 +// 索性不改了,想通过用C++实现,本节课Code02_Minimax2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -103,7 +103,7 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } - public static int merge(int l, int r, int t1, int t2, long mul1, long mul2, long v) { + public static int merge(int l, int r, int t1, int t2, long v, long mul1, long mul2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { lazy(t1, mul1); @@ -125,58 +125,22 @@ public static int merge(int l, int r, int t1, int t2, long mul1, long mul2, long long lsum2 = sum[ls2]; long rsum2 = sum[rs2]; long tmp = (1 - v + MOD) % MOD; - ls[t1] = merge(l, mid, ls1, ls2, (mul1 + rsum2 * tmp) % MOD, (mul2 + rsum1 * tmp) % MOD, v); - rs[t1] = merge(mid + 1, r, rs1, rs2, (mul1 + lsum2 * v) % MOD, (mul2 + lsum1 * v) % MOD, v); + ls[t1] = merge(l, mid, ls1, ls2, v, (mul1 + rsum2 * tmp) % MOD, (mul2 + rsum1 * tmp) % MOD); + rs[t1] = merge(mid + 1, r, rs1, rs2, v, (mul1 + lsum2 * v) % MOD, (mul2 + lsum1 * v) % MOD); up(t1); return t1; } - // 递归版,java会爆栈,C++可以通过 - public static void dfs1(int u) { + public static void dfs(int u) { if (childCnt[u] == 0) { root[u] = update(val[u], 1, 1, cntv, root[u]); } else if (childCnt[u] == 1) { - dfs1(child[u][0]); + dfs(child[u][0]); root[u] = root[child[u][0]]; } else { - dfs1(child[u][0]); - dfs1(child[u][1]); - root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], 0, 0, val[u]); - } - } - - // dfs1改成迭代版 - public static void dfs2() { - int[][] stack = new int[n][2]; - int siz = 0; - stack[++siz][0] = 1; - stack[siz][1] = 0; - while (siz > 0) { - int u = stack[siz][0]; - int s = stack[siz--][1]; - if (childCnt[u] == 0) { - root[u] = update(val[u], 1, 1, cntv, root[u]); - } else if (childCnt[u] == 1) { - if (s == 0) { - stack[++siz][0] = u; - stack[siz][1] = 1; - stack[++siz][0] = child[u][0]; - stack[siz][1] = 0; - } else { - root[u] = root[child[u][0]]; - } - } else { - if (s == 0) { - stack[++siz][0] = u; - stack[siz][1] = 1; - stack[++siz][0] = child[u][1]; - stack[siz][1] = 0; - stack[++siz][0] = child[u][0]; - stack[siz][1] = 0; - } else { - root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], 0, 0, val[u]); - } - } + dfs(child[u][0]); + dfs(child[u][1]); + root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); } } @@ -234,8 +198,7 @@ public static void main(String[] args) throws Exception { val[i] = in.nextInt(); } prepare(); - // dfs1(1); - dfs2(); + dfs(1); getd(1, cntv, root[1]); long ans = 0; for (int i = 1; i <= cntv; i++) { diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 168fe591a..5b72e3eff 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -98,7 +98,7 @@ // return rt; //} // -//int merge(int l, int r, int t1, int t2, long long mul1, long long mul2, long long v) { +//int merge(int l, int r, int t1, int t2, long long v, long long mul1, long long mul2) { // if (t1 == 0 || t2 == 0) { // if (t1) { // lazy(t1, mul1); @@ -120,8 +120,8 @@ // long long lsum2 = sum[ls2]; // long long rsum2 = sum[rs2]; // long long tmp = (1 - v + MOD) % MOD; -// ls[t1] = merge(l, mid, ls1, ls2, (mul1 + rsum2 * tmp) % MOD, (mul2 + rsum1 * tmp) % MOD, v); -// rs[t1] = merge(mid + 1, r, rs1, rs2, (mul1 + lsum2 * v) % MOD, (mul2 + lsum1 * v) % MOD, v); +// ls[t1] = merge(l, mid, ls1, ls2, v, (mul1 + rsum2 * tmp) % MOD, (mul2 + rsum1 * tmp) % MOD); +// rs[t1] = merge(mid + 1, r, rs1, rs2, v, (mul1 + lsum2 * v) % MOD, (mul2 + lsum1 * v) % MOD); // up(t1); // return t1; //} @@ -135,7 +135,7 @@ // } else { // dfs(child[u][0]); // dfs(child[u][1]); -// root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], 0, 0, val[u]); +// root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); // } //} // From c0e32cad92baa55d269eb0e532d603ae7f2ba2da Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Oct 2025 12:27:16 +0800 Subject: [PATCH 0892/1170] modify code --- src/class182/Code02_Minimax1.java | 51 ++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index dca86afd5..cd6e41755 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -3,8 +3,8 @@ // 根节点的概率,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5298 // 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是递归函数会爆栈,即便改了迭代,也会卡常超时 -// 索性不改了,想通过用C++实现,本节课Code02_Minimax2文件就是C++的实现 +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code02_Minimax2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -131,19 +131,55 @@ public static int merge(int l, int r, int t1, int t2, long v, long mul1, long mu return t1; } - public static void dfs(int u) { + // 迭代版,java会爆栈,C++可以通过 + public static void dfs1(int u) { if (childCnt[u] == 0) { root[u] = update(val[u], 1, 1, cntv, root[u]); } else if (childCnt[u] == 1) { - dfs(child[u][0]); + dfs1(child[u][0]); root[u] = root[child[u][0]]; } else { - dfs(child[u][0]); - dfs(child[u][1]); + dfs1(child[u][0]); + dfs1(child[u][1]); root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); } } + // dfs1改成迭代版 + public static void dfs2() { + int[][] stack = new int[n][2]; + int siz = 0; + stack[++siz][0] = 1; + stack[siz][1] = 0; + while (siz > 0) { + int u = stack[siz][0]; + int s = stack[siz--][1]; + if (childCnt[u] == 0) { + root[u] = update(val[u], 1, 1, cntv, root[u]); + } else if (childCnt[u] == 1) { + if (s == 0) { + stack[++siz][0] = u; + stack[siz][1] = 1; + stack[++siz][0] = child[u][0]; + stack[siz][1] = 0; + } else { + root[u] = root[child[u][0]]; + } + } else { + if (s == 0) { + stack[++siz][0] = u; + stack[siz][1] = 1; + stack[++siz][0] = child[u][1]; + stack[siz][1] = 0; + stack[++siz][0] = child[u][0]; + stack[siz][1] = 0; + } else { + root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); + } + } + } + } + public static void getd(int l, int r, int i) { if (i == 0) { return; @@ -198,7 +234,8 @@ public static void main(String[] args) throws Exception { val[i] = in.nextInt(); } prepare(); - dfs(1); + // dfs1(1); + dfs2(); getd(1, cntv, root[1]); long ans = 0; for (int i = 1; i <= cntv; i++) { From 24023a71ad411801f6cfd14db738962371e5e2d5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 22 Oct 2025 16:22:34 +0800 Subject: [PATCH 0893/1170] modify code --- src/class182/Code03_Fate1.java | 278 +++++++++++++++++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 src/class182/Code03_Fate1.java diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java new file mode 100644 index 000000000..c841676eb --- /dev/null +++ b/src/class182/Code03_Fate1.java @@ -0,0 +1,278 @@ +package class182; + +// 命运,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P6773 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; + +public class Code03_Fate1 { + + public static int MAXN = 500001; + public static int MAXT = MAXN * 40; + public static int MOD = 998244353; + public static int n, m; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static int[] root = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static long[] sum = new long[MAXT]; + public static long[] mul = new long[MAXT]; + public static int cntt; + + public static int[] dep = new int[MAXN]; + public static int[] maxdep = new int[MAXN]; + + // 讲解118,递归改迭代需要的栈 + public static int[][] ufe = new int[MAXN][3]; + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void lazy(int i, long v) { + if (i != 0) { + sum[i] = sum[i] * v % MOD; + mul[i] = mul[i] * v % MOD; + } + } + + public static void down(int i) { + if (mul[i] != 1) { + lazy(ls[i], mul[i]); + lazy(rs[i], mul[i]); + mul[i] = 1; + } + } + + public static int build(int jobi, int l, int r) { + int rt = ++cntt; + sum[rt] = 1; + mul[rt] = 1; + if (l < r) { + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = build(jobi, l, mid); + } else { + rs[rt] = build(jobi, mid + 1, r); + } + } + return rt; + } + + public static long sum1, sum2; + + public static int merge(int l, int r, int t1, int t2) { + if (t1 == 0 || t2 == 0) { + if (t1 != 0) { + sum2 = (sum2 + sum[t1]) % MOD; + lazy(t1, sum1); + } + if (t2 != 0) { + sum1 = (sum1 + sum[t2]) % MOD; + lazy(t2, sum2); + } + return t1 + t2; + } + if (l == r) { + sum1 = (sum1 + sum[t2]) % MOD; + long tmp = sum[t1]; + sum[t1] = ((sum[t1] * sum1) % MOD + (sum[t2] * sum2) % MOD) % MOD; + sum2 = (sum2 + tmp) % MOD; + } else { + down(t1); + down(t2); + int mid = (l + r) >> 1; + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + sum[t1] = (sum[ls[t1]] + sum[rs[t1]]) % MOD; + } + return t1; + } + + public static long query(int jobl, int jobr, int l, int r, int i) { + if (i == 0) { + return 0; + } + if (jobl <= l && r <= jobr) { + return sum[i] % MOD; + } + down(i); + int mid = (l + r) >> 1; + long ans = 0; + if (jobl <= mid) { + ans = query(jobl, jobr, l, mid, ls[i]); + } + if (jobr > mid) { + ans = (ans + query(jobl, jobr, mid + 1, r, rs[i])) % MOD; + } + return ans; + } + + // 递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa) { + dep[u] = dep[fa] + 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + dfs1(v, u); + } + } + } + + // dfs1的迭代版 + public static void dfs2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dep[u] = dep[f] + 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } + } + } + + // 递归版,java会爆栈,C++可以通过 + public static void dp1(int u, int fa) { + root[u] = build(maxdep[u], 0, n); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + dp1(v, u); + } + } + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != fa) { + sum1 = query(0, dep[u], 0, n, root[v]); + sum2 = 0; + root[u] = merge(0, n, root[u], root[v]); + } + } + } + + // dp1的迭代版 + public static void dp2() { + stacksize = 0; + push(1, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + root[u] = build(maxdep[u], 0, n); + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f) { + sum1 = query(0, dep[u], 0, n, root[v]); + sum2 = 0; + root[u] = merge(0, n, root[u], root[v]); + } + } + } + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(System.in); + n = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + // dfs1(1, 0); + dfs2(); + m = in.nextInt(); + for (int i = 1, x, y; i <= m; i++) { + x = in.nextInt(); + y = in.nextInt(); + maxdep[y] = Math.max(maxdep[y], dep[x]); + } + // dp1(1, 0); + dp2(); + long ans = query(0, 0, 0, n, root[1]) % MOD; + System.out.println(ans); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} \ No newline at end of file From e5ab9efcdff90637388b244eca84cacc56f838ff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 22 Oct 2025 16:29:11 +0800 Subject: [PATCH 0894/1170] modify code --- src/class182/Code03_Fate1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index c841676eb..e0d6f6cd7 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -99,9 +99,9 @@ public static int merge(int l, int r, int t1, int t2) { } if (l == r) { sum1 = (sum1 + sum[t2]) % MOD; - long tmp = sum[t1]; - sum[t1] = ((sum[t1] * sum1) % MOD + (sum[t2] * sum2) % MOD) % MOD; - sum2 = (sum2 + tmp) % MOD; + long tmp = sum2; + sum2 = (sum2 + sum[t1]) % MOD; + sum[t1] = ((sum[t1] * sum1) % MOD + (sum[t2] * tmp) % MOD) % MOD; } else { down(t1); down(t2); From 070a959b9b0e17a0af08b4d4b13d200709121024 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 22 Oct 2025 19:12:01 +0800 Subject: [PATCH 0895/1170] modify code --- src/class181/Code02_RainyDayTail2.java | 167 ++++++++++++++++++++++++ src/class181/Code03_LoveRunning2.java | 172 +++++++++++++++++++++++++ src/class181/Code04_NeverLand2.java | 122 ++++++++++++++++++ 3 files changed, 461 insertions(+) create mode 100644 src/class181/Code02_RainyDayTail2.java create mode 100644 src/class181/Code03_LoveRunning2.java create mode 100644 src/class181/Code04_NeverLand2.java diff --git a/src/class181/Code02_RainyDayTail2.java b/src/class181/Code02_RainyDayTail2.java new file mode 100644 index 000000000..5cff6344d --- /dev/null +++ b/src/class181/Code02_RainyDayTail2.java @@ -0,0 +1,167 @@ +package class181; + +// 雨天的尾巴,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4556 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXV = 100000; +//const int MAXT = MAXN * 50; +//const int MAXP = 20; +//int n, m; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int dep[MAXN]; +//int stjump[MAXN][MAXP]; +// +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int maxCnt[MAXT]; +//int cntt; +// +//int ans[MAXN]; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// dfs(v, u); +// } +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//void up(int i) { +// maxCnt[i] = max(maxCnt[ls[i]], maxCnt[rs[i]]); +//} +// +//int add(int jobi, int jobv, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = ++cntt; +// } +// if (l == r) { +// maxCnt[rt] += jobv; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = add(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//int merge(int l, int r, int t1, int t2) { +// if (t1 == 0 || t2 == 0) { +// return t1 + t2; +// } +// if (l == r) { +// maxCnt[t1] += maxCnt[t2]; +// } else { +// int mid = (l + r) >> 1; +// ls[t1] = merge(l, mid, ls[t1], ls[t2]); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); +// up(t1); +// } +// return t1; +//} +// +//int query(int l, int r, int i) { +// if (l == r) { +// return l; +// } +// int mid = (l + r) >> 1; +// if (maxCnt[i] == maxCnt[ls[i]]) { +// return query(l, mid, ls[i]); +// } else { +// return query(mid + 1, r, rs[i]); +// } +//} +// +//void calc(int u, int fa) { +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// calc(v, u); +// } +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// root[u] = merge(1, MAXV, root[u], root[v]); +// } +// } +// if (root[u] && maxCnt[root[u]] > 0) { +// ans[u] = query(1, MAXV, root[u]); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs(1, 0); +// for (int i = 1, x, y, food; i <= m; i++) { +// cin >> x >> y >> food; +// int lca = getLca(x, y); +// int lcafa = stjump[lca][0]; +// root[x] = add(food, 1, 1, MAXV, root[x]); +// root[y] = add(food, 1, 1, MAXV, root[y]); +// root[lca] = add(food, -1, 1, MAXV, root[lca]); +// root[lcafa] = add(food, -1, 1, MAXV, root[lcafa]); +// } +// calc(1, 0); +// for (int i = 1; i <= n; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class181/Code03_LoveRunning2.java b/src/class181/Code03_LoveRunning2.java new file mode 100644 index 000000000..32bc1781f --- /dev/null +++ b/src/class181/Code03_LoveRunning2.java @@ -0,0 +1,172 @@ +package class181; + +// 天天爱跑步,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P1600 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//const int MAXT = MAXN * 50; +//const int MAXP = 20; +//int n, m; +//int arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int dep[MAXN]; +//int stjump[MAXN][MAXP]; +//int rootl[MAXN]; +//int rootr[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int sum[MAXT]; +//int cntt; +// +//int ans[MAXN]; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXP; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// dfs(v, u); +// } +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXP - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//void up(int i) { +// sum[i] = sum[ls[i]] + sum[rs[i]]; +//} +// +//int add(int jobi, int jobv, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = ++cntt; +// } +// if (l == r) { +// sum[rt] += jobv; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = add(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//int merge(int l, int r, int t1, int t2) { +// if (t1 == 0 || t2 == 0) { +// return t1 + t2; +// } +// if (l == r) { +// sum[t1] += sum[t2]; +// } else { +// int mid = (l + r) >> 1; +// ls[t1] = merge(l, mid, ls[t1], ls[t2]); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); +// up(t1); +// } +// return t1; +//} +// +//int query(int jobi, int l, int r, int i) { +// if (jobi < l || jobi > r || i == 0) { +// return 0; +// } +// if (l == r) { +// return sum[i]; +// } +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// return query(jobi, l, mid, ls[i]); +// } else { +// return query(jobi, mid + 1, r, rs[i]); +// } +//} +// +//void calc(int u, int fa) { +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// calc(v, u); +// } +// } +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// rootl[u] = merge(1, n, rootl[u], rootl[v]); +// rootr[u] = merge(-n, n, rootr[u], rootr[v]); +// } +// } +// ans[u] = query(dep[u] + arr[u], 1, n, rootl[u]) + query(dep[u] - arr[u], -n, n, rootr[u]); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// dfs(1, 0); +// for (int i = 1, x, y; i <= m; i++) { +// cin >> x >> y; +// int lca = getLca(x, y); +// int lcafa = stjump[lca][0]; +// rootl[x] = add(dep[x], 1, 1, n, rootl[x]); +// rootl[lca] = add(dep[x], -1, 1, n, rootl[lca]); +// rootr[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rootr[y]); +// rootr[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rootr[lcafa]); +// } +// calc(1, 0); +// for (int i = 1; i <= n; i++) { +// cout << ans[i] << ' '; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class181/Code04_NeverLand2.java b/src/class181/Code04_NeverLand2.java new file mode 100644 index 000000000..62fc75866 --- /dev/null +++ b/src/class181/Code04_NeverLand2.java @@ -0,0 +1,122 @@ +package class181; + +// 永无乡,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3224 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXT = MAXN * 40; +//int n, m, q; +//int pos[MAXN]; +// +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int sum[MAXT]; +//int cntt; +// +//int father[MAXN]; +// +//void up(int i) { +// sum[i] = sum[ls[i]] + sum[rs[i]]; +//} +// +//int add(int jobi, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = ++cntt; +// } +// if (l == r) { +// sum[rt]++; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = add(jobi, l, mid, ls[rt]); +// } else { +// rs[rt] = add(jobi, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//int merge(int l, int r, int t1, int t2) { +// if (t1 == 0 || t2 == 0) { +// return t1 + t2; +// } +// if (l == r) { +// sum[t1] += sum[t2]; +// } else { +// int mid = (l + r) >> 1; +// ls[t1] = merge(l, mid, ls[t1], ls[t2]); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); +// up(t1); +// } +// return t1; +//} +// +//int query(int jobk, int l, int r, int i) { +// if (i == 0 || jobk > sum[i]) { +// return -1; +// } +// if (l == r) { +// return pos[l]; +// } +// int mid = (l + r) >> 1; +// if (sum[ls[i]] >= jobk) { +// return query(jobk, l, mid, ls[i]); +// } else { +// return query(jobk - sum[ls[i]], mid + 1, r, rs[i]); +// } +//} +// +//int find(int i) { +// if (i != father[i]) { +// father[i] = find(father[i]); +// } +// return father[i]; +//} +// +//void Union(int x, int y) { +// int xfa = find(x); +// int yfa = find(y); +// if (xfa != yfa) { +// father[xfa] = yfa; +// root[yfa] = merge(1, n, root[yfa], root[xfa]); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, num; i <= n; i++) { +// cin >> num; +// pos[num] = i; +// father[i] = i; +// root[i] = add(num, 1, n, root[i]); +// } +// for (int i = 1, x, y; i <= m; i++) { +// cin >> x >> y; +// Union(x, y); +// } +// cin >> q; +// char op; +// int x, y, k; +// for (int i = 1; i <= q; i++) { +// cin >> op; +// if (op == 'B') { +// cin >> x >> y; +// Union(x, y); +// } else { +// cin >> x >> k; +// cout << query(k, 1, n, root[find(x)]) << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 1068af129406aa8c24b0bbb936e5d40cdfc33f5e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 23 Oct 2025 12:40:16 +0800 Subject: [PATCH 0896/1170] modify code --- src/class181/Code01_PromotionCounting1.java | 6 +----- src/class181/Code01_PromotionCounting2.java | 5 ----- src/class181/Code02_RainyDayTail1.java | 5 ----- src/class181/Code02_RainyDayTail2.java | 5 ----- src/class181/Code03_LoveRunning1.java | 5 ----- src/class181/Code03_LoveRunning2.java | 5 ----- 6 files changed, 1 insertion(+), 30 deletions(-) diff --git a/src/class181/Code01_PromotionCounting1.java b/src/class181/Code01_PromotionCounting1.java index bf8c5d47e..56a7047a5 100644 --- a/src/class181/Code01_PromotionCounting1.java +++ b/src/class181/Code01_PromotionCounting1.java @@ -115,17 +115,13 @@ public static void calc1(int u, int fa) { int v = to[e]; if (v != fa) { calc1(v, u); - } - } - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - if (v != fa) { root[u] = merge(1, cntv, root[u], root[v]); } } ans[u] = query(arr[u] + 1, cntv, 1, cntv, root[u]); } + // 递归函数改迭代需要的栈,不会改去看讲解118 public static int[][] ufe = new int[MAXN][3]; public static int stacksize, u, f, e; diff --git a/src/class181/Code01_PromotionCounting2.java b/src/class181/Code01_PromotionCounting2.java index ce63ac8b9..31e97926d 100644 --- a/src/class181/Code01_PromotionCounting2.java +++ b/src/class181/Code01_PromotionCounting2.java @@ -111,11 +111,6 @@ // int v = to[e]; // if (v != fa) { // calc(v, u); -// } -// } -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// if (v != fa) { // root[u] = merge(1, cntv, root[u], root[v]); // } // } diff --git a/src/class181/Code02_RainyDayTail1.java b/src/class181/Code02_RainyDayTail1.java index 952a33774..b90d4e8d5 100644 --- a/src/class181/Code02_RainyDayTail1.java +++ b/src/class181/Code02_RainyDayTail1.java @@ -176,11 +176,6 @@ public static void calc1(int u, int fa) { int v = to[e]; if (v != fa) { calc1(v, u); - } - } - for (int ei = head[u]; ei > 0; ei = nxt[ei]) { - int v = to[ei]; - if (v != fa) { root[u] = merge(1, MAXV, root[u], root[v]); } } diff --git a/src/class181/Code02_RainyDayTail2.java b/src/class181/Code02_RainyDayTail2.java index 5cff6344d..7b8d67f77 100644 --- a/src/class181/Code02_RainyDayTail2.java +++ b/src/class181/Code02_RainyDayTail2.java @@ -127,11 +127,6 @@ // int v = to[e]; // if (v != fa) { // calc(v, u); -// } -// } -// for (int e = head[u]; e > 0; e = nxt[e]) { -// int v = to[e]; -// if (v != fa) { // root[u] = merge(1, MAXV, root[u], root[v]); // } // } diff --git a/src/class181/Code03_LoveRunning1.java b/src/class181/Code03_LoveRunning1.java index cf1b557b5..f4cee55f3 100644 --- a/src/class181/Code03_LoveRunning1.java +++ b/src/class181/Code03_LoveRunning1.java @@ -180,11 +180,6 @@ public static void calc1(int u, int fa) { int v = to[e]; if (v != fa) { calc1(v, u); - } - } - for (int ei = head[u]; ei > 0; ei = nxt[ei]) { - int v = to[ei]; - if (v != fa) { rootl[u] = merge(1, n, rootl[u], rootl[v]); rootr[u] = merge(-n, n, rootr[u], rootr[v]); } diff --git a/src/class181/Code03_LoveRunning2.java b/src/class181/Code03_LoveRunning2.java index 32bc1781f..78e48ed82 100644 --- a/src/class181/Code03_LoveRunning2.java +++ b/src/class181/Code03_LoveRunning2.java @@ -130,11 +130,6 @@ // int v = to[e]; // if (v != fa) { // calc(v, u); -// } -// } -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// if (v != fa) { // rootl[u] = merge(1, n, rootl[u], rootl[v]); // rootr[u] = merge(-n, n, rootr[u], rootr[v]); // } From 84966e2df122019ea4f0782da1c86b7644896372 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 23 Oct 2025 14:59:21 +0800 Subject: [PATCH 0897/1170] modify code --- src/class181/Code01_PromotionCounting1.java | 5 +++++ src/class181/Code01_PromotionCounting2.java | 5 +++++ src/class181/Code02_RainyDayTail1.java | 14 +++++++++----- src/class181/Code02_RainyDayTail2.java | 16 ++++++++++------ 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/class181/Code01_PromotionCounting1.java b/src/class181/Code01_PromotionCounting1.java index 56a7047a5..5aae1318f 100644 --- a/src/class181/Code01_PromotionCounting1.java +++ b/src/class181/Code01_PromotionCounting1.java @@ -1,6 +1,11 @@ package class181; // 晋升者计数,java版 +// 一共有n个人,给定每个人的能力值arr[i],所有人组成一棵树,代表公司的组织 +// 1号人是整个公司的老板,从2号人开始,给定每个人的上司编号fa[i] +// 打印第i号人为头的子树中,有多少个人的能力值 > 第i号人的能力值,一共n条打印 +// 1 <= n <= 10^5 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3605 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class181/Code01_PromotionCounting2.java b/src/class181/Code01_PromotionCounting2.java index 31e97926d..272c87698 100644 --- a/src/class181/Code01_PromotionCounting2.java +++ b/src/class181/Code01_PromotionCounting2.java @@ -1,6 +1,11 @@ package class181; // 晋升者计数,C++版 +// 一共有n个人,给定每个人的能力值arr[i],所有人组成一棵树,代表公司的组织 +// 1号人是整个公司的老板,从2号人开始,给定每个人的上司编号fa[i] +// 打印第i号人为头的子树中,有多少个人的能力值 > 第i号人的能力值,一共n条打印 +// 1 <= n <= 10^5 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3605 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class181/Code02_RainyDayTail1.java b/src/class181/Code02_RainyDayTail1.java index b90d4e8d5..b0f73e457 100644 --- a/src/class181/Code02_RainyDayTail1.java +++ b/src/class181/Code02_RainyDayTail1.java @@ -1,6 +1,10 @@ package class181; // 雨天的尾巴,java版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 给定m条路径,格式 x y v,表示x到y路径上的每个点都收到一个数字v +// 打印第i号点上,收到次数最多的数字,如果不止一种,打印值最小的数字,一共n条打印 +// 1 <= n、m、v <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4556 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -230,13 +234,13 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= m; i++) { int x = in.nextInt(); int y = in.nextInt(); - int food = in.nextInt(); + int v = in.nextInt(); int lca = getLca(x, y); int lcafa = stjump[lca][0]; - root[x] = add(food, 1, 1, MAXV, root[x]); - root[y] = add(food, 1, 1, MAXV, root[y]); - root[lca] = add(food, -1, 1, MAXV, root[lca]); - root[lcafa] = add(food, -1, 1, MAXV, root[lcafa]); + root[x] = add(v, 1, 1, MAXV, root[x]); + root[y] = add(v, 1, 1, MAXV, root[y]); + root[lca] = add(v, -1, 1, MAXV, root[lca]); + root[lcafa] = add(v, -1, 1, MAXV, root[lcafa]); } // calc1(1, 0); calc2(); diff --git a/src/class181/Code02_RainyDayTail2.java b/src/class181/Code02_RainyDayTail2.java index 7b8d67f77..d8d314622 100644 --- a/src/class181/Code02_RainyDayTail2.java +++ b/src/class181/Code02_RainyDayTail2.java @@ -1,6 +1,10 @@ package class181; // 雨天的尾巴,C++版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 给定m条路径,格式 x y v,表示x到y路径上的每个点都收到一个数字v +// 打印第i号点上,收到次数最多的数字,如果不止一种,打印值最小的数字,一共n条打印 +// 1 <= n、m、v <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4556 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -145,14 +149,14 @@ // addEdge(v, u); // } // dfs(1, 0); -// for (int i = 1, x, y, food; i <= m; i++) { -// cin >> x >> y >> food; +// for (int i = 1, x, y, v; i <= m; i++) { +// cin >> x >> y >> v; // int lca = getLca(x, y); // int lcafa = stjump[lca][0]; -// root[x] = add(food, 1, 1, MAXV, root[x]); -// root[y] = add(food, 1, 1, MAXV, root[y]); -// root[lca] = add(food, -1, 1, MAXV, root[lca]); -// root[lcafa] = add(food, -1, 1, MAXV, root[lcafa]); +// root[x] = add(v, 1, 1, MAXV, root[x]); +// root[y] = add(v, 1, 1, MAXV, root[y]); +// root[lca] = add(v, -1, 1, MAXV, root[lca]); +// root[lcafa] = add(v, -1, 1, MAXV, root[lcafa]); // } // calc(1, 0); // for (int i = 1; i <= n; i++) { From b1fccdc0c4163f519793ff47cb5e98ecbd72eec1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 23 Oct 2025 15:19:42 +0800 Subject: [PATCH 0898/1170] modify code --- src/class181/Code03_LoveRunning1.java | 15 +++++++++++---- src/class181/Code03_LoveRunning2.java | 13 ++++++++++--- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/class181/Code03_LoveRunning1.java b/src/class181/Code03_LoveRunning1.java index f4cee55f3..e64626129 100644 --- a/src/class181/Code03_LoveRunning1.java +++ b/src/class181/Code03_LoveRunning1.java @@ -1,6 +1,13 @@ package class181; // 天天爱跑步,java版 +// 一共有n个点,给定n-1条边,所有节点组成一棵树 +// 每个点上都有一个观察员,给出每个观察员的观测时刻w[i] +// 给出m个跑步者的路线,格式 x y : 该跑步者出发时刻为0,从x跑到y +// 任何跑步者通过任何一条边,耗时都是1秒 +// 某个跑步者到达i号点的时刻 == w[i],那么该跑步者才会被i号点的观察员观测到 +// 打印i号点的观察员,能观测到多少人,一共n条打印 +// 1 <= n、m、w[i] <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P1600 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -15,7 +22,7 @@ public class Code03_LoveRunning1 { public static int MAXT = MAXN * 50; public static int MAXP = 20; public static int n, m; - public static int[] arr = new int[MAXN]; + public static int[] w = new int[MAXN]; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -184,7 +191,7 @@ public static void calc1(int u, int fa) { rootr[u] = merge(-n, n, rootr[u], rootr[v]); } } - ans[u] = query(dep[u] + arr[u], 1, n, rootl[u]) + query(dep[u] - arr[u], -n, n, rootr[u]); + ans[u] = query(dep[u] + w[u], 1, n, rootl[u]) + query(dep[u] - w[u], -n, n, rootr[u]); } // calc1改迭代 @@ -211,7 +218,7 @@ public static void calc2() { rootr[u] = merge(-n, n, rootr[u], rootr[v]); } } - ans[u] = query(dep[u] + arr[u], 1, n, rootl[u]) + query(dep[u] - arr[u], -n, n, rootr[u]); + ans[u] = query(dep[u] + w[u], 1, n, rootl[u]) + query(dep[u] - w[u], -n, n, rootr[u]); } } } @@ -228,7 +235,7 @@ public static void main(String[] args) throws Exception { addEdge(v, u); } for (int i = 1; i <= n; i++) { - arr[i] = in.nextInt(); + w[i] = in.nextInt(); } // dfs1(1, 0); dfs2(); diff --git a/src/class181/Code03_LoveRunning2.java b/src/class181/Code03_LoveRunning2.java index 78e48ed82..529758c7d 100644 --- a/src/class181/Code03_LoveRunning2.java +++ b/src/class181/Code03_LoveRunning2.java @@ -1,6 +1,13 @@ package class181; // 天天爱跑步,C++版 +// 一共有n个点,给定n-1条边,所有节点组成一棵树 +// 每个点上都有一个观察员,给出每个观察员的观测时刻w[i] +// 给出m个跑步者的路线,格式 x y : 该跑步者出发时刻为0,从x跑到y +// 任何跑步者通过任何一条边,耗时都是1秒 +// 某个跑步者到达i号点的时刻 == w[i],那么该跑步者才会被i号点的观察员观测到 +// 打印i号点的观察员,能观测到多少人,一共n条打印 +// 1 <= n、m、w[i] <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P1600 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -13,7 +20,7 @@ //const int MAXT = MAXN * 50; //const int MAXP = 20; //int n, m; -//int arr[MAXN]; +//int w[MAXN]; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -134,7 +141,7 @@ // rootr[u] = merge(-n, n, rootr[u], rootr[v]); // } // } -// ans[u] = query(dep[u] + arr[u], 1, n, rootl[u]) + query(dep[u] - arr[u], -n, n, rootr[u]); +// ans[u] = query(dep[u] + w[u], 1, n, rootl[u]) + query(dep[u] - w[u], -n, n, rootr[u]); //} // //int main() { @@ -147,7 +154,7 @@ // addEdge(v, u); // } // for (int i = 1; i <= n; i++) { -// cin >> arr[i]; +// cin >> w[i]; // } // dfs(1, 0); // for (int i = 1, x, y; i <= m; i++) { From 97aa9dbe5994b63ea503ca5cdeedea042f8995fd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 23 Oct 2025 15:31:56 +0800 Subject: [PATCH 0899/1170] modify code --- src/class181/Code04_NeverLand1.java | 5 +++++ src/class181/Code04_NeverLand2.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/class181/Code04_NeverLand1.java b/src/class181/Code04_NeverLand1.java index b6134e501..02878b9cf 100644 --- a/src/class181/Code04_NeverLand1.java +++ b/src/class181/Code04_NeverLand1.java @@ -1,6 +1,11 @@ package class181; // 永无乡,java版 +// 一共有n个岛,每个岛分配到一个不同的数字,数字范围1~n +// 给定初始的m座桥梁,若干点会连通起来,接下来有q条操作,格式如下 +// 操作 B x y : x号岛和y号岛之间新修建了一座桥 +// 操作 Q x k : x号岛所在的连通区里,打印第k小的数字来自几号岛,不存在打印-1 +// 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3224 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class181/Code04_NeverLand2.java b/src/class181/Code04_NeverLand2.java index 62fc75866..5f99a62da 100644 --- a/src/class181/Code04_NeverLand2.java +++ b/src/class181/Code04_NeverLand2.java @@ -1,6 +1,11 @@ package class181; // 永无乡,C++版 +// 一共有n个岛,每个岛分配到一个不同的数字,数字范围1~n +// 给定初始的m座桥梁,若干点会连通起来,接下来有q条操作,格式如下 +// 操作 B x y : x号岛和y号岛之间新修建了一座桥 +// 操作 Q x k : x号岛所在的连通区里,打印第k小的数字来自几号岛,不存在打印-1 +// 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3224 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 019bb9963a1053d9344948cd2e9d2dfa8210705b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 23 Oct 2025 16:14:33 +0800 Subject: [PATCH 0900/1170] modify code --- src/class181/Code05_MinimizeInversion1.java | 19 ++++++++++++++----- src/class181/Code05_MinimizeInversion2.java | 19 ++++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/class181/Code05_MinimizeInversion1.java b/src/class181/Code05_MinimizeInversion1.java index aaabdb116..7869f72ef 100644 --- a/src/class181/Code05_MinimizeInversion1.java +++ b/src/class181/Code05_MinimizeInversion1.java @@ -1,6 +1,13 @@ package class181; // 最小化逆序对,java版 +// 给定数字n,表示一棵二叉树有n个叶节点,叶节点的权值都不同并且都是1~n范围的数字 +// 树上的任何节点,要么是叶节点,要么一定有两个孩子,请从输入流中不断读取数字x来建树 +// 如果 x != 0,表示当前来到叶节点并且权值为x,注意只有叶节点有权值 +// 如果 x == 0,表示当前来到非叶节点,先递归建立左树,再递归建立右树 +// 输入流保证根据规则可以建好这棵二叉树,你可以任选一些节点,交换这些节点的左右子树 +// 目的是先序遍历整棵树之后,所有叶节点权值组成的序列中,逆序对数量尽可能小,打印这个最小值 +// 2 <= n <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3521 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 @@ -22,7 +29,7 @@ public class Code05_MinimizeInversion1 { public static int[] siz = new int[MAXT]; public static int cntt; - public static long ans, u, v; + public static long ans; public static void up(int i) { siz[i] = siz[ls[i]] + siz[rs[i]]; @@ -44,6 +51,8 @@ public static int build(int jobi, int l, int r) { return rt; } + public static int no, yes; + public static int merge(int l, int r, int t1, int t2) { if (t1 == 0 || t2 == 0) { return t1 + t2; @@ -51,8 +60,8 @@ public static int merge(int l, int r, int t1, int t2) { if (l == r) { siz[t1] += siz[t2]; } else { - u += (long) siz[rs[t1]] * siz[ls[t2]]; - v += (long) siz[ls[t1]] * siz[rs[t2]]; + no += (long) siz[rs[t1]] * siz[ls[t2]]; + yes += (long) siz[ls[t1]] * siz[rs[t2]]; int mid = (l + r) >> 1; ls[t1] = merge(l, mid, ls[t1], ls[t2]); rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); @@ -67,9 +76,9 @@ public static int dfs() throws IOException { if (val == 0) { int left = dfs(); int right = dfs(); - u = v = 0; + no = yes = 0; rt = merge(1, n, left, right); - ans += Math.min(u, v); + ans += Math.min(no, yes); } else { rt = build(val, 1, n); } diff --git a/src/class181/Code05_MinimizeInversion2.java b/src/class181/Code05_MinimizeInversion2.java index a075d1bf1..1f1236380 100644 --- a/src/class181/Code05_MinimizeInversion2.java +++ b/src/class181/Code05_MinimizeInversion2.java @@ -1,6 +1,13 @@ package class181; // 最小化逆序对,C++版 +// 给定数字n,表示一棵二叉树有n个叶节点,叶节点的权值都不同并且都是1~n范围的数字 +// 树上的任何节点,要么是叶节点,要么一定有两个孩子,请从输入流中不断读取数字x来建树 +// 如果 x != 0,表示当前来到叶节点并且权值为x,注意只有叶节点有权值 +// 如果 x == 0,表示当前来到非叶节点,先递归建立左树,再递归建立右树 +// 输入流保证根据规则可以建好这棵二叉树,你可以任选一些节点,交换这些节点的左右子树 +// 目的是先序遍历整棵树之后,所有叶节点权值组成的序列中,逆序对数量尽可能小,打印这个最小值 +// 2 <= n <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3521 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -17,7 +24,7 @@ //int siz[MAXT]; //int cntt; // -//long long ans, u, v; +//long long ans; // //void up(int i) { // siz[i] = siz[ls[i]] + siz[rs[i]]; @@ -39,6 +46,8 @@ // return rt; //} // +//long long no, yes; +// //int merge(int l, int r, int t1, int t2) { // if (t1 == 0 || t2 == 0) { // return t1 + t2; @@ -46,8 +55,8 @@ // if (l == r) { // siz[t1] += siz[t2]; // } else { -// u += 1LL * siz[rs[t1]] * siz[ls[t2]]; -// v += 1LL * siz[ls[t1]] * siz[rs[t2]]; +// no += 1LL * siz[rs[t1]] * siz[ls[t2]]; +// yes += 1LL * siz[ls[t1]] * siz[rs[t2]]; // int mid = (l + r) >> 1; // ls[t1] = merge(l, mid, ls[t1], ls[t2]); // rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); @@ -63,9 +72,9 @@ // if (val == 0) { // int left = dfs(); // int right = dfs(); -// u = v = 0; +// no = yes = 0; // rt = merge(1, n, left, right); -// ans += min(u, v); +// ans += min(no, yes); // } else { // rt = build(val, 1, n); // } From 60fe3a433858556ccd6a16a54e787ebdbb6af77d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 12:15:36 +0800 Subject: [PATCH 0901/1170] modify code --- ...04_NeverLand1.java => Code02_NeverLand1.java} | 16 ++++++++-------- ...04_NeverLand2.java => Code02_NeverLand2.java} | 14 +++++++------- ...nyDayTail1.java => Code03_RainyDayTail1.java} | 2 +- ...nyDayTail2.java => Code03_RainyDayTail2.java} | 0 ...oveRunning1.java => Code04_LoveRunning1.java} | 2 +- ...oveRunning2.java => Code04_LoveRunning2.java} | 0 6 files changed, 17 insertions(+), 17 deletions(-) rename src/class181/{Code04_NeverLand1.java => Code02_NeverLand1.java} (94%) rename src/class181/{Code04_NeverLand2.java => Code02_NeverLand2.java} (92%) rename src/class181/{Code02_RainyDayTail1.java => Code03_RainyDayTail1.java} (99%) rename src/class181/{Code02_RainyDayTail2.java => Code03_RainyDayTail2.java} (100%) rename src/class181/{Code03_LoveRunning1.java => Code04_LoveRunning1.java} (99%) rename src/class181/{Code03_LoveRunning2.java => Code04_LoveRunning2.java} (100%) diff --git a/src/class181/Code04_NeverLand1.java b/src/class181/Code02_NeverLand1.java similarity index 94% rename from src/class181/Code04_NeverLand1.java rename to src/class181/Code02_NeverLand1.java index 02878b9cf..7d0cc7009 100644 --- a/src/class181/Code04_NeverLand1.java +++ b/src/class181/Code02_NeverLand1.java @@ -14,7 +14,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_NeverLand1 { +public class Code02_NeverLand1 { public static int MAXN = 100001; public static int MAXT = MAXN * 40; @@ -24,13 +24,13 @@ public class Code04_NeverLand1 { public static int[] root = new int[MAXN]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; - public static int[] sum = new int[MAXT]; + public static int[] siz = new int[MAXT]; public static int cntt; public static int[] father = new int[MAXN]; public static void up(int i) { - sum[i] = sum[ls[i]] + sum[rs[i]]; + siz[i] = siz[ls[i]] + siz[rs[i]]; } public static int add(int jobi, int l, int r, int i) { @@ -39,7 +39,7 @@ public static int add(int jobi, int l, int r, int i) { rt = ++cntt; } if (l == r) { - sum[rt]++; + siz[rt]++; } else { int mid = (l + r) >> 1; if (jobi <= mid) { @@ -57,7 +57,7 @@ public static int merge(int l, int r, int t1, int t2) { return t1 + t2; } if (l == r) { - sum[t1] += sum[t2]; + siz[t1] += siz[t2]; } else { int mid = (l + r) >> 1; ls[t1] = merge(l, mid, ls[t1], ls[t2]); @@ -68,17 +68,17 @@ public static int merge(int l, int r, int t1, int t2) { } public static int query(int jobk, int l, int r, int i) { - if (i == 0 || jobk > sum[i]) { + if (i == 0 || jobk > siz[i]) { return -1; } if (l == r) { return pos[l]; } int mid = (l + r) >> 1; - if (sum[ls[i]] >= jobk) { + if (siz[ls[i]] >= jobk) { return query(jobk, l, mid, ls[i]); } else { - return query(jobk - sum[ls[i]], mid + 1, r, rs[i]); + return query(jobk - siz[ls[i]], mid + 1, r, rs[i]); } } diff --git a/src/class181/Code04_NeverLand2.java b/src/class181/Code02_NeverLand2.java similarity index 92% rename from src/class181/Code04_NeverLand2.java rename to src/class181/Code02_NeverLand2.java index 5f99a62da..697eadd8f 100644 --- a/src/class181/Code04_NeverLand2.java +++ b/src/class181/Code02_NeverLand2.java @@ -22,13 +22,13 @@ //int root[MAXN]; //int ls[MAXT]; //int rs[MAXT]; -//int sum[MAXT]; +//int siz[MAXT]; //int cntt; // //int father[MAXN]; // //void up(int i) { -// sum[i] = sum[ls[i]] + sum[rs[i]]; +// siz[i] = siz[ls[i]] + siz[rs[i]]; //} // //int add(int jobi, int l, int r, int i) { @@ -37,7 +37,7 @@ // rt = ++cntt; // } // if (l == r) { -// sum[rt]++; +// siz[rt]++; // } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { @@ -55,7 +55,7 @@ // return t1 + t2; // } // if (l == r) { -// sum[t1] += sum[t2]; +// siz[t1] += siz[t2]; // } else { // int mid = (l + r) >> 1; // ls[t1] = merge(l, mid, ls[t1], ls[t2]); @@ -66,17 +66,17 @@ //} // //int query(int jobk, int l, int r, int i) { -// if (i == 0 || jobk > sum[i]) { +// if (i == 0 || jobk > siz[i]) { // return -1; // } // if (l == r) { // return pos[l]; // } // int mid = (l + r) >> 1; -// if (sum[ls[i]] >= jobk) { +// if (siz[ls[i]] >= jobk) { // return query(jobk, l, mid, ls[i]); // } else { -// return query(jobk - sum[ls[i]], mid + 1, r, rs[i]); +// return query(jobk - siz[ls[i]], mid + 1, r, rs[i]); // } //} // diff --git a/src/class181/Code02_RainyDayTail1.java b/src/class181/Code03_RainyDayTail1.java similarity index 99% rename from src/class181/Code02_RainyDayTail1.java rename to src/class181/Code03_RainyDayTail1.java index b0f73e457..2c786e884 100644 --- a/src/class181/Code02_RainyDayTail1.java +++ b/src/class181/Code03_RainyDayTail1.java @@ -13,7 +13,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_RainyDayTail1 { +public class Code03_RainyDayTail1 { public static int MAXN = 100001; public static int MAXV = 100000; diff --git a/src/class181/Code02_RainyDayTail2.java b/src/class181/Code03_RainyDayTail2.java similarity index 100% rename from src/class181/Code02_RainyDayTail2.java rename to src/class181/Code03_RainyDayTail2.java diff --git a/src/class181/Code03_LoveRunning1.java b/src/class181/Code04_LoveRunning1.java similarity index 99% rename from src/class181/Code03_LoveRunning1.java rename to src/class181/Code04_LoveRunning1.java index e64626129..345c71d3a 100644 --- a/src/class181/Code03_LoveRunning1.java +++ b/src/class181/Code04_LoveRunning1.java @@ -16,7 +16,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code03_LoveRunning1 { +public class Code04_LoveRunning1 { public static int MAXN = 300001; public static int MAXT = MAXN * 50; diff --git a/src/class181/Code03_LoveRunning2.java b/src/class181/Code04_LoveRunning2.java similarity index 100% rename from src/class181/Code03_LoveRunning2.java rename to src/class181/Code04_LoveRunning2.java From 549c43174d0ca9766c288ff817d5f16cac34bd4f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 16:44:12 +0800 Subject: [PATCH 0902/1170] modify code --- src/class181/Code02_NeverLand1.java | 3 +-- src/class181/Code02_NeverLand2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class181/Code02_NeverLand1.java b/src/class181/Code02_NeverLand1.java index 7d0cc7009..0a4b60ff9 100644 --- a/src/class181/Code02_NeverLand1.java +++ b/src/class181/Code02_NeverLand1.java @@ -20,6 +20,7 @@ public class Code02_NeverLand1 { public static int MAXT = MAXN * 40; public static int n, m, q; public static int[] pos = new int[MAXN]; + public static int[] father = new int[MAXN]; public static int[] root = new int[MAXN]; public static int[] ls = new int[MAXT]; @@ -27,8 +28,6 @@ public class Code02_NeverLand1 { public static int[] siz = new int[MAXT]; public static int cntt; - public static int[] father = new int[MAXN]; - public static void up(int i) { siz[i] = siz[ls[i]] + siz[rs[i]]; } diff --git a/src/class181/Code02_NeverLand2.java b/src/class181/Code02_NeverLand2.java index 697eadd8f..3f2f33d1f 100644 --- a/src/class181/Code02_NeverLand2.java +++ b/src/class181/Code02_NeverLand2.java @@ -18,6 +18,7 @@ //const int MAXT = MAXN * 40; //int n, m, q; //int pos[MAXN]; +//int father[MAXN]; // //int root[MAXN]; //int ls[MAXT]; @@ -25,8 +26,6 @@ //int siz[MAXT]; //int cntt; // -//int father[MAXN]; -// //void up(int i) { // siz[i] = siz[ls[i]] + siz[rs[i]]; //} From 49a747976d363993010b3822a3d368b437bced54 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 16:46:02 +0800 Subject: [PATCH 0903/1170] modify code --- src/class181/Code02_NeverLand1.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/class181/Code02_NeverLand1.java b/src/class181/Code02_NeverLand1.java index 0a4b60ff9..a0ba7a974 100644 --- a/src/class181/Code02_NeverLand1.java +++ b/src/class181/Code02_NeverLand1.java @@ -19,9 +19,13 @@ public class Code02_NeverLand1 { public static int MAXN = 100001; public static int MAXT = MAXN * 40; public static int n, m, q; + + // pos[v] = i,表示数字v属于第i号岛 public static int[] pos = new int[MAXN]; + // 并查集 public static int[] father = new int[MAXN]; + // 权值线段树 public static int[] root = new int[MAXN]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; From 32f7abf77aebd9b62cfcbc209926a2024cf30f7d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 17:09:53 +0800 Subject: [PATCH 0904/1170] modify code --- src/class181/Code03_RainyDayTail1.java | 4 +++- src/class181/Code03_RainyDayTail2.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/class181/Code03_RainyDayTail1.java b/src/class181/Code03_RainyDayTail1.java index 2c786e884..6ab8187ac 100644 --- a/src/class181/Code03_RainyDayTail1.java +++ b/src/class181/Code03_RainyDayTail1.java @@ -3,7 +3,9 @@ // 雨天的尾巴,java版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树 // 给定m条路径,格式 x y v,表示x到y路径上的每个点都收到一个数字v -// 打印第i号点上,收到次数最多的数字,如果不止一种,打印值最小的数字,一共n条打印 +// 打印第i号点上,收到次数最多的数字,如果不止一种,打印值最小的数字 +// 如果某节点没有收到过数字,打印0 +// 一共n条打印 // 1 <= n、m、v <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4556 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class181/Code03_RainyDayTail2.java b/src/class181/Code03_RainyDayTail2.java index d8d314622..d29b0d4fa 100644 --- a/src/class181/Code03_RainyDayTail2.java +++ b/src/class181/Code03_RainyDayTail2.java @@ -3,7 +3,9 @@ // 雨天的尾巴,C++版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树 // 给定m条路径,格式 x y v,表示x到y路径上的每个点都收到一个数字v -// 打印第i号点上,收到次数最多的数字,如果不止一种,打印值最小的数字,一共n条打印 +// 打印第i号点上,收到次数最多的数字,如果不止一种,打印值最小的数字 +// 如果某节点没有收到过数字,打印0 +// 一共n条打印 // 1 <= n、m、v <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4556 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 461eaedd163b233e8dc25fd0059871b826225b72 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 17:16:03 +0800 Subject: [PATCH 0905/1170] modify code --- src/class181/Code03_RainyDayTail1.java | 8 ++++++-- src/class181/Code03_RainyDayTail2.java | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/class181/Code03_RainyDayTail1.java b/src/class181/Code03_RainyDayTail1.java index 6ab8187ac..5a112cfa3 100644 --- a/src/class181/Code03_RainyDayTail1.java +++ b/src/class181/Code03_RainyDayTail1.java @@ -185,7 +185,9 @@ public static void calc1(int u, int fa) { root[u] = merge(1, MAXV, root[u], root[v]); } } - if (maxCnt[root[u]] > 0) { + if (maxCnt[root[u]] == 0) { + ans[u] = 0; + } else { ans[u] = query(1, MAXV, root[u]); } } @@ -213,7 +215,9 @@ public static void calc2() { root[u] = merge(1, MAXV, root[u], root[v]); } } - if (maxCnt[root[u]] > 0) { + if (maxCnt[root[u]] == 0) { + ans[u] = 0; + } else { ans[u] = query(1, MAXV, root[u]); } } diff --git a/src/class181/Code03_RainyDayTail2.java b/src/class181/Code03_RainyDayTail2.java index d29b0d4fa..336679884 100644 --- a/src/class181/Code03_RainyDayTail2.java +++ b/src/class181/Code03_RainyDayTail2.java @@ -136,7 +136,9 @@ // root[u] = merge(1, MAXV, root[u], root[v]); // } // } -// if (root[u] && maxCnt[root[u]] > 0) { +// if (maxCnt[root[u]] == 0) { +// ans[u] = 0; +// } else { // ans[u] = query(1, MAXV, root[u]); // } //} From ec0c18d32a61286107cc5a71830b0b8ad256cef8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 17:54:32 +0800 Subject: [PATCH 0906/1170] modify code --- src/class181/Code03_RainyDayTail1.java | 2 +- src/class181/Code03_RainyDayTail2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class181/Code03_RainyDayTail1.java b/src/class181/Code03_RainyDayTail1.java index 5a112cfa3..535dd6983 100644 --- a/src/class181/Code03_RainyDayTail1.java +++ b/src/class181/Code03_RainyDayTail1.java @@ -169,7 +169,7 @@ public static int query(int l, int r, int i) { return l; } int mid = (l + r) >> 1; - if (maxCnt[i] == maxCnt[ls[i]]) { + if (maxCnt[ls[i]] >= maxCnt[rs[i]]) { return query(l, mid, ls[i]); } else { return query(mid + 1, r, rs[i]); diff --git a/src/class181/Code03_RainyDayTail2.java b/src/class181/Code03_RainyDayTail2.java index 336679884..5de5192df 100644 --- a/src/class181/Code03_RainyDayTail2.java +++ b/src/class181/Code03_RainyDayTail2.java @@ -121,7 +121,7 @@ // return l; // } // int mid = (l + r) >> 1; -// if (maxCnt[i] == maxCnt[ls[i]]) { +// if (maxCnt[ls[i]] >= maxCnt[rs[i]]) { // return query(l, mid, ls[i]); // } else { // return query(mid + 1, r, rs[i]); From dd55e95a6808543be7140c818a0690d59f929647 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 18:57:12 +0800 Subject: [PATCH 0907/1170] modify code --- src/class181/Code04_LoveRunning1.java | 24 ++++++++++++------------ src/class181/Code04_LoveRunning2.java | 18 +++++++++--------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/class181/Code04_LoveRunning1.java b/src/class181/Code04_LoveRunning1.java index 345c71d3a..45f75cd2f 100644 --- a/src/class181/Code04_LoveRunning1.java +++ b/src/class181/Code04_LoveRunning1.java @@ -32,8 +32,8 @@ public class Code04_LoveRunning1 { public static int[] dep = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXP]; - public static int[] rootl = new int[MAXN]; - public static int[] rootr = new int[MAXN]; + public static int[] rtUp = new int[MAXN]; + public static int[] rtDown = new int[MAXN]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static int[] sum = new int[MAXT]; @@ -187,11 +187,11 @@ public static void calc1(int u, int fa) { int v = to[e]; if (v != fa) { calc1(v, u); - rootl[u] = merge(1, n, rootl[u], rootl[v]); - rootr[u] = merge(-n, n, rootr[u], rootr[v]); + rtUp[u] = merge(1, n, rtUp[u], rtUp[v]); + rtDown[u] = merge(-n, n, rtDown[u], rtDown[v]); } } - ans[u] = query(dep[u] + w[u], 1, n, rootl[u]) + query(dep[u] - w[u], -n, n, rootr[u]); + ans[u] = query(dep[u] + w[u], 1, n, rtUp[u]) + query(dep[u] - w[u], -n, n, rtDown[u]); } // calc1改迭代 @@ -214,11 +214,11 @@ public static void calc2() { for (int ei = head[u]; ei > 0; ei = nxt[ei]) { int v = to[ei]; if (v != f) { - rootl[u] = merge(1, n, rootl[u], rootl[v]); - rootr[u] = merge(-n, n, rootr[u], rootr[v]); + rtUp[u] = merge(1, n, rtUp[u], rtUp[v]); + rtDown[u] = merge(-n, n, rtDown[u], rtDown[v]); } } - ans[u] = query(dep[u] + w[u], 1, n, rootl[u]) + query(dep[u] - w[u], -n, n, rootr[u]); + ans[u] = query(dep[u] + w[u], 1, n, rtUp[u]) + query(dep[u] - w[u], -n, n, rtDown[u]); } } } @@ -244,10 +244,10 @@ public static void main(String[] args) throws Exception { int y = in.nextInt(); int lca = getLca(x, y); int lcafa = stjump[lca][0]; - rootl[x] = add(dep[x], 1, 1, n, rootl[x]); - rootl[lca] = add(dep[x], -1, 1, n, rootl[lca]); - rootr[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rootr[y]); - rootr[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rootr[lcafa]); + rtUp[x] = add(dep[x], 1, 1, n, rtUp[x]); + rtUp[lca] = add(dep[x], -1, 1, n, rtUp[lca]); + rtDown[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rtDown[y]); + rtDown[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rtDown[lcafa]); } // calc1(1, 0); calc2(); diff --git a/src/class181/Code04_LoveRunning2.java b/src/class181/Code04_LoveRunning2.java index 529758c7d..4cc914669 100644 --- a/src/class181/Code04_LoveRunning2.java +++ b/src/class181/Code04_LoveRunning2.java @@ -29,8 +29,8 @@ // //int dep[MAXN]; //int stjump[MAXN][MAXP]; -//int rootl[MAXN]; -//int rootr[MAXN]; +//int rtUp[MAXN]; +//int rtDown[MAXN]; //int ls[MAXT]; //int rs[MAXT]; //int sum[MAXT]; @@ -137,11 +137,11 @@ // int v = to[e]; // if (v != fa) { // calc(v, u); -// rootl[u] = merge(1, n, rootl[u], rootl[v]); -// rootr[u] = merge(-n, n, rootr[u], rootr[v]); +// rtUp[u] = merge(1, n, rtUp[u], rtUp[v]); +// rtDown[u] = merge(-n, n, rtDown[u], rtDown[v]); // } // } -// ans[u] = query(dep[u] + w[u], 1, n, rootl[u]) + query(dep[u] - w[u], -n, n, rootr[u]); +// ans[u] = query(dep[u] + w[u], 1, n, rtUp[u]) + query(dep[u] - w[u], -n, n, rtDown[u]); //} // //int main() { @@ -161,10 +161,10 @@ // cin >> x >> y; // int lca = getLca(x, y); // int lcafa = stjump[lca][0]; -// rootl[x] = add(dep[x], 1, 1, n, rootl[x]); -// rootl[lca] = add(dep[x], -1, 1, n, rootl[lca]); -// rootr[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rootr[y]); -// rootr[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rootr[lcafa]); +// rtUp[x] = add(dep[x], 1, 1, n, rtUp[x]); +// rtUp[lca] = add(dep[x], -1, 1, n, rtUp[lca]); +// rtDown[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rtDown[y]); +// rtDown[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rtDown[lcafa]); // } // calc(1, 0); // for (int i = 1; i <= n; i++) { From b64c2087b521b980cef1b440bf04dbc1cc46f904 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 19:41:56 +0800 Subject: [PATCH 0908/1170] modify code --- src/class181/Code04_LoveRunning1.java | 4 ++-- src/class181/Code04_LoveRunning2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class181/Code04_LoveRunning1.java b/src/class181/Code04_LoveRunning1.java index 45f75cd2f..2ae3e89a4 100644 --- a/src/class181/Code04_LoveRunning1.java +++ b/src/class181/Code04_LoveRunning1.java @@ -245,9 +245,9 @@ public static void main(String[] args) throws Exception { int lca = getLca(x, y); int lcafa = stjump[lca][0]; rtUp[x] = add(dep[x], 1, 1, n, rtUp[x]); - rtUp[lca] = add(dep[x], -1, 1, n, rtUp[lca]); + rtUp[lcafa] = add(dep[x], -1, 1, n, rtUp[lcafa]); rtDown[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rtDown[y]); - rtDown[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rtDown[lcafa]); + rtDown[lca] = add(2 * dep[lca] - dep[x], -1, -n, n, rtDown[lca]); } // calc1(1, 0); calc2(); diff --git a/src/class181/Code04_LoveRunning2.java b/src/class181/Code04_LoveRunning2.java index 4cc914669..404b44cf8 100644 --- a/src/class181/Code04_LoveRunning2.java +++ b/src/class181/Code04_LoveRunning2.java @@ -162,9 +162,9 @@ // int lca = getLca(x, y); // int lcafa = stjump[lca][0]; // rtUp[x] = add(dep[x], 1, 1, n, rtUp[x]); -// rtUp[lca] = add(dep[x], -1, 1, n, rtUp[lca]); +// rtUp[lcafa] = add(dep[x], -1, 1, n, rtUp[lcafa]); // rtDown[y] = add(2 * dep[lca] - dep[x], 1, -n, n, rtDown[y]); -// rtDown[lcafa] = add(2 * dep[lca] - dep[x], -1, -n, n, rtDown[lcafa]); +// rtDown[lca] = add(2 * dep[lca] - dep[x], -1, -n, n, rtDown[lca]); // } // calc(1, 0); // for (int i = 1; i <= n; i++) { From c9f819f933b3d919f6917a09da562d6ab3b1c4b0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 22:08:01 +0800 Subject: [PATCH 0909/1170] modify code --- src/class181/Code05_MinimizeInversion1.java | 2 +- src/class181/Code05_MinimizeInversion2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class181/Code05_MinimizeInversion1.java b/src/class181/Code05_MinimizeInversion1.java index 7869f72ef..a30fb0386 100644 --- a/src/class181/Code05_MinimizeInversion1.java +++ b/src/class181/Code05_MinimizeInversion1.java @@ -61,7 +61,7 @@ public static int merge(int l, int r, int t1, int t2) { siz[t1] += siz[t2]; } else { no += (long) siz[rs[t1]] * siz[ls[t2]]; - yes += (long) siz[ls[t1]] * siz[rs[t2]]; + yes += (long) siz[rs[t2]] * siz[ls[t1]]; int mid = (l + r) >> 1; ls[t1] = merge(l, mid, ls[t1], ls[t2]); rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); diff --git a/src/class181/Code05_MinimizeInversion2.java b/src/class181/Code05_MinimizeInversion2.java index 1f1236380..e75badee4 100644 --- a/src/class181/Code05_MinimizeInversion2.java +++ b/src/class181/Code05_MinimizeInversion2.java @@ -56,7 +56,7 @@ // siz[t1] += siz[t2]; // } else { // no += 1LL * siz[rs[t1]] * siz[ls[t2]]; -// yes += 1LL * siz[ls[t1]] * siz[rs[t2]]; +// yes += 1LL * siz[rs[t2]] * siz[ls[t1]]; // int mid = (l + r) >> 1; // ls[t1] = merge(l, mid, ls[t1], ls[t2]); // rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); From 1b98003614d7cb697bb6e9a98a9ccb7507157178 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 24 Oct 2025 22:51:24 +0800 Subject: [PATCH 0910/1170] modify code --- ...6\345\210\206\350\243\202-\344\270\212.pptx" | Bin 0 -> 47709 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243181\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\350\243\202-\344\270\212.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243181\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\350\243\202-\344\270\212.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243181\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\350\243\202-\344\270\212.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..0144dd136b363a6e2cde5f63071d236c0e661af9 GIT binary patch literal 47709 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 VG{DzzU{xaU)B(QK|1A3T?mrfxs>}cY literal 0 HcmV?d00001 From e3f972e851647c5d33ca7032f6528bb1ba0df336 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 13:22:10 +0800 Subject: [PATCH 0911/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index fc8c50922..2e69a2e84 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -40,7 +40,9 @@ public static void up(int i) { } public static void lazy(int i, int v) { - // 如果区间信息不存在,说明没有建立过dp信息,那么不需要加v + // 如果区间信息不存在 + // 说明没有建立过dp信息 + // 那么不需要增加v if (i != 0) { max[i] += v; addTag[i] += v; From b9df1c3c26f7e28a91ae57f2f2808aeb4c9d32d6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 14:07:20 +0800 Subject: [PATCH 0912/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 23 ++++++++++++++++------- src/class182/Code02_Minimax1.java | 25 +++++++++++++++++++------ src/class182/Code02_Minimax2.java | 20 +++++++++++++++----- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index 2e69a2e84..285673d69 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -77,24 +77,32 @@ public static int add(int jobi, int jobv, int l, int r, int i) { return rt; } - public static int merge(int l, int r, int t1, int t2, int rmax1, int rmax2) { + public static int max1, max2; + + public static int merge(int l, int r, int t1, int t2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { - lazy(t1, rmax2); + lazy(t1, max2); } if (t2 != 0) { - lazy(t2, rmax1); + lazy(t2, max1); } return t1 + t2; } if (l == r) { - max[t1] = Math.max(max[t1], rmax1) + Math.max(max[t2], rmax2); + max[t1] = Math.max(max[t1], max1) + Math.max(max[t2], max2); } else { down(t1); down(t2); int mid = (l + r) >> 1; - ls[t1] = merge(l, mid, ls[t1], ls[t2], Math.max(max[rs[t1]], rmax1), Math.max(max[rs[t2]], rmax2)); - rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], rmax1, rmax2); + int tmp1 = max1; + int tmp2 = max2; + max1 = Math.max(max1, max[rs[t1]]); + max2 = Math.max(max2, max[rs[t2]]); + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + max1 = tmp1; + max2 = tmp2; + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); up(t1); } return t1; @@ -125,7 +133,8 @@ public static void dp(int u) { int v = to[e]; dp(v); val += query(arr[u], MAXV, 1, MAXV, root[v]); - root[u] = merge(1, MAXV, root[u], root[v], 0, 0); + max1 = max2 = 0; + root[u] = merge(1, MAXV, root[u], root[v]); } root[u] = add(arr[u], val, 1, MAXV, root[u]); } diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index cd6e41755..0e672377a 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -103,7 +103,9 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } - public static int merge(int l, int r, int t1, int t2, long v, long mul1, long mul2) { + public static long v, mul1, mul2; + + public static int merge(int l, int r, int t1, int t2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { lazy(t1, mul1); @@ -124,9 +126,14 @@ public static int merge(int l, int r, int t1, int t2, long v, long mul1, long mu long rsum1 = sum[rs1]; long lsum2 = sum[ls2]; long rsum2 = sum[rs2]; - long tmp = (1 - v + MOD) % MOD; - ls[t1] = merge(l, mid, ls1, ls2, v, (mul1 + rsum2 * tmp) % MOD, (mul2 + rsum1 * tmp) % MOD); - rs[t1] = merge(mid + 1, r, rs1, rs2, v, (mul1 + lsum2 * v) % MOD, (mul2 + lsum1 * v) % MOD); + long tmp1 = mul1; + long tmp2 = mul2; + mul1 = (tmp1 + rsum2 * (1 - v + MOD) % MOD) % MOD; + mul2 = (tmp2 + rsum1 * (1 - v + MOD) % MOD) % MOD; + ls[t1] = merge(l, mid, ls1, ls2); + mul1 = (tmp1 + lsum2 * v) % MOD; + mul2 = (tmp2 + lsum1 * v) % MOD; + rs[t1] = merge(mid + 1, r, rs1, rs2); up(t1); return t1; } @@ -141,7 +148,10 @@ public static void dfs1(int u) { } else { dfs1(child[u][0]); dfs1(child[u][1]); - root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); + v = val[u]; + mul1 = 0; + mul2 = 0; + root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); } } @@ -174,7 +184,10 @@ public static void dfs2() { stack[++siz][0] = child[u][0]; stack[siz][1] = 0; } else { - root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); + v = val[u]; + mul1 = 0; + mul2 = 0; + root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); } } } diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 5b72e3eff..53eb2e289 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -98,7 +98,9 @@ // return rt; //} // -//int merge(int l, int r, int t1, int t2, long long v, long long mul1, long long mul2) { +//long long v, mul1, mul2; +// +//int merge(int l, int r, int t1, int t2) { // if (t1 == 0 || t2 == 0) { // if (t1) { // lazy(t1, mul1); @@ -119,9 +121,14 @@ // long long rsum1 = sum[rs1]; // long long lsum2 = sum[ls2]; // long long rsum2 = sum[rs2]; -// long long tmp = (1 - v + MOD) % MOD; -// ls[t1] = merge(l, mid, ls1, ls2, v, (mul1 + rsum2 * tmp) % MOD, (mul2 + rsum1 * tmp) % MOD); -// rs[t1] = merge(mid + 1, r, rs1, rs2, v, (mul1 + lsum2 * v) % MOD, (mul2 + lsum1 * v) % MOD); +// long long tmp1 = mul1; +// long long tmp2 = mul2; +// mul1 = (tmp1 + rsum2 * (1 - v + MOD) % MOD) % MOD; +// mul2 = (tmp2 + rsum1 * (1 - v + MOD) % MOD) % MOD; +// ls[t1] = merge(l, mid, ls1, ls2); +// mul1 = (tmp1 + lsum2 * v) % MOD; +// mul2 = (tmp2 + lsum1 * v) % MOD; +// rs[t1] = merge(mid + 1, r, rs1, rs2); // up(t1); // return t1; //} @@ -135,7 +142,10 @@ // } else { // dfs(child[u][0]); // dfs(child[u][1]); -// root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); +// v = val[u]; +// mul1 = 0; +// mul2 = 0; +// root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); // } //} // From b441efc31818ab1c09179c1d16afeff49738a631 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 15:04:00 +0800 Subject: [PATCH 0913/1170] modify code --- src/class182/Code02_Minimax1.java | 12 ++++++------ src/class182/Code02_Minimax2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 0e672377a..e859e7082 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -126,13 +126,13 @@ public static int merge(int l, int r, int t1, int t2) { long rsum1 = sum[rs1]; long lsum2 = sum[ls2]; long rsum2 = sum[rs2]; - long tmp1 = mul1; - long tmp2 = mul2; - mul1 = (tmp1 + rsum2 * (1 - v + MOD) % MOD) % MOD; - mul2 = (tmp2 + rsum1 * (1 - v + MOD) % MOD) % MOD; + long m1 = mul1; + long m2 = mul2; + mul1 = (m1 + rsum2 * (1 - v + MOD) % MOD) % MOD; + mul2 = (m2 + rsum1 * (1 - v + MOD) % MOD) % MOD; ls[t1] = merge(l, mid, ls1, ls2); - mul1 = (tmp1 + lsum2 * v) % MOD; - mul2 = (tmp2 + lsum1 * v) % MOD; + mul1 = (m1 + lsum2 * v) % MOD; + mul2 = (m2 + lsum1 * v) % MOD; rs[t1] = merge(mid + 1, r, rs1, rs2); up(t1); return t1; diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 53eb2e289..6af6a8cc1 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -121,13 +121,13 @@ // long long rsum1 = sum[rs1]; // long long lsum2 = sum[ls2]; // long long rsum2 = sum[rs2]; -// long long tmp1 = mul1; -// long long tmp2 = mul2; -// mul1 = (tmp1 + rsum2 * (1 - v + MOD) % MOD) % MOD; -// mul2 = (tmp2 + rsum1 * (1 - v + MOD) % MOD) % MOD; +// long long m1 = mul1; +// long long m2 = mul2; +// mul1 = (m1 + rsum2 * (1 - v + MOD) % MOD) % MOD; +// mul2 = (m2 + rsum1 * (1 - v + MOD) % MOD) % MOD; // ls[t1] = merge(l, mid, ls1, ls2); -// mul1 = (tmp1 + lsum2 * v) % MOD; -// mul2 = (tmp2 + lsum1 * v) % MOD; +// mul1 = (m1 + lsum2 * v) % MOD; +// mul2 = (m2 + lsum1 * v) % MOD; // rs[t1] = merge(mid + 1, r, rs1, rs2); // up(t1); // return t1; From 093b4d94641fdf45670b385b8284952dbe8122b0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 15:15:58 +0800 Subject: [PATCH 0914/1170] modify code --- src/class182/Code02_Minimax1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index e859e7082..ea060869a 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -157,7 +157,7 @@ public static void dfs1(int u) { // dfs1改成迭代版 public static void dfs2() { - int[][] stack = new int[n][2]; + int[][] stack = new int[n + 1][2]; int siz = 0; stack[++siz][0] = 1; stack[siz][1] = 0; From ecd695adc3a4026f479cd173138d270c51870942 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 16:06:27 +0800 Subject: [PATCH 0915/1170] modify code --- src/class182/Code02_Minimax1.java | 25 +++++++++++-------------- src/class182/Code02_Minimax2.java | 12 ++++++------ 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index ea060869a..d4add03ec 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -2,10 +2,7 @@ // 根节点的概率,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5298 -// 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code02_Minimax2文件就是C++的实现 -// 两个版本的逻辑完全一样,C++版本可以通过所有测试 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; @@ -15,9 +12,9 @@ public class Code02_Minimax1 { - public static int MAXN = 300001; - public static int MAXT = MAXN * 40; - public static int MOD = 998244353; + public static final int MAXN = 300001; + public static final int MAXT = MAXN * 40; + public static final int MOD = 998244353; public static int n; public static int[] fa = new int[MAXN]; @@ -103,7 +100,7 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } - public static long v, mul1, mul2; + public static long p, mul1, mul2; public static int merge(int l, int r, int t1, int t2) { if (t1 == 0 || t2 == 0) { @@ -128,11 +125,11 @@ public static int merge(int l, int r, int t1, int t2) { long rsum2 = sum[rs2]; long m1 = mul1; long m2 = mul2; - mul1 = (m1 + rsum2 * (1 - v + MOD) % MOD) % MOD; - mul2 = (m2 + rsum1 * (1 - v + MOD) % MOD) % MOD; + mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; + mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; ls[t1] = merge(l, mid, ls1, ls2); - mul1 = (m1 + lsum2 * v) % MOD; - mul2 = (m2 + lsum1 * v) % MOD; + mul1 = (m1 + lsum2 * p) % MOD; + mul2 = (m2 + lsum1 * p) % MOD; rs[t1] = merge(mid + 1, r, rs1, rs2); up(t1); return t1; @@ -148,7 +145,7 @@ public static void dfs1(int u) { } else { dfs1(child[u][0]); dfs1(child[u][1]); - v = val[u]; + p = val[u]; mul1 = 0; mul2 = 0; root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); @@ -184,7 +181,7 @@ public static void dfs2() { stack[++siz][0] = child[u][0]; stack[siz][1] = 0; } else { - v = val[u]; + p = val[u]; mul1 = 0; mul2 = 0; root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 6af6a8cc1..5d95d92e9 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -98,7 +98,7 @@ // return rt; //} // -//long long v, mul1, mul2; +//long long p, mul1, mul2; // //int merge(int l, int r, int t1, int t2) { // if (t1 == 0 || t2 == 0) { @@ -123,11 +123,11 @@ // long long rsum2 = sum[rs2]; // long long m1 = mul1; // long long m2 = mul2; -// mul1 = (m1 + rsum2 * (1 - v + MOD) % MOD) % MOD; -// mul2 = (m2 + rsum1 * (1 - v + MOD) % MOD) % MOD; +// mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; +// mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; // ls[t1] = merge(l, mid, ls1, ls2); -// mul1 = (m1 + lsum2 * v) % MOD; -// mul2 = (m2 + lsum1 * v) % MOD; +// mul1 = (m1 + lsum2 * p) % MOD; +// mul2 = (m2 + lsum1 * p) % MOD; // rs[t1] = merge(mid + 1, r, rs1, rs2); // up(t1); // return t1; @@ -142,7 +142,7 @@ // } else { // dfs(child[u][0]); // dfs(child[u][1]); -// v = val[u]; +// p = val[u]; // mul1 = 0; // mul2 = 0; // root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); From f43294305c6036d2e9329e4c7ab42bb02bbb77c5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 16:09:53 +0800 Subject: [PATCH 0916/1170] modify code --- src/class182/Code02_Minimax1.java | 4 ++-- src/class182/Code03_Fate1.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index d4add03ec..3d8281839 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -12,8 +12,8 @@ public class Code02_Minimax1 { - public static final int MAXN = 300001; - public static final int MAXT = MAXN * 40; + public static int MAXN = 300001; + public static int MAXT = MAXN * 40; public static final int MOD = 998244353; public static int n; diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index e0d6f6cd7..516d86d1a 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -11,7 +11,7 @@ public class Code03_Fate1 { public static int MAXN = 500001; public static int MAXT = MAXN * 40; - public static int MOD = 998244353; + public static final int MOD = 998244353; public static int n, m; public static int[] head = new int[MAXN]; From 85d07473c49d67eebb59af301496add2c23b625b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 16:23:17 +0800 Subject: [PATCH 0917/1170] modify code --- src/class182/Code02_Minimax1.java | 16 ++++++---------- src/class182/Code02_Minimax2.java | 16 ++++++---------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 3d8281839..c919ed152 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -115,22 +115,18 @@ public static int merge(int l, int r, int t1, int t2) { down(t1); down(t2); int mid = (l + r) >> 1; - int ls1 = ls[t1]; - int rs1 = rs[t1]; - int ls2 = ls[t2]; - int rs2 = rs[t2]; - long lsum1 = sum[ls1]; - long rsum1 = sum[rs1]; - long lsum2 = sum[ls2]; - long rsum2 = sum[rs2]; + long lsum1 = sum[ls[t1]]; + long rsum1 = sum[rs[t1]]; + long lsum2 = sum[ls[t2]]; + long rsum2 = sum[rs[t2]]; long m1 = mul1; long m2 = mul2; mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; - ls[t1] = merge(l, mid, ls1, ls2); + ls[t1] = merge(l, mid, ls[t1], ls[t2]); mul1 = (m1 + lsum2 * p) % MOD; mul2 = (m2 + lsum1 * p) % MOD; - rs[t1] = merge(mid + 1, r, rs1, rs2); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); up(t1); return t1; } diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 5d95d92e9..b0366abe0 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -113,22 +113,18 @@ // down(t1); // down(t2); // int mid = (l + r) >> 1; -// int ls1 = ls[t1]; -// int rs1 = rs[t1]; -// int ls2 = ls[t2]; -// int rs2 = rs[t2]; -// long long lsum1 = sum[ls1]; -// long long rsum1 = sum[rs1]; -// long long lsum2 = sum[ls2]; -// long long rsum2 = sum[rs2]; +// long long lsum1 = sum[ls[t1]]; +// long long rsum1 = sum[rs[t1]]; +// long long lsum2 = sum[ls[t2]]; +// long long rsum2 = sum[rs[t2]]; // long long m1 = mul1; // long long m2 = mul2; // mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; // mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; -// ls[t1] = merge(l, mid, ls1, ls2); +// ls[t1] = merge(l, mid, ls[t1], ls[t2]); // mul1 = (m1 + lsum2 * p) % MOD; // mul2 = (m2 + lsum1 * p) % MOD; -// rs[t1] = merge(mid + 1, r, rs1, rs2); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); // up(t1); // return t1; //} From d24a6367a565fe06368faf5e580cedfa5fdc27e8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 16:48:47 +0800 Subject: [PATCH 0918/1170] modify code --- src/class182/Code02_Minimax1.java | 12 ++++++------ src/class182/Code02_Minimax2.java | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index c919ed152..a3994f793 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -79,21 +79,21 @@ public static void down(int i) { } } - public static int update(int jobi, int jobv, int l, int r, int i) { + public static int insert(int jobi, int l, int r, int i) { int rt = i; if (rt == 0) { rt = ++cntt; mul[rt] = 1; } if (l == r) { - sum[rt] = jobv % MOD; + sum[rt] = 1; } else { down(rt); int mid = (l + r) >> 1; if (jobi <= mid) { - ls[rt] = update(jobi, jobv, l, mid, ls[rt]); + ls[rt] = insert(jobi, l, mid, ls[rt]); } else { - rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); + rs[rt] = insert(jobi, mid + 1, r, rs[rt]); } up(rt); } @@ -134,7 +134,7 @@ public static int merge(int l, int r, int t1, int t2) { // 迭代版,java会爆栈,C++可以通过 public static void dfs1(int u) { if (childCnt[u] == 0) { - root[u] = update(val[u], 1, 1, cntv, root[u]); + root[u] = insert(val[u], 1, cntv, root[u]); } else if (childCnt[u] == 1) { dfs1(child[u][0]); root[u] = root[child[u][0]]; @@ -158,7 +158,7 @@ public static void dfs2() { int u = stack[siz][0]; int s = stack[siz--][1]; if (childCnt[u] == 0) { - root[u] = update(val[u], 1, 1, cntv, root[u]); + root[u] = insert(val[u], 1, cntv, root[u]); } else if (childCnt[u] == 1) { if (s == 0) { stack[++siz][0] = u; diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index b0366abe0..017d2a5fb 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -77,21 +77,21 @@ // } //} // -//int update(int jobi, int jobv, int l, int r, int i) { +//int insert(int jobi, int l, int r, int i) { // int rt = i; // if (rt == 0) { // rt = ++cntt; // mul[rt] = 1; // } // if (l == r) { -// sum[rt] = jobv % MOD; +// sum[rt] = 1; // } else { // down(rt); // int mid = (l + r) >> 1; // if (jobi <= mid) { -// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); +// ls[rt] = insert(jobi, l, mid, ls[rt]); // } else { -// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); +// rs[rt] = insert(jobi, mid + 1, r, rs[rt]); // } // up(rt); // } @@ -131,7 +131,7 @@ // //void dfs(int u) { // if (childCnt[u] == 0) { -// root[u] = update(val[u], 1, 1, cntv, root[u]); +// root[u] = insert(val[u], 1, cntv, root[u]); // } else if (childCnt[u] == 1) { // dfs(child[u][0]); // root[u] = root[child[u][0]]; From 71731635132df000c2ba3293dd556248ad307f2d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 16:59:17 +0800 Subject: [PATCH 0919/1170] modify code --- src/class182/Code03_Fate1.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index 516d86d1a..2e21df09b 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -6,6 +6,8 @@ import java.io.IOException; import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; public class Code03_Fate1 { @@ -215,6 +217,7 @@ public static void dp2() { public static void main(String[] args) throws IOException { FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); for (int i = 1, u, v; i < n; i++) { u = in.nextInt(); @@ -233,7 +236,9 @@ public static void main(String[] args) throws IOException { // dp1(1, 0); dp2(); long ans = query(0, 0, 0, n, root[1]) % MOD; - System.out.println(ans); + out.println(ans); + out.flush(); + out.close(); } // 读写工具类 From 0cf9f10209e820203e41a3c09355f99f5069cacd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 18:25:46 +0800 Subject: [PATCH 0920/1170] modify code --- src/class182/Code02_Minimax1.java | 32 +++++++++++++++++-------------- src/class182/Code02_Minimax2.java | 32 +++++++++++++++++-------------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index a3994f793..51706c75f 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -114,20 +114,24 @@ public static int merge(int l, int r, int t1, int t2) { } down(t1); down(t2); - int mid = (l + r) >> 1; - long lsum1 = sum[ls[t1]]; - long rsum1 = sum[rs[t1]]; - long lsum2 = sum[ls[t2]]; - long rsum2 = sum[rs[t2]]; - long m1 = mul1; - long m2 = mul2; - mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; - mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; - ls[t1] = merge(l, mid, ls[t1], ls[t2]); - mul1 = (m1 + lsum2 * p) % MOD; - mul2 = (m2 + lsum1 * p) % MOD; - rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); - up(t1); + if (l == r) { + sum[t1] = (sum[t1] * mul1 % MOD + sum[t2] * mul2 % MOD) % MOD; + } else { + int mid = (l + r) >> 1; + long lsum1 = sum[ls[t1]]; + long rsum1 = sum[rs[t1]]; + long lsum2 = sum[ls[t2]]; + long rsum2 = sum[rs[t2]]; + long m1 = mul1; + long m2 = mul2; + mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; + mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + mul1 = (m1 + lsum2 * p) % MOD; + mul2 = (m2 + lsum1 * p) % MOD; + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + up(t1); + } return t1; } diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 017d2a5fb..a88a65485 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -112,20 +112,24 @@ // } // down(t1); // down(t2); -// int mid = (l + r) >> 1; -// long long lsum1 = sum[ls[t1]]; -// long long rsum1 = sum[rs[t1]]; -// long long lsum2 = sum[ls[t2]]; -// long long rsum2 = sum[rs[t2]]; -// long long m1 = mul1; -// long long m2 = mul2; -// mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; -// mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; -// ls[t1] = merge(l, mid, ls[t1], ls[t2]); -// mul1 = (m1 + lsum2 * p) % MOD; -// mul2 = (m2 + lsum1 * p) % MOD; -// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); -// up(t1); +// if (l == r) { +// sum[t1] = (sum[t1] * mul1 % MOD + sum[t2] * mul2 % MOD) % MOD; +// } else { +// int mid = (l + r) >> 1; +// long long lsum1 = sum[ls[t1]]; +// long long rsum1 = sum[rs[t1]]; +// long long lsum2 = sum[ls[t2]]; +// long long rsum2 = sum[rs[t2]]; +// long long m1 = mul1; +// long long m2 = mul2; +// mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; +// mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; +// ls[t1] = merge(l, mid, ls[t1], ls[t2]); +// mul1 = (m1 + lsum2 * p) % MOD; +// mul2 = (m2 + lsum1 * p) % MOD; +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); +// up(t1); +// } // return t1; //} // From 1f2f951968b51dac1f84ba3c0d1aa0dbd2a39d63 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Oct 2025 20:58:36 +0800 Subject: [PATCH 0921/1170] modify code --- src/class182/Code02_Minimax1.java | 4 ++-- src/class182/Code02_Minimax2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 51706c75f..93e58551e 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -112,11 +112,11 @@ public static int merge(int l, int r, int t1, int t2) { } return t1 + t2; } - down(t1); - down(t2); if (l == r) { sum[t1] = (sum[t1] * mul1 % MOD + sum[t2] * mul2 % MOD) % MOD; } else { + down(t1); + down(t2); int mid = (l + r) >> 1; long lsum1 = sum[ls[t1]]; long rsum1 = sum[rs[t1]]; diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index a88a65485..0bd981f9c 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -110,11 +110,11 @@ // } // return t1 + t2; // } -// down(t1); -// down(t2); // if (l == r) { // sum[t1] = (sum[t1] * mul1 % MOD + sum[t2] * mul2 % MOD) % MOD; // } else { +// down(t1); +// down(t2); // int mid = (l + r) >> 1; // long long lsum1 = sum[ls[t1]]; // long long rsum1 = sum[rs[t1]]; From 207de0f683ebb3ed903ed73b6458641cbe18cd08 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 30 Oct 2025 17:44:38 +0800 Subject: [PATCH 0922/1170] modify code --- src/class182/Code02_Minimax1.java | 20 +++++++++----------- src/class182/Code02_Minimax2.java | 17 ++++++++--------- src/class182/Code03_Fate1.java | 24 ++++++++++++------------ 3 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 93e58551e..dca531356 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -105,15 +105,15 @@ public static int insert(int jobi, int l, int r, int i) { public static int merge(int l, int r, int t1, int t2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { - lazy(t1, mul1); + lazy(t1, mul2); } if (t2 != 0) { - lazy(t2, mul2); + lazy(t2, mul1); } return t1 + t2; } if (l == r) { - sum[t1] = (sum[t1] * mul1 % MOD + sum[t2] * mul2 % MOD) % MOD; + sum[t1] = (sum[t1] * mul2 % MOD + sum[t2] * mul1 % MOD) % MOD; } else { down(t1); down(t2); @@ -124,11 +124,11 @@ public static int merge(int l, int r, int t1, int t2) { long rsum2 = sum[rs[t2]]; long m1 = mul1; long m2 = mul2; - mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; - mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; + mul1 = (m1 + rsum1 * (1 - p + MOD) % MOD) % MOD; + mul2 = (m2 + rsum2 * (1 - p + MOD) % MOD) % MOD; ls[t1] = merge(l, mid, ls[t1], ls[t2]); - mul1 = (m1 + lsum2 * p) % MOD; - mul2 = (m2 + lsum1 * p) % MOD; + mul1 = (m1 + lsum1 * p) % MOD; + mul2 = (m2 + lsum2 * p) % MOD; rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); up(t1); } @@ -146,8 +146,7 @@ public static void dfs1(int u) { dfs1(child[u][0]); dfs1(child[u][1]); p = val[u]; - mul1 = 0; - mul2 = 0; + mul1 = mul2 = 0; root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); } } @@ -182,8 +181,7 @@ public static void dfs2() { stack[siz][1] = 0; } else { p = val[u]; - mul1 = 0; - mul2 = 0; + mul1 = mul2 = 0; root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); } } diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 0bd981f9c..79be42751 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -103,15 +103,15 @@ //int merge(int l, int r, int t1, int t2) { // if (t1 == 0 || t2 == 0) { // if (t1) { -// lazy(t1, mul1); +// lazy(t1, mul2); // } // if (t2) { -// lazy(t2, mul2); +// lazy(t2, mul1); // } // return t1 + t2; // } // if (l == r) { -// sum[t1] = (sum[t1] * mul1 % MOD + sum[t2] * mul2 % MOD) % MOD; +// sum[t1] = (sum[t1] * mul2 % MOD + sum[t2] * mul1 % MOD) % MOD; // } else { // down(t1); // down(t2); @@ -122,11 +122,11 @@ // long long rsum2 = sum[rs[t2]]; // long long m1 = mul1; // long long m2 = mul2; -// mul1 = (m1 + rsum2 * (1 - p + MOD) % MOD) % MOD; -// mul2 = (m2 + rsum1 * (1 - p + MOD) % MOD) % MOD; +// mul1 = (m1 + rsum1 * (1 - p + MOD) % MOD) % MOD; +// mul2 = (m2 + rsum2 * (1 - p + MOD) % MOD) % MOD; // ls[t1] = merge(l, mid, ls[t1], ls[t2]); -// mul1 = (m1 + lsum2 * p) % MOD; -// mul2 = (m2 + lsum1 * p) % MOD; +// mul1 = (m1 + lsum1 * p) % MOD; +// mul2 = (m2 + lsum2 * p) % MOD; // rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); // up(t1); // } @@ -143,8 +143,7 @@ // dfs(child[u][0]); // dfs(child[u][1]); // p = val[u]; -// mul1 = 0; -// mul2 = 0; +// mul1 = mul2 = 0; // root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); // } //} diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index 2e21df09b..741e79f15 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -90,20 +90,20 @@ public static int build(int jobi, int l, int r) { public static int merge(int l, int r, int t1, int t2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { - sum2 = (sum2 + sum[t1]) % MOD; - lazy(t1, sum1); + sum1 = (sum1 + sum[t1]) % MOD; + lazy(t1, sum2); } if (t2 != 0) { - sum1 = (sum1 + sum[t2]) % MOD; - lazy(t2, sum2); + sum2 = (sum2 + sum[t2]) % MOD; + lazy(t2, sum1); } return t1 + t2; } if (l == r) { - sum1 = (sum1 + sum[t2]) % MOD; - long tmp = sum2; - sum2 = (sum2 + sum[t1]) % MOD; - sum[t1] = ((sum[t1] * sum1) % MOD + (sum[t2] * tmp) % MOD) % MOD; + long tmp = sum1; + sum1 = (sum1 + sum[t1]) % MOD; + sum2 = (sum2 + sum[t2]) % MOD; + sum[t1] = ((sum[t1] * sum2) % MOD + (sum[t2] * tmp) % MOD) % MOD; } else { down(t1); down(t2); @@ -178,8 +178,8 @@ public static void dp1(int u, int fa) { for (int ei = head[u]; ei > 0; ei = nxt[ei]) { int v = to[ei]; if (v != fa) { - sum1 = query(0, dep[u], 0, n, root[v]); - sum2 = 0; + sum1 = 0; + sum2 = query(0, dep[u], 0, n, root[v]); root[u] = merge(0, n, root[u], root[v]); } } @@ -206,8 +206,8 @@ public static void dp2() { for (int ei = head[u]; ei > 0; ei = nxt[ei]) { int v = to[ei]; if (v != f) { - sum1 = query(0, dep[u], 0, n, root[v]); - sum2 = 0; + sum1 = 0; + sum2 = query(0, dep[u], 0, n, root[v]); root[u] = merge(0, n, root[u], root[v]); } } From cb8b447ceaa0b9a0d92b454d82e05fbfeefe6080 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 30 Oct 2025 17:51:32 +0800 Subject: [PATCH 0923/1170] modify code --- src/class182/Code02_Minimax1.java | 24 ++++++++++++------------ src/class182/Code02_Minimax2.java | 22 +++++++++++----------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index dca531356..2790435d8 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -100,20 +100,20 @@ public static int insert(int jobi, int l, int r, int i) { return rt; } - public static long p, mul1, mul2; + public static long p, sum1, sum2; public static int merge(int l, int r, int t1, int t2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { - lazy(t1, mul2); + lazy(t1, sum2); } if (t2 != 0) { - lazy(t2, mul1); + lazy(t2, sum1); } return t1 + t2; } if (l == r) { - sum[t1] = (sum[t1] * mul2 % MOD + sum[t2] * mul1 % MOD) % MOD; + sum[t1] = (sum[t1] * sum2 % MOD + sum[t2] * sum1 % MOD) % MOD; } else { down(t1); down(t2); @@ -122,13 +122,13 @@ public static int merge(int l, int r, int t1, int t2) { long rsum1 = sum[rs[t1]]; long lsum2 = sum[ls[t2]]; long rsum2 = sum[rs[t2]]; - long m1 = mul1; - long m2 = mul2; - mul1 = (m1 + rsum1 * (1 - p + MOD) % MOD) % MOD; - mul2 = (m2 + rsum2 * (1 - p + MOD) % MOD) % MOD; + long s1 = sum1; + long s2 = sum2; + sum1 = (s1 + rsum1 * (1 - p + MOD) % MOD) % MOD; + sum2 = (s2 + rsum2 * (1 - p + MOD) % MOD) % MOD; ls[t1] = merge(l, mid, ls[t1], ls[t2]); - mul1 = (m1 + lsum1 * p) % MOD; - mul2 = (m2 + lsum2 * p) % MOD; + sum1 = (s1 + lsum1 * p) % MOD; + sum2 = (s2 + lsum2 * p) % MOD; rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); up(t1); } @@ -146,7 +146,7 @@ public static void dfs1(int u) { dfs1(child[u][0]); dfs1(child[u][1]); p = val[u]; - mul1 = mul2 = 0; + sum1 = sum2 = 0; root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); } } @@ -181,7 +181,7 @@ public static void dfs2() { stack[siz][1] = 0; } else { p = val[u]; - mul1 = mul2 = 0; + sum1 = sum2 = 0; root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); } } diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 79be42751..f0d0d639a 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -98,20 +98,20 @@ // return rt; //} // -//long long p, mul1, mul2; +//long long p, sum1, sum2; // //int merge(int l, int r, int t1, int t2) { // if (t1 == 0 || t2 == 0) { // if (t1) { -// lazy(t1, mul2); +// lazy(t1, sum2); // } // if (t2) { -// lazy(t2, mul1); +// lazy(t2, sum1); // } // return t1 + t2; // } // if (l == r) { -// sum[t1] = (sum[t1] * mul2 % MOD + sum[t2] * mul1 % MOD) % MOD; +// sum[t1] = (sum[t1] * sum2 % MOD + sum[t2] * sum1 % MOD) % MOD; // } else { // down(t1); // down(t2); @@ -120,13 +120,13 @@ // long long rsum1 = sum[rs[t1]]; // long long lsum2 = sum[ls[t2]]; // long long rsum2 = sum[rs[t2]]; -// long long m1 = mul1; -// long long m2 = mul2; -// mul1 = (m1 + rsum1 * (1 - p + MOD) % MOD) % MOD; -// mul2 = (m2 + rsum2 * (1 - p + MOD) % MOD) % MOD; +// long long s1 = sum1; +// long long s2 = sum2; +// sum1 = (s1 + rsum1 * (1 - p + MOD) % MOD) % MOD; +// sum2 = (s2 + rsum2 * (1 - p + MOD) % MOD) % MOD; // ls[t1] = merge(l, mid, ls[t1], ls[t2]); -// mul1 = (m1 + lsum1 * p) % MOD; -// mul2 = (m2 + lsum2 * p) % MOD; +// sum1 = (s1 + lsum1 * p) % MOD; +// sum2 = (s2 + lsum2 * p) % MOD; // rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); // up(t1); // } @@ -143,7 +143,7 @@ // dfs(child[u][0]); // dfs(child[u][1]); // p = val[u]; -// mul1 = mul2 = 0; +// sum1 = sum2 = 0; // root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); // } //} From cc235275caa7e18d8afa879f776cbd34f9983613 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 30 Oct 2025 23:44:30 +0800 Subject: [PATCH 0924/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 8 ++++---- src/class182/Code03_Fate1.java | 23 ++++++++++++----------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index 285673d69..59feaa0cb 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -95,13 +95,13 @@ public static int merge(int l, int r, int t1, int t2) { down(t1); down(t2); int mid = (l + r) >> 1; - int tmp1 = max1; - int tmp2 = max2; + int mx1 = max1; + int mx2 = max2; max1 = Math.max(max1, max[rs[t1]]); max2 = Math.max(max2, max[rs[t2]]); ls[t1] = merge(l, mid, ls[t1], ls[t2]); - max1 = tmp1; - max2 = tmp2; + max1 = mx1; + max2 = mx2; rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); up(t1); } diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index 741e79f15..4e77c69d2 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -70,16 +70,16 @@ public static void down(int i) { } } - public static int build(int jobi, int l, int r) { + public static int insert(int jobi, int l, int r) { int rt = ++cntt; sum[rt] = 1; mul[rt] = 1; if (l < r) { int mid = (l + r) >> 1; if (jobi <= mid) { - ls[rt] = build(jobi, l, mid); + ls[rt] = insert(jobi, l, mid); } else { - rs[rt] = build(jobi, mid + 1, r); + rs[rt] = insert(jobi, mid + 1, r); } } return rt; @@ -90,25 +90,26 @@ public static int build(int jobi, int l, int r) { public static int merge(int l, int r, int t1, int t2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { - sum1 = (sum1 + sum[t1]) % MOD; lazy(t1, sum2); } if (t2 != 0) { - sum2 = (sum2 + sum[t2]) % MOD; lazy(t2, sum1); } return t1 + t2; } if (l == r) { - long tmp = sum1; - sum1 = (sum1 + sum[t1]) % MOD; - sum2 = (sum2 + sum[t2]) % MOD; - sum[t1] = ((sum[t1] * sum2) % MOD + (sum[t2] * tmp) % MOD) % MOD; + sum[t1] = ((sum[t1] * (sum2 + sum[t2])) % MOD + (sum[t2] * sum1) % MOD) % MOD; } else { down(t1); down(t2); int mid = (l + r) >> 1; + long lsum1 = sum[ls[t1]]; + long lsum2 = sum[ls[t2]]; + long s1 = sum1; + long s2 = sum2; ls[t1] = merge(l, mid, ls[t1], ls[t2]); + sum1 = (s1 + lsum1) % MOD; + sum2 = (s2 + lsum2) % MOD; rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); sum[t1] = (sum[ls[t1]] + sum[rs[t1]]) % MOD; } @@ -168,7 +169,7 @@ public static void dfs2() { // 递归版,java会爆栈,C++可以通过 public static void dp1(int u, int fa) { - root[u] = build(maxdep[u], 0, n); + root[u] = insert(maxdep[u], 0, n); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa) { @@ -192,7 +193,7 @@ public static void dp2() { while (stacksize > 0) { pop(); if (e == -1) { - root[u] = build(maxdep[u], 0, n); + root[u] = insert(maxdep[u], 0, n); e = head[u]; } else { e = nxt[e]; From ecd4b566832dcd137e928d4be557ea39192cbc43 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 31 Oct 2025 02:17:54 +0800 Subject: [PATCH 0925/1170] modify code --- src/class182/Code03_Fate1.java | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index 4e77c69d2..2dabdadf7 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -55,6 +55,10 @@ public static void addEdge(int u, int v) { head[u] = cntg; } + public static void up(int i) { + sum[i] = (sum[ls[i]] + sum[rs[i]]) % MOD; + } + public static void lazy(int i, long v) { if (i != 0) { sum[i] = sum[i] * v % MOD; @@ -70,17 +74,23 @@ public static void down(int i) { } } - public static int insert(int jobi, int l, int r) { - int rt = ++cntt; - sum[rt] = 1; - mul[rt] = 1; - if (l < r) { + public static int insert(int jobi, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = ++cntt; + mul[rt] = 1; + } + if (l == r) { + sum[rt] = 1; + } else { + down(rt); int mid = (l + r) >> 1; if (jobi <= mid) { - ls[rt] = insert(jobi, l, mid); + ls[rt] = insert(jobi, l, mid, ls[rt]); } else { - rs[rt] = insert(jobi, mid + 1, r); + rs[rt] = insert(jobi, mid + 1, r, rs[rt]); } + up(rt); } return rt; } @@ -111,7 +121,7 @@ public static int merge(int l, int r, int t1, int t2) { sum1 = (s1 + lsum1) % MOD; sum2 = (s2 + lsum2) % MOD; rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); - sum[t1] = (sum[ls[t1]] + sum[rs[t1]]) % MOD; + up(t1); } return t1; } @@ -169,7 +179,7 @@ public static void dfs2() { // 递归版,java会爆栈,C++可以通过 public static void dp1(int u, int fa) { - root[u] = insert(maxdep[u], 0, n); + root[u] = insert(maxdep[u], 0, n, root[u]); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa) { @@ -193,7 +203,7 @@ public static void dp2() { while (stacksize > 0) { pop(); if (e == -1) { - root[u] = insert(maxdep[u], 0, n); + root[u] = insert(maxdep[u], 0, n, root[u]); e = head[u]; } else { e = nxt[e]; From a99df689cca00770364069b598f4d489d7c68ded Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 31 Oct 2025 13:36:24 +0800 Subject: [PATCH 0926/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 17 ++++----------- src/class182/Code02_Minimax1.java | 30 ++++++++------------------ src/class182/Code02_Minimax2.java | 26 +++++++--------------- src/class182/Code03_Fate1.java | 24 ++++++--------------- 4 files changed, 28 insertions(+), 69 deletions(-) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index 59feaa0cb..72ffb7843 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -77,9 +77,7 @@ public static int add(int jobi, int jobv, int l, int r, int i) { return rt; } - public static int max1, max2; - - public static int merge(int l, int r, int t1, int t2) { + public static int merge(int l, int r, int t1, int t2, int max1, int max2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { lazy(t1, max2); @@ -95,14 +93,8 @@ public static int merge(int l, int r, int t1, int t2) { down(t1); down(t2); int mid = (l + r) >> 1; - int mx1 = max1; - int mx2 = max2; - max1 = Math.max(max1, max[rs[t1]]); - max2 = Math.max(max2, max[rs[t2]]); - ls[t1] = merge(l, mid, ls[t1], ls[t2]); - max1 = mx1; - max2 = mx2; - rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + ls[t1] = merge(l, mid, ls[t1], ls[t2], Math.max(max1, max[rs[t1]]), Math.max(max2, max[rs[t2]])); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], max1, max2); up(t1); } return t1; @@ -133,8 +125,7 @@ public static void dp(int u) { int v = to[e]; dp(v); val += query(arr[u], MAXV, 1, MAXV, root[v]); - max1 = max2 = 0; - root[u] = merge(1, MAXV, root[u], root[v]); + root[u] = merge(1, MAXV, root[u], root[v], 0, 0); } root[u] = add(arr[u], val, 1, MAXV, root[u]); } diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 2790435d8..0896e1778 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -100,9 +100,7 @@ public static int insert(int jobi, int l, int r, int i) { return rt; } - public static long p, sum1, sum2; - - public static int merge(int l, int r, int t1, int t2) { + public static int merge(int l, int r, int t1, int t2, int p, long sum1, long sum2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { lazy(t1, sum2); @@ -118,18 +116,12 @@ public static int merge(int l, int r, int t1, int t2) { down(t1); down(t2); int mid = (l + r) >> 1; - long lsum1 = sum[ls[t1]]; - long rsum1 = sum[rs[t1]]; - long lsum2 = sum[ls[t2]]; - long rsum2 = sum[rs[t2]]; - long s1 = sum1; - long s2 = sum2; - sum1 = (s1 + rsum1 * (1 - p + MOD) % MOD) % MOD; - sum2 = (s2 + rsum2 * (1 - p + MOD) % MOD) % MOD; - ls[t1] = merge(l, mid, ls[t1], ls[t2]); - sum1 = (s1 + lsum1 * p) % MOD; - sum2 = (s2 + lsum2 * p) % MOD; - rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + long l1 = (sum1 + sum[rs[t1]] * (1 - p + MOD)) % MOD; + long l2 = (sum2 + sum[rs[t2]] * (1 - p + MOD)) % MOD; + long r1 = (sum1 + sum[ls[t1]] * p) % MOD; + long r2 = (sum2 + sum[ls[t2]] * p) % MOD; + ls[t1] = merge(l, mid, ls[t1], ls[t2], p, l1, l2); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], p, r1, r2); up(t1); } return t1; @@ -145,9 +137,7 @@ public static void dfs1(int u) { } else { dfs1(child[u][0]); dfs1(child[u][1]); - p = val[u]; - sum1 = sum2 = 0; - root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); + root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); } } @@ -180,9 +170,7 @@ public static void dfs2() { stack[++siz][0] = child[u][0]; stack[siz][1] = 0; } else { - p = val[u]; - sum1 = sum2 = 0; - root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); + root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); } } } diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index f0d0d639a..161b4fbdd 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -98,9 +98,7 @@ // return rt; //} // -//long long p, sum1, sum2; -// -//int merge(int l, int r, int t1, int t2) { +//int merge(int l, int r, int t1, int t2, int p, long long sum1, long long sum2) { // if (t1 == 0 || t2 == 0) { // if (t1) { // lazy(t1, sum2); @@ -116,18 +114,12 @@ // down(t1); // down(t2); // int mid = (l + r) >> 1; -// long long lsum1 = sum[ls[t1]]; -// long long rsum1 = sum[rs[t1]]; -// long long lsum2 = sum[ls[t2]]; -// long long rsum2 = sum[rs[t2]]; -// long long s1 = sum1; -// long long s2 = sum2; -// sum1 = (s1 + rsum1 * (1 - p + MOD) % MOD) % MOD; -// sum2 = (s2 + rsum2 * (1 - p + MOD) % MOD) % MOD; -// ls[t1] = merge(l, mid, ls[t1], ls[t2]); -// sum1 = (s1 + lsum1 * p) % MOD; -// sum2 = (s2 + lsum2 * p) % MOD; -// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); +// long long l1 = (sum1 + sum[rs[t1]] * (1 - p + MOD)) % MOD; +// long long l2 = (sum2 + sum[rs[t2]] * (1 - p + MOD)) % MOD; +// long long r1 = (sum1 + sum[ls[t1]] * p) % MOD; +// long long r2 = (sum2 + sum[ls[t2]] * p) % MOD; +// ls[t1] = merge(l, mid, ls[t1], ls[t2], p, l1, l2); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], p, r1, r2); // up(t1); // } // return t1; @@ -142,9 +134,7 @@ // } else { // dfs(child[u][0]); // dfs(child[u][1]); -// p = val[u]; -// sum1 = sum2 = 0; -// root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]]); +// root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); // } //} // diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index 2dabdadf7..763eef28b 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -95,9 +95,7 @@ public static int insert(int jobi, int l, int r, int i) { return rt; } - public static long sum1, sum2; - - public static int merge(int l, int r, int t1, int t2) { + public static int merge(int l, int r, int t1, int t2, long sum1, long sum2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { lazy(t1, sum2); @@ -113,14 +111,10 @@ public static int merge(int l, int r, int t1, int t2) { down(t1); down(t2); int mid = (l + r) >> 1; - long lsum1 = sum[ls[t1]]; - long lsum2 = sum[ls[t2]]; - long s1 = sum1; - long s2 = sum2; - ls[t1] = merge(l, mid, ls[t1], ls[t2]); - sum1 = (s1 + lsum1) % MOD; - sum2 = (s2 + lsum2) % MOD; - rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + long tmp1 = sum[ls[t1]]; + long tmp2 = sum[ls[t2]]; + ls[t1] = merge(l, mid, ls[t1], ls[t2], sum1, sum2); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], sum1 + tmp1, sum2 + tmp2); up(t1); } return t1; @@ -189,9 +183,7 @@ public static void dp1(int u, int fa) { for (int ei = head[u]; ei > 0; ei = nxt[ei]) { int v = to[ei]; if (v != fa) { - sum1 = 0; - sum2 = query(0, dep[u], 0, n, root[v]); - root[u] = merge(0, n, root[u], root[v]); + root[u] = merge(0, n, root[u], root[v], 0, query(0, dep[u], 0, n, root[v])); } } } @@ -217,9 +209,7 @@ public static void dp2() { for (int ei = head[u]; ei > 0; ei = nxt[ei]) { int v = to[ei]; if (v != f) { - sum1 = 0; - sum2 = query(0, dep[u], 0, n, root[v]); - root[u] = merge(0, n, root[u], root[v]); + root[u] = merge(0, n, root[u], root[v], 0, query(0, dep[u], 0, n, root[v])); } } } From dd70c1885abc6fdeefa220ecad077515947f1972 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 31 Oct 2025 18:06:39 +0800 Subject: [PATCH 0927/1170] modify code --- src/class182/Code02_Minimax1.java | 38 ++-- src/class182/Code02_Minimax2.java | 28 +-- src/class182/Code04_SegmentTreeSplit1.java | 215 +++++++++++++++++++++ src/class182/Code04_SegmentTreeSplit2.java | 155 +++++++++++++++ 4 files changed, 403 insertions(+), 33 deletions(-) create mode 100644 src/class182/Code04_SegmentTreeSplit1.java create mode 100644 src/class182/Code04_SegmentTreeSplit2.java diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 0896e1778..8da6229df 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -22,8 +22,8 @@ public class Code02_Minimax1 { public static int[] sorted = new int[MAXN]; public static int cntv; - public static int[] childCnt = new int[MAXN]; - public static int[][] child = new int[MAXN][2]; + public static int[] sonCnt = new int[MAXN]; + public static int[][] son = new int[MAXN][2]; public static int[] root = new int[MAXN]; public static int[] ls = new int[MAXT]; @@ -129,15 +129,15 @@ public static int merge(int l, int r, int t1, int t2, int p, long sum1, long sum // 迭代版,java会爆栈,C++可以通过 public static void dfs1(int u) { - if (childCnt[u] == 0) { + if (sonCnt[u] == 0) { root[u] = insert(val[u], 1, cntv, root[u]); - } else if (childCnt[u] == 1) { - dfs1(child[u][0]); - root[u] = root[child[u][0]]; + } else if (sonCnt[u] == 1) { + dfs1(son[u][0]); + root[u] = root[son[u][0]]; } else { - dfs1(child[u][0]); - dfs1(child[u][1]); - root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); + dfs1(son[u][0]); + dfs1(son[u][1]); + root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], val[u], 0, 0); } } @@ -150,27 +150,27 @@ public static void dfs2() { while (siz > 0) { int u = stack[siz][0]; int s = stack[siz--][1]; - if (childCnt[u] == 0) { + if (sonCnt[u] == 0) { root[u] = insert(val[u], 1, cntv, root[u]); - } else if (childCnt[u] == 1) { + } else if (sonCnt[u] == 1) { if (s == 0) { stack[++siz][0] = u; stack[siz][1] = 1; - stack[++siz][0] = child[u][0]; + stack[++siz][0] = son[u][0]; stack[siz][1] = 0; } else { - root[u] = root[child[u][0]]; + root[u] = root[son[u][0]]; } } else { if (s == 0) { stack[++siz][0] = u; stack[siz][1] = 1; - stack[++siz][0] = child[u][1]; + stack[++siz][0] = son[u][1]; stack[siz][1] = 0; - stack[++siz][0] = child[u][0]; + stack[++siz][0] = son[u][0]; stack[siz][1] = 0; } else { - root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); + root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], val[u], 0, 0); } } } @@ -193,12 +193,12 @@ public static void getd(int l, int r, int i) { public static void prepare() { for (int i = 1; i <= n; i++) { if (fa[i] != 0) { - child[fa[i]][childCnt[fa[i]]++] = i; + son[fa[i]][sonCnt[fa[i]]++] = i; } } long inv = power(10000, MOD - 2); for (int i = 1; i <= n; i++) { - if (childCnt[i] == 0) { + if (sonCnt[i] == 0) { sorted[++cntv] = val[i]; } else { val[i] = (int) (inv * val[i] % MOD); @@ -213,7 +213,7 @@ public static void prepare() { } cntv = len; for (int i = 1; i <= n; i++) { - if (childCnt[i] == 0) { + if (sonCnt[i] == 0) { val[i] = kth(val[i]); } } diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 161b4fbdd..bc3332700 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -19,8 +19,8 @@ //int sorted[MAXN]; //int cntv; // -//int childCnt[MAXN]; -//int child[MAXN][2]; +//int sonCnt[MAXN]; +//int son[MAXN][2]; // //int root[MAXN]; //int ls[MAXT]; @@ -126,15 +126,15 @@ //} // //void dfs(int u) { -// if (childCnt[u] == 0) { +// if (sonCnt[u] == 0) { // root[u] = insert(val[u], 1, cntv, root[u]); -// } else if (childCnt[u] == 1) { -// dfs(child[u][0]); -// root[u] = root[child[u][0]]; +// } else if (sonCnt[u] == 1) { +// dfs(son[u][0]); +// root[u] = root[son[u][0]]; // } else { -// dfs(child[u][0]); -// dfs(child[u][1]); -// root[u] = merge(1, cntv, root[child[u][0]], root[child[u][1]], val[u], 0, 0); +// dfs(son[u][0]); +// dfs(son[u][1]); +// root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], val[u], 0, 0); // } //} // @@ -155,13 +155,13 @@ //void prepare() { // for (int i = 1; i <= n; i++) { // if (fa[i] != 0) { -// child[fa[i]][childCnt[fa[i]]++] = i; +// son[fa[i]][sonCnt[fa[i]]++] = i; // } // } // long long inv = power(10000, MOD - 2); // for (int i = 1; i <= n; i++) { -// if (childCnt[i] == 0) { -// sorted[++cntv] = val[i]; +// if (sonCnt[i] == 0) { +// sorted[++cntv] = val[i]; // } else { // val[i] = (int)(inv * val[i] % MOD); // } @@ -170,12 +170,12 @@ // int len = 1; // for (int i = 2; i <= cntv; i++) { // if (sorted[len] != sorted[i]) { -// sorted[++len] = sorted[i]; +// sorted[++len] = sorted[i]; // } // } // cntv = len; // for (int i = 1; i <= n; i++) { -// if (childCnt[i] == 0) { +// if (sonCnt[i] == 0) { // val[i] = kth(val[i]); // } // } diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java new file mode 100644 index 000000000..79a56edcb --- /dev/null +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -0,0 +1,215 @@ +package class182; + +// 线段树分裂,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5494 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code04_SegmentTreeSplit2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code04_SegmentTreeSplit1 { + + public static int MAXN = 200001; + public static int MAXT = MAXN * 40; + public static int n, m; + + public static int[] root = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static long[] sum = new long[MAXT]; + public static int cntRoot; + + public static int[] pool = new int[MAXT]; + public static int top; + + public static void prepare() { + top = 0; + for (int i = 1; i < MAXT; i++) { + pool[++top] = i; + } + } + + public static int newNode() { + return pool[top--]; + } + + public static void del(int i) { + pool[++top] = i; + ls[i] = 0; + rs[i] = 0; + sum[i] = 0; + } + + public static int add(int jobi, int jobv, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = newNode(); + } + sum[rt] += jobv; + if (l < r) { + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = add(jobi, jobv, l, mid, ls[rt]); + } else { + rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); + } + } + return rt; + } + + public static long query(int jobl, int jobr, int l, int r, int i) { + if (i == 0) { + return 0; + } + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) >> 1; + long ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, ls[i]); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, rs[i]); + } + return ans; + } + + public static int kth(long jobk, int l, int r, int i) { + if (i == 0) { + return -1; + } + if (l == r) { + return l; + } + int mid = (l + r) >> 1; + if (sum[ls[i]] >= jobk) { + return kth(jobk, l, mid, ls[i]); + } else { + return kth(jobk - sum[ls[i]], mid + 1, r, rs[i]); + } + } + + public static int merge(int t1, int t2) { + if (t1 == 0 || t2 == 0) { + return t1 + t2; + } + sum[t1] += sum[t2]; + ls[t1] = merge(ls[t1], ls[t2]); + rs[t1] = merge(rs[t1], rs[t2]); + del(t2); + return t1; + } + + public static int split(int x, long k) { + if (x == 0) { + return 0; + } + int y = newNode(); + long lsum = sum[ls[x]]; + if (k > lsum) { + rs[y] = split(rs[x], k - lsum); + } else { + int tmp = rs[x]; + rs[x] = rs[y]; + rs[y] = tmp; + } + if (k < lsum) { + ls[y] = split(ls[x], k); + } + sum[y] = sum[x] - k; + sum[x] = k; + return y; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + prepare(); + cntRoot = 1; + for (int i = 1, x; i <= n; i++) { + x = in.nextInt(); + root[cntRoot] = add(i, x, 1, n, root[1]); + } + for (int i = 1, op, x, y, z; i <= m; i++) { + op = in.nextInt(); + if (op == 0) { + x = in.nextInt(); + y = in.nextInt(); + z = in.nextInt(); + long k1 = query(1, z, 1, n, root[x]); + long k2 = query(y, z, 1, n, root[x]); + root[++cntRoot] = split(root[x], k1 - k2); + int tmp = split(root[cntRoot], k2); + root[x] = merge(root[x], tmp); + } else if (op == 1) { + x = in.nextInt(); + y = in.nextInt(); + root[x] = merge(root[x], root[y]); + } else if (op == 2) { + x = in.nextInt(); + y = in.nextInt(); + z = in.nextInt(); + root[x] = add(z, y, 1, n, root[x]); + } else if (op == 3) { + x = in.nextInt(); + y = in.nextInt(); + z = in.nextInt(); + out.println(query(y, z, 1, n, root[x])); + } else { + x = in.nextInt(); + y = in.nextInt(); + out.println(kth(y, 1, n, root[x])); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java new file mode 100644 index 000000000..e616e2f11 --- /dev/null +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -0,0 +1,155 @@ +package class182; + +// 线段树分裂,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5494 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//const int MAXT = MAXN * 40; +//int n, m; +// +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//long long sum[MAXT]; +//int cntRoot; +// +//int pool[MAXT]; +//int top; +// +//void prepare() { +// top = 0; +// for (int i = 1; i < MAXT; i++) { +// pool[++top] = i; +// } +//} +// +//int newNode() { +// return pool[top--]; +//} +// +//void del(int i) { +// pool[++top] = i; +// ls[i] = 0; +// rs[i] = 0; +// sum[i] = 0; +//} +// +//int add(int jobi, int jobv, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = newNode(); +// } +// sum[rt] += jobv; +// if (l < r) { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = add(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); +// } +// } +// return rt; +//} +// +//long long query(int jobl, int jobr, int l, int r, int i) { +// if (i == 0) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return sum[i]; +// } +// int mid = (l + r) >> 1; +// long long ans = 0; +// if (jobl <= mid) { +// ans += query(jobl, jobr, l, mid, ls[i]); +// } +// if (jobr > mid) { +// ans += query(jobl, jobr, mid + 1, r, rs[i]); +// } +// return ans; +//} +// +//int kth(long long jobk, int l, int r, int i) { +// if (i == 0) { +// return -1; +// } +// if (l == r) { +// return l; +// } +// int mid = (l + r) >> 1; +// if (sum[ls[i]] >= jobk) { +// return kth(jobk, l, mid, ls[i]); +// } else { +// return kth(jobk - sum[ls[i]], mid + 1, r, rs[i]); +// } +//} +// +//int merge(int t1, int t2) { +// if (t1 == 0 || t2 == 0) { +// return t1 + t2; +// } +// sum[t1] += sum[t2]; +// ls[t1] = merge(ls[t1], ls[t2]); +// rs[t1] = merge(rs[t1], rs[t2]); +// del(t2); +// return t1; +//} +// +//int split(int x, long long k) { +// if (x == 0) return 0; +// int y = newNode(); +// long long lsum = sum[ls[x]]; +// if (k > lsum) { +// rs[y] = split(rs[x], k - lsum); +// } else { +// swap(rs[x], rs[y]); +// } +// if (k < lsum) { +// ls[y] = split(ls[x], k); +// } +// sum[y] = sum[x] - k; +// sum[x] = k; +// return y; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// prepare(); +// cntRoot = 1; +// for (int i = 1, x; i <= n; i++) { +// cin >> x; +// root[cntRoot] = add(i, x, 1, n, root[1]); +// } +// for (int i = 1, op, x, y, z; i <= m; i++) { +// cin >> op; +// if (op == 0) { +// cin >> x >> y >> z; +// long long k1 = query(1, z, 1, n, root[x]); +// long long k2 = query(y, z, 1, n, root[x]); +// root[++cntRoot] = split(root[x], k1 - k2); +// int tmp = split(root[cntRoot], k2); +// root[x] = merge(root[x], tmp); +// } else if (op == 1) { +// cin >> x >> y; +// root[x] = merge(root[x], root[y]); +// } else if (op == 2) { +// cin >> x >> y >> z; +// root[x] = add(z, y, 1, n, root[x]); +// } else if (op == 3) { +// cin >> x >> y >> z; +// cout << query(y, z, 1, n, root[x]) << '\n'; +// } else { +// cin >> x >> y; +// cout << kth(y, 1, n, root[x]) << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 9e0488214b9895b175daa2867dca341a44c71fef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 31 Oct 2025 18:09:27 +0800 Subject: [PATCH 0928/1170] modify code --- src/class182/Code04_SegmentTreeSplit2.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index e616e2f11..672f1004e 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -23,9 +23,9 @@ //int top; // //void prepare() { -// top = 0; +// top = 0; // for (int i = 1; i < MAXT; i++) { -// pool[++top] = i; +// pool[++top] = i; // } //} // @@ -34,7 +34,7 @@ //} // //void del(int i) { -// pool[++top] = i; +// pool[++top] = i; // ls[i] = 0; // rs[i] = 0; // sum[i] = 0; @@ -102,13 +102,15 @@ //} // //int split(int x, long long k) { -// if (x == 0) return 0; +// if (x == 0) { +// return 0; +// } // int y = newNode(); // long long lsum = sum[ls[x]]; // if (k > lsum) { // rs[y] = split(rs[x], k - lsum); // } else { -// swap(rs[x], rs[y]); +// swap(rs[x], rs[y]); // } // if (k < lsum) { // ls[y] = split(ls[x], k); From 13b6ff92c94ae0ce6f8e58737c914ff9f5412324 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 31 Oct 2025 21:18:01 +0800 Subject: [PATCH 0929/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 6 +++--- src/class182/Code04_SegmentTreeSplit2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index 79a56edcb..190f65579 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -118,9 +118,9 @@ public static int split(int x, long k) { int tmp = rs[x]; rs[x] = rs[y]; rs[y] = tmp; - } - if (k < lsum) { - ls[y] = split(ls[x], k); + if (k < lsum) { + ls[y] = split(ls[x], k); + } } sum[y] = sum[x] - k; sum[x] = k; diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index 672f1004e..0f1d8364c 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -111,9 +111,9 @@ // rs[y] = split(rs[x], k - lsum); // } else { // swap(rs[x], rs[y]); -// } -// if (k < lsum) { -// ls[y] = split(ls[x], k); +// if (k < lsum) { +// ls[y] = split(ls[x], k); +// } // } // sum[y] = sum[x] - k; // sum[x] = k; From 4385c35897f327445b983474f40db1f5ce6c479e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 31 Oct 2025 22:13:20 +0800 Subject: [PATCH 0930/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 57 +++++++++++++--------- src/class182/Code04_SegmentTreeSplit2.java | 47 ++++++++++-------- 2 files changed, 62 insertions(+), 42 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index 190f65579..a4d1134ab 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -45,19 +45,25 @@ public static void del(int i) { sum[i] = 0; } + public static void up(int i) { + sum[i] = (sum[ls[i]] + sum[rs[i]]); + } + public static int add(int jobi, int jobv, int l, int r, int i) { int rt = i; if (rt == 0) { rt = newNode(); } - sum[rt] += jobv; - if (l < r) { + if (l == r) { + sum[rt] += jobv; + } else { int mid = (l + r) >> 1; if (jobi <= mid) { ls[rt] = add(jobi, jobv, l, mid, ls[rt]); } else { rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); } + up(rt); } return rt; } @@ -95,36 +101,41 @@ public static int kth(long jobk, int l, int r, int i) { } } - public static int merge(int t1, int t2) { + public static int merge(int l, int r, int t1, int t2) { if (t1 == 0 || t2 == 0) { return t1 + t2; } - sum[t1] += sum[t2]; - ls[t1] = merge(ls[t1], ls[t2]); - rs[t1] = merge(rs[t1], rs[t2]); - del(t2); + if (l == r) { + sum[t1] += sum[t2]; + } else { + int mid = (l + r) >> 1; + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + up(t1); + del(t2); + } return t1; } - public static int split(int x, long k) { - if (x == 0) { + public static int split(int t1, long rank) { + if (t1 == 0) { return 0; } - int y = newNode(); - long lsum = sum[ls[x]]; - if (k > lsum) { - rs[y] = split(rs[x], k - lsum); + int t2 = newNode(); + long lsum = sum[ls[t1]]; + if (rank > lsum) { + rs[t2] = split(rs[t1], rank - lsum); } else { - int tmp = rs[x]; - rs[x] = rs[y]; - rs[y] = tmp; - if (k < lsum) { - ls[y] = split(ls[x], k); + int tmp = rs[t1]; + rs[t1] = rs[t2]; + rs[t2] = tmp; + if (rank < lsum) { + ls[t2] = split(ls[t1], rank); } } - sum[y] = sum[x] - k; - sum[x] = k; - return y; + sum[t2] = sum[t1] - rank; + sum[t1] = rank; + return t2; } public static void main(String[] args) throws Exception { @@ -148,11 +159,11 @@ public static void main(String[] args) throws Exception { long k2 = query(y, z, 1, n, root[x]); root[++cntRoot] = split(root[x], k1 - k2); int tmp = split(root[cntRoot], k2); - root[x] = merge(root[x], tmp); + root[x] = merge(1, n, root[x], tmp); } else if (op == 1) { x = in.nextInt(); y = in.nextInt(); - root[x] = merge(root[x], root[y]); + root[x] = merge(1, n, root[x], root[y]); } else if (op == 2) { x = in.nextInt(); y = in.nextInt(); diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index 0f1d8364c..996adbedd 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -40,6 +40,10 @@ // sum[i] = 0; //} // +//void up(int i) { +// sum[i] = (sum[ls[i]] + sum[rs[i]]); +//} +// //int add(int jobi, int jobv, int l, int r, int i) { // int rt = i; // if (rt == 0) { @@ -90,34 +94,39 @@ // } //} // -//int merge(int t1, int t2) { +//int merge(int l, int r, int t1, int t2) { // if (t1 == 0 || t2 == 0) { // return t1 + t2; // } -// sum[t1] += sum[t2]; -// ls[t1] = merge(ls[t1], ls[t2]); -// rs[t1] = merge(rs[t1], rs[t2]); -// del(t2); +// if (l == r) { +// sum[t1] += sum[t2]; +// } else { +// int mid = (l + r) >> 1; +// ls[t1] = merge(l, mid, ls[t1], ls[t2]); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); +// up(t1); +// del(t2); +// } // return t1; //} // -//int split(int x, long long k) { -// if (x == 0) { +//int split(int t1, long long rank) { +// if (t1 == 0) { // return 0; // } -// int y = newNode(); -// long long lsum = sum[ls[x]]; -// if (k > lsum) { -// rs[y] = split(rs[x], k - lsum); +// int t2 = newNode(); +// long long lsum = sum[ls[t1]]; +// if (rank > lsum) { +// rs[t2] = split(rs[t1], rank - lsum); // } else { -// swap(rs[x], rs[y]); -// if (k < lsum) { -// ls[y] = split(ls[x], k); +// swap(rs[t1], rs[t2]); +// if (rank < lsum) { +// ls[t2] = split(ls[t1], rank); // } // } -// sum[y] = sum[x] - k; -// sum[x] = k; -// return y; +// sum[t2] = sum[t1] - rank; +// sum[t1] = rank; +// return t2; //} // //int main() { @@ -138,10 +147,10 @@ // long long k2 = query(y, z, 1, n, root[x]); // root[++cntRoot] = split(root[x], k1 - k2); // int tmp = split(root[cntRoot], k2); -// root[x] = merge(root[x], tmp); +// root[x] = merge(1, n, root[x], tmp); // } else if (op == 1) { // cin >> x >> y; -// root[x] = merge(root[x], root[y]); +// root[x] = merge(1, n, root[x], root[y]); // } else if (op == 2) { // cin >> x >> y >> z; // root[x] = add(z, y, 1, n, root[x]); From 65718f4f3d00070c8dcd9e6caabc52d9ccfe9ab0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 31 Oct 2025 22:36:38 +0800 Subject: [PATCH 0931/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 4 ++-- src/class182/Code04_SegmentTreeSplit2.java | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index a4d1134ab..b43a4a1c7 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -133,8 +133,8 @@ public static int split(int t1, long rank) { ls[t2] = split(ls[t1], rank); } } - sum[t2] = sum[t1] - rank; - sum[t1] = rank; + up(t1); + up(t2); return t2; } diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index 996adbedd..4cdf051dc 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -49,14 +49,16 @@ // if (rt == 0) { // rt = newNode(); // } -// sum[rt] += jobv; -// if (l < r) { +// if (l == r) { +// sum[rt] += jobv; +// } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { // ls[rt] = add(jobi, jobv, l, mid, ls[rt]); // } else { // rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); // } +// up(rt); // } // return rt; //} @@ -124,8 +126,8 @@ // ls[t2] = split(ls[t1], rank); // } // } -// sum[t2] = sum[t1] - rank; -// sum[t1] = rank; +// up(t1); +// up(t2); // return t2; //} // From ae421d8acfaff06f850757fd2d66c115c2ffd4e6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 31 Oct 2025 22:53:17 +0800 Subject: [PATCH 0932/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 46 +++++++++++++--------- src/class182/Code04_SegmentTreeSplit2.java | 44 +++++++++++++-------- 2 files changed, 54 insertions(+), 36 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index b43a4a1c7..d82c4fcab 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -117,25 +117,35 @@ public static int merge(int l, int r, int t1, int t2) { return t1; } - public static int split(int t1, long rank) { - if (t1 == 0) { - return 0; + public static int tree1, tree2; + + public static void split(int jobl, int jobr, int l, int r, int t1) { + if (jobr < l || r < jobl || t1 == 0) { + tree1 = t1; + tree2 = 0; + return; + } + if (jobl <= l && r <= jobr) { + tree1 = 0; + tree2 = t1; + return; } int t2 = newNode(); - long lsum = sum[ls[t1]]; - if (rank > lsum) { - rs[t2] = split(rs[t1], rank - lsum); - } else { - int tmp = rs[t1]; - rs[t1] = rs[t2]; - rs[t2] = tmp; - if (rank < lsum) { - ls[t2] = split(ls[t1], rank); - } + int mid = (l + r) >> 1; + if (jobl <= mid) { + split(jobl, jobr, l, mid, ls[t1]); + ls[t1] = tree1; + ls[t2] = tree2; + } + if (jobr > mid) { + split(jobl, jobr, mid + 1, r, rs[t1]); + rs[t1] = tree1; + rs[t2] = tree2; } up(t1); up(t2); - return t2; + tree1 = t1; + tree2 = t2; } public static void main(String[] args) throws Exception { @@ -155,11 +165,9 @@ public static void main(String[] args) throws Exception { x = in.nextInt(); y = in.nextInt(); z = in.nextInt(); - long k1 = query(1, z, 1, n, root[x]); - long k2 = query(y, z, 1, n, root[x]); - root[++cntRoot] = split(root[x], k1 - k2); - int tmp = split(root[cntRoot], k2); - root[x] = merge(1, n, root[x], tmp); + split(y, z, 1, n, root[x]); + root[x] = tree1; + root[++cntRoot] = tree2; } else if (op == 1) { x = in.nextInt(); y = in.nextInt(); diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index 4cdf051dc..fb432c84f 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -112,23 +112,35 @@ // return t1; //} // -//int split(int t1, long long rank) { -// if (t1 == 0) { -// return 0; +//int tree1, tree2; +// +//void split(int jobl, int jobr, int l, int r, int t1) { +// if (jobr < l || r < jobl || t1 == 0) { +// tree1 = t1; +// tree2 = 0; +// return; +// } +// if (jobl <= l && r <= jobr) { +// tree1 = 0; +// tree2 = t1; +// return; // } // int t2 = newNode(); -// long long lsum = sum[ls[t1]]; -// if (rank > lsum) { -// rs[t2] = split(rs[t1], rank - lsum); -// } else { -// swap(rs[t1], rs[t2]); -// if (rank < lsum) { -// ls[t2] = split(ls[t1], rank); -// } +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// split(jobl, jobr, l, mid, ls[t1]); +// ls[t1] = tree1; +// ls[t2] = tree2; +// } +// if (jobr > mid) { +// split(jobl, jobr, mid + 1, r, rs[t1]); +// rs[t1] = tree1; +// rs[t2] = tree2; // } // up(t1); // up(t2); -// return t2; +// tree1 = t1; +// tree2 = t2; //} // //int main() { @@ -145,11 +157,9 @@ // cin >> op; // if (op == 0) { // cin >> x >> y >> z; -// long long k1 = query(1, z, 1, n, root[x]); -// long long k2 = query(y, z, 1, n, root[x]); -// root[++cntRoot] = split(root[x], k1 - k2); -// int tmp = split(root[cntRoot], k2); -// root[x] = merge(1, n, root[x], tmp); +// split(y, z, 1, n, root[x]); +// root[x] = tree1; +// root[++cntRoot] = tree2; // } else if (op == 1) { // cin >> x >> y; // root[x] = merge(1, n, root[x], root[y]); From ad9e15f5a5a1e520eb5a34014852f9eae6d73bf6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 31 Oct 2025 23:12:55 +0800 Subject: [PATCH 0933/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 2 +- src/class182/Code04_SegmentTreeSplit2.java | 2 +- src/class182/Code05_MassChangeQueries1.java | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 src/class182/Code05_MassChangeQueries1.java diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index d82c4fcab..73f22ed67 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -120,7 +120,7 @@ public static int merge(int l, int r, int t1, int t2) { public static int tree1, tree2; public static void split(int jobl, int jobr, int l, int r, int t1) { - if (jobr < l || r < jobl || t1 == 0) { + if (t1 == 0) { tree1 = t1; tree2 = 0; return; diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index fb432c84f..34af9f76b 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -115,7 +115,7 @@ //int tree1, tree2; // //void split(int jobl, int jobr, int l, int r, int t1) { -// if (jobr < l || r < jobl || t1 == 0) { +// if (t1 == 0) { // tree1 = t1; // tree2 = 0; // return; diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java new file mode 100644 index 000000000..a3681db56 --- /dev/null +++ b/src/class182/Code05_MassChangeQueries1.java @@ -0,0 +1,10 @@ +package class182; + +// 值全改的操作,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF911G +// 测试链接 : https://codeforces.com/problemset/problem/911/G +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code05_MassChangeQueries1 { + +} From 3dbc159409d3fe20b038921e0cc5efbaa351a318 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 1 Nov 2025 15:57:59 +0800 Subject: [PATCH 0934/1170] modify code --- src/class182/Code05_MassChangeQueries1.java | 196 ++++++++++++++++++++ 1 file changed, 196 insertions(+) diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java index a3681db56..714ce2cf5 100644 --- a/src/class182/Code05_MassChangeQueries1.java +++ b/src/class182/Code05_MassChangeQueries1.java @@ -5,6 +5,202 @@ // 测试链接 : https://codeforces.com/problemset/problem/911/G // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + public class Code05_MassChangeQueries1 { + public static int MAXN = 200001; + public static int MAXV = 100; + public static int MAXT = MAXN * 40; + public static int n, q; + public static int[] arr = new int[MAXN]; + + public static int[] root = new int[MAXV + 1]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] sum = new int[MAXT]; + public static int cntt; + + public static int[] pool = new int[MAXT]; + public static int top; + + public static int[] ans = new int[MAXN]; + + public static void prepare() { + top = 0; + for (int i = 1; i < MAXT; i++) { + pool[++top] = i; + } + } + + public static int newNode() { + return pool[top--]; + } + + public static void del(int i) { + pool[++top] = i; + ls[i] = 0; + rs[i] = 0; + sum[i] = 0; + } + + public static void up(int p) { + sum[p] = sum[ls[p]] + sum[rs[p]]; + } + + public static int insert(int jobi, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = newNode(); + } + if (l == r) { + sum[rt]++; + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = insert(jobi, l, mid, ls[rt]); + } else { + rs[rt] = insert(jobi, mid + 1, r, rs[rt]); + } + up(rt); + } + return rt; + } + + public static int merge(int l, int r, int t1, int t2) { + if (t1 == 0 || t2 == 0) { + return t1 + t2; + } + if (l == r) { + sum[t1] += sum[t2]; + } else { + int mid = (l + r) >> 1; + ls[t1] = merge(l, mid, ls[t1], ls[t2]); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); + up(t1); + del(t2); + } + return t1; + } + + public static int tree1, tree2; + + public static void split(int jobl, int jobr, int l, int r, int t1) { + if (t1 == 0) { + tree1 = t1; + tree2 = 0; + return; + } + if (jobl <= l && r <= jobr) { + tree1 = 0; + tree2 = t1; + return; + } + int t2 = newNode(); + int mid = (l + r) >> 1; + if (jobl <= mid) { + split(jobl, jobr, l, mid, ls[t1]); + ls[t1] = tree1; + ls[t2] = tree2; + } + if (jobr > mid) { + split(jobl, jobr, mid + 1, r, rs[t1]); + rs[t1] = tree1; + rs[t2] = tree2; + } + up(t1); + up(t2); + tree1 = t1; + tree2 = t2; + } + + public static void dfs(int val, int l, int r, int i) { + if (i == 0 || sum[i] == 0) { + return; + } + if (l == r) { + ans[l] = val; + } else { + int mid = (l + r) >> 1; + dfs(val, l, mid, ls[i]); + dfs(val, mid + 1, r, rs[i]); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + q = in.nextInt(); + prepare(); + for (int i = 1; i <= n; i++) { + root[arr[i]] = insert(i, 1, n, root[arr[i]]); + } + for (int i = 1, l, r, x, y; i <= q; i++) { + l = in.nextInt(); + r = in.nextInt(); + x = in.nextInt(); + y = in.nextInt(); + if (x != y) { + split(l, r, 1, n, root[x]); + root[x] = tree1; + root[y] = merge(1, n, root[y], tree2); + } + } + for (int v = 1; v <= MAXV; v++) { + dfs(v, 1, n, root[v]); + } + for (int i = 1; i <= n; i++) { + out.print(ans[i] + " "); + } + out.println(); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From b842f0acaef6b135945c6629c903eb8081e2851d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 1 Nov 2025 16:10:52 +0800 Subject: [PATCH 0935/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 2 +- src/class182/Code04_SegmentTreeSplit2.java | 2 +- src/class182/Code05_MassChangeQueries1.java | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index 73f22ed67..1e8e50ca5 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -112,8 +112,8 @@ public static int merge(int l, int r, int t1, int t2) { ls[t1] = merge(l, mid, ls[t1], ls[t2]); rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); up(t1); - del(t2); } + del(t2); return t1; } diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index 34af9f76b..d4653a67f 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -107,8 +107,8 @@ // ls[t1] = merge(l, mid, ls[t1], ls[t2]); // rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); // up(t1); -// del(t2); // } +// del(t2); // return t1; //} // diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java index 714ce2cf5..aa4c9fd15 100644 --- a/src/class182/Code05_MassChangeQueries1.java +++ b/src/class182/Code05_MassChangeQueries1.java @@ -22,7 +22,6 @@ public class Code05_MassChangeQueries1 { public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static int[] sum = new int[MAXT]; - public static int cntt; public static int[] pool = new int[MAXT]; public static int top; @@ -81,8 +80,8 @@ public static int merge(int l, int r, int t1, int t2) { ls[t1] = merge(l, mid, ls[t1], ls[t2]); rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); up(t1); - del(t2); } + del(t2); return t1; } From 8b42a08ef3d493b9ccde914633c376419eb54f91 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 1 Nov 2025 16:15:22 +0800 Subject: [PATCH 0936/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 2 +- src/class182/Code04_SegmentTreeSplit2.java | 2 +- src/class182/Code05_MassChangeQueries1.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index 1e8e50ca5..f7ec11bb3 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -151,9 +151,9 @@ public static void split(int jobl, int jobr, int l, int r, int t1) { public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + prepare(); n = in.nextInt(); m = in.nextInt(); - prepare(); cntRoot = 1; for (int i = 1, x; i <= n; i++) { x = in.nextInt(); diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index d4653a67f..a1d8b2265 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -146,8 +146,8 @@ //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); -// cin >> n >> m; // prepare(); +// cin >> n >> m; // cntRoot = 1; // for (int i = 1, x; i <= n; i++) { // cin >> x; diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java index aa4c9fd15..d3a832f73 100644 --- a/src/class182/Code05_MassChangeQueries1.java +++ b/src/class182/Code05_MassChangeQueries1.java @@ -132,12 +132,12 @@ public static void dfs(int val, int l, int r, int i) { public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + prepare(); n = in.nextInt(); for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } q = in.nextInt(); - prepare(); for (int i = 1; i <= n; i++) { root[arr[i]] = insert(i, 1, n, root[arr[i]]); } From eb692e6abc425eb20d38badd9eb04bd913a08e02 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 13:34:15 +0800 Subject: [PATCH 0937/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 26 +++-- src/class182/Code01_LeadersGroup2.java | 149 +++++++++++++++++++++++++ src/class182/Code02_Minimax2.java | 6 +- 3 files changed, 167 insertions(+), 14 deletions(-) create mode 100644 src/class182/Code01_LeadersGroup2.java diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index 72ffb7843..6060c0ded 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -1,6 +1,13 @@ package class182; // 领导集团问题,java版 +// 一共有n个节点,给定每个点的点权,所有节点组成一棵树 +// 已知1号节点是整棵树的头,其他节点的父亲节点都会给出 +// 如果你在树上选择了u、v两个节点,并且u是v的祖先节点的话 +// 那么需要保证 u的点权 <= v的点权,除此之外就没有别的限制了 +// 打印你最多能在树上选择几个点 +// 1 <= n <= 2 * 10^5 +// 0 <= 点权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4577 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -25,7 +32,7 @@ public class Code01_LeadersGroup1 { public static int[] root = new int[MAXN]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; - public static int[] max = new int[MAXT]; + public static int[] maxv = new int[MAXT]; public static int[] addTag = new int[MAXT]; public static int cntt; @@ -36,15 +43,12 @@ public static void addEdge(int u, int v) { } public static void up(int i) { - max[i] = Math.max(max[ls[i]], max[rs[i]]); + maxv[i] = Math.max(maxv[ls[i]], maxv[rs[i]]); } public static void lazy(int i, int v) { - // 如果区间信息不存在 - // 说明没有建立过dp信息 - // 那么不需要增加v if (i != 0) { - max[i] += v; + maxv[i] += v; addTag[i] += v; } } @@ -63,7 +67,7 @@ public static int add(int jobi, int jobv, int l, int r, int i) { rt = ++cntt; } if (l == r) { - max[rt] = Math.max(max[rt], jobv); + maxv[rt] = Math.max(maxv[rt], jobv); } else { down(rt); int mid = (l + r) >> 1; @@ -88,12 +92,12 @@ public static int merge(int l, int r, int t1, int t2, int max1, int max2) { return t1 + t2; } if (l == r) { - max[t1] = Math.max(max[t1], max1) + Math.max(max[t2], max2); + maxv[t1] = Math.max(maxv[t1], max1) + Math.max(maxv[t2], max2); } else { down(t1); down(t2); int mid = (l + r) >> 1; - ls[t1] = merge(l, mid, ls[t1], ls[t2], Math.max(max1, max[rs[t1]]), Math.max(max2, max[rs[t2]])); + ls[t1] = merge(l, mid, ls[t1], ls[t2], Math.max(max1, maxv[rs[t1]]), Math.max(max2, maxv[rs[t2]])); rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], max1, max2); up(t1); } @@ -105,7 +109,7 @@ public static int query(int jobl, int jobr, int l, int r, int i) { return 0; } if (jobl <= l && r <= jobr) { - return max[i]; + return maxv[i]; } down(i); int mid = (l + r) >> 1; @@ -142,7 +146,7 @@ public static void main(String[] args) throws Exception { addEdge(fa, i); } dp(1); - out.println(max[root[1]]); + out.println(maxv[root[1]]); out.flush(); out.close(); } diff --git a/src/class182/Code01_LeadersGroup2.java b/src/class182/Code01_LeadersGroup2.java new file mode 100644 index 000000000..de0b6c1e7 --- /dev/null +++ b/src/class182/Code01_LeadersGroup2.java @@ -0,0 +1,149 @@ +package class182; + +// 领导集团问题,C++版 +// 一共有n个节点,给定每个点的点权,所有节点组成一棵树 +// 已知1号节点是整棵树的头,其他节点的父亲节点都会给出 +// 如果你在树上选择了u、v两个节点,并且u是v的祖先节点的话 +// 那么需要保证 u的点权 <= v的点权,除此之外就没有别的限制了 +// 打印你最多能在树上选择几个点 +// 1 <= n <= 2 * 10^5 +// 0 <= 点权 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P4577 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//const int MAXV = 1000000000; +//const int MAXT = MAXN * 40; +//int n; +//int arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN]; +//int to[MAXN]; +//int cntg; +// +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int maxv[MAXT]; +//int addTag[MAXT]; +//int cntt; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void up(int i) { +// maxv[i] = max(maxv[ls[i]], maxv[rs[i]]); +//} +// +//void lazy(int i, int v) { +// if (i != 0) { +// maxv[i] += v; +// addTag[i] += v; +// } +//} +// +//void down(int i) { +// if (addTag[i] > 0) { +// lazy(ls[i], addTag[i]); +// lazy(rs[i], addTag[i]); +// addTag[i] = 0; +// } +//} +// +//int add(int jobi, int jobv, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = ++cntt; +// } +// if (l == r) { +// maxv[rt] = max(maxv[rt], jobv); +// } else { +// down(rt); +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = add(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//int merge(int l, int r, int t1, int t2, int max1, int max2) { +// if (t1 == 0 || t2 == 0) { +// if (t1 != 0) { +// lazy(t1, max2); +// } +// if (t2 != 0) { +// lazy(t2, max1); +// } +// return t1 + t2; +// } +// if (l == r) { +// maxv[t1] = max(maxv[t1], max1) + max(maxv[t2], max2); +// } else { +// down(t1); +// down(t2); +// int mid = (l + r) >> 1; +// ls[t1] = merge(l, mid, ls[t1], ls[t2], max(max1, maxv[rs[t1]]), max(max2, maxv[rs[t2]])); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], max1, max2); +// up(t1); +// } +// return t1; +//} +// +//int query(int jobl, int jobr, int l, int r, int i) { +// if (i == 0) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return maxv[i]; +// } +// down(i); +// int mid = (l + r) >> 1; +// int ans = 0; +// if (jobl <= mid) { +// ans = max(ans, query(jobl, jobr, l, mid, ls[i])); +// } +// if (jobr > mid) { +// ans = max(ans, query(jobl, jobr, mid + 1, r, rs[i])); +// } +// return ans; +//} +// +//void dp(int u) { +// int val = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// dp(v); +// val += query(arr[u], MAXV, 1, MAXV, root[v]); +// root[u] = merge(1, MAXV, root[u], root[v], 0, 0); +// } +// root[u] = add(arr[u], val, 1, MAXV, root[u]); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 2, fa; i <= n; i++) { +// cin >> fa; +// addEdge(fa, i); +// } +// dp(1); +// cout << maxv[root[1]] << '\n'; +// return 0; +//} \ No newline at end of file diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index bc3332700..4eb16d389 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -59,12 +59,12 @@ //} // //void up(int i) { -// sum[i] = (sum[ls[i]] + sum[rs[i]]) % MOD; +// sum[i] = (sum[ls[i]] + sum[rs[i]]) % MOD; //} // //void lazy(int i, long long v) { // if (i) { -// sum[i] = sum[i] * v % MOD; +// sum[i] = sum[i] * v % MOD; // mul[i] = mul[i] * v % MOD; // } //} @@ -84,7 +84,7 @@ // mul[rt] = 1; // } // if (l == r) { -// sum[rt] = 1; +// sum[rt] = 1; // } else { // down(rt); // int mid = (l + r) >> 1; From d43841176a3b6b7aebde2819a1de2f3d9be99411 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 14:00:19 +0800 Subject: [PATCH 0938/1170] modify code --- src/class182/Code02_Minimax1.java | 28 ++++++++++++++++++---------- src/class182/Code02_Minimax2.java | 24 ++++++++++++++++-------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 8da6229df..4295e066a 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -1,6 +1,14 @@ package class182; -// 根节点的概率,java版 +// 根节点的取值概率,java版 +// 一共有n个节点,1号节点是整棵树的头,所有节点组成一棵树 +// 给定一个长度为n的数组arr,如果节点x是叶,那么arr[x]表示点权,所有叶节点的点权都不同 +// 如果节点x不是叶,那么它最多有两个孩子,那么arr[x]代表概率,按如下规则决定节点x的点权 +// 以arr[x]的概率是所有儿子的点权最大值,以1 - arr[x]的概率是所有儿子的点权最小值 +// 表示概率时,arr[x]范围是[1, 9999],表示概率[0.0001 ~ 0.9999] +// 假设1号结点的权值有m种可能性,第i小的权值是Vi,取得的概率为Di +// 计算 i = 1..m 时,每一项 (i * Vi * Di * Di) 的累加和,答案对 998244353 取模 +// 1 <= n <= 3 * 10^5 1 <= 叶节点权值 <= 10^9 1 <= 概率 <= 9999 // 测试链接 : https://www.luogu.com.cn/problem/P5298 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -18,7 +26,7 @@ public class Code02_Minimax1 { public static int n; public static int[] fa = new int[MAXN]; - public static int[] val = new int[MAXN]; + public static int[] arr = new int[MAXN]; public static int[] sorted = new int[MAXN]; public static int cntv; @@ -130,14 +138,14 @@ public static int merge(int l, int r, int t1, int t2, int p, long sum1, long sum // 迭代版,java会爆栈,C++可以通过 public static void dfs1(int u) { if (sonCnt[u] == 0) { - root[u] = insert(val[u], 1, cntv, root[u]); + root[u] = insert(arr[u], 1, cntv, root[u]); } else if (sonCnt[u] == 1) { dfs1(son[u][0]); root[u] = root[son[u][0]]; } else { dfs1(son[u][0]); dfs1(son[u][1]); - root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], val[u], 0, 0); + root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], arr[u], 0, 0); } } @@ -151,7 +159,7 @@ public static void dfs2() { int u = stack[siz][0]; int s = stack[siz--][1]; if (sonCnt[u] == 0) { - root[u] = insert(val[u], 1, cntv, root[u]); + root[u] = insert(arr[u], 1, cntv, root[u]); } else if (sonCnt[u] == 1) { if (s == 0) { stack[++siz][0] = u; @@ -170,7 +178,7 @@ public static void dfs2() { stack[++siz][0] = son[u][0]; stack[siz][1] = 0; } else { - root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], val[u], 0, 0); + root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], arr[u], 0, 0); } } } @@ -199,9 +207,9 @@ public static void prepare() { long inv = power(10000, MOD - 2); for (int i = 1; i <= n; i++) { if (sonCnt[i] == 0) { - sorted[++cntv] = val[i]; + sorted[++cntv] = arr[i]; } else { - val[i] = (int) (inv * val[i] % MOD); + arr[i] = (int) (inv * arr[i] % MOD); } } Arrays.sort(sorted, 1, cntv + 1); @@ -214,7 +222,7 @@ public static void prepare() { cntv = len; for (int i = 1; i <= n; i++) { if (sonCnt[i] == 0) { - val[i] = kth(val[i]); + arr[i] = kth(arr[i]); } } } @@ -227,7 +235,7 @@ public static void main(String[] args) throws Exception { fa[i] = in.nextInt(); } for (int i = 1; i <= n; i++) { - val[i] = in.nextInt(); + arr[i] = in.nextInt(); } prepare(); // dfs1(1); diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 4eb16d389..7aef2c322 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -1,6 +1,14 @@ package class182; -// 根节点的概率,C++版 +// 根节点的取值概率,C++版 +// 一共有n个节点,1号节点是整棵树的头,所有节点组成一棵树 +// 给定一个长度为n的数组arr,如果节点x是叶,那么arr[x]表示点权,所有叶节点的点权都不同 +// 如果节点x不是叶,那么它最多有两个孩子,那么arr[x]代表概率,按如下规则决定节点x的点权 +// 以arr[x]的概率是所有儿子的点权最大值,以1 - arr[x]的概率是所有儿子的点权最小值 +// 表示概率时,arr[x]范围是[1, 9999],表示概率[0.0001 ~ 0.9999] +// 假设1号结点的权值有m种可能性,第i小的权值是Vi,取得的概率为Di +// 计算 i = 1..m 时,每一项 (i * Vi * Di * Di) 的累加和,答案对 998244353 取模 +// 1 <= n <= 3 * 10^5 1 <= 叶节点权值 <= 10^9 1 <= 概率 <= 9999 // 测试链接 : https://www.luogu.com.cn/problem/P5298 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -15,7 +23,7 @@ //int n; // //int fa[MAXN]; -//int val[MAXN]; +//int arr[MAXN]; //int sorted[MAXN]; //int cntv; // @@ -127,14 +135,14 @@ // //void dfs(int u) { // if (sonCnt[u] == 0) { -// root[u] = insert(val[u], 1, cntv, root[u]); +// root[u] = insert(arr[u], 1, cntv, root[u]); // } else if (sonCnt[u] == 1) { // dfs(son[u][0]); // root[u] = root[son[u][0]]; // } else { // dfs(son[u][0]); // dfs(son[u][1]); -// root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], val[u], 0, 0); +// root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], arr[u], 0, 0); // } //} // @@ -161,9 +169,9 @@ // long long inv = power(10000, MOD - 2); // for (int i = 1; i <= n; i++) { // if (sonCnt[i] == 0) { -// sorted[++cntv] = val[i]; +// sorted[++cntv] = arr[i]; // } else { -// val[i] = (int)(inv * val[i] % MOD); +// arr[i] = (int)(inv * arr[i] % MOD); // } // } // sort(sorted + 1, sorted + cntv + 1); @@ -176,7 +184,7 @@ // cntv = len; // for (int i = 1; i <= n; i++) { // if (sonCnt[i] == 0) { -// val[i] = kth(val[i]); +// arr[i] = kth(arr[i]); // } // } //} @@ -189,7 +197,7 @@ // cin >> fa[i]; // } // for (int i = 1; i <= n; i++) { -// cin >> val[i]; +// cin >> arr[i]; // } // prepare(); // dfs(1); From 3e061e64af2d0150fc95bdcba2a19ca12eb8609b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 14:09:57 +0800 Subject: [PATCH 0939/1170] modify code --- src/class182/Code02_Minimax1.java | 4 ++-- src/class182/Code02_Minimax2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 4295e066a..7b396ad2e 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -5,8 +5,8 @@ // 给定一个长度为n的数组arr,如果节点x是叶,那么arr[x]表示点权,所有叶节点的点权都不同 // 如果节点x不是叶,那么它最多有两个孩子,那么arr[x]代表概率,按如下规则决定节点x的点权 // 以arr[x]的概率是所有儿子的点权最大值,以1 - arr[x]的概率是所有儿子的点权最小值 -// 表示概率时,arr[x]范围是[1, 9999],表示概率[0.0001 ~ 0.9999] -// 假设1号结点的权值有m种可能性,第i小的权值是Vi,取得的概率为Di +// 表示概率时,arr[x]的范围是[1, 9999],表示概率 0.0001 ~ 0.9999 +// 假设1号结点的权值有m种可能性,第i小的权值是Vi,取得概率为Di // 计算 i = 1..m 时,每一项 (i * Vi * Di * Di) 的累加和,答案对 998244353 取模 // 1 <= n <= 3 * 10^5 1 <= 叶节点权值 <= 10^9 1 <= 概率 <= 9999 // 测试链接 : https://www.luogu.com.cn/problem/P5298 diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 7aef2c322..ec4e64a51 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -5,8 +5,8 @@ // 给定一个长度为n的数组arr,如果节点x是叶,那么arr[x]表示点权,所有叶节点的点权都不同 // 如果节点x不是叶,那么它最多有两个孩子,那么arr[x]代表概率,按如下规则决定节点x的点权 // 以arr[x]的概率是所有儿子的点权最大值,以1 - arr[x]的概率是所有儿子的点权最小值 -// 表示概率时,arr[x]范围是[1, 9999],表示概率[0.0001 ~ 0.9999] -// 假设1号结点的权值有m种可能性,第i小的权值是Vi,取得的概率为Di +// 表示概率时,arr[x]的范围是[1, 9999],表示概率 0.0001 ~ 0.9999 +// 假设1号结点的权值有m种可能性,第i小的权值是Vi,取得概率为Di // 计算 i = 1..m 时,每一项 (i * Vi * Di * Di) 的累加和,答案对 998244353 取模 // 1 <= n <= 3 * 10^5 1 <= 叶节点权值 <= 10^9 1 <= 概率 <= 9999 // 测试链接 : https://www.luogu.com.cn/problem/P5298 From dd430cb0d0fba89a0bff562cc93aaca2b6c1598f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 14:44:13 +0800 Subject: [PATCH 0940/1170] modify code --- src/class182/Code03_Fate1.java | 11 ++- src/class182/Code03_Fate2.java | 170 +++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+), 5 deletions(-) create mode 100644 src/class182/Code03_Fate2.java diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index 763eef28b..4920a6708 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -1,6 +1,12 @@ package class182; // 命运,java版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树,规定1号节点是树头 +// 给定m个点对,每个点对(x, y),已知x是y的祖先节点,路径由从上到下的边组成 +// 你可以给树上的每条边涂色,每条边都能涂上白色或者黑色,完全由你决定 +// 但是请保证每个点对的路径中,至少有一个黑色存在 +// 打印给树涂色的方法数,答案对 998244353 取模 +// 1 <= n、m <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P6773 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -178,11 +184,6 @@ public static void dp1(int u, int fa) { int v = to[e]; if (v != fa) { dp1(v, u); - } - } - for (int ei = head[u]; ei > 0; ei = nxt[ei]) { - int v = to[ei]; - if (v != fa) { root[u] = merge(0, n, root[u], root[v], 0, query(0, dep[u], 0, n, root[v])); } } diff --git a/src/class182/Code03_Fate2.java b/src/class182/Code03_Fate2.java new file mode 100644 index 000000000..9ee682df8 --- /dev/null +++ b/src/class182/Code03_Fate2.java @@ -0,0 +1,170 @@ +package class182; + +// 命运,C++版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树,规定1号节点是树头 +// 给定m个点对,每个点对(x, y),已知x是y的祖先节点,路径由从上到下的边组成 +// 你可以给树上的每条边涂色,每条边都能涂上白色或者黑色,完全由你决定 +// 但是请保证每个点对的路径中,至少有一个黑色存在 +// 打印给树涂色的方法数,答案对 998244353 取模 +// 1 <= n、m <= 5 * 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P6773 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 500001; +//const int MAXT = MAXN * 40; +//const int MOD = 998244353; +//int n, m; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//long long sum[MAXT]; +//long long mul[MAXT]; +//int cntt; +// +//int dep[MAXN]; +//int maxdep[MAXN]; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void up(int i) { +// sum[i] = (sum[ls[i]] + sum[rs[i]]) % MOD; +//} +// +//void lazy(int i, long long v) { +// if (i != 0) { +// sum[i] = sum[i] * v % MOD; +// mul[i] = mul[i] * v % MOD; +// } +//} +// +//void down(int i) { +// if (mul[i] != 1) { +// lazy(ls[i], mul[i]); +// lazy(rs[i], mul[i]); +// mul[i] = 1; +// } +//} +// +//int insert(int jobi, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = ++cntt; +// mul[rt] = 1; +// } +// if (l == r) { +// sum[rt] = 1; +// } else { +// down(rt); +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = insert(jobi, l, mid, ls[rt]); +// } else { +// rs[rt] = insert(jobi, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//int Merge(int l, int r, int t1, int t2, long long sum1, long long sum2) { +// if (t1 == 0 || t2 == 0) { +// if (t1 != 0) { +// lazy(t1, sum2); +// } +// if (t2 != 0) { +// lazy(t2, sum1); +// } +// return t1 + t2; +// } +// if (l == r) { +// sum[t1] = ((sum[t1] * (sum2 + sum[t2])) % MOD + (sum[t2] * sum1) % MOD) % MOD; +// } else { +// down(t1); +// down(t2); +// int mid = (l + r) >> 1; +// long long tmp1 = sum[ls[t1]]; +// long long tmp2 = sum[ls[t2]]; +// ls[t1] = Merge(l, mid, ls[t1], ls[t2], sum1, sum2); +// rs[t1] = Merge(mid + 1, r, rs[t1], rs[t2], sum1 + tmp1, sum2 + tmp2); +// up(t1); +// } +// return t1; +//} +// +//long long query(int jobl, int jobr, int l, int r, int i) { +// if (i == 0) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return sum[i] % MOD; +// } +// down(i); +// int mid = (l + r) >> 1; +// long long ans = 0; +// if (jobl <= mid) { +// ans = query(jobl, jobr, l, mid, ls[i]) % MOD; +// } +// if (jobr > mid) { +// ans = (ans + query(jobl, jobr, mid + 1, r, rs[i])) % MOD; +// } +// return ans; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// dfs(v, u); +// } +// } +//} +// +//void dp(int u, int fa) { +// root[u] = insert(maxdep[u], 0, n, root[u]); +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// dp(v, u); +// root[u] = Merge(0, n, root[u], root[v], 0, query(0, dep[u], 0, n, root[v])); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs(1, 0); +// cin >> m; +// for (int i = 1, x, y; i <= m; i++) { +// cin >> x >> y; +// if (dep[x] > maxdep[y]) { +// maxdep[y] = dep[x]; +// } +// } +// dp(1, 0); +// long long ans = query(0, 0, 0, n, root[1]) % MOD; +// cout << ans << '\n'; +// return 0; +//} \ No newline at end of file From 46c191dc725aa65b967721382b1ccf31c9e09fb2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 15:06:17 +0800 Subject: [PATCH 0941/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 8 ++++++++ src/class182/Code04_SegmentTreeSplit2.java | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index f7ec11bb3..6e745b56e 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -1,6 +1,14 @@ package class182; // 线段树分裂,java版 +// 数字范围1~n,给定每种数字的个数,建立编号为1的可重集合,以后新集合的编号自增即可 +// 接下来有m条操作,每条操作是如下六种类型中的一种 +// 操作 0 x y z : x号集合中,取出[y, z]范围上的所有数字,生成新的集合 +// 操作 1 x y : x号集合与y号集合合并,以后y编号的集合不会使用了 +// 操作 2 x y z : x号集合中,加入y个数字z +// 操作 3 x y z : x号集合中,查询[y, z]范围上的数字个数 +// 操作 4 x y : x号集合中,查询第y小的数字,不存在打印-1 +// 1 <= 所有数据 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5494 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index a1d8b2265..b73daaf6b 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -1,6 +1,14 @@ package class182; // 线段树分裂,C++版 +// 数字范围1~n,给定每种数字的个数,建立编号为1的可重集合,以后新集合的编号自增即可 +// 接下来有m条操作,每条操作是如下六种类型中的一种 +// 操作 0 x y z : x号集合中,取出[y, z]范围上的所有数字,生成新的集合 +// 操作 1 x y : x号集合与y号集合合并,以后y编号的集合不会使用了 +// 操作 2 x y z : x号集合中,加入y个数字z +// 操作 3 x y z : x号集合中,查询[y, z]范围上的数字个数 +// 操作 4 x y : x号集合中,查询第y小的数字,不存在打印-1 +// 1 <= 所有数据 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5494 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 4a262cada5ce63aad2aa5055f788ee324fa636a7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 15:29:24 +0800 Subject: [PATCH 0942/1170] modify code --- src/class173/Code05_HLD2.java | 2 +- src/class182/Code05_MassChangeQueries1.java | 18 ++- src/class182/Code05_MassChangeQueries2.java | 160 ++++++++++++++++++++ 3 files changed, 171 insertions(+), 9 deletions(-) create mode 100644 src/class182/Code05_MassChangeQueries2.java diff --git a/src/class173/Code05_HLD2.java b/src/class173/Code05_HLD2.java index 36d2a4e83..bb2d84f76 100644 --- a/src/class173/Code05_HLD2.java +++ b/src/class173/Code05_HLD2.java @@ -137,7 +137,7 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m >> f; -// for (int i = 1; i <= n; ++i) { +// for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } // for (int i = 1, u, v; i < n; i++) { diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java index d3a832f73..586e25758 100644 --- a/src/class182/Code05_MassChangeQueries1.java +++ b/src/class182/Code05_MassChangeQueries1.java @@ -1,6 +1,11 @@ package class182; // 值全改的操作,java版 +// 给定一个长度为n的数组arr,接下来有q条操作,格式如下 +// 操作 l r x y : arr[l..r]范围上,所有数字x改成数字y +// 所有操作做完之后,从左到右打印arr中的值 +// 1 <= n、q <= 2 * 10^5 +// 1 <= arr[i]、x、y <= 100 // 测试链接 : https://www.luogu.com.cn/problem/CF911G // 测试链接 : https://codeforces.com/problemset/problem/911/G // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -46,8 +51,8 @@ public static void del(int i) { sum[i] = 0; } - public static void up(int p) { - sum[p] = sum[ls[p]] + sum[rs[p]]; + public static void up(int i) { + sum[i] = sum[ls[i]] + sum[rs[i]]; } public static int insert(int jobi, int l, int r, int i) { @@ -146,11 +151,9 @@ public static void main(String[] args) throws Exception { r = in.nextInt(); x = in.nextInt(); y = in.nextInt(); - if (x != y) { - split(l, r, 1, n, root[x]); - root[x] = tree1; - root[y] = merge(1, n, root[y], tree2); - } + split(l, r, 1, n, root[x]); + root[x] = tree1; + root[y] = merge(1, n, root[y], tree2); } for (int v = 1; v <= MAXV; v++) { dfs(v, 1, n, root[v]); @@ -158,7 +161,6 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { out.print(ans[i] + " "); } - out.println(); out.flush(); out.close(); } diff --git a/src/class182/Code05_MassChangeQueries2.java b/src/class182/Code05_MassChangeQueries2.java new file mode 100644 index 000000000..240be11c0 --- /dev/null +++ b/src/class182/Code05_MassChangeQueries2.java @@ -0,0 +1,160 @@ +package class182; + +// 值全改的操作,C++版 +// 给定一个长度为n的数组arr,接下来有q条操作,格式如下 +// 操作 l r x y : arr[l..r]范围上,所有数字x改成数字y +// 所有操作做完之后,从左到右打印arr中的值 +// 1 <= n、q <= 2 * 10^5 +// 1 <= arr[i]、x、y <= 100 +// 测试链接 : https://www.luogu.com.cn/problem/CF911G +// 测试链接 : https://codeforces.com/problemset/problem/911/G +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//const int MAXV = 100; +//const int MAXT = MAXN * 40; +//int n, q; +//int arr[MAXN]; +// +//int root[MAXV + 1]; +//int ls[MAXT]; +//int rs[MAXT]; +//int sum[MAXT]; +// +//int pool[MAXT]; +//int top; +// +//int ans[MAXN]; +// +//void prepare() { +// top = 0; +// for (int i = 1; i < MAXT; i++) { +// pool[++top] = i; +// } +//} +// +//int newNode() { +// return pool[top--]; +//} +// +//void del(int i) { +// pool[++top] = i; +// ls[i] = 0; +// rs[i] = 0; +// sum[i] = 0; +//} +// +//void up(int i) { +// sum[i] = sum[ls[i]] + sum[rs[i]]; +//} +// +//int insert(int jobi, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = newNode(); +// } +// if (l == r) { +// sum[rt]++; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = insert(jobi, l, mid, ls[rt]); +// } else { +// rs[rt] = insert(jobi, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//int merge(int l, int r, int t1, int t2) { +// if (t1 == 0 || t2 == 0) { +// return t1 + t2; +// } +// if (l == r) { +// sum[t1] += sum[t2]; +// } else { +// int mid = (l + r) >> 1; +// ls[t1] = merge(l, mid, ls[t1], ls[t2]); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2]); +// up(t1); +// } +// del(t2); +// return t1; +//} +// +//int tree1, tree2; +// +//void split(int jobl, int jobr, int l, int r, int t1) { +// if (t1 == 0) { +// tree1 = t1; +// tree2 = 0; +// return; +// } +// if (jobl <= l && r <= jobr) { +// tree1 = 0; +// tree2 = t1; +// return; +// } +// int t2 = newNode(); +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// split(jobl, jobr, l, mid, ls[t1]); +// ls[t1] = tree1; +// ls[t2] = tree2; +// } +// if (jobr > mid) { +// split(jobl, jobr, mid + 1, r, rs[t1]); +// rs[t1] = tree1; +// rs[t2] = tree2; +// } +// up(t1); +// up(t2); +// tree1 = t1; +// tree2 = t2; +//} +// +//void dfs(int val, int l, int r, int i) { +// if (i == 0 || sum[i] == 0) { +// return; +// } +// if (l == r) { +// ans[l] = val; +// } else { +// int mid = (l + r) >> 1; +// dfs(val, l, mid, ls[i]); +// dfs(val, mid + 1, r, rs[i]); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// prepare(); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// cin >> q; +// for (int i = 1; i <= n; i++) { +// root[arr[i]] = insert(i, 1, n, root[arr[i]]); +// } +// for (int i = 1, l, r, x, y; i <= q; i++) { +// cin >> l >> r >> x >> y; +// split(l, r, 1, n, root[x]); +// root[x] = tree1; +// root[y] = merge(1, n, root[y], tree2); +// } +// for (int v = 1; v <= MAXV; v++) { +// dfs(v, 1, n, root[v]); +// } +// for (int i = 1; i <= n; i++) { +// cout << ans[i] << ' '; +// } +// return 0; +//} \ No newline at end of file From 17e50614b17592566d03dc4b401602a122fcb3b6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 15:43:32 +0800 Subject: [PATCH 0943/1170] modify code --- src/class182/Code02_Minimax1.java | 2 +- src/class182/Code02_Minimax2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 7b396ad2e..57e2e258f 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -1,6 +1,6 @@ package class182; -// 根节点的取值概率,java版 +// 根节点的取值,java版 // 一共有n个节点,1号节点是整棵树的头,所有节点组成一棵树 // 给定一个长度为n的数组arr,如果节点x是叶,那么arr[x]表示点权,所有叶节点的点权都不同 // 如果节点x不是叶,那么它最多有两个孩子,那么arr[x]代表概率,按如下规则决定节点x的点权 diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index ec4e64a51..91c7da944 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -1,6 +1,6 @@ package class182; -// 根节点的取值概率,C++版 +// 根节点的取值,C++版 // 一共有n个节点,1号节点是整棵树的头,所有节点组成一棵树 // 给定一个长度为n的数组arr,如果节点x是叶,那么arr[x]表示点权,所有叶节点的点权都不同 // 如果节点x不是叶,那么它最多有两个孩子,那么arr[x]代表概率,按如下规则决定节点x的点权 From 32915aa4e73ef786ba58eac94fe32006a54fde46 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 17:17:37 +0800 Subject: [PATCH 0944/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 14 +++++++------- src/class182/Code01_LeadersGroup2.java | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index 6060c0ded..1f1796e55 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -7,7 +7,7 @@ // 那么需要保证 u的点权 <= v的点权,除此之外就没有别的限制了 // 打印你最多能在树上选择几个点 // 1 <= n <= 2 * 10^5 -// 0 <= 点权 <= 10^9 +// 1 <= 点权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4577 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -61,7 +61,7 @@ public static void down(int i) { } } - public static int add(int jobi, int jobv, int l, int r, int i) { + public static int update(int jobi, int jobv, int l, int r, int i) { int rt = i; if (rt == 0) { rt = ++cntt; @@ -72,9 +72,9 @@ public static int add(int jobi, int jobv, int l, int r, int i) { down(rt); int mid = (l + r) >> 1; if (jobi <= mid) { - ls[rt] = add(jobi, jobv, l, mid, ls[rt]); + ls[rt] = update(jobi, jobv, l, mid, ls[rt]); } else { - rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); + rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); } up(rt); } @@ -92,7 +92,7 @@ public static int merge(int l, int r, int t1, int t2, int max1, int max2) { return t1 + t2; } if (l == r) { - maxv[t1] = Math.max(maxv[t1], max1) + Math.max(maxv[t2], max2); + maxv[t1] += Math.max(maxv[t2], max2); } else { down(t1); down(t2); @@ -131,7 +131,7 @@ public static void dp(int u) { val += query(arr[u], MAXV, 1, MAXV, root[v]); root[u] = merge(1, MAXV, root[u], root[v], 0, 0); } - root[u] = add(arr[u], val, 1, MAXV, root[u]); + root[u] = update(arr[u], val, 1, MAXV, root[u]); } public static void main(String[] args) throws Exception { @@ -146,7 +146,7 @@ public static void main(String[] args) throws Exception { addEdge(fa, i); } dp(1); - out.println(maxv[root[1]]); + out.println(query(1, MAXV, 1, MAXV, root[1])); out.flush(); out.close(); } diff --git a/src/class182/Code01_LeadersGroup2.java b/src/class182/Code01_LeadersGroup2.java index de0b6c1e7..c4f144bf9 100644 --- a/src/class182/Code01_LeadersGroup2.java +++ b/src/class182/Code01_LeadersGroup2.java @@ -7,7 +7,7 @@ // 那么需要保证 u的点权 <= v的点权,除此之外就没有别的限制了 // 打印你最多能在树上选择几个点 // 1 <= n <= 2 * 10^5 -// 0 <= 点权 <= 10^9 +// 1 <= 点权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4577 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -59,7 +59,7 @@ // } //} // -//int add(int jobi, int jobv, int l, int r, int i) { +//int update(int jobi, int jobv, int l, int r, int i) { // int rt = i; // if (rt == 0) { // rt = ++cntt; @@ -70,9 +70,9 @@ // down(rt); // int mid = (l + r) >> 1; // if (jobi <= mid) { -// ls[rt] = add(jobi, jobv, l, mid, ls[rt]); +// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); // } else { -// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); +// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); // } // up(rt); // } @@ -90,7 +90,7 @@ // return t1 + t2; // } // if (l == r) { -// maxv[t1] = max(maxv[t1], max1) + max(maxv[t2], max2); +// maxv[t1] += max(maxv[t2], max2); // } else { // down(t1); // down(t2); @@ -129,7 +129,7 @@ // val += query(arr[u], MAXV, 1, MAXV, root[v]); // root[u] = merge(1, MAXV, root[u], root[v], 0, 0); // } -// root[u] = add(arr[u], val, 1, MAXV, root[u]); +// root[u] = update(arr[u], val, 1, MAXV, root[u]); //} // //int main() { @@ -144,6 +144,6 @@ // addEdge(fa, i); // } // dp(1); -// cout << maxv[root[1]] << '\n'; +// cout << query(1, MAXV, 1, MAXV, root[1]) << '\n'; // return 0; //} \ No newline at end of file From babbc833ab642396903772cd6a85f23ef80d87c8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 17:59:24 +0800 Subject: [PATCH 0945/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 4 ++-- src/class182/Code01_LeadersGroup2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index 1f1796e55..47d90c0f4 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -124,14 +124,14 @@ public static int query(int jobl, int jobr, int l, int r, int i) { } public static void dp(int u) { - int val = 1; + int val = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; dp(v); val += query(arr[u], MAXV, 1, MAXV, root[v]); root[u] = merge(1, MAXV, root[u], root[v], 0, 0); } - root[u] = update(arr[u], val, 1, MAXV, root[u]); + root[u] = update(arr[u], val + 1, 1, MAXV, root[u]); } public static void main(String[] args) throws Exception { diff --git a/src/class182/Code01_LeadersGroup2.java b/src/class182/Code01_LeadersGroup2.java index c4f144bf9..9676ef22d 100644 --- a/src/class182/Code01_LeadersGroup2.java +++ b/src/class182/Code01_LeadersGroup2.java @@ -122,14 +122,14 @@ //} // //void dp(int u) { -// int val = 1; +// int val = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // dp(v); // val += query(arr[u], MAXV, 1, MAXV, root[v]); // root[u] = merge(1, MAXV, root[u], root[v], 0, 0); // } -// root[u] = update(arr[u], val, 1, MAXV, root[u]); +// root[u] = update(arr[u], val + 1, 1, MAXV, root[u]); //} // //int main() { From ab2c73c10876c06811ddda48e8af587fe7131920 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 18:02:49 +0800 Subject: [PATCH 0946/1170] modify code --- src/class182/Code02_Minimax1.java | 6 +++--- src/class182/Code02_Minimax2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 57e2e258f..c7d000208 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -40,7 +40,7 @@ public class Code02_Minimax1 { public static long[] mul = new long[MAXT]; public static int cntt; - public static long[] d = new long[MAXN]; + public static long[] D = new long[MAXN]; public static long power(long x, int p) { long ans = 1; @@ -189,7 +189,7 @@ public static void getd(int l, int r, int i) { return; } if (l == r) { - d[l] = sum[i] % MOD; + D[l] = sum[i] % MOD; } else { down(i); int mid = (l + r) >> 1; @@ -243,7 +243,7 @@ public static void main(String[] args) throws Exception { getd(1, cntv, root[1]); long ans = 0; for (int i = 1; i <= cntv; i++) { - ans = (ans + 1L * i * sorted[i] % MOD * d[i] % MOD * d[i]) % MOD; + ans = (ans + 1L * i * sorted[i] % MOD * D[i] % MOD * D[i]) % MOD; } out.println(ans); out.flush(); diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 91c7da944..38d58205f 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -38,7 +38,7 @@ //long long sum[MAXT]; //long long mul[MAXT]; // -//long long d[MAXN]; +//long long D[MAXN]; // //long long power(long long x, int p) { // long long ans = 1; @@ -151,7 +151,7 @@ // return; // } // if (l == r) { -// d[l] = sum[i] % MOD; +// D[l] = sum[i] % MOD; // } else { // down(i); // int mid = (l + r) >> 1; @@ -204,7 +204,7 @@ // getd(1, cntv, root[1]); // long long ans = 0; // for (int i = 1; i <= cntv; i++) { -// ans = (ans + (1LL * i * sorted[i]) % MOD * d[i] % MOD * d[i] % MOD) % MOD; +// ans = (ans + (1LL * i * sorted[i]) % MOD * D[i] % MOD * D[i] % MOD) % MOD; // } // cout << ans << '\n'; // return 0; From 8cdc70c92a2c095e1941942addcc304c59353084 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 18:57:29 +0800 Subject: [PATCH 0947/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 38 +++++++++++++------------- src/class182/Code01_LeadersGroup2.java | 38 +++++++++++++------------- src/class182/Code03_Fate1.java | 38 +++++++++++++------------- src/class182/Code03_Fate2.java | 38 +++++++++++++------------- 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index 47d90c0f4..a28f46a7f 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -81,6 +81,25 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } + public static int query(int jobl, int jobr, int l, int r, int i) { + if (i == 0) { + return 0; + } + if (jobl <= l && r <= jobr) { + return maxv[i]; + } + down(i); + int mid = (l + r) >> 1; + int ans = 0; + if (jobl <= mid) { + ans = Math.max(ans, query(jobl, jobr, l, mid, ls[i])); + } + if (jobr > mid) { + ans = Math.max(ans, query(jobl, jobr, mid + 1, r, rs[i])); + } + return ans; + } + public static int merge(int l, int r, int t1, int t2, int max1, int max2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { @@ -104,25 +123,6 @@ public static int merge(int l, int r, int t1, int t2, int max1, int max2) { return t1; } - public static int query(int jobl, int jobr, int l, int r, int i) { - if (i == 0) { - return 0; - } - if (jobl <= l && r <= jobr) { - return maxv[i]; - } - down(i); - int mid = (l + r) >> 1; - int ans = 0; - if (jobl <= mid) { - ans = Math.max(ans, query(jobl, jobr, l, mid, ls[i])); - } - if (jobr > mid) { - ans = Math.max(ans, query(jobl, jobr, mid + 1, r, rs[i])); - } - return ans; - } - public static void dp(int u) { int val = 0; for (int e = head[u]; e > 0; e = nxt[e]) { diff --git a/src/class182/Code01_LeadersGroup2.java b/src/class182/Code01_LeadersGroup2.java index 9676ef22d..b6c4dc7f9 100644 --- a/src/class182/Code01_LeadersGroup2.java +++ b/src/class182/Code01_LeadersGroup2.java @@ -79,6 +79,25 @@ // return rt; //} // +//int query(int jobl, int jobr, int l, int r, int i) { +// if (i == 0) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return maxv[i]; +// } +// down(i); +// int mid = (l + r) >> 1; +// int ans = 0; +// if (jobl <= mid) { +// ans = max(ans, query(jobl, jobr, l, mid, ls[i])); +// } +// if (jobr > mid) { +// ans = max(ans, query(jobl, jobr, mid + 1, r, rs[i])); +// } +// return ans; +//} +// //int merge(int l, int r, int t1, int t2, int max1, int max2) { // if (t1 == 0 || t2 == 0) { // if (t1 != 0) { @@ -102,25 +121,6 @@ // return t1; //} // -//int query(int jobl, int jobr, int l, int r, int i) { -// if (i == 0) { -// return 0; -// } -// if (jobl <= l && r <= jobr) { -// return maxv[i]; -// } -// down(i); -// int mid = (l + r) >> 1; -// int ans = 0; -// if (jobl <= mid) { -// ans = max(ans, query(jobl, jobr, l, mid, ls[i])); -// } -// if (jobr > mid) { -// ans = max(ans, query(jobl, jobr, mid + 1, r, rs[i])); -// } -// return ans; -//} -// //void dp(int u) { // int val = 0; // for (int e = head[u]; e; e = nxt[e]) { diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index 4920a6708..e4648b7d8 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -101,6 +101,25 @@ public static int insert(int jobi, int l, int r, int i) { return rt; } + public static long query(int jobl, int jobr, int l, int r, int i) { + if (i == 0) { + return 0; + } + if (jobl <= l && r <= jobr) { + return sum[i] % MOD; + } + down(i); + int mid = (l + r) >> 1; + long ans = 0; + if (jobl <= mid) { + ans = query(jobl, jobr, l, mid, ls[i]); + } + if (jobr > mid) { + ans = (ans + query(jobl, jobr, mid + 1, r, rs[i])) % MOD; + } + return ans; + } + public static int merge(int l, int r, int t1, int t2, long sum1, long sum2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { @@ -126,25 +145,6 @@ public static int merge(int l, int r, int t1, int t2, long sum1, long sum2) { return t1; } - public static long query(int jobl, int jobr, int l, int r, int i) { - if (i == 0) { - return 0; - } - if (jobl <= l && r <= jobr) { - return sum[i] % MOD; - } - down(i); - int mid = (l + r) >> 1; - long ans = 0; - if (jobl <= mid) { - ans = query(jobl, jobr, l, mid, ls[i]); - } - if (jobr > mid) { - ans = (ans + query(jobl, jobr, mid + 1, r, rs[i])) % MOD; - } - return ans; - } - // 递归版,java会爆栈,C++可以通过 public static void dfs1(int u, int fa) { dep[u] = dep[fa] + 1; diff --git a/src/class182/Code03_Fate2.java b/src/class182/Code03_Fate2.java index 9ee682df8..76c0d1368 100644 --- a/src/class182/Code03_Fate2.java +++ b/src/class182/Code03_Fate2.java @@ -81,6 +81,25 @@ // return rt; //} // +//long long query(int jobl, int jobr, int l, int r, int i) { +// if (i == 0) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return sum[i] % MOD; +// } +// down(i); +// int mid = (l + r) >> 1; +// long long ans = 0; +// if (jobl <= mid) { +// ans = query(jobl, jobr, l, mid, ls[i]) % MOD; +// } +// if (jobr > mid) { +// ans = (ans + query(jobl, jobr, mid + 1, r, rs[i])) % MOD; +// } +// return ans; +//} +// //int Merge(int l, int r, int t1, int t2, long long sum1, long long sum2) { // if (t1 == 0 || t2 == 0) { // if (t1 != 0) { @@ -106,25 +125,6 @@ // return t1; //} // -//long long query(int jobl, int jobr, int l, int r, int i) { -// if (i == 0) { -// return 0; -// } -// if (jobl <= l && r <= jobr) { -// return sum[i] % MOD; -// } -// down(i); -// int mid = (l + r) >> 1; -// long long ans = 0; -// if (jobl <= mid) { -// ans = query(jobl, jobr, l, mid, ls[i]) % MOD; -// } -// if (jobr > mid) { -// ans = (ans + query(jobl, jobr, mid + 1, r, rs[i])) % MOD; -// } -// return ans; -//} -// //void dfs(int u, int fa) { // dep[u] = dep[fa] + 1; // for (int e = head[u]; e; e = nxt[e]) { From 94b06ceb7396c6172f9994ff0fe7908af260fc6c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 19:00:38 +0800 Subject: [PATCH 0948/1170] modify code --- src/class182/Code02_Minimax1.java | 12 ++++++------ src/class182/Code02_Minimax2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index c7d000208..b8993d563 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -124,12 +124,12 @@ public static int merge(int l, int r, int t1, int t2, int p, long sum1, long sum down(t1); down(t2); int mid = (l + r) >> 1; - long l1 = (sum1 + sum[rs[t1]] * (1 - p + MOD)) % MOD; - long l2 = (sum2 + sum[rs[t2]] * (1 - p + MOD)) % MOD; - long r1 = (sum1 + sum[ls[t1]] * p) % MOD; - long r2 = (sum2 + sum[ls[t2]] * p) % MOD; - ls[t1] = merge(l, mid, ls[t1], ls[t2], p, l1, l2); - rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], p, r1, r2); + long lsum1 = (sum1 + sum[rs[t1]] * (1 - p + MOD)) % MOD; + long lsum2 = (sum2 + sum[rs[t2]] * (1 - p + MOD)) % MOD; + long rsum1 = (sum1 + sum[ls[t1]] * p) % MOD; + long rsum2 = (sum2 + sum[ls[t2]] * p) % MOD; + ls[t1] = merge(l, mid, ls[t1], ls[t2], p, lsum1, lsum2); + rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], p, rsum1, rsum2); up(t1); } return t1; diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 38d58205f..f47a5c3c4 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -122,12 +122,12 @@ // down(t1); // down(t2); // int mid = (l + r) >> 1; -// long long l1 = (sum1 + sum[rs[t1]] * (1 - p + MOD)) % MOD; -// long long l2 = (sum2 + sum[rs[t2]] * (1 - p + MOD)) % MOD; -// long long r1 = (sum1 + sum[ls[t1]] * p) % MOD; -// long long r2 = (sum2 + sum[ls[t2]] * p) % MOD; -// ls[t1] = merge(l, mid, ls[t1], ls[t2], p, l1, l2); -// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], p, r1, r2); +// long long lsum1 = (sum1 + sum[rs[t1]] * (1 - p + MOD)) % MOD; +// long long lsum2 = (sum2 + sum[rs[t2]] * (1 - p + MOD)) % MOD; +// long long rsum1 = (sum1 + sum[ls[t1]] * p) % MOD; +// long long rsum2 = (sum2 + sum[ls[t2]] * p) % MOD; +// ls[t1] = merge(l, mid, ls[t1], ls[t2], p, lsum1, lsum2); +// rs[t1] = merge(mid + 1, r, rs[t1], rs[t2], p, rsum1, rsum2); // up(t1); // } // return t1; From 5c09b2bfe3ad02876b200371ddeacc13de308c0a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 19:12:14 +0800 Subject: [PATCH 0949/1170] modify code --- src/class182/Code03_Fate1.java | 6 +++--- src/class182/Code03_Fate2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index e4648b7d8..6c28a064d 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -2,9 +2,9 @@ // 命运,java版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树,规定1号节点是树头 -// 给定m个点对,每个点对(x, y),已知x是y的祖先节点,路径由从上到下的边组成 -// 你可以给树上的每条边涂色,每条边都能涂上白色或者黑色,完全由你决定 -// 但是请保证每个点对的路径中,至少有一个黑色存在 +// 给定m个点对,每个点对(x, y),x是y的祖先节点,路径由从上到下的边组成 +// 树上的每条边都要涂上白色或者黑色,完全由你决定 +// 但是请保证每个点对的路径中,至少有一条黑色的边存在 // 打印给树涂色的方法数,答案对 998244353 取模 // 1 <= n、m <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P6773 diff --git a/src/class182/Code03_Fate2.java b/src/class182/Code03_Fate2.java index 76c0d1368..79fb49646 100644 --- a/src/class182/Code03_Fate2.java +++ b/src/class182/Code03_Fate2.java @@ -2,9 +2,9 @@ // 命运,C++版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树,规定1号节点是树头 -// 给定m个点对,每个点对(x, y),已知x是y的祖先节点,路径由从上到下的边组成 -// 你可以给树上的每条边涂色,每条边都能涂上白色或者黑色,完全由你决定 -// 但是请保证每个点对的路径中,至少有一个黑色存在 +// 给定m个点对,每个点对(x, y),x是y的祖先节点,路径由从上到下的边组成 +// 树上的每条边都要涂上白色或者黑色,完全由你决定 +// 但是请保证每个点对的路径中,至少有一条黑色的边存在 // 打印给树涂色的方法数,答案对 998244353 取模 // 1 <= n、m <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P6773 From 0762169cdb70437eef35d39725014702cec85ad5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Nov 2025 19:23:18 +0800 Subject: [PATCH 0950/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 8 ++++---- src/class182/Code04_SegmentTreeSplit2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index 6e745b56e..c89cdbe02 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -30,7 +30,7 @@ public class Code04_SegmentTreeSplit1 { public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static long[] sum = new long[MAXT]; - public static int cntRoot; + public static int version; public static int[] pool = new int[MAXT]; public static int top; @@ -162,10 +162,10 @@ public static void main(String[] args) throws Exception { prepare(); n = in.nextInt(); m = in.nextInt(); - cntRoot = 1; + version = 1; for (int i = 1, x; i <= n; i++) { x = in.nextInt(); - root[cntRoot] = add(i, x, 1, n, root[1]); + root[version] = add(i, x, 1, n, root[1]); } for (int i = 1, op, x, y, z; i <= m; i++) { op = in.nextInt(); @@ -175,7 +175,7 @@ public static void main(String[] args) throws Exception { z = in.nextInt(); split(y, z, 1, n, root[x]); root[x] = tree1; - root[++cntRoot] = tree2; + root[++version] = tree2; } else if (op == 1) { x = in.nextInt(); y = in.nextInt(); diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index b73daaf6b..a74848a3d 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -25,7 +25,7 @@ //int ls[MAXT]; //int rs[MAXT]; //long long sum[MAXT]; -//int cntRoot; +//int version; // //int pool[MAXT]; //int top; @@ -156,10 +156,10 @@ // cin.tie(nullptr); // prepare(); // cin >> n >> m; -// cntRoot = 1; +// version = 1; // for (int i = 1, x; i <= n; i++) { // cin >> x; -// root[cntRoot] = add(i, x, 1, n, root[1]); +// root[version] = add(i, x, 1, n, root[1]); // } // for (int i = 1, op, x, y, z; i <= m; i++) { // cin >> op; @@ -167,7 +167,7 @@ // cin >> x >> y >> z; // split(y, z, 1, n, root[x]); // root[x] = tree1; -// root[++cntRoot] = tree2; +// root[++version] = tree2; // } else if (op == 1) { // cin >> x >> y; // root[x] = merge(1, n, root[x], root[y]); From f999b69d8f5befa41fe6767f5b86704b48c099ee Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Nov 2025 10:22:04 +0800 Subject: [PATCH 0951/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 48 ++++++++++++++++++++++---- src/class182/Code01_LeadersGroup2.java | 47 +++++++++++++++++++++---- 2 files changed, 81 insertions(+), 14 deletions(-) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index a28f46a7f..af132cf31 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -15,14 +15,16 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.util.Arrays; public class Code01_LeadersGroup1 { public static int MAXN = 200001; - public static int MAXV = 1000000000; - public static int MAXT = MAXN * 40; + public static int MAXT = MAXN * 20; public static int n; public static int[] arr = new int[MAXN]; + public static int[] sorted = new int[MAXN]; + public static int cntv; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN]; @@ -36,6 +38,20 @@ public class Code01_LeadersGroup1 { public static int[] addTag = new int[MAXT]; public static int cntt; + public static int kth(int num) { + int left = 1, right = cntv, mid, ret = 0; + while (left <= right) { + mid = (left + right) >> 1; + if (sorted[mid] <= num) { + ret = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ret; + } + public static void addEdge(int u, int v) { nxt[++cntg] = head[u]; to[cntg] = v; @@ -124,14 +140,31 @@ public static int merge(int l, int r, int t1, int t2, int max1, int max2) { } public static void dp(int u) { - int val = 0; + int sum = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; dp(v); - val += query(arr[u], MAXV, 1, MAXV, root[v]); - root[u] = merge(1, MAXV, root[u], root[v], 0, 0); + sum += query(arr[u], cntv, 1, cntv, root[v]); + root[u] = merge(1, cntv, root[u], root[v], 0, 0); + } + root[u] = update(arr[u], sum + 1, 1, cntv, root[u]); + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[++cntv] = arr[i]; + } + Arrays.sort(sorted, 1, cntv + 1); + int len = 1; + for (int i = 2; i <= cntv; i++) { + if (sorted[len] != sorted[i]) { + sorted[++len] = sorted[i]; + } + } + cntv = len; + for (int i = 1; i <= n; i++) { + arr[i] = kth(arr[i]); } - root[u] = update(arr[u], val + 1, 1, MAXV, root[u]); } public static void main(String[] args) throws Exception { @@ -145,8 +178,9 @@ public static void main(String[] args) throws Exception { fa = in.nextInt(); addEdge(fa, i); } + prepare(); dp(1); - out.println(query(1, MAXV, 1, MAXV, root[1])); + out.println(query(1, cntv, 1, cntv, root[1])); out.flush(); out.close(); } diff --git a/src/class182/Code01_LeadersGroup2.java b/src/class182/Code01_LeadersGroup2.java index b6c4dc7f9..2891bffed 100644 --- a/src/class182/Code01_LeadersGroup2.java +++ b/src/class182/Code01_LeadersGroup2.java @@ -17,10 +17,11 @@ //using namespace std; // //const int MAXN = 200001; -//const int MAXV = 1000000000; -//const int MAXT = MAXN * 40; +//const int MAXT = MAXN * 20; //int n; //int arr[MAXN]; +//int sorted[MAXN]; +//int cntv; // //int head[MAXN]; //int nxt[MAXN]; @@ -34,6 +35,20 @@ //int addTag[MAXT]; //int cntt; // +//int kth(int num) { +// int left = 1, right = cntv, ret = 0; +// while (left <= right) { +// int mid = (left + right) >> 1; +// if (sorted[mid] <= num) { +// ret = mid; +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// } +// return ret; +//} +// //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; // to[cntg] = v; @@ -122,14 +137,31 @@ //} // //void dp(int u) { -// int val = 0; +// int sum = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // dp(v); -// val += query(arr[u], MAXV, 1, MAXV, root[v]); -// root[u] = merge(1, MAXV, root[u], root[v], 0, 0); +// sum += query(arr[u], cntv, 1, cntv, root[v]); +// root[u] = merge(1, cntv, root[u], root[v], 0, 0); +// } +// root[u] = update(arr[u], sum + 1, 1, cntv, root[u]); +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[++cntv] = arr[i]; +// } +// sort(sorted + 1, sorted + cntv + 1); +// int len = 1; +// for (int i = 2; i <= cntv; i++) { +// if (sorted[len] != sorted[i]) { +// sorted[++len] = sorted[i]; +// } +// } +// cntv = len; +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(arr[i]); // } -// root[u] = update(arr[u], val + 1, 1, MAXV, root[u]); //} // //int main() { @@ -143,7 +175,8 @@ // cin >> fa; // addEdge(fa, i); // } +// prepare(); // dp(1); -// cout << query(1, MAXV, 1, MAXV, root[1]) << '\n'; +// cout << query(1, cntv, 1, cntv, root[1]) << '\n'; // return 0; //} \ No newline at end of file From 271939e50793c380cdfe0e6697453d56f361edc2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Nov 2025 10:27:21 +0800 Subject: [PATCH 0952/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 12 ++++++------ src/class182/Code01_LeadersGroup2.java | 12 ++++++------ src/class182/Code02_Minimax1.java | 14 +++++++------- src/class182/Code02_Minimax2.java | 14 +++++++------- src/class182/Code03_Fate1.java | 14 +++++++------- src/class182/Code03_Fate2.java | 14 +++++++------- 6 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index af132cf31..623bfc839 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -35,7 +35,7 @@ public class Code01_LeadersGroup1 { public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static int[] maxv = new int[MAXT]; - public static int[] addTag = new int[MAXT]; + public static int[] addLazy = new int[MAXT]; public static int cntt; public static int kth(int num) { @@ -65,15 +65,15 @@ public static void up(int i) { public static void lazy(int i, int v) { if (i != 0) { maxv[i] += v; - addTag[i] += v; + addLazy[i] += v; } } public static void down(int i) { - if (addTag[i] > 0) { - lazy(ls[i], addTag[i]); - lazy(rs[i], addTag[i]); - addTag[i] = 0; + if (addLazy[i] > 0) { + lazy(ls[i], addLazy[i]); + lazy(rs[i], addLazy[i]); + addLazy[i] = 0; } } diff --git a/src/class182/Code01_LeadersGroup2.java b/src/class182/Code01_LeadersGroup2.java index 2891bffed..3e7a88553 100644 --- a/src/class182/Code01_LeadersGroup2.java +++ b/src/class182/Code01_LeadersGroup2.java @@ -32,7 +32,7 @@ //int ls[MAXT]; //int rs[MAXT]; //int maxv[MAXT]; -//int addTag[MAXT]; +//int addLazy[MAXT]; //int cntt; // //int kth(int num) { @@ -62,15 +62,15 @@ //void lazy(int i, int v) { // if (i != 0) { // maxv[i] += v; -// addTag[i] += v; +// addLazy[i] += v; // } //} // //void down(int i) { -// if (addTag[i] > 0) { -// lazy(ls[i], addTag[i]); -// lazy(rs[i], addTag[i]); -// addTag[i] = 0; +// if (addLazy[i] > 0) { +// lazy(ls[i], addLazy[i]); +// lazy(rs[i], addLazy[i]); +// addLazy[i] = 0; // } //} // diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index b8993d563..5480956dd 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -37,7 +37,7 @@ public class Code02_Minimax1 { public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static long[] sum = new long[MAXT]; - public static long[] mul = new long[MAXT]; + public static long[] mulLazy = new long[MAXT]; public static int cntt; public static long[] D = new long[MAXN]; @@ -75,15 +75,15 @@ public static void up(int i) { public static void lazy(int i, long v) { if (i != 0) { sum[i] = sum[i] * v % MOD; - mul[i] = mul[i] * v % MOD; + mulLazy[i] = mulLazy[i] * v % MOD; } } public static void down(int i) { - if (mul[i] != 1) { - lazy(ls[i], mul[i]); - lazy(rs[i], mul[i]); - mul[i] = 1; + if (mulLazy[i] != 1) { + lazy(ls[i], mulLazy[i]); + lazy(rs[i], mulLazy[i]); + mulLazy[i] = 1; } } @@ -91,7 +91,7 @@ public static int insert(int jobi, int l, int r, int i) { int rt = i; if (rt == 0) { rt = ++cntt; - mul[rt] = 1; + mulLazy[rt] = 1; } if (l == r) { sum[rt] = 1; diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index f47a5c3c4..51aaf4dfc 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -36,7 +36,7 @@ //int cntt; // //long long sum[MAXT]; -//long long mul[MAXT]; +//long long mulLazy[MAXT]; // //long long D[MAXN]; // @@ -73,15 +73,15 @@ //void lazy(int i, long long v) { // if (i) { // sum[i] = sum[i] * v % MOD; -// mul[i] = mul[i] * v % MOD; +// mulLazy[i] = mulLazy[i] * v % MOD; // } //} // //void down(int i) { -// if (mul[i] != 1) { -// lazy(ls[i], mul[i]); -// lazy(rs[i], mul[i]); -// mul[i] = 1; +// if (mulLazy[i] != 1) { +// lazy(ls[i], mulLazy[i]); +// lazy(rs[i], mulLazy[i]); +// mulLazy[i] = 1; // } //} // @@ -89,7 +89,7 @@ // int rt = i; // if (rt == 0) { // rt = ++cntt; -// mul[rt] = 1; +// mulLazy[rt] = 1; // } // if (l == r) { // sum[rt] = 1; diff --git a/src/class182/Code03_Fate1.java b/src/class182/Code03_Fate1.java index 6c28a064d..5232002d8 100644 --- a/src/class182/Code03_Fate1.java +++ b/src/class182/Code03_Fate1.java @@ -31,7 +31,7 @@ public class Code03_Fate1 { public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static long[] sum = new long[MAXT]; - public static long[] mul = new long[MAXT]; + public static long[] mulLazy = new long[MAXT]; public static int cntt; public static int[] dep = new int[MAXN]; @@ -68,15 +68,15 @@ public static void up(int i) { public static void lazy(int i, long v) { if (i != 0) { sum[i] = sum[i] * v % MOD; - mul[i] = mul[i] * v % MOD; + mulLazy[i] = mulLazy[i] * v % MOD; } } public static void down(int i) { - if (mul[i] != 1) { - lazy(ls[i], mul[i]); - lazy(rs[i], mul[i]); - mul[i] = 1; + if (mulLazy[i] != 1) { + lazy(ls[i], mulLazy[i]); + lazy(rs[i], mulLazy[i]); + mulLazy[i] = 1; } } @@ -84,7 +84,7 @@ public static int insert(int jobi, int l, int r, int i) { int rt = i; if (rt == 0) { rt = ++cntt; - mul[rt] = 1; + mulLazy[rt] = 1; } if (l == r) { sum[rt] = 1; diff --git a/src/class182/Code03_Fate2.java b/src/class182/Code03_Fate2.java index 79fb49646..bb6d90f36 100644 --- a/src/class182/Code03_Fate2.java +++ b/src/class182/Code03_Fate2.java @@ -29,7 +29,7 @@ //int ls[MAXT]; //int rs[MAXT]; //long long sum[MAXT]; -//long long mul[MAXT]; +//long long mulLazy[MAXT]; //int cntt; // //int dep[MAXN]; @@ -48,15 +48,15 @@ //void lazy(int i, long long v) { // if (i != 0) { // sum[i] = sum[i] * v % MOD; -// mul[i] = mul[i] * v % MOD; +// mulLazy[i] = mulLazy[i] * v % MOD; // } //} // //void down(int i) { -// if (mul[i] != 1) { -// lazy(ls[i], mul[i]); -// lazy(rs[i], mul[i]); -// mul[i] = 1; +// if (mulLazy[i] != 1) { +// lazy(ls[i], mulLazy[i]); +// lazy(rs[i], mulLazy[i]); +// mulLazy[i] = 1; // } //} // @@ -64,7 +64,7 @@ // int rt = i; // if (rt == 0) { // rt = ++cntt; -// mul[rt] = 1; +// mulLazy[rt] = 1; // } // if (l == r) { // sum[rt] = 1; From f83161aa44fd50cd38f060e247a0b88a9396d14a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Nov 2025 10:37:41 +0800 Subject: [PATCH 0953/1170] modify code --- src/class182/Code02_Minimax1.java | 16 ++++++++-------- src/class182/Code02_Minimax2.java | 13 ++++++------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 5480956dd..00d3ce65d 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -136,21 +136,21 @@ public static int merge(int l, int r, int t1, int t2, int p, long sum1, long sum } // 迭代版,java会爆栈,C++可以通过 - public static void dfs1(int u) { + public static void dp1(int u) { if (sonCnt[u] == 0) { root[u] = insert(arr[u], 1, cntv, root[u]); } else if (sonCnt[u] == 1) { - dfs1(son[u][0]); + dp1(son[u][0]); root[u] = root[son[u][0]]; } else { - dfs1(son[u][0]); - dfs1(son[u][1]); + dp1(son[u][0]); + dp1(son[u][1]); root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], arr[u], 0, 0); } } - // dfs1改成迭代版 - public static void dfs2() { + // dp1改成迭代版 + public static void dp2() { int[][] stack = new int[n + 1][2]; int siz = 0; stack[++siz][0] = 1; @@ -238,8 +238,8 @@ public static void main(String[] args) throws Exception { arr[i] = in.nextInt(); } prepare(); - // dfs1(1); - dfs2(); + // dp1(1); + dp2(); getd(1, cntv, root[1]); long ans = 0; for (int i = 1; i <= cntv; i++) { diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index 51aaf4dfc..a7e1a996c 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -33,10 +33,9 @@ //int root[MAXN]; //int ls[MAXT]; //int rs[MAXT]; -//int cntt; -// //long long sum[MAXT]; //long long mulLazy[MAXT]; +//int cntt; // //long long D[MAXN]; // @@ -133,15 +132,15 @@ // return t1; //} // -//void dfs(int u) { +//void dp(int u) { // if (sonCnt[u] == 0) { // root[u] = insert(arr[u], 1, cntv, root[u]); // } else if (sonCnt[u] == 1) { -// dfs(son[u][0]); +// dp(son[u][0]); // root[u] = root[son[u][0]]; // } else { -// dfs(son[u][0]); -// dfs(son[u][1]); +// dp(son[u][0]); +// dp(son[u][1]); // root[u] = merge(1, cntv, root[son[u][0]], root[son[u][1]], arr[u], 0, 0); // } //} @@ -200,7 +199,7 @@ // cin >> arr[i]; // } // prepare(); -// dfs(1); +// dp(1); // getd(1, cntv, root[1]); // long long ans = 0; // for (int i = 1; i <= cntv; i++) { From e5ac66cef89f4110addd8d4378c3b0a1bfd65742 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Nov 2025 13:15:44 +0800 Subject: [PATCH 0954/1170] modify code --- src/class182/Code01_LeadersGroup1.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/class182/Code01_LeadersGroup1.java b/src/class182/Code01_LeadersGroup1.java index 623bfc839..c3f052376 100644 --- a/src/class182/Code01_LeadersGroup1.java +++ b/src/class182/Code01_LeadersGroup1.java @@ -77,6 +77,7 @@ public static void down(int i) { } } + // jobi来了个新值jobv,如果比之前获得的值更大就更新,否则不更新 public static int update(int jobi, int jobv, int l, int r, int i) { int rt = i; if (rt == 0) { @@ -97,6 +98,7 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } + // 查询[jobl..jobr]范围上的最大值 public static int query(int jobl, int jobr, int l, int r, int i) { if (i == 0) { return 0; @@ -116,6 +118,8 @@ public static int query(int jobl, int jobr, int l, int r, int i) { return ans; } + // 线段树合并 + // max1代表dp[u][r+1...]的最大值,max2代表dp[v][r+1...]的最大值 public static int merge(int l, int r, int t1, int t2, int max1, int max2) { if (t1 == 0 || t2 == 0) { if (t1 != 0) { @@ -145,8 +149,10 @@ public static void dp(int u) { int v = to[e]; dp(v); sum += query(arr[u], cntv, 1, cntv, root[v]); + // 不选u的情况,每棵子树合并一遍 root[u] = merge(1, cntv, root[u], root[v], 0, 0); } + // 选u的情况,最后sum需要加1 root[u] = update(arr[u], sum + 1, 1, cntv, root[u]); } From 1f31558f3d6844a71f320f11049a14c5b2340cb2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Nov 2025 13:54:09 +0800 Subject: [PATCH 0955/1170] modify code --- src/class182/Code02_Minimax1.java | 2 +- src/class182/Code02_Minimax2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class182/Code02_Minimax1.java b/src/class182/Code02_Minimax1.java index 00d3ce65d..c426013f2 100644 --- a/src/class182/Code02_Minimax1.java +++ b/src/class182/Code02_Minimax1.java @@ -3,7 +3,7 @@ // 根节点的取值,java版 // 一共有n个节点,1号节点是整棵树的头,所有节点组成一棵树 // 给定一个长度为n的数组arr,如果节点x是叶,那么arr[x]表示点权,所有叶节点的点权都不同 -// 如果节点x不是叶,那么它最多有两个孩子,那么arr[x]代表概率,按如下规则决定节点x的点权 +// 如果节点x不是叶,那么它最多有两个孩子,此时arr[x]代表概率,节点x按照以下规则取得点权 // 以arr[x]的概率是所有儿子的点权最大值,以1 - arr[x]的概率是所有儿子的点权最小值 // 表示概率时,arr[x]的范围是[1, 9999],表示概率 0.0001 ~ 0.9999 // 假设1号结点的权值有m种可能性,第i小的权值是Vi,取得概率为Di diff --git a/src/class182/Code02_Minimax2.java b/src/class182/Code02_Minimax2.java index a7e1a996c..6891c0743 100644 --- a/src/class182/Code02_Minimax2.java +++ b/src/class182/Code02_Minimax2.java @@ -3,7 +3,7 @@ // 根节点的取值,C++版 // 一共有n个节点,1号节点是整棵树的头,所有节点组成一棵树 // 给定一个长度为n的数组arr,如果节点x是叶,那么arr[x]表示点权,所有叶节点的点权都不同 -// 如果节点x不是叶,那么它最多有两个孩子,那么arr[x]代表概率,按如下规则决定节点x的点权 +// 如果节点x不是叶,那么它最多有两个孩子,此时arr[x]代表概率,节点x按照以下规则取得点权 // 以arr[x]的概率是所有儿子的点权最大值,以1 - arr[x]的概率是所有儿子的点权最小值 // 表示概率时,arr[x]的范围是[1, 9999],表示概率 0.0001 ~ 0.9999 // 假设1号结点的权值有m种可能性,第i小的权值是Vi,取得概率为Di From 2ba31fd846d88e8fd8329fc60af79ed980af412c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Nov 2025 10:06:59 +0800 Subject: [PATCH 0956/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 7 ++----- src/class182/Code04_SegmentTreeSplit2.java | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index c89cdbe02..a5f2c27b6 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -10,10 +10,7 @@ // 操作 4 x y : x号集合中,查询第y小的数字,不存在打印-1 // 1 <= 所有数据 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5494 -// 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code04_SegmentTreeSplit2文件就是C++的实现 -// 两个版本的逻辑完全一样,C++版本可以通过所有测试 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; @@ -23,7 +20,7 @@ public class Code04_SegmentTreeSplit1 { public static int MAXN = 200001; - public static int MAXT = MAXN * 40; + public static int MAXT = MAXN * 10; public static int n, m; public static int[] root = new int[MAXN]; diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index a74848a3d..16e259611 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -18,7 +18,7 @@ //using namespace std; // //const int MAXN = 200001; -//const int MAXT = MAXN * 40; +//const int MAXT = MAXN * 10; //int n, m; // //int root[MAXN]; From 277a3c910076e49fe21f31d8281b50d3fb710dec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Nov 2025 10:15:38 +0800 Subject: [PATCH 0957/1170] modify code --- src/class182/Code04_SegmentTreeSplit1.java | 2 +- src/class182/Code04_SegmentTreeSplit2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class182/Code04_SegmentTreeSplit1.java b/src/class182/Code04_SegmentTreeSplit1.java index a5f2c27b6..9d337003f 100644 --- a/src/class182/Code04_SegmentTreeSplit1.java +++ b/src/class182/Code04_SegmentTreeSplit1.java @@ -2,7 +2,7 @@ // 线段树分裂,java版 // 数字范围1~n,给定每种数字的个数,建立编号为1的可重集合,以后新集合的编号自增即可 -// 接下来有m条操作,每条操作是如下六种类型中的一种 +// 接下来有m条操作,每条操作是如下五种类型中的一种 // 操作 0 x y z : x号集合中,取出[y, z]范围上的所有数字,生成新的集合 // 操作 1 x y : x号集合与y号集合合并,以后y编号的集合不会使用了 // 操作 2 x y z : x号集合中,加入y个数字z diff --git a/src/class182/Code04_SegmentTreeSplit2.java b/src/class182/Code04_SegmentTreeSplit2.java index 16e259611..c3b4eb752 100644 --- a/src/class182/Code04_SegmentTreeSplit2.java +++ b/src/class182/Code04_SegmentTreeSplit2.java @@ -2,7 +2,7 @@ // 线段树分裂,C++版 // 数字范围1~n,给定每种数字的个数,建立编号为1的可重集合,以后新集合的编号自增即可 -// 接下来有m条操作,每条操作是如下六种类型中的一种 +// 接下来有m条操作,每条操作是如下五种类型中的一种 // 操作 0 x y z : x号集合中,取出[y, z]范围上的所有数字,生成新的集合 // 操作 1 x y : x号集合与y号集合合并,以后y编号的集合不会使用了 // 操作 2 x y z : x号集合中,加入y个数字z From 3810c818409071a75b222d067247886cc45398d0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Nov 2025 10:26:13 +0800 Subject: [PATCH 0958/1170] modify code --- src/class182/Code05_MassChangeQueries1.java | 2 +- src/class182/Code05_MassChangeQueries2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java index 586e25758..399c2d3fa 100644 --- a/src/class182/Code05_MassChangeQueries1.java +++ b/src/class182/Code05_MassChangeQueries1.java @@ -19,7 +19,7 @@ public class Code05_MassChangeQueries1 { public static int MAXN = 200001; public static int MAXV = 100; - public static int MAXT = MAXN * 40; + public static int MAXT = MAXN * 10; public static int n, q; public static int[] arr = new int[MAXN]; diff --git a/src/class182/Code05_MassChangeQueries2.java b/src/class182/Code05_MassChangeQueries2.java index 240be11c0..17af5eb7c 100644 --- a/src/class182/Code05_MassChangeQueries2.java +++ b/src/class182/Code05_MassChangeQueries2.java @@ -17,7 +17,7 @@ // //const int MAXN = 200001; //const int MAXV = 100; -//const int MAXT = MAXN * 40; +//const int MAXT = MAXN * 10; //int n, q; //int arr[MAXN]; // From 9b7466e4d350ae1999ff2ace29bb411f411332f2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Nov 2025 11:34:38 +0800 Subject: [PATCH 0959/1170] modify code --- src/class182/Code05_MassChangeQueries1.java | 6 ++---- src/class182/Code05_MassChangeQueries2.java | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java index 399c2d3fa..a9be87586 100644 --- a/src/class182/Code05_MassChangeQueries1.java +++ b/src/class182/Code05_MassChangeQueries1.java @@ -31,8 +31,6 @@ public class Code05_MassChangeQueries1 { public static int[] pool = new int[MAXT]; public static int top; - public static int[] ans = new int[MAXN]; - public static void prepare() { top = 0; for (int i = 1; i < MAXT; i++) { @@ -126,7 +124,7 @@ public static void dfs(int val, int l, int r, int i) { return; } if (l == r) { - ans[l] = val; + arr[l] = val; } else { int mid = (l + r) >> 1; dfs(val, l, mid, ls[i]); @@ -159,7 +157,7 @@ public static void main(String[] args) throws Exception { dfs(v, 1, n, root[v]); } for (int i = 1; i <= n; i++) { - out.print(ans[i] + " "); + out.print(arr[i] + " "); } out.flush(); out.close(); diff --git a/src/class182/Code05_MassChangeQueries2.java b/src/class182/Code05_MassChangeQueries2.java index 17af5eb7c..21474545b 100644 --- a/src/class182/Code05_MassChangeQueries2.java +++ b/src/class182/Code05_MassChangeQueries2.java @@ -29,8 +29,6 @@ //int pool[MAXT]; //int top; // -//int ans[MAXN]; -// //void prepare() { // top = 0; // for (int i = 1; i < MAXT; i++) { @@ -124,7 +122,7 @@ // return; // } // if (l == r) { -// ans[l] = val; +// arr[l] = val; // } else { // int mid = (l + r) >> 1; // dfs(val, l, mid, ls[i]); @@ -154,7 +152,7 @@ // dfs(v, 1, n, root[v]); // } // for (int i = 1; i <= n; i++) { -// cout << ans[i] << ' '; +// cout << arr[i] << ' '; // } // return 0; //} \ No newline at end of file From f5c17d73a39044c122b5dd04fa1352759abd2198 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Nov 2025 11:43:43 +0800 Subject: [PATCH 0960/1170] modify code --- src/class182/Code05_MassChangeQueries1.java | 12 ++++++------ src/class182/Code05_MassChangeQueries2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java index a9be87586..ce41222be 100644 --- a/src/class182/Code05_MassChangeQueries1.java +++ b/src/class182/Code05_MassChangeQueries1.java @@ -26,7 +26,7 @@ public class Code05_MassChangeQueries1 { public static int[] root = new int[MAXV + 1]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; - public static int[] sum = new int[MAXT]; + public static boolean[] status = new boolean[MAXT]; public static int[] pool = new int[MAXT]; public static int top; @@ -46,11 +46,11 @@ public static void del(int i) { pool[++top] = i; ls[i] = 0; rs[i] = 0; - sum[i] = 0; + status[i] = false; } public static void up(int i) { - sum[i] = sum[ls[i]] + sum[rs[i]]; + status[i] = status[ls[i]] | status[rs[i]]; } public static int insert(int jobi, int l, int r, int i) { @@ -59,7 +59,7 @@ public static int insert(int jobi, int l, int r, int i) { rt = newNode(); } if (l == r) { - sum[rt]++; + status[rt] = true; } else { int mid = (l + r) >> 1; if (jobi <= mid) { @@ -77,7 +77,7 @@ public static int merge(int l, int r, int t1, int t2) { return t1 + t2; } if (l == r) { - sum[t1] += sum[t2]; + status[t1] |= status[t2]; } else { int mid = (l + r) >> 1; ls[t1] = merge(l, mid, ls[t1], ls[t2]); @@ -120,7 +120,7 @@ public static void split(int jobl, int jobr, int l, int r, int t1) { } public static void dfs(int val, int l, int r, int i) { - if (i == 0 || sum[i] == 0) { + if (i == 0 || !status[i]) { return; } if (l == r) { diff --git a/src/class182/Code05_MassChangeQueries2.java b/src/class182/Code05_MassChangeQueries2.java index 21474545b..63a59674b 100644 --- a/src/class182/Code05_MassChangeQueries2.java +++ b/src/class182/Code05_MassChangeQueries2.java @@ -24,7 +24,7 @@ //int root[MAXV + 1]; //int ls[MAXT]; //int rs[MAXT]; -//int sum[MAXT]; +//bool status[MAXT]; // //int pool[MAXT]; //int top; @@ -44,11 +44,11 @@ // pool[++top] = i; // ls[i] = 0; // rs[i] = 0; -// sum[i] = 0; +// status[i] = false; //} // //void up(int i) { -// sum[i] = sum[ls[i]] + sum[rs[i]]; +// status[i] = status[ls[i]] | status[rs[i]]; //} // //int insert(int jobi, int l, int r, int i) { @@ -57,7 +57,7 @@ // rt = newNode(); // } // if (l == r) { -// sum[rt]++; +// status[rt] = true; // } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { @@ -75,7 +75,7 @@ // return t1 + t2; // } // if (l == r) { -// sum[t1] += sum[t2]; +// status[t1] |= status[t2]; // } else { // int mid = (l + r) >> 1; // ls[t1] = merge(l, mid, ls[t1], ls[t2]); @@ -118,7 +118,7 @@ //} // //void dfs(int val, int l, int r, int i) { -// if (i == 0 || sum[i] == 0) { +// if (i == 0 || !status[i]) { // return; // } // if (l == r) { From 27a6de18ac7f6f5d8deb6e60cdd64a693c488606 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Nov 2025 11:54:30 +0800 Subject: [PATCH 0961/1170] modify code --- src/class182/Code05_MassChangeQueries1.java | 2 +- src/class182/Code05_MassChangeQueries2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java index ce41222be..059ea71d3 100644 --- a/src/class182/Code05_MassChangeQueries1.java +++ b/src/class182/Code05_MassChangeQueries1.java @@ -18,8 +18,8 @@ public class Code05_MassChangeQueries1 { public static int MAXN = 200001; - public static int MAXV = 100; public static int MAXT = MAXN * 10; + public static int MAXV = 100; public static int n, q; public static int[] arr = new int[MAXN]; diff --git a/src/class182/Code05_MassChangeQueries2.java b/src/class182/Code05_MassChangeQueries2.java index 63a59674b..60f0190d1 100644 --- a/src/class182/Code05_MassChangeQueries2.java +++ b/src/class182/Code05_MassChangeQueries2.java @@ -16,8 +16,8 @@ //using namespace std; // //const int MAXN = 200001; -//const int MAXV = 100; //const int MAXT = MAXN * 10; +//const int MAXV = 100; //int n, q; //int arr[MAXN]; // From b95202f1488395969b27719fd857ab588b2edfd4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Nov 2025 12:01:32 +0800 Subject: [PATCH 0962/1170] modify code --- src/class182/Code05_MassChangeQueries1.java | 2 +- src/class182/Code05_MassChangeQueries2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class182/Code05_MassChangeQueries1.java b/src/class182/Code05_MassChangeQueries1.java index 059ea71d3..fa17c831e 100644 --- a/src/class182/Code05_MassChangeQueries1.java +++ b/src/class182/Code05_MassChangeQueries1.java @@ -140,10 +140,10 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } - q = in.nextInt(); for (int i = 1; i <= n; i++) { root[arr[i]] = insert(i, 1, n, root[arr[i]]); } + q = in.nextInt(); for (int i = 1, l, r, x, y; i <= q; i++) { l = in.nextInt(); r = in.nextInt(); diff --git a/src/class182/Code05_MassChangeQueries2.java b/src/class182/Code05_MassChangeQueries2.java index 60f0190d1..e5eb7b03a 100644 --- a/src/class182/Code05_MassChangeQueries2.java +++ b/src/class182/Code05_MassChangeQueries2.java @@ -138,10 +138,10 @@ // for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } -// cin >> q; // for (int i = 1; i <= n; i++) { // root[arr[i]] = insert(i, 1, n, root[arr[i]]); // } +// cin >> q; // for (int i = 1, l, r, x, y; i <= q; i++) { // cin >> l >> r >> x >> y; // split(l, r, 1, n, root[x]); From b5f510fee822bbc71fc090a9d53b93e735e455b3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Nov 2025 12:15:21 +0800 Subject: [PATCH 0963/1170] modify code --- ...6\345\210\206\350\243\202-\344\270\213.pptx" | Bin 0 -> 45856 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243182\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\350\243\202-\344\270\213.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243182\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\350\243\202-\344\270\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243182\343\200\220\346\214\272\351\232\276\343\200\221\347\272\277\346\256\265\346\240\221\347\232\204\345\220\210\345\271\266\344\270\216\345\210\206\350\243\202-\344\270\213.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..74c4eed286af8d959a94e3fe61b21058441eb3cf GIT binary patch literal 45856 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 literal 0 HcmV?d00001 From 772415439899565317c0c7d9f951e62e07ca563d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Nov 2025 16:07:01 +0800 Subject: [PATCH 0964/1170] modify code --- .../Code01_CentroidDecomposition1.java | 246 ++++++++++++++++++ .../Code01_CentroidDecomposition2.java | 140 ++++++++++ 2 files changed, 386 insertions(+) create mode 100644 src/class183/Code01_CentroidDecomposition1.java create mode 100644 src/class183/Code01_CentroidDecomposition2.java diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java new file mode 100644 index 000000000..711911b57 --- /dev/null +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -0,0 +1,246 @@ +package class183; + +// 点分治,也叫重心分治,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3806 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code01_CentroidDecomposition2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code01_CentroidDecomposition1 { + + public static int MAXN = 10001; + public static int MAXV = 20000001; + public static int n, m, total; + public static int[] query = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] maxp = new int[MAXN]; + public static int centroid; + + public static int[] dis = new int[MAXN]; + public static int[] valArr = new int[MAXV]; + public static int cntv; + public static int[] que = new int[MAXV]; + public static int cntq; + public static boolean[] judge = new boolean[MAXV]; + + public static boolean[] ans = new boolean[MAXN]; + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + // 找重心递归版,java会爆栈,C++可以通过 + public static void getCentroid1(int u, int fa) { + siz[u] = 1; + maxp[u] = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getCentroid1(v, u); + siz[u] += siz[v]; + maxp[u] = Math.max(siz[v], maxp[u]); + } + } + maxp[u] = Math.max(maxp[u], total - siz[u]); + if (maxp[u] < maxp[centroid]) { + centroid = u; + } + } + + // 讲解118,递归改迭代需要的栈 + public static int[][] ufe = new int[MAXN][3]; + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + ufe[stacksize][0] = u; + ufe[stacksize][1] = f; + ufe[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + // 找重心迭代版 + public static void getCentroid2(int cur, int fa) { + stacksize = 0; + push(cur, fa, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + maxp[u] = 0; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + maxp[u] = Math.max(siz[v], maxp[u]); + } + } + maxp[u] = Math.max(maxp[u], total - siz[u]); + if (maxp[u] < maxp[centroid]) { + centroid = u; + } + } + } + } + + public static void getDistance(int u, int fa, int w) { + dis[u] = dis[fa] + w; + valArr[++cntv] = dis[u]; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getDistance(v, u, weight[e]); + } + } + } + + public static void calc(int u) { + dis[u] = 0; + cntq = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + if (!vis[v]) { + cntv = 0; + getDistance(v, u, w); + for (int k = cntv; k > 0; k--) { + for (int l = 1; l <= m; l++) { + if (query[l] >= valArr[k]) { + ans[l] |= judge[query[l] - valArr[k]]; + } + } + } + for (int k = cntv; k > 0; k--) { + que[++cntq] = valArr[k]; + judge[valArr[k]] = true; + } + } + } + for (int i = cntq; i > 0; i--) { + judge[que[i]] = false; + } + } + + public static void solve(int u) { + vis[u] = true; + judge[0] = true; + calc(u); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + total = siz[v]; + centroid = 0; + maxp[centroid] = n; + // getCentroid1(v, u); + getCentroid2(v, u); + solve(centroid); + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); + } + for (int i = 1; i <= m; i++) { + query[i] = in.nextInt(); + } + total = n; + centroid = 0; + maxp[centroid] = n; + // getCentroid1(1, 0); + getCentroid2(1, 0); + solve(centroid); + for (int i = 1; i <= m; i++) { + if (ans[i]) { + out.println("AYE"); + } else { + out.println("NAY"); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java new file mode 100644 index 000000000..98474b2f7 --- /dev/null +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -0,0 +1,140 @@ +package class183; + +// 点分治,也叫重心分治,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3806 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 10001; +//const int MAXV = 20000001; +//int n, m, total; +//int query[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int maxp[MAXN]; +//int centroid; +// +//int dis[MAXN]; +//int valArr[MAXV]; +//int cntv; +//int que[MAXV]; +//int cntq; +//bool judge[MAXV]; +// +//bool ans[MAXN]; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void getCentroid(int u, int fa) { +// siz[u] = 1; +// maxp[u] = 0; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getCentroid(v, u); +// siz[u] += siz[v]; +// maxp[u] = max(maxp[u], siz[v]); +// } +// } +// maxp[u] = max(maxp[u], total - siz[u]); +// if (maxp[u] < maxp[centroid]) { +// centroid = u; +// } +//} +// +//void getDistance(int u, int fa, int w) { +// dis[u] = dis[fa] + w; +// valArr[++cntv] = dis[u]; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getDistance(v, u, weight[e]); +// } +// } +//} +// +//void calc(int u) { +// dis[u] = 0; +// cntq = 0; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// if (!vis[v]) { +// cntv = 0; +// getDistance(v, u, w); +// for (int k = cntv; k > 0; k--) { +// for (int l = 1; l <= m; l++) { +// if (query[l] >= valArr[k]) { +// ans[l] |= judge[query[l] - valArr[k]]; +// } +// } +// } +// for (int k = cntv; k > 0; k--) { +// que[++cntq] = valArr[k]; +// judge[valArr[k]] = true; +// } +// } +// } +// for (int i = cntq; i > 0; i--) { +// judge[que[i]] = false; +// } +//} +// +//void solve(int u) { +// vis[u] = true; +// judge[0] = true; +// calc(u); +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// total = siz[v]; +// centroid = 0; +// maxp[centroid] = n; +// getCentroid(v, u); +// solve(centroid); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i]; +// } +// total = n; +// centroid = 0; +// maxp[centroid] = n; +// getCentroid(1, 0); +// solve(centroid); +// for (int i = 1; i <= m; i++) { +// if (ans[i]) { +// cout << "AYE" << '\n'; +// } else { +// cout << "NAY" << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 237b91a453ac716f648895004cfd173153d3f7ea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Nov 2025 16:13:30 +0800 Subject: [PATCH 0965/1170] modify code --- src/class183/Code01_CentroidDecomposition1.java | 4 ++-- src/class183/Code01_CentroidDecomposition2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 711911b57..35d09b9b0 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -15,7 +15,7 @@ public class Code01_CentroidDecomposition1 { public static int MAXN = 10001; - public static int MAXV = 20000001; + public static int MAXV = 15000001; public static int n, m, total; public static int[] query = new int[MAXN]; @@ -206,7 +206,7 @@ public static void main(String[] args) throws Exception { // 读写工具类 static class FastReader { - private final byte[] buffer = new byte[1 << 16]; + private final byte[] buffer = new byte[1 << 20]; private int ptr = 0, len = 0; private final InputStream in; diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index 98474b2f7..dfcf3d31b 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -10,7 +10,7 @@ //using namespace std; // //const int MAXN = 10001; -//const int MAXV = 20000001; +//const int MAXV = 15000001; //int n, m, total; //int query[MAXN]; // From dbba838eb3a2e5387445909c34a219956cb7bda2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Nov 2025 17:14:43 +0800 Subject: [PATCH 0966/1170] modify code --- .../Code01_CentroidDecomposition1.java | 25 +++++++++---------- .../Code01_CentroidDecomposition2.java | 25 +++++++++---------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 35d09b9b0..3ee17e5e3 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -32,10 +32,9 @@ public class Code01_CentroidDecomposition1 { public static int[] dis = new int[MAXN]; public static int[] valArr = new int[MAXV]; - public static int cntv; - public static int[] que = new int[MAXV]; - public static int cntq; - public static boolean[] judge = new boolean[MAXV]; + public static int[] valQue = new int[MAXV]; + public static boolean[] valJudge = new boolean[MAXV]; + public static int cnta, cntq; public static boolean[] ans = new boolean[MAXN]; @@ -119,7 +118,7 @@ public static void getCentroid2(int cur, int fa) { public static void getDistance(int u, int fa, int w) { dis[u] = dis[fa] + w; - valArr[++cntv] = dis[u]; + valArr[++cnta] = dis[u]; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { @@ -135,29 +134,29 @@ public static void calc(int u) { int v = to[e]; int w = weight[e]; if (!vis[v]) { - cntv = 0; + cnta = 0; getDistance(v, u, w); - for (int k = cntv; k > 0; k--) { + for (int k = cnta; k > 0; k--) { for (int l = 1; l <= m; l++) { if (query[l] >= valArr[k]) { - ans[l] |= judge[query[l] - valArr[k]]; + ans[l] |= valJudge[query[l] - valArr[k]]; } } } - for (int k = cntv; k > 0; k--) { - que[++cntq] = valArr[k]; - judge[valArr[k]] = true; + for (int k = cnta; k > 0; k--) { + valQue[++cntq] = valArr[k]; + valJudge[valArr[k]] = true; } } } for (int i = cntq; i > 0; i--) { - judge[que[i]] = false; + valJudge[valQue[i]] = false; } } public static void solve(int u) { vis[u] = true; - judge[0] = true; + valJudge[0] = true; calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index dfcf3d31b..921236f5b 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -27,10 +27,9 @@ // //int dis[MAXN]; //int valArr[MAXV]; -//int cntv; -//int que[MAXV]; -//int cntq; -//bool judge[MAXV]; +//int valQue[MAXV]; +//bool valJudge[MAXV]; +//int cnta, cntq; // //bool ans[MAXN]; // @@ -60,7 +59,7 @@ // //void getDistance(int u, int fa, int w) { // dis[u] = dis[fa] + w; -// valArr[++cntv] = dis[u]; +// valArr[++cnta] = dis[u]; // for (int e = head[u]; e > 0; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { @@ -76,29 +75,29 @@ // int v = to[e]; // int w = weight[e]; // if (!vis[v]) { -// cntv = 0; +// cnta = 0; // getDistance(v, u, w); -// for (int k = cntv; k > 0; k--) { +// for (int k = cnta; k > 0; k--) { // for (int l = 1; l <= m; l++) { // if (query[l] >= valArr[k]) { -// ans[l] |= judge[query[l] - valArr[k]]; +// ans[l] |= valJudge[query[l] - valArr[k]]; // } // } // } -// for (int k = cntv; k > 0; k--) { -// que[++cntq] = valArr[k]; -// judge[valArr[k]] = true; +// for (int k = cnta; k > 0; k--) { +// valQue[++cntq] = valArr[k]; +// valJudge[valArr[k]] = true; // } // } // } // for (int i = cntq; i > 0; i--) { -// judge[que[i]] = false; +// valJudge[valQue[i]] = false; // } //} // //void solve(int u) { // vis[u] = true; -// judge[0] = true; +// valJudge[0] = true; // calc(u); // for (int e = head[u]; e > 0; e = nxt[e]) { // int v = to[e]; From 5f5eb829a213f6615ed7b465ac4467f4870b9dd9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Nov 2025 17:30:08 +0800 Subject: [PATCH 0967/1170] modify code --- .../Code01_CentroidDecomposition1.java | 23 ++++++++++--------- .../Code01_CentroidDecomposition2.java | 23 ++++++++++--------- src/class183/Code02_Tree1.java | 7 ++++++ 3 files changed, 31 insertions(+), 22 deletions(-) create mode 100644 src/class183/Code02_Tree1.java diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 3ee17e5e3..5cd5ab1e0 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -31,10 +31,11 @@ public class Code01_CentroidDecomposition1 { public static int centroid; public static int[] dis = new int[MAXN]; - public static int[] valArr = new int[MAXV]; - public static int[] valQue = new int[MAXV]; - public static boolean[] valJudge = new boolean[MAXV]; - public static int cnta, cntq; + public static int[] arr = new int[MAXV]; + public static int[] que = new int[MAXV]; + public static boolean[] judge = new boolean[MAXV]; + public static int cnta; + public static int cntq; public static boolean[] ans = new boolean[MAXN]; @@ -118,7 +119,7 @@ public static void getCentroid2(int cur, int fa) { public static void getDistance(int u, int fa, int w) { dis[u] = dis[fa] + w; - valArr[++cnta] = dis[u]; + arr[++cnta] = dis[u]; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { @@ -138,25 +139,25 @@ public static void calc(int u) { getDistance(v, u, w); for (int k = cnta; k > 0; k--) { for (int l = 1; l <= m; l++) { - if (query[l] >= valArr[k]) { - ans[l] |= valJudge[query[l] - valArr[k]]; + if (query[l] >= arr[k]) { + ans[l] |= judge[query[l] - arr[k]]; } } } for (int k = cnta; k > 0; k--) { - valQue[++cntq] = valArr[k]; - valJudge[valArr[k]] = true; + que[++cntq] = arr[k]; + judge[arr[k]] = true; } } } for (int i = cntq; i > 0; i--) { - valJudge[valQue[i]] = false; + judge[que[i]] = false; } } public static void solve(int u) { vis[u] = true; - valJudge[0] = true; + judge[0] = true; calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index 921236f5b..94e68585b 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -26,10 +26,11 @@ //int centroid; // //int dis[MAXN]; -//int valArr[MAXV]; -//int valQue[MAXV]; -//bool valJudge[MAXV]; -//int cnta, cntq; +//int arr[MAXV]; +//int que[MAXV]; +//bool judge[MAXV]; +//int cnta; +//int cntq; // //bool ans[MAXN]; // @@ -59,7 +60,7 @@ // //void getDistance(int u, int fa, int w) { // dis[u] = dis[fa] + w; -// valArr[++cnta] = dis[u]; +// arr[++cnta] = dis[u]; // for (int e = head[u]; e > 0; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { @@ -79,25 +80,25 @@ // getDistance(v, u, w); // for (int k = cnta; k > 0; k--) { // for (int l = 1; l <= m; l++) { -// if (query[l] >= valArr[k]) { -// ans[l] |= valJudge[query[l] - valArr[k]]; +// if (query[l] >= arr[k]) { +// ans[l] |= judge[query[l] - arr[k]]; // } // } // } // for (int k = cnta; k > 0; k--) { -// valQue[++cntq] = valArr[k]; -// valJudge[valArr[k]] = true; +// que[++cntq] = arr[k]; +// judge[arr[k]] = true; // } // } // } // for (int i = cntq; i > 0; i--) { -// valJudge[valQue[i]] = false; +// judge[que[i]] = false; // } //} // //void solve(int u) { // vis[u] = true; -// valJudge[0] = true; +// judge[0] = true; // calc(u); // for (int e = head[u]; e > 0; e = nxt[e]) { // int v = to[e]; diff --git a/src/class183/Code02_Tree1.java b/src/class183/Code02_Tree1.java new file mode 100644 index 000000000..da0e8930b --- /dev/null +++ b/src/class183/Code02_Tree1.java @@ -0,0 +1,7 @@ +package class183; + +// 距离<=k的点对数量,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4178 +public class Code02_Tree1 { + +} From d0f629cd38e3932080c333333fd9f296e139b8ea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Nov 2025 17:37:16 +0800 Subject: [PATCH 0968/1170] modify code --- src/class183/Code01_CentroidDecomposition1.java | 12 ++++++------ src/class183/Code01_CentroidDecomposition2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 5cd5ab1e0..4acf6b922 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -33,7 +33,7 @@ public class Code01_CentroidDecomposition1 { public static int[] dis = new int[MAXN]; public static int[] arr = new int[MAXV]; public static int[] que = new int[MAXV]; - public static boolean[] judge = new boolean[MAXV]; + public static boolean[] pre = new boolean[MAXV]; public static int cnta; public static int cntq; @@ -139,25 +139,25 @@ public static void calc(int u) { getDistance(v, u, w); for (int k = cnta; k > 0; k--) { for (int l = 1; l <= m; l++) { - if (query[l] >= arr[k]) { - ans[l] |= judge[query[l] - arr[k]]; + if (query[l] - arr[k] >= 0) { + ans[l] |= pre[query[l] - arr[k]]; } } } for (int k = cnta; k > 0; k--) { que[++cntq] = arr[k]; - judge[arr[k]] = true; + pre[arr[k]] = true; } } } for (int i = cntq; i > 0; i--) { - judge[que[i]] = false; + pre[que[i]] = false; } } public static void solve(int u) { vis[u] = true; - judge[0] = true; + pre[0] = true; calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index 94e68585b..7fb36d732 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -28,7 +28,7 @@ //int dis[MAXN]; //int arr[MAXV]; //int que[MAXV]; -//bool judge[MAXV]; +//bool pre[MAXV]; //int cnta; //int cntq; // @@ -80,25 +80,25 @@ // getDistance(v, u, w); // for (int k = cnta; k > 0; k--) { // for (int l = 1; l <= m; l++) { -// if (query[l] >= arr[k]) { -// ans[l] |= judge[query[l] - arr[k]]; +// if (query[l] - arr[k] >= 0) { +// ans[l] |= pre[query[l] - arr[k]]; // } // } // } // for (int k = cnta; k > 0; k--) { // que[++cntq] = arr[k]; -// judge[arr[k]] = true; +// pre[arr[k]] = true; // } // } // } // for (int i = cntq; i > 0; i--) { -// judge[que[i]] = false; +// pre[que[i]] = false; // } //} // //void solve(int u) { // vis[u] = true; -// judge[0] = true; +// pre[0] = true; // calc(u); // for (int e = head[u]; e > 0; e = nxt[e]) { // int v = to[e]; From df97a6754aa82eb63f76824824b56ce9733824e7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Nov 2025 18:04:07 +0800 Subject: [PATCH 0969/1170] modify code --- src/class183/Code01_CentroidDecomposition1.java | 16 ++++++++-------- src/class183/Code01_CentroidDecomposition2.java | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 4acf6b922..760f12fab 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -137,20 +137,20 @@ public static void calc(int u) { if (!vis[v]) { cnta = 0; getDistance(v, u, w); - for (int k = cnta; k > 0; k--) { - for (int l = 1; l <= m; l++) { - if (query[l] - arr[k] >= 0) { - ans[l] |= pre[query[l] - arr[k]]; + for (int i = 1; i <= m; i++) { + for (int j = 1; j <= cnta; j++) { + if (query[i] - arr[j] >= 0) { + ans[i] |= pre[query[i] - arr[j]]; } } } - for (int k = cnta; k > 0; k--) { - que[++cntq] = arr[k]; - pre[arr[k]] = true; + for (int i = 1; i <= cnta; i++) { + que[++cntq] = arr[i]; + pre[arr[i]] = true; } } } - for (int i = cntq; i > 0; i--) { + for (int i = 1; i <= cntq; i++) { pre[que[i]] = false; } } diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index 7fb36d732..6bdde8558 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -78,20 +78,20 @@ // if (!vis[v]) { // cnta = 0; // getDistance(v, u, w); -// for (int k = cnta; k > 0; k--) { -// for (int l = 1; l <= m; l++) { -// if (query[l] - arr[k] >= 0) { -// ans[l] |= pre[query[l] - arr[k]]; +// for (int i = 1; i <= m; i++) { +// for (int j = 1; j <= cnta; j++) { +// if (query[i] - arr[j] >= 0) { +// ans[i] |= pre[query[i] - arr[j]]; // } // } // } -// for (int k = cnta; k > 0; k--) { -// que[++cntq] = arr[k]; -// pre[arr[k]] = true; +// for (int i = 1; i <= cnta; i++) { +// que[++cntq] = arr[i]; +// pre[arr[i]] = true; // } // } // } -// for (int i = cntq; i > 0; i--) { +// for (int i = 1; i <= cntq; i++) { // pre[que[i]] = false; // } //} From f4a6fe260ad909fb48fea0ff4b4a3a54ab3d848f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Nov 2025 20:43:41 +0800 Subject: [PATCH 0970/1170] modify code --- .../Code01_CentroidDecomposition1.java | 6 +- .../Code01_CentroidDecomposition2.java | 6 +- src/class183/Code02_Tree1.java | 155 ++++++++++++++++++ 3 files changed, 161 insertions(+), 6 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 760f12fab..211a5202f 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -155,7 +155,7 @@ public static void calc(int u) { } } - public static void solve(int u) { + public static void compute(int u) { vis[u] = true; pre[0] = true; calc(u); @@ -167,7 +167,7 @@ public static void solve(int u) { maxp[centroid] = n; // getCentroid1(v, u); getCentroid2(v, u); - solve(centroid); + compute(centroid); } } } @@ -192,7 +192,7 @@ public static void main(String[] args) throws Exception { maxp[centroid] = n; // getCentroid1(1, 0); getCentroid2(1, 0); - solve(centroid); + compute(centroid); for (int i = 1; i <= m; i++) { if (ans[i]) { out.println("AYE"); diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index 6bdde8558..95cac937a 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -96,7 +96,7 @@ // } //} // -//void solve(int u) { +//void compute(int u) { // vis[u] = true; // pre[0] = true; // calc(u); @@ -107,7 +107,7 @@ // centroid = 0; // maxp[centroid] = n; // getCentroid(v, u); -// solve(centroid); +// compute(centroid); // } // } //} @@ -128,7 +128,7 @@ // centroid = 0; // maxp[centroid] = n; // getCentroid(1, 0); -// solve(centroid); +// compute(centroid); // for (int i = 1; i <= m; i++) { // if (ans[i]) { // cout << "AYE" << '\n'; diff --git a/src/class183/Code02_Tree1.java b/src/class183/Code02_Tree1.java index da0e8930b..6b7d0cfec 100644 --- a/src/class183/Code02_Tree1.java +++ b/src/class183/Code02_Tree1.java @@ -2,6 +2,161 @@ // 距离<=k的点对数量,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4178 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + public class Code02_Tree1 { + public static int MAXN = 50001; + public static int n, k, total; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] maxp = new int[MAXN]; + public static int centroid; + + public static int[] dis = new int[MAXN]; + public static int[] arr = new int[MAXN]; + public static int cnta; + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + public static void getCentroid(int u, int fa) { + siz[u] = 1; + maxp[u] = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getCentroid(v, u); + siz[u] += siz[v]; + maxp[u] = Math.max(siz[v], maxp[u]); + } + } + maxp[u] = Math.max(maxp[u], total - siz[u]); + if (maxp[u] < maxp[centroid]) { + centroid = u; + } + } + + public static void getDistance(int u, int fa, int w) { + dis[u] = dis[fa] + w; + arr[++cnta] = dis[u]; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getDistance(v, u, weight[e]); + } + } + } + + public static long calc(int u, int fa, int w) { + cnta = 0; + getDistance(u, fa, w); + long ans = 0; + Arrays.sort(arr, 1, cnta + 1); + for (int l = 1, r = cnta; l < r;) { + if (arr[l] + arr[r] <= k) { + ans += r - l; + l++; + } else { + r--; + } + } + return ans; + } + + public static long compute(int u) { + long ans = 0; + ans += calc(u, 0, 0); + vis[u] = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + ans -= calc(v, u, weight[e]); + total = siz[v]; + centroid = 0; + maxp[centroid] = n; + getCentroid(v, 0); + ans += compute(centroid); + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); + } + k = in.nextInt(); + total = n; + centroid = 0; + maxp[centroid] = n; + getCentroid(1, 0); + out.println(compute(centroid)); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From 125e63109e8e0fbad6a0b1d64a5b7c01cd491152 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Nov 2025 21:05:10 +0800 Subject: [PATCH 0971/1170] modify code --- src/class183/Code02_Tree1.java | 1 + src/class183/Code03_Race1.java | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 src/class183/Code03_Race1.java diff --git a/src/class183/Code02_Tree1.java b/src/class183/Code02_Tree1.java index 6b7d0cfec..43a6b8f9c 100644 --- a/src/class183/Code02_Tree1.java +++ b/src/class183/Code02_Tree1.java @@ -66,6 +66,7 @@ public static void getDistance(int u, int fa, int w) { } public static long calc(int u, int fa, int w) { + dis[fa] = 0; cnta = 0; getDistance(u, fa, w); long ans = 0; diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java new file mode 100644 index 000000000..83c8f9b8b --- /dev/null +++ b/src/class183/Code03_Race1.java @@ -0,0 +1,7 @@ +package class183; + +// 权值和等于k的路径,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4149 +public class Code03_Race1 { + +} From 3e07ac6a38b03f946ae2fa4b85988d9e9dcff126 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Nov 2025 21:22:05 +0800 Subject: [PATCH 0972/1170] modify code --- .../Code01_CentroidDecomposition1.java | 22 +++++++++---------- .../Code01_CentroidDecomposition2.java | 14 ++++++------ src/class183/Code02_Tree1.java | 14 ++++++------ 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 211a5202f..34a8c778d 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -27,7 +27,7 @@ public class Code01_CentroidDecomposition1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] maxp = new int[MAXN]; + public static int[] maxPart = new int[MAXN]; public static int centroid; public static int[] dis = new int[MAXN]; @@ -49,17 +49,17 @@ public static void addEdge(int u, int v, int w) { // 找重心递归版,java会爆栈,C++可以通过 public static void getCentroid1(int u, int fa) { siz[u] = 1; - maxp[u] = 0; + maxPart[u] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { getCentroid1(v, u); siz[u] += siz[v]; - maxp[u] = Math.max(siz[v], maxp[u]); + maxPart[u] = Math.max(siz[v], maxPart[u]); } } - maxp[u] = Math.max(maxp[u], total - siz[u]); - if (maxp[u] < maxp[centroid]) { + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (maxPart[u] < maxPart[centroid]) { centroid = u; } } @@ -90,7 +90,7 @@ public static void getCentroid2(int cur, int fa) { pop(); if (e == -1) { siz[u] = 1; - maxp[u] = 0; + maxPart[u] = 0; e = head[u]; } else { e = nxt[e]; @@ -106,11 +106,11 @@ public static void getCentroid2(int cur, int fa) { int v = to[ei]; if (v != f && !vis[v]) { siz[u] += siz[v]; - maxp[u] = Math.max(siz[v], maxp[u]); + maxPart[u] = Math.max(siz[v], maxPart[u]); } } - maxp[u] = Math.max(maxp[u], total - siz[u]); - if (maxp[u] < maxp[centroid]) { + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (maxPart[u] < maxPart[centroid]) { centroid = u; } } @@ -164,7 +164,7 @@ public static void compute(int u) { if (!vis[v]) { total = siz[v]; centroid = 0; - maxp[centroid] = n; + maxPart[centroid] = n; // getCentroid1(v, u); getCentroid2(v, u); compute(centroid); @@ -189,7 +189,7 @@ public static void main(String[] args) throws Exception { } total = n; centroid = 0; - maxp[centroid] = n; + maxPart[centroid] = n; // getCentroid1(1, 0); getCentroid2(1, 0); compute(centroid); diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index 95cac937a..825d86d7d 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -22,7 +22,7 @@ // //bool vis[MAXN]; //int siz[MAXN]; -//int maxp[MAXN]; +//int maxPart[MAXN]; //int centroid; // //int dis[MAXN]; @@ -43,17 +43,17 @@ // //void getCentroid(int u, int fa) { // siz[u] = 1; -// maxp[u] = 0; +// maxPart[u] = 0; // for (int e = head[u]; e > 0; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { // getCentroid(v, u); // siz[u] += siz[v]; -// maxp[u] = max(maxp[u], siz[v]); +// maxPart[u] = max(maxPart[u], siz[v]); // } // } -// maxp[u] = max(maxp[u], total - siz[u]); -// if (maxp[u] < maxp[centroid]) { +// maxPart[u] = max(maxPart[u], total - siz[u]); +// if (maxPart[u] < maxPart[centroid]) { // centroid = u; // } //} @@ -105,7 +105,7 @@ // if (!vis[v]) { // total = siz[v]; // centroid = 0; -// maxp[centroid] = n; +// maxPart[centroid] = n; // getCentroid(v, u); // compute(centroid); // } @@ -126,7 +126,7 @@ // } // total = n; // centroid = 0; -// maxp[centroid] = n; +// maxPart[centroid] = n; // getCentroid(1, 0); // compute(centroid); // for (int i = 1; i <= m; i++) { diff --git a/src/class183/Code02_Tree1.java b/src/class183/Code02_Tree1.java index 43a6b8f9c..cf5b5cce1 100644 --- a/src/class183/Code02_Tree1.java +++ b/src/class183/Code02_Tree1.java @@ -23,7 +23,7 @@ public class Code02_Tree1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] maxp = new int[MAXN]; + public static int[] maxPart = new int[MAXN]; public static int centroid; public static int[] dis = new int[MAXN]; @@ -39,17 +39,17 @@ public static void addEdge(int u, int v, int w) { public static void getCentroid(int u, int fa) { siz[u] = 1; - maxp[u] = 0; + maxPart[u] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { getCentroid(v, u); siz[u] += siz[v]; - maxp[u] = Math.max(siz[v], maxp[u]); + maxPart[u] = Math.max(siz[v], maxPart[u]); } } - maxp[u] = Math.max(maxp[u], total - siz[u]); - if (maxp[u] < maxp[centroid]) { + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (maxPart[u] < maxPart[centroid]) { centroid = u; } } @@ -92,7 +92,7 @@ public static long compute(int u) { ans -= calc(v, u, weight[e]); total = siz[v]; centroid = 0; - maxp[centroid] = n; + maxPart[centroid] = n; getCentroid(v, 0); ans += compute(centroid); } @@ -114,7 +114,7 @@ public static void main(String[] args) throws Exception { k = in.nextInt(); total = n; centroid = 0; - maxp[centroid] = n; + maxPart[centroid] = n; getCentroid(1, 0); out.println(compute(centroid)); out.flush(); From 83b556124f3f9596bf58ee36020b3c04a0300d41 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 10:40:31 +0800 Subject: [PATCH 0973/1170] modify code --- src/class183/Code01_CentroidDecomposition1.java | 6 ++---- src/class183/Code01_CentroidDecomposition2.java | 4 +--- src/class183/Code02_Tree1.java | 4 +--- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 34a8c778d..df294fbe9 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -59,7 +59,7 @@ public static void getCentroid1(int u, int fa) { } } maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (maxPart[u] < maxPart[centroid]) { + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { centroid = u; } } @@ -110,7 +110,7 @@ public static void getCentroid2(int cur, int fa) { } } maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (maxPart[u] < maxPart[centroid]) { + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { centroid = u; } } @@ -164,7 +164,6 @@ public static void compute(int u) { if (!vis[v]) { total = siz[v]; centroid = 0; - maxPart[centroid] = n; // getCentroid1(v, u); getCentroid2(v, u); compute(centroid); @@ -189,7 +188,6 @@ public static void main(String[] args) throws Exception { } total = n; centroid = 0; - maxPart[centroid] = n; // getCentroid1(1, 0); getCentroid2(1, 0); compute(centroid); diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index 825d86d7d..153874a01 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -53,7 +53,7 @@ // } // } // maxPart[u] = max(maxPart[u], total - siz[u]); -// if (maxPart[u] < maxPart[centroid]) { +// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { // centroid = u; // } //} @@ -105,7 +105,6 @@ // if (!vis[v]) { // total = siz[v]; // centroid = 0; -// maxPart[centroid] = n; // getCentroid(v, u); // compute(centroid); // } @@ -126,7 +125,6 @@ // } // total = n; // centroid = 0; -// maxPart[centroid] = n; // getCentroid(1, 0); // compute(centroid); // for (int i = 1; i <= m; i++) { diff --git a/src/class183/Code02_Tree1.java b/src/class183/Code02_Tree1.java index cf5b5cce1..c8f28a0e1 100644 --- a/src/class183/Code02_Tree1.java +++ b/src/class183/Code02_Tree1.java @@ -49,7 +49,7 @@ public static void getCentroid(int u, int fa) { } } maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (maxPart[u] < maxPart[centroid]) { + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { centroid = u; } } @@ -92,7 +92,6 @@ public static long compute(int u) { ans -= calc(v, u, weight[e]); total = siz[v]; centroid = 0; - maxPart[centroid] = n; getCentroid(v, 0); ans += compute(centroid); } @@ -114,7 +113,6 @@ public static void main(String[] args) throws Exception { k = in.nextInt(); total = n; centroid = 0; - maxPart[centroid] = n; getCentroid(1, 0); out.println(compute(centroid)); out.flush(); From 008e54cc66cdf4eb1ad40ba3c88a6817de424b56 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 10:56:48 +0800 Subject: [PATCH 0974/1170] modify code --- .../Code01_CentroidDecomposition1.java | 77 +++---------------- .../Code01_CentroidDecomposition2.java | 8 +- src/class183/Code03_Race1.java | 2 +- 3 files changed, 18 insertions(+), 69 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index df294fbe9..86dc03c1c 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -2,10 +2,7 @@ // 点分治,也叫重心分治,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3806 -// 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code01_CentroidDecomposition2文件就是C++的实现 -// 两个版本的逻辑完全一样,C++版本可以通过所有测试 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; @@ -15,8 +12,8 @@ public class Code01_CentroidDecomposition1 { public static int MAXN = 10001; - public static int MAXV = 15000001; - public static int n, m, total; + public static int MAXV = 10000001; + public static int n, m, maxq, total; public static int[] query = new int[MAXN]; public static int[] head = new int[MAXN]; @@ -46,14 +43,13 @@ public static void addEdge(int u, int v, int w) { head[u] = cntg; } - // 找重心递归版,java会爆栈,C++可以通过 - public static void getCentroid1(int u, int fa) { + public static void getCentroid(int u, int fa) { siz[u] = 1; maxPart[u] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getCentroid1(v, u); + getCentroid(v, u); siz[u] += siz[v]; maxPart[u] = Math.max(siz[v], maxPart[u]); } @@ -64,61 +60,11 @@ public static void getCentroid1(int u, int fa) { } } - // 讲解118,递归改迭代需要的栈 - public static int[][] ufe = new int[MAXN][3]; - public static int stacksize, u, f, e; - - public static void push(int u, int f, int e) { - ufe[stacksize][0] = u; - ufe[stacksize][1] = f; - ufe[stacksize][2] = e; - stacksize++; - } - - public static void pop() { - --stacksize; - u = ufe[stacksize][0]; - f = ufe[stacksize][1]; - e = ufe[stacksize][2]; - } - - // 找重心迭代版 - public static void getCentroid2(int cur, int fa) { - stacksize = 0; - push(cur, fa, -1); - while (stacksize > 0) { - pop(); - if (e == -1) { - siz[u] = 1; - maxPart[u] = 0; - e = head[u]; - } else { - e = nxt[e]; - } - if (e != 0) { - push(u, f, e); - int v = to[e]; - if (v != f && !vis[v]) { - push(v, u, -1); - } - } else { - for (int ei = head[u]; ei > 0; ei = nxt[ei]) { - int v = to[ei]; - if (v != f && !vis[v]) { - siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); - } - } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; - } - } - } - } - public static void getDistance(int u, int fa, int w) { dis[u] = dis[fa] + w; + if (dis[u] > maxq) { + return; + } arr[++cnta] = dis[u]; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -164,8 +110,7 @@ public static void compute(int u) { if (!vis[v]) { total = siz[v]; centroid = 0; - // getCentroid1(v, u); - getCentroid2(v, u); + getCentroid(v, u); compute(centroid); } } @@ -185,11 +130,11 @@ public static void main(String[] args) throws Exception { } for (int i = 1; i <= m; i++) { query[i] = in.nextInt(); + maxq = Math.max(maxq, query[i]); } total = n; centroid = 0; - // getCentroid1(1, 0); - getCentroid2(1, 0); + getCentroid(1, 0); compute(centroid); for (int i = 1; i <= m; i++) { if (ans[i]) { diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index 153874a01..b7918a60d 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -10,8 +10,8 @@ //using namespace std; // //const int MAXN = 10001; -//const int MAXV = 15000001; -//int n, m, total; +//const int MAXV = 10000001; +//int n, m, maxq, total; //int query[MAXN]; // //int head[MAXN]; @@ -60,6 +60,9 @@ // //void getDistance(int u, int fa, int w) { // dis[u] = dis[fa] + w; +// if (dis[u] > maxq) { +// return; +// } // arr[++cnta] = dis[u]; // for (int e = head[u]; e > 0; e = nxt[e]) { // int v = to[e]; @@ -122,6 +125,7 @@ // } // for (int i = 1; i <= m; i++) { // cin >> query[i]; +// maxq = max(maxq, query[i]); // } // total = n; // centroid = 0; diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index 83c8f9b8b..58317daa8 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -1,6 +1,6 @@ package class183; -// 权值和等于k的路径,java版 +// 边最少的权值和为k的路径,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4149 public class Code03_Race1 { From cbceb02ca3f963bb8ad4cb65567cbf0cce4c48e3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 11:01:23 +0800 Subject: [PATCH 0975/1170] modify code --- src/class183/Code01_CentroidDecomposition1.java | 3 +-- src/class183/Code01_CentroidDecomposition2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 86dc03c1c..20f66bee2 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -31,8 +31,7 @@ public class Code01_CentroidDecomposition1 { public static int[] arr = new int[MAXV]; public static int[] que = new int[MAXV]; public static boolean[] pre = new boolean[MAXV]; - public static int cnta; - public static int cntq; + public static int cnta, cntq; public static boolean[] ans = new boolean[MAXN]; diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index b7918a60d..a4efb7998 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -29,8 +29,7 @@ //int arr[MAXV]; //int que[MAXV]; //bool pre[MAXV]; -//int cnta; -//int cntq; +//int cnta, cntq; // //bool ans[MAXN]; // From abdb193bcd54a360caca83a97b4c31a05642f436 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 11:03:56 +0800 Subject: [PATCH 0976/1170] modify code --- src/class183/Code02_Tree1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class183/Code02_Tree1.java b/src/class183/Code02_Tree1.java index c8f28a0e1..aa45edfd4 100644 --- a/src/class183/Code02_Tree1.java +++ b/src/class183/Code02_Tree1.java @@ -56,6 +56,9 @@ public static void getCentroid(int u, int fa) { public static void getDistance(int u, int fa, int w) { dis[u] = dis[fa] + w; + if (dis[u] > k) { + return; + } arr[++cnta] = dis[u]; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; From 8b460eb84f43720068acc2ef35f61e55b3a643e2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 11:11:57 +0800 Subject: [PATCH 0977/1170] modify code --- .../Code01_CentroidDecomposition1.java | 19 ++++++++++--------- .../Code01_CentroidDecomposition2.java | 19 ++++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 20f66bee2..19f03bc16 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -12,9 +12,10 @@ public class Code01_CentroidDecomposition1 { public static int MAXN = 10001; + public static int MAXM = 101; public static int MAXV = 10000001; public static int n, m, maxq, total; - public static int[] query = new int[MAXN]; + public static int[] query = new int[MAXM]; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -28,12 +29,12 @@ public class Code01_CentroidDecomposition1 { public static int centroid; public static int[] dis = new int[MAXN]; - public static int[] arr = new int[MAXV]; - public static int[] que = new int[MAXV]; - public static boolean[] pre = new boolean[MAXV]; + public static int[] arr = new int[MAXN]; + public static int[] que = new int[MAXN]; + public static boolean[] check = new boolean[MAXV]; public static int cnta, cntq; - public static boolean[] ans = new boolean[MAXN]; + public static boolean[] ans = new boolean[MAXM]; public static void addEdge(int u, int v, int w) { nxt[++cntg] = head[u]; @@ -85,24 +86,24 @@ public static void calc(int u) { for (int i = 1; i <= m; i++) { for (int j = 1; j <= cnta; j++) { if (query[i] - arr[j] >= 0) { - ans[i] |= pre[query[i] - arr[j]]; + ans[i] |= check[query[i] - arr[j]]; } } } for (int i = 1; i <= cnta; i++) { que[++cntq] = arr[i]; - pre[arr[i]] = true; + check[arr[i]] = true; } } } for (int i = 1; i <= cntq; i++) { - pre[que[i]] = false; + check[que[i]] = false; } } public static void compute(int u) { vis[u] = true; - pre[0] = true; + check[0] = true; calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index a4efb7998..eba473ed6 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -10,9 +10,10 @@ //using namespace std; // //const int MAXN = 10001; +//const int MAXM = 101; //const int MAXV = 10000001; //int n, m, maxq, total; -//int query[MAXN]; +//int query[MAXM]; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -26,12 +27,12 @@ //int centroid; // //int dis[MAXN]; -//int arr[MAXV]; -//int que[MAXV]; -//bool pre[MAXV]; +//int arr[MAXN]; +//int que[MAXN]; +//bool check[MAXV]; //int cnta, cntq; // -//bool ans[MAXN]; +//bool ans[MAXM]; // //void addEdge(int u, int v, int w) { // nxt[++cntg] = head[u]; @@ -83,24 +84,24 @@ // for (int i = 1; i <= m; i++) { // for (int j = 1; j <= cnta; j++) { // if (query[i] - arr[j] >= 0) { -// ans[i] |= pre[query[i] - arr[j]]; +// ans[i] |= check[query[i] - arr[j]]; // } // } // } // for (int i = 1; i <= cnta; i++) { // que[++cntq] = arr[i]; -// pre[arr[i]] = true; +// check[arr[i]] = true; // } // } // } // for (int i = 1; i <= cntq; i++) { -// pre[que[i]] = false; +// check[que[i]] = false; // } //} // //void compute(int u) { // vis[u] = true; -// pre[0] = true; +// check[0] = true; // calc(u); // for (int e = head[u]; e > 0; e = nxt[e]) { // int v = to[e]; From b50d16f787a63fd22eabbd2397b89f258e6a49e8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 13:23:23 +0800 Subject: [PATCH 0978/1170] modify code --- src/class183/Code03_Race1.java | 262 ++++++++++++++++++++++++++++++++- src/class183/Code03_Race2.java | 132 +++++++++++++++++ 2 files changed, 393 insertions(+), 1 deletion(-) create mode 100644 src/class183/Code03_Race2.java diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index 58317daa8..a575bdf1a 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -1,7 +1,267 @@ package class183; -// 边最少的权值和为k的路径,java版 +// 权值和为k的路径的最少边数,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4149 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + public class Code03_Race1 { + public static int MAXN = 200001; + public static int MAXK = 1000001; + public static int INF = 1000000001; + public static int n, k, total; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] maxPart = new int[MAXN]; + public static int centroid; + + public static int[] sumArr = new int[MAXN]; + public static int[] edgeArr = new int[MAXN]; + public static int cnta; + + public static int[] dp = new int[MAXK]; + + // java的实现,getCentroid方法、getPath方法改成迭代才能通过,C++的实现不需要改动 + // 讲解118,讲了如何把递归函数改成迭代 + public static int[][] stack = new int[MAXN][5]; + public static int stacksize, u, f, sum, edge, e; + + public static void push(int u, int f, int sum, int edge, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = sum; + stack[stacksize][3] = edge; + stack[stacksize][4] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + sum = stack[stacksize][2]; + edge = stack[stacksize][3]; + e = stack[stacksize][4]; + } + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + // 找重心的递归版,java会爆栈,C++可以通过 + public static void getCentroid1(int u, int fa) { + siz[u] = 1; + maxPart[u] = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getCentroid1(v, u); + siz[u] += siz[v]; + maxPart[u] = Math.max(siz[v], maxPart[u]); + } + } + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { + centroid = u; + } + } + + // 找重心的迭代版 + public static void getCentroid2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + maxPart[u] = 0; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, 0, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(to[e], u, 0, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + maxPart[u] = Math.max(siz[v], maxPart[u]); + } + } + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { + centroid = u; + } + } + } + } + + // 收集路径的递归版,java会爆栈,C++可以通过 + public static void getPath1(int u, int fa, int sum, int edge) { + if (sum > k) { + return; + } + sumArr[++cnta] = sum; + edgeArr[cnta] = edge; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getPath1(v, u, sum + weight[e], edge + 1); + } + } + } + + // 收集路径的迭代版 + public static void getPath2(int cur, int fa, int psum, int pedge) { + stacksize = 0; + push(cur, fa, psum, pedge, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + if (sum > k) { + continue; + } + sumArr[++cnta] = sum; + edgeArr[cnta] = edge; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, sum, edge, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(to[e], u, sum + weight[e], edge + 1, -1); + } + } + } + } + + public static int calc(int u) { + int ans = INF; + cnta = 0; + dp[0] = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + int tmp = cnta; + // getPath1(v, u, weight[e], 1); + getPath2(v, u, weight[e], 1); + for (int i = tmp + 1; i <= cnta; i++) { + ans = Math.min(ans, dp[k - sumArr[i]] + edgeArr[i]); + } + for (int i = tmp + 1; i <= cnta; i++) { + dp[sumArr[i]] = Math.min(dp[sumArr[i]], edgeArr[i]); + } + } + } + for (int i = 1; i <= cnta; i++) { + dp[sumArr[i]] = INF; + } + return ans; + } + + public static int compute(int u) { + int ans = INF; + vis[u] = true; + ans = Math.min(ans, calc(u)); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + total = siz[v]; + centroid = 0; + // getCentroid1(v, 0); + getCentroid2(v, 0); + ans = Math.min(ans, compute(centroid)); + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + k = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt() + 1; + v = in.nextInt() + 1; + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); + } + total = n; + centroid = 0; + // getCentroid1(1, 0); + getCentroid2(1, 0); + Arrays.fill(dp, INF); + int ans = compute(centroid); + if (ans == INF) { + ans = -1; + } + out.println(ans); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class183/Code03_Race2.java b/src/class183/Code03_Race2.java new file mode 100644 index 000000000..f4ba109af --- /dev/null +++ b/src/class183/Code03_Race2.java @@ -0,0 +1,132 @@ +package class183; + +// 权值和为k的路径的最少边数,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4149 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//const int MAXK = 1000001; +//const int INF = 1000000001; +//int n, k, total; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int maxPart[MAXN]; +//int centroid; +// +//int sumArr[MAXN]; +//int edgeArr[MAXN]; +//int cnta; +// +//int dp[MAXK]; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void getCentroid(int u, int fa) { +// siz[u] = 1; +// maxPart[u] = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getCentroid(v, u); +// siz[u] += siz[v]; +// maxPart[u] = max(maxPart[u], siz[v]); +// } +// } +// maxPart[u] = max(maxPart[u], total - siz[u]); +// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { +// centroid = u; +// } +//} +// +//void getPath(int u, int fa, int sum, int edge) { +// if (sum > k) { +// return; +// } +// sumArr[++cnta] = sum; +// edgeArr[cnta] = edge; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getPath(v, u, sum + weight[e], edge + 1); +// } +// } +//} +// +//int calc(int u) { +// int ans = INF; +// cnta = 0; +// dp[0] = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// int tmp = cnta; +// getPath(v, u, weight[e], 1); +// for (int i = tmp + 1; i <= cnta; i++) { +// ans = min(ans, dp[k - sumArr[i]] + edgeArr[i]); +// } +// for (int i = tmp + 1; i <= cnta; i++) { +// dp[sumArr[i]] = min(dp[sumArr[i]], edgeArr[i]); +// } +// } +// } +// for (int i = 1; i <= cnta; i++) { +// dp[sumArr[i]] = INF; +// } +// return ans; +//} +// +//int compute(int u) { +// int ans = INF; +// vis[u] = true; +// ans = min(ans, calc(u)); +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// total = siz[v]; +// centroid = 0; +// getCentroid(v, 0); +// ans = min(ans, compute(centroid)); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> k; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// u++; +// v++; +// addEdge(u, v, w); +// addEdge(v, u, w); +// } +// total = n; +// centroid = 0; +// getCentroid(1, 0); +// fill(dp, dp + MAXK, INF); +// int ans = compute(centroid); +// if (ans == INF) { +// ans = -1; +// } +// cout << ans << '\n'; +// return 0; +//} \ No newline at end of file From be77e4979c79d180dfe8de4f15765ef7d6f803bd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 13:26:19 +0800 Subject: [PATCH 0979/1170] modify code --- .../{Code02_Tree1.java => Code02_PairNumber1.java} | 2 +- src/class183/Code04_TreeGame1.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) rename src/class183/{Code02_Tree1.java => Code02_PairNumber1.java} (99%) create mode 100644 src/class183/Code04_TreeGame1.java diff --git a/src/class183/Code02_Tree1.java b/src/class183/Code02_PairNumber1.java similarity index 99% rename from src/class183/Code02_Tree1.java rename to src/class183/Code02_PairNumber1.java index aa45edfd4..54c96238e 100644 --- a/src/class183/Code02_Tree1.java +++ b/src/class183/Code02_PairNumber1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_Tree1 { +public class Code02_PairNumber1 { public static int MAXN = 50001; public static int n, k, total; diff --git a/src/class183/Code04_TreeGame1.java b/src/class183/Code04_TreeGame1.java new file mode 100644 index 000000000..ef1351d21 --- /dev/null +++ b/src/class183/Code04_TreeGame1.java @@ -0,0 +1,8 @@ +package class183; + +// 树上游戏,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2664 + +public class Code04_TreeGame1 { + +} From a39b619a9abfb12c313c565a2fcd40aa4839d5d0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 13:50:11 +0800 Subject: [PATCH 0980/1170] modify code --- src/class183/{Code02_PairNumber1.java => Code02_Tree1.java} | 2 +- src/class183/{Code04_TreeGame1.java => Code04_Game1.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/class183/{Code02_PairNumber1.java => Code02_Tree1.java} (99%) rename src/class183/{Code04_TreeGame1.java => Code04_Game1.java} (76%) diff --git a/src/class183/Code02_PairNumber1.java b/src/class183/Code02_Tree1.java similarity index 99% rename from src/class183/Code02_PairNumber1.java rename to src/class183/Code02_Tree1.java index 54c96238e..aa45edfd4 100644 --- a/src/class183/Code02_PairNumber1.java +++ b/src/class183/Code02_Tree1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_PairNumber1 { +public class Code02_Tree1 { public static int MAXN = 50001; public static int n, k, total; diff --git a/src/class183/Code04_TreeGame1.java b/src/class183/Code04_Game1.java similarity index 76% rename from src/class183/Code04_TreeGame1.java rename to src/class183/Code04_Game1.java index ef1351d21..1e9660a7a 100644 --- a/src/class183/Code04_TreeGame1.java +++ b/src/class183/Code04_Game1.java @@ -3,6 +3,6 @@ // 树上游戏,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2664 -public class Code04_TreeGame1 { +public class Code04_Game1 { } From de8c65d7bfcab259bf1ada4a2f358715fc541752 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 20:53:28 +0800 Subject: [PATCH 0981/1170] modify code --- src/class183/Code03_Race1.java | 3 +- src/class183/Code04_Game1.java | 8 - src/class183/Code04_Maschera1.java | 337 +++++++++++++++++++++++++++++ 3 files changed, 338 insertions(+), 10 deletions(-) delete mode 100644 src/class183/Code04_Game1.java create mode 100644 src/class183/Code04_Maschera1.java diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index a575bdf1a..da2808277 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -34,8 +34,7 @@ public class Code03_Race1 { public static int[] dp = new int[MAXK]; - // java的实现,getCentroid方法、getPath方法改成迭代才能通过,C++的实现不需要改动 - // 讲解118,讲了如何把递归函数改成迭代 + // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; public static int stacksize, u, f, sum, edge, e; diff --git a/src/class183/Code04_Game1.java b/src/class183/Code04_Game1.java deleted file mode 100644 index 1e9660a7a..000000000 --- a/src/class183/Code04_Game1.java +++ /dev/null @@ -1,8 +0,0 @@ -package class183; - -// 树上游戏,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P2664 - -public class Code04_Game1 { - -} diff --git a/src/class183/Code04_Maschera1.java b/src/class183/Code04_Maschera1.java new file mode 100644 index 000000000..f12f2bfa9 --- /dev/null +++ b/src/class183/Code04_Maschera1.java @@ -0,0 +1,337 @@ +package class183; + +// 道路魔力总和,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5351 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code04_Maschera1 { + + public static int MAXN = 100001; + public static int n, l, r, total; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static int[] tree = new int[MAXN]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] maxPart = new int[MAXN]; + public static int centroid; + + public static int[] allMaxv = new int[MAXN]; + public static int[] allEdge = new int[MAXN]; + public static int cnta; + + public static int[] curMaxv = new int[MAXN]; + public static int[] curEdge = new int[MAXN]; + public static int cntc; + + public static long ans; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][5]; + public static int stacksize, u, f, maxv, edge, e; + + public static void push(int u, int f, int maxv, int edge, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = maxv; + stack[stacksize][3] = edge; + stack[stacksize][4] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + maxv = stack[stacksize][2]; + edge = stack[stacksize][3]; + e = stack[stacksize][4]; + } + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= r) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + // 找重心的递归版,java会爆栈,C++可以通过 + public static void getCentroid1(int u, int fa) { + siz[u] = 1; + maxPart[u] = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getCentroid1(v, u); + siz[u] += siz[v]; + maxPart[u] = Math.max(siz[v], maxPart[u]); + } + } + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { + centroid = u; + } + } + + // 找重心的迭代版 + public static void getCentroid2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + maxPart[u] = 0; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, 0, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(to[e], u, 0, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + maxPart[u] = Math.max(siz[v], maxPart[u]); + } + } + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { + centroid = u; + } + } + } + } + + // 收集路径的递归版,java会爆栈,C++可以通过 + public static void getPath1(int u, int fa, int maxv, int edge) { + if (edge > r) { + return; + } + curMaxv[++cntc] = maxv; + curEdge[cntc] = edge; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getPath1(v, u, Math.max(maxv, weight[e]), edge + 1); + } + } + } + + // 收集路径的迭代版 + public static void getPath2(int cur, int fa, int pmaxv, int pedge) { + stacksize = 0; + push(cur, fa, pmaxv, pedge, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + if (edge > r) { + continue; + } + curMaxv[++cntc] = maxv; + curEdge[cntc] = edge; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, maxv, edge, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(to[e], u, Math.max(maxv, weight[e]), edge + 1, -1); + } + } + } + } + + public static void sort(int[] maxv, int[] edge, int l, int r) { + if (l >= r) return; + int i = l, j = r, pv = maxv[(l + r) >> 1], pe = edge[(l + r) >> 1], tmp; + while (i <= j) { + while (maxv[i] < pv || (maxv[i] == pv && edge[i] < pe)) i++; + while (maxv[j] > pv || (maxv[j] == pv && edge[j] > pe)) j--; + if (i <= j) { + tmp = maxv[i]; maxv[i] = maxv[j]; maxv[j] = tmp; + tmp = edge[i]; edge[i] = edge[j]; edge[j] = tmp; + i++; j--; + } + } + sort(maxv, edge, l, j); + sort(maxv, edge, i, r); + } + + public static void calc(int u) { + cnta = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + cntc = 0; + // getPath1(v, u, weight[e], 1); + getPath2(v, u, weight[e], 1); + if (cntc > 0) { + sort(curMaxv, curEdge, 1, cntc); + for (int i = 1; i <= cntc; i++) { + int maxv = curMaxv[i]; + int edge = curEdge[i]; + int left = l - edge - 1; + int right = r - edge; + if (right >= 0) { + left = Math.max(left, 0); + right = Math.min(right, r); + if (left <= right) { + ans -= 1L * maxv * (sum(right) - sum(left)); + } + } + add(edge, 1); + } + for (int i = 1; i <= cntc; i++) { + add(curEdge[i], -1); + } + for (int i = 1; i <= cntc; i++) { + allMaxv[++cnta] = curMaxv[i]; + allEdge[cnta] = curEdge[i]; + } + } + } + } + if (cnta > 0) { + sort(allMaxv, allEdge, 1, cnta); + for (int i = 1; i <= cnta; i++) { + int maxv = allMaxv[i]; + int edge = allEdge[i]; + int left = l - edge - 1; + int right = r - edge; + if (right >= 0) { + left = Math.max(left, 0); + right = Math.min(right, r); + if (left <= right) { + ans += 1L * maxv * (sum(right) - sum(left)); + } + } + add(edge, 1); + } + for (int i = 1; i <= cnta; i++) { + add(allEdge[i], -1); + } + for (int i = 1; i <= cnta; i++) { + if (allEdge[i] >= l) { + ans += allMaxv[i]; + } + } + } + } + + public static void compute(int u) { + calc(u); + vis[u] = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + total = siz[v]; + centroid = 0; + // getCentroid1(v, 0); + getCentroid2(v, 0); + compute(centroid); + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + l = in.nextInt(); + r = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); + } + total = n; + centroid = 0; + // getCentroid1(1, 0); + getCentroid2(1, 0); + compute(centroid); + out.println(ans << 1); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 20]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From cf7ed62ebdacea48909d4efac04985a852cd1844 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Nov 2025 20:57:35 +0800 Subject: [PATCH 0982/1170] modify code --- src/class183/Code04_Maschera1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class183/Code04_Maschera1.java b/src/class183/Code04_Maschera1.java index f12f2bfa9..db56a3041 100644 --- a/src/class183/Code04_Maschera1.java +++ b/src/class183/Code04_Maschera1.java @@ -1,6 +1,6 @@ package class183; -// 道路魔力总和,java版 +// 路径魔力总和,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5351 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 83d4bb9c2b2e2cabdd82703c44dcd4c2ef9a6fc5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 11:29:15 +0800 Subject: [PATCH 0983/1170] modify code --- src/class183/Code04_Maschera1.java | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/class183/Code04_Maschera1.java b/src/class183/Code04_Maschera1.java index db56a3041..8046f8f2d 100644 --- a/src/class183/Code04_Maschera1.java +++ b/src/class183/Code04_Maschera1.java @@ -207,18 +207,14 @@ public static void calc(int u) { if (cntc > 0) { sort(curMaxv, curEdge, 1, cntc); for (int i = 1; i <= cntc; i++) { - int maxv = curMaxv[i]; - int edge = curEdge[i]; - int left = l - edge - 1; - int right = r - edge; + int left = l - curEdge[i] - 1; + int right = r - curEdge[i]; if (right >= 0) { left = Math.max(left, 0); right = Math.min(right, r); - if (left <= right) { - ans -= 1L * maxv * (sum(right) - sum(left)); - } + ans -= 1L * curMaxv[i] * (sum(right) - sum(left)); } - add(edge, 1); + add(curEdge[i], 1); } for (int i = 1; i <= cntc; i++) { add(curEdge[i], -1); @@ -233,18 +229,14 @@ public static void calc(int u) { if (cnta > 0) { sort(allMaxv, allEdge, 1, cnta); for (int i = 1; i <= cnta; i++) { - int maxv = allMaxv[i]; - int edge = allEdge[i]; - int left = l - edge - 1; - int right = r - edge; + int left = l - allEdge[i] - 1; + int right = r - allEdge[i]; if (right >= 0) { left = Math.max(left, 0); right = Math.min(right, r); - if (left <= right) { - ans += 1L * maxv * (sum(right) - sum(left)); - } + ans += 1L * allMaxv[i] * (sum(right) - sum(left)); } - add(edge, 1); + add(allEdge[i], 1); } for (int i = 1; i <= cnta; i++) { add(allEdge[i], -1); From 3bbbc808514a6bfb31f6d5c46f8161a9d06c9a3c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 11:35:55 +0800 Subject: [PATCH 0984/1170] modify code --- src/class183/{Code03_Race1.java => Code02_Race1.java} | 2 +- src/class183/{Code03_Race2.java => Code02_Race2.java} | 0 src/class183/{Code02_Tree1.java => Code03_Tree1.java} | 2 +- src/class183/Code04_CloseVertices1.java | 10 ++++++++++ .../{Code04_Maschera1.java => Code05_Maschera1.java} | 4 ++-- 5 files changed, 14 insertions(+), 4 deletions(-) rename src/class183/{Code03_Race1.java => Code02_Race1.java} (99%) rename src/class183/{Code03_Race2.java => Code02_Race2.java} (100%) rename src/class183/{Code02_Tree1.java => Code03_Tree1.java} (99%) create mode 100644 src/class183/Code04_CloseVertices1.java rename src/class183/{Code04_Maschera1.java => Code05_Maschera1.java} (99%) diff --git a/src/class183/Code03_Race1.java b/src/class183/Code02_Race1.java similarity index 99% rename from src/class183/Code03_Race1.java rename to src/class183/Code02_Race1.java index da2808277..c84a55469 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code02_Race1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code03_Race1 { +public class Code02_Race1 { public static int MAXN = 200001; public static int MAXK = 1000001; diff --git a/src/class183/Code03_Race2.java b/src/class183/Code02_Race2.java similarity index 100% rename from src/class183/Code03_Race2.java rename to src/class183/Code02_Race2.java diff --git a/src/class183/Code02_Tree1.java b/src/class183/Code03_Tree1.java similarity index 99% rename from src/class183/Code02_Tree1.java rename to src/class183/Code03_Tree1.java index aa45edfd4..1c2aa1920 100644 --- a/src/class183/Code02_Tree1.java +++ b/src/class183/Code03_Tree1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_Tree1 { +public class Code03_Tree1 { public static int MAXN = 50001; public static int n, k, total; diff --git a/src/class183/Code04_CloseVertices1.java b/src/class183/Code04_CloseVertices1.java new file mode 100644 index 000000000..7c2df3145 --- /dev/null +++ b/src/class183/Code04_CloseVertices1.java @@ -0,0 +1,10 @@ +package class183; + +// 相近的顶点对,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF293E +// 测试链接 : https://codeforces.com/problemset/problem/293/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code04_CloseVertices1 { + +} diff --git a/src/class183/Code04_Maschera1.java b/src/class183/Code05_Maschera1.java similarity index 99% rename from src/class183/Code04_Maschera1.java rename to src/class183/Code05_Maschera1.java index 8046f8f2d..cee86a57e 100644 --- a/src/class183/Code04_Maschera1.java +++ b/src/class183/Code05_Maschera1.java @@ -1,6 +1,6 @@ package class183; -// 路径魔力总和,java版 +// 所有路径的魔力和,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5351 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_Maschera1 { +public class Code05_Maschera1 { public static int MAXN = 100001; public static int n, l, r, total; From 41699514d7b85a135f40e1088f8da35892bc2735 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 11:36:56 +0800 Subject: [PATCH 0985/1170] modify code --- src/class183/Code01_CentroidDecomposition1.java | 2 +- src/class183/Code01_CentroidDecomposition2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 19f03bc16..1d3f2edb9 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -1,6 +1,6 @@ package class183; -// 点分治,也叫重心分治,java版 +// 点分治,也叫重心分解,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3806 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index eba473ed6..ca095912f 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -1,6 +1,6 @@ package class183; -// 点分治,也叫重心分治,C++版 +// 点分治,也叫重心分解,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3806 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 9b8eceea69027123176760a4450ff3d3704cfd56 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 12:23:23 +0800 Subject: [PATCH 0986/1170] modify code --- src/class183/Code03_Message1.java | 8 ++++++++ src/class183/Code04_Capital1.java | 8 ++++++++ src/class183/{Code03_Tree1.java => Code05_Tree1.java} | 2 +- ...e04_CloseVertices1.java => Code06_CloseVertices1.java} | 2 +- .../{Code05_Maschera1.java => Code07_Maschera1.java} | 2 +- 5 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 src/class183/Code03_Message1.java create mode 100644 src/class183/Code04_Capital1.java rename src/class183/{Code03_Tree1.java => Code05_Tree1.java} (99%) rename src/class183/{Code04_CloseVertices1.java => Code06_CloseVertices1.java} (87%) rename src/class183/{Code05_Maschera1.java => Code07_Maschera1.java} (99%) diff --git a/src/class183/Code03_Message1.java b/src/class183/Code03_Message1.java new file mode 100644 index 000000000..b92c343ef --- /dev/null +++ b/src/class183/Code03_Message1.java @@ -0,0 +1,8 @@ +package class183; + +// 消息传递,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P6626 + +public class Code03_Message1 { + +} diff --git a/src/class183/Code04_Capital1.java b/src/class183/Code04_Capital1.java new file mode 100644 index 000000000..d31909ac1 --- /dev/null +++ b/src/class183/Code04_Capital1.java @@ -0,0 +1,8 @@ +package class183; + +// 首都,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P7215 + +public class Code04_Capital1 { + +} diff --git a/src/class183/Code03_Tree1.java b/src/class183/Code05_Tree1.java similarity index 99% rename from src/class183/Code03_Tree1.java rename to src/class183/Code05_Tree1.java index 1c2aa1920..caff2b33b 100644 --- a/src/class183/Code03_Tree1.java +++ b/src/class183/Code05_Tree1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code03_Tree1 { +public class Code05_Tree1 { public static int MAXN = 50001; public static int n, k, total; diff --git a/src/class183/Code04_CloseVertices1.java b/src/class183/Code06_CloseVertices1.java similarity index 87% rename from src/class183/Code04_CloseVertices1.java rename to src/class183/Code06_CloseVertices1.java index 7c2df3145..53d2f3187 100644 --- a/src/class183/Code04_CloseVertices1.java +++ b/src/class183/Code06_CloseVertices1.java @@ -5,6 +5,6 @@ // 测试链接 : https://codeforces.com/problemset/problem/293/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -public class Code04_CloseVertices1 { +public class Code06_CloseVertices1 { } diff --git a/src/class183/Code05_Maschera1.java b/src/class183/Code07_Maschera1.java similarity index 99% rename from src/class183/Code05_Maschera1.java rename to src/class183/Code07_Maschera1.java index cee86a57e..feb62b055 100644 --- a/src/class183/Code05_Maschera1.java +++ b/src/class183/Code07_Maschera1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_Maschera1 { +public class Code07_Maschera1 { public static int MAXN = 100001; public static int n, l, r, total; From 3227f09c6d3711f2515182719f6bd4715fd1df5f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 14:43:17 +0800 Subject: [PATCH 0987/1170] modify code --- .../Code01_CentroidDecomposition1.java | 12 +- .../Code01_CentroidDecomposition2.java | 12 +- src/class183/Code02_Race1.java | 20 +- src/class183/Code02_Race2.java | 12 +- src/class183/Code03_Message1.java | 295 ++++++++++++++++++ src/class183/Code04_Capital1.java | 1 + src/class183/Code05_Tree1.java | 12 +- src/class183/Code06_CloseVertices1.java | 2 +- src/class183/Code07_Maschera1.java | 20 +- 9 files changed, 341 insertions(+), 45 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 1d3f2edb9..223bda2fb 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -60,7 +60,7 @@ public static void getCentroid(int u, int fa) { } } - public static void getDistance(int u, int fa, int w) { + public static void dfs(int u, int fa, int w) { dis[u] = dis[fa] + w; if (dis[u] > maxq) { return; @@ -69,7 +69,7 @@ public static void getDistance(int u, int fa, int w) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getDistance(v, u, weight[e]); + dfs(v, u, weight[e]); } } } @@ -82,7 +82,7 @@ public static void calc(int u) { int w = weight[e]; if (!vis[v]) { cnta = 0; - getDistance(v, u, w); + dfs(v, u, w); for (int i = 1; i <= m; i++) { for (int j = 1; j <= cnta; j++) { if (query[i] - arr[j] >= 0) { @@ -101,7 +101,7 @@ public static void calc(int u) { } } - public static void compute(int u) { + public static void solve(int u) { vis[u] = true; check[0] = true; calc(u); @@ -111,7 +111,7 @@ public static void compute(int u) { total = siz[v]; centroid = 0; getCentroid(v, u); - compute(centroid); + solve(centroid); } } } @@ -135,7 +135,7 @@ public static void main(String[] args) throws Exception { total = n; centroid = 0; getCentroid(1, 0); - compute(centroid); + solve(centroid); for (int i = 1; i <= m; i++) { if (ans[i]) { out.println("AYE"); diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index ca095912f..22095c985 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -58,7 +58,7 @@ // } //} // -//void getDistance(int u, int fa, int w) { +//void dfs(int u, int fa, int w) { // dis[u] = dis[fa] + w; // if (dis[u] > maxq) { // return; @@ -67,7 +67,7 @@ // for (int e = head[u]; e > 0; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// getDistance(v, u, weight[e]); +// dfs(v, u, weight[e]); // } // } //} @@ -80,7 +80,7 @@ // int w = weight[e]; // if (!vis[v]) { // cnta = 0; -// getDistance(v, u, w); +// dfs(v, u, w); // for (int i = 1; i <= m; i++) { // for (int j = 1; j <= cnta; j++) { // if (query[i] - arr[j] >= 0) { @@ -99,7 +99,7 @@ // } //} // -//void compute(int u) { +//void solve(int u) { // vis[u] = true; // check[0] = true; // calc(u); @@ -109,7 +109,7 @@ // total = siz[v]; // centroid = 0; // getCentroid(v, u); -// compute(centroid); +// solve(centroid); // } // } //} @@ -130,7 +130,7 @@ // total = n; // centroid = 0; // getCentroid(1, 0); -// compute(centroid); +// solve(centroid); // for (int i = 1; i <= m; i++) { // if (ans[i]) { // cout << "AYE" << '\n'; diff --git a/src/class183/Code02_Race1.java b/src/class183/Code02_Race1.java index c84a55469..1620e6392 100644 --- a/src/class183/Code02_Race1.java +++ b/src/class183/Code02_Race1.java @@ -116,8 +116,8 @@ public static void getCentroid2(int cur, int fa) { } } - // 收集路径的递归版,java会爆栈,C++可以通过 - public static void getPath1(int u, int fa, int sum, int edge) { + // 收集信息递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa, int sum, int edge) { if (sum > k) { return; } @@ -126,13 +126,13 @@ public static void getPath1(int u, int fa, int sum, int edge) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getPath1(v, u, sum + weight[e], edge + 1); + dfs1(v, u, sum + weight[e], edge + 1); } } } - // 收集路径的迭代版 - public static void getPath2(int cur, int fa, int psum, int pedge) { + // 收集信息的迭代版 + public static void dfs2(int cur, int fa, int psum, int pedge) { stacksize = 0; push(cur, fa, psum, pedge, -1); while (stacksize > 0) { @@ -165,8 +165,8 @@ public static int calc(int u) { int v = to[e]; if (!vis[v]) { int tmp = cnta; - // getPath1(v, u, weight[e], 1); - getPath2(v, u, weight[e], 1); + // dfs1(v, u, weight[e], 1); + dfs2(v, u, weight[e], 1); for (int i = tmp + 1; i <= cnta; i++) { ans = Math.min(ans, dp[k - sumArr[i]] + edgeArr[i]); } @@ -181,7 +181,7 @@ public static int calc(int u) { return ans; } - public static int compute(int u) { + public static int solve(int u) { int ans = INF; vis[u] = true; ans = Math.min(ans, calc(u)); @@ -192,7 +192,7 @@ public static int compute(int u) { centroid = 0; // getCentroid1(v, 0); getCentroid2(v, 0); - ans = Math.min(ans, compute(centroid)); + ans = Math.min(ans, solve(centroid)); } } return ans; @@ -215,7 +215,7 @@ public static void main(String[] args) throws Exception { // getCentroid1(1, 0); getCentroid2(1, 0); Arrays.fill(dp, INF); - int ans = compute(centroid); + int ans = solve(centroid); if (ans == INF) { ans = -1; } diff --git a/src/class183/Code02_Race2.java b/src/class183/Code02_Race2.java index f4ba109af..2f91e1f11 100644 --- a/src/class183/Code02_Race2.java +++ b/src/class183/Code02_Race2.java @@ -55,7 +55,7 @@ // } //} // -//void getPath(int u, int fa, int sum, int edge) { +//void dfs(int u, int fa, int sum, int edge) { // if (sum > k) { // return; // } @@ -64,7 +64,7 @@ // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// getPath(v, u, sum + weight[e], edge + 1); +// dfs(v, u, sum + weight[e], edge + 1); // } // } //} @@ -77,7 +77,7 @@ // int v = to[e]; // if (!vis[v]) { // int tmp = cnta; -// getPath(v, u, weight[e], 1); +// dfs(v, u, weight[e], 1); // for (int i = tmp + 1; i <= cnta; i++) { // ans = min(ans, dp[k - sumArr[i]] + edgeArr[i]); // } @@ -92,7 +92,7 @@ // return ans; //} // -//int compute(int u) { +//int solve(int u) { // int ans = INF; // vis[u] = true; // ans = min(ans, calc(u)); @@ -102,7 +102,7 @@ // total = siz[v]; // centroid = 0; // getCentroid(v, 0); -// ans = min(ans, compute(centroid)); +// ans = min(ans, solve(centroid)); // } // } // return ans; @@ -123,7 +123,7 @@ // centroid = 0; // getCentroid(1, 0); // fill(dp, dp + MAXK, INF); -// int ans = compute(centroid); +// int ans = solve(centroid); // if (ans == INF) { // ans = -1; // } diff --git a/src/class183/Code03_Message1.java b/src/class183/Code03_Message1.java index b92c343ef..970c0be66 100644 --- a/src/class183/Code03_Message1.java +++ b/src/class183/Code03_Message1.java @@ -2,7 +2,302 @@ // 消息传递,java版 // 测试链接 : https://www.luogu.com.cn/problem/P6626 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; public class Code03_Message1 { + public static int MAXN = 100001; + public static int t, n, m, total; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXN << 1]; + public static int[] tog = new int[MAXN << 1]; + public static int cntg; + + public static int[] headq = new int[MAXN]; + public static int[] nextq = new int[MAXN]; + public static int[] tim = new int[MAXN]; + public static int[] qid = new int[MAXN]; + public static int cntq; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] maxPart = new int[MAXN]; + public static int centroid; + + public static int[] dep = new int[MAXN]; + public static int[] depCnt = new int[MAXN]; + public static int maxDeep; + + public static int[] timArr = new int[MAXN]; + public static int[] qidArr = new int[MAXN]; + public static int cnta; + + public static int[] ans = new int[MAXN]; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][3]; + public static int stacksize, u, f, e; + + public static void push(int u, int f, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + e = stack[stacksize][2]; + } + + public static void addEdge(int u, int v) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + headg[u] = cntg; + } + + public static void addQuery(int u, int t, int id) { + nextq[++cntq] = headq[u]; + tim[cntq] = t; + qid[cntq] = id; + headq[u] = cntq; + } + + // 找重心的递归版,java会爆栈,C++可以通过 + public static void getCentroid1(int u, int fa) { + siz[u] = 1; + maxPart[u] = 0; + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (v != fa && !vis[v]) { + getCentroid1(v, u); + siz[u] += siz[v]; + maxPart[u] = Math.max(siz[v], maxPart[u]); + } + } + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { + centroid = u; + } + } + + // 找重心的迭代版 + public static void getCentroid2(int cur, int fa) { + stacksize = 0; + push(cur, fa, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + maxPart[u] = 0; + e = headg[u]; + } else { + e = nextg[e]; + } + if (e != 0) { + push(u, f, e); + int v = tog[e]; + if (v != f && !vis[v]) { + push(tog[e], u, -1); + } + } else { + for (int ei = headg[u]; ei > 0; ei = nextg[ei]) { + int v = tog[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + maxPart[u] = Math.max(siz[v], maxPart[u]); + } + } + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { + centroid = u; + } + } + } + } + + // 收集信息递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa) { + dep[u] = dep[fa] + 1; + depCnt[dep[u]]++; + maxDeep = Math.max(maxDeep, dep[u]); + for (int e = headq[u]; e > 0; e = nextq[e]) { + if (tim[e] + 1 >= dep[u]) { + timArr[++cnta] = tim[e] - dep[u] + 2; + qidArr[cnta] = qid[e]; + } + } + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (v != fa && !vis[v]) { + dfs1(v, u); + } + } + } + + // 收集信息迭代版 + public static void dfs2(int cur, int fa) { + stacksize = 0; + push(cur, fa, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dep[u] = dep[f] + 1; + depCnt[dep[u]]++; + maxDeep = Math.max(maxDeep, dep[u]); + for (int e = headq[u]; e > 0; e = nextq[e]) { + if (tim[e] + 1 >= dep[u]) { + timArr[++cnta] = tim[e] - dep[u] + 2; + qidArr[cnta] = qid[e]; + } + } + e = headg[u]; + } else { + e = nextg[e]; + } + if (e != 0) { + push(u, f, e); + int v = tog[e]; + if (v != f && !vis[v]) { + push(tog[e], u, -1); + } + } + } + } + + public static void calc(int u) { + cnta = 0; + maxDeep = 0; + // dfs1(u, 0); + dfs2(u, 0); + for (int i = 1; i <= cnta; i++) { + ans[qidArr[i]] += depCnt[timArr[i]]; + } + for (int d = 1; d <= maxDeep; d++) { + depCnt[d] = 0; + } + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (!vis[v]) { + cnta = 0; + maxDeep = 0; + // dfs1(v, u); + dfs2(v, u); + for (int i = 1; i <= cnta; i++) { + ans[qidArr[i]] -= depCnt[timArr[i]]; + } + for (int d = 1; d <= maxDeep; d++) { + depCnt[d] = 0; + } + } + } + } + + public static void solve(int u) { + vis[u] = true; + calc(u); + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (!vis[v]) { + total = siz[v]; + centroid = 0; + // getCentroid1(v, u); + getCentroid2(v, u); + solve(centroid); + } + } + } + + public static void prepare() { + cntg = 0; + cntq = 0; + for (int i = 1; i <= n; i++) { + headg[i] = 0; + headq[i] = 0; + vis[i] = false; + } + for (int i = 1; i <= m; i++) { + ans[i] = 0; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + t = in.nextInt(); + for (int c = 1; c <= t; c++) { + n = in.nextInt(); + m = in.nextInt(); + prepare(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + for (int i = 1, x, k; i <= m; i++) { + x = in.nextInt(); + k = in.nextInt(); + addQuery(x, k, i); + } + total = n; + centroid = 0; + // getCentroid1(1, 0); + getCentroid2(1, 0); + solve(centroid); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class183/Code04_Capital1.java b/src/class183/Code04_Capital1.java index d31909ac1..22e51b87a 100644 --- a/src/class183/Code04_Capital1.java +++ b/src/class183/Code04_Capital1.java @@ -2,6 +2,7 @@ // 首都,java版 // 测试链接 : https://www.luogu.com.cn/problem/P7215 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 public class Code04_Capital1 { diff --git a/src/class183/Code05_Tree1.java b/src/class183/Code05_Tree1.java index caff2b33b..490781356 100644 --- a/src/class183/Code05_Tree1.java +++ b/src/class183/Code05_Tree1.java @@ -54,7 +54,7 @@ public static void getCentroid(int u, int fa) { } } - public static void getDistance(int u, int fa, int w) { + public static void dfs(int u, int fa, int w) { dis[u] = dis[fa] + w; if (dis[u] > k) { return; @@ -63,7 +63,7 @@ public static void getDistance(int u, int fa, int w) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getDistance(v, u, weight[e]); + dfs(v, u, weight[e]); } } } @@ -71,7 +71,7 @@ public static void getDistance(int u, int fa, int w) { public static long calc(int u, int fa, int w) { dis[fa] = 0; cnta = 0; - getDistance(u, fa, w); + dfs(u, fa, w); long ans = 0; Arrays.sort(arr, 1, cnta + 1); for (int l = 1, r = cnta; l < r;) { @@ -85,7 +85,7 @@ public static long calc(int u, int fa, int w) { return ans; } - public static long compute(int u) { + public static long solve(int u) { long ans = 0; ans += calc(u, 0, 0); vis[u] = true; @@ -96,7 +96,7 @@ public static long compute(int u) { total = siz[v]; centroid = 0; getCentroid(v, 0); - ans += compute(centroid); + ans += solve(centroid); } } return ans; @@ -117,7 +117,7 @@ public static void main(String[] args) throws Exception { total = n; centroid = 0; getCentroid(1, 0); - out.println(compute(centroid)); + out.println(solve(centroid)); out.flush(); out.close(); } diff --git a/src/class183/Code06_CloseVertices1.java b/src/class183/Code06_CloseVertices1.java index 53d2f3187..13e4c8fd3 100644 --- a/src/class183/Code06_CloseVertices1.java +++ b/src/class183/Code06_CloseVertices1.java @@ -1,6 +1,6 @@ package class183; -// 相近的顶点对,java版 +// 相近的点对数量,java版 // 测试链接 : https://www.luogu.com.cn/problem/CF293E // 测试链接 : https://codeforces.com/problemset/problem/293/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class183/Code07_Maschera1.java b/src/class183/Code07_Maschera1.java index feb62b055..340cdcb95 100644 --- a/src/class183/Code07_Maschera1.java +++ b/src/class183/Code07_Maschera1.java @@ -139,8 +139,8 @@ public static void getCentroid2(int cur, int fa) { } } - // 收集路径的递归版,java会爆栈,C++可以通过 - public static void getPath1(int u, int fa, int maxv, int edge) { + // 收集信息递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa, int maxv, int edge) { if (edge > r) { return; } @@ -149,13 +149,13 @@ public static void getPath1(int u, int fa, int maxv, int edge) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getPath1(v, u, Math.max(maxv, weight[e]), edge + 1); + dfs1(v, u, Math.max(maxv, weight[e]), edge + 1); } } } - // 收集路径的迭代版 - public static void getPath2(int cur, int fa, int pmaxv, int pedge) { + // 收集信息迭代版 + public static void dfs2(int cur, int fa, int pmaxv, int pedge) { stacksize = 0; push(cur, fa, pmaxv, pedge, -1); while (stacksize > 0) { @@ -202,8 +202,8 @@ public static void calc(int u) { int v = to[e]; if (!vis[v]) { cntc = 0; - // getPath1(v, u, weight[e], 1); - getPath2(v, u, weight[e], 1); + // dfs1(v, u, weight[e], 1); + dfs2(v, u, weight[e], 1); if (cntc > 0) { sort(curMaxv, curEdge, 1, cntc); for (int i = 1; i <= cntc; i++) { @@ -249,7 +249,7 @@ public static void calc(int u) { } } - public static void compute(int u) { + public static void solve(int u) { calc(u); vis[u] = true; for (int e = head[u]; e > 0; e = nxt[e]) { @@ -259,7 +259,7 @@ public static void compute(int u) { centroid = 0; // getCentroid1(v, 0); getCentroid2(v, 0); - compute(centroid); + solve(centroid); } } } @@ -281,7 +281,7 @@ public static void main(String[] args) throws Exception { centroid = 0; // getCentroid1(1, 0); getCentroid2(1, 0); - compute(centroid); + solve(centroid); out.println(ans << 1); out.flush(); out.close(); From b3366b0f7eefd8e8cc5fbcfe3d783a81aeedb905 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 16:27:58 +0800 Subject: [PATCH 0988/1170] modify code --- src/class183/Code04_Capital1.java | 264 ++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) diff --git a/src/class183/Code04_Capital1.java b/src/class183/Code04_Capital1.java index 22e51b87a..438ff2411 100644 --- a/src/class183/Code04_Capital1.java +++ b/src/class183/Code04_Capital1.java @@ -4,6 +4,270 @@ // 测试链接 : https://www.luogu.com.cn/problem/P7215 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + public class Code04_Capital1 { + public static int MAXN = 200001; + public static int INF = 1000000001; + public static int n, k, total; + public static int[] color = new int[MAXN]; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXN << 1]; + public static int[] tog = new int[MAXN << 1]; + public static int cntg; + + public static int[] headc = new int[MAXN]; + public static int[] nextc = new int[MAXN]; + public static int[] toc = new int[MAXN]; + public static int cntc; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] maxPart = new int[MAXN]; + public static int centroid; + + public static int[] father = new int[MAXN]; + public static int[] nodeStamp = new int[MAXN]; + public static int[] colorStamp = new int[MAXN]; + public static int[] que = new int[MAXN]; + public static boolean[] enter = new boolean[MAXN]; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][4]; + public static int stacksize, u, f, rt, e; + + public static void push(int u, int f, int rt, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = rt; + stack[stacksize][3] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + rt = stack[stacksize][2]; + e = stack[stacksize][3]; + } + + public static void addEdge(int u, int v) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + headg[u] = cntg; + } + + public static void addNode(int color, int node) { + nextc[++cntc] = headc[color]; + toc[cntc] = node; + headc[color] = cntc; + } + + // 找重心的递归版,java会爆栈,C++可以通过 + public static void getCentroid1(int u, int fa) { + siz[u] = 1; + maxPart[u] = 0; + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (v != fa && !vis[v]) { + getCentroid1(v, u); + siz[u] += siz[v]; + maxPart[u] = Math.max(siz[v], maxPart[u]); + } + } + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { + centroid = u; + } + } + + // 找重心的迭代版 + public static void getCentroid2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + maxPart[u] = 0; + e = headg[u]; + } else { + e = nextg[e]; + } + if (e != 0) { + push(u, f, 0, e); + int v = tog[e]; + if (v != f && !vis[v]) { + push(tog[e], u, 0, -1); + } + } else { + for (int ei = headg[u]; ei > 0; ei = nextg[ei]) { + int v = tog[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + maxPart[u] = Math.max(siz[v], maxPart[u]); + } + } + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { + centroid = u; + } + } + } + } + + // 收集信息递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa, int root) { + father[u] = fa; + nodeStamp[u] = root; + enter[u] = false; + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (v != fa && !vis[v]) { + dfs1(v, u, root); + } + } + } + + // 收集信息迭代版 + public static void dfs2(int cur, int fa, int root) { + stacksize = 0; + push(cur, fa, root, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + father[u] = f; + nodeStamp[u] = rt; + enter[u] = false; + e = headg[u]; + } else { + e = nextg[e]; + } + if (e != 0) { + push(u, f, rt, e); + int v = tog[e]; + if (v != f && !vis[v]) { + push(tog[e], u, rt, -1); + } + } + } + } + + public static int calc(int u) { + // dfs1(u, 0, u); + dfs2(u, 0, u); + int l = 1, r = 0; + que[++r] = u; + enter[u] = true; + int ans = 0; + while (l <= r) { + int cur = que[l++]; + if (cur != u && !enter[father[cur]]) { + que[++r] = father[cur]; + enter[father[cur]] = true; + } + if (colorStamp[color[cur]] != u) { + colorStamp[color[cur]] = u; + ans++; + for (int e = headc[color[cur]]; e > 0; e = nextc[e]) { + int v = toc[e]; + if (nodeStamp[v] != u) { + return INF; + } + if (!enter[v]) { + que[++r] = v; + enter[v] = true; + } + } + } + } + return ans; + } + + public static int solve(int u) { + vis[u] = true; + int ans = calc(u); + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (!vis[v]) { + total = siz[v]; + centroid = 0; + // getCentroid1(v, u); + getCentroid2(v, u); + ans = Math.min(ans, solve(centroid)); + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + k = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + for (int i = 1; i <= n; i++) { + color[i] = in.nextInt(); + addNode(color[i], i); + } + total = n; + centroid = 0; + // getCentroid1(1, 0); + getCentroid2(1, 0); + int ans = solve(centroid); + out.println(ans - 1); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From 4e8f4761d9a199d4de0ae2670a4aac21ff0f658b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 16:32:10 +0800 Subject: [PATCH 0989/1170] modify code --- src/class183/{Code05_Tree1.java => Code03_Tree1.java} | 2 +- .../{Code06_CloseVertices1.java => Code04_CloseVertices1.java} | 2 +- src/class183/{Code03_Message1.java => Code05_Message1.java} | 2 +- src/class183/{Code04_Capital1.java => Code06_Capital1.java} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename src/class183/{Code05_Tree1.java => Code03_Tree1.java} (99%) rename src/class183/{Code06_CloseVertices1.java => Code04_CloseVertices1.java} (88%) rename src/class183/{Code03_Message1.java => Code05_Message1.java} (99%) rename src/class183/{Code04_Capital1.java => Code06_Capital1.java} (99%) diff --git a/src/class183/Code05_Tree1.java b/src/class183/Code03_Tree1.java similarity index 99% rename from src/class183/Code05_Tree1.java rename to src/class183/Code03_Tree1.java index 490781356..ebc3b6abd 100644 --- a/src/class183/Code05_Tree1.java +++ b/src/class183/Code03_Tree1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_Tree1 { +public class Code03_Tree1 { public static int MAXN = 50001; public static int n, k, total; diff --git a/src/class183/Code06_CloseVertices1.java b/src/class183/Code04_CloseVertices1.java similarity index 88% rename from src/class183/Code06_CloseVertices1.java rename to src/class183/Code04_CloseVertices1.java index 13e4c8fd3..bf50b32cc 100644 --- a/src/class183/Code06_CloseVertices1.java +++ b/src/class183/Code04_CloseVertices1.java @@ -5,6 +5,6 @@ // 测试链接 : https://codeforces.com/problemset/problem/293/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -public class Code06_CloseVertices1 { +public class Code04_CloseVertices1 { } diff --git a/src/class183/Code03_Message1.java b/src/class183/Code05_Message1.java similarity index 99% rename from src/class183/Code03_Message1.java rename to src/class183/Code05_Message1.java index 970c0be66..1195e1012 100644 --- a/src/class183/Code03_Message1.java +++ b/src/class183/Code05_Message1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code03_Message1 { +public class Code05_Message1 { public static int MAXN = 100001; public static int t, n, m, total; diff --git a/src/class183/Code04_Capital1.java b/src/class183/Code06_Capital1.java similarity index 99% rename from src/class183/Code04_Capital1.java rename to src/class183/Code06_Capital1.java index 438ff2411..17bea0022 100644 --- a/src/class183/Code04_Capital1.java +++ b/src/class183/Code06_Capital1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_Capital1 { +public class Code06_Capital1 { public static int MAXN = 200001; public static int INF = 1000000001; From 3f5d0003666ee780bd1d7d6a5ead2cb00c14bd76 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 17:29:42 +0800 Subject: [PATCH 0990/1170] modify code --- .../Code01_CentroidDecomposition1.java | 37 +++-- .../Code01_CentroidDecomposition2.java | 142 ------------------ src/class183/Code03_Tree1.java | 17 +-- 3 files changed, 24 insertions(+), 172 deletions(-) delete mode 100644 src/class183/Code01_CentroidDecomposition2.java diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 223bda2fb..da92b8841 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -28,11 +28,10 @@ public class Code01_CentroidDecomposition1 { public static int[] maxPart = new int[MAXN]; public static int centroid; - public static int[] dis = new int[MAXN]; - public static int[] arr = new int[MAXN]; - public static int[] que = new int[MAXN]; + public static int[] curDis = new int[MAXN]; + public static int[] allDis = new int[MAXN]; public static boolean[] check = new boolean[MAXV]; - public static int cnta, cntq; + public static int cntc, cnta; public static boolean[] ans = new boolean[MAXM]; @@ -60,44 +59,42 @@ public static void getCentroid(int u, int fa) { } } - public static void dfs(int u, int fa, int w) { - dis[u] = dis[fa] + w; - if (dis[u] > maxq) { + public static void dfs(int u, int fa, int dis) { + if (dis > maxq) { return; } - arr[++cnta] = dis[u]; + curDis[++cntc] = dis; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - dfs(v, u, weight[e]); + dfs(v, u, dis + weight[e]); } } } public static void calc(int u) { - dis[u] = 0; - cntq = 0; + cnta = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; int w = weight[e]; if (!vis[v]) { - cnta = 0; + cntc = 0; dfs(v, u, w); for (int i = 1; i <= m; i++) { - for (int j = 1; j <= cnta; j++) { - if (query[i] - arr[j] >= 0) { - ans[i] |= check[query[i] - arr[j]]; + for (int j = 1; j <= cntc; j++) { + if (query[i] - curDis[j] >= 0) { + ans[i] |= check[query[i] - curDis[j]]; } } } - for (int i = 1; i <= cnta; i++) { - que[++cntq] = arr[i]; - check[arr[i]] = true; + for (int i = 1; i <= cntc; i++) { + allDis[++cnta] = curDis[i]; + check[curDis[i]] = true; } } } - for (int i = 1; i <= cntq; i++) { - check[que[i]] = false; + for (int i = 1; i <= cnta; i++) { + check[allDis[i]] = false; } } diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java deleted file mode 100644 index 22095c985..000000000 --- a/src/class183/Code01_CentroidDecomposition2.java +++ /dev/null @@ -1,142 +0,0 @@ -package class183; - -// 点分治,也叫重心分解,C++版 -// 测试链接 : https://www.luogu.com.cn/problem/P3806 -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 - -//#include -// -//using namespace std; -// -//const int MAXN = 10001; -//const int MAXM = 101; -//const int MAXV = 10000001; -//int n, m, maxq, total; -//int query[MAXM]; -// -//int head[MAXN]; -//int nxt[MAXN << 1]; -//int to[MAXN << 1]; -//int weight[MAXN << 1]; -//int cntg; -// -//bool vis[MAXN]; -//int siz[MAXN]; -//int maxPart[MAXN]; -//int centroid; -// -//int dis[MAXN]; -//int arr[MAXN]; -//int que[MAXN]; -//bool check[MAXV]; -//int cnta, cntq; -// -//bool ans[MAXM]; -// -//void addEdge(int u, int v, int w) { -// nxt[++cntg] = head[u]; -// to[cntg] = v; -// weight[cntg] = w; -// head[u] = cntg; -//} -// -//void getCentroid(int u, int fa) { -// siz[u] = 1; -// maxPart[u] = 0; -// for (int e = head[u]; e > 0; e = nxt[e]) { -// int v = to[e]; -// if (v != fa && !vis[v]) { -// getCentroid(v, u); -// siz[u] += siz[v]; -// maxPart[u] = max(maxPart[u], siz[v]); -// } -// } -// maxPart[u] = max(maxPart[u], total - siz[u]); -// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { -// centroid = u; -// } -//} -// -//void dfs(int u, int fa, int w) { -// dis[u] = dis[fa] + w; -// if (dis[u] > maxq) { -// return; -// } -// arr[++cnta] = dis[u]; -// for (int e = head[u]; e > 0; e = nxt[e]) { -// int v = to[e]; -// if (v != fa && !vis[v]) { -// dfs(v, u, weight[e]); -// } -// } -//} -// -//void calc(int u) { -// dis[u] = 0; -// cntq = 0; -// for (int e = head[u]; e > 0; e = nxt[e]) { -// int v = to[e]; -// int w = weight[e]; -// if (!vis[v]) { -// cnta = 0; -// dfs(v, u, w); -// for (int i = 1; i <= m; i++) { -// for (int j = 1; j <= cnta; j++) { -// if (query[i] - arr[j] >= 0) { -// ans[i] |= check[query[i] - arr[j]]; -// } -// } -// } -// for (int i = 1; i <= cnta; i++) { -// que[++cntq] = arr[i]; -// check[arr[i]] = true; -// } -// } -// } -// for (int i = 1; i <= cntq; i++) { -// check[que[i]] = false; -// } -//} -// -//void solve(int u) { -// vis[u] = true; -// check[0] = true; -// calc(u); -// for (int e = head[u]; e > 0; e = nxt[e]) { -// int v = to[e]; -// if (!vis[v]) { -// total = siz[v]; -// centroid = 0; -// getCentroid(v, u); -// solve(centroid); -// } -// } -//} -// -//int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n >> m; -// for (int i = 1, u, v, w; i < n; i++) { -// cin >> u >> v >> w; -// addEdge(u, v, w); -// addEdge(v, u, w); -// } -// for (int i = 1; i <= m; i++) { -// cin >> query[i]; -// maxq = max(maxq, query[i]); -// } -// total = n; -// centroid = 0; -// getCentroid(1, 0); -// solve(centroid); -// for (int i = 1; i <= m; i++) { -// if (ans[i]) { -// cout << "AYE" << '\n'; -// } else { -// cout << "NAY" << '\n'; -// } -// } -// return 0; -//} \ No newline at end of file diff --git a/src/class183/Code03_Tree1.java b/src/class183/Code03_Tree1.java index ebc3b6abd..ef598f249 100644 --- a/src/class183/Code03_Tree1.java +++ b/src/class183/Code03_Tree1.java @@ -26,8 +26,7 @@ public class Code03_Tree1 { public static int[] maxPart = new int[MAXN]; public static int centroid; - public static int[] dis = new int[MAXN]; - public static int[] arr = new int[MAXN]; + public static int[] disArr = new int[MAXN]; public static int cnta; public static void addEdge(int u, int v, int w) { @@ -54,28 +53,26 @@ public static void getCentroid(int u, int fa) { } } - public static void dfs(int u, int fa, int w) { - dis[u] = dis[fa] + w; - if (dis[u] > k) { + public static void dfs(int u, int fa, int dis) { + if (dis > k) { return; } - arr[++cnta] = dis[u]; + disArr[++cnta] = dis; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - dfs(v, u, weight[e]); + dfs(v, u, dis + weight[e]); } } } public static long calc(int u, int fa, int w) { - dis[fa] = 0; cnta = 0; dfs(u, fa, w); long ans = 0; - Arrays.sort(arr, 1, cnta + 1); + Arrays.sort(disArr, 1, cnta + 1); for (int l = 1, r = cnta; l < r;) { - if (arr[l] + arr[r] <= k) { + if (disArr[l] + disArr[r] <= k) { ans += r - l; l++; } else { From 1c36d89914e9e54c1907d2bba885e20a79c678bf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 17:44:01 +0800 Subject: [PATCH 0991/1170] modify code --- src/class183/Code05_Message1.java | 57 +++++++++++++++---------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/src/class183/Code05_Message1.java b/src/class183/Code05_Message1.java index 1195e1012..2adf13692 100644 --- a/src/class183/Code05_Message1.java +++ b/src/class183/Code05_Message1.java @@ -30,7 +30,6 @@ public class Code05_Message1 { public static int[] maxPart = new int[MAXN]; public static int centroid; - public static int[] dep = new int[MAXN]; public static int[] depCnt = new int[MAXN]; public static int maxDeep; @@ -41,13 +40,14 @@ public class Code05_Message1 { public static int[] ans = new int[MAXN]; // 讲解118,递归函数改成迭代所需要的栈 - public static int[][] stack = new int[MAXN][3]; - public static int stacksize, u, f, e; + public static int[][] stack = new int[MAXN][4]; + public static int stacksize, u, f, dep, e; - public static void push(int u, int f, int e) { + public static void push(int u, int f, int dep, int e) { stack[stacksize][0] = u; stack[stacksize][1] = f; - stack[stacksize][2] = e; + stack[stacksize][2] = dep; + stack[stacksize][3] = e; stacksize++; } @@ -55,7 +55,8 @@ public static void pop() { --stacksize; u = stack[stacksize][0]; f = stack[stacksize][1]; - e = stack[stacksize][2]; + dep = stack[stacksize][2]; + e = stack[stacksize][3]; } public static void addEdge(int u, int v) { @@ -92,7 +93,7 @@ public static void getCentroid1(int u, int fa) { // 找重心的迭代版 public static void getCentroid2(int cur, int fa) { stacksize = 0; - push(cur, fa, -1); + push(cur, fa, 0, -1); while (stacksize > 0) { pop(); if (e == -1) { @@ -103,10 +104,10 @@ public static void getCentroid2(int cur, int fa) { e = nextg[e]; } if (e != 0) { - push(u, f, e); + push(u, f, 0, e); int v = tog[e]; if (v != f && !vis[v]) { - push(tog[e], u, -1); + push(tog[e], u, 0, -1); } } else { for (int ei = headg[u]; ei > 0; ei = nextg[ei]) { @@ -125,37 +126,35 @@ public static void getCentroid2(int cur, int fa) { } // 收集信息递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa) { - dep[u] = dep[fa] + 1; - depCnt[dep[u]]++; - maxDeep = Math.max(maxDeep, dep[u]); + public static void dfs1(int u, int fa, int deep) { + depCnt[deep]++; + maxDeep = Math.max(maxDeep, deep); for (int e = headq[u]; e > 0; e = nextq[e]) { - if (tim[e] + 1 >= dep[u]) { - timArr[++cnta] = tim[e] - dep[u] + 2; + if (tim[e] + 1 >= deep) { + timArr[++cnta] = tim[e] - deep + 2; qidArr[cnta] = qid[e]; } } for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - dfs1(v, u); + dfs1(v, u, deep + 1); } } } // 收集信息迭代版 - public static void dfs2(int cur, int fa) { + public static void dfs2(int cur, int fa, int deep) { stacksize = 0; - push(cur, fa, -1); + push(cur, fa, deep, -1); while (stacksize > 0) { pop(); if (e == -1) { - dep[u] = dep[f] + 1; - depCnt[dep[u]]++; - maxDeep = Math.max(maxDeep, dep[u]); + depCnt[dep]++; + maxDeep = Math.max(maxDeep, dep); for (int e = headq[u]; e > 0; e = nextq[e]) { - if (tim[e] + 1 >= dep[u]) { - timArr[++cnta] = tim[e] - dep[u] + 2; + if (tim[e] + 1 >= dep) { + timArr[++cnta] = tim[e] - dep + 2; qidArr[cnta] = qid[e]; } } @@ -164,10 +163,10 @@ public static void dfs2(int cur, int fa) { e = nextg[e]; } if (e != 0) { - push(u, f, e); + push(u, f, dep, e); int v = tog[e]; if (v != f && !vis[v]) { - push(tog[e], u, -1); + push(tog[e], u, dep + 1, -1); } } } @@ -176,8 +175,8 @@ public static void dfs2(int cur, int fa) { public static void calc(int u) { cnta = 0; maxDeep = 0; - // dfs1(u, 0); - dfs2(u, 0); + // dfs1(u, 0, 1); + dfs2(u, 0, 1); for (int i = 1; i <= cnta; i++) { ans[qidArr[i]] += depCnt[timArr[i]]; } @@ -189,8 +188,8 @@ public static void calc(int u) { if (!vis[v]) { cnta = 0; maxDeep = 0; - // dfs1(v, u); - dfs2(v, u); + // dfs1(v, u, 2); + dfs2(v, u, 2); for (int i = 1; i <= cnta; i++) { ans[qidArr[i]] -= depCnt[timArr[i]]; } From ea1306d728f17599f2c87898f77a3816f34bd6d5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 17:45:27 +0800 Subject: [PATCH 0992/1170] modify code --- src/class183/Code07_Maschera1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class183/Code07_Maschera1.java b/src/class183/Code07_Maschera1.java index 340cdcb95..7141b05f3 100644 --- a/src/class183/Code07_Maschera1.java +++ b/src/class183/Code07_Maschera1.java @@ -27,14 +27,14 @@ public class Code07_Maschera1 { public static int[] maxPart = new int[MAXN]; public static int centroid; - public static int[] allMaxv = new int[MAXN]; - public static int[] allEdge = new int[MAXN]; - public static int cnta; - public static int[] curMaxv = new int[MAXN]; public static int[] curEdge = new int[MAXN]; public static int cntc; + public static int[] allMaxv = new int[MAXN]; + public static int[] allEdge = new int[MAXN]; + public static int cnta; + public static long ans; // 讲解118,递归函数改成迭代所需要的栈 From 0c935e13e3faa08a5a88528e992ca0a69e16bf4e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 17:47:43 +0800 Subject: [PATCH 0993/1170] modify code --- src/class183/Code01_CentroidDecomposition1.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index da92b8841..41ea99b19 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -29,9 +29,12 @@ public class Code01_CentroidDecomposition1 { public static int centroid; public static int[] curDis = new int[MAXN]; + public static int cntc; + public static int[] allDis = new int[MAXN]; + public static int cnta; + public static boolean[] check = new boolean[MAXV]; - public static int cntc, cnta; public static boolean[] ans = new boolean[MAXM]; From 64ea7820266e413e2ac6dea7521c578c67009890 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 21:17:04 +0800 Subject: [PATCH 0994/1170] modify code --- src/class183/Code03_Tree1.java | 10 +- src/class183/Code04_CloseVertices1.java | 195 ++++++++++++++++++++++++ 2 files changed, 200 insertions(+), 5 deletions(-) diff --git a/src/class183/Code03_Tree1.java b/src/class183/Code03_Tree1.java index ef598f249..afcdf6275 100644 --- a/src/class183/Code03_Tree1.java +++ b/src/class183/Code03_Tree1.java @@ -66,9 +66,9 @@ public static void dfs(int u, int fa, int dis) { } } - public static long calc(int u, int fa, int w) { + public static long calc(int u, int dis) { cnta = 0; - dfs(u, fa, w); + dfs(u, 0, dis); long ans = 0; Arrays.sort(disArr, 1, cnta + 1); for (int l = 1, r = cnta; l < r;) { @@ -84,12 +84,12 @@ public static long calc(int u, int fa, int w) { public static long solve(int u) { long ans = 0; - ans += calc(u, 0, 0); + ans += calc(u, 0); vis[u] = true; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - ans -= calc(v, u, weight[e]); + ans -= calc(v, weight[e]); total = siz[v]; centroid = 0; getCentroid(v, 0); @@ -121,7 +121,7 @@ public static void main(String[] args) throws Exception { // 读写工具类 static class FastReader { - private final byte[] buffer = new byte[1 << 20]; + private final byte[] buffer = new byte[1 << 16]; private int ptr = 0, len = 0; private final InputStream in; diff --git a/src/class183/Code04_CloseVertices1.java b/src/class183/Code04_CloseVertices1.java index bf50b32cc..2edc219b6 100644 --- a/src/class183/Code04_CloseVertices1.java +++ b/src/class183/Code04_CloseVertices1.java @@ -5,6 +5,201 @@ // 测试链接 : https://codeforces.com/problemset/problem/293/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + public class Code04_CloseVertices1 { + public static int MAXN = 100005; + public static int n, limitl, limitw, total; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] maxPart = new int[MAXN]; + public static int centroid; + + public static int[] disArr = new int[MAXN]; + public static int[] depArr = new int[MAXN]; + public static int cnta; + + public static int[] tree = new int[MAXN]; + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + while (i <= n + 1) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static void getCentroid(int u, int fa) { + siz[u] = 1; + maxPart[u] = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getCentroid(v, u); + siz[u] += siz[v]; + maxPart[u] = Math.max(siz[v], maxPart[u]); + } + } + maxPart[u] = Math.max(maxPart[u], total - siz[u]); + if (centroid == 0 || maxPart[u] < maxPart[centroid]) { + centroid = u; + } + } + + public static void dfs(int u, int fa, int dis, int dep) { + if (dis > limitw || dep > limitl + 1) { + return; + } + disArr[++cnta] = dis; + depArr[cnta] = dep; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + dfs(v, u, dis + weight[e], dep + 1); + } + } + } + + public static void sort(int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = disArr[(l + r) >> 1], tmp; + while (i <= j) { + while (disArr[i] < pivot) i++; + while (disArr[j] > pivot) j--; + if (i <= j) { + tmp = disArr[i]; disArr[i] = disArr[j]; disArr[j] = tmp; + tmp = depArr[i]; depArr[i] = depArr[j]; depArr[j] = tmp; + i++; j--; + } + } + sort(l, j); + sort(i, r); + } + + public static long calc(int u, int dis, int dep) { + cnta = 0; + dfs(u, 0, dis, dep); + sort(1, cnta); + for (int i = 1; i <= cnta; i++) { + add(depArr[i], 1); + } + long ret = 0; + for (int l = 1, r = cnta; l <= r;) { + if (disArr[l] + disArr[r] <= limitw) { + add(depArr[l], -1); + ret += sum(limitl - depArr[l] + 2); + l++; + } else { + add(depArr[r], -1); + r--; + } + } + return ret; + } + + public static long solve(int u) { + vis[u] = true; + long ans = calc(u, 0, 1); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + ans -= calc(v, weight[e], 2); + total = siz[v]; + centroid = 0; + getCentroid(v, 0); + ans += solve(centroid); + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + limitl = in.nextInt(); + limitw = in.nextInt(); + for (int i = 2, fa, w; i <= n; i++) { + fa = in.nextInt(); + w = in.nextInt(); + addEdge(i, fa, w); + addEdge(fa, i, w); + } + total = n; + centroid = 0; + getCentroid(1, 0); + out.println(solve(centroid)); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From 342c68ee940d0c20fff8b993acf595329ffaaac7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 21:19:51 +0800 Subject: [PATCH 0995/1170] modify code --- src/class183/Code07_Maschera1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class183/Code07_Maschera1.java b/src/class183/Code07_Maschera1.java index 7141b05f3..4a9d13b8b 100644 --- a/src/class183/Code07_Maschera1.java +++ b/src/class183/Code07_Maschera1.java @@ -182,10 +182,10 @@ public static void dfs2(int cur, int fa, int pmaxv, int pedge) { public static void sort(int[] maxv, int[] edge, int l, int r) { if (l >= r) return; - int i = l, j = r, pv = maxv[(l + r) >> 1], pe = edge[(l + r) >> 1], tmp; + int i = l, j = r, pivot = maxv[(l + r) >> 1], tmp; while (i <= j) { - while (maxv[i] < pv || (maxv[i] == pv && edge[i] < pe)) i++; - while (maxv[j] > pv || (maxv[j] == pv && edge[j] > pe)) j--; + while (maxv[i] < pivot) i++; + while (maxv[j] > pivot) j--; if (i <= j) { tmp = maxv[i]; maxv[i] = maxv[j]; maxv[j] = tmp; tmp = edge[i]; edge[i] = edge[j]; edge[j] = tmp; From 8cf546a9b8dbe6232af9be06454f5eda875a2cc2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Nov 2025 21:29:01 +0800 Subject: [PATCH 0996/1170] modify code --- src/class183/Code04_CloseVertices1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class183/Code04_CloseVertices1.java b/src/class183/Code04_CloseVertices1.java index 2edc219b6..f5856a2bc 100644 --- a/src/class183/Code04_CloseVertices1.java +++ b/src/class183/Code04_CloseVertices1.java @@ -44,7 +44,7 @@ public static int lowbit(int i) { } public static void add(int i, int v) { - while (i <= n + 1) { + while (i <= limitl + 1) { tree[i] += v; i += lowbit(i); } From 7b3c45e6d628f2bdb91abdd15c176b251dba2dc2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 10:25:07 +0800 Subject: [PATCH 0997/1170] modify code --- src/class183/Code04_CloseVertices1.java | 32 ++++++++++++------------- src/class183/Code05_Message1.java | 24 +++++++++---------- src/class183/Code07_Maschera1.java | 32 ++++++++++++------------- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/class183/Code04_CloseVertices1.java b/src/class183/Code04_CloseVertices1.java index f5856a2bc..418761748 100644 --- a/src/class183/Code04_CloseVertices1.java +++ b/src/class183/Code04_CloseVertices1.java @@ -32,6 +32,22 @@ public class Code04_CloseVertices1 { public static int[] tree = new int[MAXN]; + public static void sort(int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = disArr[(l + r) >> 1], tmp; + while (i <= j) { + while (disArr[i] < pivot) i++; + while (disArr[j] > pivot) j--; + if (i <= j) { + tmp = disArr[i]; disArr[i] = disArr[j]; disArr[j] = tmp; + tmp = depArr[i]; depArr[i] = depArr[j]; depArr[j] = tmp; + i++; j--; + } + } + sort(l, j); + sort(i, r); + } + public static void addEdge(int u, int v, int w) { nxt[++cntg] = head[u]; to[cntg] = v; @@ -90,22 +106,6 @@ public static void dfs(int u, int fa, int dis, int dep) { } } - public static void sort(int l, int r) { - if (l >= r) return; - int i = l, j = r, pivot = disArr[(l + r) >> 1], tmp; - while (i <= j) { - while (disArr[i] < pivot) i++; - while (disArr[j] > pivot) j--; - if (i <= j) { - tmp = disArr[i]; disArr[i] = disArr[j]; disArr[j] = tmp; - tmp = depArr[i]; depArr[i] = depArr[j]; depArr[j] = tmp; - i++; j--; - } - } - sort(l, j); - sort(i, r); - } - public static long calc(int u, int dis, int dep) { cnta = 0; dfs(u, 0, dis, dep); diff --git a/src/class183/Code05_Message1.java b/src/class183/Code05_Message1.java index 2adf13692..c996c3ef3 100644 --- a/src/class183/Code05_Message1.java +++ b/src/class183/Code05_Message1.java @@ -31,7 +31,7 @@ public class Code05_Message1 { public static int centroid; public static int[] depCnt = new int[MAXN]; - public static int maxDeep; + public static int maxDep; public static int[] timArr = new int[MAXN]; public static int[] qidArr = new int[MAXN]; @@ -126,19 +126,19 @@ public static void getCentroid2(int cur, int fa) { } // 收集信息递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa, int deep) { - depCnt[deep]++; - maxDeep = Math.max(maxDeep, deep); + public static void dfs1(int u, int fa, int dep) { + depCnt[dep]++; + maxDep = Math.max(maxDep, dep); for (int e = headq[u]; e > 0; e = nextq[e]) { - if (tim[e] + 1 >= deep) { - timArr[++cnta] = tim[e] - deep + 2; + if (tim[e] + 1 >= dep) { + timArr[++cnta] = tim[e] - dep + 2; qidArr[cnta] = qid[e]; } } for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - dfs1(v, u, deep + 1); + dfs1(v, u, dep + 1); } } } @@ -151,7 +151,7 @@ public static void dfs2(int cur, int fa, int deep) { pop(); if (e == -1) { depCnt[dep]++; - maxDeep = Math.max(maxDeep, dep); + maxDep = Math.max(maxDep, dep); for (int e = headq[u]; e > 0; e = nextq[e]) { if (tim[e] + 1 >= dep) { timArr[++cnta] = tim[e] - dep + 2; @@ -174,26 +174,26 @@ public static void dfs2(int cur, int fa, int deep) { public static void calc(int u) { cnta = 0; - maxDeep = 0; + maxDep = 0; // dfs1(u, 0, 1); dfs2(u, 0, 1); for (int i = 1; i <= cnta; i++) { ans[qidArr[i]] += depCnt[timArr[i]]; } - for (int d = 1; d <= maxDeep; d++) { + for (int d = 1; d <= maxDep; d++) { depCnt[d] = 0; } for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (!vis[v]) { cnta = 0; - maxDeep = 0; + maxDep = 0; // dfs1(v, u, 2); dfs2(v, u, 2); for (int i = 1; i <= cnta; i++) { ans[qidArr[i]] -= depCnt[timArr[i]]; } - for (int d = 1; d <= maxDeep; d++) { + for (int d = 1; d <= maxDep; d++) { depCnt[d] = 0; } } diff --git a/src/class183/Code07_Maschera1.java b/src/class183/Code07_Maschera1.java index 4a9d13b8b..18004cc7a 100644 --- a/src/class183/Code07_Maschera1.java +++ b/src/class183/Code07_Maschera1.java @@ -59,6 +59,22 @@ public static void pop() { e = stack[stacksize][4]; } + public static void sort(int[] maxv, int[] edge, int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = maxv[(l + r) >> 1], tmp; + while (i <= j) { + while (maxv[i] < pivot) i++; + while (maxv[j] > pivot) j--; + if (i <= j) { + tmp = maxv[i]; maxv[i] = maxv[j]; maxv[j] = tmp; + tmp = edge[i]; edge[i] = edge[j]; edge[j] = tmp; + i++; j--; + } + } + sort(maxv, edge, l, j); + sort(maxv, edge, i, r); + } + public static void addEdge(int u, int v, int w) { nxt[++cntg] = head[u]; to[cntg] = v; @@ -180,22 +196,6 @@ public static void dfs2(int cur, int fa, int pmaxv, int pedge) { } } - public static void sort(int[] maxv, int[] edge, int l, int r) { - if (l >= r) return; - int i = l, j = r, pivot = maxv[(l + r) >> 1], tmp; - while (i <= j) { - while (maxv[i] < pivot) i++; - while (maxv[j] > pivot) j--; - if (i <= j) { - tmp = maxv[i]; maxv[i] = maxv[j]; maxv[j] = tmp; - tmp = edge[i]; edge[i] = edge[j]; edge[j] = tmp; - i++; j--; - } - } - sort(maxv, edge, l, j); - sort(maxv, edge, i, r); - } - public static void calc(int u) { cnta = 0; for (int e = head[u]; e > 0; e = nxt[e]) { From c3feaa1d85bcf7101a6f2c78b954b57d317e798c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 10:34:58 +0800 Subject: [PATCH 0998/1170] modify code --- src/class183/Code01_CentroidDecomposition1.java | 9 ++++++++- src/class183/Code02_Race1.java | 3 ++- src/class183/Code02_Race2.java | 3 ++- src/class183/Code03_Tree1.java | 3 ++- src/class183/Code04_CloseVertices1.java | 3 ++- src/class183/Code05_Message1.java | 3 ++- src/class183/Code06_Capital1.java | 3 ++- src/class183/Code07_Maschera1.java | 7 ++++--- 8 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 41ea99b19..a1d6d08de 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -1,6 +1,10 @@ package class183; // 点分治,也叫重心分解,java版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 一共有m条查询,每条查询给定一个数字k,打印树上距离为k的点对是否存在 +// 1 <= n <= 10^4 1 <= 边权 <= 10^4 +// 1 <= m <= 100 1 <= k <= 10^7 // 测试链接 : https://www.luogu.com.cn/problem/P3806 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,8 +18,10 @@ public class Code01_CentroidDecomposition1 { public static int MAXN = 10001; public static int MAXM = 101; public static int MAXV = 10000001; - public static int n, m, maxq, total; + public static int n, m; + public static int[] query = new int[MAXM]; + public static int maxq; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -26,6 +32,7 @@ public class Code01_CentroidDecomposition1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; public static int[] maxPart = new int[MAXN]; + public static int total; public static int centroid; public static int[] curDis = new int[MAXN]; diff --git a/src/class183/Code02_Race1.java b/src/class183/Code02_Race1.java index 1620e6392..e82ace6d5 100644 --- a/src/class183/Code02_Race1.java +++ b/src/class183/Code02_Race1.java @@ -15,7 +15,7 @@ public class Code02_Race1 { public static int MAXN = 200001; public static int MAXK = 1000001; public static int INF = 1000000001; - public static int n, k, total; + public static int n, k; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -26,6 +26,7 @@ public class Code02_Race1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; public static int[] maxPart = new int[MAXN]; + public static int total; public static int centroid; public static int[] sumArr = new int[MAXN]; diff --git a/src/class183/Code02_Race2.java b/src/class183/Code02_Race2.java index 2f91e1f11..f44b9e3e1 100644 --- a/src/class183/Code02_Race2.java +++ b/src/class183/Code02_Race2.java @@ -12,7 +12,7 @@ //const int MAXN = 200001; //const int MAXK = 1000001; //const int INF = 1000000001; -//int n, k, total; +//int n, k; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -23,6 +23,7 @@ //bool vis[MAXN]; //int siz[MAXN]; //int maxPart[MAXN]; +//int total; //int centroid; // //int sumArr[MAXN]; diff --git a/src/class183/Code03_Tree1.java b/src/class183/Code03_Tree1.java index afcdf6275..3a7b3db9d 100644 --- a/src/class183/Code03_Tree1.java +++ b/src/class183/Code03_Tree1.java @@ -13,7 +13,7 @@ public class Code03_Tree1 { public static int MAXN = 50001; - public static int n, k, total; + public static int n, k; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -24,6 +24,7 @@ public class Code03_Tree1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; public static int[] maxPart = new int[MAXN]; + public static int total; public static int centroid; public static int[] disArr = new int[MAXN]; diff --git a/src/class183/Code04_CloseVertices1.java b/src/class183/Code04_CloseVertices1.java index 418761748..b47dd3eca 100644 --- a/src/class183/Code04_CloseVertices1.java +++ b/src/class183/Code04_CloseVertices1.java @@ -13,7 +13,7 @@ public class Code04_CloseVertices1 { public static int MAXN = 100005; - public static int n, limitl, limitw, total; + public static int n, limitl, limitw; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -24,6 +24,7 @@ public class Code04_CloseVertices1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; public static int[] maxPart = new int[MAXN]; + public static int total; public static int centroid; public static int[] disArr = new int[MAXN]; diff --git a/src/class183/Code05_Message1.java b/src/class183/Code05_Message1.java index c996c3ef3..0f69122cf 100644 --- a/src/class183/Code05_Message1.java +++ b/src/class183/Code05_Message1.java @@ -12,7 +12,7 @@ public class Code05_Message1 { public static int MAXN = 100001; - public static int t, n, m, total; + public static int t, n, m; public static int[] headg = new int[MAXN]; public static int[] nextg = new int[MAXN << 1]; @@ -28,6 +28,7 @@ public class Code05_Message1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; public static int[] maxPart = new int[MAXN]; + public static int total; public static int centroid; public static int[] depCnt = new int[MAXN]; diff --git a/src/class183/Code06_Capital1.java b/src/class183/Code06_Capital1.java index 17bea0022..3edb97e8d 100644 --- a/src/class183/Code06_Capital1.java +++ b/src/class183/Code06_Capital1.java @@ -13,7 +13,7 @@ public class Code06_Capital1 { public static int MAXN = 200001; public static int INF = 1000000001; - public static int n, k, total; + public static int n, k; public static int[] color = new int[MAXN]; public static int[] headg = new int[MAXN]; @@ -29,6 +29,7 @@ public class Code06_Capital1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; public static int[] maxPart = new int[MAXN]; + public static int total; public static int centroid; public static int[] father = new int[MAXN]; diff --git a/src/class183/Code07_Maschera1.java b/src/class183/Code07_Maschera1.java index 18004cc7a..6da67b883 100644 --- a/src/class183/Code07_Maschera1.java +++ b/src/class183/Code07_Maschera1.java @@ -12,7 +12,7 @@ public class Code07_Maschera1 { public static int MAXN = 100001; - public static int n, l, r, total; + public static int n, l, r; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -20,11 +20,10 @@ public class Code07_Maschera1 { public static int[] weight = new int[MAXN << 1]; public static int cntg; - public static int[] tree = new int[MAXN]; - public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; public static int[] maxPart = new int[MAXN]; + public static int total; public static int centroid; public static int[] curMaxv = new int[MAXN]; @@ -35,6 +34,8 @@ public class Code07_Maschera1 { public static int[] allEdge = new int[MAXN]; public static int cnta; + public static int[] tree = new int[MAXN]; + public static long ans; // 讲解118,递归函数改成迭代所需要的栈 From 0848f33e99f3fc40387f574e899641e83964ee88 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 10:47:57 +0800 Subject: [PATCH 0999/1170] modify code --- .../Code01_CentroidDecomposition1.java | 2 +- .../Code01_CentroidDecomposition2.java | 149 ++++++++++++++++++ 2 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 src/class183/Code01_CentroidDecomposition2.java diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index a1d6d08de..411b187a6 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -2,7 +2,7 @@ // 点分治,也叫重心分解,java版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 -// 一共有m条查询,每条查询给定一个数字k,打印树上距离为k的点对是否存在 +// 一共有m条查询,每条查询给定数字k,打印树上距离为k的点对是否存在 // 1 <= n <= 10^4 1 <= 边权 <= 10^4 // 1 <= m <= 100 1 <= k <= 10^7 // 测试链接 : https://www.luogu.com.cn/problem/P3806 diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java new file mode 100644 index 000000000..cb1b7c376 --- /dev/null +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -0,0 +1,149 @@ +package class183; + +// 点分治,也叫重心分解,C++版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 一共有m条查询,每条查询给定数字k,打印树上距离为k的点对是否存在 +// 1 <= n <= 10^4 1 <= 边权 <= 10^4 +// 1 <= m <= 100 1 <= k <= 10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3806 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 10001; +//const int MAXM = 101; +//const int MAXV = 10000001; +//int n, m; +// +//int query[MAXM]; +//int maxq; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int maxPart[MAXN]; +//int total; +//int centroid; +// +//int curDis[MAXN]; +//int cntc; +// +//int allDis[MAXN]; +//int cnta; +// +//bool check[MAXV]; +// +//bool ans[MAXM]; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void getCentroid(int u, int fa) { +// siz[u] = 1; +// maxPart[u] = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getCentroid(v, u); +// siz[u] += siz[v]; +// maxPart[u] = max(maxPart[u], siz[v]); +// } +// } +// maxPart[u] = max(maxPart[u], total - siz[u]); +// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { +// centroid = u; +// } +//} +// +//void dfs(int u, int fa, int dis) { +// if (dis > maxq) { +// return; +// } +// curDis[++cntc] = dis; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, dis + weight[e]); +// } +// } +//} +// +//void calc(int u) { +// cnta = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// if (!vis[v]) { +// cntc = 0; +// dfs(v, u, w); +// for (int i = 1; i <= m; i++) { +// for (int j = 1; j <= cntc; j++) { +// if (query[i] - curDis[j] >= 0) { +// ans[i] |= check[query[i] - curDis[j]]; +// } +// } +// } +// for (int i = 1; i <= cntc; i++) { +// allDis[++cnta] = curDis[i]; +// check[curDis[i]] = true; +// } +// } +// } +// for (int i = 1; i <= cnta; i++) { +// check[allDis[i]] = false; +// } +//} +// +//void solve(int u) { +// vis[u] = true; +// check[0] = true; +// calc(u); +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// total = siz[v]; +// centroid = 0; +// getCentroid(v, u); +// solve(centroid); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); +// } +// for (int i = 1; i <= m; i++) { +// cin >> query[i]; +// maxq = max(maxq, query[i]); +// } +// total = n; +// centroid = 0; +// getCentroid(1, 0); +// solve(centroid); +// for (int i = 1; i <= m; i++) { +// if (ans[i]) { +// cout << "AYE" << '\n'; +// } else { +// cout << "NAY" << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From c2a6d3c7503255953fea53209b92e20b04da7791 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 11:17:27 +0800 Subject: [PATCH 1000/1170] modify code --- src/class183/Code02_Race1.java | 41 +++++++++++++++++++--------------- src/class183/Code02_Race2.java | 27 +++++++++++++--------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/class183/Code02_Race1.java b/src/class183/Code02_Race1.java index e82ace6d5..d12b53e83 100644 --- a/src/class183/Code02_Race1.java +++ b/src/class183/Code02_Race1.java @@ -1,6 +1,11 @@ package class183; // 权值和为k的路径的最少边数,java版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 给定数字k,要求路径权值和等于k,并且边的数量最小 +// 打印最小边数,如果不存在路径打印-1,注意点的编号从0开始 +// 1 <= n <= 2 * 10^5 +// 0 <= 边权、k <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P4149 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -29,7 +34,7 @@ public class Code02_Race1 { public static int total; public static int centroid; - public static int[] sumArr = new int[MAXN]; + public static int[] disArr = new int[MAXN]; public static int[] edgeArr = new int[MAXN]; public static int cnta; @@ -37,12 +42,12 @@ public class Code02_Race1 { // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; - public static int stacksize, u, f, sum, edge, e; + public static int stacksize, u, f, dis, edge, e; - public static void push(int u, int f, int sum, int edge, int e) { + public static void push(int u, int f, int dis, int edge, int e) { stack[stacksize][0] = u; stack[stacksize][1] = f; - stack[stacksize][2] = sum; + stack[stacksize][2] = dis; stack[stacksize][3] = edge; stack[stacksize][4] = e; stacksize++; @@ -52,7 +57,7 @@ public static void pop() { --stacksize; u = stack[stacksize][0]; f = stack[stacksize][1]; - sum = stack[stacksize][2]; + dis = stack[stacksize][2]; edge = stack[stacksize][3]; e = stack[stacksize][4]; } @@ -118,41 +123,41 @@ public static void getCentroid2(int cur, int fa) { } // 收集信息递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa, int sum, int edge) { - if (sum > k) { + public static void dfs1(int u, int fa, int dis, int edge) { + if (dis > k) { return; } - sumArr[++cnta] = sum; + disArr[++cnta] = dis; edgeArr[cnta] = edge; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - dfs1(v, u, sum + weight[e], edge + 1); + dfs1(v, u, dis + weight[e], edge + 1); } } } // 收集信息的迭代版 - public static void dfs2(int cur, int fa, int psum, int pedge) { + public static void dfs2(int cur, int fa, int pathDis, int pathEdge) { stacksize = 0; - push(cur, fa, psum, pedge, -1); + push(cur, fa, pathDis, pathEdge, -1); while (stacksize > 0) { pop(); if (e == -1) { - if (sum > k) { + if (dis > k) { continue; } - sumArr[++cnta] = sum; + disArr[++cnta] = dis; edgeArr[cnta] = edge; e = head[u]; } else { e = nxt[e]; } if (e != 0) { - push(u, f, sum, edge, e); + push(u, f, dis, edge, e); int v = to[e]; if (v != f && !vis[v]) { - push(to[e], u, sum + weight[e], edge + 1, -1); + push(to[e], u, dis + weight[e], edge + 1, -1); } } } @@ -169,15 +174,15 @@ public static int calc(int u) { // dfs1(v, u, weight[e], 1); dfs2(v, u, weight[e], 1); for (int i = tmp + 1; i <= cnta; i++) { - ans = Math.min(ans, dp[k - sumArr[i]] + edgeArr[i]); + ans = Math.min(ans, dp[k - disArr[i]] + edgeArr[i]); } for (int i = tmp + 1; i <= cnta; i++) { - dp[sumArr[i]] = Math.min(dp[sumArr[i]], edgeArr[i]); + dp[disArr[i]] = Math.min(dp[disArr[i]], edgeArr[i]); } } } for (int i = 1; i <= cnta; i++) { - dp[sumArr[i]] = INF; + dp[disArr[i]] = INF; } return ans; } diff --git a/src/class183/Code02_Race2.java b/src/class183/Code02_Race2.java index f44b9e3e1..52dac82d4 100644 --- a/src/class183/Code02_Race2.java +++ b/src/class183/Code02_Race2.java @@ -1,6 +1,11 @@ package class183; // 权值和为k的路径的最少边数,C++版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 给定数字k,要求路径权值和等于k,并且边的数量最小 +// 打印最小边数,如果不存在路径打印-1,注意点的编号从0开始 +// 1 <= n <= 2 * 10^5 +// 0 <= 边权、k <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P4149 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -9,6 +14,10 @@ // //using namespace std; // +//struct Node { +// int dis, edge; +//}; +// //const int MAXN = 200001; //const int MAXK = 1000001; //const int INF = 1000000001; @@ -26,8 +35,7 @@ //int total; //int centroid; // -//int sumArr[MAXN]; -//int edgeArr[MAXN]; +//Node arr[MAXN]; //int cnta; // //int dp[MAXK]; @@ -56,16 +64,15 @@ // } //} // -//void dfs(int u, int fa, int sum, int edge) { -// if (sum > k) { +//void dfs(int u, int fa, int dis, int edge) { +// if (dis > k) { // return; // } -// sumArr[++cnta] = sum; -// edgeArr[cnta] = edge; +// arr[++cnta] = { dis, edge }; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// dfs(v, u, sum + weight[e], edge + 1); +// dfs(v, u, dis + weight[e], edge + 1); // } // } //} @@ -80,15 +87,15 @@ // int tmp = cnta; // dfs(v, u, weight[e], 1); // for (int i = tmp + 1; i <= cnta; i++) { -// ans = min(ans, dp[k - sumArr[i]] + edgeArr[i]); +// ans = min(ans, dp[k - arr[i].dis] + arr[i].edge); // } // for (int i = tmp + 1; i <= cnta; i++) { -// dp[sumArr[i]] = min(dp[sumArr[i]], edgeArr[i]); +// dp[arr[i].dis] = min(dp[arr[i].dis], arr[i].edge); // } // } // } // for (int i = 1; i <= cnta; i++) { -// dp[sumArr[i]] = INF; +// dp[arr[i].dis] = INF; // } // return ans; //} From ecb50eef8b6bd906e91f986b12c182f1a2803e7e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 11:27:53 +0800 Subject: [PATCH 1001/1170] modify code --- src/class183/Code07_Maschera1.java | 76 +++++++++++++----------------- 1 file changed, 32 insertions(+), 44 deletions(-) diff --git a/src/class183/Code07_Maschera1.java b/src/class183/Code07_Maschera1.java index 6da67b883..f8d9d6f26 100644 --- a/src/class183/Code07_Maschera1.java +++ b/src/class183/Code07_Maschera1.java @@ -12,7 +12,7 @@ public class Code07_Maschera1 { public static int MAXN = 100001; - public static int n, l, r; + public static int n, minEdge, maxEdge; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -88,7 +88,7 @@ public static int lowbit(int i) { } public static void add(int i, int v) { - while (i <= r) { + while (i <= maxEdge) { tree[i] += v; i += lowbit(i); } @@ -158,7 +158,7 @@ public static void getCentroid2(int cur, int fa) { // 收集信息递归版,java会爆栈,C++可以通过 public static void dfs1(int u, int fa, int maxv, int edge) { - if (edge > r) { + if (edge > maxEdge) { return; } curMaxv[++cntc] = maxv; @@ -178,7 +178,7 @@ public static void dfs2(int cur, int fa, int pmaxv, int pedge) { while (stacksize > 0) { pop(); if (e == -1) { - if (edge > r) { + if (edge > maxEdge) { continue; } curMaxv[++cntc] = maxv; @@ -205,49 +205,37 @@ public static void calc(int u) { cntc = 0; // dfs1(v, u, weight[e], 1); dfs2(v, u, weight[e], 1); - if (cntc > 0) { - sort(curMaxv, curEdge, 1, cntc); - for (int i = 1; i <= cntc; i++) { - int left = l - curEdge[i] - 1; - int right = r - curEdge[i]; - if (right >= 0) { - left = Math.max(left, 0); - right = Math.min(right, r); - ans -= 1L * curMaxv[i] * (sum(right) - sum(left)); - } - add(curEdge[i], 1); - } - for (int i = 1; i <= cntc; i++) { - add(curEdge[i], -1); - } - for (int i = 1; i <= cntc; i++) { - allMaxv[++cnta] = curMaxv[i]; - allEdge[cnta] = curEdge[i]; - } + sort(curMaxv, curEdge, 1, cntc); + for (int i = 1; i <= cntc; i++) { + int l = minEdge - curEdge[i] - 1; + int r = maxEdge - curEdge[i]; + ans -= 1L * curMaxv[i] * (sum(r) - sum(l)); + add(curEdge[i], 1); } - } - } - if (cnta > 0) { - sort(allMaxv, allEdge, 1, cnta); - for (int i = 1; i <= cnta; i++) { - int left = l - allEdge[i] - 1; - int right = r - allEdge[i]; - if (right >= 0) { - left = Math.max(left, 0); - right = Math.min(right, r); - ans += 1L * allMaxv[i] * (sum(right) - sum(left)); + for (int i = 1; i <= cntc; i++) { + add(curEdge[i], -1); } - add(allEdge[i], 1); - } - for (int i = 1; i <= cnta; i++) { - add(allEdge[i], -1); - } - for (int i = 1; i <= cnta; i++) { - if (allEdge[i] >= l) { - ans += allMaxv[i]; + for (int i = 1; i <= cntc; i++) { + allMaxv[++cnta] = curMaxv[i]; + allEdge[cnta] = curEdge[i]; } } } + sort(allMaxv, allEdge, 1, cnta); + for (int i = 1; i <= cnta; i++) { + int l = minEdge - allEdge[i] - 1; + int r = maxEdge - allEdge[i]; + ans += 1L * allMaxv[i] * (sum(r) - sum(l)); + add(allEdge[i], 1); + } + for (int i = 1; i <= cnta; i++) { + add(allEdge[i], -1); + } + for (int i = 1; i <= cnta; i++) { + if (allEdge[i] >= minEdge) { + ans += allMaxv[i]; + } + } } public static void solve(int u) { @@ -269,8 +257,8 @@ public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); - l = in.nextInt(); - r = in.nextInt(); + minEdge = in.nextInt(); + maxEdge = in.nextInt(); for (int i = 1, u, v, w; i < n; i++) { u = in.nextInt(); v = in.nextInt(); From 4cb88f513737c3d1b7e2dc9a580fab46029196a9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 11:47:54 +0800 Subject: [PATCH 1002/1170] modify code --- src/class183/Code03_Tree1.java | 7 +- src/class183/Code03_Tree2.java | 120 +++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/class183/Code03_Tree2.java diff --git a/src/class183/Code03_Tree1.java b/src/class183/Code03_Tree1.java index 3a7b3db9d..a3bb57f58 100644 --- a/src/class183/Code03_Tree1.java +++ b/src/class183/Code03_Tree1.java @@ -1,6 +1,11 @@ package class183; // 距离<=k的点对数量,java版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 给定数字k,求出树上两点距离<=k的点对数量 +// 1 <= n <= 4 * 10^4 +// 0 <= 边权 <= 10^3 +// 0 <= k <= 2 * 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P4178 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -72,7 +77,7 @@ public static long calc(int u, int dis) { dfs(u, 0, dis); long ans = 0; Arrays.sort(disArr, 1, cnta + 1); - for (int l = 1, r = cnta; l < r;) { + for (int l = 1, r = cnta; l <= r;) { if (disArr[l] + disArr[r] <= k) { ans += r - l; l++; diff --git a/src/class183/Code03_Tree2.java b/src/class183/Code03_Tree2.java new file mode 100644 index 000000000..ee5813fa5 --- /dev/null +++ b/src/class183/Code03_Tree2.java @@ -0,0 +1,120 @@ +package class183; + +// 距离<=k的点对数量,C++版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 给定数字k,求出树上两点距离<=k的点对数量 +// 1 <= n <= 4 * 10^4 +// 0 <= 边权 <= 10^3 +// 0 <= k <= 2 * 10^4 +// 测试链接 : https://www.luogu.com.cn/problem/P4178 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 50001; +//int n, k; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int maxPart[MAXN]; +//int total; +//int centroid; +// +//int disArr[MAXN]; +//int cnta; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void getCentroid(int u, int fa) { +// siz[u] = 1; +// maxPart[u] = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getCentroid(v, u); +// siz[u] += siz[v]; +// maxPart[u] = max(maxPart[u], siz[v]); +// } +// } +// maxPart[u] = max(maxPart[u], total - siz[u]); +// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { +// centroid = u; +// } +//} +// +//void dfs(int u, int fa, int dis) { +// if (dis > k) { +// return; +// } +// disArr[++cnta] = dis; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, dis + weight[e]); +// } +// } +//} +// +//long long calc(int u, int dis) { +// cnta = 0; +// dfs(u, 0, dis); +// long long ans = 0; +// sort(disArr + 1, disArr + cnta + 1); +// for (int l = 1, r = cnta; l <= r; ) { +// if (disArr[l] + disArr[r] <= k) { +// ans += r - l; +// l++; +// } else { +// r--; +// } +// } +// return ans; +//} +// +//long long solve(int u) { +// long long ans = 0; +// ans += calc(u, 0); +// vis[u] = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// ans -= calc(v, weight[e]); +// total = siz[v]; +// centroid = 0; +// getCentroid(v, 0); +// ans += solve(centroid); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); +// } +// cin >> k; +// total = n; +// centroid = 0; +// getCentroid(1, 0); +// cout << solve(centroid) << '\n'; +// return 0; +//} \ No newline at end of file From c8f895d19644840e75f85769142763b67a78cb67 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 12:21:53 +0800 Subject: [PATCH 1003/1170] modify code --- src/class183/Code04_CloseVertices1.java | 12 +- src/class183/Code04_CloseVertices2.java | 157 ++++++++++++++++++++++++ 2 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 src/class183/Code04_CloseVertices2.java diff --git a/src/class183/Code04_CloseVertices1.java b/src/class183/Code04_CloseVertices1.java index b47dd3eca..3b5cee60a 100644 --- a/src/class183/Code04_CloseVertices1.java +++ b/src/class183/Code04_CloseVertices1.java @@ -1,6 +1,14 @@ package class183; -// 相近的点对数量,java版 +// 相近点对的数量,java版 +// 一共有n个节点,所有节点组成一棵树,1号节点是树头 +// 从2号点开始,给定每个点的父节点编号、与父节点之间无向边的边权 +// 给定两个整数limitl、limitw,如下为(a, b)是相近点对的定义 +// 首先a < b,其次两者简单路径的边数不超过limitl、权值和不超过limitw +// 打印树上有多少相近点对 +// 1 <= limitl <= n <= 10^5 +// 0 <= limitw <= 10^9 +// 0 <= 边权 <= 10^4 // 测试链接 : https://www.luogu.com.cn/problem/CF293E // 测试链接 : https://codeforces.com/problemset/problem/293/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +20,7 @@ public class Code04_CloseVertices1 { - public static int MAXN = 100005; + public static int MAXN = 100002; public static int n, limitl, limitw; public static int[] head = new int[MAXN]; diff --git a/src/class183/Code04_CloseVertices2.java b/src/class183/Code04_CloseVertices2.java new file mode 100644 index 000000000..aefdbf10c --- /dev/null +++ b/src/class183/Code04_CloseVertices2.java @@ -0,0 +1,157 @@ +package class183; + +// 相近点对的数量,C++版 +// 一共有n个节点,所有节点组成一棵树,1号节点是树头 +// 从2号点开始,给定每个点的父节点编号、与父节点之间无向边的边权 +// 给定两个整数limitl、limitw,如下为(a, b)是相近点对的定义 +// 首先a < b,其次两者简单路径的边数不超过limitl、权值和不超过limitw +// 打印树上有多少相近点对 +// 1 <= limitl <= n <= 10^5 +// 0 <= limitw <= 10^9 +// 0 <= 边权 <= 10^4 +// 测试链接 : https://www.luogu.com.cn/problem/CF293E +// 测试链接 : https://codeforces.com/problemset/problem/293/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int dis, dep; +//}; +// +//bool NodeCmp(Node a, Node b) { +// return a.dis < b.dis; +//} +// +//const int MAXN = 100002; +//int n, limitl, limitw; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int maxPart[MAXN]; +//int total; +//int centroid; +// +//Node arr[MAXN]; +//int cnta; +// +//int tree[MAXN]; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= limitl + 1) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void getCentroid(int u, int fa) { +// siz[u] = 1; +// maxPart[u] = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getCentroid(v, u); +// siz[u] += siz[v]; +// maxPart[u] = max(maxPart[u], siz[v]); +// } +// } +// maxPart[u] = max(maxPart[u], total - siz[u]); +// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { +// centroid = u; +// } +//} +// +//void dfs(int u, int fa, int dis, int dep) { +// if (dis > limitw || dep > limitl + 1) { +// return; +// } +// arr[++cnta] = { dis, dep }; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, dis + weight[e], dep + 1); +// } +// } +//} +// +//long long calc(int u, int dis, int dep) { +// cnta = 0; +// dfs(u, 0, dis, dep); +// sort(arr + 1, arr + cnta + 1, NodeCmp); +// for (int i = 1; i <= cnta; i++) { +// add(arr[i].dep, 1); +// } +// long long ret = 0; +// for (int l = 1, r = cnta; l <= r; ) { +// if (arr[l].dis + arr[r].dis <= limitw) { +// add(arr[l].dep, -1); +// ret += sum(limitl - arr[l].dep + 2); +// l++; +// } else { +// add(arr[r].dep, -1); +// r--; +// } +// } +// return ret; +//} +// +//long long solve(int u) { +// vis[u] = true; +// long long ans = calc(u, 0, 1); +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// ans -= calc(v, weight[e], 2); +// total = siz[v]; +// centroid = 0; +// getCentroid(v, 0); +// ans += solve(centroid); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> limitl >> limitw; +// for (int i = 2, fa, w; i <= n; i++) { +// cin >> fa >> w; +// addEdge(i, fa, w); +// addEdge(fa, i, w); +// } +// total = n; +// centroid = 0; +// getCentroid(1, 0); +// cout << solve(centroid) << '\n'; +// return 0; +//} \ No newline at end of file From c92fb8316f970c300f9f253451cadff98fff2634 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 13:29:21 +0800 Subject: [PATCH 1004/1170] modify code --- src/class183/Code05_Message1.java | 6 ++ src/class183/Code05_Message2.java | 174 ++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 src/class183/Code05_Message2.java diff --git a/src/class183/Code05_Message1.java b/src/class183/Code05_Message1.java index 0f69122cf..474ad281a 100644 --- a/src/class183/Code05_Message1.java +++ b/src/class183/Code05_Message1.java @@ -1,6 +1,12 @@ package class183; // 消息传递,java版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 如果x号节点收到一个消息,那么消息会从x开始扩散,速度为每天越过一条边 +// 接下来有m条查询,每条查询都是相互独立的,格式如下 +// 查询 x k : 第0天的时候,x号节点得到一条信息,打印第k天时,新收到该消息的人数 +// 1 <= n、m <= 10^5 +// 0 <= k < n // 测试链接 : https://www.luogu.com.cn/problem/P6626 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class183/Code05_Message2.java b/src/class183/Code05_Message2.java new file mode 100644 index 000000000..1011050c7 --- /dev/null +++ b/src/class183/Code05_Message2.java @@ -0,0 +1,174 @@ +package class183; + +// 消息传递,C++版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 如果x号节点收到一个消息,那么消息会从x开始扩散,速度为每天越过一条边 +// 接下来有m条查询,每条查询都是相互独立的,格式如下 +// 查询 x k : 第0天的时候,x号节点得到一条信息,打印第k天时,新收到该消息的人数 +// 1 <= n、m <= 10^5 +// 0 <= k < n +// 测试链接 : https://www.luogu.com.cn/problem/P6626 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int tim, qid; +//}; +// +//const int MAXN = 100001; +//int t, n, m; +// +//int headg[MAXN]; +//int nextg[MAXN << 1]; +//int tog[MAXN << 1]; +//int cntg; +// +//int headq[MAXN]; +//int nextq[MAXN]; +//int tim[MAXN]; +//int qid[MAXN]; +//int cntq; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int maxPart[MAXN]; +//int total; +//int centroid; +// +//int depCnt[MAXN]; +//int maxDep; +// +//Node arr[MAXN]; +//int cnta; +// +//int ans[MAXN]; +// +//void addEdge(int u, int v) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// headg[u] = cntg; +//} +// +//void addQuery(int u, int t, int id) { +// nextq[++cntq] = headq[u]; +// tim[cntq] = t; +// qid[cntq] = id; +// headq[u] = cntq; +//} +// +//void getCentroid(int u, int fa) { +// siz[u] = 1; +// maxPart[u] = 0; +// for (int e = headg[u]; e; e = nextg[e]) { +// int v = tog[e]; +// if (v != fa && !vis[v]) { +// getCentroid(v, u); +// siz[u] += siz[v]; +// maxPart[u] = max(maxPart[u], siz[v]); +// } +// } +// maxPart[u] = max(maxPart[u], total - siz[u]); +// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { +// centroid = u; +// } +//} +// +//void dfs(int u, int fa, int dep) { +// depCnt[dep]++; +// maxDep = max(maxDep, dep); +// for (int e = headq[u]; e; e = nextq[e]) { +// if (tim[e] + 1 >= dep) { +// arr[++cnta] = { tim[e] - dep + 2, qid[e] }; +// } +// } +// for (int e = headg[u]; e; e = nextg[e]) { +// int v = tog[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, dep + 1); +// } +// } +//} +// +//void calc(int u) { +// cnta = 0; +// maxDep = 0; +// dfs(u, 0, 1); +// for (int i = 1; i <= cnta; i++) { +// ans[arr[i].qid] += depCnt[arr[i].tim]; +// } +// for (int d = 1; d <= maxDep; d++) { +// depCnt[d] = 0; +// } +// for (int e = headg[u]; e; e = nextg[e]) { +// int v = tog[e]; +// if (!vis[v]) { +// cnta = 0; +// maxDep = 0; +// dfs(v, u, 2); +// for (int i = 1; i <= cnta; i++) { +// ans[arr[i].qid] -= depCnt[arr[i].tim]; +// } +// for (int d = 1; d <= maxDep; d++) { +// depCnt[d] = 0; +// } +// } +// } +//} +// +//void solve(int u) { +// vis[u] = true; +// calc(u); +// for (int e = headg[u]; e; e = nextg[e]) { +// int v = tog[e]; +// if (!vis[v]) { +// total = siz[v]; +// centroid = 0; +// getCentroid(v, u); +// solve(centroid); +// } +// } +//} +// +//void prepare() { +// cntg = 0; +// cntq = 0; +// for (int i = 1; i <= n; i++) { +// headg[i] = 0; +// headq[i] = 0; +// vis[i] = false; +// } +// for (int i = 1; i <= m; i++) { +// ans[i] = 0; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> t; +// for (int c = 1; c <= t; c++) { +// cin >> n >> m; +// prepare(); +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// for (int i = 1, x, k; i <= m; i++) { +// cin >> x >> k; +// addQuery(x, k, i); +// } +// total = n; +// centroid = 0; +// getCentroid(1, 0); +// solve(centroid); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 1979f8c579cfead48b998f92cf939fbf745549a2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 15:15:29 +0800 Subject: [PATCH 1005/1170] modify code --- src/class183/Code06_Capital1.java | 29 +++--- src/class183/Code06_Capital2.java | 149 ++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 12 deletions(-) create mode 100644 src/class183/Code06_Capital2.java diff --git a/src/class183/Code06_Capital1.java b/src/class183/Code06_Capital1.java index 3edb97e8d..d1ebbb793 100644 --- a/src/class183/Code06_Capital1.java +++ b/src/class183/Code06_Capital1.java @@ -1,6 +1,11 @@ package class183; // 首都,java版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 给定长度为n的数组color,color[i]表示i号节点的颜色,颜色有k种 +// 你需要在树上找到一个连通区,连通区内出现的每种颜色,都不会出现在连通区外 +// 这样的连通区可能有多个,希望包含的颜色数量尽量少,打印(最少颜色数 - 1)的结果 +// 1 <= n、k <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P7215 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -40,12 +45,12 @@ public class Code06_Capital1 { // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][4]; - public static int stacksize, u, f, rt, e; + public static int stacksize, u, f, stamp, e; - public static void push(int u, int f, int rt, int e) { + public static void push(int u, int f, int stamp, int e) { stack[stacksize][0] = u; stack[stacksize][1] = f; - stack[stacksize][2] = rt; + stack[stacksize][2] = stamp; stack[stacksize][3] = e; stacksize++; } @@ -54,7 +59,7 @@ public static void pop() { --stacksize; u = stack[stacksize][0]; f = stack[stacksize][1]; - rt = stack[stacksize][2]; + stamp = stack[stacksize][2]; e = stack[stacksize][3]; } @@ -124,37 +129,37 @@ public static void getCentroid2(int cur, int fa) { } // 收集信息递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa, int root) { + public static void dfs1(int u, int fa, int stamp) { father[u] = fa; - nodeStamp[u] = root; + nodeStamp[u] = stamp; enter[u] = false; for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - dfs1(v, u, root); + dfs1(v, u, stamp); } } } // 收集信息迭代版 - public static void dfs2(int cur, int fa, int root) { + public static void dfs2(int cur, int fa, int sta) { stacksize = 0; - push(cur, fa, root, -1); + push(cur, fa, sta, -1); while (stacksize > 0) { pop(); if (e == -1) { father[u] = f; - nodeStamp[u] = rt; + nodeStamp[u] = stamp; enter[u] = false; e = headg[u]; } else { e = nextg[e]; } if (e != 0) { - push(u, f, rt, e); + push(u, f, stamp, e); int v = tog[e]; if (v != f && !vis[v]) { - push(tog[e], u, rt, -1); + push(tog[e], u, stamp, -1); } } } diff --git a/src/class183/Code06_Capital2.java b/src/class183/Code06_Capital2.java new file mode 100644 index 000000000..0180827a3 --- /dev/null +++ b/src/class183/Code06_Capital2.java @@ -0,0 +1,149 @@ +package class183; + +// 首都,C++版 +// 一共有n个节点,给定n-1条边,所有节点组成一棵树 +// 给定长度为n的数组color,color[i]表示i号节点的颜色,颜色有k种 +// 你需要在树上找到一个连通区,连通区内出现的每种颜色,都不会出现在连通区外 +// 这样的连通区可能有多个,希望包含的颜色数量尽量少,打印(最少颜色数 - 1)的结果 +// 1 <= n、k <= 2 * 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P7215 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//const int INF = 1000000001; +//int n, k; +//int color[MAXN]; +// +//int headg[MAXN]; +//int nextg[MAXN << 1]; +//int tog[MAXN << 1]; +//int cntg; +// +//int headc[MAXN]; +//int nextc[MAXN]; +//int toc[MAXN]; +//int cntc; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int maxPart[MAXN]; +//int total; +//int centroid; +// +//int father[MAXN]; +//int nodeStamp[MAXN]; +//int colorStamp[MAXN]; +//int que[MAXN]; +//bool enter[MAXN]; +// +//void addEdge(int u, int v) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// headg[u] = cntg; +//} +// +//void addNode(int color, int node) { +// nextc[++cntc] = headc[color]; +// toc[cntc] = node; +// headc[color] = cntc; +//} +// +//void getCentroid(int u, int fa) { +// siz[u] = 1; +// maxPart[u] = 0; +// for (int e = headg[u]; e > 0; e = nextg[e]) { +// int v = tog[e]; +// if (v != fa && !vis[v]) { +// getCentroid(v, u); +// siz[u] += siz[v]; +// maxPart[u] = max(maxPart[u], siz[v]); +// } +// } +// maxPart[u] = max(maxPart[u], total - siz[u]); +// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { +// centroid = u; +// } +//} +// +//void dfs(int u, int fa, int stamp) { +// father[u] = fa; +// nodeStamp[u] = stamp; +// enter[u] = false; +// for (int e = headg[u]; e > 0; e = nextg[e]) { +// int v = tog[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, stamp); +// } +// } +//} +// +//int calc(int u) { +// dfs(u, 0, u); +// int l = 1, r = 0; +// que[++r] = u; +// enter[u] = true; +// int ans = 0; +// while (l <= r) { +// int cur = que[l++]; +// if (cur != u && !enter[father[cur]]) { +// que[++r] = father[cur]; +// enter[father[cur]] = true; +// } +// if (colorStamp[color[cur]] != u) { +// colorStamp[color[cur]] = u; +// ans++; +// for (int e = headc[color[cur]]; e > 0; e = nextc[e]) { +// int v = toc[e]; +// if (nodeStamp[v] != u) { +// return INF; +// } +// if (!enter[v]) { +// que[++r] = v; +// enter[v] = true; +// } +// } +// } +// } +// return ans; +//} +// +//int solve(int u) { +// vis[u] = true; +// int ans = calc(u); +// for (int e = headg[u]; e > 0; e = nextg[e]) { +// int v = tog[e]; +// if (!vis[v]) { +// total = siz[v]; +// centroid = 0; +// getCentroid(v, u); +// ans = min(ans, solve(centroid)); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> k; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// for (int i = 1; i <= n; i++) { +// cin >> color[i]; +// addNode(color[i], i); +// } +// total = n; +// centroid = 0; +// getCentroid(1, 0); +// int ans = solve(centroid); +// cout << (ans - 1) << '\n'; +// return 0; +//} \ No newline at end of file From 5bcf1ea203107b520f8231454fadb0968b28a17d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 16:00:45 +0800 Subject: [PATCH 1006/1170] modify code --- src/class183/Code07_Maschera1.java | 46 ++++---- src/class183/Code07_Maschera2.java | 172 +++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+), 22 deletions(-) create mode 100644 src/class183/Code07_Maschera2.java diff --git a/src/class183/Code07_Maschera1.java b/src/class183/Code07_Maschera1.java index f8d9d6f26..19ce70263 100644 --- a/src/class183/Code07_Maschera1.java +++ b/src/class183/Code07_Maschera1.java @@ -1,6 +1,12 @@ package class183; -// 所有路径的魔力和,java版 +// 所有合法路径的魔力和,java版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 给定两个整数l、r,对于任意两个不同节点u、v,考虑它们之间的简单路径 +// 如果路径上边的数量在[l, r]范围内,则这条路径是合法路径 +// 路径的魔力值 = 路径上所有边权的最大值,打印所有合法路径的魔力和 +// 注意,u到v和v到u视为两条不同的路径,均要计入答案 +// 1 <= n、边权 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5351 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +18,7 @@ public class Code07_Maschera1 { public static int MAXN = 100001; - public static int n, minEdge, maxEdge; + public static int n, l, r; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -29,15 +35,12 @@ public class Code07_Maschera1 { public static int[] curMaxv = new int[MAXN]; public static int[] curEdge = new int[MAXN]; public static int cntc; - public static int[] allMaxv = new int[MAXN]; public static int[] allEdge = new int[MAXN]; public static int cnta; public static int[] tree = new int[MAXN]; - public static long ans; - // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; public static int stacksize, u, f, maxv, edge, e; @@ -88,7 +91,7 @@ public static int lowbit(int i) { } public static void add(int i, int v) { - while (i <= maxEdge) { + while (i <= r) { tree[i] += v; i += lowbit(i); } @@ -158,7 +161,7 @@ public static void getCentroid2(int cur, int fa) { // 收集信息递归版,java会爆栈,C++可以通过 public static void dfs1(int u, int fa, int maxv, int edge) { - if (edge > maxEdge) { + if (edge > r) { return; } curMaxv[++cntc] = maxv; @@ -178,7 +181,7 @@ public static void dfs2(int cur, int fa, int pmaxv, int pedge) { while (stacksize > 0) { pop(); if (e == -1) { - if (edge > maxEdge) { + if (edge > r) { continue; } curMaxv[++cntc] = maxv; @@ -197,7 +200,8 @@ public static void dfs2(int cur, int fa, int pmaxv, int pedge) { } } - public static void calc(int u) { + public static long calc(int u) { + long ans = 0; cnta = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -207,9 +211,7 @@ public static void calc(int u) { dfs2(v, u, weight[e], 1); sort(curMaxv, curEdge, 1, cntc); for (int i = 1; i <= cntc; i++) { - int l = minEdge - curEdge[i] - 1; - int r = maxEdge - curEdge[i]; - ans -= 1L * curMaxv[i] * (sum(r) - sum(l)); + ans -= 1L * curMaxv[i] * (sum(r - curEdge[i]) - sum(l - curEdge[i] - 1)); add(curEdge[i], 1); } for (int i = 1; i <= cntc; i++) { @@ -223,24 +225,23 @@ public static void calc(int u) { } sort(allMaxv, allEdge, 1, cnta); for (int i = 1; i <= cnta; i++) { - int l = minEdge - allEdge[i] - 1; - int r = maxEdge - allEdge[i]; - ans += 1L * allMaxv[i] * (sum(r) - sum(l)); + ans += 1L * allMaxv[i] * (sum(r - allEdge[i]) - sum(l - allEdge[i] - 1)); add(allEdge[i], 1); } for (int i = 1; i <= cnta; i++) { add(allEdge[i], -1); } for (int i = 1; i <= cnta; i++) { - if (allEdge[i] >= minEdge) { + if (allEdge[i] >= l) { ans += allMaxv[i]; } } + return ans; } - public static void solve(int u) { - calc(u); + public static long solve(int u) { vis[u] = true; + long ans = calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { @@ -248,17 +249,18 @@ public static void solve(int u) { centroid = 0; // getCentroid1(v, 0); getCentroid2(v, 0); - solve(centroid); + ans += solve(centroid); } } + return ans; } public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); - minEdge = in.nextInt(); - maxEdge = in.nextInt(); + l = in.nextInt(); + r = in.nextInt(); for (int i = 1, u, v, w; i < n; i++) { u = in.nextInt(); v = in.nextInt(); @@ -270,7 +272,7 @@ public static void main(String[] args) throws Exception { centroid = 0; // getCentroid1(1, 0); getCentroid2(1, 0); - solve(centroid); + long ans = solve(centroid); out.println(ans << 1); out.flush(); out.close(); diff --git a/src/class183/Code07_Maschera2.java b/src/class183/Code07_Maschera2.java new file mode 100644 index 000000000..f6ae0f95e --- /dev/null +++ b/src/class183/Code07_Maschera2.java @@ -0,0 +1,172 @@ +package class183; + +// 所有合法路径的魔力和,C++版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 给定两个整数l、r,对于任意两个不同节点u、v,考虑它们之间的简单路径 +// 如果路径上边的数量在[l, r]范围内,则这条路径是合法路径 +// 路径的魔力值 = 路径上所有边权的最大值,打印所有合法路径的魔力和 +// 注意,u到v和v到u视为两条不同的路径,均要计入答案 +// 1 <= n、边权 <= 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P5351 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int maxv, edge; +//}; +// +//bool NodeCmp(Node a, Node b) { +// return a.maxv < b.maxv; +//} +// +//const int MAXN = 100001; +//int n, l, r; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int maxPart[MAXN]; +//int total; +//int centroid; +// +//Node cur[MAXN]; +//int cntc; +//Node all[MAXN]; +//int cnta; +// +//int tree[MAXN]; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// while (i <= r) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//void getCentroid(int u, int fa) { +// siz[u] = 1; +// maxPart[u] = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getCentroid(v, u); +// siz[u] += siz[v]; +// maxPart[u] = max(maxPart[u], siz[v]); +// } +// } +// maxPart[u] = max(maxPart[u], total - siz[u]); +// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { +// centroid = u; +// } +//} +// +//void dfs(int u, int fa, int maxv, int edge) { +// if (edge > r) { +// return; +// } +// cur[++cntc] = { maxv, edge }; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, max(maxv, weight[e]), edge + 1); +// } +// } +//} +// +//long long calc(int u) { +// long long ans = 0; +// cnta = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// cntc = 0; +// dfs(v, u, weight[e], 1); +// sort(cur + 1, cur + cntc + 1, NodeCmp); +// for (int i = 1; i <= cntc; i++) { +// ans -= 1LL * cur[i].maxv * (sum(r - cur[i].edge) - sum(l - cur[i].edge - 1)); +// add(cur[i].edge, 1); +// } +// for (int i = 1; i <= cntc; i++) { +// add(cur[i].edge, -1); +// } +// for (int i = 1; i <= cntc; i++) { +// all[++cnta] = cur[i]; +// } +// } +// } +// sort(all + 1, all + cnta + 1, NodeCmp); +// for (int i = 1; i <= cnta; i++) { +// ans += 1LL * all[i].maxv * (sum(r - all[i].edge) - sum(l - all[i].edge - 1)); +// add(all[i].edge, 1); +// } +// for (int i = 1; i <= cnta; i++) { +// add(all[i].edge, -1); +// } +// for (int i = 1; i <= cnta; i++) { +// if (all[i].edge >= l) { +// ans += all[i].maxv; +// } +// } +// return ans; +//} +// +//long long solve(int u) { +// vis[u] = true; +// long long ans = calc(u); +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// total = siz[v]; +// centroid = 0; +// getCentroid(v, 0); +// ans += solve(centroid); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> l >> r; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); +// } +// total = n; +// centroid = 0; +// getCentroid(1, 0); +// long long ans = solve(centroid); +// cout << (ans << 1) << '\n'; +// return 0; +//} \ No newline at end of file From e6c16032776b9ddb74629cdf9ed91ab71bf550c6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Nov 2025 16:54:45 +0800 Subject: [PATCH 1007/1170] modify code --- src/class183/Code01_CentroidDecomposition1.java | 2 -- src/class183/Code01_CentroidDecomposition2.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code01_CentroidDecomposition1.java index 411b187a6..3df56c130 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code01_CentroidDecomposition1.java @@ -37,10 +37,8 @@ public class Code01_CentroidDecomposition1 { public static int[] curDis = new int[MAXN]; public static int cntc; - public static int[] allDis = new int[MAXN]; public static int cnta; - public static boolean[] check = new boolean[MAXV]; public static boolean[] ans = new boolean[MAXM]; diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code01_CentroidDecomposition2.java index cb1b7c376..39457a48a 100644 --- a/src/class183/Code01_CentroidDecomposition2.java +++ b/src/class183/Code01_CentroidDecomposition2.java @@ -35,10 +35,8 @@ // //int curDis[MAXN]; //int cntc; -// //int allDis[MAXN]; //int cnta; -// //bool check[MAXV]; // //bool ans[MAXM]; From 1952d8732e11aeb75eca6e2c2426c7b7bcf89a12 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 16:29:17 +0800 Subject: [PATCH 1008/1170] modify code --- ...Code01_CentroidDecomposition1.java => Code02_Template1.java} | 2 +- ...Code01_CentroidDecomposition2.java => Code02_Template2.java} | 0 src/class183/{Code02_Race1.java => Code03_Race1.java} | 2 +- src/class183/{Code02_Race2.java => Code03_Race2.java} | 0 src/class183/{Code03_Tree1.java => Code04_Tree1.java} | 2 +- src/class183/{Code03_Tree2.java => Code04_Tree2.java} | 0 .../{Code04_CloseVertices1.java => Code05_CloseVertices1.java} | 2 +- .../{Code04_CloseVertices2.java => Code05_CloseVertices2.java} | 0 src/class183/{Code07_Maschera1.java => Code06_Maschera1.java} | 2 +- src/class183/{Code07_Maschera2.java => Code06_Maschera2.java} | 0 src/class183/{Code05_Message1.java => Code07_Message1.java} | 2 +- src/class183/{Code05_Message2.java => Code07_Message2.java} | 0 src/class183/{Code06_Capital1.java => Code08_Capital1.java} | 2 +- src/class183/{Code06_Capital2.java => Code08_Capital2.java} | 0 14 files changed, 7 insertions(+), 7 deletions(-) rename src/class183/{Code01_CentroidDecomposition1.java => Code02_Template1.java} (99%) rename src/class183/{Code01_CentroidDecomposition2.java => Code02_Template2.java} (100%) rename src/class183/{Code02_Race1.java => Code03_Race1.java} (99%) rename src/class183/{Code02_Race2.java => Code03_Race2.java} (100%) rename src/class183/{Code03_Tree1.java => Code04_Tree1.java} (99%) rename src/class183/{Code03_Tree2.java => Code04_Tree2.java} (100%) rename src/class183/{Code04_CloseVertices1.java => Code05_CloseVertices1.java} (99%) rename src/class183/{Code04_CloseVertices2.java => Code05_CloseVertices2.java} (100%) rename src/class183/{Code07_Maschera1.java => Code06_Maschera1.java} (99%) rename src/class183/{Code07_Maschera2.java => Code06_Maschera2.java} (100%) rename src/class183/{Code05_Message1.java => Code07_Message1.java} (99%) rename src/class183/{Code05_Message2.java => Code07_Message2.java} (100%) rename src/class183/{Code06_Capital1.java => Code08_Capital1.java} (99%) rename src/class183/{Code06_Capital2.java => Code08_Capital2.java} (100%) diff --git a/src/class183/Code01_CentroidDecomposition1.java b/src/class183/Code02_Template1.java similarity index 99% rename from src/class183/Code01_CentroidDecomposition1.java rename to src/class183/Code02_Template1.java index 3df56c130..83d8808d2 100644 --- a/src/class183/Code01_CentroidDecomposition1.java +++ b/src/class183/Code02_Template1.java @@ -13,7 +13,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code01_CentroidDecomposition1 { +public class Code02_Template1 { public static int MAXN = 10001; public static int MAXM = 101; diff --git a/src/class183/Code01_CentroidDecomposition2.java b/src/class183/Code02_Template2.java similarity index 100% rename from src/class183/Code01_CentroidDecomposition2.java rename to src/class183/Code02_Template2.java diff --git a/src/class183/Code02_Race1.java b/src/class183/Code03_Race1.java similarity index 99% rename from src/class183/Code02_Race1.java rename to src/class183/Code03_Race1.java index d12b53e83..4006dda7b 100644 --- a/src/class183/Code02_Race1.java +++ b/src/class183/Code03_Race1.java @@ -15,7 +15,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_Race1 { +public class Code03_Race1 { public static int MAXN = 200001; public static int MAXK = 1000001; diff --git a/src/class183/Code02_Race2.java b/src/class183/Code03_Race2.java similarity index 100% rename from src/class183/Code02_Race2.java rename to src/class183/Code03_Race2.java diff --git a/src/class183/Code03_Tree1.java b/src/class183/Code04_Tree1.java similarity index 99% rename from src/class183/Code03_Tree1.java rename to src/class183/Code04_Tree1.java index a3bb57f58..b6c730ddc 100644 --- a/src/class183/Code03_Tree1.java +++ b/src/class183/Code04_Tree1.java @@ -15,7 +15,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code03_Tree1 { +public class Code04_Tree1 { public static int MAXN = 50001; public static int n, k; diff --git a/src/class183/Code03_Tree2.java b/src/class183/Code04_Tree2.java similarity index 100% rename from src/class183/Code03_Tree2.java rename to src/class183/Code04_Tree2.java diff --git a/src/class183/Code04_CloseVertices1.java b/src/class183/Code05_CloseVertices1.java similarity index 99% rename from src/class183/Code04_CloseVertices1.java rename to src/class183/Code05_CloseVertices1.java index 3b5cee60a..ae77dbb40 100644 --- a/src/class183/Code04_CloseVertices1.java +++ b/src/class183/Code05_CloseVertices1.java @@ -18,7 +18,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_CloseVertices1 { +public class Code05_CloseVertices1 { public static int MAXN = 100002; public static int n, limitl, limitw; diff --git a/src/class183/Code04_CloseVertices2.java b/src/class183/Code05_CloseVertices2.java similarity index 100% rename from src/class183/Code04_CloseVertices2.java rename to src/class183/Code05_CloseVertices2.java diff --git a/src/class183/Code07_Maschera1.java b/src/class183/Code06_Maschera1.java similarity index 99% rename from src/class183/Code07_Maschera1.java rename to src/class183/Code06_Maschera1.java index 19ce70263..c6f425bbc 100644 --- a/src/class183/Code07_Maschera1.java +++ b/src/class183/Code06_Maschera1.java @@ -15,7 +15,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code07_Maschera1 { +public class Code06_Maschera1 { public static int MAXN = 100001; public static int n, l, r; diff --git a/src/class183/Code07_Maschera2.java b/src/class183/Code06_Maschera2.java similarity index 100% rename from src/class183/Code07_Maschera2.java rename to src/class183/Code06_Maschera2.java diff --git a/src/class183/Code05_Message1.java b/src/class183/Code07_Message1.java similarity index 99% rename from src/class183/Code05_Message1.java rename to src/class183/Code07_Message1.java index 474ad281a..b70889de9 100644 --- a/src/class183/Code05_Message1.java +++ b/src/class183/Code07_Message1.java @@ -15,7 +15,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_Message1 { +public class Code07_Message1 { public static int MAXN = 100001; public static int t, n, m; diff --git a/src/class183/Code05_Message2.java b/src/class183/Code07_Message2.java similarity index 100% rename from src/class183/Code05_Message2.java rename to src/class183/Code07_Message2.java diff --git a/src/class183/Code06_Capital1.java b/src/class183/Code08_Capital1.java similarity index 99% rename from src/class183/Code06_Capital1.java rename to src/class183/Code08_Capital1.java index d1ebbb793..3dd9512b6 100644 --- a/src/class183/Code06_Capital1.java +++ b/src/class183/Code08_Capital1.java @@ -14,7 +14,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code06_Capital1 { +public class Code08_Capital1 { public static int MAXN = 200001; public static int INF = 1000000001; diff --git a/src/class183/Code06_Capital2.java b/src/class183/Code08_Capital2.java similarity index 100% rename from src/class183/Code06_Capital2.java rename to src/class183/Code08_Capital2.java From 6c31a602be58715fa009c633d573eab514fa4980 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 16:45:13 +0800 Subject: [PATCH 1009/1170] modify code --- src/class183/Code01_Ratio1.java | 174 +++++++++++++++++++++++++++++ src/class183/Code02_Template1.java | 66 +++++------ src/class183/Code02_Template2.java | 64 ++++++----- 3 files changed, 241 insertions(+), 63 deletions(-) create mode 100644 src/class183/Code01_Ratio1.java diff --git a/src/class183/Code01_Ratio1.java b/src/class183/Code01_Ratio1.java new file mode 100644 index 000000000..d96e07a38 --- /dev/null +++ b/src/class183/Code01_Ratio1.java @@ -0,0 +1,174 @@ +package class183; + +// 聪聪可可,java版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 如果点对(u, v)的简单路径权值和能被3整除,则称这个点对是合法的 +// 认为点对(x, x)的简单路径权值和是0,并且认为(x, y)和(y, x)是不同的点对 +// 打印(合法点对的数量 / 点对的总数量)的最简分数形式 +// 1 <= n、边权 <= 2 * 10^4 +// 测试链接 : https://www.luogu.com.cn/problem/P2634 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code01_Ratio1 { + + public static int MAXN = 20001; + public static int n; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + + public static int[] cur = new int[3]; + public static int[] all = new int[3]; + + public static int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + public static int getSize(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + siz[u] += getSize(v, u); + } + } + return siz[u]; + } + + public static int getCentroid(int u, int fa) { + int half = getSize(u, fa) >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void dfs(int u, int fa, int dis) { + cur[dis % 3]++; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + dfs(v, u, dis + weight[e]); + } + } + } + + public static int calc(int u) { + int ans = 0; + all[0] = all[1] = all[2] = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + if (!vis[v]) { + cur[0] = cur[1] = cur[2] = 0; + dfs(v, u, w); + ans += all[0] * cur[0] * 2 + all[1] * cur[2] * 2 + all[2] * cur[1] * 2 + cur[0] * 2; + all[0] += cur[0]; + all[1] += cur[1]; + all[2] += cur[2]; + } + } + return ans; + } + + public static int solve(int u) { + vis[u] = true; + int ans = calc(u); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + ans += solve(getCentroid(v, u)); + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); + } + int a = solve(getCentroid(1, 0)) + n; + int b = n * n; + int c = gcd(a, b); + a /= c; + b /= c; + out.println(a + "/" + b); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class183/Code02_Template1.java b/src/class183/Code02_Template1.java index 83d8808d2..68a495169 100644 --- a/src/class183/Code02_Template1.java +++ b/src/class183/Code02_Template1.java @@ -1,6 +1,6 @@ package class183; -// 点分治,也叫重心分解,java版 +// 点分治模版题,java版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 // 一共有m条查询,每条查询给定数字k,打印树上距离为k的点对是否存在 // 1 <= n <= 10^4 1 <= 边权 <= 10^4 @@ -31,13 +31,10 @@ public class Code02_Template1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] maxPart = new int[MAXN]; - public static int total; - public static int centroid; - public static int[] curDis = new int[MAXN]; + public static int[] cur = new int[MAXN]; public static int cntc; - public static int[] allDis = new int[MAXN]; + public static int[] all = new int[MAXN]; public static int cnta; public static boolean[] check = new boolean[MAXV]; @@ -50,28 +47,40 @@ public static void addEdge(int u, int v, int w) { head[u] = cntg; } - public static void getCentroid(int u, int fa) { + public static int getSize(int u, int fa) { siz[u] = 1; - maxPart[u] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getCentroid(v, u); - siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); + siz[u] += getSize(v, u); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; + return siz[u]; + } + + public static int getCentroid(int u, int fa) { + int half = getSize(u, fa) >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } } + return u; } public static void dfs(int u, int fa, int dis) { if (dis > maxq) { return; } - curDis[++cntc] = dis; + cur[++cntc] = dis; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { @@ -82,41 +91,37 @@ public static void dfs(int u, int fa, int dis) { public static void calc(int u) { cnta = 0; + check[0] = true; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; - int w = weight[e]; if (!vis[v]) { cntc = 0; - dfs(v, u, w); + dfs(v, u, weight[e]); for (int i = 1; i <= m; i++) { for (int j = 1; j <= cntc; j++) { - if (query[i] - curDis[j] >= 0) { - ans[i] |= check[query[i] - curDis[j]]; + if (query[i] - cur[j] >= 0) { + ans[i] |= check[query[i] - cur[j]]; } } } for (int i = 1; i <= cntc; i++) { - allDis[++cnta] = curDis[i]; - check[curDis[i]] = true; + all[++cnta] = cur[i]; + check[cur[i]] = true; } } } for (int i = 1; i <= cnta; i++) { - check[allDis[i]] = false; + check[all[i]] = false; } } public static void solve(int u) { vis[u] = true; - check[0] = true; calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - total = siz[v]; - centroid = 0; - getCentroid(v, u); - solve(centroid); + solve(getCentroid(v, u)); } } } @@ -137,10 +142,7 @@ public static void main(String[] args) throws Exception { query[i] = in.nextInt(); maxq = Math.max(maxq, query[i]); } - total = n; - centroid = 0; - getCentroid(1, 0); - solve(centroid); + solve(getCentroid(1, 0)); for (int i = 1; i <= m; i++) { if (ans[i]) { out.println("AYE"); @@ -154,7 +156,7 @@ public static void main(String[] args) throws Exception { // 读写工具类 static class FastReader { - private final byte[] buffer = new byte[1 << 20]; + private final byte[] buffer = new byte[1 << 16]; private int ptr = 0, len = 0; private final InputStream in; diff --git a/src/class183/Code02_Template2.java b/src/class183/Code02_Template2.java index 39457a48a..ce36062ca 100644 --- a/src/class183/Code02_Template2.java +++ b/src/class183/Code02_Template2.java @@ -1,6 +1,6 @@ package class183; -// 点分治,也叫重心分解,C++版 +// 点分治模版题,C++版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 // 一共有m条查询,每条查询给定数字k,打印树上距离为k的点对是否存在 // 1 <= n <= 10^4 1 <= 边权 <= 10^4 @@ -29,13 +29,10 @@ // //bool vis[MAXN]; //int siz[MAXN]; -//int maxPart[MAXN]; -//int total; -//int centroid; // -//int curDis[MAXN]; +//int cur[MAXN]; //int cntc; -//int allDis[MAXN]; +//int all[MAXN]; //int cnta; //bool check[MAXV]; // @@ -48,28 +45,40 @@ // head[u] = cntg; //} // -//void getCentroid(int u, int fa) { +//int getSize(int u, int fa) { // siz[u] = 1; -// maxPart[u] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// getCentroid(v, u); -// siz[u] += siz[v]; -// maxPart[u] = max(maxPart[u], siz[v]); +// siz[u] += getSize(v, u); // } // } -// maxPart[u] = max(maxPart[u], total - siz[u]); -// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { -// centroid = u; +// return siz[u]; +//} +// +//int getCentroid(int u, int fa) { +// int half = getSize(u, fa) >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } // } +// return u; //} // //void dfs(int u, int fa, int dis) { // if (dis > maxq) { // return; // } -// curDis[++cntc] = dis; +// cur[++cntc] = dis; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { @@ -80,41 +89,37 @@ // //void calc(int u) { // cnta = 0; +// check[0] = true; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; -// int w = weight[e]; // if (!vis[v]) { // cntc = 0; -// dfs(v, u, w); +// dfs(v, u, weight[e]); // for (int i = 1; i <= m; i++) { // for (int j = 1; j <= cntc; j++) { -// if (query[i] - curDis[j] >= 0) { -// ans[i] |= check[query[i] - curDis[j]]; +// if (query[i] - cur[j] >= 0) { +// ans[i] |= check[query[i] - cur[j]]; // } // } // } // for (int i = 1; i <= cntc; i++) { -// allDis[++cnta] = curDis[i]; -// check[curDis[i]] = true; +// all[++cnta] = cur[i]; +// check[cur[i]] = true; // } // } // } // for (int i = 1; i <= cnta; i++) { -// check[allDis[i]] = false; +// check[all[i]] = false; // } //} // //void solve(int u) { // vis[u] = true; -// check[0] = true; // calc(u); // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { -// total = siz[v]; -// centroid = 0; -// getCentroid(v, u); -// solve(centroid); +// solve(getCentroid(v, u)); // } // } //} @@ -132,10 +137,7 @@ // cin >> query[i]; // maxq = max(maxq, query[i]); // } -// total = n; -// centroid = 0; -// getCentroid(1, 0); -// solve(centroid); +// solve(getCentroid(1, 0)); // for (int i = 1; i <= m; i++) { // if (ans[i]) { // cout << "AYE" << '\n'; From 57248086cd3c4897ecf2d13794f790d28a94d6f1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 16:53:04 +0800 Subject: [PATCH 1010/1170] modify code --- src/class183/Code03_Race1.java | 66 +++++++++++++++++----------------- src/class183/Code03_Race2.java | 41 +++++++++++---------- 2 files changed, 54 insertions(+), 53 deletions(-) diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index 4006dda7b..9470e29f8 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -30,9 +30,6 @@ public class Code03_Race1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] maxPart = new int[MAXN]; - public static int total; - public static int centroid; public static int[] disArr = new int[MAXN]; public static int[] edgeArr = new int[MAXN]; @@ -42,7 +39,8 @@ public class Code03_Race1 { // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; - public static int stacksize, u, f, dis, edge, e; + public static int u, f, dis, edge, e; + public static int stacksize; public static void push(int u, int f, int dis, int edge, int e) { stack[stacksize][0] = u; @@ -69,33 +67,26 @@ public static void addEdge(int u, int v, int w) { head[u] = cntg; } - // 找重心的递归版,java会爆栈,C++可以通过 - public static void getCentroid1(int u, int fa) { + // 得到子树大小递归版,java会爆栈,C++可以通过 + public static int getSize1(int u, int fa) { siz[u] = 1; - maxPart[u] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getCentroid1(v, u); - siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); + siz[u] += getSize1(v, u); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; - } + return siz[u]; } - // 找重心的迭代版 - public static void getCentroid2(int cur, int fa) { + // 得到子树大小迭代版 + public static int getSize2(int cur, int fa) { stacksize = 0; push(cur, fa, 0, 0, -1); while (stacksize > 0) { pop(); if (e == -1) { siz[u] = 1; - maxPart[u] = 0; e = head[u]; } else { e = nxt[e]; @@ -104,22 +95,37 @@ public static void getCentroid2(int cur, int fa) { push(u, f, 0, 0, e); int v = to[e]; if (v != f && !vis[v]) { - push(to[e], u, 0, 0, -1); + push(v, u, 0, 0, -1); } } else { for (int ei = head[u]; ei > 0; ei = nxt[ei]) { int v = to[ei]; if (v != f && !vis[v]) { siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; + } + } + return siz[cur]; + } + + public static int getCentroid(int u, int fa) { + // int half = getSize1(u, fa) >> 1; + int half = getSize2(u, fa) >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; } } } + return u; } // 收集信息递归版,java会爆栈,C++可以通过 @@ -137,7 +143,7 @@ public static void dfs1(int u, int fa, int dis, int edge) { } } - // 收集信息的迭代版 + // 收集信息迭代版 public static void dfs2(int cur, int fa, int pathDis, int pathEdge) { stacksize = 0; push(cur, fa, pathDis, pathEdge, -1); @@ -194,11 +200,7 @@ public static int solve(int u) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - total = siz[v]; - centroid = 0; - // getCentroid1(v, 0); - getCentroid2(v, 0); - ans = Math.min(ans, solve(centroid)); + ans = Math.min(ans, solve(getCentroid(v, u))); } } return ans; @@ -216,12 +218,8 @@ public static void main(String[] args) throws Exception { addEdge(u, v, w); addEdge(v, u, w); } - total = n; - centroid = 0; - // getCentroid1(1, 0); - getCentroid2(1, 0); Arrays.fill(dp, INF); - int ans = solve(centroid); + int ans = solve(getCentroid(1, 0)); if (ans == INF) { ans = -1; } @@ -232,7 +230,7 @@ public static void main(String[] args) throws Exception { // 读写工具类 static class FastReader { - private final byte[] buffer = new byte[1 << 20]; + private final byte[] buffer = new byte[1 << 16]; private int ptr = 0, len = 0; private final InputStream in; diff --git a/src/class183/Code03_Race2.java b/src/class183/Code03_Race2.java index 52dac82d4..a62419b58 100644 --- a/src/class183/Code03_Race2.java +++ b/src/class183/Code03_Race2.java @@ -31,9 +31,6 @@ // //bool vis[MAXN]; //int siz[MAXN]; -//int maxPart[MAXN]; -//int total; -//int centroid; // //Node arr[MAXN]; //int cnta; @@ -47,21 +44,33 @@ // head[u] = cntg; //} // -//void getCentroid(int u, int fa) { +//int getSize(int u, int fa) { // siz[u] = 1; -// maxPart[u] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// getCentroid(v, u); -// siz[u] += siz[v]; -// maxPart[u] = max(maxPart[u], siz[v]); +// siz[u] += getSize(v, u); // } // } -// maxPart[u] = max(maxPart[u], total - siz[u]); -// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { -// centroid = u; +// return siz[u]; +//} +// +//int getCentroid(int u, int fa) { +// int half = getSize(u, fa) >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } // } +// return u; //} // //void dfs(int u, int fa, int dis, int edge) { @@ -107,10 +116,7 @@ // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { -// total = siz[v]; -// centroid = 0; -// getCentroid(v, 0); -// ans = min(ans, solve(centroid)); +// ans = min(ans, solve(getCentroid(v, u))); // } // } // return ans; @@ -127,11 +133,8 @@ // addEdge(u, v, w); // addEdge(v, u, w); // } -// total = n; -// centroid = 0; -// getCentroid(1, 0); // fill(dp, dp + MAXK, INF); -// int ans = solve(centroid); +// int ans = solve(getCentroid(1, 0)); // if (ans == INF) { // ans = -1; // } From 2b96b4467cd67fada61546a23cc24e6c762d13af Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 16:58:44 +0800 Subject: [PATCH 1011/1170] modify code --- src/class183/Code04_Tree1.java | 41 ++++++++++++++++++---------------- src/class183/Code04_Tree2.java | 41 ++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/class183/Code04_Tree1.java b/src/class183/Code04_Tree1.java index b6c730ddc..28fae8a1e 100644 --- a/src/class183/Code04_Tree1.java +++ b/src/class183/Code04_Tree1.java @@ -28,9 +28,6 @@ public class Code04_Tree1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] maxPart = new int[MAXN]; - public static int total; - public static int centroid; public static int[] disArr = new int[MAXN]; public static int cnta; @@ -42,21 +39,33 @@ public static void addEdge(int u, int v, int w) { head[u] = cntg; } - public static void getCentroid(int u, int fa) { + public static int getSize(int u, int fa) { siz[u] = 1; - maxPart[u] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getCentroid(v, u); - siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); + siz[u] += getSize(v, u); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; + return siz[u]; + } + + public static int getCentroid(int u, int fa) { + int half = getSize(u, fa) >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } } + return u; } public static void dfs(int u, int fa, int dis) { @@ -96,10 +105,7 @@ public static long solve(int u) { int v = to[e]; if (!vis[v]) { ans -= calc(v, weight[e]); - total = siz[v]; - centroid = 0; - getCentroid(v, 0); - ans += solve(centroid); + ans += solve(getCentroid(v, u)); } } return ans; @@ -117,10 +123,7 @@ public static void main(String[] args) throws Exception { addEdge(v, u, w); } k = in.nextInt(); - total = n; - centroid = 0; - getCentroid(1, 0); - out.println(solve(centroid)); + out.println(solve(getCentroid(1, 0))); out.flush(); out.close(); } diff --git a/src/class183/Code04_Tree2.java b/src/class183/Code04_Tree2.java index ee5813fa5..0fc0704d7 100644 --- a/src/class183/Code04_Tree2.java +++ b/src/class183/Code04_Tree2.java @@ -25,9 +25,6 @@ // //bool vis[MAXN]; //int siz[MAXN]; -//int maxPart[MAXN]; -//int total; -//int centroid; // //int disArr[MAXN]; //int cnta; @@ -39,21 +36,33 @@ // head[u] = cntg; //} // -//void getCentroid(int u, int fa) { +//int getSize(int u, int fa) { // siz[u] = 1; -// maxPart[u] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// getCentroid(v, u); -// siz[u] += siz[v]; -// maxPart[u] = max(maxPart[u], siz[v]); +// siz[u] += getSize(v, u); // } // } -// maxPart[u] = max(maxPart[u], total - siz[u]); -// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { -// centroid = u; +// return siz[u]; +//} +// +//int getCentroid(int u, int fa) { +// int half = getSize(u, fa) >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } // } +// return u; //} // //void dfs(int u, int fa, int dis) { @@ -93,10 +102,7 @@ // int v = to[e]; // if (!vis[v]) { // ans -= calc(v, weight[e]); -// total = siz[v]; -// centroid = 0; -// getCentroid(v, 0); -// ans += solve(centroid); +// ans += solve(getCentroid(v, u)); // } // } // return ans; @@ -112,9 +118,6 @@ // addEdge(v, u, w); // } // cin >> k; -// total = n; -// centroid = 0; -// getCentroid(1, 0); -// cout << solve(centroid) << '\n'; +// cout << solve(getCentroid(1, 0)) << '\n'; // return 0; //} \ No newline at end of file From 158106a78ada42aee9e0609642da64a09ebf26b2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 17:02:28 +0800 Subject: [PATCH 1012/1170] modify code --- src/class183/Code05_CloseVertices1.java | 41 +++++++++++++------------ src/class183/Code05_CloseVertices2.java | 41 +++++++++++++------------ 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/class183/Code05_CloseVertices1.java b/src/class183/Code05_CloseVertices1.java index ae77dbb40..2f629eea3 100644 --- a/src/class183/Code05_CloseVertices1.java +++ b/src/class183/Code05_CloseVertices1.java @@ -31,9 +31,6 @@ public class Code05_CloseVertices1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] maxPart = new int[MAXN]; - public static int total; - public static int centroid; public static int[] disArr = new int[MAXN]; public static int[] depArr = new int[MAXN]; @@ -84,21 +81,33 @@ public static int sum(int i) { return ret; } - public static void getCentroid(int u, int fa) { + public static int getSize(int u, int fa) { siz[u] = 1; - maxPart[u] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getCentroid(v, u); - siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); + siz[u] += getSize(v, u); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; + return siz[u]; + } + + public static int getCentroid(int u, int fa) { + int half = getSize(u, fa) >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } } + return u; } public static void dfs(int u, int fa, int dis, int dep) { @@ -143,10 +152,7 @@ public static long solve(int u) { int v = to[e]; if (!vis[v]) { ans -= calc(v, weight[e], 2); - total = siz[v]; - centroid = 0; - getCentroid(v, 0); - ans += solve(centroid); + ans += solve(getCentroid(v, u)); } } return ans; @@ -164,10 +170,7 @@ public static void main(String[] args) throws Exception { addEdge(i, fa, w); addEdge(fa, i, w); } - total = n; - centroid = 0; - getCentroid(1, 0); - out.println(solve(centroid)); + out.println(solve(getCentroid(1, 0))); out.flush(); out.close(); } diff --git a/src/class183/Code05_CloseVertices2.java b/src/class183/Code05_CloseVertices2.java index aefdbf10c..5e2ae10b8 100644 --- a/src/class183/Code05_CloseVertices2.java +++ b/src/class183/Code05_CloseVertices2.java @@ -37,9 +37,6 @@ // //bool vis[MAXN]; //int siz[MAXN]; -//int maxPart[MAXN]; -//int total; -//int centroid; // //Node arr[MAXN]; //int cnta; @@ -73,21 +70,33 @@ // return ret; //} // -//void getCentroid(int u, int fa) { +//int getSize(int u, int fa) { // siz[u] = 1; -// maxPart[u] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// getCentroid(v, u); -// siz[u] += siz[v]; -// maxPart[u] = max(maxPart[u], siz[v]); +// siz[u] += getSize(v, u); // } // } -// maxPart[u] = max(maxPart[u], total - siz[u]); -// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { -// centroid = u; +// return siz[u]; +//} +// +//int getCentroid(int u, int fa) { +// int half = getSize(u, fa) >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } // } +// return u; //} // //void dfs(int u, int fa, int dis, int dep) { @@ -131,10 +140,7 @@ // int v = to[e]; // if (!vis[v]) { // ans -= calc(v, weight[e], 2); -// total = siz[v]; -// centroid = 0; -// getCentroid(v, 0); -// ans += solve(centroid); +// ans += solve(getCentroid(v, u)); // } // } // return ans; @@ -149,9 +155,6 @@ // addEdge(i, fa, w); // addEdge(fa, i, w); // } -// total = n; -// centroid = 0; -// getCentroid(1, 0); -// cout << solve(centroid) << '\n'; +// cout << solve(getCentroid(1, 0)) << '\n'; // return 0; //} \ No newline at end of file From 0e72fb96d9a9c9571cb89e7325fd231781ac521c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 17:06:06 +0800 Subject: [PATCH 1013/1170] modify code --- src/class183/Code06_Maschera1.java | 59 ++++++++++++++---------------- src/class183/Code06_Maschera2.java | 41 +++++++++++---------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/class183/Code06_Maschera1.java b/src/class183/Code06_Maschera1.java index c6f425bbc..d54a0a796 100644 --- a/src/class183/Code06_Maschera1.java +++ b/src/class183/Code06_Maschera1.java @@ -28,9 +28,6 @@ public class Code06_Maschera1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] maxPart = new int[MAXN]; - public static int total; - public static int centroid; public static int[] curMaxv = new int[MAXN]; public static int[] curEdge = new int[MAXN]; @@ -106,33 +103,26 @@ public static int sum(int i) { return ret; } - // 找重心的递归版,java会爆栈,C++可以通过 - public static void getCentroid1(int u, int fa) { + // 得到子树大小递归版,java会爆栈,C++可以通过 + public static int getSize1(int u, int fa) { siz[u] = 1; - maxPart[u] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - getCentroid1(v, u); - siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); + siz[u] += getSize1(v, u); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; - } + return siz[u]; } - // 找重心的迭代版 - public static void getCentroid2(int cur, int fa) { + // 得到子树大小迭代版 + public static int getSize2(int cur, int fa) { stacksize = 0; push(cur, fa, 0, 0, -1); while (stacksize > 0) { pop(); if (e == -1) { siz[u] = 1; - maxPart[u] = 0; e = head[u]; } else { e = nxt[e]; @@ -141,22 +131,37 @@ public static void getCentroid2(int cur, int fa) { push(u, f, 0, 0, e); int v = to[e]; if (v != f && !vis[v]) { - push(to[e], u, 0, 0, -1); + push(v, u, 0, 0, -1); } } else { for (int ei = head[u]; ei > 0; ei = nxt[ei]) { int v = to[ei]; if (v != f && !vis[v]) { siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; + } + } + return siz[cur]; + } + + public static int getCentroid(int u, int fa) { + // int half = getSize1(u, fa) >> 1; + int half = getSize2(u, fa) >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; } } } + return u; } // 收集信息递归版,java会爆栈,C++可以通过 @@ -245,11 +250,7 @@ public static long solve(int u) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - total = siz[v]; - centroid = 0; - // getCentroid1(v, 0); - getCentroid2(v, 0); - ans += solve(centroid); + ans += solve(getCentroid(v, u)); } } return ans; @@ -268,11 +269,7 @@ public static void main(String[] args) throws Exception { addEdge(u, v, w); addEdge(v, u, w); } - total = n; - centroid = 0; - // getCentroid1(1, 0); - getCentroid2(1, 0); - long ans = solve(centroid); + long ans = solve(getCentroid(1, 0)); out.println(ans << 1); out.flush(); out.close(); diff --git a/src/class183/Code06_Maschera2.java b/src/class183/Code06_Maschera2.java index f6ae0f95e..be15cf90a 100644 --- a/src/class183/Code06_Maschera2.java +++ b/src/class183/Code06_Maschera2.java @@ -34,9 +34,6 @@ // //bool vis[MAXN]; //int siz[MAXN]; -//int maxPart[MAXN]; -//int total; -//int centroid; // //Node cur[MAXN]; //int cntc; @@ -72,21 +69,33 @@ // return ret; //} // -//void getCentroid(int u, int fa) { +//int getSize(int u, int fa) { // siz[u] = 1; -// maxPart[u] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// getCentroid(v, u); -// siz[u] += siz[v]; -// maxPart[u] = max(maxPart[u], siz[v]); +// siz[u] += getSize(v, u); // } // } -// maxPart[u] = max(maxPart[u], total - siz[u]); -// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { -// centroid = u; +// return siz[u]; +//} +// +//int getCentroid(int u, int fa) { +// int half = getSize(u, fa) >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } // } +// return u; //} // //void dfs(int u, int fa, int maxv, int edge) { @@ -145,10 +154,7 @@ // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { -// total = siz[v]; -// centroid = 0; -// getCentroid(v, 0); -// ans += solve(centroid); +// ans += solve(getCentroid(v, u)); // } // } // return ans; @@ -163,10 +169,7 @@ // addEdge(u, v, w); // addEdge(v, u, w); // } -// total = n; -// centroid = 0; -// getCentroid(1, 0); -// long long ans = solve(centroid); +// long long ans = solve(getCentroid(1, 0)); // cout << (ans << 1) << '\n'; // return 0; //} \ No newline at end of file From de4164af68728d2e11f016fc5167c86b748e64d0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 17:11:49 +0800 Subject: [PATCH 1014/1170] modify code --- src/class183/Code07_Message1.java | 59 +++++++++++++++---------------- src/class183/Code07_Message2.java | 41 +++++++++++---------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/class183/Code07_Message1.java b/src/class183/Code07_Message1.java index b70889de9..14de968e9 100644 --- a/src/class183/Code07_Message1.java +++ b/src/class183/Code07_Message1.java @@ -33,9 +33,6 @@ public class Code07_Message1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] maxPart = new int[MAXN]; - public static int total; - public static int centroid; public static int[] depCnt = new int[MAXN]; public static int maxDep; @@ -79,33 +76,26 @@ public static void addQuery(int u, int t, int id) { headq[u] = cntq; } - // 找重心的递归版,java会爆栈,C++可以通过 - public static void getCentroid1(int u, int fa) { + // 得到子树大小递归版,java会爆栈,C++可以通过 + public static int getSize1(int u, int fa) { siz[u] = 1; - maxPart[u] = 0; for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - getCentroid1(v, u); - siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); + siz[u] += getSize1(v, u); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; - } + return siz[u]; } - // 找重心的迭代版 - public static void getCentroid2(int cur, int fa) { + // 得到子树大小迭代版 + public static int getSize2(int cur, int fa) { stacksize = 0; push(cur, fa, 0, -1); while (stacksize > 0) { pop(); if (e == -1) { siz[u] = 1; - maxPart[u] = 0; e = headg[u]; } else { e = nextg[e]; @@ -114,22 +104,37 @@ public static void getCentroid2(int cur, int fa) { push(u, f, 0, e); int v = tog[e]; if (v != f && !vis[v]) { - push(tog[e], u, 0, -1); + push(v, u, 0, -1); } } else { for (int ei = headg[u]; ei > 0; ei = nextg[ei]) { int v = tog[ei]; if (v != f && !vis[v]) { siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; + } + } + return siz[cur]; + } + + public static int getCentroid(int u, int fa) { + // int half = getSize1(u, fa) >> 1; + int half = getSize2(u, fa) >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; } } } + return u; } // 收集信息递归版,java会爆栈,C++可以通过 @@ -213,11 +218,7 @@ public static void solve(int u) { for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (!vis[v]) { - total = siz[v]; - centroid = 0; - // getCentroid1(v, u); - getCentroid2(v, u); - solve(centroid); + solve(getCentroid(v, u)); } } } @@ -254,11 +255,7 @@ public static void main(String[] args) throws Exception { k = in.nextInt(); addQuery(x, k, i); } - total = n; - centroid = 0; - // getCentroid1(1, 0); - getCentroid2(1, 0); - solve(centroid); + solve(getCentroid(1, 0)); for (int i = 1; i <= m; i++) { out.println(ans[i]); } diff --git a/src/class183/Code07_Message2.java b/src/class183/Code07_Message2.java index 1011050c7..5084aebbe 100644 --- a/src/class183/Code07_Message2.java +++ b/src/class183/Code07_Message2.java @@ -35,9 +35,6 @@ // //bool vis[MAXN]; //int siz[MAXN]; -//int maxPart[MAXN]; -//int total; -//int centroid; // //int depCnt[MAXN]; //int maxDep; @@ -60,21 +57,33 @@ // headq[u] = cntq; //} // -//void getCentroid(int u, int fa) { +//int getSize(int u, int fa) { // siz[u] = 1; -// maxPart[u] = 0; // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (v != fa && !vis[v]) { -// getCentroid(v, u); -// siz[u] += siz[v]; -// maxPart[u] = max(maxPart[u], siz[v]); +// siz[u] += getSize(v, u); // } // } -// maxPart[u] = max(maxPart[u], total - siz[u]); -// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { -// centroid = u; +// return siz[u]; +//} +// +//int getCentroid(int u, int fa) { +// int half = getSize(u, fa) >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = headg[u]; e; e = nextg[e]) { +// int v = tog[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } // } +// return u; //} // //void dfs(int u, int fa, int dep) { @@ -125,10 +134,7 @@ // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (!vis[v]) { -// total = siz[v]; -// centroid = 0; -// getCentroid(v, u); -// solve(centroid); +// solve(getCentroid(v, u)); // } // } //} @@ -162,10 +168,7 @@ // cin >> x >> k; // addQuery(x, k, i); // } -// total = n; -// centroid = 0; -// getCentroid(1, 0); -// solve(centroid); +// solve(getCentroid(1, 0)); // for (int i = 1; i <= m; i++) { // cout << ans[i] << '\n'; // } From 84dcc06fb956c9798bef06169733ecc629e59434 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 17:15:43 +0800 Subject: [PATCH 1015/1170] modify code --- src/class183/Code08_Capital1.java | 59 +++++++++++++++---------------- src/class183/Code08_Capital2.java | 43 +++++++++++----------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/src/class183/Code08_Capital1.java b/src/class183/Code08_Capital1.java index 3dd9512b6..33d25288a 100644 --- a/src/class183/Code08_Capital1.java +++ b/src/class183/Code08_Capital1.java @@ -33,9 +33,6 @@ public class Code08_Capital1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] maxPart = new int[MAXN]; - public static int total; - public static int centroid; public static int[] father = new int[MAXN]; public static int[] nodeStamp = new int[MAXN]; @@ -75,33 +72,26 @@ public static void addNode(int color, int node) { headc[color] = cntc; } - // 找重心的递归版,java会爆栈,C++可以通过 - public static void getCentroid1(int u, int fa) { + // 得到子树大小递归版,java会爆栈,C++可以通过 + public static int getSize1(int u, int fa) { siz[u] = 1; - maxPart[u] = 0; for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - getCentroid1(v, u); - siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); + siz[u] += getSize1(v, u); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; - } + return siz[u]; } - // 找重心的迭代版 - public static void getCentroid2(int cur, int fa) { + // 得到子树大小迭代版 + public static int getSize2(int cur, int fa) { stacksize = 0; push(cur, fa, 0, -1); while (stacksize > 0) { pop(); if (e == -1) { siz[u] = 1; - maxPart[u] = 0; e = headg[u]; } else { e = nextg[e]; @@ -110,22 +100,37 @@ public static void getCentroid2(int cur, int fa) { push(u, f, 0, e); int v = tog[e]; if (v != f && !vis[v]) { - push(tog[e], u, 0, -1); + push(v, u, 0, -1); } } else { for (int ei = headg[u]; ei > 0; ei = nextg[ei]) { int v = tog[ei]; if (v != f && !vis[v]) { siz[u] += siz[v]; - maxPart[u] = Math.max(siz[v], maxPart[u]); } } - maxPart[u] = Math.max(maxPart[u], total - siz[u]); - if (centroid == 0 || maxPart[u] < maxPart[centroid]) { - centroid = u; + } + } + return siz[cur]; + } + + public static int getCentroid(int u, int fa) { + // int half = getSize1(u, fa) >> 1; + int half = getSize2(u, fa) >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = headg[u]; e > 0; e = nextg[e]) { + int v = tog[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; } } } + return u; } // 收集信息递归版,java会爆栈,C++可以通过 @@ -202,11 +207,7 @@ public static int solve(int u) { for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (!vis[v]) { - total = siz[v]; - centroid = 0; - // getCentroid1(v, u); - getCentroid2(v, u); - ans = Math.min(ans, solve(centroid)); + ans = Math.min(ans, solve(getCentroid(v, u))); } } return ans; @@ -227,11 +228,7 @@ public static void main(String[] args) throws Exception { color[i] = in.nextInt(); addNode(color[i], i); } - total = n; - centroid = 0; - // getCentroid1(1, 0); - getCentroid2(1, 0); - int ans = solve(centroid); + int ans = solve(getCentroid(1, 0)); out.println(ans - 1); out.flush(); out.close(); diff --git a/src/class183/Code08_Capital2.java b/src/class183/Code08_Capital2.java index 0180827a3..a2d548ab4 100644 --- a/src/class183/Code08_Capital2.java +++ b/src/class183/Code08_Capital2.java @@ -31,9 +31,6 @@ // //bool vis[MAXN]; //int siz[MAXN]; -//int maxPart[MAXN]; -//int total; -//int centroid; // //int father[MAXN]; //int nodeStamp[MAXN]; @@ -53,21 +50,33 @@ // headc[color] = cntc; //} // -//void getCentroid(int u, int fa) { +//int getSize(int u, int fa) { // siz[u] = 1; -// maxPart[u] = 0; -// for (int e = headg[u]; e > 0; e = nextg[e]) { +// for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (v != fa && !vis[v]) { -// getCentroid(v, u); -// siz[u] += siz[v]; -// maxPart[u] = max(maxPart[u], siz[v]); +// siz[u] += getSize(v, u); // } // } -// maxPart[u] = max(maxPart[u], total - siz[u]); -// if (centroid == 0 || maxPart[u] < maxPart[centroid]) { -// centroid = u; +// return siz[u]; +//} +// +//int getCentroid(int u, int fa) { +// int half = getSize(u, fa) >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = headg[u]; e; e = nextg[e]) { +// int v = tog[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } // } +// return u; //} // //void dfs(int u, int fa, int stamp) { @@ -118,10 +127,7 @@ // for (int e = headg[u]; e > 0; e = nextg[e]) { // int v = tog[e]; // if (!vis[v]) { -// total = siz[v]; -// centroid = 0; -// getCentroid(v, u); -// ans = min(ans, solve(centroid)); +// ans = min(ans, solve(getCentroid(v, u))); // } // } // return ans; @@ -140,10 +146,7 @@ // cin >> color[i]; // addNode(color[i], i); // } -// total = n; -// centroid = 0; -// getCentroid(1, 0); -// int ans = solve(centroid); +// int ans = solve(getCentroid(1, 0)); // cout << (ans - 1) << '\n'; // return 0; //} \ No newline at end of file From ff859d5426807a252eee7540b47ee9957b1fbc41 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 17:20:55 +0800 Subject: [PATCH 1016/1170] modify code --- src/class183/Code01_Ratio2.java | 128 ++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 src/class183/Code01_Ratio2.java diff --git a/src/class183/Code01_Ratio2.java b/src/class183/Code01_Ratio2.java new file mode 100644 index 000000000..9838e972c --- /dev/null +++ b/src/class183/Code01_Ratio2.java @@ -0,0 +1,128 @@ +package class183; + +// 聪聪可可,C++版 +// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 +// 如果点对(u, v)的简单路径权值和能被3整除,则称这个点对是合法的 +// 认为点对(x, x)的简单路径权值和是0,并且认为(x, y)和(y, x)是不同的点对 +// 打印(合法点对的数量 / 点对的总数量)的最简分数形式 +// 1 <= n、边权 <= 2 * 10^4 +// 测试链接 : https://www.luogu.com.cn/problem/P2634 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 20001; +//int n; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +// +//int cur[3]; +//int all[3]; +// +//int gcd(int a, int b) { +// return b == 0 ? a : gcd(b, a % b); +//} +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//int getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// siz[u] += getSize(v, u); +// } +// } +// return siz[u]; +//} +// +//int getCentroid(int u, int fa) { +// int half = getSize(u, fa) >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void dfs(int u, int fa, int dis) { +// cur[dis % 3]++; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, dis + weight[e]); +// } +// } +//} +// +//int calc(int u) { +// int ans = 0; +// all[0] = all[1] = all[2] = 0; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// if (!vis[v]) { +// cur[0] = cur[1] = cur[2] = 0; +// dfs(v, u, w); +// ans += all[0] * cur[0] * 2 + all[1] * cur[2] * 2 + all[2] * cur[1] * 2 + cur[0] * 2; +// all[0] += cur[0]; +// all[1] += cur[1]; +// all[2] += cur[2]; +// } +// } +// return ans; +//} +// +//int solve(int u) { +// vis[u] = true; +// int ans = calc(u); +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// ans += solve(getCentroid(v, u)); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); +// } +// int a = solve(getCentroid(1, 0)) + n; +// int b = n * n; +// int c = gcd(a, b); +// a /= c; +// b /= c; +// cout << a << "/" << b << '\n'; +// return 0; +//} \ No newline at end of file From 1a6bc3704c6e4f1f93497464d46cbc67eac50703 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 17:24:29 +0800 Subject: [PATCH 1017/1170] modify code --- src/class183/Code01_Ratio2.java | 10 +++++----- src/class183/Code08_Capital2.java | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class183/Code01_Ratio2.java b/src/class183/Code01_Ratio2.java index 9838e972c..faf3157ff 100644 --- a/src/class183/Code01_Ratio2.java +++ b/src/class183/Code01_Ratio2.java @@ -42,7 +42,7 @@ // //int getSize(int u, int fa) { // siz[u] = 1; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { // siz[u] += getSize(v, u); @@ -56,7 +56,7 @@ // bool find = false; // while (!find) { // find = true; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v] && siz[v] > half) { // fa = u; @@ -71,7 +71,7 @@ // //void dfs(int u, int fa, int dis) { // cur[dis % 3]++; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { // dfs(v, u, dis + weight[e]); @@ -82,7 +82,7 @@ //int calc(int u) { // int ans = 0; // all[0] = all[1] = all[2] = 0; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // int w = weight[e]; // if (!vis[v]) { @@ -100,7 +100,7 @@ //int solve(int u) { // vis[u] = true; // int ans = calc(u); -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { // ans += solve(getCentroid(v, u)); diff --git a/src/class183/Code08_Capital2.java b/src/class183/Code08_Capital2.java index a2d548ab4..c2cb58f75 100644 --- a/src/class183/Code08_Capital2.java +++ b/src/class183/Code08_Capital2.java @@ -83,7 +83,7 @@ // father[u] = fa; // nodeStamp[u] = stamp; // enter[u] = false; -// for (int e = headg[u]; e > 0; e = nextg[e]) { +// for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (v != fa && !vis[v]) { // dfs(v, u, stamp); @@ -106,7 +106,7 @@ // if (colorStamp[color[cur]] != u) { // colorStamp[color[cur]] = u; // ans++; -// for (int e = headc[color[cur]]; e > 0; e = nextc[e]) { +// for (int e = headc[color[cur]]; e; e = nextc[e]) { // int v = toc[e]; // if (nodeStamp[v] != u) { // return INF; @@ -124,7 +124,7 @@ //int solve(int u) { // vis[u] = true; // int ans = calc(u); -// for (int e = headg[u]; e > 0; e = nextg[e]) { +// for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (!vis[v]) { // ans = min(ans, solve(getCentroid(v, u))); From 0b31bca714ff1f8db1b8fc9dd0340a0da82f3567 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Nov 2025 17:38:51 +0800 Subject: [PATCH 1018/1170] modify code --- .../Code08_Capital1.java => class184/Code01_Capital1.java} | 4 ++-- .../Code08_Capital2.java => class184/Code01_Capital2.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/{class183/Code08_Capital1.java => class184/Code01_Capital1.java} (99%) rename src/{class183/Code08_Capital2.java => class184/Code01_Capital2.java} (99%) diff --git a/src/class183/Code08_Capital1.java b/src/class184/Code01_Capital1.java similarity index 99% rename from src/class183/Code08_Capital1.java rename to src/class184/Code01_Capital1.java index 33d25288a..a68b40356 100644 --- a/src/class183/Code08_Capital1.java +++ b/src/class184/Code01_Capital1.java @@ -1,4 +1,4 @@ -package class183; +package class184; // 首都,java版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树 @@ -14,7 +14,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code08_Capital1 { +public class Code01_Capital1 { public static int MAXN = 200001; public static int INF = 1000000001; diff --git a/src/class183/Code08_Capital2.java b/src/class184/Code01_Capital2.java similarity index 99% rename from src/class183/Code08_Capital2.java rename to src/class184/Code01_Capital2.java index c2cb58f75..0759475e0 100644 --- a/src/class183/Code08_Capital2.java +++ b/src/class184/Code01_Capital2.java @@ -1,4 +1,4 @@ -package class183; +package class184; // 首都,C++版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树 From bad3705a5419d1eedf840c73cd7dbd38dcc5db3b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 15 Nov 2025 10:02:31 +0800 Subject: [PATCH 1019/1170] modify code --- src/class183/Code01_Ratio1.java | 9 +++++---- src/class183/Code01_Ratio2.java | 9 +++++---- src/class183/Code02_Template1.java | 9 +++++---- src/class183/Code02_Template2.java | 9 +++++---- src/class183/Code03_Race1.java | 14 +++++++------- src/class183/Code03_Race2.java | 9 +++++---- src/class183/Code04_Tree1.java | 9 +++++---- src/class183/Code04_Tree2.java | 9 +++++---- src/class183/Code05_CloseVertices1.java | 9 +++++---- src/class183/Code05_CloseVertices2.java | 9 +++++---- src/class183/Code06_Maschera1.java | 14 +++++++------- src/class183/Code06_Maschera2.java | 9 +++++---- src/class183/Code07_Message1.java | 14 +++++++------- src/class183/Code07_Message2.java | 9 +++++---- src/class184/Code01_Capital1.java | 14 +++++++------- src/class184/Code01_Capital2.java | 9 +++++---- 16 files changed, 88 insertions(+), 76 deletions(-) diff --git a/src/class183/Code01_Ratio1.java b/src/class183/Code01_Ratio1.java index d96e07a38..dca87e2d7 100644 --- a/src/class183/Code01_Ratio1.java +++ b/src/class183/Code01_Ratio1.java @@ -42,19 +42,20 @@ public static void addEdge(int u, int v, int w) { head[u] = cntg; } - public static int getSize(int u, int fa) { + public static void getSize(int u, int fa) { siz[u] = 1; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - siz[u] += getSize(v, u); + getSize(v, u); + siz[u] += siz[v]; } } - return siz[u]; } public static int getCentroid(int u, int fa) { - int half = getSize(u, fa) >> 1; + getSize(u, fa); + int half = siz[u] >> 1; boolean find = false; while (!find) { find = true; diff --git a/src/class183/Code01_Ratio2.java b/src/class183/Code01_Ratio2.java index faf3157ff..f3c99fa6a 100644 --- a/src/class183/Code01_Ratio2.java +++ b/src/class183/Code01_Ratio2.java @@ -40,19 +40,20 @@ // head[u] = cntg; //} // -//int getSize(int u, int fa) { +//void getSize(int u, int fa) { // siz[u] = 1; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// siz[u] += getSize(v, u); +// getSize(v, u); +// siz[u] += siz[v]; // } // } -// return siz[u]; //} // //int getCentroid(int u, int fa) { -// int half = getSize(u, fa) >> 1; +// getSize(u, fa); +// int half = siz[u] >> 1; // bool find = false; // while (!find) { // find = true; diff --git a/src/class183/Code02_Template1.java b/src/class183/Code02_Template1.java index 68a495169..d5e855f19 100644 --- a/src/class183/Code02_Template1.java +++ b/src/class183/Code02_Template1.java @@ -47,19 +47,20 @@ public static void addEdge(int u, int v, int w) { head[u] = cntg; } - public static int getSize(int u, int fa) { + public static void getSize(int u, int fa) { siz[u] = 1; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - siz[u] += getSize(v, u); + getSize(v, u); + siz[u] += siz[v]; } } - return siz[u]; } public static int getCentroid(int u, int fa) { - int half = getSize(u, fa) >> 1; + getSize(u, fa); + int half = siz[u] >> 1; boolean find = false; while (!find) { find = true; diff --git a/src/class183/Code02_Template2.java b/src/class183/Code02_Template2.java index ce36062ca..5934f081e 100644 --- a/src/class183/Code02_Template2.java +++ b/src/class183/Code02_Template2.java @@ -45,19 +45,20 @@ // head[u] = cntg; //} // -//int getSize(int u, int fa) { +//void getSize(int u, int fa) { // siz[u] = 1; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// siz[u] += getSize(v, u); +// getSize(v, u); +// siz[u] += siz[v]; // } // } -// return siz[u]; //} // //int getCentroid(int u, int fa) { -// int half = getSize(u, fa) >> 1; +// getSize(u, fa); +// int half = siz[u] >> 1; // bool find = false; // while (!find) { // find = true; diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index 9470e29f8..6627eaca3 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -68,19 +68,19 @@ public static void addEdge(int u, int v, int w) { } // 得到子树大小递归版,java会爆栈,C++可以通过 - public static int getSize1(int u, int fa) { + public static void getSize1(int u, int fa) { siz[u] = 1; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - siz[u] += getSize1(v, u); + getSize1(v, u); + siz[u] += siz[v]; } } - return siz[u]; } // 得到子树大小迭代版 - public static int getSize2(int cur, int fa) { + public static void getSize2(int cur, int fa) { stacksize = 0; push(cur, fa, 0, 0, -1); while (stacksize > 0) { @@ -106,12 +106,12 @@ public static int getSize2(int cur, int fa) { } } } - return siz[cur]; } public static int getCentroid(int u, int fa) { - // int half = getSize1(u, fa) >> 1; - int half = getSize2(u, fa) >> 1; + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; boolean find = false; while (!find) { find = true; diff --git a/src/class183/Code03_Race2.java b/src/class183/Code03_Race2.java index a62419b58..943181925 100644 --- a/src/class183/Code03_Race2.java +++ b/src/class183/Code03_Race2.java @@ -44,19 +44,20 @@ // head[u] = cntg; //} // -//int getSize(int u, int fa) { +//void getSize(int u, int fa) { // siz[u] = 1; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// siz[u] += getSize(v, u); +// getSize(v, u); +// siz[u] += siz[v]; // } // } -// return siz[u]; //} // //int getCentroid(int u, int fa) { -// int half = getSize(u, fa) >> 1; +// getSize(u, fa); +// int half = siz[u] >> 1; // bool find = false; // while (!find) { // find = true; diff --git a/src/class183/Code04_Tree1.java b/src/class183/Code04_Tree1.java index 28fae8a1e..e2e163010 100644 --- a/src/class183/Code04_Tree1.java +++ b/src/class183/Code04_Tree1.java @@ -39,19 +39,20 @@ public static void addEdge(int u, int v, int w) { head[u] = cntg; } - public static int getSize(int u, int fa) { + public static void getSize(int u, int fa) { siz[u] = 1; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - siz[u] += getSize(v, u); + getSize(v, u); + siz[u] += siz[v]; } } - return siz[u]; } public static int getCentroid(int u, int fa) { - int half = getSize(u, fa) >> 1; + getSize(u, fa); + int half = siz[u] >> 1; boolean find = false; while (!find) { find = true; diff --git a/src/class183/Code04_Tree2.java b/src/class183/Code04_Tree2.java index 0fc0704d7..9ed2a3076 100644 --- a/src/class183/Code04_Tree2.java +++ b/src/class183/Code04_Tree2.java @@ -36,19 +36,20 @@ // head[u] = cntg; //} // -//int getSize(int u, int fa) { +//void getSize(int u, int fa) { // siz[u] = 1; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// siz[u] += getSize(v, u); +// getSize(v, u); +// siz[u] += siz[v]; // } // } -// return siz[u]; //} // //int getCentroid(int u, int fa) { -// int half = getSize(u, fa) >> 1; +// getSize(u, fa); +// int half = siz[u] >> 1; // bool find = false; // while (!find) { // find = true; diff --git a/src/class183/Code05_CloseVertices1.java b/src/class183/Code05_CloseVertices1.java index 2f629eea3..bd753faf4 100644 --- a/src/class183/Code05_CloseVertices1.java +++ b/src/class183/Code05_CloseVertices1.java @@ -81,19 +81,20 @@ public static int sum(int i) { return ret; } - public static int getSize(int u, int fa) { + public static void getSize(int u, int fa) { siz[u] = 1; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - siz[u] += getSize(v, u); + getSize(v, u); + siz[u] += siz[v]; } } - return siz[u]; } public static int getCentroid(int u, int fa) { - int half = getSize(u, fa) >> 1; + getSize(u, fa); + int half = siz[u] >> 1; boolean find = false; while (!find) { find = true; diff --git a/src/class183/Code05_CloseVertices2.java b/src/class183/Code05_CloseVertices2.java index 5e2ae10b8..3331a8722 100644 --- a/src/class183/Code05_CloseVertices2.java +++ b/src/class183/Code05_CloseVertices2.java @@ -70,19 +70,20 @@ // return ret; //} // -//int getSize(int u, int fa) { +//void getSize(int u, int fa) { // siz[u] = 1; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// siz[u] += getSize(v, u); +// getSize(v, u); +// siz[u] += siz[v]; // } // } -// return siz[u]; //} // //int getCentroid(int u, int fa) { -// int half = getSize(u, fa) >> 1; +// getSize(u, fa); +// int half = siz[u] >> 1; // bool find = false; // while (!find) { // find = true; diff --git a/src/class183/Code06_Maschera1.java b/src/class183/Code06_Maschera1.java index d54a0a796..9d0a1ad3e 100644 --- a/src/class183/Code06_Maschera1.java +++ b/src/class183/Code06_Maschera1.java @@ -104,19 +104,19 @@ public static int sum(int i) { } // 得到子树大小递归版,java会爆栈,C++可以通过 - public static int getSize1(int u, int fa) { + public static void getSize1(int u, int fa) { siz[u] = 1; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - siz[u] += getSize1(v, u); + getSize1(v, u); + siz[u] += siz[v]; } } - return siz[u]; } // 得到子树大小迭代版 - public static int getSize2(int cur, int fa) { + public static void getSize2(int cur, int fa) { stacksize = 0; push(cur, fa, 0, 0, -1); while (stacksize > 0) { @@ -142,12 +142,12 @@ public static int getSize2(int cur, int fa) { } } } - return siz[cur]; } public static int getCentroid(int u, int fa) { - // int half = getSize1(u, fa) >> 1; - int half = getSize2(u, fa) >> 1; + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; boolean find = false; while (!find) { find = true; diff --git a/src/class183/Code06_Maschera2.java b/src/class183/Code06_Maschera2.java index be15cf90a..d5b3106d5 100644 --- a/src/class183/Code06_Maschera2.java +++ b/src/class183/Code06_Maschera2.java @@ -69,19 +69,20 @@ // return ret; //} // -//int getSize(int u, int fa) { +//void getSize(int u, int fa) { // siz[u] = 1; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// siz[u] += getSize(v, u); +// getSize(v, u); +// siz[u] += siz[v]; // } // } -// return siz[u]; //} // //int getCentroid(int u, int fa) { -// int half = getSize(u, fa) >> 1; +// getSize(u, fa); +// int half = siz[u] >> 1; // bool find = false; // while (!find) { // find = true; diff --git a/src/class183/Code07_Message1.java b/src/class183/Code07_Message1.java index 14de968e9..9e5f16c13 100644 --- a/src/class183/Code07_Message1.java +++ b/src/class183/Code07_Message1.java @@ -77,19 +77,19 @@ public static void addQuery(int u, int t, int id) { } // 得到子树大小递归版,java会爆栈,C++可以通过 - public static int getSize1(int u, int fa) { + public static void getSize1(int u, int fa) { siz[u] = 1; for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - siz[u] += getSize1(v, u); + getSize1(v, u); + siz[u] += siz[v]; } } - return siz[u]; } // 得到子树大小迭代版 - public static int getSize2(int cur, int fa) { + public static void getSize2(int cur, int fa) { stacksize = 0; push(cur, fa, 0, -1); while (stacksize > 0) { @@ -115,12 +115,12 @@ public static int getSize2(int cur, int fa) { } } } - return siz[cur]; } public static int getCentroid(int u, int fa) { - // int half = getSize1(u, fa) >> 1; - int half = getSize2(u, fa) >> 1; + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; boolean find = false; while (!find) { find = true; diff --git a/src/class183/Code07_Message2.java b/src/class183/Code07_Message2.java index 5084aebbe..4351447c3 100644 --- a/src/class183/Code07_Message2.java +++ b/src/class183/Code07_Message2.java @@ -57,19 +57,20 @@ // headq[u] = cntq; //} // -//int getSize(int u, int fa) { +//void getSize(int u, int fa) { // siz[u] = 1; // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (v != fa && !vis[v]) { -// siz[u] += getSize(v, u); +// getSize(v, u); +// siz[u] += siz[v]; // } // } -// return siz[u]; //} // //int getCentroid(int u, int fa) { -// int half = getSize(u, fa) >> 1; +// getSize(u, fa); +// int half = siz[u] >> 1; // bool find = false; // while (!find) { // find = true; diff --git a/src/class184/Code01_Capital1.java b/src/class184/Code01_Capital1.java index a68b40356..3b0f85310 100644 --- a/src/class184/Code01_Capital1.java +++ b/src/class184/Code01_Capital1.java @@ -73,19 +73,19 @@ public static void addNode(int color, int node) { } // 得到子树大小递归版,java会爆栈,C++可以通过 - public static int getSize1(int u, int fa) { + public static void getSize1(int u, int fa) { siz[u] = 1; for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - siz[u] += getSize1(v, u); + getSize1(v, u); + siz[u] += siz[v]; } } - return siz[u]; } // 得到子树大小迭代版 - public static int getSize2(int cur, int fa) { + public static void getSize2(int cur, int fa) { stacksize = 0; push(cur, fa, 0, -1); while (stacksize > 0) { @@ -111,12 +111,12 @@ public static int getSize2(int cur, int fa) { } } } - return siz[cur]; } public static int getCentroid(int u, int fa) { - // int half = getSize1(u, fa) >> 1; - int half = getSize2(u, fa) >> 1; + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; boolean find = false; while (!find) { find = true; diff --git a/src/class184/Code01_Capital2.java b/src/class184/Code01_Capital2.java index 0759475e0..ab83403cc 100644 --- a/src/class184/Code01_Capital2.java +++ b/src/class184/Code01_Capital2.java @@ -50,19 +50,20 @@ // headc[color] = cntc; //} // -//int getSize(int u, int fa) { +//void getSize(int u, int fa) { // siz[u] = 1; // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (v != fa && !vis[v]) { -// siz[u] += getSize(v, u); +// getSize(v, u); +// siz[u] += siz[v]; // } // } -// return siz[u]; //} // //int getCentroid(int u, int fa) { -// int half = getSize(u, fa) >> 1; +// getSize(u, fa); +// int half = siz[u] >> 1; // bool find = false; // while (!find) { // find = true; From 39c45524dbb9af314c0b017d6a0c1573244cf9c1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Nov 2025 11:11:09 +0800 Subject: [PATCH 1020/1170] modify code --- src/class183/Code06_Maschera1.java | 3 ++- src/class183/Code07_Message1.java | 3 ++- src/class184/Code01_Capital1.java | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/class183/Code06_Maschera1.java b/src/class183/Code06_Maschera1.java index 9d0a1ad3e..314f0b745 100644 --- a/src/class183/Code06_Maschera1.java +++ b/src/class183/Code06_Maschera1.java @@ -40,7 +40,8 @@ public class Code06_Maschera1 { // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; - public static int stacksize, u, f, maxv, edge, e; + public static int u, f, maxv, edge, e; + public static int stacksize; public static void push(int u, int f, int maxv, int edge, int e) { stack[stacksize][0] = u; diff --git a/src/class183/Code07_Message1.java b/src/class183/Code07_Message1.java index 9e5f16c13..3a37d281c 100644 --- a/src/class183/Code07_Message1.java +++ b/src/class183/Code07_Message1.java @@ -45,7 +45,8 @@ public class Code07_Message1 { // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][4]; - public static int stacksize, u, f, dep, e; + public static int u, f, dep, e; + public static int stacksize; public static void push(int u, int f, int dep, int e) { stack[stacksize][0] = u; diff --git a/src/class184/Code01_Capital1.java b/src/class184/Code01_Capital1.java index 3b0f85310..5678bebc3 100644 --- a/src/class184/Code01_Capital1.java +++ b/src/class184/Code01_Capital1.java @@ -42,7 +42,8 @@ public class Code01_Capital1 { // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][4]; - public static int stacksize, u, f, stamp, e; + public static int u, f, stamp, e; + public static int stacksize; public static void push(int u, int f, int stamp, int e) { stack[stacksize][0] = u; From 8f80262e83f7bb37e13b05d416def0cca3c6cf52 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Nov 2025 11:20:54 +0800 Subject: [PATCH 1021/1170] modify code --- src/class183/{Code02_Template1.java => Code02_Exist1.java} | 4 ++-- src/class183/{Code02_Template2.java => Code02_Exist2.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/class183/{Code02_Template1.java => Code02_Exist1.java} (98%) rename src/class183/{Code02_Template2.java => Code02_Exist2.java} (98%) diff --git a/src/class183/Code02_Template1.java b/src/class183/Code02_Exist1.java similarity index 98% rename from src/class183/Code02_Template1.java rename to src/class183/Code02_Exist1.java index d5e855f19..5484d790a 100644 --- a/src/class183/Code02_Template1.java +++ b/src/class183/Code02_Exist1.java @@ -1,6 +1,6 @@ package class183; -// 点分治模版题,java版 +// 距离为k的点对是否存在,java版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 // 一共有m条查询,每条查询给定数字k,打印树上距离为k的点对是否存在 // 1 <= n <= 10^4 1 <= 边权 <= 10^4 @@ -13,7 +13,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_Template1 { +public class Code02_Exist1 { public static int MAXN = 10001; public static int MAXM = 101; diff --git a/src/class183/Code02_Template2.java b/src/class183/Code02_Exist2.java similarity index 98% rename from src/class183/Code02_Template2.java rename to src/class183/Code02_Exist2.java index 5934f081e..3be243bd1 100644 --- a/src/class183/Code02_Template2.java +++ b/src/class183/Code02_Exist2.java @@ -1,6 +1,6 @@ package class183; -// 点分治模版题,C++版 +// 距离为k的点对是否存在,C++版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 // 一共有m条查询,每条查询给定数字k,打印树上距离为k的点对是否存在 // 1 <= n <= 10^4 1 <= 边权 <= 10^4 From 2de3b9e8d81205d1c34a5e493a00a432d4e87ba7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Nov 2025 12:14:04 +0800 Subject: [PATCH 1022/1170] modify code --- src/class183/Code01_Ratio1.java | 16 ++++++++-------- src/class183/Code01_Ratio2.java | 16 ++++++++-------- src/class183/Code03_Race1.java | 16 +++++++--------- src/class183/Code03_Race2.java | 16 +++++++--------- 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/class183/Code01_Ratio1.java b/src/class183/Code01_Ratio1.java index dca87e2d7..69c2b4c4f 100644 --- a/src/class183/Code01_Ratio1.java +++ b/src/class183/Code01_Ratio1.java @@ -31,6 +31,8 @@ public class Code01_Ratio1 { public static int[] cur = new int[3]; public static int[] all = new int[3]; + public static int ans; + public static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } @@ -82,8 +84,7 @@ public static void dfs(int u, int fa, int dis) { } } - public static int calc(int u) { - int ans = 0; + public static void calc(int u) { all[0] = all[1] = all[2] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -97,19 +98,17 @@ public static int calc(int u) { all[2] += cur[2]; } } - return ans; } - public static int solve(int u) { + public static void solve(int u) { vis[u] = true; - int ans = calc(u); + calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - ans += solve(getCentroid(v, u)); + solve(getCentroid(v, u)); } } - return ans; } public static void main(String[] args) throws Exception { @@ -123,7 +122,8 @@ public static void main(String[] args) throws Exception { addEdge(u, v, w); addEdge(v, u, w); } - int a = solve(getCentroid(1, 0)) + n; + solve(getCentroid(1, 0)); + int a = ans + n; int b = n * n; int c = gcd(a, b); a /= c; diff --git a/src/class183/Code01_Ratio2.java b/src/class183/Code01_Ratio2.java index f3c99fa6a..934774dfb 100644 --- a/src/class183/Code01_Ratio2.java +++ b/src/class183/Code01_Ratio2.java @@ -29,6 +29,8 @@ //int cur[3]; //int all[3]; // +//int ans; +// //int gcd(int a, int b) { // return b == 0 ? a : gcd(b, a % b); //} @@ -80,8 +82,7 @@ // } //} // -//int calc(int u) { -// int ans = 0; +//void calc(int u) { // all[0] = all[1] = all[2] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; @@ -95,19 +96,17 @@ // all[2] += cur[2]; // } // } -// return ans; //} // -//int solve(int u) { +//void solve(int u) { // vis[u] = true; -// int ans = calc(u); +// calc(u); // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { -// ans += solve(getCentroid(v, u)); +// solve(getCentroid(v, u)); // } // } -// return ans; //} // //int main() { @@ -119,7 +118,8 @@ // addEdge(u, v, w); // addEdge(v, u, w); // } -// int a = solve(getCentroid(1, 0)) + n; +// solve(getCentroid(1, 0)); +// int a = ans + n; // int b = n * n; // int c = gcd(a, b); // a /= c; diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index 6627eaca3..da7dfcb63 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -36,6 +36,7 @@ public class Code03_Race1 { public static int cnta; public static int[] dp = new int[MAXK]; + public static int ans; // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; @@ -169,8 +170,7 @@ public static void dfs2(int cur, int fa, int pathDis, int pathEdge) { } } - public static int calc(int u) { - int ans = INF; + public static void calc(int u) { cnta = 0; dp[0] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { @@ -190,20 +190,17 @@ public static int calc(int u) { for (int i = 1; i <= cnta; i++) { dp[disArr[i]] = INF; } - return ans; } - public static int solve(int u) { - int ans = INF; + public static void solve(int u) { vis[u] = true; - ans = Math.min(ans, calc(u)); + calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - ans = Math.min(ans, solve(getCentroid(v, u))); + solve(getCentroid(v, u)); } } - return ans; } public static void main(String[] args) throws Exception { @@ -219,7 +216,8 @@ public static void main(String[] args) throws Exception { addEdge(v, u, w); } Arrays.fill(dp, INF); - int ans = solve(getCentroid(1, 0)); + ans = INF; + solve(getCentroid(1, 0)); if (ans == INF) { ans = -1; } diff --git a/src/class183/Code03_Race2.java b/src/class183/Code03_Race2.java index 943181925..5aebb611f 100644 --- a/src/class183/Code03_Race2.java +++ b/src/class183/Code03_Race2.java @@ -36,6 +36,7 @@ //int cnta; // //int dp[MAXK]; +//int ans; // //void addEdge(int u, int v, int w) { // nxt[++cntg] = head[u]; @@ -87,8 +88,7 @@ // } //} // -//int calc(int u) { -// int ans = INF; +//void calc(int u) { // cnta = 0; // dp[0] = 0; // for (int e = head[u]; e; e = nxt[e]) { @@ -107,20 +107,17 @@ // for (int i = 1; i <= cnta; i++) { // dp[arr[i].dis] = INF; // } -// return ans; //} // -//int solve(int u) { -// int ans = INF; +//void solve(int u) { // vis[u] = true; -// ans = min(ans, calc(u)); +// calc(u); // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { -// ans = min(ans, solve(getCentroid(v, u))); +// solve(getCentroid(v, u)); // } // } -// return ans; //} // //int main() { @@ -135,7 +132,8 @@ // addEdge(v, u, w); // } // fill(dp, dp + MAXK, INF); -// int ans = solve(getCentroid(1, 0)); +// ans = INF; +// solve(getCentroid(1, 0)); // if (ans == INF) { // ans = -1; // } From 49f98db8626350a885bb1fa7deef8f143ed23e27 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Nov 2025 12:27:14 +0800 Subject: [PATCH 1023/1170] modify code --- src/class183/Code01_Ratio1.java | 17 +++++++++-------- src/class183/Code01_Ratio2.java | 17 +++++++++-------- src/class183/Code03_Race1.java | 15 ++++++++------- src/class183/Code03_Race2.java | 15 ++++++++------- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/class183/Code01_Ratio1.java b/src/class183/Code01_Ratio1.java index 69c2b4c4f..c9a3d9683 100644 --- a/src/class183/Code01_Ratio1.java +++ b/src/class183/Code01_Ratio1.java @@ -31,8 +31,6 @@ public class Code01_Ratio1 { public static int[] cur = new int[3]; public static int[] all = new int[3]; - public static int ans; - public static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } @@ -84,7 +82,8 @@ public static void dfs(int u, int fa, int dis) { } } - public static void calc(int u) { + public static int calc(int u) { + int ans = 0; all[0] = all[1] = all[2] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -98,17 +97,20 @@ public static void calc(int u) { all[2] += cur[2]; } } + return ans; } - public static void solve(int u) { + public static int solve(int u) { + int ans = 0; vis[u] = true; - calc(u); + ans += calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - solve(getCentroid(v, u)); + ans += solve(getCentroid(v, u)); } } + return ans; } public static void main(String[] args) throws Exception { @@ -122,8 +124,7 @@ public static void main(String[] args) throws Exception { addEdge(u, v, w); addEdge(v, u, w); } - solve(getCentroid(1, 0)); - int a = ans + n; + int a = solve(getCentroid(1, 0)) + n; int b = n * n; int c = gcd(a, b); a /= c; diff --git a/src/class183/Code01_Ratio2.java b/src/class183/Code01_Ratio2.java index 934774dfb..d3a3b5c5b 100644 --- a/src/class183/Code01_Ratio2.java +++ b/src/class183/Code01_Ratio2.java @@ -29,8 +29,6 @@ //int cur[3]; //int all[3]; // -//int ans; -// //int gcd(int a, int b) { // return b == 0 ? a : gcd(b, a % b); //} @@ -82,7 +80,8 @@ // } //} // -//void calc(int u) { +//int calc(int u) { +// int ans = 0; // all[0] = all[1] = all[2] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; @@ -96,17 +95,20 @@ // all[2] += cur[2]; // } // } +// return ans; //} // -//void solve(int u) { +//int solve(int u) { +// int ans = 0; // vis[u] = true; -// calc(u); +// ans += calc(u); // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { -// solve(getCentroid(v, u)); +// ans += solve(getCentroid(v, u)); // } // } +// return ans; //} // //int main() { @@ -118,8 +120,7 @@ // addEdge(u, v, w); // addEdge(v, u, w); // } -// solve(getCentroid(1, 0)); -// int a = ans + n; +// int a = solve(getCentroid(1, 0)) + n; // int b = n * n; // int c = gcd(a, b); // a /= c; diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index da7dfcb63..72695dc98 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -36,7 +36,6 @@ public class Code03_Race1 { public static int cnta; public static int[] dp = new int[MAXK]; - public static int ans; // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; @@ -170,7 +169,8 @@ public static void dfs2(int cur, int fa, int pathDis, int pathEdge) { } } - public static void calc(int u) { + public static int calc(int u) { + int ans = INF; cnta = 0; dp[0] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { @@ -190,17 +190,19 @@ public static void calc(int u) { for (int i = 1; i <= cnta; i++) { dp[disArr[i]] = INF; } + return ans; } - public static void solve(int u) { + public static int solve(int u) { vis[u] = true; - calc(u); + int ans = calc(u); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - solve(getCentroid(v, u)); + ans = Math.min(ans, solve(getCentroid(v, u))); } } + return ans; } public static void main(String[] args) throws Exception { @@ -216,8 +218,7 @@ public static void main(String[] args) throws Exception { addEdge(v, u, w); } Arrays.fill(dp, INF); - ans = INF; - solve(getCentroid(1, 0)); + int ans = solve(getCentroid(1, 0)); if (ans == INF) { ans = -1; } diff --git a/src/class183/Code03_Race2.java b/src/class183/Code03_Race2.java index 5aebb611f..d286b37e5 100644 --- a/src/class183/Code03_Race2.java +++ b/src/class183/Code03_Race2.java @@ -36,7 +36,6 @@ //int cnta; // //int dp[MAXK]; -//int ans; // //void addEdge(int u, int v, int w) { // nxt[++cntg] = head[u]; @@ -88,7 +87,8 @@ // } //} // -//void calc(int u) { +//int calc(int u) { +// int ans = INF; // cnta = 0; // dp[0] = 0; // for (int e = head[u]; e; e = nxt[e]) { @@ -107,17 +107,19 @@ // for (int i = 1; i <= cnta; i++) { // dp[arr[i].dis] = INF; // } +// return ans; //} // -//void solve(int u) { +//int solve(int u) { // vis[u] = true; -// calc(u); +// int ans = calc(u); // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { -// solve(getCentroid(v, u)); +// ans = min(ans, solve(getCentroid(v, u))); // } // } +// return ans; //} // //int main() { @@ -132,8 +134,7 @@ // addEdge(v, u, w); // } // fill(dp, dp + MAXK, INF); -// ans = INF; -// solve(getCentroid(1, 0)); +// int ans = solve(getCentroid(1, 0)); // if (ans == INF) { // ans = -1; // } From d663f639ba7ebfbe1a522ae3390932defca9b5b2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Nov 2025 16:06:06 +0800 Subject: [PATCH 1024/1170] modify code --- src/class183/Code01_Ratio1.java | 7 +++++-- src/class183/Code01_Ratio2.java | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/class183/Code01_Ratio1.java b/src/class183/Code01_Ratio1.java index c9a3d9683..675cbf0fc 100644 --- a/src/class183/Code01_Ratio1.java +++ b/src/class183/Code01_Ratio1.java @@ -28,6 +28,8 @@ public class Code01_Ratio1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; + // cur[v],表示往下走的当前路径中,路径权值和 % 3 == v的路径有多少条 + // all[v],表示往下走的所有路径中,路径权值和 % 3 == v的路径有多少条 public static int[] cur = new int[3]; public static int[] all = new int[3]; @@ -83,7 +85,7 @@ public static void dfs(int u, int fa, int dis) { } public static int calc(int u) { - int ans = 0; + int ans = 1; all[0] = all[1] = all[2] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -124,7 +126,8 @@ public static void main(String[] args) throws Exception { addEdge(u, v, w); addEdge(v, u, w); } - int a = solve(getCentroid(1, 0)) + n; + int centroid = getCentroid(1, 0); + int a = solve(centroid); int b = n * n; int c = gcd(a, b); a /= c; diff --git a/src/class183/Code01_Ratio2.java b/src/class183/Code01_Ratio2.java index d3a3b5c5b..ca8a13757 100644 --- a/src/class183/Code01_Ratio2.java +++ b/src/class183/Code01_Ratio2.java @@ -81,7 +81,7 @@ //} // //int calc(int u) { -// int ans = 0; +// int ans = 1; // all[0] = all[1] = all[2] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; @@ -120,7 +120,8 @@ // addEdge(u, v, w); // addEdge(v, u, w); // } -// int a = solve(getCentroid(1, 0)) + n; +// int centroid = getCentroid(1, 0); +// int a = solve(centroid); // int b = n * n; // int c = gcd(a, b); // a /= c; From 5da65c3733f2b03ed33eb4f0a92b43fe5ee74180 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Nov 2025 16:34:13 +0800 Subject: [PATCH 1025/1170] modify code --- src/class183/Code01_Ratio1.java | 4 ++-- src/class183/Code01_Ratio2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class183/Code01_Ratio1.java b/src/class183/Code01_Ratio1.java index 675cbf0fc..892f5285f 100644 --- a/src/class183/Code01_Ratio1.java +++ b/src/class183/Code01_Ratio1.java @@ -85,7 +85,7 @@ public static void dfs(int u, int fa, int dis) { } public static int calc(int u) { - int ans = 1; + int ans = 0; all[0] = all[1] = all[2] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -99,7 +99,7 @@ public static int calc(int u) { all[2] += cur[2]; } } - return ans; + return ans + 1; } public static int solve(int u) { diff --git a/src/class183/Code01_Ratio2.java b/src/class183/Code01_Ratio2.java index ca8a13757..db41a9f53 100644 --- a/src/class183/Code01_Ratio2.java +++ b/src/class183/Code01_Ratio2.java @@ -81,7 +81,7 @@ //} // //int calc(int u) { -// int ans = 1; +// int ans = 0; // all[0] = all[1] = all[2] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; @@ -95,7 +95,7 @@ // all[2] += cur[2]; // } // } -// return ans; +// return ans + 1; //} // //int solve(int u) { From 5378382e9033fbf1b462810962b9eddb79074306 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Nov 2025 16:35:29 +0800 Subject: [PATCH 1026/1170] modify code --- src/class183/Code01_Ratio1.java | 4 ++-- src/class183/Code01_Ratio2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class183/Code01_Ratio1.java b/src/class183/Code01_Ratio1.java index 892f5285f..675cbf0fc 100644 --- a/src/class183/Code01_Ratio1.java +++ b/src/class183/Code01_Ratio1.java @@ -85,7 +85,7 @@ public static void dfs(int u, int fa, int dis) { } public static int calc(int u) { - int ans = 0; + int ans = 1; all[0] = all[1] = all[2] = 0; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -99,7 +99,7 @@ public static int calc(int u) { all[2] += cur[2]; } } - return ans + 1; + return ans; } public static int solve(int u) { diff --git a/src/class183/Code01_Ratio2.java b/src/class183/Code01_Ratio2.java index db41a9f53..ca8a13757 100644 --- a/src/class183/Code01_Ratio2.java +++ b/src/class183/Code01_Ratio2.java @@ -81,7 +81,7 @@ //} // //int calc(int u) { -// int ans = 0; +// int ans = 1; // all[0] = all[1] = all[2] = 0; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; @@ -95,7 +95,7 @@ // all[2] += cur[2]; // } // } -// return ans + 1; +// return ans; //} // //int solve(int u) { From 01c2b0434797c2d85285b99d47b04dbb7d029ba4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Nov 2025 16:58:48 +0800 Subject: [PATCH 1027/1170] modify code --- src/class183/Code01_Ratio1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class183/Code01_Ratio1.java b/src/class183/Code01_Ratio1.java index 675cbf0fc..ee1cd3007 100644 --- a/src/class183/Code01_Ratio1.java +++ b/src/class183/Code01_Ratio1.java @@ -25,6 +25,7 @@ public class Code01_Ratio1 { public static int[] weight = new int[MAXN << 1]; public static int cntg; + // vis[u] = true,表示u是之前的分治点 public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; From 6629073bca54f9a231bb02e868b22ddecf2c14ba Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 11:58:08 +0800 Subject: [PATCH 1028/1170] modify code --- src/class183/Code02_Exist1.java | 12 ++++++------ src/class183/Code02_Exist2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class183/Code02_Exist1.java b/src/class183/Code02_Exist1.java index 5484d790a..663d90b09 100644 --- a/src/class183/Code02_Exist1.java +++ b/src/class183/Code02_Exist1.java @@ -36,7 +36,7 @@ public class Code02_Exist1 { public static int cntc; public static int[] all = new int[MAXN]; public static int cnta; - public static boolean[] check = new boolean[MAXV]; + public static boolean[] exist = new boolean[MAXV]; public static boolean[] ans = new boolean[MAXM]; @@ -92,27 +92,27 @@ public static void dfs(int u, int fa, int dis) { public static void calc(int u) { cnta = 0; - check[0] = true; + exist[0] = true; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { cntc = 0; dfs(v, u, weight[e]); for (int i = 1; i <= m; i++) { - for (int j = 1; j <= cntc; j++) { + for (int j = 1; !ans[i] && j <= cntc; j++) { if (query[i] - cur[j] >= 0) { - ans[i] |= check[query[i] - cur[j]]; + ans[i] |= exist[query[i] - cur[j]]; } } } for (int i = 1; i <= cntc; i++) { all[++cnta] = cur[i]; - check[cur[i]] = true; + exist[cur[i]] = true; } } } for (int i = 1; i <= cnta; i++) { - check[all[i]] = false; + exist[all[i]] = false; } } diff --git a/src/class183/Code02_Exist2.java b/src/class183/Code02_Exist2.java index 3be243bd1..b867fa577 100644 --- a/src/class183/Code02_Exist2.java +++ b/src/class183/Code02_Exist2.java @@ -34,7 +34,7 @@ //int cntc; //int all[MAXN]; //int cnta; -//bool check[MAXV]; +//bool exist[MAXV]; // //bool ans[MAXM]; // @@ -90,27 +90,27 @@ // //void calc(int u) { // cnta = 0; -// check[0] = true; +// exist[0] = true; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { // cntc = 0; // dfs(v, u, weight[e]); // for (int i = 1; i <= m; i++) { -// for (int j = 1; j <= cntc; j++) { +// for (int j = 1; !ans[i] && j <= cntc; j++) { // if (query[i] - cur[j] >= 0) { -// ans[i] |= check[query[i] - cur[j]]; +// ans[i] |= exist[query[i] - cur[j]]; // } // } // } // for (int i = 1; i <= cntc; i++) { // all[++cnta] = cur[i]; -// check[cur[i]] = true; +// exist[cur[i]] = true; // } // } // } // for (int i = 1; i <= cnta; i++) { -// check[all[i]] = false; +// exist[all[i]] = false; // } //} // From 74ba48ef0f4956f7c529b70dc7d4e4de55641596 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 12:12:40 +0800 Subject: [PATCH 1029/1170] modify code --- src/class183/Code02_Exist1.java | 11 ++++++++--- src/class183/Code02_Exist2.java | 8 +++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/class183/Code02_Exist1.java b/src/class183/Code02_Exist1.java index 663d90b09..5082df248 100644 --- a/src/class183/Code02_Exist1.java +++ b/src/class183/Code02_Exist1.java @@ -21,7 +21,7 @@ public class Code02_Exist1 { public static int n, m; public static int[] query = new int[MAXM]; - public static int maxq; + public static int maxk; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -32,10 +32,15 @@ public class Code02_Exist1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; + // 从u出发,到当前子树每个节点,收集路径权值和 public static int[] cur = new int[MAXN]; public static int cntc; + + // 从u出发,到之前所有子树的每个节点,收集路径权值和 public static int[] all = new int[MAXN]; public static int cnta; + + // 使用数组替代哈希表,因为哈希表常数时间大,无法通过测试 public static boolean[] exist = new boolean[MAXV]; public static boolean[] ans = new boolean[MAXM]; @@ -78,7 +83,7 @@ public static int getCentroid(int u, int fa) { } public static void dfs(int u, int fa, int dis) { - if (dis > maxq) { + if (dis > maxk) { return; } cur[++cntc] = dis; @@ -141,7 +146,7 @@ public static void main(String[] args) throws Exception { } for (int i = 1; i <= m; i++) { query[i] = in.nextInt(); - maxq = Math.max(maxq, query[i]); + maxk = Math.max(maxk, query[i]); } solve(getCentroid(1, 0)); for (int i = 1; i <= m; i++) { diff --git a/src/class183/Code02_Exist2.java b/src/class183/Code02_Exist2.java index b867fa577..95ca7bca1 100644 --- a/src/class183/Code02_Exist2.java +++ b/src/class183/Code02_Exist2.java @@ -19,7 +19,7 @@ //int n, m; // //int query[MAXM]; -//int maxq; +//int maxk; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -32,8 +32,10 @@ // //int cur[MAXN]; //int cntc; +// //int all[MAXN]; //int cnta; +// //bool exist[MAXV]; // //bool ans[MAXM]; @@ -76,7 +78,7 @@ //} // //void dfs(int u, int fa, int dis) { -// if (dis > maxq) { +// if (dis > maxk) { // return; // } // cur[++cntc] = dis; @@ -136,7 +138,7 @@ // } // for (int i = 1; i <= m; i++) { // cin >> query[i]; -// maxq = max(maxq, query[i]); +// maxk = max(maxk, query[i]); // } // solve(getCentroid(1, 0)); // for (int i = 1; i <= m; i++) { From 3c073e8a1dc04683453a2b4b76127d18f9ff68fc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 12:23:52 +0800 Subject: [PATCH 1030/1170] modify code --- src/class183/Code02_Exist1.java | 4 ++-- src/class183/Code02_Exist2.java | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class183/Code02_Exist1.java b/src/class183/Code02_Exist1.java index 5082df248..1264c6222 100644 --- a/src/class183/Code02_Exist1.java +++ b/src/class183/Code02_Exist1.java @@ -32,7 +32,7 @@ public class Code02_Exist1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - // 从u出发,到当前子树每个节点,收集路径权值和 + // 从u出发,到当前子树的每个节点,收集路径权值和 public static int[] cur = new int[MAXN]; public static int cntc; @@ -40,7 +40,7 @@ public class Code02_Exist1 { public static int[] all = new int[MAXN]; public static int cnta; - // 使用数组替代哈希表,因为哈希表常数时间大,无法通过测试 + // 使用数组替代哈希表,因为哈希表常数时间大,会超时 public static boolean[] exist = new boolean[MAXV]; public static boolean[] ans = new boolean[MAXM]; diff --git a/src/class183/Code02_Exist2.java b/src/class183/Code02_Exist2.java index 95ca7bca1..8d8ba9b28 100644 --- a/src/class183/Code02_Exist2.java +++ b/src/class183/Code02_Exist2.java @@ -32,10 +32,8 @@ // //int cur[MAXN]; //int cntc; -// //int all[MAXN]; //int cnta; -// //bool exist[MAXV]; // //bool ans[MAXM]; From f504ab9e8ccb48435b730f25c8e3d298fce09b71 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 13:29:21 +0800 Subject: [PATCH 1031/1170] modify code --- src/class183/Code03_Race1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index 72695dc98..ce830eea1 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -31,10 +31,12 @@ public class Code03_Race1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; + // 从u出发,到当前子树的每个节点,收集(路径权值和, 边数) public static int[] disArr = new int[MAXN]; public static int[] edgeArr = new int[MAXN]; public static int cnta; + // dp[v]表示,从u出发到之前子树的节点,路径权值和为v的路径,最少边数是多少 public static int[] dp = new int[MAXK]; // 讲解118,递归函数改成迭代所需要的栈 From 8e48bd8755184430ff7823d619892dce3c4e5804 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 13:42:00 +0800 Subject: [PATCH 1032/1170] modify code --- src/class183/Code03_Race1.java | 31 ++++++++++++++++++------------- src/class183/Code03_Race2.java | 20 +++++++++++--------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index ce830eea1..6331b1381 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -32,10 +32,13 @@ public class Code03_Race1 { public static int[] siz = new int[MAXN]; // 从u出发,到当前子树的每个节点,收集(路径权值和, 边数) - public static int[] disArr = new int[MAXN]; - public static int[] edgeArr = new int[MAXN]; + public static int[] curDis = new int[MAXN]; + public static int[] curEdge = new int[MAXN]; + public static int cntc; + // 从u出发,到之前子树的每个节点,收集(路径权值和, 边数) + public static int[] allDis = new int[MAXN]; + public static int[] allEdge = new int[MAXN]; public static int cnta; - // dp[v]表示,从u出发到之前子树的节点,路径权值和为v的路径,最少边数是多少 public static int[] dp = new int[MAXK]; @@ -135,8 +138,8 @@ public static void dfs1(int u, int fa, int dis, int edge) { if (dis > k) { return; } - disArr[++cnta] = dis; - edgeArr[cnta] = edge; + curDis[++cntc] = dis; + curEdge[cntc] = edge; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { @@ -155,8 +158,8 @@ public static void dfs2(int cur, int fa, int pathDis, int pathEdge) { if (dis > k) { continue; } - disArr[++cnta] = dis; - edgeArr[cnta] = edge; + curDis[++cntc] = dis; + curEdge[cntc] = edge; e = head[u]; } else { e = nxt[e]; @@ -178,19 +181,21 @@ public static int calc(int u) { for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - int tmp = cnta; + cntc = 0; // dfs1(v, u, weight[e], 1); dfs2(v, u, weight[e], 1); - for (int i = tmp + 1; i <= cnta; i++) { - ans = Math.min(ans, dp[k - disArr[i]] + edgeArr[i]); + for (int i = 1; i <= cntc; i++) { + ans = Math.min(ans, dp[k - curDis[i]] + curEdge[i]); } - for (int i = tmp + 1; i <= cnta; i++) { - dp[disArr[i]] = Math.min(dp[disArr[i]], edgeArr[i]); + for (int i = 1; i <= cntc; i++) { + allDis[++cnta] = curDis[i]; + allEdge[cnta] = curEdge[i]; + dp[curDis[i]] = Math.min(dp[curDis[i]], curEdge[i]); } } } for (int i = 1; i <= cnta; i++) { - dp[disArr[i]] = INF; + dp[allDis[i]] = INF; } return ans; } diff --git a/src/class183/Code03_Race2.java b/src/class183/Code03_Race2.java index d286b37e5..f48ca83df 100644 --- a/src/class183/Code03_Race2.java +++ b/src/class183/Code03_Race2.java @@ -32,9 +32,10 @@ //bool vis[MAXN]; //int siz[MAXN]; // -//Node arr[MAXN]; +//Node cur[MAXN]; +//int cntc; +//Node all[MAXN]; //int cnta; -// //int dp[MAXK]; // //void addEdge(int u, int v, int w) { @@ -78,7 +79,7 @@ // if (dis > k) { // return; // } -// arr[++cnta] = { dis, edge }; +// cur[++cntc] = { dis, edge }; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { @@ -94,18 +95,19 @@ // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { -// int tmp = cnta; +// cntc = 0; // dfs(v, u, weight[e], 1); -// for (int i = tmp + 1; i <= cnta; i++) { -// ans = min(ans, dp[k - arr[i].dis] + arr[i].edge); +// for (int i = 1; i <= cntc; i++) { +// ans = min(ans, dp[k - cur[i].dis] + cur[i].edge); // } -// for (int i = tmp + 1; i <= cnta; i++) { -// dp[arr[i].dis] = min(dp[arr[i].dis], arr[i].edge); +// for (int i = 1; i <= cntc; i++) { +// all[++cnta] = cur[i]; +// dp[cur[i].dis] = min(dp[cur[i].dis], cur[i].edge); // } // } // } // for (int i = 1; i <= cnta; i++) { -// dp[arr[i].dis] = INF; +// dp[all[i].dis] = INF; // } // return ans; //} From 1cbf69af1a99feb23df222de091c53b224595fa4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 13:43:49 +0800 Subject: [PATCH 1033/1170] modify code --- src/class183/Code03_Race1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index 6331b1381..4aa6e53b5 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -31,11 +31,11 @@ public class Code03_Race1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - // 从u出发,到当前子树的每个节点,收集(路径权值和, 边数) + // 从u出发到当前子树的节点,收集(路径权值和, 边数) public static int[] curDis = new int[MAXN]; public static int[] curEdge = new int[MAXN]; public static int cntc; - // 从u出发,到之前子树的每个节点,收集(路径权值和, 边数) + // 从u出发到之前子树的节点,收集(路径权值和, 边数) public static int[] allDis = new int[MAXN]; public static int[] allEdge = new int[MAXN]; public static int cnta; From 6412626ecd27a2a04ad417ab18d08ca707de97d4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 13:57:25 +0800 Subject: [PATCH 1034/1170] modify code --- src/class183/Code03_Race1.java | 8 ++++---- src/class183/Code03_Race2.java | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index 4aa6e53b5..d4b3270d5 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -31,14 +31,15 @@ public class Code03_Race1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - // 从u出发到当前子树的节点,收集(路径权值和, 边数) + // 从u出发到当前子树的节点,收集(路径权值和, 路径边数) public static int[] curDis = new int[MAXN]; public static int[] curEdge = new int[MAXN]; public static int cntc; - // 从u出发到之前子树的节点,收集(路径权值和, 边数) + + // 从u出发到之前子树的节点,收集路径权值和 public static int[] allDis = new int[MAXN]; - public static int[] allEdge = new int[MAXN]; public static int cnta; + // dp[v]表示,从u出发到之前子树的节点,路径权值和为v的路径,最少边数是多少 public static int[] dp = new int[MAXK]; @@ -189,7 +190,6 @@ public static int calc(int u) { } for (int i = 1; i <= cntc; i++) { allDis[++cnta] = curDis[i]; - allEdge[cnta] = curEdge[i]; dp[curDis[i]] = Math.min(dp[curDis[i]], curEdge[i]); } } diff --git a/src/class183/Code03_Race2.java b/src/class183/Code03_Race2.java index f48ca83df..612b5d1c2 100644 --- a/src/class183/Code03_Race2.java +++ b/src/class183/Code03_Race2.java @@ -34,8 +34,10 @@ // //Node cur[MAXN]; //int cntc; -//Node all[MAXN]; +// +//int allDis[MAXN]; //int cnta; +// //int dp[MAXK]; // //void addEdge(int u, int v, int w) { @@ -101,13 +103,13 @@ // ans = min(ans, dp[k - cur[i].dis] + cur[i].edge); // } // for (int i = 1; i <= cntc; i++) { -// all[++cnta] = cur[i]; +// allDis[++cnta] = cur[i].dis; // dp[cur[i].dis] = min(dp[cur[i].dis], cur[i].edge); // } // } // } // for (int i = 1; i <= cnta; i++) { -// dp[all[i].dis] = INF; +// dp[allDis[i]] = INF; // } // return ans; //} From a18810283712eead76058b58933253318ec79410 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 14:12:48 +0800 Subject: [PATCH 1035/1170] modify code --- src/class183/Code03_Race1.java | 7 ++++--- src/class183/Code03_Race2.java | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index d4b3270d5..c89ec1f34 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -1,9 +1,10 @@ package class183; -// 权值和为k的路径的最少边数,java版 +// 路径权值和为k的最少边数,java版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 -// 给定数字k,要求路径权值和等于k,并且边的数量最小 -// 打印最小边数,如果不存在路径打印-1,注意点的编号从0开始 +// 给定数字k,要求找到路径权值和等于k的简单路径,并且边的数量最小 +// 打印这个最小的边数,如果不存在路径权值和等于k的简单路径,那么打印-1 +// 注意,本题给定的点的编号从0开始 // 1 <= n <= 2 * 10^5 // 0 <= 边权、k <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P4149 diff --git a/src/class183/Code03_Race2.java b/src/class183/Code03_Race2.java index 612b5d1c2..0329acc45 100644 --- a/src/class183/Code03_Race2.java +++ b/src/class183/Code03_Race2.java @@ -1,9 +1,10 @@ package class183; -// 权值和为k的路径的最少边数,C++版 +// 路径权值和为k的最少边数,C++版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 -// 给定数字k,要求路径权值和等于k,并且边的数量最小 -// 打印最小边数,如果不存在路径打印-1,注意点的编号从0开始 +// 给定数字k,要求找到路径权值和等于k的简单路径,并且边的数量最小 +// 打印这个最小的边数,如果不存在路径权值和等于k的简单路径,那么打印-1 +// 注意,本题给定的点的编号从0开始 // 1 <= n <= 2 * 10^5 // 0 <= 边权、k <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P4149 From 74c466f89042b8ccd8908750a02a50deca321155 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 14:35:33 +0800 Subject: [PATCH 1036/1170] modify code --- src/class183/Code03_Race1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class183/Code03_Race1.java b/src/class183/Code03_Race1.java index c89ec1f34..97ce1322a 100644 --- a/src/class183/Code03_Race1.java +++ b/src/class183/Code03_Race1.java @@ -41,7 +41,7 @@ public class Code03_Race1 { public static int[] allDis = new int[MAXN]; public static int cnta; - // dp[v]表示,从u出发到之前子树的节点,路径权值和为v的路径,最少边数是多少 + // dp[s]表示,从u出发到之前子树的节点,路径权值和为s的路径,最少边数是多少 public static int[] dp = new int[MAXK]; // 讲解118,递归函数改成迭代所需要的栈 From e0423866300adfe83f60663248fa52674e5c335c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 16:00:40 +0800 Subject: [PATCH 1037/1170] modify code --- src/class183/Code04_Tree1.java | 6 ++++-- src/class183/Code04_Tree2.java | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/class183/Code04_Tree1.java b/src/class183/Code04_Tree1.java index e2e163010..781ee6cbb 100644 --- a/src/class183/Code04_Tree1.java +++ b/src/class183/Code04_Tree1.java @@ -82,6 +82,9 @@ public static void dfs(int u, int fa, int dis) { } } + // 从真正的头来到u时,路径权值和为dis + // 子树u上的点对(x, y),需要走过,x -> 真正的头 -> y + // 返回距离<=k的点对数量 public static long calc(int u, int dis) { cnta = 0; dfs(u, 0, dis); @@ -99,9 +102,8 @@ public static long calc(int u, int dis) { } public static long solve(int u) { - long ans = 0; - ans += calc(u, 0); vis[u] = true; + long ans = calc(u, 0); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { diff --git a/src/class183/Code04_Tree2.java b/src/class183/Code04_Tree2.java index 9ed2a3076..699cc5fa9 100644 --- a/src/class183/Code04_Tree2.java +++ b/src/class183/Code04_Tree2.java @@ -96,9 +96,8 @@ //} // //long long solve(int u) { -// long long ans = 0; -// ans += calc(u, 0); // vis[u] = true; +// long long ans = calc(u, 0); // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { From 647825d23a401b7aacf04de991ac5914f7d9145f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 16:10:10 +0800 Subject: [PATCH 1038/1170] modify code --- src/class183/Code04_Tree1.java | 1 + src/class183/Code04_Tree2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class183/Code04_Tree1.java b/src/class183/Code04_Tree1.java index 781ee6cbb..c8583ee1a 100644 --- a/src/class183/Code04_Tree1.java +++ b/src/class183/Code04_Tree1.java @@ -3,6 +3,7 @@ // 距离<=k的点对数量,java版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 // 给定数字k,求出树上两点距离<=k的点对数量 +// 本题规定(x, x)不是点对,(x, y)和(y, x)认为是同一个点对 // 1 <= n <= 4 * 10^4 // 0 <= 边权 <= 10^3 // 0 <= k <= 2 * 10^4 diff --git a/src/class183/Code04_Tree2.java b/src/class183/Code04_Tree2.java index 699cc5fa9..540bb3728 100644 --- a/src/class183/Code04_Tree2.java +++ b/src/class183/Code04_Tree2.java @@ -3,6 +3,7 @@ // 距离<=k的点对数量,C++版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 // 给定数字k,求出树上两点距离<=k的点对数量 +// 本题规定(x, x)不是点对,(x, y)和(y, x)认为是同一个点对 // 1 <= n <= 4 * 10^4 // 0 <= 边权 <= 10^3 // 0 <= k <= 2 * 10^4 From 5137a5c40af75bdf28ac910d9a3581159acc3578 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Nov 2025 17:33:40 +0800 Subject: [PATCH 1039/1170] modify code --- src/class183/Code05_CloseVertices1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class183/Code05_CloseVertices1.java b/src/class183/Code05_CloseVertices1.java index bd753faf4..8a0d82eee 100644 --- a/src/class183/Code05_CloseVertices1.java +++ b/src/class183/Code05_CloseVertices1.java @@ -125,6 +125,9 @@ public static void dfs(int u, int fa, int dis, int dep) { } } + // 从真正的头来到u时,路径权值和为dis,深度为dep + // 子树u上的点对(x, y),需要走过,x -> 真正的头 -> y + // 返回 距离<=limitw、边数<=limitwl 的点对数量 public static long calc(int u, int dis, int dep) { cnta = 0; dfs(u, 0, dis, dep); From 277fb42afc926cc5ebbfd78c87ecb2bf09a5af32 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 13:29:44 +0800 Subject: [PATCH 1040/1170] modify code --- src/class183/Code05_CloseVertices1.java | 46 ++++++++++++++----------- src/class183/Code05_CloseVertices2.java | 38 ++++++++++---------- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/class183/Code05_CloseVertices1.java b/src/class183/Code05_CloseVertices1.java index 8a0d82eee..05ff0f05b 100644 --- a/src/class183/Code05_CloseVertices1.java +++ b/src/class183/Code05_CloseVertices1.java @@ -3,12 +3,10 @@ // 相近点对的数量,java版 // 一共有n个节点,所有节点组成一棵树,1号节点是树头 // 从2号点开始,给定每个点的父节点编号、与父节点之间无向边的边权 -// 给定两个整数limitl、limitw,如下为(a, b)是相近点对的定义 -// 首先a < b,其次两者简单路径的边数不超过limitl、权值和不超过limitw -// 打印树上有多少相近点对 -// 1 <= limitl <= n <= 10^5 -// 0 <= limitw <= 10^9 -// 0 <= 边权 <= 10^4 +// 给定两个整数limitl、limitw,要求两点之间的简单路径满足如下关系 +// 路径权值和 <= limitw、路径边数 <= limitl,求出这样的点对数量 +// 本题规定(x, x)不是点对,(x, y)和(y, x)认为是同一个点对 +// 1 <= limitl <= n <= 10^5 0 <= limitw <= 10^9 0 <= 边权 <= 10^4 // 测试链接 : https://www.luogu.com.cn/problem/CF293E // 测试链接 : https://codeforces.com/problemset/problem/293/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -33,7 +31,7 @@ public class Code05_CloseVertices1 { public static int[] siz = new int[MAXN]; public static int[] disArr = new int[MAXN]; - public static int[] depArr = new int[MAXN]; + public static int[] edgeArr = new int[MAXN]; public static int cnta; public static int[] tree = new int[MAXN]; @@ -46,7 +44,7 @@ public static void sort(int l, int r) { while (disArr[j] > pivot) j--; if (i <= j) { tmp = disArr[i]; disArr[i] = disArr[j]; disArr[j] = tmp; - tmp = depArr[i]; depArr[i] = depArr[j]; depArr[j] = tmp; + tmp = edgeArr[i]; edgeArr[i] = edgeArr[j]; edgeArr[j] = tmp; i++; j--; } } @@ -66,6 +64,9 @@ public static int lowbit(int i) { } public static void add(int i, int v) { + // 边的数量最小是0,但是树状数组下标从1开始 + // 所以i++,平移一下,然后使用树状数组 + i++; while (i <= limitl + 1) { tree[i] += v; i += lowbit(i); @@ -73,6 +74,9 @@ public static void add(int i, int v) { } public static int sum(int i) { + // 边的数量最小是0,但是树状数组下标从1开始 + // 所以i++,平移一下,然后使用树状数组 + i++; int ret = 0; while (i > 0) { ret += tree[i]; @@ -111,38 +115,38 @@ public static int getCentroid(int u, int fa) { return u; } - public static void dfs(int u, int fa, int dis, int dep) { - if (dis > limitw || dep > limitl + 1) { + public static void dfs(int u, int fa, int dis, int edge) { + if (dis > limitw || edge > limitl) { return; } disArr[++cnta] = dis; - depArr[cnta] = dep; + edgeArr[cnta] = edge; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { - dfs(v, u, dis + weight[e], dep + 1); + dfs(v, u, dis + weight[e], edge + 1); } } } - // 从真正的头来到u时,路径权值和为dis,深度为dep + // 从真正的头来到u时,路径权值和为dis,边的数量为edge // 子树u上的点对(x, y),需要走过,x -> 真正的头 -> y // 返回 距离<=limitw、边数<=limitwl 的点对数量 - public static long calc(int u, int dis, int dep) { + public static long calc(int u, int dis, int edge) { cnta = 0; - dfs(u, 0, dis, dep); + dfs(u, 0, dis, edge); sort(1, cnta); for (int i = 1; i <= cnta; i++) { - add(depArr[i], 1); + add(edgeArr[i], 1); } long ret = 0; for (int l = 1, r = cnta; l <= r;) { if (disArr[l] + disArr[r] <= limitw) { - add(depArr[l], -1); - ret += sum(limitl - depArr[l] + 2); + add(edgeArr[l], -1); + ret += sum(limitl - edgeArr[l]); l++; } else { - add(depArr[r], -1); + add(edgeArr[r], -1); r--; } } @@ -151,11 +155,11 @@ public static long calc(int u, int dis, int dep) { public static long solve(int u) { vis[u] = true; - long ans = calc(u, 0, 1); + long ans = calc(u, 0, 0); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { - ans -= calc(v, weight[e], 2); + ans -= calc(v, weight[e], 1); ans += solve(getCentroid(v, u)); } } diff --git a/src/class183/Code05_CloseVertices2.java b/src/class183/Code05_CloseVertices2.java index 3331a8722..92c5547e0 100644 --- a/src/class183/Code05_CloseVertices2.java +++ b/src/class183/Code05_CloseVertices2.java @@ -3,12 +3,10 @@ // 相近点对的数量,C++版 // 一共有n个节点,所有节点组成一棵树,1号节点是树头 // 从2号点开始,给定每个点的父节点编号、与父节点之间无向边的边权 -// 给定两个整数limitl、limitw,如下为(a, b)是相近点对的定义 -// 首先a < b,其次两者简单路径的边数不超过limitl、权值和不超过limitw -// 打印树上有多少相近点对 -// 1 <= limitl <= n <= 10^5 -// 0 <= limitw <= 10^9 -// 0 <= 边权 <= 10^4 +// 给定两个整数limitl、limitw,要求两点之间的简单路径满足如下关系 +// 路径权值和 <= limitw、路径边数 <= limitl,求出这样的点对数量 +// 本题规定(x, x)不是点对,(x, y)和(y, x)认为是同一个点对 +// 1 <= limitl <= n <= 10^5 0 <= limitw <= 10^9 0 <= 边权 <= 10^4 // 测试链接 : https://www.luogu.com.cn/problem/CF293E // 测试链接 : https://codeforces.com/problemset/problem/293/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -19,7 +17,7 @@ //using namespace std; // //struct Node { -// int dis, dep; +// int dis, edge; //}; // //bool NodeCmp(Node a, Node b) { @@ -55,6 +53,7 @@ //} // //void add(int i, int v) { +// i++; // while (i <= limitl + 1) { // tree[i] += v; // i += lowbit(i); @@ -62,6 +61,7 @@ //} // //int sum(int i) { +// i++; // int ret = 0; // while (i > 0) { // ret += tree[i]; @@ -100,34 +100,34 @@ // return u; //} // -//void dfs(int u, int fa, int dis, int dep) { -// if (dis > limitw || dep > limitl + 1) { +//void dfs(int u, int fa, int dis, int edge) { +// if (dis > limitw || edge > limitl) { // return; // } -// arr[++cnta] = { dis, dep }; +// arr[++cnta] = { dis, edge }; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { -// dfs(v, u, dis + weight[e], dep + 1); +// dfs(v, u, dis + weight[e], edge + 1); // } // } //} // -//long long calc(int u, int dis, int dep) { +//long long calc(int u, int dis, int edge) { // cnta = 0; -// dfs(u, 0, dis, dep); +// dfs(u, 0, dis, edge); // sort(arr + 1, arr + cnta + 1, NodeCmp); // for (int i = 1; i <= cnta; i++) { -// add(arr[i].dep, 1); +// add(arr[i].edge, 1); // } // long long ret = 0; // for (int l = 1, r = cnta; l <= r; ) { // if (arr[l].dis + arr[r].dis <= limitw) { -// add(arr[l].dep, -1); -// ret += sum(limitl - arr[l].dep + 2); +// add(arr[l].edge, -1); +// ret += sum(limitl - arr[l].edge); // l++; // } else { -// add(arr[r].dep, -1); +// add(arr[r].edge, -1); // r--; // } // } @@ -136,11 +136,11 @@ // //long long solve(int u) { // vis[u] = true; -// long long ans = calc(u, 0, 1); +// long long ans = calc(u, 0, 0); // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { -// ans -= calc(v, weight[e], 2); +// ans -= calc(v, weight[e], 1); // ans += solve(getCentroid(v, u)); // } // } From 4c3cfcf0f322ffad821e4675789f0373d09d76d3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 13:33:29 +0800 Subject: [PATCH 1041/1170] modify code --- src/class183/Code05_CloseVertices1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class183/Code05_CloseVertices1.java b/src/class183/Code05_CloseVertices1.java index 05ff0f05b..dd5f3e677 100644 --- a/src/class183/Code05_CloseVertices1.java +++ b/src/class183/Code05_CloseVertices1.java @@ -63,9 +63,9 @@ public static int lowbit(int i) { return i & -i; } + // 边的数量从0开始,但是树状数组下标从1开始 + // 所以i++,平移一下,然后使用树状数组 public static void add(int i, int v) { - // 边的数量最小是0,但是树状数组下标从1开始 - // 所以i++,平移一下,然后使用树状数组 i++; while (i <= limitl + 1) { tree[i] += v; @@ -73,9 +73,9 @@ public static void add(int i, int v) { } } + // 边的数量从0开始,但是树状数组下标从1开始 + // 所以i++,平移一下,然后使用树状数组 public static int sum(int i) { - // 边的数量最小是0,但是树状数组下标从1开始 - // 所以i++,平移一下,然后使用树状数组 i++; int ret = 0; while (i > 0) { @@ -131,7 +131,7 @@ public static void dfs(int u, int fa, int dis, int edge) { // 从真正的头来到u时,路径权值和为dis,边的数量为edge // 子树u上的点对(x, y),需要走过,x -> 真正的头 -> y - // 返回 距离<=limitw、边数<=limitwl 的点对数量 + // 返回 路径权值和<=limitw、路径边数<=limitwl 的点对数量 public static long calc(int u, int dis, int edge) { cnta = 0; dfs(u, 0, dis, edge); From 736346e3c27e8f8772b1b2aef694209898b35aec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 13:43:38 +0800 Subject: [PATCH 1042/1170] modify code --- src/class183/Code06_Maschera1.java | 4 ++-- src/class183/Code06_Maschera2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class183/Code06_Maschera1.java b/src/class183/Code06_Maschera1.java index 314f0b745..68ad3b1f1 100644 --- a/src/class183/Code06_Maschera1.java +++ b/src/class183/Code06_Maschera1.java @@ -2,10 +2,10 @@ // 所有合法路径的魔力和,java版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 -// 给定两个整数l、r,对于任意两个不同节点u、v,考虑它们之间的简单路径 +// 给定两个整数l、r,对于点对(x, y),考虑两点之间的简单路径 // 如果路径上边的数量在[l, r]范围内,则这条路径是合法路径 // 路径的魔力值 = 路径上所有边权的最大值,打印所有合法路径的魔力和 -// 注意,u到v和v到u视为两条不同的路径,均要计入答案 +// 本题规定(x, x)不是点对,(x, y)和(y, x)认为是不同的点对 // 1 <= n、边权 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5351 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class183/Code06_Maschera2.java b/src/class183/Code06_Maschera2.java index d5b3106d5..7e236ceb6 100644 --- a/src/class183/Code06_Maschera2.java +++ b/src/class183/Code06_Maschera2.java @@ -2,10 +2,10 @@ // 所有合法路径的魔力和,C++版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 -// 给定两个整数l、r,对于任意两个不同节点u、v,考虑它们之间的简单路径 +// 给定两个整数l、r,对于点对(x, y),考虑两点之间的简单路径 // 如果路径上边的数量在[l, r]范围内,则这条路径是合法路径 // 路径的魔力值 = 路径上所有边权的最大值,打印所有合法路径的魔力和 -// 注意,u到v和v到u视为两条不同的路径,均要计入答案 +// 本题规定(x, x)不是点对,(x, y)和(y, x)认为是不同的点对 // 1 <= n、边权 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5351 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 39f7572bb4a067cb8c5a59eac566bb68b1f2a4c7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 13:57:29 +0800 Subject: [PATCH 1043/1170] modify code --- src/class183/Code05_CloseVertices1.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class183/Code05_CloseVertices1.java b/src/class183/Code05_CloseVertices1.java index dd5f3e677..c28186850 100644 --- a/src/class183/Code05_CloseVertices1.java +++ b/src/class183/Code05_CloseVertices1.java @@ -34,6 +34,10 @@ public class Code05_CloseVertices1 { public static int[] edgeArr = new int[MAXN]; public static int cnta; + // 树状数组 + // 下标是边数,统计节点个数 + // 但是注意,边数从0开始,而树状数组的下标从1开始 + // 所以每次的入参i,需要i++进行平移 public static int[] tree = new int[MAXN]; public static void sort(int l, int r) { @@ -63,20 +67,16 @@ public static int lowbit(int i) { return i & -i; } - // 边的数量从0开始,但是树状数组下标从1开始 - // 所以i++,平移一下,然后使用树状数组 public static void add(int i, int v) { - i++; + i++; // 平移 while (i <= limitl + 1) { tree[i] += v; i += lowbit(i); } } - // 边的数量从0开始,但是树状数组下标从1开始 - // 所以i++,平移一下,然后使用树状数组 public static int sum(int i) { - i++; + i++; // 平移 int ret = 0; while (i > 0) { ret += tree[i]; From 7a5db7ddd8adf6706fb43e50cce55d30d5921c2b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 14:55:09 +0800 Subject: [PATCH 1044/1170] modify code --- src/class183/Code05_CloseVertices1.java | 6 +- src/class183/Code05_CloseVertices2.java | 6 +- src/class183/Code06_Maschera1.java | 79 +++++++++---------------- src/class183/Code06_Maschera2.java | 51 +++++----------- 4 files changed, 49 insertions(+), 93 deletions(-) diff --git a/src/class183/Code05_CloseVertices1.java b/src/class183/Code05_CloseVertices1.java index c28186850..7d9563730 100644 --- a/src/class183/Code05_CloseVertices1.java +++ b/src/class183/Code05_CloseVertices1.java @@ -139,18 +139,18 @@ public static long calc(int u, int dis, int edge) { for (int i = 1; i <= cnta; i++) { add(edgeArr[i], 1); } - long ret = 0; + long ans = 0; for (int l = 1, r = cnta; l <= r;) { if (disArr[l] + disArr[r] <= limitw) { add(edgeArr[l], -1); - ret += sum(limitl - edgeArr[l]); + ans += sum(limitl - edgeArr[l]); l++; } else { add(edgeArr[r], -1); r--; } } - return ret; + return ans; } public static long solve(int u) { diff --git a/src/class183/Code05_CloseVertices2.java b/src/class183/Code05_CloseVertices2.java index 92c5547e0..6019e1ac4 100644 --- a/src/class183/Code05_CloseVertices2.java +++ b/src/class183/Code05_CloseVertices2.java @@ -120,18 +120,18 @@ // for (int i = 1; i <= cnta; i++) { // add(arr[i].edge, 1); // } -// long long ret = 0; +// long long ans = 0; // for (int l = 1, r = cnta; l <= r; ) { // if (arr[l].dis + arr[r].dis <= limitw) { // add(arr[l].edge, -1); -// ret += sum(limitl - arr[l].edge); +// ans += sum(limitl - arr[l].edge); // l++; // } else { // add(arr[r].edge, -1); // r--; // } // } -// return ret; +// return ans; //} // //long long solve(int u) { diff --git a/src/class183/Code06_Maschera1.java b/src/class183/Code06_Maschera1.java index 68ad3b1f1..9ff7ee3ee 100644 --- a/src/class183/Code06_Maschera1.java +++ b/src/class183/Code06_Maschera1.java @@ -17,7 +17,7 @@ public class Code06_Maschera1 { - public static int MAXN = 100001; + public static int MAXN = 100002; public static int n, l, r; public static int[] head = new int[MAXN]; @@ -29,11 +29,8 @@ public class Code06_Maschera1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] curMaxv = new int[MAXN]; - public static int[] curEdge = new int[MAXN]; - public static int cntc; - public static int[] allMaxv = new int[MAXN]; - public static int[] allEdge = new int[MAXN]; + public static int[] maxvArr = new int[MAXN]; + public static int[] edgeArr = new int[MAXN]; public static int cnta; public static int[] tree = new int[MAXN]; @@ -61,20 +58,20 @@ public static void pop() { e = stack[stacksize][4]; } - public static void sort(int[] maxv, int[] edge, int l, int r) { + public static void sort(int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = maxv[(l + r) >> 1], tmp; + int i = l, j = r, pivot = maxvArr[(l + r) >> 1], tmp; while (i <= j) { - while (maxv[i] < pivot) i++; - while (maxv[j] > pivot) j--; + while (maxvArr[i] < pivot) i++; + while (maxvArr[j] > pivot) j--; if (i <= j) { - tmp = maxv[i]; maxv[i] = maxv[j]; maxv[j] = tmp; - tmp = edge[i]; edge[i] = edge[j]; edge[j] = tmp; + tmp = maxvArr[i]; maxvArr[i] = maxvArr[j]; maxvArr[j] = tmp; + tmp = edgeArr[i]; edgeArr[i] = edgeArr[j]; edgeArr[j] = tmp; i++; j--; } } - sort(maxv, edge, l, j); - sort(maxv, edge, i, r); + sort(l, j); + sort(i, r); } public static void addEdge(int u, int v, int w) { @@ -89,13 +86,15 @@ public static int lowbit(int i) { } public static void add(int i, int v) { - while (i <= r) { + i++; + while (i <= r + 1) { tree[i] += v; i += lowbit(i); } } public static int sum(int i) { + i++; int ret = 0; while (i > 0) { ret += tree[i]; @@ -170,8 +169,8 @@ public static void dfs1(int u, int fa, int maxv, int edge) { if (edge > r) { return; } - curMaxv[++cntc] = maxv; - curEdge[cntc] = edge; + maxvArr[++cnta] = maxv; + edgeArr[cnta] = edge; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { @@ -190,8 +189,8 @@ public static void dfs2(int cur, int fa, int pmaxv, int pedge) { if (edge > r) { continue; } - curMaxv[++cntc] = maxv; - curEdge[cntc] = edge; + maxvArr[++cnta] = maxv; + edgeArr[cnta] = edge; e = head[u]; } else { e = nxt[e]; @@ -206,51 +205,29 @@ public static void dfs2(int cur, int fa, int pmaxv, int pedge) { } } - public static long calc(int u) { - long ans = 0; + public static long calc(int u, int maxv, int edge) { cnta = 0; - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - if (!vis[v]) { - cntc = 0; - // dfs1(v, u, weight[e], 1); - dfs2(v, u, weight[e], 1); - sort(curMaxv, curEdge, 1, cntc); - for (int i = 1; i <= cntc; i++) { - ans -= 1L * curMaxv[i] * (sum(r - curEdge[i]) - sum(l - curEdge[i] - 1)); - add(curEdge[i], 1); - } - for (int i = 1; i <= cntc; i++) { - add(curEdge[i], -1); - } - for (int i = 1; i <= cntc; i++) { - allMaxv[++cnta] = curMaxv[i]; - allEdge[cnta] = curEdge[i]; - } - } - } - sort(allMaxv, allEdge, 1, cnta); - for (int i = 1; i <= cnta; i++) { - ans += 1L * allMaxv[i] * (sum(r - allEdge[i]) - sum(l - allEdge[i] - 1)); - add(allEdge[i], 1); - } + // dfs1(u, 0, maxv, edge); + dfs2(u, 0, maxv, edge); + sort(1, cnta); + long ans = 0; for (int i = 1; i <= cnta; i++) { - add(allEdge[i], -1); + ans += 1L * maxvArr[i] * (sum(r - edgeArr[i]) - sum(l - edgeArr[i] - 1)); + add(edgeArr[i], 1); } for (int i = 1; i <= cnta; i++) { - if (allEdge[i] >= l) { - ans += allMaxv[i]; - } + add(edgeArr[i], -1); } return ans; } public static long solve(int u) { vis[u] = true; - long ans = calc(u); + long ans = calc(u, 0, 0); for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { + ans -= calc(v, weight[e], 1); ans += solve(getCentroid(v, u)); } } diff --git a/src/class183/Code06_Maschera2.java b/src/class183/Code06_Maschera2.java index 7e236ceb6..db9261118 100644 --- a/src/class183/Code06_Maschera2.java +++ b/src/class183/Code06_Maschera2.java @@ -23,7 +23,7 @@ // return a.maxv < b.maxv; //} // -//const int MAXN = 100001; +//const int MAXN = 100002; //int n, l, r; // //int head[MAXN]; @@ -35,9 +35,7 @@ //bool vis[MAXN]; //int siz[MAXN]; // -//Node cur[MAXN]; -//int cntc; -//Node all[MAXN]; +//Node arr[MAXN]; //int cnta; // //int tree[MAXN]; @@ -54,13 +52,15 @@ //} // //void add(int i, int v) { -// while (i <= r) { +// i++; +// while (i <= r + 1) { // tree[i] += v; // i += lowbit(i); // } //} // //int sum(int i) { +// i++; // int ret = 0; // while (i > 0) { // ret += tree[i]; @@ -103,7 +103,7 @@ // if (edge > r) { // return; // } -// cur[++cntc] = { maxv, edge }; +// arr[++cnta] = { maxv, edge }; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { @@ -112,49 +112,28 @@ // } //} // -//long long calc(int u) { -// long long ans = 0; +//long long calc(int u, int maxv, int edge) { // cnta = 0; -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// if (!vis[v]) { -// cntc = 0; -// dfs(v, u, weight[e], 1); -// sort(cur + 1, cur + cntc + 1, NodeCmp); -// for (int i = 1; i <= cntc; i++) { -// ans -= 1LL * cur[i].maxv * (sum(r - cur[i].edge) - sum(l - cur[i].edge - 1)); -// add(cur[i].edge, 1); -// } -// for (int i = 1; i <= cntc; i++) { -// add(cur[i].edge, -1); -// } -// for (int i = 1; i <= cntc; i++) { -// all[++cnta] = cur[i]; -// } -// } -// } -// sort(all + 1, all + cnta + 1, NodeCmp); -// for (int i = 1; i <= cnta; i++) { -// ans += 1LL * all[i].maxv * (sum(r - all[i].edge) - sum(l - all[i].edge - 1)); -// add(all[i].edge, 1); -// } +// dfs(u, 0, maxv, edge); +// sort(arr + 1, arr + cnta + 1, NodeCmp); +// long long ans = 0; // for (int i = 1; i <= cnta; i++) { -// add(all[i].edge, -1); +// ans += 1LL * arr[i].maxv * (sum(r - arr[i].edge) - sum(l - arr[i].edge - 1)); +// add(arr[i].edge, 1); // } // for (int i = 1; i <= cnta; i++) { -// if (all[i].edge >= l) { -// ans += all[i].maxv; -// } +// add(arr[i].edge, -1); // } // return ans; //} // //long long solve(int u) { // vis[u] = true; -// long long ans = calc(u); +// long long ans = calc(u, 0, 0); // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { +// ans -= calc(v, weight[e], 1); // ans += solve(getCentroid(v, u)); // } // } From 3941edba9dc754e89a7336409075a23d6cf662e1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 15:13:04 +0800 Subject: [PATCH 1045/1170] modify code --- src/class183/Code07_Message1.java | 26 ++++++-------------------- src/class183/Code07_Message2.java | 23 +++++------------------ 2 files changed, 11 insertions(+), 38 deletions(-) diff --git a/src/class183/Code07_Message1.java b/src/class183/Code07_Message1.java index 3a37d281c..05d6adb1b 100644 --- a/src/class183/Code07_Message1.java +++ b/src/class183/Code07_Message1.java @@ -185,40 +185,26 @@ public static void dfs2(int cur, int fa, int deep) { } } - public static void calc(int u) { + public static void calc(int u, int dep, int effect) { cnta = 0; maxDep = 0; - // dfs1(u, 0, 1); - dfs2(u, 0, 1); + // dfs1(u, 0, dep); + dfs2(u, 0, dep); for (int i = 1; i <= cnta; i++) { - ans[qidArr[i]] += depCnt[timArr[i]]; + ans[qidArr[i]] += depCnt[timArr[i]] * effect; } for (int d = 1; d <= maxDep; d++) { depCnt[d] = 0; } - for (int e = headg[u]; e > 0; e = nextg[e]) { - int v = tog[e]; - if (!vis[v]) { - cnta = 0; - maxDep = 0; - // dfs1(v, u, 2); - dfs2(v, u, 2); - for (int i = 1; i <= cnta; i++) { - ans[qidArr[i]] -= depCnt[timArr[i]]; - } - for (int d = 1; d <= maxDep; d++) { - depCnt[d] = 0; - } - } - } } public static void solve(int u) { vis[u] = true; - calc(u); + calc(u, 1, 1); for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (!vis[v]) { + calc(v, 2, -1); solve(getCentroid(v, u)); } } diff --git a/src/class183/Code07_Message2.java b/src/class183/Code07_Message2.java index 4351447c3..e3493370b 100644 --- a/src/class183/Code07_Message2.java +++ b/src/class183/Code07_Message2.java @@ -103,38 +103,25 @@ // } //} // -//void calc(int u) { +//void calc(int u, int dep, int effect) { // cnta = 0; // maxDep = 0; -// dfs(u, 0, 1); +// dfs(u, 0, dep); // for (int i = 1; i <= cnta; i++) { -// ans[arr[i].qid] += depCnt[arr[i].tim]; +// ans[arr[i].qid] += depCnt[arr[i].tim] * effect; // } // for (int d = 1; d <= maxDep; d++) { // depCnt[d] = 0; // } -// for (int e = headg[u]; e; e = nextg[e]) { -// int v = tog[e]; -// if (!vis[v]) { -// cnta = 0; -// maxDep = 0; -// dfs(v, u, 2); -// for (int i = 1; i <= cnta; i++) { -// ans[arr[i].qid] -= depCnt[arr[i].tim]; -// } -// for (int d = 1; d <= maxDep; d++) { -// depCnt[d] = 0; -// } -// } -// } //} // //void solve(int u) { // vis[u] = true; -// calc(u); +// calc(u, 1, 1); // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (!vis[v]) { +// calc(v, 2, -1); // solve(getCentroid(v, u)); // } // } From fda2277cb4de80ba2654d0abea6288a77b19d40e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 15:37:57 +0800 Subject: [PATCH 1046/1170] modify code --- src/class183/Code07_Message1.java | 59 ++++++++++++++++--------------- src/class183/Code07_Message2.java | 32 ++++++++--------- 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/src/class183/Code07_Message1.java b/src/class183/Code07_Message1.java index 05d6adb1b..60863a5d4 100644 --- a/src/class183/Code07_Message1.java +++ b/src/class183/Code07_Message1.java @@ -34,8 +34,9 @@ public class Code07_Message1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] depCnt = new int[MAXN]; - public static int maxDep; + // nodeCnt[i] = j,表示距离头有i条边的点有j个 + public static int[] nodeCnt = new int[MAXN]; + public static int maxEdge; public static int[] timArr = new int[MAXN]; public static int[] qidArr = new int[MAXN]; @@ -45,13 +46,13 @@ public class Code07_Message1 { // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][4]; - public static int u, f, dep, e; + public static int u, f, edge, e; public static int stacksize; - public static void push(int u, int f, int dep, int e) { + public static void push(int u, int f, int edge, int e) { stack[stacksize][0] = u; stack[stacksize][1] = f; - stack[stacksize][2] = dep; + stack[stacksize][2] = edge; stack[stacksize][3] = e; stacksize++; } @@ -60,7 +61,7 @@ public static void pop() { --stacksize; u = stack[stacksize][0]; f = stack[stacksize][1]; - dep = stack[stacksize][2]; + edge = stack[stacksize][2]; e = stack[stacksize][3]; } @@ -139,35 +140,35 @@ public static int getCentroid(int u, int fa) { } // 收集信息递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa, int dep) { - depCnt[dep]++; - maxDep = Math.max(maxDep, dep); + public static void dfs1(int u, int fa, int edge) { + nodeCnt[edge]++; + maxEdge = Math.max(maxEdge, edge); for (int e = headq[u]; e > 0; e = nextq[e]) { - if (tim[e] + 1 >= dep) { - timArr[++cnta] = tim[e] - dep + 2; + if (tim[e] >= edge) { + timArr[++cnta] = tim[e] - edge; qidArr[cnta] = qid[e]; } } for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - dfs1(v, u, dep + 1); + dfs1(v, u, edge + 1); } } } // 收集信息迭代版 - public static void dfs2(int cur, int fa, int deep) { + public static void dfs2(int cur, int fa, int edg) { stacksize = 0; - push(cur, fa, deep, -1); + push(cur, fa, edg, -1); while (stacksize > 0) { pop(); if (e == -1) { - depCnt[dep]++; - maxDep = Math.max(maxDep, dep); + nodeCnt[edge]++; + maxEdge = Math.max(maxEdge, edge); for (int e = headq[u]; e > 0; e = nextq[e]) { - if (tim[e] + 1 >= dep) { - timArr[++cnta] = tim[e] - dep + 2; + if (tim[e] >= edge) { + timArr[++cnta] = tim[e] - edge; qidArr[cnta] = qid[e]; } } @@ -176,35 +177,35 @@ public static void dfs2(int cur, int fa, int deep) { e = nextg[e]; } if (e != 0) { - push(u, f, dep, e); + push(u, f, edge, e); int v = tog[e]; if (v != f && !vis[v]) { - push(tog[e], u, dep + 1, -1); + push(tog[e], u, edge + 1, -1); } } } } - public static void calc(int u, int dep, int effect) { + public static void calc(int u, int edge, int effect) { cnta = 0; - maxDep = 0; - // dfs1(u, 0, dep); - dfs2(u, 0, dep); + maxEdge = 0; + // dfs1(u, 0, edge); + dfs2(u, 0, edge); for (int i = 1; i <= cnta; i++) { - ans[qidArr[i]] += depCnt[timArr[i]] * effect; + ans[qidArr[i]] += nodeCnt[timArr[i]] * effect; } - for (int d = 1; d <= maxDep; d++) { - depCnt[d] = 0; + for (int v = 0; v <= maxEdge; v++) { + nodeCnt[v] = 0; } } public static void solve(int u) { vis[u] = true; - calc(u, 1, 1); + calc(u, 0, 1); for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (!vis[v]) { - calc(v, 2, -1); + calc(v, 1, -1); solve(getCentroid(v, u)); } } diff --git a/src/class183/Code07_Message2.java b/src/class183/Code07_Message2.java index e3493370b..c4f849295 100644 --- a/src/class183/Code07_Message2.java +++ b/src/class183/Code07_Message2.java @@ -36,8 +36,8 @@ //bool vis[MAXN]; //int siz[MAXN]; // -//int depCnt[MAXN]; -//int maxDep; +//int nodeCnt[MAXN]; +//int maxEdge; // //Node arr[MAXN]; //int cnta; @@ -87,41 +87,41 @@ // return u; //} // -//void dfs(int u, int fa, int dep) { -// depCnt[dep]++; -// maxDep = max(maxDep, dep); +//void dfs(int u, int fa, int edge) { +// nodeCnt[edge]++; +// maxEdge = max(maxEdge, edge); // for (int e = headq[u]; e; e = nextq[e]) { -// if (tim[e] + 1 >= dep) { -// arr[++cnta] = { tim[e] - dep + 2, qid[e] }; +// if (tim[e] >= edge) { +// arr[++cnta] = { tim[e] - edge, qid[e] }; // } // } // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (v != fa && !vis[v]) { -// dfs(v, u, dep + 1); +// dfs(v, u, edge + 1); // } // } //} // -//void calc(int u, int dep, int effect) { +//void calc(int u, int edge, int effect) { // cnta = 0; -// maxDep = 0; -// dfs(u, 0, dep); +// maxEdge = 0; +// dfs(u, 0, edge); // for (int i = 1; i <= cnta; i++) { -// ans[arr[i].qid] += depCnt[arr[i].tim] * effect; +// ans[arr[i].qid] += nodeCnt[arr[i].tim] * effect; // } -// for (int d = 1; d <= maxDep; d++) { -// depCnt[d] = 0; +// for (int v = 0; v <= maxEdge; v++) { +// nodeCnt[v] = 0; // } //} // //void solve(int u) { // vis[u] = true; -// calc(u, 1, 1); +// calc(u, 0, 1); // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (!vis[v]) { -// calc(v, 2, -1); +// calc(v, 1, -1); // solve(getCentroid(v, u)); // } // } From 841baf6621416ab8cc871b845de2cf66b7650c90 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 20:15:44 +0800 Subject: [PATCH 1047/1170] modify code --- src/class183/Code07_Message1.java | 24 +++++++++++------------- src/class183/Code07_Message2.java | 18 ++++++++---------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/class183/Code07_Message1.java b/src/class183/Code07_Message1.java index 60863a5d4..8c6b27ee0 100644 --- a/src/class183/Code07_Message1.java +++ b/src/class183/Code07_Message1.java @@ -2,9 +2,7 @@ // 消息传递,java版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树 -// 如果x号节点收到一个消息,那么消息会从x开始扩散,速度为每天越过一条边 -// 接下来有m条查询,每条查询都是相互独立的,格式如下 -// 查询 x k : 第0天的时候,x号节点得到一条信息,打印第k天时,新收到该消息的人数 +// 一共有m条查询,格式 x k : 打印有多少点,到达x的简单路径上有k条边 // 1 <= n、m <= 10^5 // 0 <= k < n // 测试链接 : https://www.luogu.com.cn/problem/P6626 @@ -27,18 +25,18 @@ public class Code07_Message1 { public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN]; - public static int[] tim = new int[MAXN]; + public static int[] dis = new int[MAXN]; public static int[] qid = new int[MAXN]; public static int cntq; public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - // nodeCnt[i] = j,表示距离头有i条边的点有j个 + // nodeCnt[i] = j,表示从u往下走i条边,一共能找到j个点 public static int[] nodeCnt = new int[MAXN]; public static int maxEdge; - public static int[] timArr = new int[MAXN]; + public static int[] needArr = new int[MAXN]; public static int[] qidArr = new int[MAXN]; public static int cnta; @@ -71,9 +69,9 @@ public static void addEdge(int u, int v) { headg[u] = cntg; } - public static void addQuery(int u, int t, int id) { + public static void addQuery(int u, int k, int id) { nextq[++cntq] = headq[u]; - tim[cntq] = t; + dis[cntq] = k; qid[cntq] = id; headq[u] = cntq; } @@ -144,8 +142,8 @@ public static void dfs1(int u, int fa, int edge) { nodeCnt[edge]++; maxEdge = Math.max(maxEdge, edge); for (int e = headq[u]; e > 0; e = nextq[e]) { - if (tim[e] >= edge) { - timArr[++cnta] = tim[e] - edge; + if (dis[e] >= edge) { + needArr[++cnta] = dis[e] - edge; qidArr[cnta] = qid[e]; } } @@ -167,8 +165,8 @@ public static void dfs2(int cur, int fa, int edg) { nodeCnt[edge]++; maxEdge = Math.max(maxEdge, edge); for (int e = headq[u]; e > 0; e = nextq[e]) { - if (tim[e] >= edge) { - timArr[++cnta] = tim[e] - edge; + if (dis[e] >= edge) { + needArr[++cnta] = dis[e] - edge; qidArr[cnta] = qid[e]; } } @@ -192,7 +190,7 @@ public static void calc(int u, int edge, int effect) { // dfs1(u, 0, edge); dfs2(u, 0, edge); for (int i = 1; i <= cnta; i++) { - ans[qidArr[i]] += nodeCnt[timArr[i]] * effect; + ans[qidArr[i]] += nodeCnt[needArr[i]] * effect; } for (int v = 0; v <= maxEdge; v++) { nodeCnt[v] = 0; diff --git a/src/class183/Code07_Message2.java b/src/class183/Code07_Message2.java index c4f849295..95083fce7 100644 --- a/src/class183/Code07_Message2.java +++ b/src/class183/Code07_Message2.java @@ -2,9 +2,7 @@ // 消息传递,C++版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树 -// 如果x号节点收到一个消息,那么消息会从x开始扩散,速度为每天越过一条边 -// 接下来有m条查询,每条查询都是相互独立的,格式如下 -// 查询 x k : 第0天的时候,x号节点得到一条信息,打印第k天时,新收到该消息的人数 +// 一共有m条查询,格式 x k : 打印有多少点,到达x的简单路径上有k条边 // 1 <= n、m <= 10^5 // 0 <= k < n // 测试链接 : https://www.luogu.com.cn/problem/P6626 @@ -16,7 +14,7 @@ //using namespace std; // //struct Node { -// int tim, qid; +// int need, qid; //}; // //const int MAXN = 100001; @@ -29,7 +27,7 @@ // //int headq[MAXN]; //int nextq[MAXN]; -//int tim[MAXN]; +//int dis[MAXN]; //int qid[MAXN]; //int cntq; // @@ -50,9 +48,9 @@ // headg[u] = cntg; //} // -//void addQuery(int u, int t, int id) { +//void addQuery(int u, int k, int id) { // nextq[++cntq] = headq[u]; -// tim[cntq] = t; +// dis[cntq] = k; // qid[cntq] = id; // headq[u] = cntq; //} @@ -91,8 +89,8 @@ // nodeCnt[edge]++; // maxEdge = max(maxEdge, edge); // for (int e = headq[u]; e; e = nextq[e]) { -// if (tim[e] >= edge) { -// arr[++cnta] = { tim[e] - edge, qid[e] }; +// if (dis[e] >= edge) { +// arr[++cnta] = { dis[e] - edge, qid[e] }; // } // } // for (int e = headg[u]; e; e = nextg[e]) { @@ -108,7 +106,7 @@ // maxEdge = 0; // dfs(u, 0, edge); // for (int i = 1; i <= cnta; i++) { -// ans[arr[i].qid] += nodeCnt[arr[i].tim] * effect; +// ans[arr[i].qid] += nodeCnt[arr[i].need] * effect; // } // for (int v = 0; v <= maxEdge; v++) { // nodeCnt[v] = 0; From 527119744c8f1c1af827f244c7c0502ce091010a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 20:25:53 +0800 Subject: [PATCH 1048/1170] modify code --- src/class183/Code06_Maschera1.java | 5 +++-- src/class183/Code06_Maschera2.java | 5 +++-- src/class183/Code07_Message1.java | 4 ++-- src/class183/Code07_Message2.java | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/class183/Code06_Maschera1.java b/src/class183/Code06_Maschera1.java index 9ff7ee3ee..2dba9fe41 100644 --- a/src/class183/Code06_Maschera1.java +++ b/src/class183/Code06_Maschera1.java @@ -3,8 +3,9 @@ // 所有合法路径的魔力和,java版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 // 给定两个整数l、r,对于点对(x, y),考虑两点之间的简单路径 -// 如果路径上边的数量在[l, r]范围内,则这条路径是合法路径 -// 路径的魔力值 = 路径上所有边权的最大值,打印所有合法路径的魔力和 +// 如果路径的边数在[l, r]范围内,则该路径视为合法 +// 一条路径的魔力值 = 该路径上所有边权的最大值 +// 计算所有合法路径的魔力值之和 // 本题规定(x, x)不是点对,(x, y)和(y, x)认为是不同的点对 // 1 <= n、边权 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5351 diff --git a/src/class183/Code06_Maschera2.java b/src/class183/Code06_Maschera2.java index db9261118..b71e10320 100644 --- a/src/class183/Code06_Maschera2.java +++ b/src/class183/Code06_Maschera2.java @@ -3,8 +3,9 @@ // 所有合法路径的魔力和,C++版 // 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树 // 给定两个整数l、r,对于点对(x, y),考虑两点之间的简单路径 -// 如果路径上边的数量在[l, r]范围内,则这条路径是合法路径 -// 路径的魔力值 = 路径上所有边权的最大值,打印所有合法路径的魔力和 +// 如果路径的边数在[l, r]范围内,则该路径视为合法 +// 一条路径的魔力值 = 该路径上所有边权的最大值 +// 计算所有合法路径的魔力值之和 // 本题规定(x, x)不是点对,(x, y)和(y, x)认为是不同的点对 // 1 <= n、边权 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5351 diff --git a/src/class183/Code07_Message1.java b/src/class183/Code07_Message1.java index 8c6b27ee0..c20119ba3 100644 --- a/src/class183/Code07_Message1.java +++ b/src/class183/Code07_Message1.java @@ -1,8 +1,8 @@ package class183; // 消息传递,java版 -// 一共有n个节点,给定n-1条边,所有节点组成一棵树 -// 一共有m条查询,格式 x k : 打印有多少点,到达x的简单路径上有k条边 +// 一共有n个节点,给定n-1条边,每条边的权值为1,所有节点组成一棵树 +// 一共有m条查询,格式 x k : 打印有多少点与x的距离恰好为k // 1 <= n、m <= 10^5 // 0 <= k < n // 测试链接 : https://www.luogu.com.cn/problem/P6626 diff --git a/src/class183/Code07_Message2.java b/src/class183/Code07_Message2.java index 95083fce7..3f6a11e5c 100644 --- a/src/class183/Code07_Message2.java +++ b/src/class183/Code07_Message2.java @@ -1,8 +1,8 @@ package class183; // 消息传递,C++版 -// 一共有n个节点,给定n-1条边,所有节点组成一棵树 -// 一共有m条查询,格式 x k : 打印有多少点,到达x的简单路径上有k条边 +// 一共有n个节点,给定n-1条边,每条边的权值为1,所有节点组成一棵树 +// 一共有m条查询,格式 x k : 打印有多少点与x的距离恰好为k // 1 <= n、m <= 10^5 // 0 <= k < n // 测试链接 : https://www.luogu.com.cn/problem/P6626 From f465fe4b2c710843950209b5d2932f803350b098 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Nov 2025 22:12:08 +0800 Subject: [PATCH 1049/1170] modify code --- ...1\345\210\206\346\262\273-\344\270\212.pptx" | Bin 0 -> 55381 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243183\343\200\220\346\214\272\351\232\276\343\200\221\351\235\231\346\200\201\347\202\271\345\210\206\346\262\273-\344\270\212.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243183\343\200\220\346\214\272\351\232\276\343\200\221\351\235\231\346\200\201\347\202\271\345\210\206\346\262\273-\344\270\212.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243183\343\200\220\346\214\272\351\232\276\343\200\221\351\235\231\346\200\201\347\202\271\345\210\206\346\262\273-\344\270\212.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..14378fcb7c0f8572bf267c0d7b1023828596833e GIT binary patch literal 55381 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%0ABoXk#4(_JV1&VcZFkDg%*Ou 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 z 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 Date: Thu, 20 Nov 2025 10:43:15 +0800 Subject: [PATCH 1050/1170] modify code --- src/class184/Code01_Capital1.java | 52 ++++++++++++++++--------------- src/class184/Code01_Capital2.java | 31 +++++++++--------- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/class184/Code01_Capital1.java b/src/class184/Code01_Capital1.java index 5678bebc3..4e7256e8f 100644 --- a/src/class184/Code01_Capital1.java +++ b/src/class184/Code01_Capital1.java @@ -35,20 +35,20 @@ public class Code01_Capital1 { public static int[] siz = new int[MAXN]; public static int[] father = new int[MAXN]; - public static int[] nodeStamp = new int[MAXN]; - public static int[] colorStamp = new int[MAXN]; + public static int[] curRoot = new int[MAXN]; public static int[] que = new int[MAXN]; - public static boolean[] enter = new boolean[MAXN]; + public static boolean[] nodeVis = new boolean[MAXN]; + public static boolean[] colorVis = new boolean[MAXN]; // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][4]; - public static int u, f, stamp, e; + public static int u, f, rt, e; public static int stacksize; - public static void push(int u, int f, int stamp, int e) { + public static void push(int u, int f, int rt, int e) { stack[stacksize][0] = u; stack[stacksize][1] = f; - stack[stacksize][2] = stamp; + stack[stacksize][2] = rt; stack[stacksize][3] = e; stacksize++; } @@ -57,7 +57,7 @@ public static void pop() { --stacksize; u = stack[stacksize][0]; f = stack[stacksize][1]; - stamp = stack[stacksize][2]; + rt = stack[stacksize][2]; e = stack[stacksize][3]; } @@ -135,37 +135,39 @@ public static int getCentroid(int u, int fa) { } // 收集信息递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa, int stamp) { + public static void dfs1(int u, int fa, int rt) { father[u] = fa; - nodeStamp[u] = stamp; - enter[u] = false; + curRoot[u] = rt; + nodeVis[u] = false; + colorVis[color[u]] = false; for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - dfs1(v, u, stamp); + dfs1(v, u, rt); } } } // 收集信息迭代版 - public static void dfs2(int cur, int fa, int sta) { + public static void dfs2(int cur, int fa, int root) { stacksize = 0; - push(cur, fa, sta, -1); + push(cur, fa, root, -1); while (stacksize > 0) { pop(); if (e == -1) { father[u] = f; - nodeStamp[u] = stamp; - enter[u] = false; + curRoot[u] = rt; + nodeVis[u] = false; + colorVis[color[u]] = false; e = headg[u]; } else { e = nextg[e]; } if (e != 0) { - push(u, f, stamp, e); + push(u, f, rt, e); int v = tog[e]; if (v != f && !vis[v]) { - push(tog[e], u, stamp, -1); + push(tog[e], u, rt, -1); } } } @@ -176,25 +178,25 @@ public static int calc(int u) { dfs2(u, 0, u); int l = 1, r = 0; que[++r] = u; - enter[u] = true; + nodeVis[u] = true; int ans = 0; while (l <= r) { int cur = que[l++]; - if (cur != u && !enter[father[cur]]) { + if (cur != u && !nodeVis[father[cur]]) { que[++r] = father[cur]; - enter[father[cur]] = true; + nodeVis[father[cur]] = true; } - if (colorStamp[color[cur]] != u) { - colorStamp[color[cur]] = u; + if (!colorVis[color[cur]]) { + colorVis[color[cur]] = true; ans++; for (int e = headc[color[cur]]; e > 0; e = nextc[e]) { int v = toc[e]; - if (nodeStamp[v] != u) { + if (curRoot[v] != u) { return INF; } - if (!enter[v]) { + if (!nodeVis[v]) { que[++r] = v; - enter[v] = true; + nodeVis[v] = true; } } } diff --git a/src/class184/Code01_Capital2.java b/src/class184/Code01_Capital2.java index ab83403cc..18b6d1905 100644 --- a/src/class184/Code01_Capital2.java +++ b/src/class184/Code01_Capital2.java @@ -33,10 +33,10 @@ //int siz[MAXN]; // //int father[MAXN]; -//int nodeStamp[MAXN]; -//int colorStamp[MAXN]; +//int curRoot[MAXN]; //int que[MAXN]; -//bool enter[MAXN]; +//bool nodeVis[MAXN]; +//bool colorVis[MAXN]; // //void addEdge(int u, int v) { // nextg[++cntg] = headg[u]; @@ -80,14 +80,15 @@ // return u; //} // -//void dfs(int u, int fa, int stamp) { +//void dfs(int u, int fa, int rt) { // father[u] = fa; -// nodeStamp[u] = stamp; -// enter[u] = false; +// curRoot[u] = rt; +// nodeVis[u] = false; +// colorVis[color[u]] = false; // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (v != fa && !vis[v]) { -// dfs(v, u, stamp); +// dfs(v, u, rt); // } // } //} @@ -96,25 +97,25 @@ // dfs(u, 0, u); // int l = 1, r = 0; // que[++r] = u; -// enter[u] = true; +// nodeVis[u] = true; // int ans = 0; // while (l <= r) { // int cur = que[l++]; -// if (cur != u && !enter[father[cur]]) { +// if (cur != u && !nodeVis[father[cur]]) { // que[++r] = father[cur]; -// enter[father[cur]] = true; +// nodeVis[father[cur]] = true; // } -// if (colorStamp[color[cur]] != u) { -// colorStamp[color[cur]] = u; +// if (!colorVis[color[cur]]) { +// colorVis[color[cur]] = true; // ans++; // for (int e = headc[color[cur]]; e; e = nextc[e]) { // int v = toc[e]; -// if (nodeStamp[v] != u) { +// if (curRoot[v] != u) { // return INF; // } -// if (!enter[v]) { +// if (!nodeVis[v]) { // que[++r] = v; -// enter[v] = true; +// nodeVis[v] = true; // } // } // } From 96186aae47167281eb6b1f8a4620de1affd962ca Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Nov 2025 10:50:52 +0800 Subject: [PATCH 1051/1170] modify code --- src/class184/Code01_Capital1.java | 2 +- src/class184/Code01_Capital2.java | 2 +- src/class184/Code02_TreeProblem1.java | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 src/class184/Code02_TreeProblem1.java diff --git a/src/class184/Code01_Capital1.java b/src/class184/Code01_Capital1.java index 4e7256e8f..ac5dda2cf 100644 --- a/src/class184/Code01_Capital1.java +++ b/src/class184/Code01_Capital1.java @@ -3,7 +3,7 @@ // 首都,java版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树 // 给定长度为n的数组color,color[i]表示i号节点的颜色,颜色有k种 -// 你需要在树上找到一个连通区,连通区内出现的每种颜色,都不会出现在连通区外 +// 你需要在树上找到一个连通区,连通区内出现的每种颜色,在连通区外不存在 // 这样的连通区可能有多个,希望包含的颜色数量尽量少,打印(最少颜色数 - 1)的结果 // 1 <= n、k <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P7215 diff --git a/src/class184/Code01_Capital2.java b/src/class184/Code01_Capital2.java index 18b6d1905..e64d467bb 100644 --- a/src/class184/Code01_Capital2.java +++ b/src/class184/Code01_Capital2.java @@ -3,7 +3,7 @@ // 首都,C++版 // 一共有n个节点,给定n-1条边,所有节点组成一棵树 // 给定长度为n的数组color,color[i]表示i号节点的颜色,颜色有k种 -// 你需要在树上找到一个连通区,连通区内出现的每种颜色,都不会出现在连通区外 +// 你需要在树上找到一个连通区,连通区内出现的每种颜色,在连通区外不存在 // 这样的连通区可能有多个,希望包含的颜色数量尽量少,打印(最少颜色数 - 1)的结果 // 1 <= n、k <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P7215 diff --git a/src/class184/Code02_TreeProblem1.java b/src/class184/Code02_TreeProblem1.java new file mode 100644 index 000000000..cc6563971 --- /dev/null +++ b/src/class184/Code02_TreeProblem1.java @@ -0,0 +1,8 @@ +package class184; + +// 树的难题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3714 + +public class Code02_TreeProblem1 { + +} From 64a67f024b4e38e9ed73af7c386f4521bb5247f9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Nov 2025 11:02:02 +0800 Subject: [PATCH 1052/1170] modify code --- .../{Code02_TreeProblem1.java => Code02_HardProblem1.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/class184/{Code02_TreeProblem1.java => Code02_HardProblem1.java} (75%) diff --git a/src/class184/Code02_TreeProblem1.java b/src/class184/Code02_HardProblem1.java similarity index 75% rename from src/class184/Code02_TreeProblem1.java rename to src/class184/Code02_HardProblem1.java index cc6563971..3bc2291ac 100644 --- a/src/class184/Code02_TreeProblem1.java +++ b/src/class184/Code02_HardProblem1.java @@ -3,6 +3,6 @@ // 树的难题,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3714 -public class Code02_TreeProblem1 { +public class Code02_HardProblem1 { } From 4e7dcf9a60ecc6450cd697c2cb2020448bbeb7ed Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Nov 2025 16:40:48 +0800 Subject: [PATCH 1053/1170] modify code --- src/class184/Code02_HardProblem1.java | 350 ++++++++++++++++++++++++++ src/class184/Code02_HardProblem2.java | 224 +++++++++++++++++ 2 files changed, 574 insertions(+) create mode 100644 src/class184/Code02_HardProblem2.java diff --git a/src/class184/Code02_HardProblem1.java b/src/class184/Code02_HardProblem1.java index 3bc2291ac..c4886fc8b 100644 --- a/src/class184/Code02_HardProblem1.java +++ b/src/class184/Code02_HardProblem1.java @@ -2,7 +2,357 @@ // 树的难题,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3714 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; public class Code02_HardProblem1 { + public static int MAXN = 200001; + public static long INF = 1L << 60; + public static int n, m, limitl, limitr; + + public static int[] val = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] color = new int[MAXN << 1]; + public static int cntg; + + // 遍历之前子树形成的线段树,维护最大值信息 + public static long[] all = new long[MAXN << 2]; + // 遍历当前子树形成的线段树,维护最大值信息 + public static long[] cur = new long[MAXN << 2]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + + // 每条边信息(连接的点,边的颜色),根据边的颜色排序 + public static int[][] edgeArr = new int[MAXN][2]; + public static int cnte; + + public static int[] edgeCnt = new int[MAXN]; + public static long[] pathSum = new long[MAXN]; + public static int[] nodeArr = new int[MAXN]; + public static int cnta; + + public static int[] colorNodes = new int[MAXN]; + public static int cntc; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][5]; + public static long[] sumst = new long[MAXN]; + public static int u, f, pre, edge, e; + public static long sum; + public static int stacksize; + + public static void push(int u, int f, int pre, int edge, long sum, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = pre; + stack[stacksize][3] = edge; + stack[stacksize][4] = e; + sumst[stacksize] = sum; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + pre = stack[stacksize][2]; + edge = stack[stacksize][3]; + e = stack[stacksize][4]; + sum = sumst[stacksize]; + } + + public static void addEdge(int u, int v, int c) { + nxt[++cntg] = head[u]; + to[cntg] = v; + color[cntg] = c; + head[u] = cntg; + } + + public static void build(long[] tree, int l, int r, int i) { + tree[i] = -INF; + if (l < r) { + int mid = (l + r) >> 1; + build(tree, l, mid, i << 1); + build(tree, mid + 1, r, i << 1 | 1); + } + } + + public static void clear(long[] tree, int l, int r, int i) { + if (tree[i] == -INF) { + return; + } + tree[i] = -INF; + if (l < r) { + int mid = (l + r) >> 1; + clear(tree, l, mid, i << 1); + clear(tree, mid + 1, r, i << 1 | 1); + } + } + + public static void update(long[] tree, int jobi, long jobv, int l, int r, int i) { + if (l == r) { + tree[i] = Math.max(tree[i], jobv); + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + update(tree, jobi, jobv, l, mid, i << 1); + } else { + update(tree, jobi, jobv, mid + 1, r, i << 1 | 1); + } + tree[i] = Math.max(tree[i << 1], tree[i << 1 | 1]); + } + } + + public static long query(long[] tree, int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return tree[i]; + } + int mid = (l + r) >> 1; + long ans = -INF; + if (jobl <= mid) { + ans = Math.max(ans, query(tree, jobl, jobr, l, mid, i << 1)); + } + if (jobr > mid) { + ans = Math.max(ans, query(tree, jobl, jobr, mid + 1, r, i << 1 | 1)); + } + return ans; + } + + // 得到子树大小递归版,java会爆栈,C++可以通过 + public static void getSize1(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize1(v, u); + siz[u] += siz[v]; + } + } + } + + // 得到子树大小迭代版 + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, 0, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, 0, 0, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, 0, 0, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + // 收集信息递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa, int pre, int edge, long sum) { + if (edge > limitr) { + return; + } + edgeCnt[u] = edge; + pathSum[u] = sum; + nodeArr[++cnta] = u; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int c = color[e]; + if (v != fa && !vis[v]) { + dfs1(v, u, c, edge + 1, sum + (pre == c ? 0 : val[c])); + } + } + } + + // 收集信息迭代版 + public static void dfs2(int cur, int fa, int prec, int pedge, long psum) { + stacksize = 0; + push(cur, fa, prec, pedge, psum, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + if (edge > limitr) { + continue; + } + edgeCnt[u] = edge; + pathSum[u] = sum; + nodeArr[++cnta] = u; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, pre, edge, sum, e); + int v = to[e]; + int c = color[e]; + if (v != f && !vis[v]) { + push(v, u, c, edge + 1, sum + (pre == c ? 0 : val[c]), -1); + } + } + } + } + + public static long calc(int u) { + cnte = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int c = color[e]; + if (!vis[v]) { + edgeArr[++cnte][0] = v; + edgeArr[cnte][1] = c; + } + } + Arrays.sort(edgeArr, 1, cnte + 1, (a, b) -> a[1] - b[1]); + update(all, 0, 0, 0, n, 1); + long ans = -INF; + cntc = 0; + for (int k = 1; k <= cnte; k++) { + int v = edgeArr[k][0]; + int c = edgeArr[k][1]; + if (k > 1 && edgeArr[k - 1][1] != c) { + clear(cur, 0, n, 1); + for (int i = 1; i <= cntc; i++) { + int node = colorNodes[i]; + update(all, edgeCnt[node], pathSum[node], 0, n, 1); + } + cntc = 0; + } + cnta = 0; + // dfs1(v, u, c, 1, val[c]); + dfs2(v, u, c, 1, val[c]); + for (int i = 1; i <= cnta; i++) { + int node = nodeArr[i]; + int l = Math.max(0, limitl - edgeCnt[node]); + int r = limitr - edgeCnt[node]; + ans = Math.max(ans, query(all, l, r, 0, n, 1) + pathSum[node]); + ans = Math.max(ans, query(cur, l, r, 0, n, 1) + pathSum[node] - val[c]); + } + for (int i = 1; i <= cnta; i++) { + int node = nodeArr[i]; + colorNodes[++cntc] = node; + update(cur, edgeCnt[node], pathSum[node], 0, n, 1); + } + } + clear(all, 0, n, 1); + clear(cur, 0, n, 1); + return ans; + } + + public static long solve(int u) { + vis[u] = true; + long ans = calc(u); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + ans = Math.max(ans, solve(getCentroid(v, u))); + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + limitl = in.nextInt(); + limitr = in.nextInt(); + for (int i = 1; i <= m; i++) { + val[i] = in.nextInt(); + } + for (int i = 1, u, v, c; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + c = in.nextInt(); + addEdge(u, v, c); + addEdge(v, u, c); + } + build(all, 0, n, 1); + build(cur, 0, n, 1); + out.println(solve(getCentroid(1, 0))); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class184/Code02_HardProblem2.java b/src/class184/Code02_HardProblem2.java new file mode 100644 index 000000000..50d27ec1e --- /dev/null +++ b/src/class184/Code02_HardProblem2.java @@ -0,0 +1,224 @@ +package class184; + +// 树的难题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3714 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int node, color; +//}; +// +//bool EdgeCmp(Edge a, Edge b) { +// return a.color < b.color; +//} +// +//const int MAXN = 200001; +//const long long INF = 1LL << 60; +//int n, m, limitl, limitr; +// +//int val[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int color[MAXN << 1]; +//int cntg; +// +//long long all[MAXN << 2]; +//long long cur[MAXN << 2]; +// +//bool vis[MAXN]; +//int siz[MAXN]; +// +//Edge edgeArr[MAXN]; +//int cnte; +// +//int edgeCnt[MAXN]; +//long long pathSum[MAXN]; +//int nodeArr[MAXN]; +//int cnta; +// +//int colorNodes[MAXN]; +//int cntc; +// +//void addEdge(int u, int v, int c) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// color[cntg] = c; +// head[u] = cntg; +//} +// +//void build(long long *tree, int l, int r, int i) { +// tree[i] = -INF; +// if (l < r) { +// int mid = (l + r) >> 1; +// build(tree, l, mid, i << 1); +// build(tree, mid + 1, r, i << 1 | 1); +// } +//} +// +//void clear(long long *tree, int l, int r, int i) { +// if (tree[i] == -INF) { +// return; +// } +// tree[i] = -INF; +// if (l < r) { +// int mid = (l + r) >> 1; +// clear(tree, l, mid, i << 1); +// clear(tree, mid + 1, r, i << 1 | 1); +// } +//} +// +//void update(long long *tree, int jobi, long long jobv, int l, int r, int i) { +// if (l == r) { +// tree[i] = max(tree[i], jobv); +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// update(tree, jobi, jobv, l, mid, i << 1); +// } else { +// update(tree, jobi, jobv, mid + 1, r, i << 1 | 1); +// } +// tree[i] = max(tree[i << 1], tree[i << 1 | 1]); +// } +//} +// +//long long query(long long *tree, int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return tree[i]; +// } +// int mid = (l + r) >> 1; +// long long ans = -INF; +// if (jobl <= mid) { +// ans = max(ans, query(tree, jobl, jobr, l, mid, i << 1)); +// } +// if (jobr > mid) { +// ans = max(ans, query(tree, jobl, jobr, mid + 1, r, i << 1 | 1)); +// } +// return ans; +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void dfs(int u, int fa, int pre, int edge, long long sum) { +// if (edge > limitr) { +// return; +// } +// edgeCnt[u] = edge; +// pathSum[u] = sum; +// nodeArr[++cnta] = u; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// int c = color[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, c, edge + 1, sum + (pre == c ? 0 : val[c])); +// } +// } +//} +// +//long long calc(int u) { +// cnte = 0; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// int c = color[e]; +// if (!vis[v]) { +// edgeArr[++cnte] = {v, c}; +// } +// } +// sort(edgeArr + 1, edgeArr + cnte + 1, EdgeCmp); +// update(all, 0, 0, 0, n, 1); +// long long ans = -INF; +// cntc = 0; +// for (int k = 1; k <= cnte; k++) { +// int v = edgeArr[k].node; +// int c = edgeArr[k].color; +// if (k > 1 && edgeArr[k - 1].color != c) { +// clear(cur, 0, n, 1); +// for (int i = 1; i <= cntc; i++) { +// int node = colorNodes[i]; +// update(all, edgeCnt[node], pathSum[node], 0, n, 1); +// } +// cntc = 0; +// } +// cnta = 0; +// dfs(v, u, c, 1, val[c]); +// for (int i = 1; i <= cnta; i++) { +// int node = nodeArr[i]; +// int l = max(0, limitl - edgeCnt[node]); +// int r = limitr - edgeCnt[node]; +// ans = max(ans, query(all, l, r, 0, n, 1) + pathSum[node]); +// ans = max(ans, query(cur, l, r, 0, n, 1) + pathSum[node] - val[c]); +// } +// for (int i = 1; i <= cnta; i++) { +// int node = nodeArr[i]; +// colorNodes[++cntc] = node; +// update(cur, edgeCnt[node], pathSum[node], 0, n, 1); +// } +// } +// clear(all, 0, n, 1); +// clear(cur, 0, n, 1); +// return ans; +//} +// +//long long solve(int u) { +// vis[u] = true; +// long long ans = calc(u); +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// ans = max(ans, solve(getCentroid(v, u))); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> limitl >> limitr; +// for (int i = 1; i <= m; i++) { +// cin >> val[i]; +// } +// for (int i = 1, u, v, c; i < n; i++) { +// cin >> u >> v >> c; +// addEdge(u, v, c); +// addEdge(v, u, c); +// } +// build(all, 0, n, 1); +// build(cur, 0, n, 1); +// cout << solve(getCentroid(1, 0)) << '\n'; +// return 0; +//} \ No newline at end of file From 9719573e98b129417a6d07ed2d445596d641d5cb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Nov 2025 16:42:09 +0800 Subject: [PATCH 1054/1170] modify code --- .../{Code02_HardProblem1.java => Code02_Difficult1.java} | 2 +- .../{Code02_HardProblem2.java => Code02_Difficult2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class184/{Code02_HardProblem1.java => Code02_Difficult1.java} (99%) rename src/class184/{Code02_HardProblem2.java => Code02_Difficult2.java} (100%) diff --git a/src/class184/Code02_HardProblem1.java b/src/class184/Code02_Difficult1.java similarity index 99% rename from src/class184/Code02_HardProblem1.java rename to src/class184/Code02_Difficult1.java index c4886fc8b..a7d25bac6 100644 --- a/src/class184/Code02_HardProblem1.java +++ b/src/class184/Code02_Difficult1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code02_HardProblem1 { +public class Code02_Difficult1 { public static int MAXN = 200001; public static long INF = 1L << 60; diff --git a/src/class184/Code02_HardProblem2.java b/src/class184/Code02_Difficult2.java similarity index 100% rename from src/class184/Code02_HardProblem2.java rename to src/class184/Code02_Difficult2.java From a18a68247be2425b69a2d43c41fab21c993653fe Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Nov 2025 16:43:10 +0800 Subject: [PATCH 1055/1170] modify code --- src/class184/Code02_Difficult1.java | 1 - src/class184/Code02_Difficult2.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/class184/Code02_Difficult1.java b/src/class184/Code02_Difficult1.java index a7d25bac6..5c7e6336f 100644 --- a/src/class184/Code02_Difficult1.java +++ b/src/class184/Code02_Difficult1.java @@ -15,7 +15,6 @@ public class Code02_Difficult1 { public static int MAXN = 200001; public static long INF = 1L << 60; public static int n, m, limitl, limitr; - public static int[] val = new int[MAXN]; public static int[] head = new int[MAXN]; diff --git a/src/class184/Code02_Difficult2.java b/src/class184/Code02_Difficult2.java index 50d27ec1e..b95943a40 100644 --- a/src/class184/Code02_Difficult2.java +++ b/src/class184/Code02_Difficult2.java @@ -20,7 +20,6 @@ //const int MAXN = 200001; //const long long INF = 1LL << 60; //int n, m, limitl, limitr; -// //int val[MAXN]; // //int head[MAXN]; From 138b71a8f9b50808a82b27fb7de4f18385a227f3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Nov 2025 11:08:00 +0800 Subject: [PATCH 1056/1170] modify code --- src/class184/Code02_Difficult1.java | 14 +++++++------- src/class184/Code02_Difficult2.java | 14 +++++++------- src/class184/Code03_Freezing1.java | 10 ++++++++++ 3 files changed, 24 insertions(+), 14 deletions(-) create mode 100644 src/class184/Code03_Freezing1.java diff --git a/src/class184/Code02_Difficult1.java b/src/class184/Code02_Difficult1.java index 5c7e6336f..489e06840 100644 --- a/src/class184/Code02_Difficult1.java +++ b/src/class184/Code02_Difficult1.java @@ -40,8 +40,8 @@ public class Code02_Difficult1 { public static int[] nodeArr = new int[MAXN]; public static int cnta; - public static int[] colorNodes = new int[MAXN]; - public static int cntc; + public static int[] bucket = new int[MAXN]; + public static int cntb; // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; @@ -246,17 +246,17 @@ public static long calc(int u) { Arrays.sort(edgeArr, 1, cnte + 1, (a, b) -> a[1] - b[1]); update(all, 0, 0, 0, n, 1); long ans = -INF; - cntc = 0; + cntb = 0; for (int k = 1; k <= cnte; k++) { int v = edgeArr[k][0]; int c = edgeArr[k][1]; if (k > 1 && edgeArr[k - 1][1] != c) { clear(cur, 0, n, 1); - for (int i = 1; i <= cntc; i++) { - int node = colorNodes[i]; + for (int i = 1; i <= cntb; i++) { + int node = bucket[i]; update(all, edgeCnt[node], pathSum[node], 0, n, 1); } - cntc = 0; + cntb = 0; } cnta = 0; // dfs1(v, u, c, 1, val[c]); @@ -270,7 +270,7 @@ public static long calc(int u) { } for (int i = 1; i <= cnta; i++) { int node = nodeArr[i]; - colorNodes[++cntc] = node; + bucket[++cntb] = node; update(cur, edgeCnt[node], pathSum[node], 0, n, 1); } } diff --git a/src/class184/Code02_Difficult2.java b/src/class184/Code02_Difficult2.java index b95943a40..ecedd1b9c 100644 --- a/src/class184/Code02_Difficult2.java +++ b/src/class184/Code02_Difficult2.java @@ -42,8 +42,8 @@ //int nodeArr[MAXN]; //int cnta; // -//int colorNodes[MAXN]; -//int cntc; +//int bucket[MAXN]; +//int cntb; // //void addEdge(int u, int v, int c) { // nxt[++cntg] = head[u]; @@ -160,17 +160,17 @@ // sort(edgeArr + 1, edgeArr + cnte + 1, EdgeCmp); // update(all, 0, 0, 0, n, 1); // long long ans = -INF; -// cntc = 0; +// cntb = 0; // for (int k = 1; k <= cnte; k++) { // int v = edgeArr[k].node; // int c = edgeArr[k].color; // if (k > 1 && edgeArr[k - 1].color != c) { // clear(cur, 0, n, 1); -// for (int i = 1; i <= cntc; i++) { -// int node = colorNodes[i]; +// for (int i = 1; i <= cntb; i++) { +// int node = bucket[i]; // update(all, edgeCnt[node], pathSum[node], 0, n, 1); // } -// cntc = 0; +// cntb = 0; // } // cnta = 0; // dfs(v, u, c, 1, val[c]); @@ -183,7 +183,7 @@ // } // for (int i = 1; i <= cnta; i++) { // int node = nodeArr[i]; -// colorNodes[++cntc] = node; +// bucket[++cntb] = node; // update(cur, edgeCnt[node], pathSum[node], 0, n, 1); // } // } diff --git a/src/class184/Code03_Freezing1.java b/src/class184/Code03_Freezing1.java new file mode 100644 index 000000000..c4428142b --- /dev/null +++ b/src/class184/Code03_Freezing1.java @@ -0,0 +1,10 @@ +package class184; + +// 最大中位数路径,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF150E +// 测试链接 : https://codeforces.com/problemset/problem/150/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code03_Freezing1 { + +} From d0ff12508b9f4a929fde1a23fbf0c74d7c7c83a1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Nov 2025 16:25:46 +0800 Subject: [PATCH 1057/1170] modify code --- src/class184/Code03_Freezing1.java | 245 +++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) diff --git a/src/class184/Code03_Freezing1.java b/src/class184/Code03_Freezing1.java index c4428142b..886ec6006 100644 --- a/src/class184/Code03_Freezing1.java +++ b/src/class184/Code03_Freezing1.java @@ -5,6 +5,251 @@ // 测试链接 : https://codeforces.com/problemset/problem/150/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + public class Code03_Freezing1 { + public static int MAXN = 100001; + public static int INF = 1000000001; + public static int n, limitl, limitr; + + public static int[][] arr = new int[MAXN][3]; + public static int cntw; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + + public static int[][] edgeArr = new int[MAXN][2]; + public static int cnte; + + public static int[] preVal = new int[MAXN]; + public static int[] preNode = new int[MAXN]; + public static int prelen; + + public static int[] curVal = new int[MAXN]; + public static int[] curNode = new int[MAXN]; + public static int curlen; + + public static int[] que = new int[MAXN]; + + public static int ans, ansu, ansv; + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + public static void getSize(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize(v, u); + siz[u] += siz[v]; + } + } + } + + public static int getCentroid(int u, int fa) { + getSize(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void dfs(int u, int fa, int edge, int sum, int limit) { + if (edge > limitr) { + return; + } + curlen = Math.max(curlen, edge); + if (sum > curVal[edge]) { + curVal[edge] = sum; + curNode[edge] = u; + } + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + if (v != fa && !vis[v]) { + dfs(v, u, edge + 1, sum + (w >= limit ? 1 : -1), limit); + } + } + } + + public static boolean check(int u, int limit) { + preVal[0] = 0; + preNode[0] = u; + prelen = 0; + for (int ei = 1; ei <= cnte; ei++) { + int v = to[edgeArr[ei][0]]; + int w = weight[edgeArr[ei][0]]; + for (int i = 1; i <= siz[v]; i++) { + curVal[i] = -INF; + } + curlen = 0; + dfs(v, u, 1, w >= limit ? 1 : -1, limit); + int ql = 1, qr = 0; + for (int i = prelen; i >= limitl; i--) { + while (ql <= qr && preVal[que[qr]] <= preVal[i]) { + qr--; + } + que[++qr] = i; + } + int down = limitr, up = limitl; + for (int i = 1; i <= curlen; i++) { + up--; + if (up >= 0 && up <= prelen) { + while (ql <= qr && preVal[que[qr]] <= preVal[up]) { + qr--; + } + que[++qr] = up; + } + if (ql <= qr && que[ql] == down) { + ql++; + } + down--; + if (ql <= qr && preVal[que[ql]] + curVal[i] >= 0) { + if (limit > ans) { + ans = limit; + ansu = curNode[i]; + ansv = preNode[que[ql]]; + } + return true; + } + } + for (int i = 1; i <= curlen; i++) { + if (i > prelen || curVal[i] > preVal[i]) { + preVal[i] = curVal[i]; + preNode[i] = curNode[i]; + } + } + prelen = Math.max(prelen, curlen); + } + return false; + } + + public static void calc(int u) { + getSize(u, 0); + cnte = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + edgeArr[++cnte][0] = e; + edgeArr[cnte][1] = siz[v]; + } + } + Arrays.sort(edgeArr, 1, cnte + 1, (a, b) -> a[1] - b[1]); + int l = 1, r = cntw, mid; + while (l <= r) { + mid = (l + r) >> 1; + if (check(u, mid)) { + l = mid + 1; + } else { + r = mid - 1; + } + if (r <= ans) { + break; + } + } + } + + public static void solve(int u) { + vis[u] = true; + calc(u); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + solve(getCentroid(v, u)); + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + limitl = in.nextInt(); + limitr = in.nextInt(); + for (int i = 1; i < n; i++) { + arr[i][0] = in.nextInt(); + arr[i][1] = in.nextInt(); + arr[i][2] = in.nextInt(); + } + Arrays.sort(arr, 1, n, (a, b) -> a[2] - b[2]); + cntw = 0; + for (int i = 1; i < n; i++) { + if (i == 1 || arr[i - 1][2] != arr[i][2]) { + cntw++; + } + addEdge(arr[i][0], arr[i][1], cntw); + addEdge(arr[i][1], arr[i][0], cntw); + } + solve(getCentroid(1, 0)); + out.println(ansu + " " + ansv); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From 9ff0f0b2dcc5c65ad14f58de21979dff4289ee74 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Nov 2025 17:42:41 +0800 Subject: [PATCH 1058/1170] modify code --- src/class184/Code03_Freezing1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class184/Code03_Freezing1.java b/src/class184/Code03_Freezing1.java index 886ec6006..3735996f2 100644 --- a/src/class184/Code03_Freezing1.java +++ b/src/class184/Code03_Freezing1.java @@ -161,6 +161,9 @@ public static void calc(int u) { edgeArr[cnte][1] = siz[v]; } } + // 子树按秩排序并处理,秩可以是大小或者高度 + // 如果不这么做,建立窗口阶段,复杂度会爆炸 + // 课上会重点解释 Arrays.sort(edgeArr, 1, cnte + 1, (a, b) -> a[1] - b[1]); int l = 1, r = cntw, mid; while (l <= r) { From f5dea272c9368f62459f8eab2c468c26256fafc5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Nov 2025 17:44:50 +0800 Subject: [PATCH 1059/1170] modify code --- src/class184/Code03_Freezing1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class184/Code03_Freezing1.java b/src/class184/Code03_Freezing1.java index 3735996f2..efcbb0ec1 100644 --- a/src/class184/Code03_Freezing1.java +++ b/src/class184/Code03_Freezing1.java @@ -112,6 +112,7 @@ public static boolean check(int u, int limit) { curlen = 0; dfs(v, u, 1, w >= limit ? 1 : -1, limit); int ql = 1, qr = 0; + // 建立窗口阶段,子树按秩处理非常重要 for (int i = prelen; i >= limitl; i--) { while (ql <= qr && preVal[que[qr]] <= preVal[i]) { qr--; @@ -161,7 +162,7 @@ public static void calc(int u) { edgeArr[cnte][1] = siz[v]; } } - // 子树按秩排序并处理,秩可以是大小或者高度 + // 子树按秩排序,依次处理,秩是大小或者高度 // 如果不这么做,建立窗口阶段,复杂度会爆炸 // 课上会重点解释 Arrays.sort(edgeArr, 1, cnte + 1, (a, b) -> a[1] - b[1]); From f4ad43783e5e4fcace66da973e82281dd52440a8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Nov 2025 20:07:16 +0800 Subject: [PATCH 1060/1170] modify code --- src/class184/Code03_Freezing1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class184/Code03_Freezing1.java b/src/class184/Code03_Freezing1.java index efcbb0ec1..5a4a29aa9 100644 --- a/src/class184/Code03_Freezing1.java +++ b/src/class184/Code03_Freezing1.java @@ -112,7 +112,7 @@ public static boolean check(int u, int limit) { curlen = 0; dfs(v, u, 1, w >= limit ? 1 : -1, limit); int ql = 1, qr = 0; - // 建立窗口阶段,子树按秩处理非常重要 + // 根据之前的信息,初步建立窗口,子树按秩处理非常重要 for (int i = prelen; i >= limitl; i--) { while (ql <= qr && preVal[que[qr]] <= preVal[i]) { qr--; @@ -162,8 +162,8 @@ public static void calc(int u) { edgeArr[cnte][1] = siz[v]; } } - // 子树按秩排序,依次处理,秩是大小或者高度 - // 如果不这么做,建立窗口阶段,复杂度会爆炸 + // 子树按大小或者高度排序,然后依次处理 + // 如果不按秩处理,建立窗口阶段,复杂度会炸 // 课上会重点解释 Arrays.sort(edgeArr, 1, cnte + 1, (a, b) -> a[1] - b[1]); int l = 1, r = cntw, mid; From 238b5e383132a505d6c2edd2b733bcfead45d2bf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 22 Nov 2025 09:34:01 +0800 Subject: [PATCH 1061/1170] modify code --- src/class184/Code02_Difficult1.java | 44 ++++++++++++++--------------- src/class184/Code02_Difficult2.java | 28 +++++++++--------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/class184/Code02_Difficult1.java b/src/class184/Code02_Difficult1.java index 489e06840..44a10900b 100644 --- a/src/class184/Code02_Difficult1.java +++ b/src/class184/Code02_Difficult1.java @@ -24,9 +24,9 @@ public class Code02_Difficult1 { public static int cntg; // 遍历之前子树形成的线段树,维护最大值信息 - public static long[] all = new long[MAXN << 2]; + public static long[] preTree = new long[MAXN << 2]; // 遍历当前子树形成的线段树,维护最大值信息 - public static long[] cur = new long[MAXN << 2]; + public static long[] curTree = new long[MAXN << 2]; public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; @@ -46,14 +46,14 @@ public class Code02_Difficult1 { // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; public static long[] sumst = new long[MAXN]; - public static int u, f, pre, edge, e; + public static int u, f, preColor, edge, e; public static long sum; public static int stacksize; - public static void push(int u, int f, int pre, int edge, long sum, int e) { + public static void push(int u, int f, int preColor, int edge, long sum, int e) { stack[stacksize][0] = u; stack[stacksize][1] = f; - stack[stacksize][2] = pre; + stack[stacksize][2] = preColor; stack[stacksize][3] = edge; stack[stacksize][4] = e; sumst[stacksize] = sum; @@ -64,7 +64,7 @@ public static void pop() { --stacksize; u = stack[stacksize][0]; f = stack[stacksize][1]; - pre = stack[stacksize][2]; + preColor = stack[stacksize][2]; edge = stack[stacksize][3]; e = stack[stacksize][4]; sum = sumst[stacksize]; @@ -189,7 +189,7 @@ public static int getCentroid(int u, int fa) { } // 收集信息递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa, int pre, int edge, long sum) { + public static void dfs1(int u, int fa, int preColor, int edge, long sum) { if (edge > limitr) { return; } @@ -200,15 +200,15 @@ public static void dfs1(int u, int fa, int pre, int edge, long sum) { int v = to[e]; int c = color[e]; if (v != fa && !vis[v]) { - dfs1(v, u, c, edge + 1, sum + (pre == c ? 0 : val[c])); + dfs1(v, u, c, edge + 1, sum + (preColor == c ? 0 : val[c])); } } } // 收集信息迭代版 - public static void dfs2(int cur, int fa, int prec, int pedge, long psum) { + public static void dfs2(int cur, int fa, int pcolor, int pedge, long psum) { stacksize = 0; - push(cur, fa, prec, pedge, psum, -1); + push(cur, fa, pcolor, pedge, psum, -1); while (stacksize > 0) { pop(); if (e == -1) { @@ -223,11 +223,11 @@ public static void dfs2(int cur, int fa, int prec, int pedge, long psum) { e = nxt[e]; } if (e != 0) { - push(u, f, pre, edge, sum, e); + push(u, f, preColor, edge, sum, e); int v = to[e]; int c = color[e]; if (v != f && !vis[v]) { - push(v, u, c, edge + 1, sum + (pre == c ? 0 : val[c]), -1); + push(v, u, c, edge + 1, sum + (preColor == c ? 0 : val[c]), -1); } } } @@ -244,17 +244,17 @@ public static long calc(int u) { } } Arrays.sort(edgeArr, 1, cnte + 1, (a, b) -> a[1] - b[1]); - update(all, 0, 0, 0, n, 1); + update(preTree, 0, 0, 0, n, 1); long ans = -INF; cntb = 0; for (int k = 1; k <= cnte; k++) { int v = edgeArr[k][0]; int c = edgeArr[k][1]; if (k > 1 && edgeArr[k - 1][1] != c) { - clear(cur, 0, n, 1); + clear(curTree, 0, n, 1); for (int i = 1; i <= cntb; i++) { int node = bucket[i]; - update(all, edgeCnt[node], pathSum[node], 0, n, 1); + update(preTree, edgeCnt[node], pathSum[node], 0, n, 1); } cntb = 0; } @@ -265,17 +265,17 @@ public static long calc(int u) { int node = nodeArr[i]; int l = Math.max(0, limitl - edgeCnt[node]); int r = limitr - edgeCnt[node]; - ans = Math.max(ans, query(all, l, r, 0, n, 1) + pathSum[node]); - ans = Math.max(ans, query(cur, l, r, 0, n, 1) + pathSum[node] - val[c]); + ans = Math.max(ans, query(preTree, l, r, 0, n, 1) + pathSum[node]); + ans = Math.max(ans, query(curTree, l, r, 0, n, 1) + pathSum[node] - val[c]); } for (int i = 1; i <= cnta; i++) { int node = nodeArr[i]; bucket[++cntb] = node; - update(cur, edgeCnt[node], pathSum[node], 0, n, 1); + update(curTree, edgeCnt[node], pathSum[node], 0, n, 1); } } - clear(all, 0, n, 1); - clear(cur, 0, n, 1); + clear(preTree, 0, n, 1); + clear(curTree, 0, n, 1); return ans; } @@ -308,8 +308,8 @@ public static void main(String[] args) throws Exception { addEdge(u, v, c); addEdge(v, u, c); } - build(all, 0, n, 1); - build(cur, 0, n, 1); + build(preTree, 0, n, 1); + build(curTree, 0, n, 1); out.println(solve(getCentroid(1, 0))); out.flush(); out.close(); diff --git a/src/class184/Code02_Difficult2.java b/src/class184/Code02_Difficult2.java index ecedd1b9c..fee2142be 100644 --- a/src/class184/Code02_Difficult2.java +++ b/src/class184/Code02_Difficult2.java @@ -28,8 +28,8 @@ //int color[MAXN << 1]; //int cntg; // -//long long all[MAXN << 2]; -//long long cur[MAXN << 2]; +//long long preTree[MAXN << 2]; +//long long curTree[MAXN << 2]; // //bool vis[MAXN]; //int siz[MAXN]; @@ -132,7 +132,7 @@ // return u; //} // -//void dfs(int u, int fa, int pre, int edge, long long sum) { +//void dfs(int u, int fa, int preColor, int edge, long long sum) { // if (edge > limitr) { // return; // } @@ -143,7 +143,7 @@ // int v = to[e]; // int c = color[e]; // if (v != fa && !vis[v]) { -// dfs(v, u, c, edge + 1, sum + (pre == c ? 0 : val[c])); +// dfs(v, u, c, edge + 1, sum + (preColor == c ? 0 : val[c])); // } // } //} @@ -158,17 +158,17 @@ // } // } // sort(edgeArr + 1, edgeArr + cnte + 1, EdgeCmp); -// update(all, 0, 0, 0, n, 1); +// update(preTree, 0, 0, 0, n, 1); // long long ans = -INF; // cntb = 0; // for (int k = 1; k <= cnte; k++) { // int v = edgeArr[k].node; // int c = edgeArr[k].color; // if (k > 1 && edgeArr[k - 1].color != c) { -// clear(cur, 0, n, 1); +// clear(curTree, 0, n, 1); // for (int i = 1; i <= cntb; i++) { // int node = bucket[i]; -// update(all, edgeCnt[node], pathSum[node], 0, n, 1); +// update(preTree, edgeCnt[node], pathSum[node], 0, n, 1); // } // cntb = 0; // } @@ -178,17 +178,17 @@ // int node = nodeArr[i]; // int l = max(0, limitl - edgeCnt[node]); // int r = limitr - edgeCnt[node]; -// ans = max(ans, query(all, l, r, 0, n, 1) + pathSum[node]); -// ans = max(ans, query(cur, l, r, 0, n, 1) + pathSum[node] - val[c]); +// ans = max(ans, query(preTree, l, r, 0, n, 1) + pathSum[node]); +// ans = max(ans, query(curTree, l, r, 0, n, 1) + pathSum[node] - val[c]); // } // for (int i = 1; i <= cnta; i++) { // int node = nodeArr[i]; // bucket[++cntb] = node; -// update(cur, edgeCnt[node], pathSum[node], 0, n, 1); +// update(curTree, edgeCnt[node], pathSum[node], 0, n, 1); // } // } -// clear(all, 0, n, 1); -// clear(cur, 0, n, 1); +// clear(preTree, 0, n, 1); +// clear(curTree, 0, n, 1); // return ans; //} // @@ -216,8 +216,8 @@ // addEdge(u, v, c); // addEdge(v, u, c); // } -// build(all, 0, n, 1); -// build(cur, 0, n, 1); +// build(preTree, 0, n, 1); +// build(curTree, 0, n, 1); // cout << solve(getCentroid(1, 0)) << '\n'; // return 0; //} \ No newline at end of file From ff0e29bf38fc1b0ae5b5daa6b2435c5a731174b2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 22 Nov 2025 16:46:00 +0800 Subject: [PATCH 1062/1170] modify code --- src/class184/Code04_Courier1.java | 250 ++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 src/class184/Code04_Courier1.java diff --git a/src/class184/Code04_Courier1.java b/src/class184/Code04_Courier1.java new file mode 100644 index 000000000..37e62cf49 --- /dev/null +++ b/src/class184/Code04_Courier1.java @@ -0,0 +1,250 @@ +package class184; + +// 快递员,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4886 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code04_Courier1 { + + public static int MAXN = 100001; + public static int n, m; + public static int[] a = new int[MAXN]; + public static int[] b = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + + public static int[] tree = new int[MAXN]; + public static int[] dist = new int[MAXN]; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][5]; + public static int u, f, d, t, e; + public static int stacksize; + + public static void push(int u, int f, int d, int t, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = d; + stack[stacksize][3] = t; + stack[stacksize][4] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + d = stack[stacksize][2]; + t = stack[stacksize][3]; + e = stack[stacksize][4]; + } + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + // 得到子树大小递归版,java会爆栈,C++可以通过 + public static void getSize1(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize1(v, u); + siz[u] += siz[v]; + } + } + } + + // 得到子树大小迭代版 + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, 0, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, 0, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + // 收集信息递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa, int d, int t) { + tree[u] = t; + dist[u] = d; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + // 注意没有vis[v]的判断 + if (v != fa) { + dfs1(v, u, d + weight[e], t); + } + } + } + + // 收集信息迭代版 + public static void dfs2(int cur, int fa, int di, int tr) { + stacksize = 0; + push(cur, fa, di, tr, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + tree[u] = t; + dist[u] = d; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, d, t, e); + int v = to[e]; + // 注意没有vis[v]的判断 + if (v != f) { + push(v, u, d + weight[e], t, -1); + } + } + } + } + + public static int solve(int u) { + vis[u] = true; + tree[u] = u; + dist[u] = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + // dfs1(v, u, w, v); + dfs2(v, u, w, v); + } + int ans = 0, son = 0, cur, t1, t2; + for (int i = 1; i <= m; i++) { + cur = dist[a[i]] + dist[b[i]]; + t1 = tree[a[i]]; + t2 = tree[b[i]]; + if (ans < cur) { + ans = cur; + son = t1 == t2 ? t1 : -1; + } else if (ans == cur && (t1 != t2 || t1 != son)) { + son = -1; + } + } + if (son != -1) { + son = getCentroid(son, u); + if (!vis[son]) { + ans = Math.min(ans, solve(son)); + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); + } + for (int i = 1; i <= m; i++) { + a[i] = in.nextInt(); + b[i] = in.nextInt(); + } + out.println(solve(getCentroid(1, 0))); + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 6cb67d3f4bd572eddfb085fa47e0810a723b9fc1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Nov 2025 22:21:59 +0800 Subject: [PATCH 1063/1170] modify code --- src/class184/Code04_Courier1.java | 57 ++++++++++++++++--------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/class184/Code04_Courier1.java b/src/class184/Code04_Courier1.java index 37e62cf49..9771fd2c7 100644 --- a/src/class184/Code04_Courier1.java +++ b/src/class184/Code04_Courier1.java @@ -125,7 +125,6 @@ public static void dfs1(int u, int fa, int d, int t) { dist[u] = d; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; - // 注意没有vis[v]的判断 if (v != fa) { dfs1(v, u, d + weight[e], t); } @@ -148,7 +147,6 @@ public static void dfs2(int cur, int fa, int di, int tr) { if (e != 0) { push(u, f, d, t, e); int v = to[e]; - // 注意没有vis[v]的判断 if (v != f) { push(v, u, d + weight[e], t, -1); } @@ -156,33 +154,36 @@ public static void dfs2(int cur, int fa, int di, int tr) { } } - public static int solve(int u) { - vis[u] = true; - tree[u] = u; - dist[u] = 0; - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - int w = weight[e]; - // dfs1(v, u, w, v); - dfs2(v, u, w, v); - } - int ans = 0, son = 0, cur, t1, t2; - for (int i = 1; i <= m; i++) { - cur = dist[a[i]] + dist[b[i]]; - t1 = tree[a[i]]; - t2 = tree[b[i]]; - if (ans < cur) { - ans = cur; - son = t1 == t2 ? t1 : -1; - } else if (ans == cur && (t1 != t2 || t1 != son)) { - son = -1; + public static int compute() { + int ans = 1000000001; + int u = getCentroid(1, 0); + while (!vis[u]) { + vis[u] = true; + tree[u] = u; + dist[u] = 0; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + // dfs1(v, u, w, v); + dfs2(v, u, w, v); } - } - if (son != -1) { - son = getCentroid(son, u); - if (!vis[son]) { - ans = Math.min(ans, solve(son)); + int maxDist = 0, son = 0; + for (int i = 1; i <= m; i++) { + int curDist = dist[a[i]] + dist[b[i]]; + int t1 = tree[a[i]]; + int t2 = tree[b[i]]; + if (maxDist < curDist) { + maxDist = curDist; + son = t1 == t2 ? t1 : 0; + } else if (maxDist == curDist && (t1 != t2 || t1 != son)) { + son = 0; + } + } + ans = Math.min(ans, maxDist); + if (son == 0) { + break; } + u = getCentroid(son, u); } return ans; } @@ -203,7 +204,7 @@ public static void main(String[] args) throws Exception { a[i] = in.nextInt(); b[i] = in.nextInt(); } - out.println(solve(getCentroid(1, 0))); + out.println(compute()); out.flush(); out.close(); } From 2496b7365c12c5aaeab15c9c6fb9dd0352b3bde0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 24 Nov 2025 17:38:40 +0800 Subject: [PATCH 1064/1170] modify code --- src/class184/Code01_Capital1.java | 2 +- src/class184/Code02_Difficult1.java | 14 +- src/class184/Code02_Difficult2.java | 12 +- src/class184/Code03_Freezing1.java | 42 ++-- src/class184/Code05_ModeString1.java | 324 +++++++++++++++++++++++++++ 5 files changed, 359 insertions(+), 35 deletions(-) create mode 100644 src/class184/Code05_ModeString1.java diff --git a/src/class184/Code01_Capital1.java b/src/class184/Code01_Capital1.java index ac5dda2cf..e47988f52 100644 --- a/src/class184/Code01_Capital1.java +++ b/src/class184/Code01_Capital1.java @@ -167,7 +167,7 @@ public static void dfs2(int cur, int fa, int root) { push(u, f, rt, e); int v = tog[e]; if (v != f && !vis[v]) { - push(tog[e], u, rt, -1); + push(v, u, rt, -1); } } } diff --git a/src/class184/Code02_Difficult1.java b/src/class184/Code02_Difficult1.java index 44a10900b..5623cfd50 100644 --- a/src/class184/Code02_Difficult1.java +++ b/src/class184/Code02_Difficult1.java @@ -23,8 +23,8 @@ public class Code02_Difficult1 { public static int[] color = new int[MAXN << 1]; public static int cntg; - // 遍历之前子树形成的线段树,维护最大值信息 - public static long[] preTree = new long[MAXN << 2]; + // 遍历之前所有子树形成的线段树,维护最大值信息 + public static long[] allTree = new long[MAXN << 2]; // 遍历当前子树形成的线段树,维护最大值信息 public static long[] curTree = new long[MAXN << 2]; @@ -244,7 +244,7 @@ public static long calc(int u) { } } Arrays.sort(edgeArr, 1, cnte + 1, (a, b) -> a[1] - b[1]); - update(preTree, 0, 0, 0, n, 1); + update(allTree, 0, 0, 0, n, 1); long ans = -INF; cntb = 0; for (int k = 1; k <= cnte; k++) { @@ -254,7 +254,7 @@ public static long calc(int u) { clear(curTree, 0, n, 1); for (int i = 1; i <= cntb; i++) { int node = bucket[i]; - update(preTree, edgeCnt[node], pathSum[node], 0, n, 1); + update(allTree, edgeCnt[node], pathSum[node], 0, n, 1); } cntb = 0; } @@ -265,7 +265,7 @@ public static long calc(int u) { int node = nodeArr[i]; int l = Math.max(0, limitl - edgeCnt[node]); int r = limitr - edgeCnt[node]; - ans = Math.max(ans, query(preTree, l, r, 0, n, 1) + pathSum[node]); + ans = Math.max(ans, query(allTree, l, r, 0, n, 1) + pathSum[node]); ans = Math.max(ans, query(curTree, l, r, 0, n, 1) + pathSum[node] - val[c]); } for (int i = 1; i <= cnta; i++) { @@ -274,7 +274,7 @@ public static long calc(int u) { update(curTree, edgeCnt[node], pathSum[node], 0, n, 1); } } - clear(preTree, 0, n, 1); + clear(allTree, 0, n, 1); clear(curTree, 0, n, 1); return ans; } @@ -308,7 +308,7 @@ public static void main(String[] args) throws Exception { addEdge(u, v, c); addEdge(v, u, c); } - build(preTree, 0, n, 1); + build(allTree, 0, n, 1); build(curTree, 0, n, 1); out.println(solve(getCentroid(1, 0))); out.flush(); diff --git a/src/class184/Code02_Difficult2.java b/src/class184/Code02_Difficult2.java index fee2142be..2a2afebd5 100644 --- a/src/class184/Code02_Difficult2.java +++ b/src/class184/Code02_Difficult2.java @@ -28,7 +28,7 @@ //int color[MAXN << 1]; //int cntg; // -//long long preTree[MAXN << 2]; +//long long allTree[MAXN << 2]; //long long curTree[MAXN << 2]; // //bool vis[MAXN]; @@ -158,7 +158,7 @@ // } // } // sort(edgeArr + 1, edgeArr + cnte + 1, EdgeCmp); -// update(preTree, 0, 0, 0, n, 1); +// update(allTree, 0, 0, 0, n, 1); // long long ans = -INF; // cntb = 0; // for (int k = 1; k <= cnte; k++) { @@ -168,7 +168,7 @@ // clear(curTree, 0, n, 1); // for (int i = 1; i <= cntb; i++) { // int node = bucket[i]; -// update(preTree, edgeCnt[node], pathSum[node], 0, n, 1); +// update(allTree, edgeCnt[node], pathSum[node], 0, n, 1); // } // cntb = 0; // } @@ -178,7 +178,7 @@ // int node = nodeArr[i]; // int l = max(0, limitl - edgeCnt[node]); // int r = limitr - edgeCnt[node]; -// ans = max(ans, query(preTree, l, r, 0, n, 1) + pathSum[node]); +// ans = max(ans, query(allTree, l, r, 0, n, 1) + pathSum[node]); // ans = max(ans, query(curTree, l, r, 0, n, 1) + pathSum[node] - val[c]); // } // for (int i = 1; i <= cnta; i++) { @@ -187,7 +187,7 @@ // update(curTree, edgeCnt[node], pathSum[node], 0, n, 1); // } // } -// clear(preTree, 0, n, 1); +// clear(allTree, 0, n, 1); // clear(curTree, 0, n, 1); // return ans; //} @@ -216,7 +216,7 @@ // addEdge(u, v, c); // addEdge(v, u, c); // } -// build(preTree, 0, n, 1); +// build(allTree, 0, n, 1); // build(curTree, 0, n, 1); // cout << solve(getCentroid(1, 0)) << '\n'; // return 0; diff --git a/src/class184/Code03_Freezing1.java b/src/class184/Code03_Freezing1.java index 5a4a29aa9..05856d8dd 100644 --- a/src/class184/Code03_Freezing1.java +++ b/src/class184/Code03_Freezing1.java @@ -32,13 +32,13 @@ public class Code03_Freezing1 { public static int[][] edgeArr = new int[MAXN][2]; public static int cnte; - public static int[] preVal = new int[MAXN]; - public static int[] preNode = new int[MAXN]; - public static int prelen; + public static int[] allVal = new int[MAXN]; + public static int[] allNode = new int[MAXN]; + public static int allLen; public static int[] curVal = new int[MAXN]; public static int[] curNode = new int[MAXN]; - public static int curlen; + public static int curLen; public static int[] que = new int[MAXN]; @@ -85,7 +85,7 @@ public static void dfs(int u, int fa, int edge, int sum, int limit) { if (edge > limitr) { return; } - curlen = Math.max(curlen, edge); + curLen = Math.max(curLen, edge); if (sum > curVal[edge]) { curVal[edge] = sum; curNode[edge] = u; @@ -100,30 +100,30 @@ public static void dfs(int u, int fa, int edge, int sum, int limit) { } public static boolean check(int u, int limit) { - preVal[0] = 0; - preNode[0] = u; - prelen = 0; + allVal[0] = 0; + allNode[0] = u; + allLen = 0; for (int ei = 1; ei <= cnte; ei++) { int v = to[edgeArr[ei][0]]; int w = weight[edgeArr[ei][0]]; for (int i = 1; i <= siz[v]; i++) { curVal[i] = -INF; } - curlen = 0; + curLen = 0; dfs(v, u, 1, w >= limit ? 1 : -1, limit); int ql = 1, qr = 0; // 根据之前的信息,初步建立窗口,子树按秩处理非常重要 - for (int i = prelen; i >= limitl; i--) { - while (ql <= qr && preVal[que[qr]] <= preVal[i]) { + for (int i = allLen; i >= limitl; i--) { + while (ql <= qr && allVal[que[qr]] <= allVal[i]) { qr--; } que[++qr] = i; } int down = limitr, up = limitl; - for (int i = 1; i <= curlen; i++) { + for (int i = 1; i <= curLen; i++) { up--; - if (up >= 0 && up <= prelen) { - while (ql <= qr && preVal[que[qr]] <= preVal[up]) { + if (up >= 0 && up <= allLen) { + while (ql <= qr && allVal[que[qr]] <= allVal[up]) { qr--; } que[++qr] = up; @@ -132,22 +132,22 @@ public static boolean check(int u, int limit) { ql++; } down--; - if (ql <= qr && preVal[que[ql]] + curVal[i] >= 0) { + if (ql <= qr && allVal[que[ql]] + curVal[i] >= 0) { if (limit > ans) { ans = limit; ansu = curNode[i]; - ansv = preNode[que[ql]]; + ansv = allNode[que[ql]]; } return true; } } - for (int i = 1; i <= curlen; i++) { - if (i > prelen || curVal[i] > preVal[i]) { - preVal[i] = curVal[i]; - preNode[i] = curNode[i]; + for (int i = 1; i <= curLen; i++) { + if (i > allLen || curVal[i] > allVal[i]) { + allVal[i] = curVal[i]; + allNode[i] = curNode[i]; } } - prelen = Math.max(prelen, curlen); + allLen = Math.max(allLen, curLen); } return false; } diff --git a/src/class184/Code05_ModeString1.java b/src/class184/Code05_ModeString1.java new file mode 100644 index 000000000..80bb5b7b3 --- /dev/null +++ b/src/class184/Code05_ModeString1.java @@ -0,0 +1,324 @@ +package class184; + +// 模式字符串,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4075 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code05_ModeString1 { + + public static int MAXN = 100001; + public static final int MOD = 1000000007; + public static final int BASE = 499; + public static int t, n, m; + + public static char[] val = new char[MAXN]; + public static char[] str = new char[MAXN]; + public static int[] a = new int[MAXN]; + public static int[] b = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static long[] strPre = new long[MAXN]; + public static long[] strSuf = new long[MAXN]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + + public static int[] deep = new int[MAXN]; + public static long[] curPre = new long[MAXN]; + public static long[] curSuf = new long[MAXN]; + public static long[] allPre = new long[MAXN]; + public static long[] allSuf = new long[MAXN]; + + public static long ans; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][4]; + public static long[] hashst = new long[MAXN]; + public static int u, f, dep, e; + public static long hash; + public static int stacksize; + + public static void push(int u, int f, int dep, long hash, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = dep; + stack[stacksize][3] = e; + hashst[stacksize] = hash; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + dep = stack[stacksize][2]; + e = stack[stacksize][3]; + hash = hashst[stacksize]; + } + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + // 得到子树大小递归版,java会爆栈,C++可以通过 + public static void getSize1(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize1(v, u); + siz[u] += siz[v]; + } + } + } + + // 得到子树大小迭代版 + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, 0, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, 0, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + // 收集信息 + 结算答案递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa, int dep, long hash) { + deep[u] = dep; + hash = (hash * BASE + val[u] - 'A' + 1) % MOD; + if (hash == strPre[dep]) { + curPre[(dep - 1) % m + 1]++; + ans += allSuf[m - (dep - 1) % m]; + } + if (hash == strSuf[dep]) { + curSuf[(dep - 1) % m + 1]++; + ans += allPre[m - (dep - 1) % m]; + } + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + dfs1(v, u, dep + 1, hash); + deep[u] = Math.max(deep[u], deep[v]); + } + } + } + + // 收集信息 + 结算答案迭代版 + public static void dfs2(int cur, int fa, int pdep, long phash) { + stacksize = 0; + push(cur, fa, pdep, phash, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + deep[u] = dep; + hash = (hash * BASE + val[u] - 'A' + 1) % MOD; + if (hash == strPre[dep]) { + curPre[(dep - 1) % m + 1]++; + ans += allSuf[m - (dep - 1) % m]; + } + if (hash == strSuf[dep]) { + curSuf[(dep - 1) % m + 1]++; + ans += allPre[m - (dep - 1) % m]; + } + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, dep, hash, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, dep + 1, hash, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + deep[u] = Math.max(deep[u], deep[v]); + } + } + } + } + } + + public static void calc(int u) { + int maxDep = 0; + allPre[1] = allSuf[1] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + // dfs1(v, u, 2, arr[u] - 'A' + 1); + dfs2(v, u, 2, val[u] - 'A' + 1); + int curDep = Math.min(deep[v], m); + for (int i = 1; i <= curDep; i++) { + allPre[i] += curPre[i]; + allSuf[i] += curSuf[i]; + curPre[i] = curSuf[i] = 0; + } + maxDep = Math.max(maxDep, curDep); + } + } + for (int i = 1; i <= maxDep; i++) { + allPre[i] = allSuf[i] = 0; + } + } + + public static void solve(int u) { + vis[u] = true; + calc(u); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + solve(getCentroid(v, u)); + } + } + } + + public static void prepare() { + cntg = 0; + ans = 0; + for (int i = 1; i <= n; i++) { + head[i] = 0; + vis[i] = false; + } + for (int i = 1; i < n; i++) { + addEdge(a[i], b[i]); + addEdge(b[i], a[i]); + } + long tmp = 1; + for (int i = 1; i <= n; i++) { + strPre[i] = (strPre[i - 1] + tmp * (str[(i - 1) % m + 1] - 'A' + 1)) % MOD; + strSuf[i] = (strSuf[i - 1] + tmp * (str[m - (i - 1) % m] - 'A' + 1)) % MOD; + tmp = tmp * BASE % MOD; + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + t = in.nextInt(); + for (int c = 1; c <= t; c++) { + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + val[i] = in.nextUpperCase(); + } + for (int i = 1; i < n; i++) { + a[i] = in.nextInt(); + b[i] = in.nextInt(); + } + for (int i = 1; i <= m; i++) { + str[i] = in.nextUpperCase(); + } + prepare(); + solve(getCentroid(1, 0)); + out.println(ans); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextUpperCase() throws IOException { + int c; + while (true) { + c = readByte(); + if (c >= 'A' && c <= 'Z') + return (char) c; + } + } + + public int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + + } + +} From d071a1f3e9a2117454d5d7a2aa0817dbf485dde3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 09:31:55 +0800 Subject: [PATCH 1065/1170] modify code --- src/class184/Code05_ModeString1.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class184/Code05_ModeString1.java b/src/class184/Code05_ModeString1.java index 80bb5b7b3..ccf1eef7a 100644 --- a/src/class184/Code05_ModeString1.java +++ b/src/class184/Code05_ModeString1.java @@ -26,8 +26,8 @@ public class Code05_ModeString1 { public static int[] to = new int[MAXN << 1]; public static int cntg; - public static long[] strPre = new long[MAXN]; - public static long[] strSuf = new long[MAXN]; + public static long[] pre = new long[MAXN]; + public static long[] suf = new long[MAXN]; public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; @@ -136,11 +136,11 @@ public static int getCentroid(int u, int fa) { public static void dfs1(int u, int fa, int dep, long hash) { deep[u] = dep; hash = (hash * BASE + val[u] - 'A' + 1) % MOD; - if (hash == strPre[dep]) { + if (hash == pre[dep]) { curPre[(dep - 1) % m + 1]++; ans += allSuf[m - (dep - 1) % m]; } - if (hash == strSuf[dep]) { + if (hash == suf[dep]) { curSuf[(dep - 1) % m + 1]++; ans += allPre[m - (dep - 1) % m]; } @@ -162,11 +162,11 @@ public static void dfs2(int cur, int fa, int pdep, long phash) { if (e == -1) { deep[u] = dep; hash = (hash * BASE + val[u] - 'A' + 1) % MOD; - if (hash == strPre[dep]) { + if (hash == pre[dep]) { curPre[(dep - 1) % m + 1]++; ans += allSuf[m - (dep - 1) % m]; } - if (hash == strSuf[dep]) { + if (hash == suf[dep]) { curSuf[(dep - 1) % m + 1]++; ans += allPre[m - (dep - 1) % m]; } @@ -237,8 +237,8 @@ public static void prepare() { } long tmp = 1; for (int i = 1; i <= n; i++) { - strPre[i] = (strPre[i - 1] + tmp * (str[(i - 1) % m + 1] - 'A' + 1)) % MOD; - strSuf[i] = (strSuf[i - 1] + tmp * (str[m - (i - 1) % m] - 'A' + 1)) % MOD; + pre[i] = (pre[i - 1] + tmp * (str[(i - 1) % m + 1] - 'A' + 1)) % MOD; + suf[i] = (suf[i - 1] + tmp * (str[m - (i - 1) % m] - 'A' + 1)) % MOD; tmp = tmp * BASE % MOD; } } From da83d16d15f861ed321bd24b68c5e5a534144bea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 11:03:20 +0800 Subject: [PATCH 1066/1170] modify code --- src/class184/{Code04_Courier1.java => Code03_Courier1.java} | 2 +- src/class184/{Code03_Freezing1.java => Code05_Freezing1.java} | 2 +- .../{Code05_ModeString1.java => Code07_ModeString1.java} | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/class184/{Code04_Courier1.java => Code03_Courier1.java} (99%) rename src/class184/{Code03_Freezing1.java => Code05_Freezing1.java} (99%) rename src/class184/{Code05_ModeString1.java => Code07_ModeString1.java} (99%) diff --git a/src/class184/Code04_Courier1.java b/src/class184/Code03_Courier1.java similarity index 99% rename from src/class184/Code04_Courier1.java rename to src/class184/Code03_Courier1.java index 9771fd2c7..22ce1f6e7 100644 --- a/src/class184/Code04_Courier1.java +++ b/src/class184/Code03_Courier1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_Courier1 { +public class Code03_Courier1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class184/Code03_Freezing1.java b/src/class184/Code05_Freezing1.java similarity index 99% rename from src/class184/Code03_Freezing1.java rename to src/class184/Code05_Freezing1.java index 05856d8dd..e97e0ce80 100644 --- a/src/class184/Code03_Freezing1.java +++ b/src/class184/Code05_Freezing1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code03_Freezing1 { +public class Code05_Freezing1 { public static int MAXN = 100001; public static int INF = 1000000001; diff --git a/src/class184/Code05_ModeString1.java b/src/class184/Code07_ModeString1.java similarity index 99% rename from src/class184/Code05_ModeString1.java rename to src/class184/Code07_ModeString1.java index ccf1eef7a..7df476582 100644 --- a/src/class184/Code05_ModeString1.java +++ b/src/class184/Code07_ModeString1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_ModeString1 { +public class Code07_ModeString1 { public static int MAXN = 100001; public static final int MOD = 1000000007; From 5db2528ae1f2bc3ca03f43d8e42db06c14e5d7f2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 14:34:18 +0800 Subject: [PATCH 1067/1170] modify code --- ...deString1.java => Code06_ModeString1.java} | 2 +- src/class184/Code07_TreeDistance1.java | 361 ++++++++++++++++++ src/class184/Code07_TreeDistance2.java | 206 ++++++++++ 3 files changed, 568 insertions(+), 1 deletion(-) rename src/class184/{Code07_ModeString1.java => Code06_ModeString1.java} (99%) create mode 100644 src/class184/Code07_TreeDistance1.java create mode 100644 src/class184/Code07_TreeDistance2.java diff --git a/src/class184/Code07_ModeString1.java b/src/class184/Code06_ModeString1.java similarity index 99% rename from src/class184/Code07_ModeString1.java rename to src/class184/Code06_ModeString1.java index 7df476582..ea7655f07 100644 --- a/src/class184/Code07_ModeString1.java +++ b/src/class184/Code06_ModeString1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code07_ModeString1 { +public class Code06_ModeString1 { public static int MAXN = 100001; public static final int MOD = 1000000007; diff --git a/src/class184/Code07_TreeDistance1.java b/src/class184/Code07_TreeDistance1.java new file mode 100644 index 000000000..14c915c57 --- /dev/null +++ b/src/class184/Code07_TreeDistance1.java @@ -0,0 +1,361 @@ +package class184; + +// 支配点对的距离,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P9678 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code07_TreeDistance1 { + + public static int MAXN = 200001; + public static int MAXM = 1000001; + public static int MAXK = 10000001; + public static long INF = 1L << 60; + public static int n, m; + public static int[] queryl = new int[MAXM]; + public static int[] queryr = new int[MAXM]; + public static int[] queryid = new int[MAXM]; + + public static int[] keyl = new int[MAXK]; + public static int[] keyr = new int[MAXK]; + public static long[] keyDist = new long[MAXK]; + public static int cntk; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + + public static long[] dist = new long[MAXN]; + public static int[] nodeArr = new int[MAXN]; + public static int cnta; + public static int[] sta = new int[MAXN]; + public static long[] tree = new long[MAXN]; + + public static long[] ans = new long[MAXM]; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][3]; + public static long[] distst = new long[MAXN]; + public static int u, f, e; + public static long dis; + public static int stacksize; + + public static void push(int u, int f, long dis, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = e; + distst[stacksize] = dis; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + e = stack[stacksize][2]; + dis = distst[stacksize]; + } + + public static void sortQuery(int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = queryl[(l + r) >> 1], tmp; + while (i <= j) { + while (queryl[i] > pivot) i++; + while (queryl[j] < pivot) j--; + if (i <= j) { + tmp = queryl[i]; queryl[i] = queryl[j]; queryl[j] = tmp; + tmp = queryr[i]; queryr[i] = queryr[j]; queryr[j] = tmp; + tmp = queryid[i]; queryid[i] = queryid[j]; queryid[j] = tmp; + i++; j--; + } + } + sortQuery(l, j); + sortQuery(i, r); + } + + public static void sortKey(int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = keyl[(l + r) >> 1]; + while (i <= j) { + while (keyl[i] > pivot) i++; + while (keyl[j] < pivot) j--; + if (i <= j) { + int t1 = keyl[i]; keyl[i] = keyl[j]; keyl[j] = t1; + t1 = keyr[i]; keyr[i] = keyr[j]; keyr[j] = t1; + long t2 = keyDist[i]; keyDist[i] = keyDist[j]; keyDist[j] = t2; + i++; j--; + } + } + sortKey(l, j); + sortKey(i, r); + } + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + // 得到子树大小递归版,java会爆栈,C++可以通过 + public static void getSize1(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize1(v, u); + siz[u] += siz[v]; + } + } + } + + // 得到子树大小迭代版 + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + // 收集信息递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa, long dis) { + dist[u] = dis; + nodeArr[++cnta] = u; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + if (v != fa && !vis[v]) { + dfs1(v, u, dis + w); + } + } + } + + // 收集信息迭代版 + public static void dfs2(int cur, int fa, long d) { + stacksize = 0; + push(cur, fa, d, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dist[u] = dis; + nodeArr[++cnta] = u; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, dis, e); + int v = to[e]; + int w = weight[e]; + if (v != f && !vis[v]) { + push(v, u, dis + w, -1); + } + } + } + } + + public static void addKey(int kl, int kr, long kdist) { + keyl[++cntk] = kl; + keyr[cntk] = kr; + keyDist[cntk] = kdist; + } + + public static void calc(int u) { + cnta = 0; + dist[u] = 0; + nodeArr[++cnta] = u; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + if (!vis[v]) { + // dfs1(v, u, w); + dfs2(v, u, w); + } + } + Arrays.sort(nodeArr, 1, cnta + 1); + int top = 0; + for (int i = 1; i <= cnta; i++) { + int cur = nodeArr[i]; + while (top > 0 && dist[sta[top]] >= dist[cur]) { + addKey(sta[top], cur, dist[sta[top]] + dist[cur]); + top--; + } + if (top > 0) { + addKey(sta[top], cur, dist[sta[top]] + dist[cur]); + } + sta[++top] = cur; + } + } + + public static void solve(int u) { + vis[u] = true; + calc(u); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + solve(getCentroid(v, u)); + } + } + } + + public static void buildTree() { + for (int i = 1; i <= n; i++) { + tree[i] = INF; + } + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, long v) { + while (i <= n) { + tree[i] = Math.min(tree[i], v); + i += lowbit(i); + } + } + + public static long query(int i) { + long ret = INF; + while (i > 0) { + ret = Math.min(ret, tree[i]); + i -= lowbit(i); + } + return ret; + } + + public static void compute() { + solve(getCentroid(1, 0)); + sortQuery(1, m); + sortKey(1, cntk); + buildTree(); + int idx = 1; + for (int i = 1; i <= m; i++) { + while (idx <= cntk && keyl[idx] >= queryl[i]) { + add(keyr[idx], keyDist[idx]); + idx++; + } + if (queryl[i] == queryr[i]) { + ans[queryid[i]] = -1; + } else { + ans[queryid[i]] = query(queryr[i]); + } + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); + } + m = in.nextInt(); + for (int i = 1; i <= m; i++) { + queryl[i] = in.nextInt(); + queryr[i] = in.nextInt(); + queryid[i] = i; + } + compute(); + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class184/Code07_TreeDistance2.java b/src/class184/Code07_TreeDistance2.java new file mode 100644 index 000000000..bf680d6d7 --- /dev/null +++ b/src/class184/Code07_TreeDistance2.java @@ -0,0 +1,206 @@ +package class184; + +// 支配点对的距离,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P9678 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Query { +// int l, r, id; +//}; +// +//struct Key { +// int l, r; +// long long dist; +//}; +// +//bool QueryCmp(Query a, Query b) { +// return a.l > b.l; +//} +// +//bool KeyCmp(Key a, Key b) { +// return a.l > b.l; +//} +// +//const int MAXN = 200001; +//const int MAXM = 1000001; +//const int MAXK = 10000001; +//const long long INF = 1LL << 60; +//int n, m; +//Query queryArr[MAXM]; +// +//Key keyArr[MAXK]; +//int cntk; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +// +//long long dist[MAXN]; +//int nodeArr[MAXN]; +//int cnta; +//int sta[MAXN]; +//long long tree[MAXN]; +// +//long long ans[MAXM]; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void dfs(int u, int fa, long long dis) { +// dist[u] = dis; +// nodeArr[++cnta] = u; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, dis + w); +// } +// } +//} +// +//void calc(int u) { +// cnta = 0; +// dist[u] = 0; +// nodeArr[++cnta] = u; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// if (!vis[v]) { +// dfs(v, u, w); +// } +// } +// sort(nodeArr + 1, nodeArr + cnta + 1); +// int top = 0; +// for (int i = 1; i <= cnta; i++) { +// int cur = nodeArr[i]; +// while (top > 0 && dist[sta[top]] >= dist[cur]) { +// keyArr[++cntk] = { sta[top], cur, dist[sta[top]] + dist[cur] }; +// top--; +// } +// if (top > 0) { +// keyArr[++cntk] = { sta[top], cur, dist[sta[top]] + dist[cur] }; +// } +// sta[++top] = cur; +// } +//} +// +//void solve(int u) { +// vis[u] = true; +// calc(u); +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// solve(getCentroid(v, u)); +// } +// } +//} +// +//void buildTree() { +// for (int i = 1; i <= n; i++) { +// tree[i] = INF; +// } +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, long long v) { +// while (i <= n) { +// tree[i] = min(tree[i], v); +// i += lowbit(i); +// } +//} +// +//long long query(int i) { +// long long ret = INF; +// while (i > 0) { +// ret = min(ret, tree[i]); +// i -= lowbit(i); +// } +// return ret; +//} +// +//void compute() { +// solve(getCentroid(1, 0)); +// sort(queryArr + 1, queryArr + m + 1, QueryCmp); +// sort(keyArr + 1, keyArr + cntk + 1, KeyCmp); +// buildTree(); +// int idx = 1; +// for (int i = 1; i <= m; i++) { +// while (idx <= cntk && keyArr[idx].l >= queryArr[i].l) { +// add(keyArr[idx].r, keyArr[idx].dist); +// idx++; +// } +// if (queryArr[i].l == queryArr[i].r) { +// ans[queryArr[i].id] = -1; +// } else { +// ans[queryArr[i].id] = query(queryArr[i].r); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); +// } +// cin >> m; +// for (int i = 1; i <= m; i++) { +// cin >> queryArr[i].l >> queryArr[i].r; +// queryArr[i].id = i; +// } +// compute(); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From f432af58eef482a76c8f10ae9afb98d16327531c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 14:39:24 +0800 Subject: [PATCH 1068/1170] modify code --- src/class184/Code07_TreeDistance1.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/class184/Code07_TreeDistance1.java b/src/class184/Code07_TreeDistance1.java index 14c915c57..cdfd4defc 100644 --- a/src/class184/Code07_TreeDistance1.java +++ b/src/class184/Code07_TreeDistance1.java @@ -66,6 +66,7 @@ public static void pop() { dis = distst[stacksize]; } + // 查询根据l从大到小排序,java自带的排序慢,手撸双指针快排 public static void sortQuery(int l, int r) { if (l >= r) return; int i = l, j = r, pivot = queryl[(l + r) >> 1], tmp; @@ -83,16 +84,18 @@ public static void sortQuery(int l, int r) { sortQuery(i, r); } + // 关键点对根据l从大到小排序,java自带的排序慢,手撸双指针快排 public static void sortKey(int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = keyl[(l + r) >> 1]; + int i = l, j = r, pivot = keyl[(l + r) >> 1], t1; + long t2; while (i <= j) { while (keyl[i] > pivot) i++; while (keyl[j] < pivot) j--; if (i <= j) { - int t1 = keyl[i]; keyl[i] = keyl[j]; keyl[j] = t1; + t1 = keyl[i]; keyl[i] = keyl[j]; keyl[j] = t1; t1 = keyr[i]; keyr[i] = keyr[j]; keyr[j] = t1; - long t2 = keyDist[i]; keyDist[i] = keyDist[j]; keyDist[j] = t2; + t2 = keyDist[i]; keyDist[i] = keyDist[j]; keyDist[j] = t2; i++; j--; } } From 18af7f6fa49d8a51d81c348dd695ef59d79560a7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 15:42:34 +0800 Subject: [PATCH 1069/1170] modify code --- src/class184/Code04_Shopping1.java | 8 ++++++++ src/class184/Code07_TreeDistance1.java | 12 ++---------- src/class184/Code07_TreeDistance2.java | 10 +--------- 3 files changed, 11 insertions(+), 19 deletions(-) create mode 100644 src/class184/Code04_Shopping1.java diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java new file mode 100644 index 000000000..fed2d4c35 --- /dev/null +++ b/src/class184/Code04_Shopping1.java @@ -0,0 +1,8 @@ +package class184; + +// 树上购物,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P6326 + +public class Code04_Shopping1 { + +} diff --git a/src/class184/Code07_TreeDistance1.java b/src/class184/Code07_TreeDistance1.java index cdfd4defc..9cd699721 100644 --- a/src/class184/Code07_TreeDistance1.java +++ b/src/class184/Code07_TreeDistance1.java @@ -216,16 +216,8 @@ public static void addKey(int kl, int kr, long kdist) { public static void calc(int u) { cnta = 0; - dist[u] = 0; - nodeArr[++cnta] = u; - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - int w = weight[e]; - if (!vis[v]) { - // dfs1(v, u, w); - dfs2(v, u, w); - } - } + // dfs1(u, 0, 0); + dfs2(u, 0, 0); Arrays.sort(nodeArr, 1, cnta + 1); int top = 0; for (int i = 1; i <= cnta; i++) { diff --git a/src/class184/Code07_TreeDistance2.java b/src/class184/Code07_TreeDistance2.java index bf680d6d7..896b4c15b 100644 --- a/src/class184/Code07_TreeDistance2.java +++ b/src/class184/Code07_TreeDistance2.java @@ -104,15 +104,7 @@ // //void calc(int u) { // cnta = 0; -// dist[u] = 0; -// nodeArr[++cnta] = u; -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// int w = weight[e]; -// if (!vis[v]) { -// dfs(v, u, w); -// } -// } +// dfs(u, 0, 0); // sort(nodeArr + 1, nodeArr + cnta + 1); // int top = 0; // for (int i = 1; i <= cnta; i++) { From 6b1e1f739aa5105c348ebcbf27542bdc06f44c71 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 16:07:27 +0800 Subject: [PATCH 1070/1170] modify code --- src/class184/Code07_TreeDistance1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class184/Code07_TreeDistance1.java b/src/class184/Code07_TreeDistance1.java index 9cd699721..300c4b445 100644 --- a/src/class184/Code07_TreeDistance1.java +++ b/src/class184/Code07_TreeDistance1.java @@ -66,7 +66,7 @@ public static void pop() { dis = distst[stacksize]; } - // 查询根据l从大到小排序,java自带的排序慢,手撸双指针快排 + // 所有查询,根据l的值,从大到小排序,java自带的排序慢,手撸双指针快排 public static void sortQuery(int l, int r) { if (l >= r) return; int i = l, j = r, pivot = queryl[(l + r) >> 1], tmp; @@ -84,7 +84,7 @@ public static void sortQuery(int l, int r) { sortQuery(i, r); } - // 关键点对根据l从大到小排序,java自带的排序慢,手撸双指针快排 + // 所有关键点,根据l的值,从大到小排序,java自带的排序慢,手撸双指针快排 public static void sortKey(int l, int r) { if (l >= r) return; int i = l, j = r, pivot = keyl[(l + r) >> 1], t1; From 118e9af394b35378f69ec2171360d769c536f662 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 16:09:54 +0800 Subject: [PATCH 1071/1170] modify code --- src/class184/Code07_TreeDistance1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class184/Code07_TreeDistance1.java b/src/class184/Code07_TreeDistance1.java index 300c4b445..b708d7d6e 100644 --- a/src/class184/Code07_TreeDistance1.java +++ b/src/class184/Code07_TreeDistance1.java @@ -19,7 +19,7 @@ public class Code07_TreeDistance1 { public static int n, m; public static int[] queryl = new int[MAXM]; public static int[] queryr = new int[MAXM]; - public static int[] queryid = new int[MAXM]; + public static int[] queryId = new int[MAXM]; public static int[] keyl = new int[MAXK]; public static int[] keyr = new int[MAXK]; @@ -76,7 +76,7 @@ public static void sortQuery(int l, int r) { if (i <= j) { tmp = queryl[i]; queryl[i] = queryl[j]; queryl[j] = tmp; tmp = queryr[i]; queryr[i] = queryr[j]; queryr[j] = tmp; - tmp = queryid[i]; queryid[i] = queryid[j]; queryid[j] = tmp; + tmp = queryId[i]; queryId[i] = queryId[j]; queryId[j] = tmp; i++; j--; } } @@ -282,9 +282,9 @@ public static void compute() { idx++; } if (queryl[i] == queryr[i]) { - ans[queryid[i]] = -1; + ans[queryId[i]] = -1; } else { - ans[queryid[i]] = query(queryr[i]); + ans[queryId[i]] = query(queryr[i]); } } } @@ -304,7 +304,7 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= m; i++) { queryl[i] = in.nextInt(); queryr[i] = in.nextInt(); - queryid[i] = i; + queryId[i] = i; } compute(); for (int i = 1; i <= m; i++) { From adb602eee9791b5f1a694b8bb6f6de336c9b43b4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 16:12:25 +0800 Subject: [PATCH 1072/1170] modify code --- .../{Code07_TreeDistance1.java => Code05_TreeDistance1.java} | 2 +- .../{Code07_TreeDistance2.java => Code05_TreeDistance2.java} | 0 src/class184/{Code05_Freezing1.java => Code06_Freezing1.java} | 2 +- .../{Code06_ModeString1.java => Code07_ModeString1.java} | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename src/class184/{Code07_TreeDistance1.java => Code05_TreeDistance1.java} (99%) rename src/class184/{Code07_TreeDistance2.java => Code05_TreeDistance2.java} (100%) rename src/class184/{Code05_Freezing1.java => Code06_Freezing1.java} (99%) rename src/class184/{Code06_ModeString1.java => Code07_ModeString1.java} (99%) diff --git a/src/class184/Code07_TreeDistance1.java b/src/class184/Code05_TreeDistance1.java similarity index 99% rename from src/class184/Code07_TreeDistance1.java rename to src/class184/Code05_TreeDistance1.java index b708d7d6e..cd9ddb5d3 100644 --- a/src/class184/Code07_TreeDistance1.java +++ b/src/class184/Code05_TreeDistance1.java @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code07_TreeDistance1 { +public class Code05_TreeDistance1 { public static int MAXN = 200001; public static int MAXM = 1000001; diff --git a/src/class184/Code07_TreeDistance2.java b/src/class184/Code05_TreeDistance2.java similarity index 100% rename from src/class184/Code07_TreeDistance2.java rename to src/class184/Code05_TreeDistance2.java diff --git a/src/class184/Code05_Freezing1.java b/src/class184/Code06_Freezing1.java similarity index 99% rename from src/class184/Code05_Freezing1.java rename to src/class184/Code06_Freezing1.java index e97e0ce80..111cd7b70 100644 --- a/src/class184/Code05_Freezing1.java +++ b/src/class184/Code06_Freezing1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_Freezing1 { +public class Code06_Freezing1 { public static int MAXN = 100001; public static int INF = 1000000001; diff --git a/src/class184/Code06_ModeString1.java b/src/class184/Code07_ModeString1.java similarity index 99% rename from src/class184/Code06_ModeString1.java rename to src/class184/Code07_ModeString1.java index ea7655f07..7df476582 100644 --- a/src/class184/Code06_ModeString1.java +++ b/src/class184/Code07_ModeString1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code06_ModeString1 { +public class Code07_ModeString1 { public static int MAXN = 100001; public static final int MOD = 1000000007; From 5876c7dab77354830477eafed0948a48d5a8f3db Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 17:45:08 +0800 Subject: [PATCH 1073/1170] modify code --- src/class184/Code04_Shopping1.java | 209 +++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index fed2d4c35..5d1b3c511 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -2,7 +2,216 @@ // 树上购物,java版 // 测试链接 : https://www.luogu.com.cn/problem/P6326 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; public class Code04_Shopping1 { + public static int MAXN = 1001; + public static int MAXM = 4001; + public static int INF = 1000000001; + public static int t, n, m; + + public static int[] w = new int[MAXN]; + public static int[] c = new int[MAXN]; + public static int[] d = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + + public static int[] nodeArr = new int[MAXN]; + public static int[] endDfn = new int[MAXN]; + public static int cnta; + + public static int[] cost = new int[MAXN]; + public static int[] value = new int[MAXN]; + public static int[][] dp = new int[MAXN][MAXM]; + + public static void prepare() { + cntg = 0; + for (int i = 1; i <= n; i++) { + head[i] = 0; + vis[i] = false; + } + } + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void getSize(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize(v, u); + siz[u] += siz[v]; + } + } + } + + public static int getCentroid(int u, int fa) { + getSize(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void dfs(int u, int fa) { + nodeArr[++cnta] = u; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + dfs(v, u); + } + } + endDfn[u] = cnta; + } + + public static int calc(int u) { + cnta = 0; + dfs(u, 0); + for (int i = cnta; i > 0; i--) { + int cur = nodeArr[i]; + int cnt = d[cur] - 1; + int num = 0; + // 这里用二进制分组处理多重背包,代码量较小 + // 也可以用单调队列,之前的课都讲过,码量大 + for (int k = 1; k <= cnt; k <<= 1) { + cost[++num] = c[cur] * k; + value[num] = w[cur] * k; + cnt -= k; + } + if (cnt > 0) { + cost[++num] = c[cur] * cnt; + value[num] = w[cur] * cnt; + } + // 必须要选一件cur + for (int j = m; j >= c[cur]; j--) { + dp[i][j] = dp[i + 1][j - c[cur]] + w[cur]; + } + // 已选第一件的基础上再加 + for (int k = 1; k <= num; k++) { + for (int j = m; j >= cost[k]; j--) { + dp[i][j] = Math.max(dp[i][j], dp[i][j - cost[k]] + value[k]); + } + } + // 不选cur那么整棵子树都不能选,跳到endDfn[cur] + 1 + for (int j = 0; j <= m; j++) { + dp[i][j] = Math.max(dp[i][j], dp[endDfn[cur] + 1][j]); + } + } + int ans = dp[1][m]; + // 返回之前清空 + for (int i = 1; i <= cnta; i++) { + for (int j = 0; j <= m; j++) { + dp[i][j] = 0; + } + } + return ans; + } + + public static int solve(int u) { + vis[u] = true; + int ans = calc(u); + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + ans = Math.max(ans, solve(getCentroid(v, u))); + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + t = in.nextInt(); + for (int k = 1; k <= t; k++) { + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + w[i] = in.nextInt(); + } + for (int i = 1; i <= n; i++) { + c[i] = in.nextInt(); + } + for (int i = 1; i <= n; i++) { + d[i] = in.nextInt(); + } + prepare(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + out.println(solve(getCentroid(1, 0))); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From 7067a66a8a97ea38b2f3ba304ffa19ac54c32c99 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 17:54:46 +0800 Subject: [PATCH 1074/1170] modify code --- src/class184/Code04_Shopping1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 5d1b3c511..63a1ec9c5 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -11,7 +11,7 @@ public class Code04_Shopping1 { - public static int MAXN = 1001; + public static int MAXN = 502; public static int MAXM = 4001; public static int INF = 1000000001; public static int t, n, m; From aec9d25d37fc83afe7d114ad2737e7950cff800c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 17:59:07 +0800 Subject: [PATCH 1075/1170] modify code --- src/class184/Code04_Shopping1.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 63a1ec9c5..12e268289 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -16,7 +16,7 @@ public class Code04_Shopping1 { public static int INF = 1000000001; public static int t, n, m; - public static int[] w = new int[MAXN]; + public static int[] v = new int[MAXN]; public static int[] c = new int[MAXN]; public static int[] d = new int[MAXN]; @@ -32,8 +32,8 @@ public class Code04_Shopping1 { public static int[] endDfn = new int[MAXN]; public static int cnta; - public static int[] cost = new int[MAXN]; public static int[] value = new int[MAXN]; + public static int[] cost = new int[MAXN]; public static int[][] dp = new int[MAXN][MAXM]; public static void prepare() { @@ -101,25 +101,25 @@ public static int calc(int u) { // 这里用二进制分组处理多重背包,代码量较小 // 也可以用单调队列,之前的课都讲过,码量大 for (int k = 1; k <= cnt; k <<= 1) { - cost[++num] = c[cur] * k; - value[num] = w[cur] * k; + value[++num] = v[cur] * k; + cost[num] = c[cur] * k; cnt -= k; } if (cnt > 0) { - cost[++num] = c[cur] * cnt; - value[num] = w[cur] * cnt; + value[++num] = v[cur] * cnt; + cost[num] = c[cur] * cnt; } // 必须要选一件cur for (int j = m; j >= c[cur]; j--) { - dp[i][j] = dp[i + 1][j - c[cur]] + w[cur]; + dp[i][j] = dp[i + 1][j - c[cur]] + v[cur]; } - // 已选第一件的基础上再加 + // 选了一件的基础上再加 for (int k = 1; k <= num; k++) { for (int j = m; j >= cost[k]; j--) { dp[i][j] = Math.max(dp[i][j], dp[i][j - cost[k]] + value[k]); } } - // 不选cur那么整棵子树都不能选,跳到endDfn[cur] + 1 + // 如果不选cur,那么整棵子树都不能选,跳到endDfn[cur] + 1 for (int j = 0; j <= m; j++) { dp[i][j] = Math.max(dp[i][j], dp[endDfn[cur] + 1][j]); } @@ -154,7 +154,7 @@ public static void main(String[] args) throws Exception { n = in.nextInt(); m = in.nextInt(); for (int i = 1; i <= n; i++) { - w[i] = in.nextInt(); + v[i] = in.nextInt(); } for (int i = 1; i <= n; i++) { c[i] = in.nextInt(); From 410a5c83475075900f0e521859737282d969dbfd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 18:13:31 +0800 Subject: [PATCH 1076/1170] modify code --- src/class184/Code04_Shopping1.java | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 12e268289..9de798b9b 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -32,7 +32,7 @@ public class Code04_Shopping1 { public static int[] endDfn = new int[MAXN]; public static int cnta; - public static int[] value = new int[MAXN]; + public static int[] val = new int[MAXN]; public static int[] cost = new int[MAXN]; public static int[][] dp = new int[MAXN][MAXM]; @@ -101,28 +101,28 @@ public static int calc(int u) { // 这里用二进制分组处理多重背包,代码量较小 // 也可以用单调队列,之前的课都讲过,码量大 for (int k = 1; k <= cnt; k <<= 1) { - value[++num] = v[cur] * k; + val[++num] = v[cur] * k; cost[num] = c[cur] * k; cnt -= k; } if (cnt > 0) { - value[++num] = v[cur] * cnt; + val[++num] = v[cur] * cnt; cost[num] = c[cur] * cnt; } - // 必须要选一件cur + // 如果不选cur,那么整棵子树都不能选了,跳到endDfn[cur] + 1 + for (int j = 0; j <= m; j++) { + dp[i][j] = dp[endDfn[cur] + 1][j]; + } + // 如果选cur,那么先必选一件 for (int j = m; j >= c[cur]; j--) { - dp[i][j] = dp[i + 1][j - c[cur]] + v[cur]; + dp[i][j] = Math.max(dp[i][j], dp[i + 1][j - c[cur]] + v[cur]); } - // 选了一件的基础上再加 + // 然后在一件的基础上,增加更多 for (int k = 1; k <= num; k++) { for (int j = m; j >= cost[k]; j--) { - dp[i][j] = Math.max(dp[i][j], dp[i][j - cost[k]] + value[k]); + dp[i][j] = Math.max(dp[i][j], dp[i][j - cost[k]] + val[k]); } } - // 如果不选cur,那么整棵子树都不能选,跳到endDfn[cur] + 1 - for (int j = 0; j <= m; j++) { - dp[i][j] = Math.max(dp[i][j], dp[endDfn[cur] + 1][j]); - } } int ans = dp[1][m]; // 返回之前清空 From ba1e0d776792e6fcf3771086111b72b63ac1ade8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Nov 2025 19:54:53 +0800 Subject: [PATCH 1077/1170] modify code --- src/class184/Code04_Shopping1.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 9de798b9b..687b0dbc1 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -11,7 +11,7 @@ public class Code04_Shopping1 { - public static int MAXN = 502; + public static int MAXN = 501; public static int MAXM = 4001; public static int INF = 1000000001; public static int t, n, m; @@ -30,11 +30,11 @@ public class Code04_Shopping1 { public static int[] nodeArr = new int[MAXN]; public static int[] endDfn = new int[MAXN]; - public static int cnta; + public static int cntd; public static int[] val = new int[MAXN]; public static int[] cost = new int[MAXN]; - public static int[][] dp = new int[MAXN][MAXM]; + public static int[][] dp = new int[MAXN + 1][MAXM]; public static void prepare() { cntg = 0; @@ -81,20 +81,20 @@ public static int getCentroid(int u, int fa) { } public static void dfs(int u, int fa) { - nodeArr[++cnta] = u; + nodeArr[++cntd] = u; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (v != fa && !vis[v]) { dfs(v, u); } } - endDfn[u] = cnta; + endDfn[u] = cntd; } public static int calc(int u) { - cnta = 0; + cntd = 0; dfs(u, 0); - for (int i = cnta; i > 0; i--) { + for (int i = cntd; i > 0; i--) { int cur = nodeArr[i]; int cnt = d[cur] - 1; int num = 0; @@ -126,7 +126,7 @@ public static int calc(int u) { } int ans = dp[1][m]; // 返回之前清空 - for (int i = 1; i <= cnta; i++) { + for (int i = 1; i <= cntd; i++) { for (int j = 0; j <= m; j++) { dp[i][j] = 0; } From 82fad41023d2c75d3288e01c7afcdec110af3952 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 10:14:11 +0800 Subject: [PATCH 1078/1170] modify code --- src/class184/Code01_Capital1.java | 29 +++++++++++++++-------------- src/class184/Code01_Capital2.java | 11 ++++++----- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/class184/Code01_Capital1.java b/src/class184/Code01_Capital1.java index e47988f52..57847609d 100644 --- a/src/class184/Code01_Capital1.java +++ b/src/class184/Code01_Capital1.java @@ -35,20 +35,21 @@ public class Code01_Capital1 { public static int[] siz = new int[MAXN]; public static int[] father = new int[MAXN]; - public static int[] curRoot = new int[MAXN]; + public static int[] curCentroid = new int[MAXN]; + public static int[] que = new int[MAXN]; public static boolean[] nodeVis = new boolean[MAXN]; public static boolean[] colorVis = new boolean[MAXN]; // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][4]; - public static int u, f, rt, e; + public static int u, f, centroid, e; public static int stacksize; - public static void push(int u, int f, int rt, int e) { + public static void push(int u, int f, int centroid, int e) { stack[stacksize][0] = u; stack[stacksize][1] = f; - stack[stacksize][2] = rt; + stack[stacksize][2] = centroid; stack[stacksize][3] = e; stacksize++; } @@ -57,7 +58,7 @@ public static void pop() { --stacksize; u = stack[stacksize][0]; f = stack[stacksize][1]; - rt = stack[stacksize][2]; + centroid = stack[stacksize][2]; e = stack[stacksize][3]; } @@ -135,28 +136,28 @@ public static int getCentroid(int u, int fa) { } // 收集信息递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa, int rt) { + public static void dfs1(int u, int fa, int centroid) { father[u] = fa; - curRoot[u] = rt; + curCentroid[u] = centroid; nodeVis[u] = false; colorVis[color[u]] = false; for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - dfs1(v, u, rt); + dfs1(v, u, centroid); } } } // 收集信息迭代版 - public static void dfs2(int cur, int fa, int root) { + public static void dfs2(int cur, int fa, int cen) { stacksize = 0; - push(cur, fa, root, -1); + push(cur, fa, cen, -1); while (stacksize > 0) { pop(); if (e == -1) { father[u] = f; - curRoot[u] = rt; + curCentroid[u] = centroid; nodeVis[u] = false; colorVis[color[u]] = false; e = headg[u]; @@ -164,10 +165,10 @@ public static void dfs2(int cur, int fa, int root) { e = nextg[e]; } if (e != 0) { - push(u, f, rt, e); + push(u, f, centroid, e); int v = tog[e]; if (v != f && !vis[v]) { - push(v, u, rt, -1); + push(v, u, centroid, -1); } } } @@ -191,7 +192,7 @@ public static int calc(int u) { ans++; for (int e = headc[color[cur]]; e > 0; e = nextc[e]) { int v = toc[e]; - if (curRoot[v] != u) { + if (curCentroid[v] != u) { return INF; } if (!nodeVis[v]) { diff --git a/src/class184/Code01_Capital2.java b/src/class184/Code01_Capital2.java index e64d467bb..ae0c24392 100644 --- a/src/class184/Code01_Capital2.java +++ b/src/class184/Code01_Capital2.java @@ -33,7 +33,8 @@ //int siz[MAXN]; // //int father[MAXN]; -//int curRoot[MAXN]; +//int curCentroid[MAXN]; +// //int que[MAXN]; //bool nodeVis[MAXN]; //bool colorVis[MAXN]; @@ -80,15 +81,15 @@ // return u; //} // -//void dfs(int u, int fa, int rt) { +//void dfs(int u, int fa, int centroid) { // father[u] = fa; -// curRoot[u] = rt; +// curCentroid[u] = centroid; // nodeVis[u] = false; // colorVis[color[u]] = false; // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (v != fa && !vis[v]) { -// dfs(v, u, rt); +// dfs(v, u, centroid); // } // } //} @@ -110,7 +111,7 @@ // ans++; // for (int e = headc[color[cur]]; e; e = nextc[e]) { // int v = toc[e]; -// if (curRoot[v] != u) { +// if (curCentroid[v] != u) { // return INF; // } // if (!nodeVis[v]) { From e2d2a3ef1407bda91eadc37ea135e12ea804f531 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 10:35:38 +0800 Subject: [PATCH 1079/1170] modify code --- src/class184/Code02_Difficult1.java | 7 +++++++ src/class184/Code02_Difficult2.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/class184/Code02_Difficult1.java b/src/class184/Code02_Difficult1.java index 5623cfd50..e1a7e0c83 100644 --- a/src/class184/Code02_Difficult1.java +++ b/src/class184/Code02_Difficult1.java @@ -1,6 +1,13 @@ package class184; // 树的难题,java版 +// 一共有n个节点,给定n-1条边,每条边有颜色,所有节点组成一棵树 +// 颜色一共有m种,给定长度为m的数组val,val[i]表示第i种颜色的权值 +// 树上的一条简单路径,依次经过的边收集其颜色,可以组成一个颜色序列 +// 颜色序列划分成若干个连续同色段,比如AABAACC,有4个连续同色段 +// 每个连续同色段只算一次颜色权值,颜色权值的累加和作为路径的权 +// 请计算边数在limitl到limitr之间的所有简单路径,最大的权是多少 +// 1 <= limitl、limitr、n、m <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3714 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class184/Code02_Difficult2.java b/src/class184/Code02_Difficult2.java index 2a2afebd5..bb3aa5b69 100644 --- a/src/class184/Code02_Difficult2.java +++ b/src/class184/Code02_Difficult2.java @@ -1,6 +1,13 @@ package class184; // 树的难题,C++版 +// 一共有n个节点,给定n-1条边,每条边有颜色,所有节点组成一棵树 +// 颜色一共有m种,给定长度为m的数组val,val[i]表示第i种颜色的权值 +// 树上的一条简单路径,依次经过的边收集其颜色,可以组成一个颜色序列 +// 颜色序列划分成若干个连续同色段,比如AABAACC,有4个连续同色段 +// 每个连续同色段只算一次颜色权值,颜色权值的累加和作为路径的权 +// 请计算边数在limitl到limitr之间的所有简单路径,最大的权是多少 +// 1 <= limitl、limitr、n、m <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3714 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 00aeb553aeb64ae29b4b827c52fd583fe5cf82a6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 10:42:10 +0800 Subject: [PATCH 1080/1170] modify code --- src/class184/Code02_Difficult1.java | 2 +- src/class184/Code02_Difficult2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class184/Code02_Difficult1.java b/src/class184/Code02_Difficult1.java index e1a7e0c83..eef3f0fdb 100644 --- a/src/class184/Code02_Difficult1.java +++ b/src/class184/Code02_Difficult1.java @@ -1,7 +1,7 @@ package class184; // 树的难题,java版 -// 一共有n个节点,给定n-1条边,每条边有颜色,所有节点组成一棵树 +// 一共有n个节点,给定n-1条边,每条边给定颜色,所有节点组成一棵树 // 颜色一共有m种,给定长度为m的数组val,val[i]表示第i种颜色的权值 // 树上的一条简单路径,依次经过的边收集其颜色,可以组成一个颜色序列 // 颜色序列划分成若干个连续同色段,比如AABAACC,有4个连续同色段 diff --git a/src/class184/Code02_Difficult2.java b/src/class184/Code02_Difficult2.java index bb3aa5b69..88cd22a8f 100644 --- a/src/class184/Code02_Difficult2.java +++ b/src/class184/Code02_Difficult2.java @@ -1,7 +1,7 @@ package class184; // 树的难题,C++版 -// 一共有n个节点,给定n-1条边,每条边有颜色,所有节点组成一棵树 +// 一共有n个节点,给定n-1条边,每条边给定颜色,所有节点组成一棵树 // 颜色一共有m种,给定长度为m的数组val,val[i]表示第i种颜色的权值 // 树上的一条简单路径,依次经过的边收集其颜色,可以组成一个颜色序列 // 颜色序列划分成若干个连续同色段,比如AABAACC,有4个连续同色段 From 86fd924e00e4c2fa68a22ae9561e307d6afadf4d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 11:15:21 +0800 Subject: [PATCH 1081/1170] modify code --- src/class184/Code02_Difficult1.java | 7 ++++--- src/class184/Code02_Difficult2.java | 7 ++++--- src/class184/Code03_Courier1.java | 6 ++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/class184/Code02_Difficult1.java b/src/class184/Code02_Difficult1.java index eef3f0fdb..c613cba57 100644 --- a/src/class184/Code02_Difficult1.java +++ b/src/class184/Code02_Difficult1.java @@ -2,12 +2,13 @@ // 树的难题,java版 // 一共有n个节点,给定n-1条边,每条边给定颜色,所有节点组成一棵树 -// 颜色一共有m种,给定长度为m的数组val,val[i]表示第i种颜色的权值 +// 颜色一共有m种,val[i]表示第i种颜色的权值,可能为负数 // 树上的一条简单路径,依次经过的边收集其颜色,可以组成一个颜色序列 // 颜色序列划分成若干个连续同色段,比如AABAACC,有4个连续同色段 // 每个连续同色段只算一次颜色权值,颜色权值的累加和作为路径的权 -// 请计算边数在limitl到limitr之间的所有简单路径,最大的权是多少 -// 1 <= limitl、limitr、n、m <= 2 * 10^5 +// 请计算边数在[limitl, limitr]范围的所有路径中,最大的权是多少 +// 1 <= n、m <= 2 * 10^5 +// 题目保证一定存在边数在[limitl, limitr]的路径 // 测试链接 : https://www.luogu.com.cn/problem/P3714 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class184/Code02_Difficult2.java b/src/class184/Code02_Difficult2.java index 88cd22a8f..65f9b38b9 100644 --- a/src/class184/Code02_Difficult2.java +++ b/src/class184/Code02_Difficult2.java @@ -2,12 +2,13 @@ // 树的难题,C++版 // 一共有n个节点,给定n-1条边,每条边给定颜色,所有节点组成一棵树 -// 颜色一共有m种,给定长度为m的数组val,val[i]表示第i种颜色的权值 +// 颜色一共有m种,val[i]表示第i种颜色的权值,可能为负数 // 树上的一条简单路径,依次经过的边收集其颜色,可以组成一个颜色序列 // 颜色序列划分成若干个连续同色段,比如AABAACC,有4个连续同色段 // 每个连续同色段只算一次颜色权值,颜色权值的累加和作为路径的权 -// 请计算边数在limitl到limitr之间的所有简单路径,最大的权是多少 -// 1 <= limitl、limitr、n、m <= 2 * 10^5 +// 请计算边数在[limitl, limitr]范围的所有路径中,最大的权是多少 +// 1 <= n、m <= 2 * 10^5 +// 题目保证一定存在边数在[limitl, limitr]的路径 // 测试链接 : https://www.luogu.com.cn/problem/P3714 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class184/Code03_Courier1.java b/src/class184/Code03_Courier1.java index 22ce1f6e7..49c1e6703 100644 --- a/src/class184/Code03_Courier1.java +++ b/src/class184/Code03_Courier1.java @@ -1,6 +1,12 @@ package class184; // 快递员,java版 +// 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 +// 给定点对(a, b),假设你选择的中心点为x,那么点对的距离如下 +// 点对(a, b)的距离 = a到x的路径权值和 + b到x的路径权值和 +// 一共有m个点对,你需要选择中心点x,使得所有点对距离中的最大值尽量小 +// 打印这个最小的最大距离 +// 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4886 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From a19cf39cd9649c1ebc32413daa5c798eddf4519d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 13:50:59 +0800 Subject: [PATCH 1082/1170] modify code --- src/class184/Code03_Courier1.java | 6 +- src/class184/Code03_Courier2.java | 130 ++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 src/class184/Code03_Courier2.java diff --git a/src/class184/Code03_Courier1.java b/src/class184/Code03_Courier1.java index 49c1e6703..2df413568 100644 --- a/src/class184/Code03_Courier1.java +++ b/src/class184/Code03_Courier1.java @@ -2,10 +2,10 @@ // 快递员,java版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 -// 给定点对(a, b),假设你选择的中心点为x,那么点对的距离如下 +// 对于点对(a, b),假设你选择的中心点为x,那么点对的距离如下 // 点对(a, b)的距离 = a到x的路径权值和 + b到x的路径权值和 -// 一共有m个点对,你需要选择中心点x,使得所有点对距离中的最大值尽量小 -// 打印这个最小的最大距离 +// 一共有m个点对,你需要选择中心点x,使得点对距离的最大值尽量小 +// 打印这个最小的点对距离最大值 // 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4886 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class184/Code03_Courier2.java b/src/class184/Code03_Courier2.java new file mode 100644 index 000000000..01fe82a1a --- /dev/null +++ b/src/class184/Code03_Courier2.java @@ -0,0 +1,130 @@ +package class184; + +// 快递员,C++版 +// 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 +// 对于点对(a, b),假设你选择的中心点为x,那么点对的距离如下 +// 点对(a, b)的距离 = a到x的路径权值和 + b到x的路径权值和 +// 一共有m个点对,你需要选择中心点x,使得点对距离的最大值尽量小 +// 打印这个最小的点对距离最大值 +// 1 <= n、m <= 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P4886 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m; +//int a[MAXN]; +//int b[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +// +//int tree[MAXN]; +//int dist[MAXN]; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void dfs(int u, int fa, int d, int t) { +// tree[u] = t; +// dist[u] = d; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// dfs(v, u, d + weight[e], t); +// } +// } +//} +// +//int compute() { +// int ans = 1000000001; +// int u = getCentroid(1, 0); +// while (!vis[u]) { +// vis[u] = true; +// tree[u] = u; +// dist[u] = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// dfs(v, u, w, v); +// } +// int maxDist = 0, son = 0; +// for (int i = 1; i <= m; i++) { +// int curDist = dist[a[i]] + dist[b[i]]; +// int t1 = tree[a[i]]; +// int t2 = tree[b[i]]; +// if (maxDist < curDist) { +// maxDist = curDist; +// son = (t1 == t2) ? t1 : 0; +// } else if (maxDist == curDist && (t1 != t2 || t1 != son)) { +// son = 0; +// } +// } +// ans = min(ans, maxDist); +// if (son == 0) { +// break; +// } +// u = getCentroid(son, u); +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); +// } +// for (int i = 1; i <= m; i++) { +// cin >> a[i] >> b[i]; +// } +// cout << compute() << '\n'; +// return 0; +//} \ No newline at end of file From eb1dd31420a2689ed891fdce6f308cbb8ebf71b9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 14:40:17 +0800 Subject: [PATCH 1083/1170] modify code --- src/class184/Code02_Difficult2.java | 10 +- src/class184/Code04_Shopping1.java | 8 +- src/class184/Code04_Shopping2.java | 171 ++++++++++++++++++++++++++++ 3 files changed, 183 insertions(+), 6 deletions(-) create mode 100644 src/class184/Code04_Shopping2.java diff --git a/src/class184/Code02_Difficult2.java b/src/class184/Code02_Difficult2.java index 65f9b38b9..7943d9895 100644 --- a/src/class184/Code02_Difficult2.java +++ b/src/class184/Code02_Difficult2.java @@ -112,7 +112,7 @@ // //void getSize(int u, int fa) { // siz[u] = 1; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v]) { // getSize(v, u); @@ -127,7 +127,7 @@ // bool find = false; // while (!find) { // find = true; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != fa && !vis[v] && siz[v] > half) { // fa = u; @@ -147,7 +147,7 @@ // edgeCnt[u] = edge; // pathSum[u] = sum; // nodeArr[++cnta] = u; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // int c = color[e]; // if (v != fa && !vis[v]) { @@ -158,7 +158,7 @@ // //long long calc(int u) { // cnte = 0; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // int c = color[e]; // if (!vis[v]) { @@ -203,7 +203,7 @@ //long long solve(int u) { // vis[u] = true; // long long ans = calc(u); -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { // ans = max(ans, solve(getCentroid(v, u))); diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 687b0dbc1..b5ff3233e 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -1,6 +1,13 @@ package class184; // 树上购物,java版 +// 一共有n个商店,有n-1条路构成一棵树,第i个商店只卖第i种物品 +// 给定每种物品三个属性,价值v[i]、单价c[i]、数量d[i] +// 你逛商店可能会购买物品,要求所有买过东西的商店,在树上必须连通 +// 你有m元,打印能获得的最大价值总和 +// 1 <= n <= 500 +// 1 <= m <= 4000 +// 1 <= d[i] <= 2000 // 测试链接 : https://www.luogu.com.cn/problem/P6326 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -13,7 +20,6 @@ public class Code04_Shopping1 { public static int MAXN = 501; public static int MAXM = 4001; - public static int INF = 1000000001; public static int t, n, m; public static int[] v = new int[MAXN]; diff --git a/src/class184/Code04_Shopping2.java b/src/class184/Code04_Shopping2.java new file mode 100644 index 000000000..41e3484a9 --- /dev/null +++ b/src/class184/Code04_Shopping2.java @@ -0,0 +1,171 @@ +package class184; + +// 树上购物,C++版 +// 一共有n个商店,有n-1条路构成一棵树,第i个商店只卖第i种物品 +// 给定每种物品三个属性,价值v[i]、单价c[i]、数量d[i] +// 你逛商店可能会购买物品,要求所有买过东西的商店,在树上必须连通 +// 你有m元,打印能获得的最大价值总和 +// 1 <= n <= 500 +// 1 <= m <= 4000 +// 1 <= d[i] <= 2000 +// 测试链接 : https://www.luogu.com.cn/problem/P6326 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 501; +//const int MAXM = 4001; +//int t, n, m; +// +//int v[MAXN]; +//int c[MAXN]; +//int d[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +// +//int nodeArr[MAXN]; +//int endDfn[MAXN]; +//int cntd; +// +//int val[MAXN]; +//int cost[MAXN]; +//int dp[MAXN + 1][MAXM]; +// +//void prepare() { +// cntg = 0; +// for (int i = 1; i <= n; i++) { +// head[i] = 0; +// vis[i] = false; +// } +//} +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void dfs(int u, int fa) { +// nodeArr[++cntd] = u; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u); +// } +// } +// endDfn[u] = cntd; +//} +// +//int calc(int u) { +// cntd = 0; +// dfs(u, 0); +// for (int i = cntd; i > 0; i--) { +// int cur = nodeArr[i]; +// int cnt = d[cur] - 1; +// int num = 0; +// for (int k = 1; k <= cnt; k <<= 1) { +// val[++num] = v[cur] * k; +// cost[num] = c[cur] * k; +// cnt -= k; +// } +// if (cnt > 0) { +// val[++num] = v[cur] * cnt; +// cost[num] = c[cur] * cnt; +// } +// for (int j = 0; j <= m; j++) { +// dp[i][j] = dp[endDfn[cur] + 1][j]; +// } +// for (int j = m; j >= c[cur]; j--) { +// dp[i][j] = max(dp[i][j], dp[i + 1][j - c[cur]] + v[cur]); +// } +// for (int k = 1; k <= num; k++) { +// for (int j = m; j >= cost[k]; j--) { +// dp[i][j] = max(dp[i][j], dp[i][j - cost[k]] + val[k]); +// } +// } +// } +// int ans = dp[1][m]; +// for (int i = 1; i <= cntd; i++) { +// for (int j = 0; j <= m; j++) { +// dp[i][j] = 0; +// } +// } +// return ans; +//} +// +//int solve(int u) { +// vis[u] = true; +// int ans = calc(u); +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// ans = max(ans, solve(getCentroid(v, u))); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> t; +// for (int k = 1; k <= t; k++) { +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> v[i]; +// } +// for (int i = 1; i <= n; i++) { +// cin >> c[i]; +// } +// for (int i = 1; i <= n; i++) { +// cin >> d[i]; +// } +// prepare(); +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// cout << solve(getCentroid(1, 0)) << '\n'; +// } +// return 0; +//} \ No newline at end of file From 0cbb88df939cc5aec6e665ca3331caedbc01261d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 15:05:21 +0800 Subject: [PATCH 1084/1170] modify code --- src/class184/Code05_TreeDistance1.java | 10 +++++++++- src/class184/Code05_TreeDistance2.java | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/class184/Code05_TreeDistance1.java b/src/class184/Code05_TreeDistance1.java index cd9ddb5d3..c4a59a445 100644 --- a/src/class184/Code05_TreeDistance1.java +++ b/src/class184/Code05_TreeDistance1.java @@ -1,6 +1,14 @@ package class184; -// 支配点对的距离,java版 +// 支配点对距离,java版 +// 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 +// 节点i到节点j的简单路径权值和,定义为dist(i, j) +// 在[x, y]范围上,选两个编号a、b,要求a < b,这样的选择可能有很多情况 +// 如果dist(a, b)是所有情况中最小的,就说点对(a, b)支配了[x, y]范围 +// 也可以说,[x, y]范围的支配点对距离是dist(a, b) +// 特别的,如果x == y,那么[x, y]范围的支配点对距离是-1 +// 一共有m条查询,格式 x y : 输入保证x <= y,打印[x, y]范围的支配点对距离 +// 1 <= n <= 2 * 10^5 1 <= m <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class184/Code05_TreeDistance2.java b/src/class184/Code05_TreeDistance2.java index 896b4c15b..930d30020 100644 --- a/src/class184/Code05_TreeDistance2.java +++ b/src/class184/Code05_TreeDistance2.java @@ -1,6 +1,6 @@ package class184; -// 支配点对的距离,C++版 +// 支配点对距离,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From d0f8e2b372334ba305228403ea06bb09b074f837 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 15:33:19 +0800 Subject: [PATCH 1085/1170] modify code --- src/class184/Code05_TreeDistance1.java | 64 +++++++++++++------------- src/class184/Code05_TreeDistance2.java | 33 +++++++------ 2 files changed, 51 insertions(+), 46 deletions(-) diff --git a/src/class184/Code05_TreeDistance1.java b/src/class184/Code05_TreeDistance1.java index c4a59a445..4f45bc738 100644 --- a/src/class184/Code05_TreeDistance1.java +++ b/src/class184/Code05_TreeDistance1.java @@ -8,7 +8,7 @@ // 也可以说,[x, y]范围的支配点对距离是dist(a, b) // 特别的,如果x == y,那么[x, y]范围的支配点对距离是-1 // 一共有m条查询,格式 x y : 输入保证x <= y,打印[x, y]范围的支配点对距离 -// 1 <= n <= 2 * 10^5 1 <= m <= 10^6 +// 1 <= n <= 2 * 10^5 1 <= m <= 10^6 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -25,12 +25,12 @@ public class Code05_TreeDistance1 { public static int MAXK = 10000001; public static long INF = 1L << 60; public static int n, m; - public static int[] queryl = new int[MAXM]; - public static int[] queryr = new int[MAXM]; - public static int[] queryId = new int[MAXM]; + public static int[] qx = new int[MAXM]; + public static int[] qy = new int[MAXM]; + public static int[] qid = new int[MAXM]; - public static int[] keyl = new int[MAXK]; - public static int[] keyr = new int[MAXK]; + public static int[] keya = new int[MAXK]; + public static int[] keyb = new int[MAXK]; public static long[] keyDist = new long[MAXK]; public static int cntk; @@ -74,17 +74,17 @@ public static void pop() { dis = distst[stacksize]; } - // 所有查询,根据l的值,从大到小排序,java自带的排序慢,手撸双指针快排 + // 所有查询,根据x的值,从大到小排序,java自带的排序慢,手撸双指针快排 public static void sortQuery(int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = queryl[(l + r) >> 1], tmp; + int i = l, j = r, pivot = qx[(l + r) >> 1], tmp; while (i <= j) { - while (queryl[i] > pivot) i++; - while (queryl[j] < pivot) j--; + while (qx[i] > pivot) i++; + while (qx[j] < pivot) j--; if (i <= j) { - tmp = queryl[i]; queryl[i] = queryl[j]; queryl[j] = tmp; - tmp = queryr[i]; queryr[i] = queryr[j]; queryr[j] = tmp; - tmp = queryId[i]; queryId[i] = queryId[j]; queryId[j] = tmp; + tmp = qx[i]; qx[i] = qx[j]; qx[j] = tmp; + tmp = qy[i]; qy[i] = qy[j]; qy[j] = tmp; + tmp = qid[i]; qid[i] = qid[j]; qid[j] = tmp; i++; j--; } } @@ -92,17 +92,17 @@ public static void sortQuery(int l, int r) { sortQuery(i, r); } - // 所有关键点,根据l的值,从大到小排序,java自带的排序慢,手撸双指针快排 + // 所有关键点,根据a的值,从大到小排序,java自带的排序慢,手撸双指针快排 public static void sortKey(int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = keyl[(l + r) >> 1], t1; + int i = l, j = r, pivot = keya[(l + r) >> 1], t1; long t2; while (i <= j) { - while (keyl[i] > pivot) i++; - while (keyl[j] < pivot) j--; + while (keya[i] > pivot) i++; + while (keya[j] < pivot) j--; if (i <= j) { - t1 = keyl[i]; keyl[i] = keyl[j]; keyl[j] = t1; - t1 = keyr[i]; keyr[i] = keyr[j]; keyr[j] = t1; + t1 = keya[i]; keya[i] = keya[j]; keya[j] = t1; + t1 = keyb[i]; keyb[i] = keyb[j]; keyb[j] = t1; t2 = keyDist[i]; keyDist[i] = keyDist[j]; keyDist[j] = t2; i++; j--; } @@ -216,9 +216,9 @@ public static void dfs2(int cur, int fa, long d) { } } - public static void addKey(int kl, int kr, long kdist) { - keyl[++cntk] = kl; - keyr[cntk] = kr; + public static void addKey(int ka, int kb, long kdist) { + keya[++cntk] = ka; + keyb[cntk] = kb; keyDist[cntk] = kdist; } @@ -283,16 +283,14 @@ public static void compute() { sortQuery(1, m); sortKey(1, cntk); buildTree(); - int idx = 1; - for (int i = 1; i <= m; i++) { - while (idx <= cntk && keyl[idx] >= queryl[i]) { - add(keyr[idx], keyDist[idx]); - idx++; + for (int i = 1, j = 1; i <= m; i++) { + for (; j <= cntk && keya[j] >= qx[i]; j++) { + add(keyb[j], keyDist[j]); } - if (queryl[i] == queryr[i]) { - ans[queryId[i]] = -1; + if (qx[i] == qy[i]) { + ans[qid[i]] = -1; } else { - ans[queryId[i]] = query(queryr[i]); + ans[qid[i]] = query(qy[i]); } } } @@ -310,9 +308,9 @@ public static void main(String[] args) throws Exception { } m = in.nextInt(); for (int i = 1; i <= m; i++) { - queryl[i] = in.nextInt(); - queryr[i] = in.nextInt(); - queryId[i] = i; + qx[i] = in.nextInt(); + qy[i] = in.nextInt(); + qid[i] = i; } compute(); for (int i = 1; i <= m; i++) { diff --git a/src/class184/Code05_TreeDistance2.java b/src/class184/Code05_TreeDistance2.java index 930d30020..0b67a98c0 100644 --- a/src/class184/Code05_TreeDistance2.java +++ b/src/class184/Code05_TreeDistance2.java @@ -1,6 +1,14 @@ package class184; // 支配点对距离,C++版 +// 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 +// 节点i到节点j的简单路径权值和,定义为dist(i, j) +// 在[x, y]范围上,选两个编号a、b,要求a < b,这样的选择可能有很多情况 +// 如果dist(a, b)是所有情况中最小的,就说点对(a, b)支配了[x, y]范围 +// 也可以说,[x, y]范围的支配点对距离是dist(a, b) +// 特别的,如果x == y,那么[x, y]范围的支配点对距离是-1 +// 一共有m条查询,格式 x y : 输入保证x <= y,打印[x, y]范围的支配点对距离 +// 1 <= n <= 2 * 10^5 1 <= m <= 10^6 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -10,20 +18,20 @@ //using namespace std; // //struct Query { -// int l, r, id; +// int x, y, id; //}; // //struct Key { -// int l, r; +// int a, b; // long long dist; //}; // -//bool QueryCmp(Query a, Query b) { -// return a.l > b.l; +//bool QueryCmp(Query q1, Query q2) { +// return q1.x > q2.x; //} // -//bool KeyCmp(Key a, Key b) { -// return a.l > b.l; +//bool KeyCmp(Key k1, Key k2) { +// return k1.a > k2.a; //} // //const int MAXN = 200001; @@ -163,15 +171,14 @@ // sort(keyArr + 1, keyArr + cntk + 1, KeyCmp); // buildTree(); // int idx = 1; -// for (int i = 1; i <= m; i++) { -// while (idx <= cntk && keyArr[idx].l >= queryArr[i].l) { -// add(keyArr[idx].r, keyArr[idx].dist); -// idx++; +// for (int i = 1, j = 1; i <= m; i++) { +// for (; j <= cntk && keyArr[j].a >= queryArr[i].x; j++) { +// add(keyArr[j].b, keyArr[j].dist); // } -// if (queryArr[i].l == queryArr[i].r) { +// if (queryArr[i].x == queryArr[i].y) { // ans[queryArr[i].id] = -1; // } else { -// ans[queryArr[i].id] = query(queryArr[i].r); +// ans[queryArr[i].id] = query(queryArr[i].y); // } // } //} @@ -187,7 +194,7 @@ // } // cin >> m; // for (int i = 1; i <= m; i++) { -// cin >> queryArr[i].l >> queryArr[i].r; +// cin >> queryArr[i].x >> queryArr[i].y; // queryArr[i].id = i; // } // compute(); From c4d9059a15b16619526aa65c1bba2933fff6126b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 15:43:13 +0800 Subject: [PATCH 1086/1170] modify code --- src/class184/Code05_TreeDistance1.java | 12 ++++++------ src/class184/Code05_TreeDistance2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class184/Code05_TreeDistance1.java b/src/class184/Code05_TreeDistance1.java index 4f45bc738..d1be17414 100644 --- a/src/class184/Code05_TreeDistance1.java +++ b/src/class184/Code05_TreeDistance1.java @@ -2,12 +2,12 @@ // 支配点对距离,java版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 -// 节点i到节点j的简单路径权值和,定义为dist(i, j) -// 在[x, y]范围上,选两个编号a、b,要求a < b,这样的选择可能有很多情况 -// 如果dist(a, b)是所有情况中最小的,就说点对(a, b)支配了[x, y]范围 -// 也可以说,[x, y]范围的支配点对距离是dist(a, b) -// 特别的,如果x == y,那么[x, y]范围的支配点对距离是-1 -// 一共有m条查询,格式 x y : 输入保证x <= y,打印[x, y]范围的支配点对距离 +// 节点i到节点j的简单路径边权和,定义为dist(i, j) +// 编号区间[x, y],考虑所有点对(a, b),要求 x <= a < b <= y +// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的支配点对 +// 也可以说,区间[x, y]的支配点对距离为dist(a, b) +// 特别的,如果x == y,那么不存在满足要求的点对,此时支配点对距离为-1 +// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的支配点对距离 // 1 <= n <= 2 * 10^5 1 <= m <= 10^6 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class184/Code05_TreeDistance2.java b/src/class184/Code05_TreeDistance2.java index 0b67a98c0..9b23d0d13 100644 --- a/src/class184/Code05_TreeDistance2.java +++ b/src/class184/Code05_TreeDistance2.java @@ -2,12 +2,12 @@ // 支配点对距离,C++版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 -// 节点i到节点j的简单路径权值和,定义为dist(i, j) -// 在[x, y]范围上,选两个编号a、b,要求a < b,这样的选择可能有很多情况 -// 如果dist(a, b)是所有情况中最小的,就说点对(a, b)支配了[x, y]范围 -// 也可以说,[x, y]范围的支配点对距离是dist(a, b) -// 特别的,如果x == y,那么[x, y]范围的支配点对距离是-1 -// 一共有m条查询,格式 x y : 输入保证x <= y,打印[x, y]范围的支配点对距离 +// 节点i到节点j的简单路径边权和,定义为dist(i, j) +// 编号区间[x, y],考虑所有点对(a, b),要求 x <= a < b <= y +// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的支配点对 +// 也可以说,区间[x, y]的支配点对距离为dist(a, b) +// 特别的,如果x == y,那么不存在满足要求的点对,此时支配点对距离为-1 +// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的支配点对距离 // 1 <= n <= 2 * 10^5 1 <= m <= 10^6 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 1f56b8d7522f88462f61bc0a0355e45a57731c90 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 16:31:37 +0800 Subject: [PATCH 1087/1170] modify code --- src/class184/Code06_Freezing1.java | 18 ++- src/class184/Code06_Freezing2.java | 223 +++++++++++++++++++++++++++++ 2 files changed, 235 insertions(+), 6 deletions(-) create mode 100644 src/class184/Code06_Freezing2.java diff --git a/src/class184/Code06_Freezing1.java b/src/class184/Code06_Freezing1.java index 111cd7b70..20e8a32fe 100644 --- a/src/class184/Code06_Freezing1.java +++ b/src/class184/Code06_Freezing1.java @@ -1,6 +1,11 @@ package class184; -// 最大中位数路径,java版 +// 最大上中位数路径,java版 +// 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 +// 一条简单路径上,收集所有边权组成序列,其中的上中位数作为路径的权 +// 边数在[limitl, limitr]范围的所有路径中,找到最大权的路径 +// 如果有多条路径,找到其中一个方案即可,打印两个端点 +// 1 <= n <= 10^5 0 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF150E // 测试链接 : https://codeforces.com/problemset/problem/150/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -15,10 +20,10 @@ public class Code06_Freezing1 { public static int MAXN = 100001; public static int INF = 1000000001; - public static int n, limitl, limitr; + public static int n, limitl, limitr, cntw; + // 端点u、端点v、边权w public static int[][] arr = new int[MAXN][3]; - public static int cntw; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -29,6 +34,7 @@ public class Code06_Freezing1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; + // 边的编号eid、边连接的子树大小size public static int[][] edgeArr = new int[MAXN][2]; public static int cnte; @@ -103,9 +109,9 @@ public static boolean check(int u, int limit) { allVal[0] = 0; allNode[0] = u; allLen = 0; - for (int ei = 1; ei <= cnte; ei++) { - int v = to[edgeArr[ei][0]]; - int w = weight[edgeArr[ei][0]]; + for (int k = 1; k <= cnte; k++) { + int v = to[edgeArr[k][0]]; + int w = weight[edgeArr[k][0]]; for (int i = 1; i <= siz[v]; i++) { curVal[i] = -INF; } diff --git a/src/class184/Code06_Freezing2.java b/src/class184/Code06_Freezing2.java new file mode 100644 index 000000000..9c7ec2bbd --- /dev/null +++ b/src/class184/Code06_Freezing2.java @@ -0,0 +1,223 @@ +package class184; + +// 最大上中位数路径,C++版 +// 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 +// 一条简单路径上,收集所有边权组成序列,其中的上中位数作为路径的权 +// 边数在[limitl, limitr]范围的所有路径中,找到最大权的路径 +// 如果有多条路径,找到其中一个方案即可,打印两个端点 +// 1 <= n <= 10^5 0 <= 边权 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/CF150E +// 测试链接 : https://codeforces.com/problemset/problem/150/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Input { +// int u, v, w; +//}; +// +//bool InputCmp(Input a, Input b) { +// return a.w < b.w; +//} +// +//struct Edge { +// int eid, size; +//}; +// +//bool EdgeCmp(Edge a, Edge b) { +// return a.size < b.size; +//} +// +//const int MAXN = 100001; +//const int INF = 1000000001; +//int n, limitl, limitr, cntw; +// +//Input arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//bool vis[MAXN]; +//int siz[MAXN]; +// +//Edge edgeArr[MAXN]; +//int cnte; +// +//int allVal[MAXN]; +//int allNode[MAXN]; +//int allLen; +// +//int curVal[MAXN]; +//int curNode[MAXN]; +//int curLen; +// +//int que[MAXN]; +// +//int ans, ansu, ansv; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void dfs(int u, int fa, int edge, int sum, int limit) { +// if (edge > limitr) { +// return; +// } +// curLen = max(curLen, edge); +// if (sum > curVal[edge]) { +// curVal[edge] = sum; +// curNode[edge] = u; +// } +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, edge + 1, sum + (w >= limit ? 1 : -1), limit); +// } +// } +//} +// +//bool check(int u, int limit) { +// allVal[0] = 0; +// allNode[0] = u; +// allLen = 0; +// for (int k = 1; k <= cnte; k++) { +// int v = to[edgeArr[k].eid]; +// int w = weight[edgeArr[k].eid]; +// for (int i = 1; i <= siz[v]; i++) { +// curVal[i] = -INF; +// } +// curLen = 0; +// dfs(v, u, 1, w >= limit ? 1 : -1, limit); +// int ql = 1, qr = 0; +// for (int i = allLen; i >= limitl; i--) { +// while (ql <= qr && allVal[que[qr]] <= allVal[i]) { +// qr--; +// } +// que[++qr] = i; +// } +// int down = limitr, up = limitl; +// for (int i = 1; i <= curLen; i++) { +// up--; +// if (up >= 0 && up <= allLen) { +// while (ql <= qr && allVal[que[qr]] <= allVal[up]) { +// qr--; +// } +// que[++qr] = up; +// } +// if (ql <= qr && que[ql] == down) { +// ql++; +// } +// down--; +// if (ql <= qr && allVal[que[ql]] + curVal[i] >= 0) { +// if (limit > ans) { +// ans = limit; +// ansu = curNode[i]; +// ansv = allNode[que[ql]]; +// } +// return true; +// } +// } +// for (int i = 1; i <= curLen; i++) { +// if (i > allLen || curVal[i] > allVal[i]) { +// allVal[i] = curVal[i]; +// allNode[i] = curNode[i]; +// } +// } +// allLen = max(allLen, curLen); +// } +// return false; +//} +// +//void calc(int u) { +// getSize(u, 0); +// cnte = 0; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// edgeArr[++cnte] = { e, siz[v] }; +// } +// } +// sort(edgeArr + 1, edgeArr + cnte + 1, EdgeCmp); +// int l = 1, r = cntw, mid; +// while (l <= r) { +// mid = (l + r) >> 1; +// if (check(u, mid)) { +// l = mid + 1; +// } else { +// r = mid - 1; +// } +// if (r <= ans) break; +// } +//} +// +//void solve(int u) { +// vis[u] = true; +// calc(u); +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// solve(getCentroid(v, u)); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> limitl >> limitr; +// for (int i = 1; i < n; i++) { +// cin >> arr[i].u >> arr[i].v >> arr[i].w; +// } +// sort(arr + 1, arr + n, InputCmp); +// cntw = 0; +// for (int i = 1; i < n; i++) { +// if (i == 1 || arr[i - 1].w != arr[i].w) { +// cntw++; +// } +// addEdge(arr[i].u, arr[i].v, cntw); +// addEdge(arr[i].v, arr[i].u, cntw); +// } +// solve(getCentroid(1, 0)); +// cout << ansu << " " << ansv << '\n'; +// return 0; +//} \ No newline at end of file From 04c1123599e1050df1beab4770bc16c5bff4d0c4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 17:07:44 +0800 Subject: [PATCH 1088/1170] modify code --- src/class184/Code07_ModeString1.java | 9 +- src/class184/Code07_ModeString2.java | 175 +++++++++++++++++++++++++++ 2 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 src/class184/Code07_ModeString2.java diff --git a/src/class184/Code07_ModeString1.java b/src/class184/Code07_ModeString1.java index 7df476582..b3435d9d1 100644 --- a/src/class184/Code07_ModeString1.java +++ b/src/class184/Code07_ModeString1.java @@ -1,6 +1,13 @@ package class184; // 模式字符串,java版 +// 一共有n个点,给定n-1条边,所有节点组成一棵树 +// 每个点有点权,是一个大写字母,只考虑大写字母A到Z +// 给定一个长度为m的字符串s,也只由大写字母A到Z组成 +// 考虑点对(u, v)的简单路径,把沿途节点的字母拼接起来 +// 如果拼接字符串恰好是s重复正数次,那么该点对合法 +// 打印合法点对的数量,注意(u, v)和(v, u)是不同的点对 +// 1 <= m <= n <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4075 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -247,7 +254,7 @@ public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); t = in.nextInt(); - for (int c = 1; c <= t; c++) { + for (int k = 1; k <= t; k++) { n = in.nextInt(); m = in.nextInt(); for (int i = 1; i <= n; i++) { diff --git a/src/class184/Code07_ModeString2.java b/src/class184/Code07_ModeString2.java new file mode 100644 index 000000000..7ba972986 --- /dev/null +++ b/src/class184/Code07_ModeString2.java @@ -0,0 +1,175 @@ +package class184; + +// 模式字符串,C++版 +// 一共有n个点,给定n-1条边,所有节点组成一棵树 +// 每个点有点权,是一个大写字母,只考虑大写字母A到Z +// 给定一个长度为m的字符串s,也只由大写字母A到Z组成 +// 考虑点对(u, v)的简单路径,把沿途节点的字母拼接起来 +// 如果拼接字符串恰好是s重复正数次,那么该点对合法 +// 打印合法点对的数量,注意(u, v)和(v, u)是不同的点对 +// 1 <= m <= n <= 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P4075 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const long long MOD = 1000000007; +//const long long BASE = 499; +//int t, n, m; +// +//char val[MAXN]; +//char str[MAXN]; +//int a[MAXN]; +//int b[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//long long pre[MAXN]; +//long long suf[MAXN]; +// +//bool vis[MAXN]; +//int siz[MAXN]; +// +//int deep[MAXN]; +//long long curPre[MAXN]; +//long long curSuf[MAXN]; +//long long allPre[MAXN]; +//long long allSuf[MAXN]; +// +//long long ans; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void dfs(int u, int fa, int dep, long long hash) { +// deep[u] = dep; +// hash = (hash * BASE + (val[u] - 'A' + 1)) % MOD; +// if (hash == pre[dep]) { +// curPre[(dep - 1) % m + 1]++; +// ans += allSuf[m - (dep - 1) % m]; +// } +// if (hash == suf[dep]) { +// curSuf[(dep - 1) % m + 1]++; +// ans += allPre[m - (dep - 1) % m]; +// } +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, dep + 1, hash); +// deep[u] = max(deep[u], deep[v]); +// } +// } +//} +// +//void calc(int u) { +// int maxDep = 0; +// allPre[1] = allSuf[1] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// dfs(v, u, 2, 1LL * (val[u] - 'A' + 1)); +// int curDep = min(deep[v], m); +// for (int i = 1; i <= curDep; i++) { +// allPre[i] += curPre[i]; +// allSuf[i] += curSuf[i]; +// curPre[i] = curSuf[i] = 0; +// } +// maxDep = max(maxDep, curDep); +// } +// } +// for (int i = 1; i <= maxDep; i++) { +// allPre[i] = allSuf[i] = 0; +// } +//} +// +//void solve(int u) { +// vis[u] = true; +// calc(u); +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// solve(getCentroid(v, u)); +// } +// } +//} +// +//void prepare() { +// cntg = 0; +// ans = 0; +// for (int i = 1; i <= n; i++) { +// head[i] = 0; +// vis[i] = false; +// } +// for (int i = 1; i < n; i++) { +// addEdge(a[i], b[i]); +// addEdge(b[i], a[i]); +// } +// long long tmp = 1; +// for (int i = 1; i <= n; i++) { +// pre[i] = (pre[i - 1] + tmp * (str[(i - 1) % m + 1] - 'A' + 1)) % MOD; +// suf[i] = (suf[i - 1] + tmp * (str[m - (i - 1) % m] - 'A' + 1)) % MOD; +// tmp = tmp * BASE % MOD; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> t; +// for (int k = 1; k <= t; k++) { +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> val[i]; +// } +// for (int i = 1; i < n; i++) { +// cin >> a[i] >> b[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> str[i]; +// } +// prepare(); +// solve(getCentroid(1, 0)); +// cout << ans << '\n'; +// } +// return 0; +//} \ No newline at end of file From 22af74b309a91212e89b5dad1bb10248a6805ab6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 17:35:39 +0800 Subject: [PATCH 1089/1170] modify code --- src/class184/{Code06_Freezing1.java => Code05_Freezing1.java} | 2 +- src/class184/{Code06_Freezing2.java => Code05_Freezing2.java} | 0 .../{Code05_TreeDistance1.java => Code06_TreeDistance1.java} | 2 +- .../{Code05_TreeDistance2.java => Code06_TreeDistance2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class184/{Code06_Freezing1.java => Code05_Freezing1.java} (99%) rename src/class184/{Code06_Freezing2.java => Code05_Freezing2.java} (100%) rename src/class184/{Code05_TreeDistance1.java => Code06_TreeDistance1.java} (99%) rename src/class184/{Code05_TreeDistance2.java => Code06_TreeDistance2.java} (100%) diff --git a/src/class184/Code06_Freezing1.java b/src/class184/Code05_Freezing1.java similarity index 99% rename from src/class184/Code06_Freezing1.java rename to src/class184/Code05_Freezing1.java index 20e8a32fe..2a9cd4e8c 100644 --- a/src/class184/Code06_Freezing1.java +++ b/src/class184/Code05_Freezing1.java @@ -16,7 +16,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code06_Freezing1 { +public class Code05_Freezing1 { public static int MAXN = 100001; public static int INF = 1000000001; diff --git a/src/class184/Code06_Freezing2.java b/src/class184/Code05_Freezing2.java similarity index 100% rename from src/class184/Code06_Freezing2.java rename to src/class184/Code05_Freezing2.java diff --git a/src/class184/Code05_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java similarity index 99% rename from src/class184/Code05_TreeDistance1.java rename to src/class184/Code06_TreeDistance1.java index d1be17414..ec7a7cbf3 100644 --- a/src/class184/Code05_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -18,7 +18,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code05_TreeDistance1 { +public class Code06_TreeDistance1 { public static int MAXN = 200001; public static int MAXM = 1000001; diff --git a/src/class184/Code05_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java similarity index 100% rename from src/class184/Code05_TreeDistance2.java rename to src/class184/Code06_TreeDistance2.java From 2e448d368b9c0155ee823ac232b63f7ea8ebe272 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Nov 2025 20:34:21 +0800 Subject: [PATCH 1090/1170] modify code --- src/class184/Code04_Shopping1.java | 4 +--- src/class184/Code04_Shopping2.java | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index b5ff3233e..13e5be6a6 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -5,9 +5,7 @@ // 给定每种物品三个属性,价值v[i]、单价c[i]、数量d[i] // 你逛商店可能会购买物品,要求所有买过东西的商店,在树上必须连通 // 你有m元,打印能获得的最大价值总和 -// 1 <= n <= 500 -// 1 <= m <= 4000 -// 1 <= d[i] <= 2000 +// 1 <= n <= 500 1 <= m <= 4000 1 <= d[i] <= 2000 // 测试链接 : https://www.luogu.com.cn/problem/P6326 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class184/Code04_Shopping2.java b/src/class184/Code04_Shopping2.java index 41e3484a9..822d74c35 100644 --- a/src/class184/Code04_Shopping2.java +++ b/src/class184/Code04_Shopping2.java @@ -5,9 +5,7 @@ // 给定每种物品三个属性,价值v[i]、单价c[i]、数量d[i] // 你逛商店可能会购买物品,要求所有买过东西的商店,在树上必须连通 // 你有m元,打印能获得的最大价值总和 -// 1 <= n <= 500 -// 1 <= m <= 4000 -// 1 <= d[i] <= 2000 +// 1 <= n <= 500 1 <= m <= 4000 1 <= d[i] <= 2000 // 测试链接 : https://www.luogu.com.cn/problem/P6326 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From f8c2158b0e13f091dc6a1590acad6e67375023e1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 11:06:23 +0800 Subject: [PATCH 1091/1170] modify code --- src/class184/Code01_Capital1.java | 28 ++++++++++++++-------------- src/class184/Code01_Capital2.java | 10 +++++----- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/class184/Code01_Capital1.java b/src/class184/Code01_Capital1.java index 57847609d..80a69125c 100644 --- a/src/class184/Code01_Capital1.java +++ b/src/class184/Code01_Capital1.java @@ -35,7 +35,7 @@ public class Code01_Capital1 { public static int[] siz = new int[MAXN]; public static int[] father = new int[MAXN]; - public static int[] curCentroid = new int[MAXN]; + public static int[] nodeRoot = new int[MAXN]; public static int[] que = new int[MAXN]; public static boolean[] nodeVis = new boolean[MAXN]; @@ -43,13 +43,13 @@ public class Code01_Capital1 { // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][4]; - public static int u, f, centroid, e; + public static int u, f, rt, e; public static int stacksize; - public static void push(int u, int f, int centroid, int e) { + public static void push(int u, int f, int rt, int e) { stack[stacksize][0] = u; stack[stacksize][1] = f; - stack[stacksize][2] = centroid; + stack[stacksize][2] = rt; stack[stacksize][3] = e; stacksize++; } @@ -58,7 +58,7 @@ public static void pop() { --stacksize; u = stack[stacksize][0]; f = stack[stacksize][1]; - centroid = stack[stacksize][2]; + rt = stack[stacksize][2]; e = stack[stacksize][3]; } @@ -136,28 +136,28 @@ public static int getCentroid(int u, int fa) { } // 收集信息递归版,java会爆栈,C++可以通过 - public static void dfs1(int u, int fa, int centroid) { + public static void dfs1(int u, int fa, int rt) { father[u] = fa; - curCentroid[u] = centroid; + nodeRoot[u] = rt; nodeVis[u] = false; colorVis[color[u]] = false; for (int e = headg[u]; e > 0; e = nextg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - dfs1(v, u, centroid); + dfs1(v, u, rt); } } } // 收集信息迭代版 - public static void dfs2(int cur, int fa, int cen) { + public static void dfs2(int cur, int fa, int root) { stacksize = 0; - push(cur, fa, cen, -1); + push(cur, fa, root, -1); while (stacksize > 0) { pop(); if (e == -1) { father[u] = f; - curCentroid[u] = centroid; + nodeRoot[u] = rt; nodeVis[u] = false; colorVis[color[u]] = false; e = headg[u]; @@ -165,10 +165,10 @@ public static void dfs2(int cur, int fa, int cen) { e = nextg[e]; } if (e != 0) { - push(u, f, centroid, e); + push(u, f, rt, e); int v = tog[e]; if (v != f && !vis[v]) { - push(v, u, centroid, -1); + push(v, u, rt, -1); } } } @@ -192,7 +192,7 @@ public static int calc(int u) { ans++; for (int e = headc[color[cur]]; e > 0; e = nextc[e]) { int v = toc[e]; - if (curCentroid[v] != u) { + if (nodeRoot[v] != u) { return INF; } if (!nodeVis[v]) { diff --git a/src/class184/Code01_Capital2.java b/src/class184/Code01_Capital2.java index ae0c24392..6a82f65a1 100644 --- a/src/class184/Code01_Capital2.java +++ b/src/class184/Code01_Capital2.java @@ -33,7 +33,7 @@ //int siz[MAXN]; // //int father[MAXN]; -//int curCentroid[MAXN]; +//int nodeRoot[MAXN]; // //int que[MAXN]; //bool nodeVis[MAXN]; @@ -81,15 +81,15 @@ // return u; //} // -//void dfs(int u, int fa, int centroid) { +//void dfs(int u, int fa, int rt) { // father[u] = fa; -// curCentroid[u] = centroid; +// nodeRoot[u] = rt; // nodeVis[u] = false; // colorVis[color[u]] = false; // for (int e = headg[u]; e; e = nextg[e]) { // int v = tog[e]; // if (v != fa && !vis[v]) { -// dfs(v, u, centroid); +// dfs(v, u, rt); // } // } //} @@ -111,7 +111,7 @@ // ans++; // for (int e = headc[color[cur]]; e; e = nextc[e]) { // int v = toc[e]; -// if (curCentroid[v] != u) { +// if (nodeRoot[v] != u) { // return INF; // } // if (!nodeVis[v]) { From 6a3e7548759926c34c3a6fec879847030c885582 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 11:14:23 +0800 Subject: [PATCH 1092/1170] modify code --- src/class184/Code02_Difficult1.java | 48 ++++++++++++++--------------- src/class184/Code02_Difficult2.java | 42 ++++++++++++------------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/class184/Code02_Difficult1.java b/src/class184/Code02_Difficult1.java index c613cba57..e2eae9f0a 100644 --- a/src/class184/Code02_Difficult1.java +++ b/src/class184/Code02_Difficult1.java @@ -31,9 +31,9 @@ public class Code02_Difficult1 { public static int[] color = new int[MAXN << 1]; public static int cntg; - // 遍历之前所有子树形成的线段树,维护最大值信息 - public static long[] allTree = new long[MAXN << 2]; - // 遍历当前子树形成的线段树,维护最大值信息 + // 之前颜色的子树形成的线段树,维护最大值信息 + public static long[] preTree = new long[MAXN << 2]; + // 当前颜色的子树形成的线段树,维护最大值信息 public static long[] curTree = new long[MAXN << 2]; public static boolean[] vis = new boolean[MAXN]; @@ -45,11 +45,11 @@ public class Code02_Difficult1 { public static int[] edgeCnt = new int[MAXN]; public static long[] pathSum = new long[MAXN]; - public static int[] nodeArr = new int[MAXN]; - public static int cnta; - public static int[] bucket = new int[MAXN]; - public static int cntb; + public static int[] subtreeNode = new int[MAXN]; + public static int cnts; + public static int[] colorNode = new int[MAXN]; + public static int cntc; // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; @@ -203,7 +203,7 @@ public static void dfs1(int u, int fa, int preColor, int edge, long sum) { } edgeCnt[u] = edge; pathSum[u] = sum; - nodeArr[++cnta] = u; + subtreeNode[++cnts] = u; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; int c = color[e]; @@ -225,7 +225,7 @@ public static void dfs2(int cur, int fa, int pcolor, int pedge, long psum) { } edgeCnt[u] = edge; pathSum[u] = sum; - nodeArr[++cnta] = u; + subtreeNode[++cnts] = u; e = head[u]; } else { e = nxt[e]; @@ -252,37 +252,37 @@ public static long calc(int u) { } } Arrays.sort(edgeArr, 1, cnte + 1, (a, b) -> a[1] - b[1]); - update(allTree, 0, 0, 0, n, 1); + update(preTree, 0, 0, 0, n, 1); long ans = -INF; - cntb = 0; + cntc = 0; for (int k = 1; k <= cnte; k++) { int v = edgeArr[k][0]; int c = edgeArr[k][1]; if (k > 1 && edgeArr[k - 1][1] != c) { clear(curTree, 0, n, 1); - for (int i = 1; i <= cntb; i++) { - int node = bucket[i]; - update(allTree, edgeCnt[node], pathSum[node], 0, n, 1); + for (int i = 1; i <= cntc; i++) { + int node = colorNode[i]; + update(preTree, edgeCnt[node], pathSum[node], 0, n, 1); } - cntb = 0; + cntc = 0; } - cnta = 0; + cnts = 0; // dfs1(v, u, c, 1, val[c]); dfs2(v, u, c, 1, val[c]); - for (int i = 1; i <= cnta; i++) { - int node = nodeArr[i]; + for (int i = 1; i <= cnts; i++) { + int node = subtreeNode[i]; int l = Math.max(0, limitl - edgeCnt[node]); int r = limitr - edgeCnt[node]; - ans = Math.max(ans, query(allTree, l, r, 0, n, 1) + pathSum[node]); + ans = Math.max(ans, query(preTree, l, r, 0, n, 1) + pathSum[node]); ans = Math.max(ans, query(curTree, l, r, 0, n, 1) + pathSum[node] - val[c]); } - for (int i = 1; i <= cnta; i++) { - int node = nodeArr[i]; - bucket[++cntb] = node; + for (int i = 1; i <= cnts; i++) { + int node = subtreeNode[i]; + colorNode[++cntc] = node; update(curTree, edgeCnt[node], pathSum[node], 0, n, 1); } } - clear(allTree, 0, n, 1); + clear(preTree, 0, n, 1); clear(curTree, 0, n, 1); return ans; } @@ -316,7 +316,7 @@ public static void main(String[] args) throws Exception { addEdge(u, v, c); addEdge(v, u, c); } - build(allTree, 0, n, 1); + build(preTree, 0, n, 1); build(curTree, 0, n, 1); out.println(solve(getCentroid(1, 0))); out.flush(); diff --git a/src/class184/Code02_Difficult2.java b/src/class184/Code02_Difficult2.java index 7943d9895..9d48e582c 100644 --- a/src/class184/Code02_Difficult2.java +++ b/src/class184/Code02_Difficult2.java @@ -36,7 +36,7 @@ //int color[MAXN << 1]; //int cntg; // -//long long allTree[MAXN << 2]; +//long long preTree[MAXN << 2]; //long long curTree[MAXN << 2]; // //bool vis[MAXN]; @@ -47,11 +47,11 @@ // //int edgeCnt[MAXN]; //long long pathSum[MAXN]; -//int nodeArr[MAXN]; -//int cnta; // -//int bucket[MAXN]; -//int cntb; +//int subtreeNode[MAXN]; +//int cnts; +//int colorNode[MAXN]; +//int cntc; // //void addEdge(int u, int v, int c) { // nxt[++cntg] = head[u]; @@ -146,7 +146,7 @@ // } // edgeCnt[u] = edge; // pathSum[u] = sum; -// nodeArr[++cnta] = u; +// subtreeNode[++cnts] = u; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // int c = color[e]; @@ -166,36 +166,36 @@ // } // } // sort(edgeArr + 1, edgeArr + cnte + 1, EdgeCmp); -// update(allTree, 0, 0, 0, n, 1); +// update(preTree, 0, 0, 0, n, 1); // long long ans = -INF; -// cntb = 0; +// cntc = 0; // for (int k = 1; k <= cnte; k++) { // int v = edgeArr[k].node; // int c = edgeArr[k].color; // if (k > 1 && edgeArr[k - 1].color != c) { // clear(curTree, 0, n, 1); -// for (int i = 1; i <= cntb; i++) { -// int node = bucket[i]; -// update(allTree, edgeCnt[node], pathSum[node], 0, n, 1); +// for (int i = 1; i <= cntc; i++) { +// int node = colorNode[i]; +// update(preTree, edgeCnt[node], pathSum[node], 0, n, 1); // } -// cntb = 0; +// cntc = 0; // } -// cnta = 0; +// cnts = 0; // dfs(v, u, c, 1, val[c]); -// for (int i = 1; i <= cnta; i++) { -// int node = nodeArr[i]; +// for (int i = 1; i <= cnts; i++) { +// int node = subtreeNode[i]; // int l = max(0, limitl - edgeCnt[node]); // int r = limitr - edgeCnt[node]; -// ans = max(ans, query(allTree, l, r, 0, n, 1) + pathSum[node]); +// ans = max(ans, query(preTree, l, r, 0, n, 1) + pathSum[node]); // ans = max(ans, query(curTree, l, r, 0, n, 1) + pathSum[node] - val[c]); // } -// for (int i = 1; i <= cnta; i++) { -// int node = nodeArr[i]; -// bucket[++cntb] = node; +// for (int i = 1; i <= cnts; i++) { +// int node = subtreeNode[i]; +// colorNode[++cntc] = node; // update(curTree, edgeCnt[node], pathSum[node], 0, n, 1); // } // } -// clear(allTree, 0, n, 1); +// clear(preTree, 0, n, 1); // clear(curTree, 0, n, 1); // return ans; //} @@ -224,7 +224,7 @@ // addEdge(u, v, c); // addEdge(v, u, c); // } -// build(allTree, 0, n, 1); +// build(preTree, 0, n, 1); // build(curTree, 0, n, 1); // cout << solve(getCentroid(1, 0)) << '\n'; // return 0; From 13ac9c615a7aaaa4143011c6089a69c4554c879d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 11:18:21 +0800 Subject: [PATCH 1093/1170] modify code --- src/class184/Code05_Freezing1.java | 32 +++++++++++++++--------------- src/class184/Code05_Freezing2.java | 32 +++++++++++++++--------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/class184/Code05_Freezing1.java b/src/class184/Code05_Freezing1.java index 2a9cd4e8c..3981a0526 100644 --- a/src/class184/Code05_Freezing1.java +++ b/src/class184/Code05_Freezing1.java @@ -38,9 +38,9 @@ public class Code05_Freezing1 { public static int[][] edgeArr = new int[MAXN][2]; public static int cnte; - public static int[] allVal = new int[MAXN]; - public static int[] allNode = new int[MAXN]; - public static int allLen; + public static int[] preVal = new int[MAXN]; + public static int[] preNode = new int[MAXN]; + public static int preLen; public static int[] curVal = new int[MAXN]; public static int[] curNode = new int[MAXN]; @@ -106,9 +106,9 @@ public static void dfs(int u, int fa, int edge, int sum, int limit) { } public static boolean check(int u, int limit) { - allVal[0] = 0; - allNode[0] = u; - allLen = 0; + preVal[0] = 0; + preNode[0] = u; + preLen = 0; for (int k = 1; k <= cnte; k++) { int v = to[edgeArr[k][0]]; int w = weight[edgeArr[k][0]]; @@ -119,8 +119,8 @@ public static boolean check(int u, int limit) { dfs(v, u, 1, w >= limit ? 1 : -1, limit); int ql = 1, qr = 0; // 根据之前的信息,初步建立窗口,子树按秩处理非常重要 - for (int i = allLen; i >= limitl; i--) { - while (ql <= qr && allVal[que[qr]] <= allVal[i]) { + for (int i = preLen; i >= limitl; i--) { + while (ql <= qr && preVal[que[qr]] <= preVal[i]) { qr--; } que[++qr] = i; @@ -128,8 +128,8 @@ public static boolean check(int u, int limit) { int down = limitr, up = limitl; for (int i = 1; i <= curLen; i++) { up--; - if (up >= 0 && up <= allLen) { - while (ql <= qr && allVal[que[qr]] <= allVal[up]) { + if (up >= 0 && up <= preLen) { + while (ql <= qr && preVal[que[qr]] <= preVal[up]) { qr--; } que[++qr] = up; @@ -138,22 +138,22 @@ public static boolean check(int u, int limit) { ql++; } down--; - if (ql <= qr && allVal[que[ql]] + curVal[i] >= 0) { + if (ql <= qr && preVal[que[ql]] + curVal[i] >= 0) { if (limit > ans) { ans = limit; ansu = curNode[i]; - ansv = allNode[que[ql]]; + ansv = preNode[que[ql]]; } return true; } } for (int i = 1; i <= curLen; i++) { - if (i > allLen || curVal[i] > allVal[i]) { - allVal[i] = curVal[i]; - allNode[i] = curNode[i]; + if (i > preLen || curVal[i] > preVal[i]) { + preVal[i] = curVal[i]; + preNode[i] = curNode[i]; } } - allLen = Math.max(allLen, curLen); + preLen = Math.max(preLen, curLen); } return false; } diff --git a/src/class184/Code05_Freezing2.java b/src/class184/Code05_Freezing2.java index 9c7ec2bbd..c33168b34 100644 --- a/src/class184/Code05_Freezing2.java +++ b/src/class184/Code05_Freezing2.java @@ -49,9 +49,9 @@ //Edge edgeArr[MAXN]; //int cnte; // -//int allVal[MAXN]; -//int allNode[MAXN]; -//int allLen; +//int preVal[MAXN]; +//int preNode[MAXN]; +//int preLen; // //int curVal[MAXN]; //int curNode[MAXN]; @@ -117,9 +117,9 @@ //} // //bool check(int u, int limit) { -// allVal[0] = 0; -// allNode[0] = u; -// allLen = 0; +// preVal[0] = 0; +// preNode[0] = u; +// preLen = 0; // for (int k = 1; k <= cnte; k++) { // int v = to[edgeArr[k].eid]; // int w = weight[edgeArr[k].eid]; @@ -129,8 +129,8 @@ // curLen = 0; // dfs(v, u, 1, w >= limit ? 1 : -1, limit); // int ql = 1, qr = 0; -// for (int i = allLen; i >= limitl; i--) { -// while (ql <= qr && allVal[que[qr]] <= allVal[i]) { +// for (int i = preLen; i >= limitl; i--) { +// while (ql <= qr && preVal[que[qr]] <= preVal[i]) { // qr--; // } // que[++qr] = i; @@ -138,8 +138,8 @@ // int down = limitr, up = limitl; // for (int i = 1; i <= curLen; i++) { // up--; -// if (up >= 0 && up <= allLen) { -// while (ql <= qr && allVal[que[qr]] <= allVal[up]) { +// if (up >= 0 && up <= preLen) { +// while (ql <= qr && preVal[que[qr]] <= preVal[up]) { // qr--; // } // que[++qr] = up; @@ -148,22 +148,22 @@ // ql++; // } // down--; -// if (ql <= qr && allVal[que[ql]] + curVal[i] >= 0) { +// if (ql <= qr && preVal[que[ql]] + curVal[i] >= 0) { // if (limit > ans) { // ans = limit; // ansu = curNode[i]; -// ansv = allNode[que[ql]]; +// ansv = preNode[que[ql]]; // } // return true; // } // } // for (int i = 1; i <= curLen; i++) { -// if (i > allLen || curVal[i] > allVal[i]) { -// allVal[i] = curVal[i]; -// allNode[i] = curNode[i]; +// if (i > preLen || curVal[i] > preVal[i]) { +// preVal[i] = curVal[i]; +// preNode[i] = curNode[i]; // } // } -// allLen = max(allLen, curLen); +// preLen = max(preLen, curLen); // } // return false; //} From 753d892f5d503c112a9a8018be9632def3f1ca8c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 12:21:58 +0800 Subject: [PATCH 1094/1170] modify code --- src/class184/Code07_ModeString1.java | 34 ++++++++++++++-------------- src/class184/Code07_ModeString2.java | 26 ++++++++++----------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/class184/Code07_ModeString1.java b/src/class184/Code07_ModeString1.java index b3435d9d1..772552b4e 100644 --- a/src/class184/Code07_ModeString1.java +++ b/src/class184/Code07_ModeString1.java @@ -40,10 +40,10 @@ public class Code07_ModeString1 { public static int[] siz = new int[MAXN]; public static int[] deep = new int[MAXN]; - public static long[] curPre = new long[MAXN]; - public static long[] curSuf = new long[MAXN]; - public static long[] allPre = new long[MAXN]; - public static long[] allSuf = new long[MAXN]; + public static long[] curp = new long[MAXN]; + public static long[] curs = new long[MAXN]; + public static long[] allp = new long[MAXN]; + public static long[] alls = new long[MAXN]; public static long ans; @@ -144,12 +144,12 @@ public static void dfs1(int u, int fa, int dep, long hash) { deep[u] = dep; hash = (hash * BASE + val[u] - 'A' + 1) % MOD; if (hash == pre[dep]) { - curPre[(dep - 1) % m + 1]++; - ans += allSuf[m - (dep - 1) % m]; + curp[(dep - 1) % m + 1]++; + ans += alls[m - (dep - 1) % m]; } if (hash == suf[dep]) { - curSuf[(dep - 1) % m + 1]++; - ans += allPre[m - (dep - 1) % m]; + curs[(dep - 1) % m + 1]++; + ans += allp[m - (dep - 1) % m]; } for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -170,12 +170,12 @@ public static void dfs2(int cur, int fa, int pdep, long phash) { deep[u] = dep; hash = (hash * BASE + val[u] - 'A' + 1) % MOD; if (hash == pre[dep]) { - curPre[(dep - 1) % m + 1]++; - ans += allSuf[m - (dep - 1) % m]; + curp[(dep - 1) % m + 1]++; + ans += alls[m - (dep - 1) % m]; } if (hash == suf[dep]) { - curSuf[(dep - 1) % m + 1]++; - ans += allPre[m - (dep - 1) % m]; + curs[(dep - 1) % m + 1]++; + ans += allp[m - (dep - 1) % m]; } e = head[u]; } else { @@ -200,7 +200,7 @@ public static void dfs2(int cur, int fa, int pdep, long phash) { public static void calc(int u) { int maxDep = 0; - allPre[1] = allSuf[1] = 1; + allp[1] = alls[1] = 1; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { @@ -208,15 +208,15 @@ public static void calc(int u) { dfs2(v, u, 2, val[u] - 'A' + 1); int curDep = Math.min(deep[v], m); for (int i = 1; i <= curDep; i++) { - allPre[i] += curPre[i]; - allSuf[i] += curSuf[i]; - curPre[i] = curSuf[i] = 0; + allp[i] += curp[i]; + alls[i] += curs[i]; + curp[i] = curs[i] = 0; } maxDep = Math.max(maxDep, curDep); } } for (int i = 1; i <= maxDep; i++) { - allPre[i] = allSuf[i] = 0; + allp[i] = alls[i] = 0; } } diff --git a/src/class184/Code07_ModeString2.java b/src/class184/Code07_ModeString2.java index 7ba972986..04c812163 100644 --- a/src/class184/Code07_ModeString2.java +++ b/src/class184/Code07_ModeString2.java @@ -38,10 +38,10 @@ //int siz[MAXN]; // //int deep[MAXN]; -//long long curPre[MAXN]; -//long long curSuf[MAXN]; -//long long allPre[MAXN]; -//long long allSuf[MAXN]; +//long long curp[MAXN]; +//long long curs[MAXN]; +//long long allp[MAXN]; +//long long alls[MAXN]; // //long long ans; // @@ -85,12 +85,12 @@ // deep[u] = dep; // hash = (hash * BASE + (val[u] - 'A' + 1)) % MOD; // if (hash == pre[dep]) { -// curPre[(dep - 1) % m + 1]++; -// ans += allSuf[m - (dep - 1) % m]; +// curp[(dep - 1) % m + 1]++; +// ans += alls[m - (dep - 1) % m]; // } // if (hash == suf[dep]) { -// curSuf[(dep - 1) % m + 1]++; -// ans += allPre[m - (dep - 1) % m]; +// curs[(dep - 1) % m + 1]++; +// ans += allp[m - (dep - 1) % m]; // } // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; @@ -103,22 +103,22 @@ // //void calc(int u) { // int maxDep = 0; -// allPre[1] = allSuf[1] = 1; +// allp[1] = alls[1] = 1; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { // dfs(v, u, 2, 1LL * (val[u] - 'A' + 1)); // int curDep = min(deep[v], m); // for (int i = 1; i <= curDep; i++) { -// allPre[i] += curPre[i]; -// allSuf[i] += curSuf[i]; -// curPre[i] = curSuf[i] = 0; +// allp[i] += curp[i]; +// alls[i] += curs[i]; +// curp[i] = curs[i] = 0; // } // maxDep = max(maxDep, curDep); // } // } // for (int i = 1; i <= maxDep; i++) { -// allPre[i] = allSuf[i] = 0; +// allp[i] = alls[i] = 0; // } //} // From 9d1c3b451bb9341525db8ae61cd6edb67a8619fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 12:51:35 +0800 Subject: [PATCH 1095/1170] modify code --- src/class184/Code06_TreeDistance1.java | 77 ++++++++++++++++---------- src/class184/Code06_TreeDistance2.java | 66 ++++++++++++++-------- 2 files changed, 90 insertions(+), 53 deletions(-) diff --git a/src/class184/Code06_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java index ec7a7cbf3..889046b17 100644 --- a/src/class184/Code06_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -47,7 +47,8 @@ public class Code06_TreeDistance1 { public static int[] nodeArr = new int[MAXN]; public static int cnta; public static int[] sta = new int[MAXN]; - public static long[] tree = new long[MAXN]; + + public static long[] minv = new long[MAXN << 2]; public static long[] ans = new long[MAXM]; @@ -74,13 +75,13 @@ public static void pop() { dis = distst[stacksize]; } - // 所有查询,根据x的值,从大到小排序,java自带的排序慢,手撸双指针快排 + // 所有查询根据y从小到大排序,java自带的排序慢,手撸双指针快排 public static void sortQuery(int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = qx[(l + r) >> 1], tmp; + int i = l, j = r, pivot = qy[(l + r) >> 1], tmp; while (i <= j) { - while (qx[i] > pivot) i++; - while (qx[j] < pivot) j--; + while (qy[i] < pivot) i++; + while (qy[j] > pivot) j--; if (i <= j) { tmp = qx[i]; qx[i] = qx[j]; qx[j] = tmp; tmp = qy[i]; qy[i] = qy[j]; qy[j] = tmp; @@ -92,14 +93,14 @@ public static void sortQuery(int l, int r) { sortQuery(i, r); } - // 所有关键点,根据a的值,从大到小排序,java自带的排序慢,手撸双指针快排 + // 所有关键点根据b从小到大排序,java自带的排序慢,手撸双指针快排 public static void sortKey(int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = keya[(l + r) >> 1], t1; + int i = l, j = r, pivot = keyb[(l + r) >> 1], t1; long t2; while (i <= j) { - while (keya[i] > pivot) i++; - while (keya[j] < pivot) j--; + while (keyb[i] < pivot) i++; + while (keyb[j] > pivot) j--; if (i <= j) { t1 = keya[i]; keya[i] = keya[j]; keya[j] = t1; t1 = keyb[i]; keyb[i] = keyb[j]; keyb[j] = t1; @@ -252,45 +253,63 @@ public static void solve(int u) { } } - public static void buildTree() { - for (int i = 1; i <= n; i++) { - tree[i] = INF; - } + public static void up(int i) { + minv[i] = Math.min(minv[i << 1], minv[i << 1 | 1]); } - public static int lowbit(int i) { - return i & -i; + public static void build(int l, int r, int i) { + if (l == r) { + minv[i] = INF; + } else { + int mid = (l + r) >> 1; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } } - public static void add(int i, long v) { - while (i <= n) { - tree[i] = Math.min(tree[i], v); - i += lowbit(i); + public static void update(int jobi, long jobv, int l, int r, int i) { + if (l == r) { + minv[i] = Math.min(minv[i], jobv); + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + update(jobi, jobv, l, mid, i << 1); + } else { + update(jobi, jobv, mid + 1, r, i << 1 | 1); + } + up(i); } } - public static long query(int i) { - long ret = INF; - while (i > 0) { - ret = Math.min(ret, tree[i]); - i -= lowbit(i); + public static long query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return minv[i]; + } + long ans = INF; + int mid = (l + r) >> 1; + if (jobl <= mid) { + ans = Math.min(ans, query(jobl, jobr, l, mid, i << 1)); + } + if (jobr > mid) { + ans = Math.min(ans, query(jobl, jobr, mid + 1, r, i << 1 | 1)); } - return ret; + return ans; } public static void compute() { solve(getCentroid(1, 0)); sortQuery(1, m); sortKey(1, cntk); - buildTree(); + build(1, n, 1); for (int i = 1, j = 1; i <= m; i++) { - for (; j <= cntk && keya[j] >= qx[i]; j++) { - add(keyb[j], keyDist[j]); + for (; j <= cntk && keyb[j] <= qy[i]; j++) { + update(keya[j], keyDist[j], 1, n, 1); } if (qx[i] == qy[i]) { ans[qid[i]] = -1; } else { - ans[qid[i]] = query(qy[i]); + ans[qid[i]] = query(qx[i], qy[i], 1, n, 1); } } } diff --git a/src/class184/Code06_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java index 9b23d0d13..600371bb9 100644 --- a/src/class184/Code06_TreeDistance2.java +++ b/src/class184/Code06_TreeDistance2.java @@ -27,11 +27,11 @@ //}; // //bool QueryCmp(Query q1, Query q2) { -// return q1.x > q2.x; +// return q1.y < q2.y; //} // //bool KeyCmp(Key k1, Key k2) { -// return k1.a > k2.a; +// return k1.b < k2.b; //} // //const int MAXN = 200001; @@ -57,7 +57,8 @@ //int nodeArr[MAXN]; //int cnta; //int sta[MAXN]; -//long long tree[MAXN]; +// +//long long minv[MAXN << 2]; // //long long ans[MAXM]; // @@ -139,46 +140,63 @@ // } //} // -//void buildTree() { -// for (int i = 1; i <= n; i++) { -// tree[i] = INF; -// } +//void up(int i) { +// minv[i] = min(minv[i << 1], minv[i << 1 | 1]); //} // -//int lowbit(int i) { -// return i & -i; +//void build(int l, int r, int i) { +// if (l == r) { +// minv[i] = INF; +// } else { +// int mid = (l + r) >> 1; +// build(l, mid, i << 1); +// build(mid + 1, r, i << 1 | 1); +// up(i); +// } //} // -//void add(int i, long long v) { -// while (i <= n) { -// tree[i] = min(tree[i], v); -// i += lowbit(i); +//void update(int jobi, long long jobv, int l, int r, int i) { +// if (l == r) { +// minv[i] = min(minv[i], jobv); +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// update(jobi, jobv, l, mid, i << 1); +// } else { +// update(jobi, jobv, mid + 1, r, i << 1 | 1); +// } +// up(i); // } //} // -//long long query(int i) { -// long long ret = INF; -// while (i > 0) { -// ret = min(ret, tree[i]); -// i -= lowbit(i); +//long long query(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return minv[i]; +// } +// long long ans = INF; +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// ans = min(ans, query(jobl, jobr, l, mid, i << 1)); +// } +// if (jobr > mid) { +// ans = min(ans, query(jobl, jobr, mid + 1, r, i << 1 | 1)); // } -// return ret; +// return ans; //} // //void compute() { // solve(getCentroid(1, 0)); // sort(queryArr + 1, queryArr + m + 1, QueryCmp); // sort(keyArr + 1, keyArr + cntk + 1, KeyCmp); -// buildTree(); -// int idx = 1; +// build(1, n, 1); // for (int i = 1, j = 1; i <= m; i++) { -// for (; j <= cntk && keyArr[j].a >= queryArr[i].x; j++) { -// add(keyArr[j].b, keyArr[j].dist); +// for (; j <= cntk && keyArr[j].b <= queryArr[i].y; j++) { +// update(keyArr[j].a, keyArr[j].dist, 1, n, 1); // } // if (queryArr[i].x == queryArr[i].y) { // ans[queryArr[i].id] = -1; // } else { -// ans[queryArr[i].id] = query(queryArr[i].y); +// ans[queryArr[i].id] = query(queryArr[i].x, queryArr[i].y, 1, n, 1); // } // } //} From 1b916aa5fed6e6fb7d1541f2ace10345d9512549 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 13:00:09 +0800 Subject: [PATCH 1096/1170] modify code --- src/class184/Code06_TreeDistance1.java | 12 ++++++------ src/class184/Code06_TreeDistance2.java | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class184/Code06_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java index 889046b17..3a87c0b50 100644 --- a/src/class184/Code06_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -1,13 +1,13 @@ package class184; -// 支配点对距离,java版 +// 关键点对距离,java版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 // 节点i到节点j的简单路径边权和,定义为dist(i, j) // 编号区间[x, y],考虑所有点对(a, b),要求 x <= a < b <= y -// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的支配点对 -// 也可以说,区间[x, y]的支配点对距离为dist(a, b) -// 特别的,如果x == y,那么不存在满足要求的点对,此时支配点对距离为-1 -// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的支配点对距离 +// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的关键点对 +// 也可以说,区间[x, y]的关键点对距离为dist(a, b) +// 特别的,如果x == y,那么不存在满足要求的点对,此时关键点对距离为-1 +// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的关键点对距离 // 1 <= n <= 2 * 10^5 1 <= m <= 10^6 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -93,7 +93,7 @@ public static void sortQuery(int l, int r) { sortQuery(i, r); } - // 所有关键点根据b从小到大排序,java自带的排序慢,手撸双指针快排 + // 所有关键点对根据b从小到大排序,java自带的排序慢,手撸双指针快排 public static void sortKey(int l, int r) { if (l >= r) return; int i = l, j = r, pivot = keyb[(l + r) >> 1], t1; diff --git a/src/class184/Code06_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java index 600371bb9..fc34a3c55 100644 --- a/src/class184/Code06_TreeDistance2.java +++ b/src/class184/Code06_TreeDistance2.java @@ -1,13 +1,13 @@ package class184; -// 支配点对距离,C++版 +// 关键点对距离,C++版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 // 节点i到节点j的简单路径边权和,定义为dist(i, j) // 编号区间[x, y],考虑所有点对(a, b),要求 x <= a < b <= y -// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的支配点对 -// 也可以说,区间[x, y]的支配点对距离为dist(a, b) -// 特别的,如果x == y,那么不存在满足要求的点对,此时支配点对距离为-1 -// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的支配点对距离 +// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的关键点对 +// 也可以说,区间[x, y]的关键点对距离为dist(a, b) +// 特别的,如果x == y,那么不存在满足要求的点对,此时关键点对距离为-1 +// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的关键点对距离 // 1 <= n <= 2 * 10^5 1 <= m <= 10^6 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 4ff54e547d7674361e521bb668a8658d0fcc8cac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 13:37:13 +0800 Subject: [PATCH 1097/1170] modify code --- src/class184/Code06_TreeDistance1.java | 10 +++++----- src/class184/Code06_TreeDistance2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class184/Code06_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java index 3a87c0b50..15a0ad19e 100644 --- a/src/class184/Code06_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -1,13 +1,13 @@ package class184; -// 关键点对距离,java版 +// 支配点对距离,java版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 // 节点i到节点j的简单路径边权和,定义为dist(i, j) // 编号区间[x, y],考虑所有点对(a, b),要求 x <= a < b <= y -// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的关键点对 -// 也可以说,区间[x, y]的关键点对距离为dist(a, b) -// 特别的,如果x == y,那么不存在满足要求的点对,此时关键点对距离为-1 -// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的关键点对距离 +// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的支配点对 +// 也可以说,区间[x, y]的支配点对距离为dist(a, b) +// 特别的,如果x == y,那么不存在满足要求的点对,此时支配点对距离为-1 +// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的支配点对距离 // 1 <= n <= 2 * 10^5 1 <= m <= 10^6 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class184/Code06_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java index fc34a3c55..600371bb9 100644 --- a/src/class184/Code06_TreeDistance2.java +++ b/src/class184/Code06_TreeDistance2.java @@ -1,13 +1,13 @@ package class184; -// 关键点对距离,C++版 +// 支配点对距离,C++版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 // 节点i到节点j的简单路径边权和,定义为dist(i, j) // 编号区间[x, y],考虑所有点对(a, b),要求 x <= a < b <= y -// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的关键点对 -// 也可以说,区间[x, y]的关键点对距离为dist(a, b) -// 特别的,如果x == y,那么不存在满足要求的点对,此时关键点对距离为-1 -// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的关键点对距离 +// 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的支配点对 +// 也可以说,区间[x, y]的支配点对距离为dist(a, b) +// 特别的,如果x == y,那么不存在满足要求的点对,此时支配点对距离为-1 +// 一共有m次查询,格式 x y : 保证x <= y,打印[x, y]的支配点对距离 // 1 <= n <= 2 * 10^5 1 <= m <= 10^6 1 <= 边权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P9678 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 7b3cdad0d0ed6435b1c111b2c7a3f42034fff07a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 15:40:39 +0800 Subject: [PATCH 1098/1170] modify code --- src/class184/Code01_Capital1.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/class184/Code01_Capital1.java b/src/class184/Code01_Capital1.java index 80a69125c..4f391a23d 100644 --- a/src/class184/Code01_Capital1.java +++ b/src/class184/Code01_Capital1.java @@ -21,24 +21,32 @@ public class Code01_Capital1 { public static int n, k; public static int[] color = new int[MAXN]; + // 建树的链式前向星 public static int[] headg = new int[MAXN]; public static int[] nextg = new int[MAXN << 1]; public static int[] tog = new int[MAXN << 1]; public static int cntg; + // 颜色拥有的节点列表 public static int[] headc = new int[MAXN]; public static int[] nextc = new int[MAXN]; public static int[] toc = new int[MAXN]; public static int cntc; + // 点分治 public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; + // father[x] = y,表示x此时的父亲节点是y public static int[] father = new int[MAXN]; + // nodeRoot[x] = y,表示x此时的重心是y public static int[] nodeRoot = new int[MAXN]; + // 宽度优先遍历的队列 public static int[] que = new int[MAXN]; + // 节点是否进过队列 public static boolean[] nodeVis = new boolean[MAXN]; + // 颜色是否讨论过 public static boolean[] colorVis = new boolean[MAXN]; // 讲解118,递归函数改成迭代所需要的栈 From a96caffc9cae66a698dc1d564ff60900f3d42d11 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 21:43:04 +0800 Subject: [PATCH 1099/1170] modify code --- src/class184/Code04_Shopping1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 13e5be6a6..73493b593 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -113,15 +113,15 @@ public static int calc(int u) { val[++num] = v[cur] * cnt; cost[num] = c[cur] * cnt; } - // 如果不选cur,那么整棵子树都不能选了,跳到endDfn[cur] + 1 + // 不选cur的情况,那么cur的子树都跳过,直接跳到endDfn[cur] + 1 for (int j = 0; j <= m; j++) { dp[i][j] = dp[endDfn[cur] + 1][j]; } - // 如果选cur,那么先必选一件 + // 必选cur的情况,先只选一件 for (int j = m; j >= c[cur]; j--) { dp[i][j] = Math.max(dp[i][j], dp[i + 1][j - c[cur]] + v[cur]); } - // 然后在一件的基础上,增加更多 + // 然后用二进制分组,拼出可能的更多件 for (int k = 1; k <= num; k++) { for (int j = m; j >= cost[k]; j--) { dp[i][j] = Math.max(dp[i][j], dp[i][j - cost[k]] + val[k]); From c8cefe6aa8c14aca0f12b64f3b6685adce6fd31b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 21:46:43 +0800 Subject: [PATCH 1100/1170] modify code --- src/class184/Code04_Shopping1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 73493b593..6fa8eb2f0 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -114,6 +114,7 @@ public static int calc(int u) { cost[num] = c[cur] * cnt; } // 不选cur的情况,那么cur的子树都跳过,直接跳到endDfn[cur] + 1 + // 这里需要理解有效结构的概念,讲解079,题目5的最优解,进行了讲述 for (int j = 0; j <= m; j++) { dp[i][j] = dp[endDfn[cur] + 1][j]; } From 1fa0eeab3b69afc773c679eedb403ee798d999a5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Nov 2025 22:45:24 +0800 Subject: [PATCH 1101/1170] modify code --- src/class184/Code04_Shopping1.java | 14 +++++++------- src/class184/Code04_Shopping2.java | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 6fa8eb2f0..7877ac86d 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -113,14 +113,9 @@ public static int calc(int u) { val[++num] = v[cur] * cnt; cost[num] = c[cur] * cnt; } - // 不选cur的情况,那么cur的子树都跳过,直接跳到endDfn[cur] + 1 - // 这里需要理解有效结构的概念,讲解079,题目5的最优解,进行了讲述 - for (int j = 0; j <= m; j++) { - dp[i][j] = dp[endDfn[cur] + 1][j]; - } - // 必选cur的情况,先只选一件 + // 必选cur的情况,先必选一件 for (int j = m; j >= c[cur]; j--) { - dp[i][j] = Math.max(dp[i][j], dp[i + 1][j - c[cur]] + v[cur]); + dp[i][j] = dp[i + 1][j - c[cur]] + v[cur]; } // 然后用二进制分组,拼出可能的更多件 for (int k = 1; k <= num; k++) { @@ -128,6 +123,11 @@ public static int calc(int u) { dp[i][j] = Math.max(dp[i][j], dp[i][j - cost[k]] + val[k]); } } + // 不选cur的情况,那么cur的子树都跳过,直接跳到endDfn[cur] + 1 + // 这里需要理解有效结构的概念,讲解079,题目5的最优解,进行了讲述 + for (int j = 0; j <= m; j++) { + dp[i][j] = Math.max(dp[i][j], dp[endDfn[cur] + 1][j]); + } } int ans = dp[1][m]; // 返回之前清空 diff --git a/src/class184/Code04_Shopping2.java b/src/class184/Code04_Shopping2.java index 822d74c35..7d74861de 100644 --- a/src/class184/Code04_Shopping2.java +++ b/src/class184/Code04_Shopping2.java @@ -109,17 +109,17 @@ // val[++num] = v[cur] * cnt; // cost[num] = c[cur] * cnt; // } -// for (int j = 0; j <= m; j++) { -// dp[i][j] = dp[endDfn[cur] + 1][j]; -// } // for (int j = m; j >= c[cur]; j--) { -// dp[i][j] = max(dp[i][j], dp[i + 1][j - c[cur]] + v[cur]); +// dp[i][j] = dp[i + 1][j - c[cur]] + v[cur]; // } // for (int k = 1; k <= num; k++) { // for (int j = m; j >= cost[k]; j--) { // dp[i][j] = max(dp[i][j], dp[i][j - cost[k]] + val[k]); // } // } +// for (int j = 0; j <= m; j++) { +// dp[i][j] = max(dp[i][j], dp[endDfn[cur] + 1][j]); +// } // } // int ans = dp[1][m]; // for (int i = 1; i <= cntd; i++) { From b76429751462fcdacab1cb19c959c353cceb9148 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 11:17:36 +0800 Subject: [PATCH 1102/1170] modify code --- src/class184/Code04_Shopping1.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 7877ac86d..3c64d968f 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -95,15 +95,19 @@ public static void dfs(int u, int fa) { endDfn[u] = cntd; } + // 需要理解有效结构的概念,讲解079,题目5的最优解,进行了讲述 + // 需要理解多重背包的二进制分组优化,讲解075,进行了讲述 + // 采用二进制分组优化的原因是代码量小,复杂度会多一个log + // 有兴趣的同学,可以自行尝试单调队列优化的方式,代码较多 public static int calc(int u) { cntd = 0; dfs(u, 0); for (int i = cntd; i > 0; i--) { int cur = nodeArr[i]; + // 二进制分组优化,注意物品量-1,然后二进制分组 + // 因为会必选一件,然后考虑更多件,原因课上解释了 int cnt = d[cur] - 1; int num = 0; - // 这里用二进制分组处理多重背包,代码量较小 - // 也可以用单调队列,之前的课都讲过,码量大 for (int k = 1; k <= cnt; k <<= 1) { val[++num] = v[cur] * k; cost[num] = c[cur] * k; @@ -124,7 +128,6 @@ public static int calc(int u) { } } // 不选cur的情况,那么cur的子树都跳过,直接跳到endDfn[cur] + 1 - // 这里需要理解有效结构的概念,讲解079,题目5的最优解,进行了讲述 for (int j = 0; j <= m; j++) { dp[i][j] = Math.max(dp[i][j], dp[endDfn[cur] + 1][j]); } From a2a9f6686fb8c1e0b465961b63fc19072a982ecc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 11:41:37 +0800 Subject: [PATCH 1103/1170] modify code --- src/class079/Code05_CourseSelection1.java | 2 +- src/class079/Code05_CourseSelection2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class079/Code05_CourseSelection1.java b/src/class079/Code05_CourseSelection1.java index 5c38017a4..04ed77d2c 100644 --- a/src/class079/Code05_CourseSelection1.java +++ b/src/class079/Code05_CourseSelection1.java @@ -1,6 +1,6 @@ package class079; -// 选课 +// 选课,树上01背包的普通解法 // 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习 // 在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习 // 现在有 N 门功课,每门课有个学分,每门课有一门或没有直接先修课 diff --git a/src/class079/Code05_CourseSelection2.java b/src/class079/Code05_CourseSelection2.java index afeabe6c3..85ea8f4a8 100644 --- a/src/class079/Code05_CourseSelection2.java +++ b/src/class079/Code05_CourseSelection2.java @@ -1,6 +1,6 @@ package class079; -// 选课 +// 选课,树上01背包的最优解 // 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习 // 在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习 // 现在有 N 门功课,每门课有个学分,每门课有一门或没有直接先修课 From 4fac5f383e227dd48f0f702a2bae739a82ac7d7c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 12:42:19 +0800 Subject: [PATCH 1104/1170] modify code --- src/class079/Code05_CourseSelection2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class079/Code05_CourseSelection2.java b/src/class079/Code05_CourseSelection2.java index 85ea8f4a8..e558970c5 100644 --- a/src/class079/Code05_CourseSelection2.java +++ b/src/class079/Code05_CourseSelection2.java @@ -21,7 +21,7 @@ import java.util.Arrays; // 最优解,链式前向星建图 + dfn序的利用 + 巧妙定义下的尝试 -// 时间复杂度O(n*m),觉得难可以跳过,这个最优解是非常巧妙和精彩的! +// 时间复杂度O(n * m),推荐掌握,尤其是理解有效结构 public class Code05_CourseSelection2 { public static int MAXN = 301; From 180b6d1a6bb6399ad489ef581ff49fdb52afe883 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 12:49:48 +0800 Subject: [PATCH 1105/1170] modify code --- ...6\240\221\345\236\213dp-\344\270\213.pptx" | Bin 108364 -> 107935 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243079\343\200\220\345\277\205\345\244\207\343\200\221\346\240\221\345\236\213dp-\344\270\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243079\343\200\220\345\277\205\345\244\207\343\200\221\346\240\221\345\236\213dp-\344\270\213.pptx" index 330e505e60166d478d30e4e2948da3d954200ba0..b83d59d23326bac322499197c4557d4fc5bedc63 100644 GIT binary patch delta 5087 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 Hs{{QH?e?j2 delta 5566 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 From 5d33a2f2a7a0af1a70ffa1d0ebdca84c3306db09 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 13:15:31 +0800 Subject: [PATCH 1106/1170] modify code --- src/class184/Code05_Freezing1.java | 4 ++-- src/class184/Code05_Freezing2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class184/Code05_Freezing1.java b/src/class184/Code05_Freezing1.java index 3981a0526..c3db031f2 100644 --- a/src/class184/Code05_Freezing1.java +++ b/src/class184/Code05_Freezing1.java @@ -1,8 +1,8 @@ package class184; -// 最大上中位数路径,java版 +// 最大中位数路径,java版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 -// 一条简单路径上,收集所有边权组成序列,其中的上中位数作为路径的权 +// 一条简单路径上,收集所有边权组成序列,其中的 下中位数 作为路径的权 // 边数在[limitl, limitr]范围的所有路径中,找到最大权的路径 // 如果有多条路径,找到其中一个方案即可,打印两个端点 // 1 <= n <= 10^5 0 <= 边权 <= 10^9 diff --git a/src/class184/Code05_Freezing2.java b/src/class184/Code05_Freezing2.java index c33168b34..2df420b04 100644 --- a/src/class184/Code05_Freezing2.java +++ b/src/class184/Code05_Freezing2.java @@ -1,8 +1,8 @@ package class184; -// 最大上中位数路径,C++版 +// 最大中位数路径,C++版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 -// 一条简单路径上,收集所有边权组成序列,其中的上中位数作为路径的权 +// 一条简单路径上,收集所有边权组成序列,其中的 下中位数 作为路径的权 // 边数在[limitl, limitr]范围的所有路径中,找到最大权的路径 // 如果有多条路径,找到其中一个方案即可,打印两个端点 // 1 <= n <= 10^5 0 <= 边权 <= 10^9 From fd433cf706f6a9d33eed78af5d346e6e579eb5f0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 13:19:01 +0800 Subject: [PATCH 1107/1170] modify code --- src/class184/Code04_Shopping1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 3c64d968f..c15b821c9 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -95,10 +95,10 @@ public static void dfs(int u, int fa) { endDfn[u] = cntd; } - // 需要理解有效结构的概念,讲解079,题目5的最优解,进行了讲述 - // 需要理解多重背包的二进制分组优化,讲解075,进行了讲述 - // 采用二进制分组优化的原因是代码量小,复杂度会多一个log - // 有兴趣的同学,可以自行尝试单调队列优化的方式,代码较多 + // 讲解079,题目5树上01背包,掌握最优解,理解有效结构的概念 + // 讲解075,掌握多重背包的二进制分组优化 + // 采用二进制分组优化的原因是代码量小,复杂度多一个log + // 有兴趣的同学,可以尝试单调队列优化的方式,代码较多 public static int calc(int u) { cntd = 0; dfs(u, 0); From 996f4cab56116d1e6faf92e98907e53efeb9edd6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 13:26:50 +0800 Subject: [PATCH 1108/1170] modify code --- src/class184/Code04_Shopping1.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index c15b821c9..433478c7f 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -95,10 +95,6 @@ public static void dfs(int u, int fa) { endDfn[u] = cntd; } - // 讲解079,题目5树上01背包,掌握最优解,理解有效结构的概念 - // 讲解075,掌握多重背包的二进制分组优化 - // 采用二进制分组优化的原因是代码量小,复杂度多一个log - // 有兴趣的同学,可以尝试单调队列优化的方式,代码较多 public static int calc(int u) { cntd = 0; dfs(u, 0); From 189a3d6a108be97894d0b3ea338010386a24c127 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 15:14:36 +0800 Subject: [PATCH 1109/1170] modify code --- src/class184/Code04_Shopping1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class184/Code04_Shopping1.java b/src/class184/Code04_Shopping1.java index 433478c7f..983ec68fc 100644 --- a/src/class184/Code04_Shopping1.java +++ b/src/class184/Code04_Shopping1.java @@ -101,7 +101,7 @@ public static int calc(int u) { for (int i = cntd; i > 0; i--) { int cur = nodeArr[i]; // 二进制分组优化,注意物品量-1,然后二进制分组 - // 因为会必选一件,然后考虑更多件,原因课上解释了 + // 先必选一件,然后考虑更多件,课上解释了为什么 int cnt = d[cur] - 1; int num = 0; for (int k = 1; k <= cnt; k <<= 1) { From 995e70b5a63939dae1ea407dffa87bfd46a83210 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 17:54:45 +0800 Subject: [PATCH 1110/1170] modify code --- src/class184/Code05_Freezing1.java | 5 +---- src/class184/Code05_Freezing2.java | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/class184/Code05_Freezing1.java b/src/class184/Code05_Freezing1.java index c3db031f2..d9a9f8757 100644 --- a/src/class184/Code05_Freezing1.java +++ b/src/class184/Code05_Freezing1.java @@ -88,9 +88,6 @@ public static int getCentroid(int u, int fa) { } public static void dfs(int u, int fa, int edge, int sum, int limit) { - if (edge > limitr) { - return; - } curLen = Math.max(curLen, edge); if (sum > curVal[edge]) { curVal[edge] = sum; @@ -119,7 +116,7 @@ public static boolean check(int u, int limit) { dfs(v, u, 1, w >= limit ? 1 : -1, limit); int ql = 1, qr = 0; // 根据之前的信息,初步建立窗口,子树按秩处理非常重要 - for (int i = preLen; i >= limitl; i--) { + for (int i = Math.min(preLen, limitr); i >= limitl; i--) { while (ql <= qr && preVal[que[qr]] <= preVal[i]) { qr--; } diff --git a/src/class184/Code05_Freezing2.java b/src/class184/Code05_Freezing2.java index 2df420b04..7c5d7b3dd 100644 --- a/src/class184/Code05_Freezing2.java +++ b/src/class184/Code05_Freezing2.java @@ -99,9 +99,6 @@ //} // //void dfs(int u, int fa, int edge, int sum, int limit) { -// if (edge > limitr) { -// return; -// } // curLen = max(curLen, edge); // if (sum > curVal[edge]) { // curVal[edge] = sum; @@ -129,7 +126,7 @@ // curLen = 0; // dfs(v, u, 1, w >= limit ? 1 : -1, limit); // int ql = 1, qr = 0; -// for (int i = preLen; i >= limitl; i--) { +// for (int i = min(preLen, limitr); i >= limitl; i--) { // while (ql <= qr && preVal[que[qr]] <= preVal[i]) { // qr--; // } From ade9e9e81f4c25fb36bab509330f084b1c814964 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 23:12:28 +0800 Subject: [PATCH 1111/1170] modify code --- src/class184/Code06_TreeDistance1.java | 11 ++++++++--- src/class184/Code06_TreeDistance2.java | 10 ++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/class184/Code06_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java index 15a0ad19e..500fcc85e 100644 --- a/src/class184/Code06_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -47,7 +47,6 @@ public class Code06_TreeDistance1 { public static int[] nodeArr = new int[MAXN]; public static int cnta; public static int[] sta = new int[MAXN]; - public static long[] minv = new long[MAXN << 2]; public static long[] ans = new long[MAXM]; @@ -235,8 +234,14 @@ public static void calc(int u) { addKey(sta[top], cur, dist[sta[top]] + dist[cur]); top--; } - if (top > 0) { - addKey(sta[top], cur, dist[sta[top]] + dist[cur]); + sta[++top] = cur; + } + top = 0; + for (int i = cnta; i >= 1; i--) { + int cur = nodeArr[i]; + while (top > 0 && dist[sta[top]] >= dist[cur]) { + addKey(cur, sta[top], dist[cur] + dist[sta[top]]); + top--; } sta[++top] = cur; } diff --git a/src/class184/Code06_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java index 600371bb9..9f4ab1aa1 100644 --- a/src/class184/Code06_TreeDistance2.java +++ b/src/class184/Code06_TreeDistance2.java @@ -122,8 +122,14 @@ // keyArr[++cntk] = { sta[top], cur, dist[sta[top]] + dist[cur] }; // top--; // } -// if (top > 0) { -// keyArr[++cntk] = { sta[top], cur, dist[sta[top]] + dist[cur] }; +// sta[++top] = cur; +// } +// top = 0; +// for (int i = cnta; i >= 1; i--) { +// int cur = nodeArr[i]; +// while (top > 0 && dist[sta[top]] >= dist[cur]) { +// keyArr[++cntk] = { cur, sta[top], dist[cur] + dist[sta[top]] }; +// top--; // } // sta[++top] = cur; // } From 451d907769ef7e08d1a472acace3cb3eb12cd7f3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Nov 2025 23:28:10 +0800 Subject: [PATCH 1112/1170] modify code --- src/class184/Code06_TreeDistance1.java | 32 +++++++++++--------------- src/class184/Code06_TreeDistance2.java | 27 +++++++++++----------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/class184/Code06_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java index 500fcc85e..a8f8e6bd9 100644 --- a/src/class184/Code06_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -46,9 +46,11 @@ public class Code06_TreeDistance1 { public static long[] dist = new long[MAXN]; public static int[] nodeArr = new int[MAXN]; public static int cnta; + public static int[] sta = new int[MAXN]; - public static long[] minv = new long[MAXN << 2]; + public static int top; + public static long[] minv = new long[MAXN << 2]; public static long[] ans = new long[MAXM]; // 讲解118,递归函数改成迭代所需要的栈 @@ -216,10 +218,14 @@ public static void dfs2(int cur, int fa, long d) { } } - public static void addKey(int ka, int kb, long kdist) { - keya[++cntk] = ka; - keyb[cntk] = kb; - keyDist[cntk] = kdist; + public static void stackAdd(int cur) { + while (top > 0 && dist[sta[top]] >= dist[cur]) { + keya[++cntk] = Math.min(sta[top], cur); + keyb[cntk] = Math.max(sta[top], cur); + keyDist[cntk] = dist[sta[top]] + dist[cur]; + top--; + } + sta[++top] = cur; } public static void calc(int u) { @@ -227,23 +233,13 @@ public static void calc(int u) { // dfs1(u, 0, 0); dfs2(u, 0, 0); Arrays.sort(nodeArr, 1, cnta + 1); - int top = 0; + top = 0; for (int i = 1; i <= cnta; i++) { - int cur = nodeArr[i]; - while (top > 0 && dist[sta[top]] >= dist[cur]) { - addKey(sta[top], cur, dist[sta[top]] + dist[cur]); - top--; - } - sta[++top] = cur; + stackAdd(nodeArr[i]); } top = 0; for (int i = cnta; i >= 1; i--) { - int cur = nodeArr[i]; - while (top > 0 && dist[sta[top]] >= dist[cur]) { - addKey(cur, sta[top], dist[cur] + dist[sta[top]]); - top--; - } - sta[++top] = cur; + stackAdd(nodeArr[i]); } } diff --git a/src/class184/Code06_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java index 9f4ab1aa1..7b72154fb 100644 --- a/src/class184/Code06_TreeDistance2.java +++ b/src/class184/Code06_TreeDistance2.java @@ -56,10 +56,11 @@ //long long dist[MAXN]; //int nodeArr[MAXN]; //int cnta; +// //int sta[MAXN]; +//int top; // //long long minv[MAXN << 2]; -// //long long ans[MAXM]; // //void addEdge(int u, int v, int w) { @@ -111,27 +112,25 @@ // } //} // +//void stackAdd(int cur) { +// while (top > 0 && dist[sta[top]] >= dist[cur]) { +// keyArr[++cntk] = { min(sta[top], cur), max(sta[top], cur), dist[sta[top]] + dist[cur] }; +// top--; +// } +// sta[++top] = cur; +//} +// //void calc(int u) { // cnta = 0; // dfs(u, 0, 0); // sort(nodeArr + 1, nodeArr + cnta + 1); -// int top = 0; +// top = 0; // for (int i = 1; i <= cnta; i++) { -// int cur = nodeArr[i]; -// while (top > 0 && dist[sta[top]] >= dist[cur]) { -// keyArr[++cntk] = { sta[top], cur, dist[sta[top]] + dist[cur] }; -// top--; -// } -// sta[++top] = cur; +// stackAdd(nodeArr[i]); // } // top = 0; // for (int i = cnta; i >= 1; i--) { -// int cur = nodeArr[i]; -// while (top > 0 && dist[sta[top]] >= dist[cur]) { -// keyArr[++cntk] = { cur, sta[top], dist[cur] + dist[sta[top]] }; -// top--; -// } -// sta[++top] = cur; +// stackAdd(nodeArr[i]); // } //} // From 5fc58d11a13c5d9ed54c6d8ae353b7cdcacf8465 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 30 Nov 2025 08:59:11 +0800 Subject: [PATCH 1113/1170] modify code --- src/class184/Code06_TreeDistance1.java | 38 +++++++++++++------------- src/class184/Code06_TreeDistance2.java | 16 +++++------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/class184/Code06_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java index a8f8e6bd9..3d5767c3d 100644 --- a/src/class184/Code06_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -29,9 +29,9 @@ public class Code06_TreeDistance1 { public static int[] qy = new int[MAXM]; public static int[] qid = new int[MAXM]; - public static int[] keya = new int[MAXK]; - public static int[] keyb = new int[MAXK]; - public static long[] keyDist = new long[MAXK]; + public static int[] pa = new int[MAXK]; + public static int[] pb = new int[MAXK]; + public static long[] pdist = new long[MAXK]; public static int cntk; public static int[] head = new int[MAXN]; @@ -94,23 +94,23 @@ public static void sortQuery(int l, int r) { sortQuery(i, r); } - // 所有关键点对根据b从小到大排序,java自带的排序慢,手撸双指针快排 - public static void sortKey(int l, int r) { + // 所有点对根据b从小到大排序,java自带的排序慢,手撸双指针快排 + public static void sortPair(int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = keyb[(l + r) >> 1], t1; + int i = l, j = r, pivot = pb[(l + r) >> 1], t1; long t2; while (i <= j) { - while (keyb[i] < pivot) i++; - while (keyb[j] > pivot) j--; + while (pb[i] < pivot) i++; + while (pb[j] > pivot) j--; if (i <= j) { - t1 = keya[i]; keya[i] = keya[j]; keya[j] = t1; - t1 = keyb[i]; keyb[i] = keyb[j]; keyb[j] = t1; - t2 = keyDist[i]; keyDist[i] = keyDist[j]; keyDist[j] = t2; + t1 = pa[i]; pa[i] = pa[j]; pa[j] = t1; + t1 = pb[i]; pb[i] = pb[j]; pb[j] = t1; + t2 = pdist[i]; pdist[i] = pdist[j]; pdist[j] = t2; i++; j--; } } - sortKey(l, j); - sortKey(i, r); + sortPair(l, j); + sortPair(i, r); } public static void addEdge(int u, int v, int w) { @@ -220,9 +220,9 @@ public static void dfs2(int cur, int fa, long d) { public static void stackAdd(int cur) { while (top > 0 && dist[sta[top]] >= dist[cur]) { - keya[++cntk] = Math.min(sta[top], cur); - keyb[cntk] = Math.max(sta[top], cur); - keyDist[cntk] = dist[sta[top]] + dist[cur]; + pa[++cntk] = Math.min(sta[top], cur); + pb[cntk] = Math.max(sta[top], cur); + pdist[cntk] = dist[sta[top]] + dist[cur]; top--; } sta[++top] = cur; @@ -301,11 +301,11 @@ public static long query(int jobl, int jobr, int l, int r, int i) { public static void compute() { solve(getCentroid(1, 0)); sortQuery(1, m); - sortKey(1, cntk); + sortPair(1, cntk); build(1, n, 1); for (int i = 1, j = 1; i <= m; i++) { - for (; j <= cntk && keyb[j] <= qy[i]; j++) { - update(keya[j], keyDist[j], 1, n, 1); + for (; j <= cntk && pb[j] <= qy[i]; j++) { + update(pa[j], pdist[j], 1, n, 1); } if (qx[i] == qy[i]) { ans[qid[i]] = -1; diff --git a/src/class184/Code06_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java index 7b72154fb..c39d096cc 100644 --- a/src/class184/Code06_TreeDistance2.java +++ b/src/class184/Code06_TreeDistance2.java @@ -21,7 +21,7 @@ // int x, y, id; //}; // -//struct Key { +//struct Pair { // int a, b; // long long dist; //}; @@ -30,8 +30,8 @@ // return q1.y < q2.y; //} // -//bool KeyCmp(Key k1, Key k2) { -// return k1.b < k2.b; +//bool PairCmp(Pair p1, Pair p2) { +// return p1.b < p2.b; //} // //const int MAXN = 200001; @@ -41,7 +41,7 @@ //int n, m; //Query queryArr[MAXM]; // -//Key keyArr[MAXK]; +//Pair pairArr[MAXK]; //int cntk; // //int head[MAXN]; @@ -114,7 +114,7 @@ // //void stackAdd(int cur) { // while (top > 0 && dist[sta[top]] >= dist[cur]) { -// keyArr[++cntk] = { min(sta[top], cur), max(sta[top], cur), dist[sta[top]] + dist[cur] }; +// pairArr[++cntk] = { min(sta[top], cur), max(sta[top], cur), dist[sta[top]] + dist[cur] }; // top--; // } // sta[++top] = cur; @@ -192,11 +192,11 @@ //void compute() { // solve(getCentroid(1, 0)); // sort(queryArr + 1, queryArr + m + 1, QueryCmp); -// sort(keyArr + 1, keyArr + cntk + 1, KeyCmp); +// sort(pairArr + 1, pairArr + cntk + 1, PairCmp); // build(1, n, 1); // for (int i = 1, j = 1; i <= m; i++) { -// for (; j <= cntk && keyArr[j].b <= queryArr[i].y; j++) { -// update(keyArr[j].a, keyArr[j].dist, 1, n, 1); +// for (; j <= cntk && pairArr[j].b <= queryArr[i].y; j++) { +// update(pairArr[j].a, pairArr[j].dist, 1, n, 1); // } // if (queryArr[i].x == queryArr[i].y) { // ans[queryArr[i].id] = -1; From 2bd6f9392ffd3cea61ab9b606300a3a7748ed014 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 30 Nov 2025 09:04:34 +0800 Subject: [PATCH 1114/1170] modify code --- src/class184/Code06_TreeDistance1.java | 20 ++++++++++---------- src/class184/Code06_TreeDistance2.java | 12 ++++++------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/class184/Code06_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java index 3d5767c3d..0411a0b59 100644 --- a/src/class184/Code06_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -22,17 +22,17 @@ public class Code06_TreeDistance1 { public static int MAXN = 200001; public static int MAXM = 1000001; - public static int MAXK = 10000001; + public static int MAXP = 10000001; public static long INF = 1L << 60; public static int n, m; public static int[] qx = new int[MAXM]; public static int[] qy = new int[MAXM]; public static int[] qid = new int[MAXM]; - public static int[] pa = new int[MAXK]; - public static int[] pb = new int[MAXK]; - public static long[] pdist = new long[MAXK]; - public static int cntk; + public static int[] pa = new int[MAXP]; + public static int[] pb = new int[MAXP]; + public static long[] pdist = new long[MAXP]; + public static int cntp; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; @@ -220,9 +220,9 @@ public static void dfs2(int cur, int fa, long d) { public static void stackAdd(int cur) { while (top > 0 && dist[sta[top]] >= dist[cur]) { - pa[++cntk] = Math.min(sta[top], cur); - pb[cntk] = Math.max(sta[top], cur); - pdist[cntk] = dist[sta[top]] + dist[cur]; + pa[++cntp] = Math.min(sta[top], cur); + pb[cntp] = Math.max(sta[top], cur); + pdist[cntp] = dist[sta[top]] + dist[cur]; top--; } sta[++top] = cur; @@ -301,10 +301,10 @@ public static long query(int jobl, int jobr, int l, int r, int i) { public static void compute() { solve(getCentroid(1, 0)); sortQuery(1, m); - sortPair(1, cntk); + sortPair(1, cntp); build(1, n, 1); for (int i = 1, j = 1; i <= m; i++) { - for (; j <= cntk && pb[j] <= qy[i]; j++) { + for (; j <= cntp && pb[j] <= qy[i]; j++) { update(pa[j], pdist[j], 1, n, 1); } if (qx[i] == qy[i]) { diff --git a/src/class184/Code06_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java index c39d096cc..c8fd6a34d 100644 --- a/src/class184/Code06_TreeDistance2.java +++ b/src/class184/Code06_TreeDistance2.java @@ -36,13 +36,13 @@ // //const int MAXN = 200001; //const int MAXM = 1000001; -//const int MAXK = 10000001; +//const int MAXP = 10000001; //const long long INF = 1LL << 60; //int n, m; //Query queryArr[MAXM]; // -//Pair pairArr[MAXK]; -//int cntk; +//Pair pairArr[MAXP]; +//int cntp; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -114,7 +114,7 @@ // //void stackAdd(int cur) { // while (top > 0 && dist[sta[top]] >= dist[cur]) { -// pairArr[++cntk] = { min(sta[top], cur), max(sta[top], cur), dist[sta[top]] + dist[cur] }; +// pairArr[++cntp] = { min(sta[top], cur), max(sta[top], cur), dist[sta[top]] + dist[cur] }; // top--; // } // sta[++top] = cur; @@ -192,10 +192,10 @@ //void compute() { // solve(getCentroid(1, 0)); // sort(queryArr + 1, queryArr + m + 1, QueryCmp); -// sort(pairArr + 1, pairArr + cntk + 1, PairCmp); +// sort(pairArr + 1, pairArr + cntp + 1, PairCmp); // build(1, n, 1); // for (int i = 1, j = 1; i <= m; i++) { -// for (; j <= cntk && pairArr[j].b <= queryArr[i].y; j++) { +// for (; j <= cntp && pairArr[j].b <= queryArr[i].y; j++) { // update(pairArr[j].a, pairArr[j].dist, 1, n, 1); // } // if (queryArr[i].x == queryArr[i].y) { From 765bcc23e625a2b16d251dbacde6292afbd544d1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 30 Nov 2025 09:19:23 +0800 Subject: [PATCH 1115/1170] modify code --- src/class184/Code06_TreeDistance1.java | 2 +- src/class184/Code06_TreeDistance2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class184/Code06_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java index 0411a0b59..7a923208b 100644 --- a/src/class184/Code06_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -2,7 +2,7 @@ // 支配点对距离,java版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 -// 节点i到节点j的简单路径边权和,定义为dist(i, j) +// 节点i到节点j的简单路径,边权的累加和,定义为dist(i, j) // 编号区间[x, y],考虑所有点对(a, b),要求 x <= a < b <= y // 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的支配点对 // 也可以说,区间[x, y]的支配点对距离为dist(a, b) diff --git a/src/class184/Code06_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java index c8fd6a34d..e0f1e1ebf 100644 --- a/src/class184/Code06_TreeDistance2.java +++ b/src/class184/Code06_TreeDistance2.java @@ -2,7 +2,7 @@ // 支配点对距离,C++版 // 一共有n个节点,给定n-1条边,每条边给定边权,所有节点组成一棵树 -// 节点i到节点j的简单路径边权和,定义为dist(i, j) +// 节点i到节点j的简单路径,边权的累加和,定义为dist(i, j) // 编号区间[x, y],考虑所有点对(a, b),要求 x <= a < b <= y // 如果dist(a, b)是所有情况中最小的,则称(a, b)为区间[x, y]的支配点对 // 也可以说,区间[x, y]的支配点对距离为dist(a, b) From 61ce9f5c6046cfef16bd351a7416adb3bc50101f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 30 Nov 2025 11:56:49 +0800 Subject: [PATCH 1116/1170] modify code --- src/class184/Code06_TreeDistance1.java | 21 ++++++++++++++++----- src/class184/Code06_TreeDistance2.java | 10 +++++----- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/class184/Code06_TreeDistance1.java b/src/class184/Code06_TreeDistance1.java index 7a923208b..3ad0fd9bd 100644 --- a/src/class184/Code06_TreeDistance1.java +++ b/src/class184/Code06_TreeDistance1.java @@ -25,10 +25,13 @@ public class Code06_TreeDistance1 { public static int MAXP = 10000001; public static long INF = 1L << 60; public static int n, m; + + // 所有查询 public static int[] qx = new int[MAXM]; public static int[] qy = new int[MAXM]; public static int[] qid = new int[MAXM]; + // 保留的点对 public static int[] pa = new int[MAXP]; public static int[] pb = new int[MAXP]; public static long[] pdist = new long[MAXP]; @@ -47,10 +50,14 @@ public class Code06_TreeDistance1 { public static int[] nodeArr = new int[MAXN]; public static int cnta; + // 单调栈 public static int[] sta = new int[MAXN]; public static int top; - public static long[] minv = new long[MAXN << 2]; + // 维护最小值的线段树 + public static long[] minTree = new long[MAXN << 2]; + + // 查询的答案 public static long[] ans = new long[MAXM]; // 讲解118,递归函数改成迭代所需要的栈 @@ -234,10 +241,14 @@ public static void calc(int u) { dfs2(u, 0, 0); Arrays.sort(nodeArr, 1, cnta + 1); top = 0; + // 所有点的编号,从左往右遍历 + // 找右侧最近的、距离 <= dist的点,去生成点对 for (int i = 1; i <= cnta; i++) { stackAdd(nodeArr[i]); } top = 0; + // 所有点的编号,从右往左遍历 + // 找左侧最近的、距离 <= dist的点,去生成点对 for (int i = cnta; i >= 1; i--) { stackAdd(nodeArr[i]); } @@ -255,12 +266,12 @@ public static void solve(int u) { } public static void up(int i) { - minv[i] = Math.min(minv[i << 1], minv[i << 1 | 1]); + minTree[i] = Math.min(minTree[i << 1], minTree[i << 1 | 1]); } public static void build(int l, int r, int i) { if (l == r) { - minv[i] = INF; + minTree[i] = INF; } else { int mid = (l + r) >> 1; build(l, mid, i << 1); @@ -271,7 +282,7 @@ public static void build(int l, int r, int i) { public static void update(int jobi, long jobv, int l, int r, int i) { if (l == r) { - minv[i] = Math.min(minv[i], jobv); + minTree[i] = Math.min(minTree[i], jobv); } else { int mid = (l + r) >> 1; if (jobi <= mid) { @@ -285,7 +296,7 @@ public static void update(int jobi, long jobv, int l, int r, int i) { public static long query(int jobl, int jobr, int l, int r, int i) { if (jobl <= l && r <= jobr) { - return minv[i]; + return minTree[i]; } long ans = INF; int mid = (l + r) >> 1; diff --git a/src/class184/Code06_TreeDistance2.java b/src/class184/Code06_TreeDistance2.java index e0f1e1ebf..66596f647 100644 --- a/src/class184/Code06_TreeDistance2.java +++ b/src/class184/Code06_TreeDistance2.java @@ -60,7 +60,7 @@ //int sta[MAXN]; //int top; // -//long long minv[MAXN << 2]; +//long long minTree[MAXN << 2]; //long long ans[MAXM]; // //void addEdge(int u, int v, int w) { @@ -146,12 +146,12 @@ //} // //void up(int i) { -// minv[i] = min(minv[i << 1], minv[i << 1 | 1]); +// minTree[i] = min(minTree[i << 1], minTree[i << 1 | 1]); //} // //void build(int l, int r, int i) { // if (l == r) { -// minv[i] = INF; +// minTree[i] = INF; // } else { // int mid = (l + r) >> 1; // build(l, mid, i << 1); @@ -162,7 +162,7 @@ // //void update(int jobi, long long jobv, int l, int r, int i) { // if (l == r) { -// minv[i] = min(minv[i], jobv); +// minTree[i] = min(minTree[i], jobv); // } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { @@ -176,7 +176,7 @@ // //long long query(int jobl, int jobr, int l, int r, int i) { // if (jobl <= l && r <= jobr) { -// return minv[i]; +// return minTree[i]; // } // long long ans = INF; // int mid = (l + r) >> 1; From dee0ccf45030a12d7e2bb6639106e0541ae9f91e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 30 Nov 2025 14:25:58 +0800 Subject: [PATCH 1117/1170] modify code --- src/class184/Code07_ModeString1.java | 11 +++++------ src/class184/Code07_ModeString2.java | 9 ++++----- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/class184/Code07_ModeString1.java b/src/class184/Code07_ModeString1.java index 772552b4e..b1cc9d0f2 100644 --- a/src/class184/Code07_ModeString1.java +++ b/src/class184/Code07_ModeString1.java @@ -19,7 +19,6 @@ public class Code07_ModeString1 { public static int MAXN = 100001; - public static final int MOD = 1000000007; public static final int BASE = 499; public static int t, n, m; @@ -142,7 +141,7 @@ public static int getCentroid(int u, int fa) { // 收集信息 + 结算答案递归版,java会爆栈,C++可以通过 public static void dfs1(int u, int fa, int dep, long hash) { deep[u] = dep; - hash = (hash * BASE + val[u] - 'A' + 1) % MOD; + hash = hash * BASE + val[u] - 'A' + 1; if (hash == pre[dep]) { curp[(dep - 1) % m + 1]++; ans += alls[m - (dep - 1) % m]; @@ -168,7 +167,7 @@ public static void dfs2(int cur, int fa, int pdep, long phash) { pop(); if (e == -1) { deep[u] = dep; - hash = (hash * BASE + val[u] - 'A' + 1) % MOD; + hash = hash * BASE + val[u] - 'A' + 1; if (hash == pre[dep]) { curp[(dep - 1) % m + 1]++; ans += alls[m - (dep - 1) % m]; @@ -244,9 +243,9 @@ public static void prepare() { } long tmp = 1; for (int i = 1; i <= n; i++) { - pre[i] = (pre[i - 1] + tmp * (str[(i - 1) % m + 1] - 'A' + 1)) % MOD; - suf[i] = (suf[i - 1] + tmp * (str[m - (i - 1) % m] - 'A' + 1)) % MOD; - tmp = tmp * BASE % MOD; + pre[i] = pre[i - 1] + tmp * (str[(i - 1) % m + 1] - 'A' + 1); + suf[i] = suf[i - 1] + tmp * (str[m - (i - 1) % m] - 'A' + 1); + tmp = tmp * BASE; } } diff --git a/src/class184/Code07_ModeString2.java b/src/class184/Code07_ModeString2.java index 04c812163..4c22a885b 100644 --- a/src/class184/Code07_ModeString2.java +++ b/src/class184/Code07_ModeString2.java @@ -17,7 +17,6 @@ //using namespace std; // //const int MAXN = 100001; -//const long long MOD = 1000000007; //const long long BASE = 499; //int t, n, m; // @@ -83,7 +82,7 @@ // //void dfs(int u, int fa, int dep, long long hash) { // deep[u] = dep; -// hash = (hash * BASE + (val[u] - 'A' + 1)) % MOD; +// hash = hash * BASE + (val[u] - 'A' + 1); // if (hash == pre[dep]) { // curp[(dep - 1) % m + 1]++; // ans += alls[m - (dep - 1) % m]; @@ -146,9 +145,9 @@ // } // long long tmp = 1; // for (int i = 1; i <= n; i++) { -// pre[i] = (pre[i - 1] + tmp * (str[(i - 1) % m + 1] - 'A' + 1)) % MOD; -// suf[i] = (suf[i - 1] + tmp * (str[m - (i - 1) % m] - 'A' + 1)) % MOD; -// tmp = tmp * BASE % MOD; +// pre[i] = pre[i - 1] + tmp * (str[(i - 1) % m + 1] - 'A' + 1); +// suf[i] = suf[i - 1] + tmp * (str[m - (i - 1) % m] - 'A' + 1); +// tmp = tmp * BASE; // } //} // From 5d2cd1a0fce428c63130a2806bca76cb5173ddc5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 30 Nov 2025 14:50:50 +0800 Subject: [PATCH 1118/1170] modify code --- ...1\345\210\206\346\262\273-\344\270\213.pptx" | Bin 0 -> 52565 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243184\343\200\220\346\214\272\351\232\276\343\200\221\351\235\231\346\200\201\347\202\271\345\210\206\346\262\273-\344\270\213.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243184\343\200\220\346\214\272\351\232\276\343\200\221\351\235\231\346\200\201\347\202\271\345\210\206\346\262\273-\344\270\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243184\343\200\220\346\214\272\351\232\276\343\200\221\351\235\231\346\200\201\347\202\271\345\210\206\346\262\273-\344\270\213.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..df9c37bce4ae36e2b8bd7fb02f3a96e722f2f217 GIT binary patch literal 52565 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 Date: Mon, 1 Dec 2025 14:43:56 +0800 Subject: [PATCH 1119/1170] modify code --- src/class185/Code01_Wave1.java | 393 +++++++++++++++++++++++++++++++++ src/class185/Code01_Wave2.java | 232 +++++++++++++++++++ 2 files changed, 625 insertions(+) create mode 100644 src/class185/Code01_Wave1.java create mode 100644 src/class185/Code01_Wave2.java diff --git a/src/class185/Code01_Wave1.java b/src/class185/Code01_Wave1.java new file mode 100644 index 000000000..fd7feb8ab --- /dev/null +++ b/src/class185/Code01_Wave1.java @@ -0,0 +1,393 @@ +package class185; + +// 震波,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P6329 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code01_Wave1 { + + public static int MAXN = 100001; + public static int MAXH = 18; + public static int MAXT = 10000001; + public static int n, m; + public static int[] arr = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static int[] fa = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[] top = new int[MAXN]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] centfa = new int[MAXN]; + + public static int[] tree1 = new int[MAXN]; + public static int[] tree2 = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] sum = new int[MAXT]; + public static int cntt; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][4]; + public static int u, f, t, e; + public static int stacksize; + + public static void push(int u, int f, int t, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = t; + stack[stacksize][3] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + t = stack[stacksize][2]; + e = stack[stacksize][3]; + } + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void dfs1(int u, int f) { + fa[u] = f; + dep[u] = dep[f] + 1; + siz[u] = 1; + for (int e = head[u], v; e > 0; e = nxt[e]) { + v = to[e]; + if (v != f) { + dfs1(v, u); + } + } + for (int ei = head[u], v; ei > 0; ei = nxt[ei]) { + v = to[ei]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + + public static void dfs2(int u, int t) { + top[u] = t; + if (son[u] == 0) { + return; + } + dfs2(son[u], t); + for (int e = head[u], v; e > 0; e = nxt[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, v); + } + } + } + + public static void dfs3(int cur, int father) { + stacksize = 0; + push(cur, father, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + fa[u] = f; + dep[u] = dep[f] + 1; + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, e); + int v = to[e]; + if (v != f) { + push(v, u, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + } + } + + public static void dfs4(int cur, int tag) { + stacksize = 0; + push(cur, 0, tag, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + top[u] = t; + if (son[u] == 0) { + continue; + } + push(u, 0, t, -2); + push(son[u], 0, t, -1); + continue; + } else if (e == -2) { + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, 0, t, e); + int v = to[e]; + if (v != fa[u] && v != son[u]) { + push(v, 0, v, -1); + } + } + } + } + + public static void getSize1(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize1(v, u); + siz[u] += siz[v]; + } + } + } + + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + + public static int getLca(int a, int b) { + while (top[a] != top[b]) { + if (dep[top[a]] <= dep[top[b]]) { + b = fa[top[b]]; + } else { + a = fa[top[a]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + public static int getDist(int x, int y) { + return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void centroidTree(int u, int fa) { + centfa[u] = fa; + vis[u] = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + centroidTree(getCentroid(v, u), u); + } + } + } + + public static int update(int jobi, int jobv, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = ++cntt; + } + if (l == r) { + sum[rt] += jobv; + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = update(jobi, jobv, l, mid, ls[rt]); + } else { + rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); + } + sum[rt] = sum[ls[rt]] + sum[rs[rt]]; + } + return rt; + } + + public static int query(int jobl, int jobr, int l, int r, int i) { + if (i == 0) { + return 0; + } + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) >> 1; + int ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, ls[i]); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, rs[i]); + } + return ans; + } + + public static void update(int x, int v) { + int cur = x; + while (cur > 0) { + tree1[cur] = update(getDist(cur, x), v, 0, n - 1, tree1[cur]); + if (centfa[cur] > 0) { + tree2[cur] = update(getDist(centfa[cur], x), v, 0, n - 1, tree2[cur]); + } + cur = centfa[cur]; + } + } + + public static int query(int x, int k) { + int ans = 0, cur = x, pre = 0, dist; + while (cur > 0) { + dist = getDist(cur, x); + if (k - dist >= 0) { + ans += query(0, k - dist, 0, n - 1, tree1[cur]); + if (pre > 0) { + ans -= query(0, k - dist, 0, n - 1, tree2[pre]); + } + } + pre = cur; + cur = centfa[cur]; + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + // dfs1(1, 0); + // dfs2(1, 1); + dfs3(1, 0); + dfs4(1, 1); + centroidTree(getCentroid(1, 0), 0); + for (int i = 1; i <= n; i++) { + update(i, arr[i]); + } + int lastAns = 0; + for (int i = 1, op, x, y; i <= m; i++) { + op = in.nextInt(); + x = in.nextInt(); + y = in.nextInt(); + x ^= lastAns; + y ^= lastAns; + if (op == 0) { + lastAns = query(x, y); + out.println(lastAns); + } else { + update(x, y - arr[x]); + arr[x] = y; + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} diff --git a/src/class185/Code01_Wave2.java b/src/class185/Code01_Wave2.java new file mode 100644 index 000000000..90f01b281 --- /dev/null +++ b/src/class185/Code01_Wave2.java @@ -0,0 +1,232 @@ +package class185; + +// 震波,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P6329 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXH = 18; +//const int MAXT = 10000001; +//int n, m; +//int arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +// +//bool vis[MAXN]; +//int centfa[MAXN]; +// +//int tree1[MAXN]; +//int tree2[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int sum[MAXT]; +//int cntt; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs1(int u, int f) { +// fa[u] = f; +// dep[u] = dep[f] + 1; +// siz[u] = 1; +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int ei = head[u], v; ei; ei = nxt[ei]) { +// v = to[ei]; +// if (v != f) { +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +// } +//} +// +//void dfs2(int u, int t) { +// top[u] = t; +// if (son[u] == 0) { +// return; +// } +// dfs2(son[u], t); +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getLca(int a, int b) { +// while (top[a] != top[b]) { +// if (dep[top[a]] <= dep[top[b]]) { +// b = fa[top[b]]; +// } else { +// a = fa[top[a]]; +// } +// } +// return dep[a] <= dep[b] ? a : b; +//} +// +//int getDist(int x, int y) { +// return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void centroidTree(int u, int fa) { +// centfa[u] = fa; +// vis[u] = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// centroidTree(getCentroid(v, u), u); +// } +// } +//} +// +//int update(int jobi, int jobv, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = ++cntt; +// } +// if (l == r) { +// sum[rt] += jobv; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); +// } +// sum[rt] = sum[ls[rt]] + sum[rs[rt]]; +// } +// return rt; +//} +// +//int query(int jobl, int jobr, int l, int r, int i) { +// if (i == 0) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return sum[i]; +// } +// int mid = (l + r) >> 1; +// int ans = 0; +// if (jobl <= mid) { +// ans += query(jobl, jobr, l, mid, ls[i]); +// } +// if (jobr > mid) { +// ans += query(jobl, jobr, mid + 1, r, rs[i]); +// } +// return ans; +//} +// +//void update(int x, int v) { +// int cur = x; +// while (cur > 0) { +// tree1[cur] = update(getDist(cur, x), v, 0, n - 1, tree1[cur]); +// if (centfa[cur] > 0) { +// tree2[cur] = update(getDist(centfa[cur], x), v, 0, n - 1, tree2[cur]); +// } +// cur = centfa[cur]; +// } +//} +// +//int query(int x, int k) { +// int ans = 0, cur = x, pre = 0, dist; +// while (cur > 0) { +// dist = getDist(cur, x); +// if (k - dist >= 0) { +// ans += query(0, k - dist, 0, n - 1, tree1[cur]); +// if (pre > 0) { +// ans -= query(0, k - dist, 0, n - 1, tree2[pre]); +// } +// } +// pre = cur; +// cur = centfa[cur]; +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// centroidTree(getCentroid(1, 0), 0); +// for (int i = 1; i <= n; i++) { +// update(i, arr[i]); +// } +// int lastAns = 0; +// for (int i = 1, op, x, y; i <= m; i++) { +// cin >> op >> x >> y; +// x ^= lastAns; +// y ^= lastAns; +// if (op == 0) { +// lastAns = query(x, y); +// cout << lastAns << '\n'; +// } else { +// update(x, y - arr[x]); +// arr[x] = y; +// } +// } +// return 0; +//} \ No newline at end of file From 68b11a995a6207933fb74a9c2902d9f9f9203ee4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Dec 2025 14:56:11 +0800 Subject: [PATCH 1120/1170] modify code --- src/class185/Code01_Wave1.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/class185/Code01_Wave1.java b/src/class185/Code01_Wave1.java index fd7feb8ab..4ab3155e5 100644 --- a/src/class185/Code01_Wave1.java +++ b/src/class185/Code01_Wave1.java @@ -65,6 +65,7 @@ public static void addEdge(int u, int v) { head[u] = cntg; } + // 重链剖分收集信息递归版,java会爆栈,C++不会 public static void dfs1(int u, int f) { fa[u] = f; dep[u] = dep[f] + 1; @@ -86,6 +87,7 @@ public static void dfs1(int u, int f) { } } + // 根据重儿子剖分的递归版,java会爆栈,C++不会 public static void dfs2(int u, int t) { top[u] = t; if (son[u] == 0) { @@ -100,6 +102,7 @@ public static void dfs2(int u, int t) { } } + // dfs1改成迭代版 public static void dfs3(int cur, int father) { stacksize = 0; push(cur, father, 0, -1); @@ -133,6 +136,7 @@ public static void dfs3(int cur, int father) { } } + // dfs2改成迭代版 public static void dfs4(int cur, int tag) { stacksize = 0; push(cur, 0, tag, -1); @@ -161,6 +165,7 @@ public static void dfs4(int cur, int tag) { } } + // 找重心需要计算子树大小的递归版,java会爆栈,C++不会 public static void getSize1(int u, int fa) { siz[u] = 1; for (int e = head[u]; e > 0; e = nxt[e]) { @@ -172,6 +177,7 @@ public static void getSize1(int u, int fa) { } } + // getSize1的迭代版 public static void getSize2(int cur, int fa) { stacksize = 0; push(cur, fa, 0, -1); From 7c1cf8023ae20e3bd685b2e04d3f0c4ef6d6d881 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Dec 2025 15:42:18 +0800 Subject: [PATCH 1121/1170] modify code --- src/class185/Code01_Game1.java | 9 +++++++++ src/class185/{Code01_Wave1.java => Code03_Wave1.java} | 2 +- src/class185/{Code01_Wave2.java => Code03_Wave2.java} | 0 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/class185/Code01_Game1.java rename src/class185/{Code01_Wave1.java => Code03_Wave1.java} (99%) rename src/class185/{Code01_Wave2.java => Code03_Wave2.java} (100%) diff --git a/src/class185/Code01_Game1.java b/src/class185/Code01_Game1.java new file mode 100644 index 000000000..09be204c1 --- /dev/null +++ b/src/class185/Code01_Game1.java @@ -0,0 +1,9 @@ +package class185; + +// 烁烁的游戏,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P10603 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code01_Game1 { + +} diff --git a/src/class185/Code01_Wave1.java b/src/class185/Code03_Wave1.java similarity index 99% rename from src/class185/Code01_Wave1.java rename to src/class185/Code03_Wave1.java index 4ab3155e5..4216380a9 100644 --- a/src/class185/Code01_Wave1.java +++ b/src/class185/Code03_Wave1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code01_Wave1 { +public class Code03_Wave1 { public static int MAXN = 100001; public static int MAXH = 18; diff --git a/src/class185/Code01_Wave2.java b/src/class185/Code03_Wave2.java similarity index 100% rename from src/class185/Code01_Wave2.java rename to src/class185/Code03_Wave2.java From ff65e815db9c783900e2e1782a9a8830924dbaf0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Dec 2025 16:33:02 +0800 Subject: [PATCH 1122/1170] modify code --- src/class185/Code01_Game1.java | 354 +++++++++++++++++++++++++++++++++ src/class185/Code01_Game2.java | 211 ++++++++++++++++++++ 2 files changed, 565 insertions(+) create mode 100644 src/class185/Code01_Game2.java diff --git a/src/class185/Code01_Game1.java b/src/class185/Code01_Game1.java index 09be204c1..42bf82b0a 100644 --- a/src/class185/Code01_Game1.java +++ b/src/class185/Code01_Game1.java @@ -4,6 +4,360 @@ // 测试链接 : https://www.luogu.com.cn/problem/P10603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + public class Code01_Game1 { + public static int MAXN = 100001; + public static int MAXH = 18; + public static int MAXT = 20000001; + public static int n, m; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static int[] dep = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXH]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] centfa = new int[MAXN]; + + public static int[] tree1 = new int[MAXN]; + public static int[] tree2 = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] sum = new int[MAXT]; + public static int cntt; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][3]; + public static int u, f, e; + public static int stacksize; + + public static void push(int u, int f, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + e = stack[stacksize][2]; + } + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void dfs1(int u, int fa) { + dep[u] = dep[fa] + 1; + stjump[u][0] = fa; + for (int p = 1; p < MAXH; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + dfs1(v, u); + } + } + } + + // dfs1的迭代版 + public static void dfs2(int cur, int fa) { + stacksize = 0; + push(cur, fa, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + dep[u] = dep[f] + 1; + stjump[u][0] = f; + for (int p = 1; p < MAXH; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + int v = to[e]; + if (v != f) { + push(v, u, -1); + } + } + } + } + + // 找重心需要计算子树大小的递归版,java会爆栈,C++不会 + public static void getSize1(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize1(v, u); + siz[u] += siz[v]; + } + } + } + + // getSize1的迭代版 + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static int getDist(int x, int y) { + return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void centroidTree(int u, int fa) { + centfa[u] = fa; + vis[u] = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + centroidTree(getCentroid(v, u), u); + } + } + } + + public static int update(int jobi, int jobv, int l, int r, int i) { + int rt = i; + if (rt == 0) { + rt = ++cntt; + } + if (l == r) { + sum[rt] += jobv; + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[rt] = update(jobi, jobv, l, mid, ls[rt]); + } else { + rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); + } + sum[rt] = sum[ls[rt]] + sum[rs[rt]]; + } + return rt; + } + + public static int query(int jobl, int jobr, int l, int r, int i) { + if (i == 0) { + return 0; + } + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) >> 1; + int ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, ls[i]); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, rs[i]); + } + return ans; + } + + public static void update(int x, int k, int v) { + int cur = x, pre = 0, dist; + while (cur > 0) { + dist = getDist(cur, x); + if (k - dist >= 0) { + tree1[cur] = update(k - dist, v, 0, n - 1, tree1[cur]); + if (pre > 0) { + tree2[pre] = update(k - dist, v, 0, n - 1, tree2[pre]); + } + } + pre = cur; + cur = centfa[cur]; + } + } + + public static int query(int x) { + int ans = 0; + int cur = x; + while (cur > 0) { + ans += query(getDist(cur, x), n - 1, 0, n - 1, tree1[cur]); + if (centfa[cur] > 0) { + ans -= query(getDist(centfa[cur], x), n - 1, 0, n - 1, tree2[cur]); + } + cur = centfa[cur]; + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + // dfs1(1, 0); + dfs2(1, 0); + centroidTree(getCentroid(1, 0), 0); + char op; + int x, k, v; + for (int i = 1; i <= m; i++) { + op = in.nextChar(); + if (op == 'M') { + x = in.nextInt(); + k = in.nextInt(); + v = in.nextInt(); + update(x, k, v); + } else { + x = in.nextInt(); + out.println(query(x)); + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + } diff --git a/src/class185/Code01_Game2.java b/src/class185/Code01_Game2.java new file mode 100644 index 000000000..2918527e1 --- /dev/null +++ b/src/class185/Code01_Game2.java @@ -0,0 +1,211 @@ +package class185; + +// 烁烁的游戏,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P10603 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXH = 18; +//const int MAXT = 20000001; +//int n, m; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int dep[MAXN]; +//int stjump[MAXN][MAXH]; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int centfa[MAXN]; +// +//int tree1[MAXN]; +//int tree2[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int sum[MAXT]; +//int cntt; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXH; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// dfs(v, u); +// } +// } +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//int getDist(int x, int y) { +// return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void centroidTree(int u, int fa) { +// centfa[u] = fa; +// vis[u] = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// centroidTree(getCentroid(v, u), u); +// } +// } +//} +// +//int update(int jobi, int jobv, int l, int r, int i) { +// int rt = i; +// if (rt == 0) { +// rt = ++cntt; +// } +// if (l == r) { +// sum[rt] += jobv; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); +// } +// sum[rt] = sum[ls[rt]] + sum[rs[rt]]; +// } +// return rt; +//} +// +//int query(int jobl, int jobr, int l, int r, int i) { +// if (i == 0) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return sum[i]; +// } +// int mid = (l + r) >> 1; +// int ans = 0; +// if (jobl <= mid) { +// ans += query(jobl, jobr, l, mid, ls[i]); +// } +// if (jobr > mid) { +// ans += query(jobl, jobr, mid + 1, r, rs[i]); +// } +// return ans; +//} +// +//void update(int x, int k, int v) { +// int cur = x, pre = 0, dist; +// while (cur > 0) { +// dist = getDist(cur, x); +// if (k - dist >= 0) { +// tree1[cur] = update(k - dist, v, 0, n - 1, tree1[cur]); +// if (pre > 0) { +// tree2[pre] = update(k - dist, v, 0, n - 1, tree2[pre]); +// } +// } +// pre = cur; +// cur = centfa[cur]; +// } +//} +// +//int query(int x) { +// int ans = 0; +// int cur = x; +// while (cur > 0) { +// ans += query(getDist(cur, x), n - 1, 0, n - 1, tree1[cur]); +// if (centfa[cur] > 0) { +// ans -= query(getDist(centfa[cur], x), n - 1, 0, n - 1, tree2[cur]); +// } +// cur = centfa[cur]; +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs(1, 0); +// centroidTree(getCentroid(1, 0), 0); +// char op; +// int x, k, v; +// for (int i = 1; i <= m; i++) { +// cin >> op; +// if (op == 'M') { +// cin >> x >> k >> v; +// update(x, k, v); +// } else { +// cin >> x; +// cout << query(x) << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 25b71fb2721c0d61d6523e5e17b15376e001a4da Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Dec 2025 16:34:09 +0800 Subject: [PATCH 1123/1170] modify code --- src/class185/{Code03_Wave1.java => Code02_Wave1.java} | 2 +- src/class185/{Code03_Wave2.java => Code02_Wave2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class185/{Code03_Wave1.java => Code02_Wave1.java} (99%) rename src/class185/{Code03_Wave2.java => Code02_Wave2.java} (100%) diff --git a/src/class185/Code03_Wave1.java b/src/class185/Code02_Wave1.java similarity index 99% rename from src/class185/Code03_Wave1.java rename to src/class185/Code02_Wave1.java index 4216380a9..fcbc4aa35 100644 --- a/src/class185/Code03_Wave1.java +++ b/src/class185/Code02_Wave1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code03_Wave1 { +public class Code02_Wave1 { public static int MAXN = 100001; public static int MAXH = 18; diff --git a/src/class185/Code03_Wave2.java b/src/class185/Code02_Wave2.java similarity index 100% rename from src/class185/Code03_Wave2.java rename to src/class185/Code02_Wave2.java From 4452b62c0d96b806d9bf4953c3b15f3ed25f6f59 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 1 Dec 2025 20:27:43 +0800 Subject: [PATCH 1124/1170] modify code --- .../{Code02_Wave1.java => Code01_Wave1.java} | 21 ++++++++++-------- .../{Code02_Wave2.java => Code01_Wave2.java} | 19 +++++++++------- .../{Code01_Game1.java => Code02_Game1.java} | 22 ++++++++++--------- .../{Code01_Game2.java => Code02_Game2.java} | 20 +++++++++-------- src/class185/Code03_AtmTree1.java | 9 ++++++++ 5 files changed, 55 insertions(+), 36 deletions(-) rename src/class185/{Code02_Wave1.java => Code01_Wave1.java} (94%) rename src/class185/{Code02_Wave2.java => Code01_Wave2.java} (91%) rename src/class185/{Code01_Game1.java => Code02_Game1.java} (93%) rename src/class185/{Code01_Game2.java => Code02_Game2.java} (88%) create mode 100644 src/class185/Code03_AtmTree1.java diff --git a/src/class185/Code02_Wave1.java b/src/class185/Code01_Wave1.java similarity index 94% rename from src/class185/Code02_Wave1.java rename to src/class185/Code01_Wave1.java index fcbc4aa35..600e227fa 100644 --- a/src/class185/Code02_Wave1.java +++ b/src/class185/Code01_Wave1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_Wave1 { +public class Code01_Wave1 { public static int MAXN = 100001; public static int MAXH = 18; @@ -252,7 +252,7 @@ public static void centroidTree(int u, int fa) { } } - public static int update(int jobi, int jobv, int l, int r, int i) { + public static int add(int jobi, int jobv, int l, int r, int i) { int rt = i; if (rt == 0) { rt = ++cntt; @@ -262,9 +262,9 @@ public static int update(int jobi, int jobv, int l, int r, int i) { } else { int mid = (l + r) >> 1; if (jobi <= mid) { - ls[rt] = update(jobi, jobv, l, mid, ls[rt]); + ls[rt] = add(jobi, jobv, l, mid, ls[rt]); } else { - rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); + rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); } sum[rt] = sum[ls[rt]] + sum[rs[rt]]; } @@ -290,18 +290,21 @@ public static int query(int jobl, int jobr, int l, int r, int i) { } public static void update(int x, int v) { - int cur = x; + int cur = x, pre = 0, dist; while (cur > 0) { - tree1[cur] = update(getDist(cur, x), v, 0, n - 1, tree1[cur]); - if (centfa[cur] > 0) { - tree2[cur] = update(getDist(centfa[cur], x), v, 0, n - 1, tree2[cur]); + dist = getDist(cur, x); + tree1[cur] = add(dist, v, 0, n - 1, tree1[cur]); + if (pre > 0) { + tree2[pre] = add(dist, v, 0, n - 1, tree2[pre]); } + pre = cur; cur = centfa[cur]; } } public static int query(int x, int k) { - int ans = 0, cur = x, pre = 0, dist; + int ans = 0; + int cur = x, pre = 0, dist; while (cur > 0) { dist = getDist(cur, x); if (k - dist >= 0) { diff --git a/src/class185/Code02_Wave2.java b/src/class185/Code01_Wave2.java similarity index 91% rename from src/class185/Code02_Wave2.java rename to src/class185/Code01_Wave2.java index 90f01b281..b068bb201 100644 --- a/src/class185/Code02_Wave2.java +++ b/src/class185/Code01_Wave2.java @@ -133,7 +133,7 @@ // } //} // -//int update(int jobi, int jobv, int l, int r, int i) { +//int add(int jobi, int jobv, int l, int r, int i) { // int rt = i; // if (rt == 0) { // rt = ++cntt; @@ -143,9 +143,9 @@ // } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { -// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); +// ls[rt] = add(jobi, jobv, l, mid, ls[rt]); // } else { -// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); +// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); // } // sum[rt] = sum[ls[rt]] + sum[rs[rt]]; // } @@ -171,18 +171,21 @@ //} // //void update(int x, int v) { -// int cur = x; +// int cur = x, pre = 0, dist; // while (cur > 0) { -// tree1[cur] = update(getDist(cur, x), v, 0, n - 1, tree1[cur]); -// if (centfa[cur] > 0) { -// tree2[cur] = update(getDist(centfa[cur], x), v, 0, n - 1, tree2[cur]); +// dist = getDist(cur, x); +// tree1[cur] = add(dist, v, 0, n - 1, tree1[cur]); +// if (pre > 0) { +// tree2[pre] = add(dist, v, 0, n - 1, tree2[pre]); // } +// pre = cur; // cur = centfa[cur]; // } //} // //int query(int x, int k) { -// int ans = 0, cur = x, pre = 0, dist; +// int ans = 0; +// int cur = x, pre = 0, dist; // while (cur > 0) { // dist = getDist(cur, x); // if (k - dist >= 0) { diff --git a/src/class185/Code01_Game1.java b/src/class185/Code02_Game1.java similarity index 93% rename from src/class185/Code01_Game1.java rename to src/class185/Code02_Game1.java index 42bf82b0a..20923ae0f 100644 --- a/src/class185/Code01_Game1.java +++ b/src/class185/Code02_Game1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code01_Game1 { +public class Code02_Game1 { public static int MAXN = 100001; public static int MAXH = 18; @@ -199,7 +199,7 @@ public static void centroidTree(int u, int fa) { } } - public static int update(int jobi, int jobv, int l, int r, int i) { + public static int add(int jobi, int jobv, int l, int r, int i) { int rt = i; if (rt == 0) { rt = ++cntt; @@ -209,9 +209,9 @@ public static int update(int jobi, int jobv, int l, int r, int i) { } else { int mid = (l + r) >> 1; if (jobi <= mid) { - ls[rt] = update(jobi, jobv, l, mid, ls[rt]); + ls[rt] = add(jobi, jobv, l, mid, ls[rt]); } else { - rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); + rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); } sum[rt] = sum[ls[rt]] + sum[rs[rt]]; } @@ -241,9 +241,9 @@ public static void update(int x, int k, int v) { while (cur > 0) { dist = getDist(cur, x); if (k - dist >= 0) { - tree1[cur] = update(k - dist, v, 0, n - 1, tree1[cur]); + tree1[cur] = add(k - dist, v, 0, n - 1, tree1[cur]); if (pre > 0) { - tree2[pre] = update(k - dist, v, 0, n - 1, tree2[pre]); + tree2[pre] = add(k - dist, v, 0, n - 1, tree2[pre]); } } pre = cur; @@ -253,12 +253,14 @@ public static void update(int x, int k, int v) { public static int query(int x) { int ans = 0; - int cur = x; + int cur = x, pre = 0, dist; while (cur > 0) { - ans += query(getDist(cur, x), n - 1, 0, n - 1, tree1[cur]); - if (centfa[cur] > 0) { - ans -= query(getDist(centfa[cur], x), n - 1, 0, n - 1, tree2[cur]); + dist = getDist(cur, x); + ans += query(dist, n - 1, 0, n - 1, tree1[cur]); + if (pre > 0) { + ans -= query(dist, n - 1, 0, n - 1, tree2[pre]); } + pre = cur; cur = centfa[cur]; } return ans; diff --git a/src/class185/Code01_Game2.java b/src/class185/Code02_Game2.java similarity index 88% rename from src/class185/Code01_Game2.java rename to src/class185/Code02_Game2.java index 2918527e1..28b4f2911 100644 --- a/src/class185/Code01_Game2.java +++ b/src/class185/Code02_Game2.java @@ -119,7 +119,7 @@ // } //} // -//int update(int jobi, int jobv, int l, int r, int i) { +//int add(int jobi, int jobv, int l, int r, int i) { // int rt = i; // if (rt == 0) { // rt = ++cntt; @@ -129,9 +129,9 @@ // } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { -// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); +// ls[rt] = add(jobi, jobv, l, mid, ls[rt]); // } else { -// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); +// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); // } // sum[rt] = sum[ls[rt]] + sum[rs[rt]]; // } @@ -161,9 +161,9 @@ // while (cur > 0) { // dist = getDist(cur, x); // if (k - dist >= 0) { -// tree1[cur] = update(k - dist, v, 0, n - 1, tree1[cur]); +// tree1[cur] = add(k - dist, v, 0, n - 1, tree1[cur]); // if (pre > 0) { -// tree2[pre] = update(k - dist, v, 0, n - 1, tree2[pre]); +// tree2[pre] = add(k - dist, v, 0, n - 1, tree2[pre]); // } // } // pre = cur; @@ -173,12 +173,14 @@ // //int query(int x) { // int ans = 0; -// int cur = x; +// int cur = x, pre = 0, dist; // while (cur > 0) { -// ans += query(getDist(cur, x), n - 1, 0, n - 1, tree1[cur]); -// if (centfa[cur] > 0) { -// ans -= query(getDist(centfa[cur], x), n - 1, 0, n - 1, tree2[cur]); +// dist = getDist(cur, x); +// ans += query(dist, n - 1, 0, n - 1, tree1[cur]); +// if (pre > 0) { +// ans -= query(dist, n - 1, 0, n - 1, tree2[pre]); // } +// pre = cur; // cur = centfa[cur]; // } // return ans; diff --git a/src/class185/Code03_AtmTree1.java b/src/class185/Code03_AtmTree1.java new file mode 100644 index 000000000..a48c98386 --- /dev/null +++ b/src/class185/Code03_AtmTree1.java @@ -0,0 +1,9 @@ +package class185; + +// Atm的树,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P10604 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code03_AtmTree1 { + +} From 25257b9b3659bb1293bb06ccc404a93d2580c419 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 2 Dec 2025 09:49:15 +0800 Subject: [PATCH 1125/1170] modify code --- src/class185/Code01_Wave1.java | 27 +++++++++++++-------------- src/class185/Code01_Wave2.java | 27 +++++++++++++-------------- src/class185/Code02_Game1.java | 27 +++++++++++++-------------- src/class185/Code02_Game2.java | 27 +++++++++++++-------------- 4 files changed, 52 insertions(+), 56 deletions(-) diff --git a/src/class185/Code01_Wave1.java b/src/class185/Code01_Wave1.java index 600e227fa..c16c78c89 100644 --- a/src/class185/Code01_Wave1.java +++ b/src/class185/Code01_Wave1.java @@ -31,8 +31,8 @@ public class Code01_Wave1 { public static boolean[] vis = new boolean[MAXN]; public static int[] centfa = new int[MAXN]; - public static int[] tree1 = new int[MAXN]; - public static int[] tree2 = new int[MAXN]; + public static int[] addTree = new int[MAXN]; + public static int[] minusTree = new int[MAXN]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static int[] sum = new int[MAXT]; @@ -253,22 +253,21 @@ public static void centroidTree(int u, int fa) { } public static int add(int jobi, int jobv, int l, int r, int i) { - int rt = i; - if (rt == 0) { - rt = ++cntt; + if (i == 0) { + i = ++cntt; } if (l == r) { - sum[rt] += jobv; + sum[i] += jobv; } else { int mid = (l + r) >> 1; if (jobi <= mid) { - ls[rt] = add(jobi, jobv, l, mid, ls[rt]); + ls[i] = add(jobi, jobv, l, mid, ls[i]); } else { - rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); + rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); } - sum[rt] = sum[ls[rt]] + sum[rs[rt]]; + sum[i] = sum[ls[i]] + sum[rs[i]]; } - return rt; + return i; } public static int query(int jobl, int jobr, int l, int r, int i) { @@ -293,9 +292,9 @@ public static void update(int x, int v) { int cur = x, pre = 0, dist; while (cur > 0) { dist = getDist(cur, x); - tree1[cur] = add(dist, v, 0, n - 1, tree1[cur]); + addTree[cur] = add(dist, v, 0, n - 1, addTree[cur]); if (pre > 0) { - tree2[pre] = add(dist, v, 0, n - 1, tree2[pre]); + minusTree[pre] = add(dist, v, 0, n - 1, minusTree[pre]); } pre = cur; cur = centfa[cur]; @@ -308,9 +307,9 @@ public static int query(int x, int k) { while (cur > 0) { dist = getDist(cur, x); if (k - dist >= 0) { - ans += query(0, k - dist, 0, n - 1, tree1[cur]); + ans += query(0, k - dist, 0, n - 1, addTree[cur]); if (pre > 0) { - ans -= query(0, k - dist, 0, n - 1, tree2[pre]); + ans -= query(0, k - dist, 0, n - 1, minusTree[pre]); } } pre = cur; diff --git a/src/class185/Code01_Wave2.java b/src/class185/Code01_Wave2.java index b068bb201..69421d169 100644 --- a/src/class185/Code01_Wave2.java +++ b/src/class185/Code01_Wave2.java @@ -29,8 +29,8 @@ //bool vis[MAXN]; //int centfa[MAXN]; // -//int tree1[MAXN]; -//int tree2[MAXN]; +//int addTree[MAXN]; +//int minusTree[MAXN]; //int ls[MAXT]; //int rs[MAXT]; //int sum[MAXT]; @@ -134,22 +134,21 @@ //} // //int add(int jobi, int jobv, int l, int r, int i) { -// int rt = i; -// if (rt == 0) { -// rt = ++cntt; +// if (i == 0) { +// i = ++cntt; // } // if (l == r) { -// sum[rt] += jobv; +// sum[i] += jobv; // } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { -// ls[rt] = add(jobi, jobv, l, mid, ls[rt]); +// ls[i] = add(jobi, jobv, l, mid, ls[i]); // } else { -// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); +// rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); // } -// sum[rt] = sum[ls[rt]] + sum[rs[rt]]; +// sum[i] = sum[ls[i]] + sum[rs[i]]; // } -// return rt; +// return i; //} // //int query(int jobl, int jobr, int l, int r, int i) { @@ -174,9 +173,9 @@ // int cur = x, pre = 0, dist; // while (cur > 0) { // dist = getDist(cur, x); -// tree1[cur] = add(dist, v, 0, n - 1, tree1[cur]); +// addTree[cur] = add(dist, v, 0, n - 1, addTree[cur]); // if (pre > 0) { -// tree2[pre] = add(dist, v, 0, n - 1, tree2[pre]); +// minusTree[pre] = add(dist, v, 0, n - 1, minusTree[pre]); // } // pre = cur; // cur = centfa[cur]; @@ -189,9 +188,9 @@ // while (cur > 0) { // dist = getDist(cur, x); // if (k - dist >= 0) { -// ans += query(0, k - dist, 0, n - 1, tree1[cur]); +// ans += query(0, k - dist, 0, n - 1, addTree[cur]); // if (pre > 0) { -// ans -= query(0, k - dist, 0, n - 1, tree2[pre]); +// ans -= query(0, k - dist, 0, n - 1, minusTree[pre]); // } // } // pre = cur; diff --git a/src/class185/Code02_Game1.java b/src/class185/Code02_Game1.java index 20923ae0f..8b799f450 100644 --- a/src/class185/Code02_Game1.java +++ b/src/class185/Code02_Game1.java @@ -28,8 +28,8 @@ public class Code02_Game1 { public static int[] siz = new int[MAXN]; public static int[] centfa = new int[MAXN]; - public static int[] tree1 = new int[MAXN]; - public static int[] tree2 = new int[MAXN]; + public static int[] addTree = new int[MAXN]; + public static int[] minusTree = new int[MAXN]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static int[] sum = new int[MAXT]; @@ -200,22 +200,21 @@ public static void centroidTree(int u, int fa) { } public static int add(int jobi, int jobv, int l, int r, int i) { - int rt = i; - if (rt == 0) { - rt = ++cntt; + if (i == 0) { + i = ++cntt; } if (l == r) { - sum[rt] += jobv; + sum[i] += jobv; } else { int mid = (l + r) >> 1; if (jobi <= mid) { - ls[rt] = add(jobi, jobv, l, mid, ls[rt]); + ls[i] = add(jobi, jobv, l, mid, ls[i]); } else { - rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); + rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); } - sum[rt] = sum[ls[rt]] + sum[rs[rt]]; + sum[i] = sum[ls[i]] + sum[rs[i]]; } - return rt; + return i; } public static int query(int jobl, int jobr, int l, int r, int i) { @@ -241,9 +240,9 @@ public static void update(int x, int k, int v) { while (cur > 0) { dist = getDist(cur, x); if (k - dist >= 0) { - tree1[cur] = add(k - dist, v, 0, n - 1, tree1[cur]); + addTree[cur] = add(k - dist, v, 0, n - 1, addTree[cur]); if (pre > 0) { - tree2[pre] = add(k - dist, v, 0, n - 1, tree2[pre]); + minusTree[pre] = add(k - dist, v, 0, n - 1, minusTree[pre]); } } pre = cur; @@ -256,9 +255,9 @@ public static int query(int x) { int cur = x, pre = 0, dist; while (cur > 0) { dist = getDist(cur, x); - ans += query(dist, n - 1, 0, n - 1, tree1[cur]); + ans += query(dist, n - 1, 0, n - 1, addTree[cur]); if (pre > 0) { - ans -= query(dist, n - 1, 0, n - 1, tree2[pre]); + ans -= query(dist, n - 1, 0, n - 1, minusTree[pre]); } pre = cur; cur = centfa[cur]; diff --git a/src/class185/Code02_Game2.java b/src/class185/Code02_Game2.java index 28b4f2911..26fd2c2b6 100644 --- a/src/class185/Code02_Game2.java +++ b/src/class185/Code02_Game2.java @@ -26,8 +26,8 @@ //int siz[MAXN]; //int centfa[MAXN]; // -//int tree1[MAXN]; -//int tree2[MAXN]; +//int addTree[MAXN]; +//int minusTree[MAXN]; //int ls[MAXT]; //int rs[MAXT]; //int sum[MAXT]; @@ -120,22 +120,21 @@ //} // //int add(int jobi, int jobv, int l, int r, int i) { -// int rt = i; -// if (rt == 0) { -// rt = ++cntt; +// if (i == 0) { +// i = ++cntt; // } // if (l == r) { -// sum[rt] += jobv; +// sum[i] += jobv; // } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { -// ls[rt] = add(jobi, jobv, l, mid, ls[rt]); +// ls[i] = add(jobi, jobv, l, mid, ls[i]); // } else { -// rs[rt] = add(jobi, jobv, mid + 1, r, rs[rt]); +// rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); // } -// sum[rt] = sum[ls[rt]] + sum[rs[rt]]; +// sum[i] = sum[ls[i]] + sum[rs[i]]; // } -// return rt; +// return i; //} // //int query(int jobl, int jobr, int l, int r, int i) { @@ -161,9 +160,9 @@ // while (cur > 0) { // dist = getDist(cur, x); // if (k - dist >= 0) { -// tree1[cur] = add(k - dist, v, 0, n - 1, tree1[cur]); +// addTree[cur] = add(k - dist, v, 0, n - 1, addTree[cur]); // if (pre > 0) { -// tree2[pre] = add(k - dist, v, 0, n - 1, tree2[pre]); +// minusTree[pre] = add(k - dist, v, 0, n - 1, minusTree[pre]); // } // } // pre = cur; @@ -176,9 +175,9 @@ // int cur = x, pre = 0, dist; // while (cur > 0) { // dist = getDist(cur, x); -// ans += query(dist, n - 1, 0, n - 1, tree1[cur]); +// ans += query(dist, n - 1, 0, n - 1, addTree[cur]); // if (pre > 0) { -// ans -= query(dist, n - 1, 0, n - 1, tree2[pre]); +// ans -= query(dist, n - 1, 0, n - 1, minusTree[pre]); // } // pre = cur; // cur = centfa[cur]; From a01ccbc0762e7bce97b71d33e6338db84809d474 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 2 Dec 2025 14:01:22 +0800 Subject: [PATCH 1126/1170] modify code --- src/class185/Code01_Wave1.java | 6 +- src/class185/Code01_Wave2.java | 6 +- src/class185/Code02_Game1.java | 5 +- src/class185/Code02_Game2.java | 4 +- src/class185/Code03_AtmTree1.java | 267 ++++++++++++++++++++++++++++++ src/class185/Code03_AtmTree2.java | 229 +++++++++++++++++++++++++ 6 files changed, 507 insertions(+), 10 deletions(-) create mode 100644 src/class185/Code03_AtmTree2.java diff --git a/src/class185/Code01_Wave1.java b/src/class185/Code01_Wave1.java index c16c78c89..3feb5dc3f 100644 --- a/src/class185/Code01_Wave1.java +++ b/src/class185/Code01_Wave1.java @@ -288,7 +288,7 @@ public static int query(int jobl, int jobr, int l, int r, int i) { return ans; } - public static void update(int x, int v) { + public static void add(int x, int v) { int cur = x, pre = 0, dist; while (cur > 0) { dist = getDist(cur, x); @@ -338,7 +338,7 @@ public static void main(String[] args) throws Exception { dfs4(1, 1); centroidTree(getCentroid(1, 0), 0); for (int i = 1; i <= n; i++) { - update(i, arr[i]); + add(i, arr[i]); } int lastAns = 0; for (int i = 1, op, x, y; i <= m; i++) { @@ -351,7 +351,7 @@ public static void main(String[] args) throws Exception { lastAns = query(x, y); out.println(lastAns); } else { - update(x, y - arr[x]); + add(x, y - arr[x]); arr[x] = y; } } diff --git a/src/class185/Code01_Wave2.java b/src/class185/Code01_Wave2.java index 69421d169..9e2a98004 100644 --- a/src/class185/Code01_Wave2.java +++ b/src/class185/Code01_Wave2.java @@ -169,7 +169,7 @@ // return ans; //} // -//void update(int x, int v) { +//void add(int x, int v) { // int cur = x, pre = 0, dist; // while (cur > 0) { // dist = getDist(cur, x); @@ -215,7 +215,7 @@ // dfs2(1, 1); // centroidTree(getCentroid(1, 0), 0); // for (int i = 1; i <= n; i++) { -// update(i, arr[i]); +// add(i, arr[i]); // } // int lastAns = 0; // for (int i = 1, op, x, y; i <= m; i++) { @@ -226,7 +226,7 @@ // lastAns = query(x, y); // cout << lastAns << '\n'; // } else { -// update(x, y - arr[x]); +// add(x, y - arr[x]); // arr[x] = y; // } // } diff --git a/src/class185/Code02_Game1.java b/src/class185/Code02_Game1.java index 8b799f450..83e17f675 100644 --- a/src/class185/Code02_Game1.java +++ b/src/class185/Code02_Game1.java @@ -60,6 +60,7 @@ public static void addEdge(int u, int v) { head[u] = cntg; } + // 树上倍增收集信息递归版,java会爆栈,C++不会 public static void dfs1(int u, int fa) { dep[u] = dep[fa] + 1; stjump[u][0] = fa; @@ -235,7 +236,7 @@ public static int query(int jobl, int jobr, int l, int r, int i) { return ans; } - public static void update(int x, int k, int v) { + public static void add(int x, int k, int v) { int cur = x, pre = 0, dist; while (cur > 0) { dist = getDist(cur, x); @@ -287,7 +288,7 @@ public static void main(String[] args) throws Exception { x = in.nextInt(); k = in.nextInt(); v = in.nextInt(); - update(x, k, v); + add(x, k, v); } else { x = in.nextInt(); out.println(query(x)); diff --git a/src/class185/Code02_Game2.java b/src/class185/Code02_Game2.java index 26fd2c2b6..086f1b740 100644 --- a/src/class185/Code02_Game2.java +++ b/src/class185/Code02_Game2.java @@ -155,7 +155,7 @@ // return ans; //} // -//void update(int x, int k, int v) { +//void add(int x, int k, int v) { // int cur = x, pre = 0, dist; // while (cur > 0) { // dist = getDist(cur, x); @@ -202,7 +202,7 @@ // cin >> op; // if (op == 'M') { // cin >> x >> k >> v; -// update(x, k, v); +// add(x, k, v); // } else { // cin >> x; // cout << query(x) << '\n'; diff --git a/src/class185/Code03_AtmTree1.java b/src/class185/Code03_AtmTree1.java index a48c98386..5c80c25de 100644 --- a/src/class185/Code03_AtmTree1.java +++ b/src/class185/Code03_AtmTree1.java @@ -4,6 +4,273 @@ // 测试链接 : https://www.luogu.com.cn/problem/P10604 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + public class Code03_AtmTree1 { + public static int MAXN = 20001; + public static int MAXH = 18; + public static int MAXT = 1000001; + public static int n, k, sumw; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static int[] dep = new int[MAXN]; + public static int[] dist = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXH]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] centfa = new int[MAXN]; + + public static int[] addTree = new int[MAXN]; + public static int[] minusTree = new int[MAXN]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] sum = new int[MAXT]; + public static int cntt; + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + public static void dfs(int u, int fa, int dis) { + dep[u] = dep[fa] + 1; + dist[u] = dis; + stjump[u][0] = fa; + for (int p = 1; p < MAXH; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + if (v != fa) { + dfs(v, u, dis + w); + } + } + } + + public static void getSize(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize(v, u); + siz[u] += siz[v]; + } + } + } + + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static int getDist(int x, int y) { + return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); + } + + public static int getCentroid(int u, int fa) { + getSize(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void centroidTree(int u, int fa) { + centfa[u] = fa; + vis[u] = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + centroidTree(getCentroid(v, u), u); + } + } + } + + public static int add(int jobi, int l, int r, int i) { + if (i == 0) { + i = ++cntt; + } + if (l == r) { + sum[i]++; + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + ls[i] = add(jobi, l, mid, ls[i]); + } else { + rs[i] = add(jobi, mid + 1, r, rs[i]); + } + sum[i] = sum[ls[i]] + sum[rs[i]]; + } + return i; + } + + public static int query(int jobl, int jobr, int l, int r, int i) { + if (i == 0) { + return 0; + } + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) >> 1; + int ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, ls[i]); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, rs[i]); + } + return ans; + } + + public static void add(int x) { + int cur = x, pre = 0, distance; + while (cur > 0) { + distance = getDist(cur, x); + addTree[cur] = add(distance, 0, sumw, addTree[cur]); + if (pre > 0) { + minusTree[pre] = add(distance, 0, sumw, minusTree[pre]); + } + pre = cur; + cur = centfa[cur]; + } + } + + public static int query(int x, int limit) { + int ans = 0; + int cur = x, pre = 0, distance; + while (cur > 0) { + distance = getDist(cur, x); + if (limit - distance >= 0) { + ans += query(0, limit - distance, 0, sumw, addTree[cur]); + if (pre > 0) { + ans -= query(0, limit - distance, 0, sumw, minusTree[pre]); + } + } + pre = cur; + cur = centfa[cur]; + } + return ans; + } + + public static int compute(int x) { + int ans = 0; + int l = 0, r = sumw, mid; + while (l <= r) { + mid = (l + r) >> 1; + if (query(x, mid) >= k) { + ans = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + k = in.nextInt() + 1; + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); + sumw += w; + } + dfs(1, 0, 0); + centroidTree(getCentroid(1, 0), 0); + for (int i = 1; i <= n; i++) { + add(i); + } + for (int i = 1; i <= n; i++) { + out.println(compute(i)); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } diff --git a/src/class185/Code03_AtmTree2.java b/src/class185/Code03_AtmTree2.java new file mode 100644 index 000000000..82558e7b6 --- /dev/null +++ b/src/class185/Code03_AtmTree2.java @@ -0,0 +1,229 @@ +package class185; + +// Atm的树,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P10604 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 20001; +//const int MAXH = 18; +//const int MAXT = 1000001; +//int n, k, sumw; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//int dep[MAXN]; +//int dist[MAXN]; +//int stjump[MAXN][MAXH]; +// +//bool vis[MAXN]; +//int siz[MAXN]; +//int centfa[MAXN]; +// +//int addTree[MAXN]; +//int minusTree[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int sum[MAXT]; +//int cntt; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void dfs(int u, int fa, int dis) { +// dep[u] = dep[fa] + 1; +// dist[u] = dis; +// stjump[u][0] = fa; +// for (int p = 1; p < MAXH; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// if (v != fa) { +// dfs(v, u, dis + w); +// } +// } +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getLca(int a, int b) { +// if (dep[a] < dep[b]) { +// swap(a, b); +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (dep[stjump[a][p]] >= dep[b]) { +// a = stjump[a][p]; +// } +// } +// if (a == b) { +// return a; +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (stjump[a][p] != stjump[b][p]) { +// a = stjump[a][p]; +// b = stjump[b][p]; +// } +// } +// return stjump[a][0]; +//} +// +//int getDist(int x, int y) { +// return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void centroidTree(int u, int fa) { +// centfa[u] = fa; +// vis[u] = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// centroidTree(getCentroid(v, u), u); +// } +// } +//} +// +//int add(int jobi, int l, int r, int i) { +// if (i == 0) { +// i = ++cntt; +// } +// if (l == r) { +// sum[i]++; +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// ls[i] = add(jobi, l, mid, ls[i]); +// } else { +// rs[i] = add(jobi, mid + 1, r, rs[i]); +// } +// sum[i] = sum[ls[i]] + sum[rs[i]]; +// } +// return i; +//} +// +//int query(int jobl, int jobr, int l, int r, int i) { +// if (i == 0) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return sum[i]; +// } +// int mid = (l + r) >> 1; +// int ans = 0; +// if (jobl <= mid) { +// ans += query(jobl, jobr, l, mid, ls[i]); +// } +// if (jobr > mid) { +// ans += query(jobl, jobr, mid + 1, r, rs[i]); +// } +// return ans; +//} +// +//void add(int x) { +// int cur = x, pre = 0, distance; +// while (cur > 0) { +// distance = getDist(cur, x); +// addTree[cur] = add(distance, 0, sumw, addTree[cur]); +// if (pre > 0) { +// minusTree[pre] = add(distance, 0, sumw, minusTree[pre]); +// } +// pre = cur; +// cur = centfa[cur]; +// } +//} +// +//int query(int x, int limit) { +// int ans = 0; +// int cur = x, pre = 0, distance; +// while (cur > 0) { +// distance = getDist(cur, x); +// if (limit - distance >= 0) { +// ans += query(0, limit - distance, 0, sumw, addTree[cur]); +// if (pre > 0) { +// ans -= query(0, limit - distance, 0, sumw, minusTree[pre]); +// } +// } +// pre = cur; +// cur = centfa[cur]; +// } +// return ans; +//} +// +//int compute(int x) { +// int ans = 0; +// int l = 0, r = sumw, mid; +// while (l <= r) { +// mid = (l + r) >> 1; +// if (query(x, mid) >= k) { +// ans = mid; +// r = mid - 1; +// } else { +// l = mid + 1; +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// cin >> k; +// k = k + 1; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); +// sumw += w; +// } +// dfs(1, 0, 0); +// centroidTree(getCentroid(1, 0), 0); +// for (int i = 1; i <= n; i++) { +// add(i); +// } +// for (int i = 1; i <= n; i++) { +// cout << compute(i) << '\n'; +// } +// return 0; +//} \ No newline at end of file From c07d07ceb0ebd5538a414d82d1e20bbadd7d7e31 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 2 Dec 2025 17:36:22 +0800 Subject: [PATCH 1127/1170] modify code --- src/class185/Code04_HideAndSeek1.java | 480 ++++++++++++++++++++++++++ src/class185/Code04_HideAndSeek2.java | 277 +++++++++++++++ 2 files changed, 757 insertions(+) create mode 100644 src/class185/Code04_HideAndSeek1.java create mode 100644 src/class185/Code04_HideAndSeek2.java diff --git a/src/class185/Code04_HideAndSeek1.java b/src/class185/Code04_HideAndSeek1.java new file mode 100644 index 000000000..566c526df --- /dev/null +++ b/src/class185/Code04_HideAndSeek1.java @@ -0,0 +1,480 @@ +package class185; + +// 捉迷藏,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2056 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 +// 想通过用C++实现,本节课Code04_HideAndSeek2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.PriorityQueue; + +public class Code04_HideAndSeek1 { + + static class Set { + PriorityQueue addHeap; + PriorityQueue delHeap; + + public Set() { + addHeap = new PriorityQueue<>((a, b) -> b.compareTo(a)); + delHeap = new PriorityQueue<>((a, b) -> b.compareTo(a)); + } + + void clean() { + while (!delHeap.isEmpty() && delHeap.peek().equals(addHeap.peek())) { + addHeap.poll(); + delHeap.poll(); + } + } + + int size() { + return addHeap.size() - delHeap.size(); + } + + void push(int v) { + addHeap.add(v); + } + + void del(int v) { + delHeap.add(v); + } + + int pop() { + clean(); + return addHeap.poll(); + } + + int top() { + clean(); + return addHeap.peek(); + } + + int second() { + int a = pop(); + int b = top(); + push(a); + return b; + } + } + + public static int MAXN = 100001; + public static int n, m; + public static boolean[] status = new boolean[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static int[] fa = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[] top = new int[MAXN]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] centfa = new int[MAXN]; + + // distSet[u]收集 : 点分树中,子树u的每个节点,到u的父亲的距离 + // maxdSet[u]收集 : 点分树中,子树u的所有儿子,dist的最大值 + // maxdTop2收集 : 每个点的maxvSet里的最大 + 次大 + public static Set[] distSet = new Set[MAXN]; + public static Set[] maxdSet = new Set[MAXN]; + public static Set maxdTop2 = new Set(); + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][4]; + public static int u, f, t, e; + public static int stacksize; + + public static void push(int u, int f, int t, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = t; + stack[stacksize][3] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + t = stack[stacksize][2]; + e = stack[stacksize][3]; + } + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + // 重链剖分收集信息递归版,java会爆栈,C++不会 + public static void dfs1(int u, int f) { + fa[u] = f; + dep[u] = dep[f] + 1; + siz[u] = 1; + for (int e = head[u], v; e > 0; e = nxt[e]) { + v = to[e]; + if (v != f) { + dfs1(v, u); + } + } + for (int ei = head[u], v; ei > 0; ei = nxt[ei]) { + v = to[ei]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + + // 根据重儿子剖分的递归版,java会爆栈,C++不会 + public static void dfs2(int u, int t) { + top[u] = t; + if (son[u] == 0) { + return; + } + dfs2(son[u], t); + for (int e = head[u], v; e > 0; e = nxt[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, v); + } + } + } + + // dfs1改成迭代版 + public static void dfs3(int cur, int father) { + stacksize = 0; + push(cur, father, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + fa[u] = f; + dep[u] = dep[f] + 1; + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, e); + int v = to[e]; + if (v != f) { + push(v, u, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + } + } + + // dfs2改成迭代版 + public static void dfs4(int cur, int tag) { + stacksize = 0; + push(cur, 0, tag, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + top[u] = t; + if (son[u] == 0) { + continue; + } + push(u, 0, t, -2); + push(son[u], 0, t, -1); + continue; + } else if (e == -2) { + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, 0, t, e); + int v = to[e]; + if (v != fa[u] && v != son[u]) { + push(v, 0, v, -1); + } + } + } + } + + // 找重心需要计算子树大小的递归版,java会爆栈,C++不会 + public static void getSize1(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize1(v, u); + siz[u] += siz[v]; + } + } + } + + // getSize1的迭代版 + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + + public static int getLca(int a, int b) { + while (top[a] != top[b]) { + if (dep[top[a]] <= dep[top[b]]) { + b = fa[top[b]]; + } else { + a = fa[top[a]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + public static int getDist(int x, int y) { + return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void centroidTree(int u, int fa) { + centfa[u] = fa; + vis[u] = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + centroidTree(getCentroid(v, u), u); + } + } + } + + public static void add(int x) { + if (maxdSet[x].size() >= 2) { + maxdTop2.push(maxdSet[x].top() + maxdSet[x].second()); + } + } + + public static void del(int x) { + if (maxdSet[x].size() >= 2) { + maxdTop2.del(maxdSet[x].top() + maxdSet[x].second()); + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + maxdSet[i] = new Set(); + distSet[i] = new Set(); + } + for (int i = 1; i <= n; i++) { + int u = i; + while (u > 0) { + int fa = centfa[u]; + if (fa > 0) { + distSet[u].push(getDist(i, fa)); + } + u = fa; + } + } + for (int i = 1; i <= n; i++) { + maxdSet[i].push(0); + int fa = centfa[i]; + if (fa > 0) { + maxdSet[fa].push(distSet[i].top()); + } + } + for (int i = 1; i <= n; i++) { + add(i); + } + } + + public static void on(int x) { + del(x); + maxdSet[x].del(0); + add(x); + for (int u = x, fa = centfa[u]; fa > 0; u = fa, fa = centfa[u]) { + del(fa); + maxdSet[fa].del(distSet[u].top()); + distSet[u].del(getDist(x, fa)); + if (distSet[u].size() > 0) { + maxdSet[fa].push(distSet[u].top()); + } + add(fa); + } + } + + public static void off(int x) { + del(x); + maxdSet[x].push(0); + add(x); + for (int u = x, fa = centfa[u]; fa > 0; u = fa, fa = centfa[u]) { + del(fa); + if (distSet[u].size() > 0) { + maxdSet[fa].del(distSet[u].top()); + } + distSet[u].push(getDist(x, fa)); + maxdSet[fa].push(distSet[u].top()); + add(fa); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + // dfs1(1, 0); + // dfs2(1, 1); + dfs3(1, 0); + dfs4(1, 1); + centroidTree(getCentroid(1, 0), 0); + prepare(); + int offCnt = n; + m = in.nextInt(); + char op; + int x; + for (int i = 1; i <= m; i++) { + op = in.nextChar(); + if (op == 'G') { + if (offCnt <= 1) { + out.println(offCnt - 1); + } else { + out.println(maxdTop2.top()); + } + } else { + x = in.nextInt(); + if (status[x]) { + off(x); + offCnt++; + } else { + on(x); + offCnt--; + } + status[x] = !status[x]; + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class185/Code04_HideAndSeek2.java b/src/class185/Code04_HideAndSeek2.java new file mode 100644 index 000000000..358799d2f --- /dev/null +++ b/src/class185/Code04_HideAndSeek2.java @@ -0,0 +1,277 @@ +package class185; + +// 捉迷藏,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2056 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Set { +// priority_queue addHeap; +// priority_queue delHeap; +// +// void clean() { +// while (!delHeap.empty() && !addHeap.empty() && delHeap.top() == addHeap.top()) { +// addHeap.pop(); +// delHeap.pop(); +// } +// } +// +// int size() { +// return (int)addHeap.size() - (int)delHeap.size(); +// } +// +// void push(int v) { +// addHeap.push(v); +// } +// +// void del(int v) { +// delHeap.push(v); +// } +// +// int pop() { +// clean(); +// int v = addHeap.top(); +// addHeap.pop(); +// return v; +// } +// +// int top() { +// clean(); +// return addHeap.top(); +// } +// +// int second() { +// int a = pop(); +// int b = top(); +// push(a); +// return b; +// } +//}; +// +//const int MAXN = 100001; +//int n, m; +//bool status[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +// +//bool vis[MAXN]; +//int centfa[MAXN]; +// +//Set distSet[MAXN]; +//Set maxdSet[MAXN]; +//Set maxdTop2; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs1(int u, int f) { +// fa[u] = f; +// dep[u] = dep[f] + 1; +// siz[u] = 1; +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int ei = head[u], v; ei; ei = nxt[ei]) { +// v = to[ei]; +// if (v != f) { +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +// } +//} +// +//void dfs2(int u, int t) { +// top[u] = t; +// if (son[u] == 0) { +// return; +// } +// dfs2(son[u], t); +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getLca(int a, int b) { +// while (top[a] != top[b]) { +// if (dep[top[a]] <= dep[top[b]]) { +// b = fa[top[b]]; +// } else { +// a = fa[top[a]]; +// } +// } +// return dep[a] <= dep[b] ? a : b; +//} +// +//int getDist(int x, int y) { +// return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void centroidTree(int u, int fa) { +// centfa[u] = fa; +// vis[u] = true; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// centroidTree(getCentroid(v, u), u); +// } +// } +//} +// +//void add(int x) { +// if (maxdSet[x].size() >= 2) { +// maxdTop2.push(maxdSet[x].top() + maxdSet[x].second()); +// } +//} +// +//void del(int x) { +// if (maxdSet[x].size() >= 2) { +// maxdTop2.del(maxdSet[x].top() + maxdSet[x].second()); +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// int u = i; +// while (u > 0) { +// int fa = centfa[u]; +// if (fa > 0) { +// distSet[u].push(getDist(i, fa)); +// } +// u = fa; +// } +// } +// for (int i = 1; i <= n; i++) { +// maxdSet[i].push(0); +// int fa = centfa[i]; +// if (fa > 0) { +// maxdSet[fa].push(distSet[i].top()); +// } +// } +// for (int i = 1; i <= n; i++) { +// add(i); +// } +//} +// +//void on(int x) { +// del(x); +// maxdSet[x].del(0); +// add(x); +// for (int u = x, fa = centfa[u]; fa > 0; u = fa, fa = centfa[u]) { +// del(fa); +// maxdSet[fa].del(distSet[u].top()); +// distSet[u].del(getDist(x, fa)); +// if (distSet[u].size() > 0) { +// maxdSet[fa].push(distSet[u].top()); +// } +// add(fa); +// } +//} +// +//void off(int x) { +// del(x); +// maxdSet[x].push(0); +// add(x); +// for (int u = x, fa = centfa[u]; fa > 0; u = fa, fa = centfa[u]) { +// del(fa); +// if (distSet[u].size() > 0) { +// maxdSet[fa].del(distSet[u].top()); +// } +// distSet[u].push(getDist(x, fa)); +// maxdSet[fa].push(distSet[u].top()); +// add(fa); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// centroidTree(getCentroid(1, 0), 0); +// prepare(); +// int offCnt = n; +// cin >> m; +// char op; +// int x; +// for (int i = 1; i <= m; i++) { +// cin >> op; +// if (op == 'G') { +// if (offCnt <= 1) { +// cout << offCnt - 1 << '\n'; +// } else { +// cout << maxdTop2.top() << '\n'; +// } +// } else { +// cin >> x; +// if (status[x]) { +// off(x); +// offCnt++; +// } else { +// on(x); +// offCnt--; +// } +// status[x] = !status[x]; +// } +// } +// return 0; +//} \ No newline at end of file From 6cb3c63d3687a9b444566a6e9f41e6a25ccb4ca5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 2 Dec 2025 21:16:25 +0800 Subject: [PATCH 1128/1170] modify code --- src/class185/Code04_HideAndSeek1.java | 480 -------------------------- src/class185/Code04_HideAndSeek2.java | 277 --------------- src/class185/Code08_HideAndSeek1.java | 261 ++++++++++++++ 3 files changed, 261 insertions(+), 757 deletions(-) delete mode 100644 src/class185/Code04_HideAndSeek1.java delete mode 100644 src/class185/Code04_HideAndSeek2.java create mode 100644 src/class185/Code08_HideAndSeek1.java diff --git a/src/class185/Code04_HideAndSeek1.java b/src/class185/Code04_HideAndSeek1.java deleted file mode 100644 index 566c526df..000000000 --- a/src/class185/Code04_HideAndSeek1.java +++ /dev/null @@ -1,480 +0,0 @@ -package class185; - -// 捉迷藏,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P2056 -// 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是本题卡常,无法通过所有测试用例 -// 想通过用C++实现,本节课Code04_HideAndSeek2文件就是C++的实现 -// 两个版本的逻辑完全一样,C++版本可以通过所有测试 - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.util.PriorityQueue; - -public class Code04_HideAndSeek1 { - - static class Set { - PriorityQueue addHeap; - PriorityQueue delHeap; - - public Set() { - addHeap = new PriorityQueue<>((a, b) -> b.compareTo(a)); - delHeap = new PriorityQueue<>((a, b) -> b.compareTo(a)); - } - - void clean() { - while (!delHeap.isEmpty() && delHeap.peek().equals(addHeap.peek())) { - addHeap.poll(); - delHeap.poll(); - } - } - - int size() { - return addHeap.size() - delHeap.size(); - } - - void push(int v) { - addHeap.add(v); - } - - void del(int v) { - delHeap.add(v); - } - - int pop() { - clean(); - return addHeap.poll(); - } - - int top() { - clean(); - return addHeap.peek(); - } - - int second() { - int a = pop(); - int b = top(); - push(a); - return b; - } - } - - public static int MAXN = 100001; - public static int n, m; - public static boolean[] status = new boolean[MAXN]; - - public static int[] head = new int[MAXN]; - public static int[] nxt = new int[MAXN << 1]; - public static int[] to = new int[MAXN << 1]; - public static int cntg; - - public static int[] fa = new int[MAXN]; - public static int[] dep = new int[MAXN]; - public static int[] siz = new int[MAXN]; - public static int[] son = new int[MAXN]; - public static int[] top = new int[MAXN]; - - public static boolean[] vis = new boolean[MAXN]; - public static int[] centfa = new int[MAXN]; - - // distSet[u]收集 : 点分树中,子树u的每个节点,到u的父亲的距离 - // maxdSet[u]收集 : 点分树中,子树u的所有儿子,dist的最大值 - // maxdTop2收集 : 每个点的maxvSet里的最大 + 次大 - public static Set[] distSet = new Set[MAXN]; - public static Set[] maxdSet = new Set[MAXN]; - public static Set maxdTop2 = new Set(); - - // 讲解118,递归函数改成迭代所需要的栈 - public static int[][] stack = new int[MAXN][4]; - public static int u, f, t, e; - public static int stacksize; - - public static void push(int u, int f, int t, int e) { - stack[stacksize][0] = u; - stack[stacksize][1] = f; - stack[stacksize][2] = t; - stack[stacksize][3] = e; - stacksize++; - } - - public static void pop() { - --stacksize; - u = stack[stacksize][0]; - f = stack[stacksize][1]; - t = stack[stacksize][2]; - e = stack[stacksize][3]; - } - - public static void addEdge(int u, int v) { - nxt[++cntg] = head[u]; - to[cntg] = v; - head[u] = cntg; - } - - // 重链剖分收集信息递归版,java会爆栈,C++不会 - public static void dfs1(int u, int f) { - fa[u] = f; - dep[u] = dep[f] + 1; - siz[u] = 1; - for (int e = head[u], v; e > 0; e = nxt[e]) { - v = to[e]; - if (v != f) { - dfs1(v, u); - } - } - for (int ei = head[u], v; ei > 0; ei = nxt[ei]) { - v = to[ei]; - if (v != f) { - siz[u] += siz[v]; - if (son[u] == 0 || siz[son[u]] < siz[v]) { - son[u] = v; - } - } - } - } - - // 根据重儿子剖分的递归版,java会爆栈,C++不会 - public static void dfs2(int u, int t) { - top[u] = t; - if (son[u] == 0) { - return; - } - dfs2(son[u], t); - for (int e = head[u], v; e > 0; e = nxt[e]) { - v = to[e]; - if (v != fa[u] && v != son[u]) { - dfs2(v, v); - } - } - } - - // dfs1改成迭代版 - public static void dfs3(int cur, int father) { - stacksize = 0; - push(cur, father, 0, -1); - while (stacksize > 0) { - pop(); - if (e == -1) { - fa[u] = f; - dep[u] = dep[f] + 1; - siz[u] = 1; - e = head[u]; - } else { - e = nxt[e]; - } - if (e != 0) { - push(u, f, 0, e); - int v = to[e]; - if (v != f) { - push(v, u, 0, -1); - } - } else { - for (int ei = head[u]; ei > 0; ei = nxt[ei]) { - int v = to[ei]; - if (v != f) { - siz[u] += siz[v]; - if (son[u] == 0 || siz[son[u]] < siz[v]) { - son[u] = v; - } - } - } - } - } - } - - // dfs2改成迭代版 - public static void dfs4(int cur, int tag) { - stacksize = 0; - push(cur, 0, tag, -1); - while (stacksize > 0) { - pop(); - if (e == -1) { - top[u] = t; - if (son[u] == 0) { - continue; - } - push(u, 0, t, -2); - push(son[u], 0, t, -1); - continue; - } else if (e == -2) { - e = head[u]; - } else { - e = nxt[e]; - } - if (e != 0) { - push(u, 0, t, e); - int v = to[e]; - if (v != fa[u] && v != son[u]) { - push(v, 0, v, -1); - } - } - } - } - - // 找重心需要计算子树大小的递归版,java会爆栈,C++不会 - public static void getSize1(int u, int fa) { - siz[u] = 1; - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - if (v != fa && !vis[v]) { - getSize1(v, u); - siz[u] += siz[v]; - } - } - } - - // getSize1的迭代版 - public static void getSize2(int cur, int fa) { - stacksize = 0; - push(cur, fa, 0, -1); - while (stacksize > 0) { - pop(); - if (e == -1) { - siz[u] = 1; - e = head[u]; - } else { - e = nxt[e]; - } - if (e != 0) { - push(u, f, 0, e); - int v = to[e]; - if (v != f && !vis[v]) { - push(v, u, 0, -1); - } - } else { - for (int ei = head[u]; ei > 0; ei = nxt[ei]) { - int v = to[ei]; - if (v != f && !vis[v]) { - siz[u] += siz[v]; - } - } - } - } - } - - public static int getLca(int a, int b) { - while (top[a] != top[b]) { - if (dep[top[a]] <= dep[top[b]]) { - b = fa[top[b]]; - } else { - a = fa[top[a]]; - } - } - return dep[a] <= dep[b] ? a : b; - } - - public static int getDist(int x, int y) { - return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); - } - - public static int getCentroid(int u, int fa) { - // getSize1(u, fa); - getSize2(u, fa); - int half = siz[u] >> 1; - boolean find = false; - while (!find) { - find = true; - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - if (v != fa && !vis[v] && siz[v] > half) { - fa = u; - u = v; - find = false; - break; - } - } - } - return u; - } - - public static void centroidTree(int u, int fa) { - centfa[u] = fa; - vis[u] = true; - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - if (!vis[v]) { - centroidTree(getCentroid(v, u), u); - } - } - } - - public static void add(int x) { - if (maxdSet[x].size() >= 2) { - maxdTop2.push(maxdSet[x].top() + maxdSet[x].second()); - } - } - - public static void del(int x) { - if (maxdSet[x].size() >= 2) { - maxdTop2.del(maxdSet[x].top() + maxdSet[x].second()); - } - } - - public static void prepare() { - for (int i = 1; i <= n; i++) { - maxdSet[i] = new Set(); - distSet[i] = new Set(); - } - for (int i = 1; i <= n; i++) { - int u = i; - while (u > 0) { - int fa = centfa[u]; - if (fa > 0) { - distSet[u].push(getDist(i, fa)); - } - u = fa; - } - } - for (int i = 1; i <= n; i++) { - maxdSet[i].push(0); - int fa = centfa[i]; - if (fa > 0) { - maxdSet[fa].push(distSet[i].top()); - } - } - for (int i = 1; i <= n; i++) { - add(i); - } - } - - public static void on(int x) { - del(x); - maxdSet[x].del(0); - add(x); - for (int u = x, fa = centfa[u]; fa > 0; u = fa, fa = centfa[u]) { - del(fa); - maxdSet[fa].del(distSet[u].top()); - distSet[u].del(getDist(x, fa)); - if (distSet[u].size() > 0) { - maxdSet[fa].push(distSet[u].top()); - } - add(fa); - } - } - - public static void off(int x) { - del(x); - maxdSet[x].push(0); - add(x); - for (int u = x, fa = centfa[u]; fa > 0; u = fa, fa = centfa[u]) { - del(fa); - if (distSet[u].size() > 0) { - maxdSet[fa].del(distSet[u].top()); - } - distSet[u].push(getDist(x, fa)); - maxdSet[fa].push(distSet[u].top()); - add(fa); - } - } - - public static void main(String[] args) throws Exception { - FastReader in = new FastReader(); - PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - n = in.nextInt(); - for (int i = 1, u, v; i < n; i++) { - u = in.nextInt(); - v = in.nextInt(); - addEdge(u, v); - addEdge(v, u); - } - // dfs1(1, 0); - // dfs2(1, 1); - dfs3(1, 0); - dfs4(1, 1); - centroidTree(getCentroid(1, 0), 0); - prepare(); - int offCnt = n; - m = in.nextInt(); - char op; - int x; - for (int i = 1; i <= m; i++) { - op = in.nextChar(); - if (op == 'G') { - if (offCnt <= 1) { - out.println(offCnt - 1); - } else { - out.println(maxdTop2.top()); - } - } else { - x = in.nextInt(); - if (status[x]) { - off(x); - offCnt++; - } else { - on(x); - offCnt--; - } - status[x] = !status[x]; - } - } - out.flush(); - out.close(); - } - - // 读写工具类 - static class FastReader { - final private int BUFFER_SIZE = 1 << 16; - private final InputStream in; - private final byte[] buffer; - private int ptr, len; - - public FastReader() { - in = System.in; - buffer = new byte[BUFFER_SIZE]; - ptr = len = 0; - } - - private boolean hasNextByte() throws IOException { - if (ptr < len) - return true; - ptr = 0; - len = in.read(buffer); - return len > 0; - } - - private byte readByte() throws IOException { - if (!hasNextByte()) - return -1; - return buffer[ptr++]; - } - - public char nextChar() throws IOException { - byte c; - do { - c = readByte(); - if (c == -1) - return 0; - } while (c <= ' '); - char ans = 0; - while (c > ' ') { - ans = (char) c; - c = readByte(); - } - return ans; - } - - public int nextInt() throws IOException { - int num = 0; - byte b = readByte(); - while (isWhitespace(b)) - b = readByte(); - boolean minus = false; - if (b == '-') { - minus = true; - b = readByte(); - } - while (!isWhitespace(b) && b != -1) { - num = num * 10 + (b - '0'); - b = readByte(); - } - return minus ? -num : num; - } - - private boolean isWhitespace(byte b) { - return b == ' ' || b == '\n' || b == '\r' || b == '\t'; - } - } - -} diff --git a/src/class185/Code04_HideAndSeek2.java b/src/class185/Code04_HideAndSeek2.java deleted file mode 100644 index 358799d2f..000000000 --- a/src/class185/Code04_HideAndSeek2.java +++ /dev/null @@ -1,277 +0,0 @@ -package class185; - -// 捉迷藏,C++版 -// 测试链接 : https://www.luogu.com.cn/problem/P2056 -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 - -//#include -// -//using namespace std; -// -//struct Set { -// priority_queue addHeap; -// priority_queue delHeap; -// -// void clean() { -// while (!delHeap.empty() && !addHeap.empty() && delHeap.top() == addHeap.top()) { -// addHeap.pop(); -// delHeap.pop(); -// } -// } -// -// int size() { -// return (int)addHeap.size() - (int)delHeap.size(); -// } -// -// void push(int v) { -// addHeap.push(v); -// } -// -// void del(int v) { -// delHeap.push(v); -// } -// -// int pop() { -// clean(); -// int v = addHeap.top(); -// addHeap.pop(); -// return v; -// } -// -// int top() { -// clean(); -// return addHeap.top(); -// } -// -// int second() { -// int a = pop(); -// int b = top(); -// push(a); -// return b; -// } -//}; -// -//const int MAXN = 100001; -//int n, m; -//bool status[MAXN]; -// -//int head[MAXN]; -//int nxt[MAXN << 1]; -//int to[MAXN << 1]; -//int cntg; -// -//int fa[MAXN]; -//int dep[MAXN]; -//int siz[MAXN]; -//int son[MAXN]; -//int top[MAXN]; -// -//bool vis[MAXN]; -//int centfa[MAXN]; -// -//Set distSet[MAXN]; -//Set maxdSet[MAXN]; -//Set maxdTop2; -// -//void addEdge(int u, int v) { -// nxt[++cntg] = head[u]; -// to[cntg] = v; -// head[u] = cntg; -//} -// -//void dfs1(int u, int f) { -// fa[u] = f; -// dep[u] = dep[f] + 1; -// siz[u] = 1; -// for (int e = head[u], v; e; e = nxt[e]) { -// v = to[e]; -// if (v != f) { -// dfs1(v, u); -// } -// } -// for (int ei = head[u], v; ei; ei = nxt[ei]) { -// v = to[ei]; -// if (v != f) { -// siz[u] += siz[v]; -// if (son[u] == 0 || siz[son[u]] < siz[v]) { -// son[u] = v; -// } -// } -// } -//} -// -//void dfs2(int u, int t) { -// top[u] = t; -// if (son[u] == 0) { -// return; -// } -// dfs2(son[u], t); -// for (int e = head[u], v; e; e = nxt[e]) { -// v = to[e]; -// if (v != fa[u] && v != son[u]) { -// dfs2(v, v); -// } -// } -//} -// -//void getSize(int u, int fa) { -// siz[u] = 1; -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// if (v != fa && !vis[v]) { -// getSize(v, u); -// siz[u] += siz[v]; -// } -// } -//} -// -//int getLca(int a, int b) { -// while (top[a] != top[b]) { -// if (dep[top[a]] <= dep[top[b]]) { -// b = fa[top[b]]; -// } else { -// a = fa[top[a]]; -// } -// } -// return dep[a] <= dep[b] ? a : b; -//} -// -//int getDist(int x, int y) { -// return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); -//} -// -//int getCentroid(int u, int fa) { -// getSize(u, fa); -// int half = siz[u] >> 1; -// bool find = false; -// while (!find) { -// find = true; -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// if (v != fa && !vis[v] && siz[v] > half) { -// fa = u; -// u = v; -// find = false; -// break; -// } -// } -// } -// return u; -//} -// -//void centroidTree(int u, int fa) { -// centfa[u] = fa; -// vis[u] = true; -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// if (!vis[v]) { -// centroidTree(getCentroid(v, u), u); -// } -// } -//} -// -//void add(int x) { -// if (maxdSet[x].size() >= 2) { -// maxdTop2.push(maxdSet[x].top() + maxdSet[x].second()); -// } -//} -// -//void del(int x) { -// if (maxdSet[x].size() >= 2) { -// maxdTop2.del(maxdSet[x].top() + maxdSet[x].second()); -// } -//} -// -//void prepare() { -// for (int i = 1; i <= n; i++) { -// int u = i; -// while (u > 0) { -// int fa = centfa[u]; -// if (fa > 0) { -// distSet[u].push(getDist(i, fa)); -// } -// u = fa; -// } -// } -// for (int i = 1; i <= n; i++) { -// maxdSet[i].push(0); -// int fa = centfa[i]; -// if (fa > 0) { -// maxdSet[fa].push(distSet[i].top()); -// } -// } -// for (int i = 1; i <= n; i++) { -// add(i); -// } -//} -// -//void on(int x) { -// del(x); -// maxdSet[x].del(0); -// add(x); -// for (int u = x, fa = centfa[u]; fa > 0; u = fa, fa = centfa[u]) { -// del(fa); -// maxdSet[fa].del(distSet[u].top()); -// distSet[u].del(getDist(x, fa)); -// if (distSet[u].size() > 0) { -// maxdSet[fa].push(distSet[u].top()); -// } -// add(fa); -// } -//} -// -//void off(int x) { -// del(x); -// maxdSet[x].push(0); -// add(x); -// for (int u = x, fa = centfa[u]; fa > 0; u = fa, fa = centfa[u]) { -// del(fa); -// if (distSet[u].size() > 0) { -// maxdSet[fa].del(distSet[u].top()); -// } -// distSet[u].push(getDist(x, fa)); -// maxdSet[fa].push(distSet[u].top()); -// add(fa); -// } -//} -// -//int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n; -// for (int i = 1, u, v; i < n; i++) { -// cin >> u >> v; -// addEdge(u, v); -// addEdge(v, u); -// } -// dfs1(1, 0); -// dfs2(1, 1); -// centroidTree(getCentroid(1, 0), 0); -// prepare(); -// int offCnt = n; -// cin >> m; -// char op; -// int x; -// for (int i = 1; i <= m; i++) { -// cin >> op; -// if (op == 'G') { -// if (offCnt <= 1) { -// cout << offCnt - 1 << '\n'; -// } else { -// cout << maxdTop2.top() << '\n'; -// } -// } else { -// cin >> x; -// if (status[x]) { -// off(x); -// offCnt++; -// } else { -// on(x); -// offCnt--; -// } -// status[x] = !status[x]; -// } -// } -// return 0; -//} \ No newline at end of file diff --git a/src/class185/Code08_HideAndSeek1.java b/src/class185/Code08_HideAndSeek1.java new file mode 100644 index 000000000..09927579e --- /dev/null +++ b/src/class185/Code08_HideAndSeek1.java @@ -0,0 +1,261 @@ +package class185; + +// 捉迷藏,最优解是树上括号序,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2056 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code08_HideAndSeek1 { + + public static int MAXN = 100001; + public static int MAXS = MAXN * 3; + public static int INF = 1000000001; + public static int PAL = -1; + public static int PAR = -2; + public static int n, m; + + public static boolean[] light = new boolean[MAXN]; + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int cntg; + + public static int[] dfn = new int[MAXN]; + public static int[] seg = new int[MAXS]; + public static int cntd; + + public static int[] pal = new int[MAXS << 2]; + public static int[] par = new int[MAXS << 2]; + public static int[] ladd = new int[MAXS << 2]; + public static int[] lminus = new int[MAXS << 2]; + public static int[] radd = new int[MAXS << 2]; + public static int[] rminus = new int[MAXS << 2]; + public static int[] dist = new int[MAXS << 2]; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][3]; + public static int u, f, e; + public static int stacksize; + + public static void push(int u, int f, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + e = stack[stacksize][2]; + } + + public static void addEdge(int u, int v) { + nxt[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + // 收集括号序递归版,java会爆栈,C++可以通过 + public static void dfs1(int u, int fa) { + seg[++cntd] = PAL; + seg[++cntd] = u; + dfn[u] = cntd; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa) { + dfs1(v, u); + } + } + seg[++cntd] = PAR; + } + + // dfs1的迭代版 + public static void dfs2(int cur, int fa) { + stacksize = 0; + push(cur, fa, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + seg[++cntd] = PAL; + seg[++cntd] = u; + dfn[u] = cntd; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, e); + int v = to[e]; + if (v != f) { + push(v, u, -1); + } + } else { + seg[++cntd] = PAR; + } + } + } + + public static void set(int i, int v) { + par[i] = pal[i] = 0; + ladd[i] = lminus[i] = radd[i] = rminus[i] = -INF; + dist[i] = -INF; + if (v == PAL) { + pal[i] = 1; + } else if (v == PAR) { + par[i] = 1; + } else if (!light[v]) { + ladd[i] = lminus[i] = radd[i] = rminus[i] = 0; + } + } + + public static void up(int i) { + int l = i << 1, r = i << 1 | 1; + if (pal[l] > par[r]) { + par[i] = par[l]; + pal[i] = pal[l] - par[r] + pal[r]; + } else { + par[i] = par[l] + par[r] - pal[l]; + pal[i] = pal[r]; + } + ladd[i] = Math.max(ladd[l], Math.max(ladd[r] + par[l] - pal[l], lminus[r] + par[l] + pal[l])); + lminus[i] = Math.max(lminus[l], lminus[r] - par[l] + pal[l]); + radd[i] = Math.max(radd[r], Math.max(radd[l] - par[r] + pal[r], rminus[l] + par[r] + pal[r])); + rminus[i] = Math.max(rminus[r], rminus[l] + par[r] - pal[r]); + dist[i] = Math.max(Math.max(dist[l], dist[r]), Math.max(radd[l] + lminus[r], rminus[l] + ladd[r])); + } + + public static void build(int l, int r, int i) { + if (l == r) { + set(i, seg[l]); + } else { + int mid = (l + r) >> 1; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void update(int jobi, int l, int r, int i) { + if (l == r) { + set(i, seg[l]); + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + update(jobi, l, mid, i << 1); + } else { + update(jobi, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + // dfs1(1, 0); + dfs2(1, 0); + build(1, cntd, 1); + m = in.nextInt(); + int offCnt = n; + char op; + for (int i = 1, x; i <= m; i++) { + op = in.nextChar(); + if (op == 'C') { + x = in.nextInt(); + light[x] = !light[x]; + if (!light[x]) { + offCnt++; + } else { + offCnt--; + } + update(dfn[x], 1, cntd, 1); + } else { + if (offCnt <= 1) { + out.println(offCnt - 1); + } else { + out.println(dist[1]); + } + } + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + final private int BUFFER_SIZE = 1 << 16; + private final InputStream in; + private final byte[] buffer; + private int ptr, len; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + ptr = len = 0; + } + + private boolean hasNextByte() throws IOException { + if (ptr < len) + return true; + ptr = 0; + len = in.read(buffer); + return len > 0; + } + + private byte readByte() throws IOException { + if (!hasNextByte()) + return -1; + return buffer[ptr++]; + } + + public char nextChar() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return 0; + } while (c <= ' '); + char ans = 0; + while (c > ' ') { + ans = (char) c; + c = readByte(); + } + return ans; + } + + public int nextInt() throws IOException { + int num = 0; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} From d5f56920262ad70b45d7982dc923899769acdb09 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 3 Dec 2025 14:29:25 +0800 Subject: [PATCH 1129/1170] modify code --- src/class185/Code08_HideAndSeek1.java | 77 +++++++++++++++------------ 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/src/class185/Code08_HideAndSeek1.java b/src/class185/Code08_HideAndSeek1.java index 09927579e..f3d8aa559 100644 --- a/src/class185/Code08_HideAndSeek1.java +++ b/src/class185/Code08_HideAndSeek1.java @@ -1,6 +1,6 @@ package class185; -// 捉迷藏,最优解是树上括号序,java版 +// 捉迷藏,正解是树的括号序,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2056 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -13,9 +13,10 @@ public class Code08_HideAndSeek1 { public static int MAXN = 100001; public static int MAXS = MAXN * 3; + public static int MAXT = MAXS << 2; public static int INF = 1000000001; - public static int PAL = -1; - public static int PAR = -2; + public static int RIGHT_PA = -1; + public static int LEFT_PA = -2; public static int n, m; public static boolean[] light = new boolean[MAXN]; @@ -28,13 +29,21 @@ public class Code08_HideAndSeek1 { public static int[] seg = new int[MAXS]; public static int cntd; - public static int[] pal = new int[MAXS << 2]; - public static int[] par = new int[MAXS << 2]; - public static int[] ladd = new int[MAXS << 2]; - public static int[] lminus = new int[MAXS << 2]; - public static int[] radd = new int[MAXS << 2]; - public static int[] rminus = new int[MAXS << 2]; - public static int[] dist = new int[MAXS << 2]; + // 注意区分preMinus和postMinus + // rpa : 都消掉之后的右括号数量 + // lpa : 都消掉之后的左括号数量 + // preAdd : 区间左端点到任意黑点,max(右括号 + 左括号) + // preMinus : 区间左端点到任意黑点,max(左括号 - 右括号) + // postAdd : 任意黑点到区间右端点,max(右括号 + 左括号) + // postMinus : 任意黑点到区间右端点,max(右括号 - 左括号) + // dist : 选择任意两个黑点的最大距离 + public static int[] rpa = new int[MAXT]; + public static int[] lpa = new int[MAXT]; + public static int[] preAdd = new int[MAXT]; + public static int[] preMinus = new int[MAXT]; + public static int[] postAdd = new int[MAXT]; + public static int[] postMinus = new int[MAXT]; + public static int[] dist = new int[MAXT]; // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][3]; @@ -63,7 +72,7 @@ public static void addEdge(int u, int v) { // 收集括号序递归版,java会爆栈,C++可以通过 public static void dfs1(int u, int fa) { - seg[++cntd] = PAL; + seg[++cntd] = LEFT_PA; seg[++cntd] = u; dfn[u] = cntd; for (int e = head[u]; e > 0; e = nxt[e]) { @@ -72,7 +81,7 @@ public static void dfs1(int u, int fa) { dfs1(v, u); } } - seg[++cntd] = PAR; + seg[++cntd] = RIGHT_PA; } // dfs1的迭代版 @@ -82,7 +91,7 @@ public static void dfs2(int cur, int fa) { while (stacksize > 0) { pop(); if (e == -1) { - seg[++cntd] = PAL; + seg[++cntd] = LEFT_PA; seg[++cntd] = u; dfn[u] = cntd; e = head[u]; @@ -96,43 +105,43 @@ public static void dfs2(int cur, int fa) { push(v, u, -1); } } else { - seg[++cntd] = PAR; + seg[++cntd] = RIGHT_PA; } } } - public static void set(int i, int v) { - par[i] = pal[i] = 0; - ladd[i] = lminus[i] = radd[i] = rminus[i] = -INF; + public static void setSingle(int i, int v) { + rpa[i] = lpa[i] = 0; + preAdd[i] = preMinus[i] = postAdd[i] = postMinus[i] = -INF; dist[i] = -INF; - if (v == PAL) { - pal[i] = 1; - } else if (v == PAR) { - par[i] = 1; + if (v == RIGHT_PA) { + rpa[i] = 1; + } else if (v == LEFT_PA) { + lpa[i] = 1; } else if (!light[v]) { - ladd[i] = lminus[i] = radd[i] = rminus[i] = 0; + preAdd[i] = preMinus[i] = postAdd[i] = postMinus[i] = 0; } } public static void up(int i) { int l = i << 1, r = i << 1 | 1; - if (pal[l] > par[r]) { - par[i] = par[l]; - pal[i] = pal[l] - par[r] + pal[r]; + if (lpa[l] > rpa[r]) { + rpa[i] = rpa[l]; + lpa[i] = lpa[l] - rpa[r] + lpa[r]; } else { - par[i] = par[l] + par[r] - pal[l]; - pal[i] = pal[r]; + rpa[i] = rpa[l] + rpa[r] - lpa[l]; + lpa[i] = lpa[r]; } - ladd[i] = Math.max(ladd[l], Math.max(ladd[r] + par[l] - pal[l], lminus[r] + par[l] + pal[l])); - lminus[i] = Math.max(lminus[l], lminus[r] - par[l] + pal[l]); - radd[i] = Math.max(radd[r], Math.max(radd[l] - par[r] + pal[r], rminus[l] + par[r] + pal[r])); - rminus[i] = Math.max(rminus[r], rminus[l] + par[r] - pal[r]); - dist[i] = Math.max(Math.max(dist[l], dist[r]), Math.max(radd[l] + lminus[r], rminus[l] + ladd[r])); + preAdd[i] = Math.max(preAdd[l], Math.max(rpa[l] + preAdd[r] - lpa[l], rpa[l] + lpa[l] + preMinus[r])); + preMinus[i] = Math.max(preMinus[l], lpa[l] - rpa[l] + preMinus[r]); + postAdd[i] = Math.max(postAdd[r], Math.max(postAdd[l] - rpa[r] + lpa[r], postMinus[l] + rpa[r] + lpa[r])); + postMinus[i] = Math.max(postMinus[r], postMinus[l] + rpa[r] - lpa[r]); + dist[i] = Math.max(Math.max(dist[l], dist[r]), Math.max(postAdd[l] + preMinus[r], preAdd[r] + postMinus[l])); } public static void build(int l, int r, int i) { if (l == r) { - set(i, seg[l]); + setSingle(i, seg[l]); } else { int mid = (l + r) >> 1; build(l, mid, i << 1); @@ -143,7 +152,7 @@ public static void build(int l, int r, int i) { public static void update(int jobi, int l, int r, int i) { if (l == r) { - set(i, seg[l]); + setSingle(i, seg[l]); } else { int mid = (l + r) >> 1; if (jobi <= mid) { From 9854867cacdd4a66067e2e7ada2c4da7a34cb5be Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 3 Dec 2025 14:30:09 +0800 Subject: [PATCH 1130/1170] modify code --- .../{Code08_HideAndSeek1.java => Code08_HideSeek1.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/class185/{Code08_HideAndSeek1.java => Code08_HideSeek1.java} (99%) diff --git a/src/class185/Code08_HideAndSeek1.java b/src/class185/Code08_HideSeek1.java similarity index 99% rename from src/class185/Code08_HideAndSeek1.java rename to src/class185/Code08_HideSeek1.java index f3d8aa559..2b605e95a 100644 --- a/src/class185/Code08_HideAndSeek1.java +++ b/src/class185/Code08_HideSeek1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code08_HideAndSeek1 { +public class Code08_HideSeek1 { public static int MAXN = 100001; public static int MAXS = MAXN * 3; From 051ba6d687140fd4c26a283119c2808ecaeb217f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 3 Dec 2025 14:44:28 +0800 Subject: [PATCH 1131/1170] modify code --- src/class185/Code04_OpenStore1.java | 8 ++++ src/class185/Code08_HideSeek1.java | 72 ++++++++++++++--------------- 2 files changed, 44 insertions(+), 36 deletions(-) create mode 100644 src/class185/Code04_OpenStore1.java diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java new file mode 100644 index 000000000..987624c32 --- /dev/null +++ b/src/class185/Code04_OpenStore1.java @@ -0,0 +1,8 @@ +package class185; + +// 开店,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3241 + +public class Code04_OpenStore1 { + +} diff --git a/src/class185/Code08_HideSeek1.java b/src/class185/Code08_HideSeek1.java index 2b605e95a..02906e8f5 100644 --- a/src/class185/Code08_HideSeek1.java +++ b/src/class185/Code08_HideSeek1.java @@ -15,8 +15,8 @@ public class Code08_HideSeek1 { public static int MAXS = MAXN * 3; public static int MAXT = MAXS << 2; public static int INF = 1000000001; - public static int RIGHT_PA = -1; - public static int LEFT_PA = -2; + public static int PAR = -1; + public static int PAL = -2; public static int n, m; public static boolean[] light = new boolean[MAXN]; @@ -29,20 +29,20 @@ public class Code08_HideSeek1 { public static int[] seg = new int[MAXS]; public static int cntd; - // 注意区分preMinus和postMinus - // rpa : 都消掉之后的右括号数量 - // lpa : 都消掉之后的左括号数量 - // preAdd : 区间左端点到任意黑点,max(右括号 + 左括号) - // preMinus : 区间左端点到任意黑点,max(左括号 - 右括号) - // postAdd : 任意黑点到区间右端点,max(右括号 + 左括号) - // postMinus : 任意黑点到区间右端点,max(右括号 - 左括号) + // 注意区分lminus和rminus + // pr : 都消掉之后的右括号数量 + // pl : 都消掉之后的左括号数量 + // ladd : 左端点到任意黑点,max(右括号 + 左括号) + // lminus : 左端点到任意黑点,max(左括号 - 右括号) + // radd : 任意黑点到右端点,max(右括号 + 左括号) + // rminus : 任意黑点到右端点,max(右括号 - 左括号) // dist : 选择任意两个黑点的最大距离 - public static int[] rpa = new int[MAXT]; - public static int[] lpa = new int[MAXT]; - public static int[] preAdd = new int[MAXT]; - public static int[] preMinus = new int[MAXT]; - public static int[] postAdd = new int[MAXT]; - public static int[] postMinus = new int[MAXT]; + public static int[] pr = new int[MAXT]; + public static int[] pl = new int[MAXT]; + public static int[] ladd = new int[MAXT]; + public static int[] lminus = new int[MAXT]; + public static int[] radd = new int[MAXT]; + public static int[] rminus = new int[MAXT]; public static int[] dist = new int[MAXT]; // 讲解118,递归函数改成迭代所需要的栈 @@ -72,7 +72,7 @@ public static void addEdge(int u, int v) { // 收集括号序递归版,java会爆栈,C++可以通过 public static void dfs1(int u, int fa) { - seg[++cntd] = LEFT_PA; + seg[++cntd] = PAL; seg[++cntd] = u; dfn[u] = cntd; for (int e = head[u]; e > 0; e = nxt[e]) { @@ -81,7 +81,7 @@ public static void dfs1(int u, int fa) { dfs1(v, u); } } - seg[++cntd] = RIGHT_PA; + seg[++cntd] = PAR; } // dfs1的迭代版 @@ -91,7 +91,7 @@ public static void dfs2(int cur, int fa) { while (stacksize > 0) { pop(); if (e == -1) { - seg[++cntd] = LEFT_PA; + seg[++cntd] = PAL; seg[++cntd] = u; dfn[u] = cntd; e = head[u]; @@ -105,38 +105,38 @@ public static void dfs2(int cur, int fa) { push(v, u, -1); } } else { - seg[++cntd] = RIGHT_PA; + seg[++cntd] = PAR; } } } public static void setSingle(int i, int v) { - rpa[i] = lpa[i] = 0; - preAdd[i] = preMinus[i] = postAdd[i] = postMinus[i] = -INF; + pr[i] = pl[i] = 0; + ladd[i] = lminus[i] = radd[i] = rminus[i] = -INF; dist[i] = -INF; - if (v == RIGHT_PA) { - rpa[i] = 1; - } else if (v == LEFT_PA) { - lpa[i] = 1; + if (v == PAR) { + pr[i] = 1; + } else if (v == PAL) { + pl[i] = 1; } else if (!light[v]) { - preAdd[i] = preMinus[i] = postAdd[i] = postMinus[i] = 0; + ladd[i] = lminus[i] = radd[i] = rminus[i] = 0; } } public static void up(int i) { int l = i << 1, r = i << 1 | 1; - if (lpa[l] > rpa[r]) { - rpa[i] = rpa[l]; - lpa[i] = lpa[l] - rpa[r] + lpa[r]; + if (pl[l] > pr[r]) { + pr[i] = pr[l]; + pl[i] = pl[l] - pr[r] + pl[r]; } else { - rpa[i] = rpa[l] + rpa[r] - lpa[l]; - lpa[i] = lpa[r]; + pr[i] = pr[l] + pr[r] - pl[l]; + pl[i] = pl[r]; } - preAdd[i] = Math.max(preAdd[l], Math.max(rpa[l] + preAdd[r] - lpa[l], rpa[l] + lpa[l] + preMinus[r])); - preMinus[i] = Math.max(preMinus[l], lpa[l] - rpa[l] + preMinus[r]); - postAdd[i] = Math.max(postAdd[r], Math.max(postAdd[l] - rpa[r] + lpa[r], postMinus[l] + rpa[r] + lpa[r])); - postMinus[i] = Math.max(postMinus[r], postMinus[l] + rpa[r] - lpa[r]); - dist[i] = Math.max(Math.max(dist[l], dist[r]), Math.max(postAdd[l] + preMinus[r], preAdd[r] + postMinus[l])); + ladd[i] = Math.max(ladd[l], Math.max(pr[l] + ladd[r] - pl[l], pr[l] + pl[l] + lminus[r])); + lminus[i] = Math.max(lminus[l], pl[l] - pr[l] + lminus[r]); + radd[i] = Math.max(radd[r], Math.max(radd[l] - pr[r] + pl[r], rminus[l] + pr[r] + pl[r])); + rminus[i] = Math.max(rminus[r], rminus[l] + pr[r] - pl[r]); + dist[i] = Math.max(Math.max(dist[l], dist[r]), Math.max(radd[l] + lminus[r], ladd[r] + rminus[l])); } public static void build(int l, int r, int i) { From bccb0c3dc26de472da6a7f9f49ec3dfec4740bff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 3 Dec 2025 14:49:57 +0800 Subject: [PATCH 1132/1170] modify code --- src/class185/{Code08_HideSeek1.java => Code07_HideSeek1.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/class185/{Code08_HideSeek1.java => Code07_HideSeek1.java} (99%) diff --git a/src/class185/Code08_HideSeek1.java b/src/class185/Code07_HideSeek1.java similarity index 99% rename from src/class185/Code08_HideSeek1.java rename to src/class185/Code07_HideSeek1.java index 02906e8f5..7c0596276 100644 --- a/src/class185/Code08_HideSeek1.java +++ b/src/class185/Code07_HideSeek1.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code08_HideSeek1 { +public class Code07_HideSeek1 { public static int MAXN = 100001; public static int MAXS = MAXN * 3; From 837cc0c03a1a90107697e5e1a478d8b448e884b7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 3 Dec 2025 22:21:47 +0800 Subject: [PATCH 1133/1170] modify code --- src/class185/Code04_OpenStore1.java | 487 ++++++++++++++++++++++++++++ 1 file changed, 487 insertions(+) diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java index 987624c32..1ce9a09e7 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code04_OpenStore1.java @@ -2,7 +2,494 @@ // 开店,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3241 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; public class Code04_OpenStore1 { + public static int MAXN = 200001; + public static int MAXK = 10000001; + public static int n, Q, A; + public static int[] age = new int[MAXN]; + + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int cntg; + + public static int[] fa = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[] top = new int[MAXN]; + public static int[] dist = new int[MAXN]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] centfa = new int[MAXN]; + + public static int[] xl = new int[MAXN]; + public static int[] xr = new int[MAXN]; + public static int[] xage = new int[MAXK]; + public static long[] xsum = new long[MAXK]; + public static int cntx; + + public static int[] fl = new int[MAXN]; + public static int[] fr = new int[MAXN]; + public static int[] fage = new int[MAXK]; + public static long[] fsum = new long[MAXK]; + public static int cntf; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][5]; + public static int u, f, a, b, e; + public static int stacksize; + + public static void push(int u, int f, int a, int b, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = a; + stack[stacksize][3] = b; + stack[stacksize][4] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + a = stack[stacksize][2]; + b = stack[stacksize][3]; + e = stack[stacksize][4]; + } + + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + public static void dfs1(int u, int f, int dis) { + fa[u] = f; + dep[u] = dep[f] + 1; + dist[u] = dis; + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + if (v != f) { + dfs1(v, u, dis + w); + } + } + for (int ei = head[u], v; ei > 0; ei = nxt[ei]) { + v = to[ei]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + + public static void dfs2(int u, int t) { + top[u] = t; + if (son[u] == 0) { + return; + } + dfs2(son[u], t); + for (int e = head[u], v; e > 0; e = nxt[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, v); + } + } + } + + public static void dfs3(int cur, int father, int distance) { + stacksize = 0; + push(cur, father, distance, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + fa[u] = f; + dep[u] = dep[f] + 1; + dist[u] = a; + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, a, 0, e); + int v = to[e]; + int w = weight[e]; + if (v != f) { + push(v, u, a + w, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + } + } + + public static void dfs4(int cur, int tag) { + stacksize = 0; + push(cur, 0, 0, tag, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + top[u] = b; + if (son[u] == 0) { + continue; + } + push(u, 0, 0, b, -2); + push(son[u], 0, 0, b, -1); + continue; + } else if (e == -2) { + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, 0, 0, b, e); + int v = to[e]; + if (v != fa[u] && v != son[u]) { + push(v, 0, 0, v, -1); + } + } + } + } + + public static void getSize1(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize1(v, u); + siz[u] += siz[v]; + } + } + } + + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, 0, 0, e); + int v = to[e]; + if (v != f && !vis[v]) { + push(v, u, 0, 0, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + + public static int getLca(int a, int b) { + while (top[a] != top[b]) { + if (dep[top[a]] <= dep[top[b]]) { + b = fa[top[b]]; + } else { + a = fa[top[a]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + public static int getDist(int x, int y) { + return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void collect1(int u, int fa, int sum, int rt) { + xage[++cntx] = age[u]; + xsum[cntx] = sum; + if (centfa[rt] > 0) { + fage[++cntf] = age[u]; + fsum[cntf] = getDist(u, centfa[rt]); + } + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; + if (v != fa && !vis[v]) { + collect1(v, u, sum + w, rt); + } + } + } + + public static void collect2(int cur, int father, int psum, int cen) { + stacksize = 0; + push(cur, father, psum, cen, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + xage[++cntx] = age[u]; + xsum[cntx] = a; + if (centfa[b] > 0) { + fage[++cntf] = age[u]; + fsum[cntf] = getDist(u, centfa[b]); + } + e = head[u]; + } else { + e = nxt[e]; + } + if (e != 0) { + push(u, f, a, b, e); + int v = to[e]; + int w = weight[e]; + if (v != f && !vis[v]) { + push(v, u, a + w, b, -1); + } + } + } + } + + public static void centroidTree(int u, int fa) { + centfa[u] = fa; + vis[u] = true; + xl[u] = cntx + 1; + fl[u] = cntf + 1; + // collect1(u, 0, 0, u); + collect2(u, 0, 0, u); + xr[u] = cntx; + fr[u] = cntf; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (!vis[v]) { + centroidTree(getCentroid(v, u), u); + } + } + } + + public static int kth(int[] arr, int l, int r, int target) { + int ans = r + 1; + while (l <= r) { + int mid = (l + r) >> 1; + if (arr[mid] >= target) { + ans = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + return ans; + } + + public static void sortx(int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = xage[(l + r) >> 1], tmp1; + long tmp2; + while (i <= j) { + while (xage[i] < pivot) i++; + while (xage[j] > pivot) j--; + if (i <= j) { + tmp1 = xage[i]; xage[i] = xage[j]; xage[j] = tmp1; + tmp2 = xsum[i]; xsum[i] = xsum[j]; xsum[j] = tmp2; + i++; j--; + } + } + sortx(l, j); + sortx(i, r); + } + + public static void sortf(int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = fage[(l + r) >> 1], tmp1; + long tmp2; + while (i <= j) { + while (fage[i] < pivot) i++; + while (fage[j] > pivot) j--; + if (i <= j) { + tmp1 = fage[i]; fage[i] = fage[j]; fage[j] = tmp1; + tmp2 = fsum[i]; fsum[i] = fsum[j]; fsum[j] = tmp2; + i++; j--; + } + } + sortf(l, j); + sortf(i, r); + } + + public static long num, sum; + + public static void queryx(int u, int agel, int ager) { + int l = xl[u], r = xr[u]; + if (l > r) { + num = sum = 0; + return; + } + int a = kth(xage, l, r, agel), b = kth(xage, l, r, ager + 1) - 1; + if (a > b) { + num = sum = 0; + return; + } + num = b - a + 1; + sum = xsum[b] - (a == l ? 0 : xsum[a - 1]); + } + + public static void queryf(int u, int agel, int ager) { + int l = fl[u], r = fr[u]; + if (l > r) { + num = sum = 0; + return; + } + int a = kth(fage, l, r, agel), b = kth(fage, l, r, ager + 1) - 1; + if (a > b) { + num = sum = 0; + return; + } + num = b - a + 1; + sum = fsum[b] - (a == l ? 0 : fsum[a - 1]); + } + + public static long compute(int x, int agel, int ager) { + queryx(x, agel, ager); + long ans = sum; + long num1, sum1, num2, sum2; + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + queryx(fa, agel, ager); + num1 = num; sum1 = sum; + queryf(cur, agel, ager); + num2 = num; sum2 = sum; + ans += sum1 - sum2; + ans += (num1 - num2) * getDist(x, fa); + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + Q = in.nextInt(); + A = in.nextInt(); + for (int i = 1; i <= n; i++) { + age[i] = in.nextInt(); + } + for (int i = 1; i < n; i++) { + int a = in.nextInt(); + int b = in.nextInt(); + int c = in.nextInt(); + addEdge(a, b, c); + addEdge(b, a, c); + } + // dfs1(1, 0, 0); + // dfs2(1, 1); + dfs3(1, 0, 0); + dfs4(1, 1); + centroidTree(getCentroid(1, 0), 0); + for (int i = 1; i <= n; i++) { + sortx(xl[i], xr[i]); + for (int j = xl[i] + 1; j <= xr[i]; j++) { + xsum[j] += xsum[j - 1]; + } + sortf(fl[i], fr[i]); + for (int j = fl[i] + 1; j <= fr[i]; j++) { + fsum[j] += fsum[j - 1]; + } + } + long lastAns = 0; + for (int i = 1; i <= Q; i++) { + int x = in.nextInt(); + int l = in.nextInt(); + int r = in.nextInt(); + l = (int) ((lastAns + l) % A); + r = (int) ((lastAns + r) % A); + if (l > r) { + int tmp = l; + l = r; + r = tmp; + } + lastAns = compute(x, l, r); + out.println(lastAns); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From a4b30be9866577ff704d1f29230fbf274403f9ce Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 3 Dec 2025 22:23:59 +0800 Subject: [PATCH 1134/1170] modify code --- src/class185/Code04_OpenStore1.java | 70 ++++++++++++++--------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java index 1ce9a09e7..637715a97 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code04_OpenStore1.java @@ -213,41 +213,6 @@ public static void getSize2(int cur, int fa) { } } - public static int getLca(int a, int b) { - while (top[a] != top[b]) { - if (dep[top[a]] <= dep[top[b]]) { - b = fa[top[b]]; - } else { - a = fa[top[a]]; - } - } - return dep[a] <= dep[b] ? a : b; - } - - public static int getDist(int x, int y) { - return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); - } - - public static int getCentroid(int u, int fa) { - // getSize1(u, fa); - getSize2(u, fa); - int half = siz[u] >> 1; - boolean find = false; - while (!find) { - find = true; - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - if (v != fa && !vis[v] && siz[v] > half) { - fa = u; - u = v; - find = false; - break; - } - } - } - return u; - } - public static void collect1(int u, int fa, int sum, int rt) { xage[++cntx] = age[u]; xsum[cntx] = sum; @@ -291,6 +256,41 @@ public static void collect2(int cur, int father, int psum, int cen) { } } + public static int getLca(int a, int b) { + while (top[a] != top[b]) { + if (dep[top[a]] <= dep[top[b]]) { + b = fa[top[b]]; + } else { + a = fa[top[a]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + public static int getDist(int x, int y) { + return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + public static void centroidTree(int u, int fa) { centfa[u] = fa; vis[u] = true; From 0276e62cf9880126136a92a20a382667d832aca0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 3 Dec 2025 22:25:59 +0800 Subject: [PATCH 1135/1170] modify code --- src/class185/Code04_OpenStore1.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java index 637715a97..2a375c8a6 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code04_OpenStore1.java @@ -388,17 +388,17 @@ public static void queryf(int u, int agel, int ager) { sum = fsum[b] - (a == l ? 0 : fsum[a - 1]); } - public static long compute(int x, int agel, int ager) { - queryx(x, agel, ager); + public static long compute(int u, int agel, int ager) { + queryx(u, agel, ager); long ans = sum; long num1, sum1, num2, sum2; - for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + for (int cur = u, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { queryx(fa, agel, ager); num1 = num; sum1 = sum; queryf(cur, agel, ager); num2 = num; sum2 = sum; ans += sum1 - sum2; - ans += (num1 - num2) * getDist(x, fa); + ans += (num1 - num2) * getDist(u, fa); } return ans; } @@ -435,10 +435,10 @@ public static void main(String[] args) throws Exception { } } long lastAns = 0; - for (int i = 1; i <= Q; i++) { - int x = in.nextInt(); - int l = in.nextInt(); - int r = in.nextInt(); + for (int i = 1, u, l, r; i <= Q; i++) { + u = in.nextInt(); + l = in.nextInt(); + r = in.nextInt(); l = (int) ((lastAns + l) % A); r = (int) ((lastAns + r) % A); if (l > r) { @@ -446,7 +446,7 @@ public static void main(String[] args) throws Exception { l = r; r = tmp; } - lastAns = compute(x, l, r); + lastAns = compute(u, l, r); out.println(lastAns); } out.flush(); From 50953b9e3be06fd90eb581ba7453e12dec565d5d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 3 Dec 2025 22:27:25 +0800 Subject: [PATCH 1136/1170] modify code --- src/class185/Code07_HideSeek1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class185/Code07_HideSeek1.java b/src/class185/Code07_HideSeek1.java index 7c0596276..5ef5841c2 100644 --- a/src/class185/Code07_HideSeek1.java +++ b/src/class185/Code07_HideSeek1.java @@ -29,7 +29,7 @@ public class Code07_HideSeek1 { public static int[] seg = new int[MAXS]; public static int cntd; - // 注意区分lminus和rminus + // 注意区分lminus、rminus // pr : 都消掉之后的右括号数量 // pl : 都消掉之后的左括号数量 // ladd : 左端点到任意黑点,max(右括号 + 左括号) From 7ae9740e423c9675f2dc0a908374d7a3894ea15a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 11:13:11 +0800 Subject: [PATCH 1137/1170] modify code --- src/class185/Code04_OpenStore1.java | 97 ++++------- src/class185/Code04_OpenStore2.java | 255 ++++++++++++++++++++++++++++ 2 files changed, 286 insertions(+), 66 deletions(-) create mode 100644 src/class185/Code04_OpenStore2.java diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java index 2a375c8a6..172ce4593 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code04_OpenStore1.java @@ -13,7 +13,7 @@ public class Code04_OpenStore1 { public static int MAXN = 200001; public static int MAXK = 10000001; - public static int n, Q, A; + public static int n, m, A; public static int[] age = new int[MAXN]; public static int[] head = new int[MAXN]; @@ -308,11 +308,11 @@ public static void centroidTree(int u, int fa) { } } - public static int kth(int[] arr, int l, int r, int target) { + public static int kth(int[] arr, int l, int r, int x) { int ans = r + 1; while (l <= r) { int mid = (l + r) >> 1; - if (arr[mid] >= target) { + if (arr[mid] >= x) { ans = mid; r = mid - 1; } else { @@ -322,83 +322,50 @@ public static int kth(int[] arr, int l, int r, int target) { return ans; } - public static void sortx(int l, int r) { + public static void sort(int[] age, long[] sum, int l, int r) { if (l >= r) return; - int i = l, j = r, pivot = xage[(l + r) >> 1], tmp1; + int i = l, j = r, pivot = age[(l + r) >> 1], tmp1; long tmp2; while (i <= j) { - while (xage[i] < pivot) i++; - while (xage[j] > pivot) j--; + while (age[i] < pivot) i++; + while (age[j] > pivot) j--; if (i <= j) { - tmp1 = xage[i]; xage[i] = xage[j]; xage[j] = tmp1; - tmp2 = xsum[i]; xsum[i] = xsum[j]; xsum[j] = tmp2; + tmp1 = age[i]; age[i] = age[j]; age[j] = tmp1; + tmp2 = sum[i]; sum[i] = sum[j]; sum[j] = tmp2; i++; j--; } } - sortx(l, j); - sortx(i, r); + sort(age, sum, l, j); + sort(age, sum, i, r); } - public static void sortf(int l, int r) { - if (l >= r) return; - int i = l, j = r, pivot = fage[(l + r) >> 1], tmp1; - long tmp2; - while (i <= j) { - while (fage[i] < pivot) i++; - while (fage[j] > pivot) j--; - if (i <= j) { - tmp1 = fage[i]; fage[i] = fage[j]; fage[j] = tmp1; - tmp2 = fsum[i]; fsum[i] = fsum[j]; fsum[j] = tmp2; - i++; j--; - } - } - sortf(l, j); - sortf(i, r); - } - - public static long num, sum; - - public static void queryx(int u, int agel, int ager) { - int l = xl[u], r = xr[u]; - if (l > r) { - num = sum = 0; - return; - } - int a = kth(xage, l, r, agel), b = kth(xage, l, r, ager + 1) - 1; - if (a > b) { - num = sum = 0; - return; - } - num = b - a + 1; - sum = xsum[b] - (a == l ? 0 : xsum[a - 1]); - } + public static long nodeCnt, pathSum; - public static void queryf(int u, int agel, int ager) { - int l = fl[u], r = fr[u]; + public static void query(int[] age, long[] sum, int l, int r, int agel, int ager) { if (l > r) { - num = sum = 0; + nodeCnt = pathSum = 0; return; } - int a = kth(fage, l, r, agel), b = kth(fage, l, r, ager + 1) - 1; + int a = kth(age, l, r, agel), b = kth(age, l, r, ager + 1) - 1; if (a > b) { - num = sum = 0; + nodeCnt = pathSum = 0; return; } - num = b - a + 1; - sum = fsum[b] - (a == l ? 0 : fsum[a - 1]); + nodeCnt = b - a + 1; + pathSum = sum[b] - (a == l ? 0 : sum[a - 1]); } public static long compute(int u, int agel, int ager) { - queryx(u, agel, ager); - long ans = sum; - long num1, sum1, num2, sum2; + query(xage, xsum, xl[u], xr[u], agel, ager); + long ans = pathSum; + long cnt1, sum1, cnt2, sum2; for (int cur = u, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { - queryx(fa, agel, ager); - num1 = num; sum1 = sum; - queryf(cur, agel, ager); - num2 = num; sum2 = sum; + query(xage, xsum, xl[fa], xr[fa], agel, ager); + cnt1 = nodeCnt; sum1 = pathSum; + query(fage, fsum, fl[cur], fr[cur], agel, ager); + cnt2 = nodeCnt; sum2 = pathSum; ans += sum1 - sum2; - ans += (num1 - num2) * getDist(u, fa); + ans += (cnt1 - cnt2) * getDist(u, fa); } return ans; } @@ -407,7 +374,7 @@ public static void main(String[] args) throws Exception { FastReader in = new FastReader(System.in); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); - Q = in.nextInt(); + m = in.nextInt(); A = in.nextInt(); for (int i = 1; i <= n; i++) { age[i] = in.nextInt(); @@ -425,26 +392,24 @@ public static void main(String[] args) throws Exception { dfs4(1, 1); centroidTree(getCentroid(1, 0), 0); for (int i = 1; i <= n; i++) { - sortx(xl[i], xr[i]); + sort(xage, xsum, xl[i], xr[i]); for (int j = xl[i] + 1; j <= xr[i]; j++) { xsum[j] += xsum[j - 1]; } - sortf(fl[i], fr[i]); + sort(fage, fsum, fl[i], fr[i]); for (int j = fl[i] + 1; j <= fr[i]; j++) { fsum[j] += fsum[j - 1]; } } long lastAns = 0; - for (int i = 1, u, l, r; i <= Q; i++) { + for (int i = 1, u, l, r; i <= m; i++) { u = in.nextInt(); l = in.nextInt(); r = in.nextInt(); l = (int) ((lastAns + l) % A); r = (int) ((lastAns + r) % A); if (l > r) { - int tmp = l; - l = r; - r = tmp; + int tmp = l; l = r; r = tmp; } lastAns = compute(u, l, r); out.println(lastAns); diff --git a/src/class185/Code04_OpenStore2.java b/src/class185/Code04_OpenStore2.java new file mode 100644 index 000000000..2880301e7 --- /dev/null +++ b/src/class185/Code04_OpenStore2.java @@ -0,0 +1,255 @@ +package class185; + +// 开店,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3241 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int age; +// long long sum; +//}; +// +//bool NodeCmp(Node x, Node y) { +// return x.age < y.age; +//} +// +//const int MAXN = 200001; +//const int MAXK = 10000001; +//int n, m, A; +//int age[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cntg; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dist[MAXN]; +// +//bool vis[MAXN]; +//int centfa[MAXN]; +// +//int xl[MAXN]; +//int xr[MAXN]; +//Node xarr[MAXK]; +//int cntx; +// +//int fl[MAXN]; +//int fr[MAXN]; +//Node farr[MAXK]; +//int cntf; +// +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//void dfs1(int u, int f, int dis) { +// fa[u] = f; +// dep[u] = dep[f] + 1; +// dist[u] = dis; +// siz[u] = 1; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// if (v != f) { +// dfs1(v, u, dis + w); +// } +// } +// for (int ei = head[u], v; ei > 0; ei = nxt[ei]) { +// v = to[ei]; +// if (v != f) { +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +// } +//} +// +//void dfs2(int u, int t) { +// top[u] = t; +// if (son[u] == 0) { +// return; +// } +// dfs2(son[u], t); +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//int getLca(int a, int b) { +// while (top[a] != top[b]) { +// if (dep[top[a]] <= dep[top[b]]) { +// b = fa[top[b]]; +// } else { +// a = fa[top[a]]; +// } +// } +// return dep[a] <= dep[b] ? a : b; +//} +// +//int getDist(int x, int y) { +// return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); +//} +// +//void getSize(int u, int f) { +// siz[u] = 1; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != f && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getCentroid(int u, int f) { +// getSize(u, f); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != f && !vis[v] && siz[v] > half) { +// f = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void collect(int u, int f, int sum, int rt) { +// xarr[++cntx] = { age[u], sum }; +// if (centfa[rt] > 0) { +// farr[++cntf] = { age[u], getDist(u, centfa[rt]) }; +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; +// if (v != f && !vis[v]) { +// collect(v, u, sum + w, rt); +// } +// } +//} +// +//void centroidTree(int u, int f) { +// centfa[u] = f; +// vis[u] = true; +// xl[u] = cntx + 1; +// fl[u] = cntf + 1; +// collect(u, 0, 0, u); +// xr[u] = cntx; +// fr[u] = cntf; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (!vis[v]) { +// centroidTree(getCentroid(v, u), u); +// } +// } +//} +// +//int kth(Node arr[], int l, int r, int x) { +// int ans = r + 1; +// while (l <= r) { +// int mid = (l + r) >> 1; +// if (arr[mid].age >= x) { +// ans = mid; +// r = mid - 1; +// } else { +// l = mid + 1; +// } +// } +// return ans; +//} +// +//long long nodeCnt, pathSum; +// +//void query(Node arr[], int l, int r, int agel, int ager) { +// if (l > r) { +// nodeCnt = pathSum = 0; +// return; +// } +// int a = kth(arr, l, r, agel); +// int b = kth(arr, l, r, ager + 1) - 1; +// if (a > b) { +// nodeCnt = pathSum = 0; +// return; +// } +// nodeCnt = 1L + b - a; +// pathSum = arr[b].sum - (a == l ? 0 : arr[a - 1].sum); +//} +// +//long long compute(int u, int agel, int ager) { +// query(xarr, xl[u], xr[u], agel, ager); +// long long ans = pathSum; +// long long cnt1, sum1, cnt2, sum2; +// for (int cur = u, f = centfa[cur]; f > 0; cur = f, f = centfa[cur]) { +// query(xarr, xl[f], xr[f], agel, ager); +// cnt1 = nodeCnt; sum1 = pathSum; +// query(farr, fl[cur], fr[cur], agel, ager); +// cnt2 = nodeCnt; sum2 = pathSum; +// ans += sum1 - sum2; +// ans += (cnt1 - cnt2) * 1LL * getDist(u, f); +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> A; +// for (int i = 1; i <= n; i++) { +// cin >> age[i]; +// } +// for (int i = 1; i < n; i++) { +// int a, b, c; +// cin >> a >> b >> c; +// addEdge(a, b, c); +// addEdge(b, a, c); +// } +// dfs1(1, 0, 0); +// dfs2(1, 1); +// centroidTree(getCentroid(1, 0), 0); +// for (int i = 1; i <= n; i++) { +// sort(xarr + xl[i], xarr + xr[i] + 1, NodeCmp); +// for (int j = xl[i] + 1; j <= xr[i]; j++) { +// xarr[j].sum += xarr[j - 1].sum; +// } +// sort(farr + fl[i], farr + fr[i] + 1, NodeCmp); +// for (int j = fl[i] + 1; j <= fr[i]; j++) { +// farr[j].sum += farr[j - 1].sum; +// } +// } +// long long lastAns = 0; +// for (int i = 1, u, l, r; i <= m; i++) { +// cin >> u >> l >> r; +// l = (int)((lastAns + l) % A); +// r = (int)((lastAns + r) % A); +// if (l > r) { +// swap(l, r); +// } +// lastAns = compute(u, l, r); +// cout << lastAns << '\n'; +// } +// return 0; +//} \ No newline at end of file From b31fe7047a5337cf569469b33560175f0e44502b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 11:21:37 +0800 Subject: [PATCH 1138/1170] modify code --- src/class185/Code04_OpenStore1.java | 18 ++++++++---------- src/class185/Code04_OpenStore2.java | 19 ++++++++----------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java index 172ce4593..b18a5ffb1 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code04_OpenStore1.java @@ -342,17 +342,15 @@ public static void sort(int[] age, long[] sum, int l, int r) { public static long nodeCnt, pathSum; public static void query(int[] age, long[] sum, int l, int r, int agel, int ager) { - if (l > r) { - nodeCnt = pathSum = 0; - return; - } - int a = kth(age, l, r, agel), b = kth(age, l, r, ager + 1) - 1; - if (a > b) { - nodeCnt = pathSum = 0; - return; + nodeCnt = pathSum = 0; + if (l <= r) { + int a = kth(age, l, r, agel); + int b = kth(age, l, r, ager + 1) - 1; + if (a <= b) { + nodeCnt = b - a + 1; + pathSum = sum[b] - (a == l ? 0 : sum[a - 1]); + } } - nodeCnt = b - a + 1; - pathSum = sum[b] - (a == l ? 0 : sum[a - 1]); } public static long compute(int u, int agel, int ager) { diff --git a/src/class185/Code04_OpenStore2.java b/src/class185/Code04_OpenStore2.java index 2880301e7..4d2b74be2 100644 --- a/src/class185/Code04_OpenStore2.java +++ b/src/class185/Code04_OpenStore2.java @@ -185,18 +185,15 @@ //long long nodeCnt, pathSum; // //void query(Node arr[], int l, int r, int agel, int ager) { -// if (l > r) { -// nodeCnt = pathSum = 0; -// return; -// } -// int a = kth(arr, l, r, agel); -// int b = kth(arr, l, r, ager + 1) - 1; -// if (a > b) { -// nodeCnt = pathSum = 0; -// return; +// nodeCnt = pathSum = 0; +// if (l <= r) { +// int a = kth(arr, l, r, agel); +// int b = kth(arr, l, r, ager + 1) - 1; +// if (a <= b) { +// nodeCnt = 1L + b - a; +// pathSum = arr[b].sum - (a == l ? 0 : arr[a - 1].sum); +// } // } -// nodeCnt = 1L + b - a; -// pathSum = arr[b].sum - (a == l ? 0 : arr[a - 1].sum); //} // //long long compute(int u, int agel, int ager) { From 6204067179a825b56b58c3e6e6a542ff4fdf66f0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 12:47:49 +0800 Subject: [PATCH 1139/1170] modify code --- src/class185/Code05_Fantasy1.java | 365 ++++++++++++++++++++++++++++++ 1 file changed, 365 insertions(+) create mode 100644 src/class185/Code05_Fantasy1.java diff --git a/src/class185/Code05_Fantasy1.java b/src/class185/Code05_Fantasy1.java new file mode 100644 index 000000000..29c2d1531 --- /dev/null +++ b/src/class185/Code05_Fantasy1.java @@ -0,0 +1,365 @@ +package class185; + +// 幻想乡战略游戏,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3345 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code05_Fantasy1 { + + public static int MAXN = 100001; + public static int n, m; + + public static int[] headg = new int[MAXN]; + public static int[] nxtg = new int[MAXN << 1]; + public static int[] tog = new int[MAXN << 1]; + public static int[] weightg = new int[MAXN << 1]; + public static int cntg; + + public static int[] headc = new int[MAXN]; + public static int[] nxtc = new int[MAXN << 1]; + public static int[] toc = new int[MAXN << 1]; + public static int[] centc = new int[MAXN << 1]; + public static int cntc; + + public static int[] fa = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[] top = new int[MAXN]; + public static int[] dist = new int[MAXN]; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] centfa = new int[MAXN]; + + public static long[] num = new long[MAXN]; + public static long[] sumx = new long[MAXN]; + public static long[] sumf = new long[MAXN]; + + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][5]; + public static int u, f, a, b, e; + public static int stacksize; + + public static void push(int u, int f, int a, int b, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = a; + stack[stacksize][3] = b; + stack[stacksize][4] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + a = stack[stacksize][2]; + b = stack[stacksize][3]; + e = stack[stacksize][4]; + } + + public static void addEdgeG(int u, int v, int w) { + nxtg[++cntg] = headg[u]; + tog[cntg] = v; + weightg[cntg] = w; + headg[u] = cntg; + } + + public static void addEdgeC(int u, int v, int cen) { + nxtc[++cntc] = headc[u]; + toc[cntc] = v; + centc[cntc] = cen; + headc[u] = cntc; + } + + public static void dfs1(int u, int f, int dis) { + fa[u] = f; + dep[u] = dep[f] + 1; + dist[u] = dis; + siz[u] = 1; + for (int e = headg[u]; e > 0; e = nxtg[e]) { + int v = tog[e]; + int w = weightg[e]; + if (v != f) { + dfs1(v, u, dis + w); + } + } + for (int ei = headg[u], v; ei > 0; ei = nxtg[ei]) { + v = tog[ei]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + + public static void dfs2(int u, int t) { + top[u] = t; + if (son[u] == 0) { + return; + } + dfs2(son[u], t); + for (int e = headg[u], v; e > 0; e = nxtg[e]) { + v = tog[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, v); + } + } + } + + public static void dfs3(int cur, int father, int distance) { + stacksize = 0; + push(cur, father, distance, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + fa[u] = f; + dep[u] = dep[f] + 1; + dist[u] = a; + siz[u] = 1; + e = headg[u]; + } else { + e = nxtg[e]; + } + if (e != 0) { + push(u, f, a, 0, e); + int v = tog[e]; + int w = weightg[e]; + if (v != f) { + push(v, u, a + w, 0, -1); + } + } else { + for (int ei = headg[u]; ei > 0; ei = nxtg[ei]) { + int v = tog[ei]; + if (v != f) { + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + } + } + } + + public static void dfs4(int cur, int tag) { + stacksize = 0; + push(cur, 0, 0, tag, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + top[u] = b; + if (son[u] == 0) { + continue; + } + push(u, 0, 0, b, -2); + push(son[u], 0, 0, b, -1); + continue; + } else if (e == -2) { + e = headg[u]; + } else { + e = nxtg[e]; + } + if (e != 0) { + push(u, 0, 0, b, e); + int v = tog[e]; + if (v != fa[u] && v != son[u]) { + push(v, 0, 0, v, -1); + } + } + } + } + + public static void getSize1(int u, int fa) { + siz[u] = 1; + for (int e = headg[u]; e > 0; e = nxtg[e]) { + int v = tog[e]; + if (v != fa && !vis[v]) { + getSize1(v, u); + siz[u] += siz[v]; + } + } + } + + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = headg[u]; + } else { + e = nxtg[e]; + } + if (e != 0) { + push(u, f, 0, 0, e); + int v = tog[e]; + if (v != f && !vis[v]) { + push(v, u, 0, 0, -1); + } + } else { + for (int ei = headg[u]; ei > 0; ei = nxtg[ei]) { + int v = tog[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + + public static int getLca(int a, int b) { + while (top[a] != top[b]) { + if (dep[top[a]] <= dep[top[b]]) { + b = fa[top[b]]; + } else { + a = fa[top[a]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + public static int getDist(int x, int y) { + return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); + } + + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = headg[u]; e > 0; e = nxtg[e]) { + int v = tog[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void centroidTree(int u, int fa) { + centfa[u] = fa; + vis[u] = true; + for (int e = headg[u]; e > 0; e = nxtg[e]) { + int v = tog[e]; + if (!vis[v]) { + int nextCent = getCentroid(v, u); + addEdgeC(u, v, nextCent); + centroidTree(nextCent, u); + } + } + } + + public static void add(int x, int v) { + num[x] += v; + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + int dist = getDist(x, fa); + num[fa] += v; + sumx[fa] += 1L * v * dist; + sumf[cur] += 1L * v * dist; + } + } + + public static long query(int x) { + long ans = sumx[x]; + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + int dist = getDist(x, fa); + ans += (num[fa] - num[cur]) * dist; + ans += (sumx[fa] - sumf[cur]); + } + return ans; + } + + public static long compute(int u) { + long ans = query(u); + for (int e = headc[u]; e > 0; e = nxtc[e]) { + int v = toc[e]; + if (query(v) < ans) { + return compute(centc[e]); + } + } + return ans; + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdgeG(u, v, w); + addEdgeG(v, u, w); + } + // dfs1(1, 0, 0); + // dfs2(1, 1); + dfs3(1, 0, 0); + dfs4(1, 1); + int root = getCentroid(1, 0); + centroidTree(root, 0); + for (int i = 1, x, v; i <= m; i++) { + x = in.nextInt(); + v = in.nextInt(); + add(x, v); + out.println(compute(root)); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + +} From 6f6487f7f161a1ae78f89f2756773fef69d016db Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 13:17:24 +0800 Subject: [PATCH 1140/1170] modify code --- src/class185/Code04_OpenStore2.java | 14 +- src/class185/Code05_Fantasy1.java | 12 +- src/class185/Code05_Fantasy2.java | 200 ++++++++++++++++++++++++++++ 3 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 src/class185/Code05_Fantasy2.java diff --git a/src/class185/Code04_OpenStore2.java b/src/class185/Code04_OpenStore2.java index 4d2b74be2..4b115b093 100644 --- a/src/class185/Code04_OpenStore2.java +++ b/src/class185/Code04_OpenStore2.java @@ -61,14 +61,14 @@ // dep[u] = dep[f] + 1; // dist[u] = dis; // siz[u] = 1; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // int w = weight[e]; // if (v != f) { // dfs1(v, u, dis + w); // } // } -// for (int ei = head[u], v; ei > 0; ei = nxt[ei]) { +// for (int ei = head[u], v; ei; ei = nxt[ei]) { // v = to[ei]; // if (v != f) { // siz[u] += siz[v]; @@ -85,7 +85,7 @@ // return; // } // dfs2(son[u], t); -// for (int e = head[u], v; e > 0; e = nxt[e]) { +// for (int e = head[u], v; e; e = nxt[e]) { // v = to[e]; // if (v != fa[u] && v != son[u]) { // dfs2(v, v); @@ -110,7 +110,7 @@ // //void getSize(int u, int f) { // siz[u] = 1; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != f && !vis[v]) { // getSize(v, u); @@ -125,7 +125,7 @@ // bool find = false; // while (!find) { // find = true; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (v != f && !vis[v] && siz[v] > half) { // f = u; @@ -143,7 +143,7 @@ // if (centfa[rt] > 0) { // farr[++cntf] = { age[u], getDist(u, centfa[rt]) }; // } -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // int w = weight[e]; // if (v != f && !vis[v]) { @@ -160,7 +160,7 @@ // collect(u, 0, 0, u); // xr[u] = cntx; // fr[u] = cntf; -// for (int e = head[u]; e > 0; e = nxt[e]) { +// for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { // centroidTree(getCentroid(v, u), u); diff --git a/src/class185/Code05_Fantasy1.java b/src/class185/Code05_Fantasy1.java index 29c2d1531..5a0fed7d4 100644 --- a/src/class185/Code05_Fantasy1.java +++ b/src/class185/Code05_Fantasy1.java @@ -37,8 +37,8 @@ public class Code05_Fantasy1 { public static int[] centfa = new int[MAXN]; public static long[] num = new long[MAXN]; - public static long[] sumx = new long[MAXN]; - public static long[] sumf = new long[MAXN]; + public static long[] xsum = new long[MAXN]; + public static long[] fsum = new long[MAXN]; // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; @@ -269,17 +269,17 @@ public static void add(int x, int v) { for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { int dist = getDist(x, fa); num[fa] += v; - sumx[fa] += 1L * v * dist; - sumf[cur] += 1L * v * dist; + xsum[fa] += 1L * v * dist; + fsum[cur] += 1L * v * dist; } } public static long query(int x) { - long ans = sumx[x]; + long ans = xsum[x]; for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { int dist = getDist(x, fa); ans += (num[fa] - num[cur]) * dist; - ans += (sumx[fa] - sumf[cur]); + ans += (xsum[fa] - fsum[cur]); } return ans; } diff --git a/src/class185/Code05_Fantasy2.java b/src/class185/Code05_Fantasy2.java new file mode 100644 index 000000000..50fd77977 --- /dev/null +++ b/src/class185/Code05_Fantasy2.java @@ -0,0 +1,200 @@ +package class185; + +// 幻想乡战略游戏,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3345 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m; +// +//int headg[MAXN]; +//int nxtg[MAXN << 1]; +//int tog[MAXN << 1]; +//int weightg[MAXN << 1]; +//int cntg; +// +//int headc[MAXN]; +//int nxtc[MAXN << 1]; +//int toc[MAXN << 1]; +//int centc[MAXN << 1]; +//int cntc; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dist[MAXN]; +// +//bool vis[MAXN]; +//int centfa[MAXN]; +// +//long long num[MAXN]; +//long long xsum[MAXN]; +//long long fsum[MAXN]; +// +//void addEdgeG(int u, int v, int w) { +// nxtg[++cntg] = headg[u]; +// tog[cntg] = v; +// weightg[cntg] = w; +// headg[u] = cntg; +//} +// +//void addEdgeC(int u, int v, int cen) { +// nxtc[++cntc] = headc[u]; +// toc[cntc] = v; +// centc[cntc] = cen; +// headc[u] = cntc; +//} +// +//void dfs1(int u, int f, int dis) { +// fa[u] = f; +// dep[u] = dep[f] + 1; +// dist[u] = dis; +// siz[u] = 1; +// for (int e = headg[u]; e; e = nxtg[e]) { +// int v = tog[e]; +// int w = weightg[e]; +// if (v != f) { +// dfs1(v, u, dis + w); +// } +// } +// for (int ei = headg[u], v; ei; ei = nxtg[ei]) { +// v = tog[ei]; +// if (v != f) { +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +// } +//} +// +//void dfs2(int u, int t) { +// top[u] = t; +// if (son[u] == 0) { +// return; +// } +// dfs2(son[u], t); +// for (int e = headg[u], v; e; e = nxtg[e]) { +// v = tog[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void getSize(int u, int f) { +// siz[u] = 1; +// for (int e = headg[u]; e; e = nxtg[e]) { +// int v = tog[e]; +// if (v != f && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getLca(int a, int b) { +// while (top[a] != top[b]) { +// if (dep[top[a]] <= dep[top[b]]) { +// b = fa[top[b]]; +// } else { +// a = fa[top[a]]; +// } +// } +// return dep[a] <= dep[b] ? a : b; +//} +// +//int getDist(int x, int y) { +// return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); +//} +// +//int getCentroid(int u, int f) { +// getSize(u, f); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = headg[u]; e; e = nxtg[e]) { +// int v = tog[e]; +// if (v != f && !vis[v] && siz[v] > half) { +// f = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void centroidTree(int u, int f) { +// centfa[u] = f; +// vis[u] = true; +// for (int e = headg[u]; e; e = nxtg[e]) { +// int v = tog[e]; +// if (!vis[v]) { +// int nextCent = getCentroid(v, u); +// addEdgeC(u, v, nextCent); +// centroidTree(nextCent, u); +// } +// } +//} +// +//void add(int x, int v) { +// num[x] += v; +// for (int cur = x, f = centfa[cur]; f > 0; cur = f, f = centfa[cur]) { +// int dist = getDist(x, f); +// num[f] += v; +// xsum[f] += 1LL * v * dist; +// fsum[cur] += 1LL * v * dist; +// } +//} +// +//long long query(int x) { +// long long ans = xsum[x]; +// for (int cur = x, f = centfa[cur]; f > 0; cur = f, f = centfa[cur]) { +// int dist = getDist(x, f); +// ans += (num[f] - num[cur]) * dist; +// ans += (xsum[f] - fsum[cur]); +// } +// return ans; +//} +// +//long long compute(int u) { +// long long ans = query(u); +// for (int e = headc[u]; e; e = nxtc[e]) { +// int v = toc[e]; +// if (query(v) < ans) { +// return compute(centc[e]); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdgeG(u, v, w); +// addEdgeG(v, u, w); +// } +// dfs1(1, 0, 0); +// dfs2(1, 1); +// int root = getCentroid(1, 0); +// centroidTree(root, 0); +// for (int i = 1, x, v; i <= m; i++) { +// cin >> x >> v; +// add(x, v); +// cout << compute(root) << '\n'; +// } +// return 0; +//} \ No newline at end of file From d62c0e7baecdbcdc718b074da21c815373e5f06d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 13:37:19 +0800 Subject: [PATCH 1141/1170] modify code --- src/class185/Code07_HideSeek2.java | 146 +++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 src/class185/Code07_HideSeek2.java diff --git a/src/class185/Code07_HideSeek2.java b/src/class185/Code07_HideSeek2.java new file mode 100644 index 000000000..7d66c7634 --- /dev/null +++ b/src/class185/Code07_HideSeek2.java @@ -0,0 +1,146 @@ +package class185; + +// 捉迷藏,正解是树的括号序,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2056 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXS = MAXN * 3; +//const int MAXT = MAXS << 2; +//const int INF = 1000000001; +//const int PAR = -1; +//const int PAL = -2; +//int n, m; +//bool light[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int dfn[MAXN]; +//int seg[MAXS]; +//int cntd; +// +//int pr[MAXT]; +//int pl[MAXT]; +//int ladd[MAXT]; +//int lminus[MAXT]; +//int radd[MAXT]; +//int rminus[MAXT]; +//int distv[MAXT]; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs(int u, int fa) { +// seg[++cntd] = PAL; +// seg[++cntd] = u; +// dfn[u] = cntd; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa) { +// dfs(v, u); +// } +// } +// seg[++cntd] = PAR; +//} +// +//void setSingle(int i, int v) { +// pr[i] = pl[i] = 0; +// ladd[i] = lminus[i] = radd[i] = rminus[i] = -INF; +// distv[i] = -INF; +// if (v == PAR) { +// pr[i] = 1; +// } else if (v == PAL) { +// pl[i] = 1; +// } else if (!light[v]) { +// ladd[i] = lminus[i] = radd[i] = rminus[i] = 0; +// } +//} +// +//void up(int i) { +// int l = i << 1; +// int r = i << 1 | 1; +// if (pl[l] > pr[r]) { +// pr[i] = pr[l]; +// pl[i] = pl[l] - pr[r] + pl[r]; +// } else { +// pr[i] = pr[l] + pr[r] - pl[l]; +// pl[i] = pl[r]; +// } +// ladd[i] = max(ladd[l], max(pr[l] + ladd[r] - pl[l], pr[l] + pl[l] + lminus[r])); +// lminus[i] = max(lminus[l], pl[l] - pr[l] + lminus[r]); +// radd[i] = max(radd[r], max(radd[l] - pr[r] + pl[r], rminus[l] + pr[r] + pl[r])); +// rminus[i] = max(rminus[r], rminus[l] + pr[r] - pl[r]); +// distv[i] = max(max(distv[l], distv[r]), max(radd[l] + lminus[r], ladd[r] + rminus[l])); +//} +// +//void build(int l, int r, int i) { +// if (l == r) { +// setSingle(i, seg[l]); +// } else { +// int mid = (l + r) >> 1; +// build(l, mid, i << 1); +// build(mid + 1, r, i << 1 | 1); +// up(i); +// } +//} +// +//void update(int jobi, int l, int r, int i) { +// if (l == r) { +// setSingle(i, seg[l]); +// } else { +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// update(jobi, l, mid, i << 1); +// } else { +// update(jobi, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs(1, 0); +// build(1, cntd, 1); +// cin >> m; +// int offCnt = n; +// char op; +// for (int i = 1, x; i <= m; i++) { +// cin >> op; +// if (op == 'C') { +// cin >> x; +// light[x] = !light[x]; +// if (!light[x]) { +// offCnt++; +// } else { +// offCnt--; +// } +// update(dfn[x], 1, cntd, 1); +// } else { +// if (offCnt <= 1) { +// cout << (offCnt - 1) << '\n'; +// } else { +// cout << distv[1] << '\n'; +// } +// } +// } +// return 0; +//} \ No newline at end of file From eafa9d5664e6af55acdb5f51cc8f5c2c2ee64dad Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 13:42:40 +0800 Subject: [PATCH 1142/1170] modify code --- src/class036/Code03_WidthOfBinaryTree2.java | 2 +- src/class185/Code06_ChengDu1.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 src/class185/Code06_ChengDu1.java diff --git a/src/class036/Code03_WidthOfBinaryTree2.java b/src/class036/Code03_WidthOfBinaryTree2.java index 420f91ea1..a040f824d 100644 --- a/src/class036/Code03_WidthOfBinaryTree2.java +++ b/src/class036/Code03_WidthOfBinaryTree2.java @@ -21,7 +21,7 @@ // iq[r++] = 1ULL; // while (l < r) { // int size = r - l; -// ans = std::max(ans, static_cast(iq[r - 1] - iq[l] + 1ULL)); +// ans = std::max(ans, (int)(iq[r - 1] - iq[l] + 1)); // for (int i = 0; i < size; i++) { // TreeNode* node = nq[l]; // ULL id = iq[l++]; diff --git a/src/class185/Code06_ChengDu1.java b/src/class185/Code06_ChengDu1.java new file mode 100644 index 000000000..c0a53f38e --- /dev/null +++ b/src/class185/Code06_ChengDu1.java @@ -0,0 +1,8 @@ +package class185; + +// 成都七中,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5311 + +public class Code06_ChengDu1 { + +} From 893eff2b16ad506de709cdbca55d6aed981df931 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 13:44:47 +0800 Subject: [PATCH 1143/1170] modify code --- src/class185/Code04_OpenStore1.java | 70 ++++++++++++++--------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java index b18a5ffb1..60e56a699 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code04_OpenStore1.java @@ -174,6 +174,21 @@ public static void dfs4(int cur, int tag) { } } + public static int getLca(int a, int b) { + while (top[a] != top[b]) { + if (dep[top[a]] <= dep[top[b]]) { + b = fa[top[b]]; + } else { + a = fa[top[a]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + public static int getDist(int x, int y) { + return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); + } + public static void getSize1(int u, int fa) { siz[u] = 1; for (int e = head[u]; e > 0; e = nxt[e]) { @@ -213,6 +228,26 @@ public static void getSize2(int cur, int fa) { } } + public static int getCentroid(int u, int fa) { + // getSize1(u, fa); + getSize2(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + public static void collect1(int u, int fa, int sum, int rt) { xage[++cntx] = age[u]; xsum[cntx] = sum; @@ -256,41 +291,6 @@ public static void collect2(int cur, int father, int psum, int cen) { } } - public static int getLca(int a, int b) { - while (top[a] != top[b]) { - if (dep[top[a]] <= dep[top[b]]) { - b = fa[top[b]]; - } else { - a = fa[top[a]]; - } - } - return dep[a] <= dep[b] ? a : b; - } - - public static int getDist(int x, int y) { - return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); - } - - public static int getCentroid(int u, int fa) { - // getSize1(u, fa); - getSize2(u, fa); - int half = siz[u] >> 1; - boolean find = false; - while (!find) { - find = true; - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - if (v != fa && !vis[v] && siz[v] > half) { - fa = u; - u = v; - find = false; - break; - } - } - } - return u; - } - public static void centroidTree(int u, int fa) { centfa[u] = fa; vis[u] = true; From 5edee20a0375564475248e4f2c1e6127d84852df Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 13:46:11 +0800 Subject: [PATCH 1144/1170] modify code --- src/class185/Code04_OpenStore1.java | 6 ++++-- src/class185/Code04_OpenStore2.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java index 60e56a699..7466ec5e6 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code04_OpenStore1.java @@ -359,9 +359,11 @@ public static long compute(int u, int agel, int ager) { long cnt1, sum1, cnt2, sum2; for (int cur = u, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { query(xage, xsum, xl[fa], xr[fa], agel, ager); - cnt1 = nodeCnt; sum1 = pathSum; + cnt1 = nodeCnt; + sum1 = pathSum; query(fage, fsum, fl[cur], fr[cur], agel, ager); - cnt2 = nodeCnt; sum2 = pathSum; + cnt2 = nodeCnt; + sum2 = pathSum; ans += sum1 - sum2; ans += (cnt1 - cnt2) * getDist(u, fa); } diff --git a/src/class185/Code04_OpenStore2.java b/src/class185/Code04_OpenStore2.java index 4b115b093..e5a5156df 100644 --- a/src/class185/Code04_OpenStore2.java +++ b/src/class185/Code04_OpenStore2.java @@ -202,9 +202,11 @@ // long long cnt1, sum1, cnt2, sum2; // for (int cur = u, f = centfa[cur]; f > 0; cur = f, f = centfa[cur]) { // query(xarr, xl[f], xr[f], agel, ager); -// cnt1 = nodeCnt; sum1 = pathSum; +// cnt1 = nodeCnt; +// sum1 = pathSum; // query(farr, fl[cur], fr[cur], agel, ager); -// cnt2 = nodeCnt; sum2 = pathSum; +// cnt2 = nodeCnt; +// sum2 = pathSum; // ans += sum1 - sum2; // ans += (cnt1 - cnt2) * 1LL * getDist(u, f); // } From 72151a45d543d11f2e2919f65d10b6a5da6502ab Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 13:56:59 +0800 Subject: [PATCH 1145/1170] modify code --- src/class185/Code01_Wave1.java | 30 ++++++++--------- src/class185/Code01_Wave2.java | 22 ++++++------- src/class185/Code02_Game1.java | 54 +++++++++++++++---------------- src/class185/Code02_Game2.java | 22 ++++++------- src/class185/Code03_AtmTree1.java | 22 ++++++------- src/class185/Code03_AtmTree2.java | 22 ++++++------- src/class185/Code05_Fantasy1.java | 30 ++++++++--------- src/class185/Code05_Fantasy2.java | 22 ++++++------- 8 files changed, 112 insertions(+), 112 deletions(-) diff --git a/src/class185/Code01_Wave1.java b/src/class185/Code01_Wave1.java index 3feb5dc3f..d74e47ede 100644 --- a/src/class185/Code01_Wave1.java +++ b/src/class185/Code01_Wave1.java @@ -165,6 +165,21 @@ public static void dfs4(int cur, int tag) { } } + public static int getLca(int a, int b) { + while (top[a] != top[b]) { + if (dep[top[a]] <= dep[top[b]]) { + b = fa[top[b]]; + } else { + a = fa[top[a]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + public static int getDist(int x, int y) { + return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); + } + // 找重心需要计算子树大小的递归版,java会爆栈,C++不会 public static void getSize1(int u, int fa) { siz[u] = 1; @@ -206,21 +221,6 @@ public static void getSize2(int cur, int fa) { } } - public static int getLca(int a, int b) { - while (top[a] != top[b]) { - if (dep[top[a]] <= dep[top[b]]) { - b = fa[top[b]]; - } else { - a = fa[top[a]]; - } - } - return dep[a] <= dep[b] ? a : b; - } - - public static int getDist(int x, int y) { - return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); - } - public static int getCentroid(int u, int fa) { // getSize1(u, fa); getSize2(u, fa); diff --git a/src/class185/Code01_Wave2.java b/src/class185/Code01_Wave2.java index 9e2a98004..d144fa5a0 100644 --- a/src/class185/Code01_Wave2.java +++ b/src/class185/Code01_Wave2.java @@ -77,17 +77,6 @@ // } //} // -//void getSize(int u, int fa) { -// siz[u] = 1; -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// if (v != fa && !vis[v]) { -// getSize(v, u); -// siz[u] += siz[v]; -// } -// } -//} -// //int getLca(int a, int b) { // while (top[a] != top[b]) { // if (dep[top[a]] <= dep[top[b]]) { @@ -103,6 +92,17 @@ // return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); //} // +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// //int getCentroid(int u, int fa) { // getSize(u, fa); // int half = siz[u] >> 1; diff --git a/src/class185/Code02_Game1.java b/src/class185/Code02_Game1.java index 83e17f675..6c7b9bd90 100644 --- a/src/class185/Code02_Game1.java +++ b/src/class185/Code02_Game1.java @@ -101,6 +101,33 @@ public static void dfs2(int cur, int fa) { } } + public static int getLca(int a, int b) { + if (dep[a] < dep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (dep[stjump[a][p]] >= dep[b]) { + a = stjump[a][p]; + } + } + if (a == b) { + return a; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[a][p] != stjump[b][p]) { + a = stjump[a][p]; + b = stjump[b][p]; + } + } + return stjump[a][0]; + } + + public static int getDist(int x, int y) { + return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); + } + // 找重心需要计算子树大小的递归版,java会爆栈,C++不会 public static void getSize1(int u, int fa) { siz[u] = 1; @@ -142,33 +169,6 @@ public static void getSize2(int cur, int fa) { } } - public static int getLca(int a, int b) { - if (dep[a] < dep[b]) { - int tmp = a; - a = b; - b = tmp; - } - for (int p = MAXH - 1; p >= 0; p--) { - if (dep[stjump[a][p]] >= dep[b]) { - a = stjump[a][p]; - } - } - if (a == b) { - return a; - } - for (int p = MAXH - 1; p >= 0; p--) { - if (stjump[a][p] != stjump[b][p]) { - a = stjump[a][p]; - b = stjump[b][p]; - } - } - return stjump[a][0]; - } - - public static int getDist(int x, int y) { - return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); - } - public static int getCentroid(int u, int fa) { // getSize1(u, fa); getSize2(u, fa); diff --git a/src/class185/Code02_Game2.java b/src/class185/Code02_Game2.java index 086f1b740..dabbe13c5 100644 --- a/src/class185/Code02_Game2.java +++ b/src/class185/Code02_Game2.java @@ -53,17 +53,6 @@ // } //} // -//void getSize(int u, int fa) { -// siz[u] = 1; -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// if (v != fa && !vis[v]) { -// getSize(v, u); -// siz[u] += siz[v]; -// } -// } -//} -// //int getLca(int a, int b) { // if (dep[a] < dep[b]) { // swap(a, b); @@ -89,6 +78,17 @@ // return dep[x] + dep[y] - (dep[getLca(x, y)] << 1); //} // +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// //int getCentroid(int u, int fa) { // getSize(u, fa); // int half = siz[u] >> 1; diff --git a/src/class185/Code03_AtmTree1.java b/src/class185/Code03_AtmTree1.java index 5c80c25de..ab07e1355 100644 --- a/src/class185/Code03_AtmTree1.java +++ b/src/class185/Code03_AtmTree1.java @@ -60,17 +60,6 @@ public static void dfs(int u, int fa, int dis) { } } - public static void getSize(int u, int fa) { - siz[u] = 1; - for (int e = head[u]; e > 0; e = nxt[e]) { - int v = to[e]; - if (v != fa && !vis[v]) { - getSize(v, u); - siz[u] += siz[v]; - } - } - } - public static int getLca(int a, int b) { if (dep[a] < dep[b]) { int tmp = a; @@ -98,6 +87,17 @@ public static int getDist(int x, int y) { return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); } + public static void getSize(int u, int fa) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + if (v != fa && !vis[v]) { + getSize(v, u); + siz[u] += siz[v]; + } + } + } + public static int getCentroid(int u, int fa) { getSize(u, fa); int half = siz[u] >> 1; diff --git a/src/class185/Code03_AtmTree2.java b/src/class185/Code03_AtmTree2.java index 82558e7b6..38e391a0d 100644 --- a/src/class185/Code03_AtmTree2.java +++ b/src/class185/Code03_AtmTree2.java @@ -58,17 +58,6 @@ // } //} // -//void getSize(int u, int fa) { -// siz[u] = 1; -// for (int e = head[u]; e; e = nxt[e]) { -// int v = to[e]; -// if (v != fa && !vis[v]) { -// getSize(v, u); -// siz[u] += siz[v]; -// } -// } -//} -// //int getLca(int a, int b) { // if (dep[a] < dep[b]) { // swap(a, b); @@ -94,6 +83,17 @@ // return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); //} // +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// //int getCentroid(int u, int fa) { // getSize(u, fa); // int half = siz[u] >> 1; diff --git a/src/class185/Code05_Fantasy1.java b/src/class185/Code05_Fantasy1.java index 5a0fed7d4..0652bae77 100644 --- a/src/class185/Code05_Fantasy1.java +++ b/src/class185/Code05_Fantasy1.java @@ -177,6 +177,21 @@ public static void dfs4(int cur, int tag) { } } + public static int getLca(int a, int b) { + while (top[a] != top[b]) { + if (dep[top[a]] <= dep[top[b]]) { + b = fa[top[b]]; + } else { + a = fa[top[a]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + public static int getDist(int x, int y) { + return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); + } + public static void getSize1(int u, int fa) { siz[u] = 1; for (int e = headg[u]; e > 0; e = nxtg[e]) { @@ -216,21 +231,6 @@ public static void getSize2(int cur, int fa) { } } - public static int getLca(int a, int b) { - while (top[a] != top[b]) { - if (dep[top[a]] <= dep[top[b]]) { - b = fa[top[b]]; - } else { - a = fa[top[a]]; - } - } - return dep[a] <= dep[b] ? a : b; - } - - public static int getDist(int x, int y) { - return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); - } - public static int getCentroid(int u, int fa) { // getSize1(u, fa); getSize2(u, fa); diff --git a/src/class185/Code05_Fantasy2.java b/src/class185/Code05_Fantasy2.java index 50fd77977..e7b4e8882 100644 --- a/src/class185/Code05_Fantasy2.java +++ b/src/class185/Code05_Fantasy2.java @@ -89,17 +89,6 @@ // } //} // -//void getSize(int u, int f) { -// siz[u] = 1; -// for (int e = headg[u]; e; e = nxtg[e]) { -// int v = tog[e]; -// if (v != f && !vis[v]) { -// getSize(v, u); -// siz[u] += siz[v]; -// } -// } -//} -// //int getLca(int a, int b) { // while (top[a] != top[b]) { // if (dep[top[a]] <= dep[top[b]]) { @@ -115,6 +104,17 @@ // return dist[x] + dist[y] - (dist[getLca(x, y)] << 1); //} // +//void getSize(int u, int f) { +// siz[u] = 1; +// for (int e = headg[u]; e; e = nxtg[e]) { +// int v = tog[e]; +// if (v != f && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// //int getCentroid(int u, int f) { // getSize(u, f); // int half = siz[u] >> 1; From 51eafebc355e5c3873b8acb4d06e927acb1f0910 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 15:49:30 +0800 Subject: [PATCH 1146/1170] modify code --- src/class185/Code05_Fantasy1.java | 98 +++++++-------- src/class185/Code05_Fantasy2.java | 70 +++++------ src/class185/Code06_ChengDu1.java | 197 ++++++++++++++++++++++++++++++ 3 files changed, 269 insertions(+), 96 deletions(-) diff --git a/src/class185/Code05_Fantasy1.java b/src/class185/Code05_Fantasy1.java index 0652bae77..1d7a999a1 100644 --- a/src/class185/Code05_Fantasy1.java +++ b/src/class185/Code05_Fantasy1.java @@ -14,18 +14,13 @@ public class Code05_Fantasy1 { public static int MAXN = 100001; public static int n, m; - public static int[] headg = new int[MAXN]; - public static int[] nxtg = new int[MAXN << 1]; - public static int[] tog = new int[MAXN << 1]; - public static int[] weightg = new int[MAXN << 1]; + public static int[] head = new int[MAXN]; + public static int[] nxt = new int[MAXN << 1]; + public static int[] to = new int[MAXN << 1]; + public static int[] weight = new int[MAXN << 1]; + public static int[] cent = new int[MAXN << 1]; public static int cntg; - public static int[] headc = new int[MAXN]; - public static int[] nxtc = new int[MAXN << 1]; - public static int[] toc = new int[MAXN << 1]; - public static int[] centc = new int[MAXN << 1]; - public static int cntc; - public static int[] fa = new int[MAXN]; public static int[] dep = new int[MAXN]; public static int[] siz = new int[MAXN]; @@ -63,18 +58,11 @@ public static void pop() { e = stack[stacksize][4]; } - public static void addEdgeG(int u, int v, int w) { - nxtg[++cntg] = headg[u]; - tog[cntg] = v; - weightg[cntg] = w; - headg[u] = cntg; - } - - public static void addEdgeC(int u, int v, int cen) { - nxtc[++cntc] = headc[u]; - toc[cntc] = v; - centc[cntc] = cen; - headc[u] = cntc; + public static void addEdge(int u, int v, int w) { + nxt[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; } public static void dfs1(int u, int f, int dis) { @@ -82,15 +70,15 @@ public static void dfs1(int u, int f, int dis) { dep[u] = dep[f] + 1; dist[u] = dis; siz[u] = 1; - for (int e = headg[u]; e > 0; e = nxtg[e]) { - int v = tog[e]; - int w = weightg[e]; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; + int w = weight[e]; if (v != f) { dfs1(v, u, dis + w); } } - for (int ei = headg[u], v; ei > 0; ei = nxtg[ei]) { - v = tog[ei]; + for (int ei = head[u], v; ei > 0; ei = nxt[ei]) { + v = to[ei]; if (v != f) { siz[u] += siz[v]; if (son[u] == 0 || siz[son[u]] < siz[v]) { @@ -106,8 +94,8 @@ public static void dfs2(int u, int t) { return; } dfs2(son[u], t); - for (int e = headg[u], v; e > 0; e = nxtg[e]) { - v = tog[e]; + for (int e = head[u], v; e > 0; e = nxt[e]) { + v = to[e]; if (v != fa[u] && v != son[u]) { dfs2(v, v); } @@ -124,20 +112,20 @@ public static void dfs3(int cur, int father, int distance) { dep[u] = dep[f] + 1; dist[u] = a; siz[u] = 1; - e = headg[u]; + e = head[u]; } else { - e = nxtg[e]; + e = nxt[e]; } if (e != 0) { push(u, f, a, 0, e); - int v = tog[e]; - int w = weightg[e]; + int v = to[e]; + int w = weight[e]; if (v != f) { push(v, u, a + w, 0, -1); } } else { - for (int ei = headg[u]; ei > 0; ei = nxtg[ei]) { - int v = tog[ei]; + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; if (v != f) { siz[u] += siz[v]; if (son[u] == 0 || siz[son[u]] < siz[v]) { @@ -163,13 +151,13 @@ public static void dfs4(int cur, int tag) { push(son[u], 0, 0, b, -1); continue; } else if (e == -2) { - e = headg[u]; + e = head[u]; } else { - e = nxtg[e]; + e = nxt[e]; } if (e != 0) { push(u, 0, 0, b, e); - int v = tog[e]; + int v = to[e]; if (v != fa[u] && v != son[u]) { push(v, 0, 0, v, -1); } @@ -194,8 +182,8 @@ public static int getDist(int x, int y) { public static void getSize1(int u, int fa) { siz[u] = 1; - for (int e = headg[u]; e > 0; e = nxtg[e]) { - int v = tog[e]; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; if (v != fa && !vis[v]) { getSize1(v, u); siz[u] += siz[v]; @@ -210,19 +198,19 @@ public static void getSize2(int cur, int fa) { pop(); if (e == -1) { siz[u] = 1; - e = headg[u]; + e = head[u]; } else { - e = nxtg[e]; + e = nxt[e]; } if (e != 0) { push(u, f, 0, 0, e); - int v = tog[e]; + int v = to[e]; if (v != f && !vis[v]) { push(v, u, 0, 0, -1); } } else { - for (int ei = headg[u]; ei > 0; ei = nxtg[ei]) { - int v = tog[ei]; + for (int ei = head[u]; ei > 0; ei = nxt[ei]) { + int v = to[ei]; if (v != f && !vis[v]) { siz[u] += siz[v]; } @@ -238,8 +226,8 @@ public static int getCentroid(int u, int fa) { boolean find = false; while (!find) { find = true; - for (int e = headg[u]; e > 0; e = nxtg[e]) { - int v = tog[e]; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; if (v != fa && !vis[v] && siz[v] > half) { fa = u; u = v; @@ -254,11 +242,11 @@ public static int getCentroid(int u, int fa) { public static void centroidTree(int u, int fa) { centfa[u] = fa; vis[u] = true; - for (int e = headg[u]; e > 0; e = nxtg[e]) { - int v = tog[e]; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; if (!vis[v]) { int nextCent = getCentroid(v, u); - addEdgeC(u, v, nextCent); + cent[e] = nextCent; centroidTree(nextCent, u); } } @@ -286,10 +274,10 @@ public static long query(int x) { public static long compute(int u) { long ans = query(u); - for (int e = headc[u]; e > 0; e = nxtc[e]) { - int v = toc[e]; + for (int e = head[u]; e > 0; e = nxt[e]) { + int v = to[e]; if (query(v) < ans) { - return compute(centc[e]); + return compute(cent[e]); } } return ans; @@ -304,8 +292,8 @@ public static void main(String[] args) throws Exception { u = in.nextInt(); v = in.nextInt(); w = in.nextInt(); - addEdgeG(u, v, w); - addEdgeG(v, u, w); + addEdge(u, v, w); + addEdge(v, u, w); } // dfs1(1, 0, 0); // dfs2(1, 1); diff --git a/src/class185/Code05_Fantasy2.java b/src/class185/Code05_Fantasy2.java index e7b4e8882..3f8e6757f 100644 --- a/src/class185/Code05_Fantasy2.java +++ b/src/class185/Code05_Fantasy2.java @@ -12,18 +12,13 @@ //const int MAXN = 100001; //int n, m; // -//int headg[MAXN]; -//int nxtg[MAXN << 1]; -//int tog[MAXN << 1]; -//int weightg[MAXN << 1]; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cent[MAXN << 1]; //int cntg; // -//int headc[MAXN]; -//int nxtc[MAXN << 1]; -//int toc[MAXN << 1]; -//int centc[MAXN << 1]; -//int cntc; -// //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -38,18 +33,11 @@ //long long xsum[MAXN]; //long long fsum[MAXN]; // -//void addEdgeG(int u, int v, int w) { -// nxtg[++cntg] = headg[u]; -// tog[cntg] = v; -// weightg[cntg] = w; -// headg[u] = cntg; -//} -// -//void addEdgeC(int u, int v, int cen) { -// nxtc[++cntc] = headc[u]; -// toc[cntc] = v; -// centc[cntc] = cen; -// headc[u] = cntc; +//void addEdge(int u, int v, int w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; //} // //void dfs1(int u, int f, int dis) { @@ -57,15 +45,15 @@ // dep[u] = dep[f] + 1; // dist[u] = dis; // siz[u] = 1; -// for (int e = headg[u]; e; e = nxtg[e]) { -// int v = tog[e]; -// int w = weightg[e]; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; +// int w = weight[e]; // if (v != f) { // dfs1(v, u, dis + w); // } // } -// for (int ei = headg[u], v; ei; ei = nxtg[ei]) { -// v = tog[ei]; +// for (int ei = head[u], v; ei; ei = nxt[ei]) { +// v = to[ei]; // if (v != f) { // siz[u] += siz[v]; // if (son[u] == 0 || siz[son[u]] < siz[v]) { @@ -81,8 +69,8 @@ // return; // } // dfs2(son[u], t); -// for (int e = headg[u], v; e; e = nxtg[e]) { -// v = tog[e]; +// for (int e = head[u], v; e; e = nxt[e]) { +// v = to[e]; // if (v != fa[u] && v != son[u]) { // dfs2(v, v); // } @@ -106,8 +94,8 @@ // //void getSize(int u, int f) { // siz[u] = 1; -// for (int e = headg[u]; e; e = nxtg[e]) { -// int v = tog[e]; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; // if (v != f && !vis[v]) { // getSize(v, u); // siz[u] += siz[v]; @@ -121,8 +109,8 @@ // bool find = false; // while (!find) { // find = true; -// for (int e = headg[u]; e; e = nxtg[e]) { -// int v = tog[e]; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; // if (v != f && !vis[v] && siz[v] > half) { // f = u; // u = v; @@ -137,11 +125,11 @@ //void centroidTree(int u, int f) { // centfa[u] = f; // vis[u] = true; -// for (int e = headg[u]; e; e = nxtg[e]) { -// int v = tog[e]; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; // if (!vis[v]) { // int nextCent = getCentroid(v, u); -// addEdgeC(u, v, nextCent); +// cent[e] = nextCent; // centroidTree(nextCent, u); // } // } @@ -169,10 +157,10 @@ // //long long compute(int u) { // long long ans = query(u); -// for (int e = headc[u]; e; e = nxtc[e]) { -// int v = toc[e]; +// for (int e = head[u]; e; e = nxt[e]) { +// int v = to[e]; // if (query(v) < ans) { -// return compute(centc[e]); +// return compute(cent[e]); // } // } // return ans; @@ -184,8 +172,8 @@ // cin >> n >> m; // for (int i = 1, u, v, w; i < n; i++) { // cin >> u >> v >> w; -// addEdgeG(u, v, w); -// addEdgeG(v, u, w); +// addEdge(u, v, w); +// addEdge(v, u, w); // } // dfs1(1, 0, 0); // dfs2(1, 1); diff --git a/src/class185/Code06_ChengDu1.java b/src/class185/Code06_ChengDu1.java index c0a53f38e..39ef564f2 100644 --- a/src/class185/Code06_ChengDu1.java +++ b/src/class185/Code06_ChengDu1.java @@ -3,6 +3,203 @@ // 成都七中,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5311 +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + public class Code06_ChengDu1 { + public static int MAXN = 100001; + public static int n, m; + public static int[] color = new int[MAXN]; + + public static int[] headg = new int[MAXN]; + public static int[] nxtg = new int[MAXN << 1]; + public static int[] tog = new int[MAXN << 1]; + public static int cntg; + + public static int[] headq = new int[MAXN]; + public static int[] nxtq = new int[MAXN << 1]; + public static int[] ql = new int[MAXN << 1]; + public static int[] qr = new int[MAXN << 1]; + public static int[] qid = new int[MAXN << 1]; + public static int cntq; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] siz = new int[MAXN]; + + public static int[] headc = new int[MAXN]; + public static int[] nxtc = new int[MAXN << 1]; + public static int[] toc = new int[MAXN << 1]; + public static int cntc; + + public static int[] tree = new int[MAXN]; + + public static int[] ans = new int[MAXN]; + + public static void addEdgeG(int u, int v) { + nxtg[++cntg] = headg[u]; + tog[cntg] = v; + headg[u] = cntg; + } + + public static void addQuery(int u, int l, int r, int id) { + nxtq[++cntq] = headq[u]; + ql[cntq] = l; + qr[cntq] = r; + qid[cntq] = id; + headq[u] = cntq; + } + + public static void addEdgeC(int u, int v) { + nxtc[++cntc] = headc[u]; + toc[cntc] = v; + headc[u] = cntc; + } + + public static int lowbit(int i) { + return i & -i; + } + + public static void add(int i, int v) { + if (i <= 0) { + return; + } + while (i <= n) { + tree[i] += v; + i += lowbit(i); + } + } + + public static int sum(int i) { + int ret = 0; + while (i > 0) { + ret += tree[i]; + i -= lowbit(i); + } + return ret; + } + + public static void getSize(int u, int fa) { + siz[u] = 1; + for (int e = headg[u]; e > 0; e = nxtg[e]) { + int v = tog[e]; + if (v != fa && !vis[v]) { + getSize(v, u); + siz[u] += siz[v]; + } + } + } + + public static int getCentroid(int u, int fa) { + getSize(u, fa); + int half = siz[u] >> 1; + boolean find = false; + while (!find) { + find = true; + for (int e = headg[u]; e > 0; e = nxtg[e]) { + int v = tog[e]; + if (v != fa && !vis[v] && siz[v] > half) { + fa = u; + u = v; + find = false; + break; + } + } + } + return u; + } + + public static void centroidTree(int u, int fa) { + vis[u] = true; + for (int e = headg[u]; e > 0; e = nxtg[e]) { + int v = tog[e]; + if (!vis[v]) { + int nextCent = getCentroid(v, u); + addEdgeC(u, nextCent); + centroidTree(getCentroid(v, u), u); + } + } + } + + public static void collect(int u) { + + } + + public static void compute(int u) { + vis[u] = true; + collect(u); + for (int e = headc[u]; e > 0; e = nxtc[e]) { + compute(toc[e]); + } + } + + public static void main(String[] args) throws Exception { + FastReader in = new FastReader(System.in); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + color[i] = in.nextInt(); + } + for (int i = 1, u, v; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdgeG(u, v); + addEdgeG(v, u); + } + for (int i = 1, l, r, x; i <= m; i++) { + l = in.nextInt(); + r = in.nextInt(); + x = in.nextInt(); + addQuery(x, l, r, i); + } + + for (int i = 1; i <= m; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + } + + // 读写工具类 + static class FastReader { + private final byte[] buffer = new byte[1 << 16]; + private int ptr = 0, len = 0; + private final InputStream in; + + FastReader(InputStream in) { + this.in = in; + } + + private int readByte() throws IOException { + if (ptr >= len) { + len = in.read(buffer); + ptr = 0; + if (len <= 0) + return -1; + } + return buffer[ptr++]; + } + + int nextInt() throws IOException { + int c; + do { + c = readByte(); + } while (c <= ' ' && c != -1); + boolean neg = false; + if (c == '-') { + neg = true; + c = readByte(); + } + int val = 0; + while (c > ' ' && c != -1) { + val = val * 10 + (c - '0'); + c = readByte(); + } + return neg ? -val : val; + } + } + } From e80217682a3335c4418a11e822a5a34e81dcc2d1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 4 Dec 2025 17:40:09 +0800 Subject: [PATCH 1147/1170] modify code --- src/class185/Code06_ChengDu1.java | 209 +++++++++++++++++++++++++----- src/class185/Code06_ChengDu2.java | 194 +++++++++++++++++++++++++++ 2 files changed, 370 insertions(+), 33 deletions(-) create mode 100644 src/class185/Code06_ChengDu2.java diff --git a/src/class185/Code06_ChengDu1.java b/src/class185/Code06_ChengDu1.java index 39ef564f2..0f189f887 100644 --- a/src/class185/Code06_ChengDu1.java +++ b/src/class185/Code06_ChengDu1.java @@ -2,6 +2,7 @@ // 成都七中,java版 // 测试链接 : https://www.luogu.com.cn/problem/P5311 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.io.InputStream; @@ -20,25 +21,55 @@ public class Code06_ChengDu1 { public static int cntg; public static int[] headq = new int[MAXN]; - public static int[] nxtq = new int[MAXN << 1]; - public static int[] ql = new int[MAXN << 1]; - public static int[] qr = new int[MAXN << 1]; - public static int[] qid = new int[MAXN << 1]; + public static int[] nxtq = new int[MAXN]; + public static int[] ql = new int[MAXN]; + public static int[] qr = new int[MAXN]; + public static int[] qid = new int[MAXN]; public static int cntq; public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] headc = new int[MAXN]; - public static int[] nxtc = new int[MAXN << 1]; - public static int[] toc = new int[MAXN << 1]; - public static int cntc; - public static int[] tree = new int[MAXN]; + public static int[] xl = new int[MAXN]; + public static int[] xr = new int[MAXN]; + public static int[] xid = new int[MAXN]; + public static int cntx; + + public static int[] yl = new int[MAXN]; + public static int[] yr = new int[MAXN]; + public static int[] yid = new int[MAXN]; + public static int cnty; + + public static int[] pos = new int[MAXN]; + public static int[] ans = new int[MAXN]; - public static void addEdgeG(int u, int v) { + // 讲解118,递归函数改成迭代所需要的栈 + public static int[][] stack = new int[MAXN][5]; + public static int u, f, nl, nr, e; + public static int stacksize; + + public static void push(int u, int f, int nl, int nr, int e) { + stack[stacksize][0] = u; + stack[stacksize][1] = f; + stack[stacksize][2] = nl; + stack[stacksize][3] = nr; + stack[stacksize][4] = e; + stacksize++; + } + + public static void pop() { + --stacksize; + u = stack[stacksize][0]; + f = stack[stacksize][1]; + nl = stack[stacksize][2]; + nr = stack[stacksize][3]; + e = stack[stacksize][4]; + } + + public static void addEdge(int u, int v) { nxtg[++cntg] = headg[u]; tog[cntg] = v; headg[u] = cntg; @@ -52,12 +83,6 @@ public static void addQuery(int u, int l, int r, int id) { headq[u] = cntq; } - public static void addEdgeC(int u, int v) { - nxtc[++cntc] = headc[u]; - toc[cntc] = v; - headc[u] = cntc; - } - public static int lowbit(int i) { return i & -i; } @@ -81,19 +106,54 @@ public static int sum(int i) { return ret; } - public static void getSize(int u, int fa) { + public static int query(int l, int r) { + return sum(r) - sum(l - 1); + } + + // 找重心需要计算子树大小的递归版,java会爆栈,C++不会 + public static void getSize1(int u, int fa) { siz[u] = 1; for (int e = headg[u]; e > 0; e = nxtg[e]) { int v = tog[e]; if (v != fa && !vis[v]) { - getSize(v, u); + getSize1(v, u); siz[u] += siz[v]; } } } + // getSize1的迭代版 + public static void getSize2(int cur, int fa) { + stacksize = 0; + push(cur, fa, 0, 0, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + siz[u] = 1; + e = headg[u]; + } else { + e = nxtg[e]; + } + if (e != 0) { + push(u, f, 0, 0, e); + int v = tog[e]; + if (v != f && !vis[v]) { + push(v, u, 0, 0, -1); + } + } else { + for (int ei = headg[u]; ei > 0; ei = nxtg[ei]) { + int v = tog[ei]; + if (v != f && !vis[v]) { + siz[u] += siz[v]; + } + } + } + } + } + public static int getCentroid(int u, int fa) { - getSize(u, fa); + // getSize1(u, fa); + getSize2(u, fa); int half = siz[u] >> 1; boolean find = false; while (!find) { @@ -111,27 +171,110 @@ public static int getCentroid(int u, int fa) { return u; } - public static void centroidTree(int u, int fa) { - vis[u] = true; + public static void dfs1(int u, int fa, int nl, int nr) { + xl[++cntx] = nl; + xr[cntx] = nr; + xid[cntx] = color[u]; + for (int e = headq[u]; e > 0; e = nxtq[e]) { + int qui = qid[e]; + int qul = ql[e]; + int qur = qr[e]; + if (qul <= nl && nr <= qur) { + yl[++cnty] = qul; + yr[cnty] = qur; + yid[cnty] = qui; + } + } for (int e = headg[u]; e > 0; e = nxtg[e]) { int v = tog[e]; - if (!vis[v]) { - int nextCent = getCentroid(v, u); - addEdgeC(u, nextCent); - centroidTree(getCentroid(v, u), u); + if (v != fa && !vis[v]) { + dfs1(v, u, Math.min(v, nl), Math.max(v, nr)); } } } - public static void collect(int u) { + // dfs1的迭代版 + public static void dfs2(int cur, int fa, int nodel, int noder) { + stacksize = 0; + push(cur, fa, nodel, noder, -1); + while (stacksize > 0) { + pop(); + if (e == -1) { + xl[++cntx] = nl; + xr[cntx] = nr; + xid[cntx] = color[u]; + for (int e = headq[u]; e > 0; e = nxtq[e]) { + int qui = qid[e]; + int qul = ql[e]; + int qur = qr[e]; + if (qul <= nl && nr <= qur) { + yl[++cnty] = qul; + yr[cnty] = qur; + yid[cnty] = qui; + } + } + e = headg[u]; + } else { + e = nxtg[e]; + } + if (e != 0) { + push(u, f, nl, nr, e); + int v = tog[e]; + if (v != f && !vis[v]) { + push(v, u, Math.min(v, nl), Math.max(v, nr), -1); + } + } + } + } + public static void sort(int[] al, int[] ar, int[] ai, int l, int r) { + if (l >= r) return; + int i = l, j = r, pivot = ar[(l + r) >> 1], tmp; + while (i <= j) { + while (ar[i] < pivot) i++; + while (ar[j] > pivot) j--; + if (i <= j) { + tmp = al[i]; al[i] = al[j]; al[j] = tmp; + tmp = ar[i]; ar[i] = ar[j]; ar[j] = tmp; + tmp = ai[i]; ai[i] = ai[j]; ai[j] = tmp; + i++; j--; + } + } + sort(al, ar, ai, l, j); + sort(al, ar, ai, i, r); } - public static void compute(int u) { + public static void calc(int u) { + cntx = cnty = 0; + // dfs1(u, 0, u, u); + dfs2(u, 0, u, u); + sort(xl, xr, xid, 1, cntx); + sort(yl, yr, yid, 1, cnty); + for (int i = 1, j = 1; i <= cnty; i++) { + while (j <= cntx && xr[j] <= yr[i]) { + if (xl[j] > pos[xid[j]]) { + add(pos[xid[j]], -1); + pos[xid[j]] = xl[j]; + add(pos[xid[j]], 1); + } + j++; + } + ans[yid[i]] = Math.max(ans[yid[i]], query(yl[i], n)); + } + for (int i = 1; i <= cntx; i++) { + add(pos[xid[i]], -1); + pos[xid[i]] = 0; + } + } + + public static void solve(int u) { vis[u] = true; - collect(u); - for (int e = headc[u]; e > 0; e = nxtc[e]) { - compute(toc[e]); + calc(u); + for (int e = headg[u]; e > 0; e = nxtg[e]) { + int v = tog[e]; + if (!vis[v]) { + solve(getCentroid(v, u)); + } } } @@ -146,8 +289,8 @@ public static void main(String[] args) throws Exception { for (int i = 1, u, v; i < n; i++) { u = in.nextInt(); v = in.nextInt(); - addEdgeG(u, v); - addEdgeG(v, u); + addEdge(u, v); + addEdge(v, u); } for (int i = 1, l, r, x; i <= m; i++) { l = in.nextInt(); @@ -155,7 +298,7 @@ public static void main(String[] args) throws Exception { x = in.nextInt(); addQuery(x, l, r, i); } - + solve(getCentroid(1, 0)); for (int i = 1; i <= m; i++) { out.println(ans[i]); } diff --git a/src/class185/Code06_ChengDu2.java b/src/class185/Code06_ChengDu2.java new file mode 100644 index 000000000..7487c40e2 --- /dev/null +++ b/src/class185/Code06_ChengDu2.java @@ -0,0 +1,194 @@ +package class185; + +// 成都七中,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5311 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Node { +// int l, r, id; +//}; +// +//bool NodeCmp(Node x, Node y) { +// return x.r < y.r; +//} +// +//const int MAXN = 100001; +//int n, m; +//int color[MAXN]; +// +//int headg[MAXN]; +//int nxtg[MAXN << 1]; +//int tog[MAXN << 1]; +//int cntg; +// +//int headq[MAXN]; +//int nxtq[MAXN]; +//int ql[MAXN]; +//int qr[MAXN]; +//int qid[MAXN]; +//int cntq; +// +//bool vis[MAXN]; +//int siz[MAXN]; +// +//int tree[MAXN]; +// +//Node arrx[MAXN]; +//int cntx; +// +//Node arry[MAXN]; +//int cnty; +// +//int pos[MAXN]; +// +//int ans[MAXN]; +// +//void addEdge(int u, int v) { +// nxtg[++cntg] = headg[u]; +// tog[cntg] = v; +// headg[u] = cntg; +//} +// +//void addQuery(int u, int l, int r, int id) { +// nxtq[++cntq] = headq[u]; +// ql[cntq] = l; +// qr[cntq] = r; +// qid[cntq] = id; +// headq[u] = cntq; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void add(int i, int v) { +// if (i <= 0) { +// return; +// } +// while (i <= n) { +// tree[i] += v; +// i += lowbit(i); +// } +//} +// +//int sum(int i) { +// int ret = 0; +// while (i > 0) { +// ret += tree[i]; +// i -= lowbit(i); +// } +// return ret; +//} +// +//int query(int l, int r) { +// return sum(r) - sum(l - 1); +//} +// +//void getSize(int u, int fa) { +// siz[u] = 1; +// for (int e = headg[u]; e > 0; e = nxtg[e]) { +// int v = tog[e]; +// if (v != fa && !vis[v]) { +// getSize(v, u); +// siz[u] += siz[v]; +// } +// } +//} +// +//int getCentroid(int u, int fa) { +// getSize(u, fa); +// int half = siz[u] >> 1; +// bool find = false; +// while (!find) { +// find = true; +// for (int e = headg[u]; e > 0; e = nxtg[e]) { +// int v = tog[e]; +// if (v != fa && !vis[v] && siz[v] > half) { +// fa = u; +// u = v; +// find = false; +// break; +// } +// } +// } +// return u; +//} +// +//void dfs(int u, int fa, int nl, int nr) { +// arrx[++cntx] = { nl, nr, color[u] }; +// for (int e = headq[u]; e > 0; e = nxtq[e]) { +// int qui = qid[e]; +// int qul = ql[e]; +// int qur = qr[e]; +// if (qul <= nl && nr <= qur) { +// arry[++cnty] = { qul, qur, qui }; +// } +// } +// for (int e = headg[u]; e > 0; e = nxtg[e]) { +// int v = tog[e]; +// if (v != fa && !vis[v]) { +// dfs(v, u, min(v, nl), max(v, nr)); +// } +// } +//} +// +//void calc(int u) { +// cntx = cnty = 0; +// dfs(u, 0, u, u); +// sort(arrx + 1, arrx + cntx + 1, NodeCmp); +// sort(arry + 1, arry + cnty + 1, NodeCmp); +// for (int i = 1, j = 1; i <= cnty; i++) { +// while (j <= cntx && arrx[j].r <= arry[i].r) { +// if (arrx[j].l > pos[arrx[j].id]) { +// add(pos[arrx[j].id], -1); +// pos[arrx[j].id] = arrx[j].l; +// add(pos[arrx[j].id], 1); +// } +// j++; +// } +// ans[arry[i].id] = max(ans[arry[i].id], query(arry[i].l, n)); +// } +// for (int i = 1; i <= cntx; i++) { +// add(pos[arrx[i].id], -1); +// pos[arrx[i].id] = 0; +// } +//} +// +//void solve(int u) { +// vis[u] = true; +// calc(u); +// for (int e = headg[u]; e > 0; e = nxtg[e]) { +// int v = tog[e]; +// if (!vis[v]) { +// solve(getCentroid(v, u)); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> color[i]; +// } +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// for (int i = 1, l, r, x; i <= m; i++) { +// cin >> l >> r >> x; +// addQuery(x, l, r, i); +// } +// solve(getCentroid(1, 0)); +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << '\n'; +// } +// return 0; +//} \ No newline at end of file From 6c4488d52889a7df46ee206c7596929daa97ce0c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 5 Dec 2025 10:32:30 +0800 Subject: [PATCH 1148/1170] modify code --- src/class185/Code01_Wave1.java | 7 +++++++ src/class185/Code01_Wave2.java | 7 +++++++ src/class185/Code02_Game1.java | 6 ++++++ src/class185/Code02_Game2.java | 6 ++++++ src/class185/Code06_ChengDu1.java | 3 +-- src/class185/Code06_ChengDu2.java | 3 +-- 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/class185/Code01_Wave1.java b/src/class185/Code01_Wave1.java index d74e47ede..881b25511 100644 --- a/src/class185/Code01_Wave1.java +++ b/src/class185/Code01_Wave1.java @@ -1,6 +1,13 @@ package class185; // 震波,java版 +// 树上有n个点,每个点有点权,给定n-1条边,边权都是1 +// 接下来有m条操作,每条操作是如下两种类型中的一种 +// 操作 0 x y : 点x出发,距离<=y的所有点,打印点权累加和 +// 操作 1 x y : 点x的点权变成y +// 1 <= n、m <= 10^5 +// 1 <= 点权 <= 10^4 +// 本题要求强制在线,得到操作参数的规则,打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P6329 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class185/Code01_Wave2.java b/src/class185/Code01_Wave2.java index d144fa5a0..c02b80cfc 100644 --- a/src/class185/Code01_Wave2.java +++ b/src/class185/Code01_Wave2.java @@ -1,6 +1,13 @@ package class185; // 震波,C++版 +// 树上有n个点,每个点有点权,给定n-1条边,边权都是1 +// 接下来有m条操作,每条操作是如下两种类型中的一种 +// 操作 0 x y : 点x出发,距离<=y的所有点,打印点权累加和 +// 操作 1 x y : 点x的点权变成y +// 1 <= n、m <= 10^5 +// 1 <= 点权 <= 10^4 +// 本题要求强制在线,得到操作参数的规则,打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P6329 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class185/Code02_Game1.java b/src/class185/Code02_Game1.java index 6c7b9bd90..ec12973e0 100644 --- a/src/class185/Code02_Game1.java +++ b/src/class185/Code02_Game1.java @@ -1,6 +1,12 @@ package class185; // 烁烁的游戏,java版 +// 树上有n个点,每个点的初始点权是0,给定n-1条边,边权都是1 +// 接下来有m条操作,每条操作是如下两种类型中的一种 +// 操作 M x k v : 点x出发,距离<=k的所有点,点权都加上v +// 操作 Q x : 打印点x的点权 +// 1 <= n、m <= 10^5 +// -10000 <= v <= +10000 // 测试链接 : https://www.luogu.com.cn/problem/P10603 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class185/Code02_Game2.java b/src/class185/Code02_Game2.java index dabbe13c5..d6d96d111 100644 --- a/src/class185/Code02_Game2.java +++ b/src/class185/Code02_Game2.java @@ -1,6 +1,12 @@ package class185; // 烁烁的游戏,C++版 +// 树上有n个点,每个点的初始点权是0,给定n-1条边,边权都是1 +// 接下来有m条操作,每条操作是如下两种类型中的一种 +// 操作 M x k v : 点x出发,距离<=k的所有点,点权都加上v +// 操作 Q x : 打印点x的点权 +// 1 <= n、m <= 10^5 +// -10000 <= v <= +10000 // 测试链接 : https://www.luogu.com.cn/problem/P10603 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class185/Code06_ChengDu1.java b/src/class185/Code06_ChengDu1.java index 0f189f887..e1a979bb7 100644 --- a/src/class185/Code06_ChengDu1.java +++ b/src/class185/Code06_ChengDu1.java @@ -30,8 +30,6 @@ public class Code06_ChengDu1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] tree = new int[MAXN]; - public static int[] xl = new int[MAXN]; public static int[] xr = new int[MAXN]; public static int[] xid = new int[MAXN]; @@ -43,6 +41,7 @@ public class Code06_ChengDu1 { public static int cnty; public static int[] pos = new int[MAXN]; + public static int[] tree = new int[MAXN]; public static int[] ans = new int[MAXN]; diff --git a/src/class185/Code06_ChengDu2.java b/src/class185/Code06_ChengDu2.java index 7487c40e2..5f4781782 100644 --- a/src/class185/Code06_ChengDu2.java +++ b/src/class185/Code06_ChengDu2.java @@ -36,8 +36,6 @@ //bool vis[MAXN]; //int siz[MAXN]; // -//int tree[MAXN]; -// //Node arrx[MAXN]; //int cntx; // @@ -45,6 +43,7 @@ //int cnty; // //int pos[MAXN]; +//int tree[MAXN]; // //int ans[MAXN]; // From a01c9a7bb98fabc00ca899d6d745ba61df7644eb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 5 Dec 2025 10:52:33 +0800 Subject: [PATCH 1149/1170] modify code --- src/class185/Code03_AtmTree1.java | 7 +++++++ src/class185/Code03_AtmTree2.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/class185/Code03_AtmTree1.java b/src/class185/Code03_AtmTree1.java index ab07e1355..b53efc829 100644 --- a/src/class185/Code03_AtmTree1.java +++ b/src/class185/Code03_AtmTree1.java @@ -1,6 +1,13 @@ package class185; // Atm的树,java版 +// 树上有n个点,给定n-1条边,每条边有边权 +// 现在关心,从节点x出发到达其他点的距离中,第k小的距离 +// 注意,节点x到自己的距离0,不参与距离评比 +// 给定正数k,打印每个节点的第k小距离 +// 1 <= n <= 15000 +// 1 <= k <= 5000 +// 1 <= 边权 <= 10 // 测试链接 : https://www.luogu.com.cn/problem/P10604 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class185/Code03_AtmTree2.java b/src/class185/Code03_AtmTree2.java index 38e391a0d..9e6abf341 100644 --- a/src/class185/Code03_AtmTree2.java +++ b/src/class185/Code03_AtmTree2.java @@ -1,6 +1,13 @@ package class185; // Atm的树,C++版 +// 树上有n个点,给定n-1条边,每条边有边权 +// 现在关心,从节点x出发到达其他点的距离中,第k小的距离 +// 注意,节点x到自己的距离0,不参与距离评比 +// 给定正数k,打印每个节点的第k小距离 +// 1 <= n <= 15000 +// 1 <= k <= 5000 +// 1 <= 边权 <= 10 // 测试链接 : https://www.luogu.com.cn/problem/P10604 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 94f7eef887f58880114cb665371cd0fe2abeb685 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 5 Dec 2025 11:44:49 +0800 Subject: [PATCH 1150/1170] modify code --- src/class185/Code04_OpenStore1.java | 17 +++++++++++------ src/class185/Code04_OpenStore2.java | 14 +++++++++----- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java index 7466ec5e6..dd9aa3d2a 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code04_OpenStore1.java @@ -1,6 +1,11 @@ package class185; // 开店,java版 +// 树上有n个人,每个人有年龄,给定n-1条路,每条路有距离 +// 一共有m次查询,格式 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 +// 1 <= n <= 1.5 * 10^5 1 <= m <= 2 * 10^5 +// 0 <= 人的年龄 <= 10^9 1 <= 路的距离 <= 1000 +// 本题要求强制在线,得到操作参数的规则,打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3241 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -379,12 +384,12 @@ public static void main(String[] args) throws Exception { for (int i = 1; i <= n; i++) { age[i] = in.nextInt(); } - for (int i = 1; i < n; i++) { - int a = in.nextInt(); - int b = in.nextInt(); - int c = in.nextInt(); - addEdge(a, b, c); - addEdge(b, a, c); + for (int i = 1, u, v, w; i < n; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); + addEdge(u, v, w); + addEdge(v, u, w); } // dfs1(1, 0, 0); // dfs2(1, 1); diff --git a/src/class185/Code04_OpenStore2.java b/src/class185/Code04_OpenStore2.java index e5a5156df..b9832460f 100644 --- a/src/class185/Code04_OpenStore2.java +++ b/src/class185/Code04_OpenStore2.java @@ -1,6 +1,11 @@ package class185; // 开店,C++版 +// 树上有n个人,每个人有年龄,给定n-1条路,每条路有距离 +// 一共有m次查询,格式 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 +// 1 <= n <= 1.5 * 10^5 1 <= m <= 2 * 10^5 +// 0 <= 人的年龄 <= 10^9 1 <= 路的距离 <= 1000 +// 本题要求强制在线,得到操作参数的规则,打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3241 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -220,11 +225,10 @@ // for (int i = 1; i <= n; i++) { // cin >> age[i]; // } -// for (int i = 1; i < n; i++) { -// int a, b, c; -// cin >> a >> b >> c; -// addEdge(a, b, c); -// addEdge(b, a, c); +// for (int i = 1, u, v, w; i < n; i++) { +// cin >> u >> v >> w; +// addEdge(u, v, w); +// addEdge(v, u, w); // } // dfs1(1, 0, 0); // dfs2(1, 1); From bd273ab01c3f234ed1c6d4067a8f5b29203b88bd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 5 Dec 2025 12:02:37 +0800 Subject: [PATCH 1151/1170] modify code --- src/class185/Code05_Fantasy1.java | 8 ++++++++ src/class185/Code05_Fantasy2.java | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/class185/Code05_Fantasy1.java b/src/class185/Code05_Fantasy1.java index 1d7a999a1..c94611e70 100644 --- a/src/class185/Code05_Fantasy1.java +++ b/src/class185/Code05_Fantasy1.java @@ -1,6 +1,14 @@ package class185; // 幻想乡战略游戏,java版 +// 树上有n个点,每个点的初始点权是0,给定n-1条边,每条边有边权 +// 如果点x是指挥点,它指挥点y的成本 = x到y的简单路径权值和 * y的点权 +// 树上存在某个最佳的指挥点,指挥所有点的总成本最小,叫做最小指挥总成本 +// 一共m条操作,格式 x v : 先把x的点权增加v,然后打印此时的最小指挥总成本 +// 注意参数v有可能是负数,但题目保证任何时候,点权不会出现负数 +// 1 <= n、m <= 10^5 +// 1 <= 边权 <= 1000 +// -1000 <= v <= +1000 // 测试链接 : https://www.luogu.com.cn/problem/P3345 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class185/Code05_Fantasy2.java b/src/class185/Code05_Fantasy2.java index 3f8e6757f..c14342653 100644 --- a/src/class185/Code05_Fantasy2.java +++ b/src/class185/Code05_Fantasy2.java @@ -1,6 +1,14 @@ package class185; // 幻想乡战略游戏,C++版 +// 树上有n个点,每个点的初始点权是0,给定n-1条边,每条边有边权 +// 如果点x是指挥点,它指挥点y的成本 = x到y的简单路径权值和 * y的点权 +// 树上存在某个最佳的指挥点,指挥所有点的总成本最小,叫做最小指挥总成本 +// 一共m条操作,格式 x v : 先把x的点权增加v,然后打印此时的最小指挥总成本 +// 注意参数v有可能是负数,但题目保证任何时候,点权不会出现负数 +// 1 <= n、m <= 10^5 +// 1 <= 边权 <= 1000 +// -1000 <= v <= +1000 // 测试链接 : https://www.luogu.com.cn/problem/P3345 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 88bb1ef32fd9ed3aab56313aaea7e08b718f7f38 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 5 Dec 2025 12:13:42 +0800 Subject: [PATCH 1152/1170] modify code --- src/class185/Code06_ChengDu1.java | 4 ++++ src/class185/Code06_ChengDu2.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/class185/Code06_ChengDu1.java b/src/class185/Code06_ChengDu1.java index e1a979bb7..ab94b9f34 100644 --- a/src/class185/Code06_ChengDu1.java +++ b/src/class185/Code06_ChengDu1.java @@ -1,6 +1,10 @@ package class185; // 成都七中,java版 +// 树上有n个点,每个点给定颜色,给定n-1条边 +// 一共m条查询,查询之间不会相互影响,格式如下 +// 查询 l r x : 只保留编号在[l, r]的节点,打印点x所在连通块的颜色数量 +// 1 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5311 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class185/Code06_ChengDu2.java b/src/class185/Code06_ChengDu2.java index 5f4781782..74e318755 100644 --- a/src/class185/Code06_ChengDu2.java +++ b/src/class185/Code06_ChengDu2.java @@ -1,6 +1,10 @@ package class185; // 成都七中,C++版 +// 树上有n个点,每个点给定颜色,给定n-1条边 +// 一共m条查询,查询之间不会相互影响,格式如下 +// 查询 l r x : 只保留编号在[l, r]的节点,打印点x所在连通块的颜色数量 +// 1 <= 所有数据 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P5311 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 398b2e4bf617833a4700985872b76ff323049d1b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 5 Dec 2025 12:36:07 +0800 Subject: [PATCH 1153/1170] modify code --- src/class185/Code07_HideSeek1.java | 28 +++++++++++++++-------- src/class185/Code07_HideSeek2.java | 36 +++++++++++++++++++----------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/class185/Code07_HideSeek1.java b/src/class185/Code07_HideSeek1.java index 5ef5841c2..a568c0d9c 100644 --- a/src/class185/Code07_HideSeek1.java +++ b/src/class185/Code07_HideSeek1.java @@ -1,6 +1,13 @@ package class185; // 捉迷藏,正解是树的括号序,java版 +// 树上有n个点,点的初始颜色为黑,给定n-1条边,边权都是1 +// 一共有m条操作,每条操作是如下两种类型中的一种 +// 操作 C x : 改变点x的颜色,黑变成白,白变成黑 +// 操作 G : 打印树上最远的两个黑色点的距离 +// 如果只有一个黑点打印0,如果无黑点打印-1 +// 1 <= n <= 10^5 +// 1 <= m <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2056 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -18,8 +25,8 @@ public class Code07_HideSeek1 { public static int PAR = -1; public static int PAL = -2; public static int n, m; + public static boolean[] black = new boolean[MAXN]; - public static boolean[] light = new boolean[MAXN]; public static int[] head = new int[MAXN]; public static int[] nxt = new int[MAXN << 1]; public static int[] to = new int[MAXN << 1]; @@ -118,7 +125,7 @@ public static void setSingle(int i, int v) { pr[i] = 1; } else if (v == PAL) { pl[i] = 1; - } else if (!light[v]) { + } else if (black[v]) { ladd[i] = lminus[i] = radd[i] = rminus[i] = 0; } } @@ -168,6 +175,9 @@ public static void main(String[] args) throws Exception { FastReader in = new FastReader(); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); + for (int i = 1; i <= n; i++) { + black[i] = true; + } for (int i = 1, u, v; i < n; i++) { u = in.nextInt(); v = in.nextInt(); @@ -178,22 +188,22 @@ public static void main(String[] args) throws Exception { dfs2(1, 0); build(1, cntd, 1); m = in.nextInt(); - int offCnt = n; + int blackCnt = n; char op; for (int i = 1, x; i <= m; i++) { op = in.nextChar(); if (op == 'C') { x = in.nextInt(); - light[x] = !light[x]; - if (!light[x]) { - offCnt++; + black[x] = !black[x]; + if (black[x]) { + blackCnt++; } else { - offCnt--; + blackCnt--; } update(dfn[x], 1, cntd, 1); } else { - if (offCnt <= 1) { - out.println(offCnt - 1); + if (blackCnt <= 1) { + out.println(blackCnt - 1); } else { out.println(dist[1]); } diff --git a/src/class185/Code07_HideSeek2.java b/src/class185/Code07_HideSeek2.java index 7d66c7634..5c622a795 100644 --- a/src/class185/Code07_HideSeek2.java +++ b/src/class185/Code07_HideSeek2.java @@ -1,6 +1,13 @@ package class185; // 捉迷藏,正解是树的括号序,C++版 +// 树上有n个点,点的初始颜色为黑,给定n-1条边,边权都是1 +// 一共有m条操作,每条操作是如下两种类型中的一种 +// 操作 C x : 改变点x的颜色,黑变成白,白变成黑 +// 操作 G : 打印树上最远的两个黑色点的距离 +// 如果只有一个黑点打印0,如果无黑点打印-1 +// 1 <= n <= 10^5 +// 1 <= m <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2056 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -16,7 +23,7 @@ //const int PAR = -1; //const int PAL = -2; //int n, m; -//bool light[MAXN]; +//bool black[MAXN]; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -33,7 +40,7 @@ //int lminus[MAXT]; //int radd[MAXT]; //int rminus[MAXT]; -//int distv[MAXT]; +//int dist[MAXT]; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; @@ -57,12 +64,12 @@ //void setSingle(int i, int v) { // pr[i] = pl[i] = 0; // ladd[i] = lminus[i] = radd[i] = rminus[i] = -INF; -// distv[i] = -INF; +// dist[i] = -INF; // if (v == PAR) { // pr[i] = 1; // } else if (v == PAL) { // pl[i] = 1; -// } else if (!light[v]) { +// } else if (black[v]) { // ladd[i] = lminus[i] = radd[i] = rminus[i] = 0; // } //} @@ -81,7 +88,7 @@ // lminus[i] = max(lminus[l], pl[l] - pr[l] + lminus[r]); // radd[i] = max(radd[r], max(radd[l] - pr[r] + pl[r], rminus[l] + pr[r] + pl[r])); // rminus[i] = max(rminus[r], rminus[l] + pr[r] - pl[r]); -// distv[i] = max(max(distv[l], distv[r]), max(radd[l] + lminus[r], ladd[r] + rminus[l])); +// dist[i] = max(max(dist[l], dist[r]), max(radd[l] + lminus[r], ladd[r] + rminus[l])); //} // //void build(int l, int r, int i) { @@ -113,6 +120,9 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n; +// for (int i = 1; i <= n; i++) { +// black[i] = true; +// } // for (int i = 1, u, v; i < n; i++) { // cin >> u >> v; // addEdge(u, v); @@ -121,24 +131,24 @@ // dfs(1, 0); // build(1, cntd, 1); // cin >> m; -// int offCnt = n; +// int blackCnt = n; // char op; // for (int i = 1, x; i <= m; i++) { // cin >> op; // if (op == 'C') { // cin >> x; -// light[x] = !light[x]; -// if (!light[x]) { -// offCnt++; +// black[x] = !black[x]; +// if (black[x]) { +// blackCnt++; // } else { -// offCnt--; +// blackCnt--; // } // update(dfn[x], 1, cntd, 1); // } else { -// if (offCnt <= 1) { -// cout << (offCnt - 1) << '\n'; +// if (blackCnt <= 1) { +// cout << (blackCnt - 1) << '\n'; // } else { -// cout << distv[1] << '\n'; +// cout << dist[1] << '\n'; // } // } // } From f44f5d7bd9e97e958347c60d06c539e47038f685 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 5 Dec 2025 16:14:35 +0800 Subject: [PATCH 1154/1170] modify code --- src/class185/Code04_OpenStore1.java | 9 ++++++--- src/class185/Code04_OpenStore2.java | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code04_OpenStore1.java index dd9aa3d2a..186726855 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code04_OpenStore1.java @@ -2,9 +2,12 @@ // 开店,java版 // 树上有n个人,每个人有年龄,给定n-1条路,每条路有距离 -// 一共有m次查询,格式 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 -// 1 <= n <= 1.5 * 10^5 1 <= m <= 2 * 10^5 -// 0 <= 人的年龄 <= 10^9 1 <= 路的距离 <= 1000 +// 一共有m次查询,格式如下 +// 查询 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 +// 1 <= n <= 1.5 * 10^5 +// 1 <= m <= 2 * 10^5 +// 0 <= 人的年龄 <= 10^9 +// 1 <= 路的距离 <= 1000 // 本题要求强制在线,得到操作参数的规则,打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3241 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class185/Code04_OpenStore2.java b/src/class185/Code04_OpenStore2.java index b9832460f..733399db6 100644 --- a/src/class185/Code04_OpenStore2.java +++ b/src/class185/Code04_OpenStore2.java @@ -2,9 +2,12 @@ // 开店,C++版 // 树上有n个人,每个人有年龄,给定n-1条路,每条路有距离 -// 一共有m次查询,格式 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 -// 1 <= n <= 1.5 * 10^5 1 <= m <= 2 * 10^5 -// 0 <= 人的年龄 <= 10^9 1 <= 路的距离 <= 1000 +// 一共有m次查询,格式如下 +// 查询 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 +// 1 <= n <= 1.5 * 10^5 +// 1 <= m <= 2 * 10^5 +// 0 <= 人的年龄 <= 10^9 +// 1 <= 路的距离 <= 1000 // 本题要求强制在线,得到操作参数的规则,打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3241 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From dffa4cf53bbabf2e9110bec7fa02af396e703da7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 6 Dec 2025 11:42:17 +0800 Subject: [PATCH 1155/1170] modify code --- src/class185/Code01_Wave1.java | 29 ++++++++++------------------- src/class185/Code01_Wave2.java | 29 ++++++++++------------------- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/src/class185/Code01_Wave1.java b/src/class185/Code01_Wave1.java index 881b25511..5c6a9a117 100644 --- a/src/class185/Code01_Wave1.java +++ b/src/class185/Code01_Wave1.java @@ -296,31 +296,22 @@ public static int query(int jobl, int jobr, int l, int r, int i) { } public static void add(int x, int v) { - int cur = x, pre = 0, dist; - while (cur > 0) { - dist = getDist(cur, x); - addTree[cur] = add(dist, v, 0, n - 1, addTree[cur]); - if (pre > 0) { - minusTree[pre] = add(dist, v, 0, n - 1, minusTree[pre]); - } - pre = cur; - cur = centfa[cur]; + addTree[x] = add(0, v, 0, n - 1, addTree[x]); + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + int dist = getDist(x, fa); + addTree[fa] = add(dist, v, 0, n - 1, addTree[fa]); + minusTree[cur] = add(dist, v, 0, n - 1, minusTree[cur]); } } public static int query(int x, int k) { - int ans = 0; - int cur = x, pre = 0, dist; - while (cur > 0) { - dist = getDist(cur, x); + int ans = query(0, k, 0, n - 1, addTree[x]); + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + int dist = getDist(x, fa); if (k - dist >= 0) { - ans += query(0, k - dist, 0, n - 1, addTree[cur]); - if (pre > 0) { - ans -= query(0, k - dist, 0, n - 1, minusTree[pre]); - } + ans += query(0, k - dist, 0, n - 1, addTree[fa]); + ans -= query(0, k - dist, 0, n - 1, minusTree[cur]); } - pre = cur; - cur = centfa[cur]; } return ans; } diff --git a/src/class185/Code01_Wave2.java b/src/class185/Code01_Wave2.java index c02b80cfc..67c496b97 100644 --- a/src/class185/Code01_Wave2.java +++ b/src/class185/Code01_Wave2.java @@ -177,31 +177,22 @@ //} // //void add(int x, int v) { -// int cur = x, pre = 0, dist; -// while (cur > 0) { -// dist = getDist(cur, x); -// addTree[cur] = add(dist, v, 0, n - 1, addTree[cur]); -// if (pre > 0) { -// minusTree[pre] = add(dist, v, 0, n - 1, minusTree[pre]); -// } -// pre = cur; -// cur = centfa[cur]; +// addTree[x] = add(0, v, 0, n - 1, addTree[x]); +// for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { +// int dist = getDist(x, fa); +// addTree[fa] = add(dist, v, 0, n - 1, addTree[fa]); +// minusTree[cur] = add(dist, v, 0, n - 1, minusTree[cur]); // } //} // //int query(int x, int k) { -// int ans = 0; -// int cur = x, pre = 0, dist; -// while (cur > 0) { -// dist = getDist(cur, x); +// int ans = query(0, k, 0, n - 1, addTree[x]); +// for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { +// int dist = getDist(x, fa); // if (k - dist >= 0) { -// ans += query(0, k - dist, 0, n - 1, addTree[cur]); -// if (pre > 0) { -// ans -= query(0, k - dist, 0, n - 1, minusTree[pre]); -// } +// ans += query(0, k - dist, 0, n - 1, addTree[fa]); +// ans -= query(0, k - dist, 0, n - 1, minusTree[cur]); // } -// pre = cur; -// cur = centfa[cur]; // } // return ans; //} From 1a7ea2a87fbc35d5d9f77996f575bd9b8918519f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 6 Dec 2025 11:53:35 +0800 Subject: [PATCH 1156/1170] modify code --- src/class185/Code02_Game1.java | 29 ++++++++++------------------- src/class185/Code02_Game2.java | 29 ++++++++++------------------- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/src/class185/Code02_Game1.java b/src/class185/Code02_Game1.java index ec12973e0..8d127eb26 100644 --- a/src/class185/Code02_Game1.java +++ b/src/class185/Code02_Game1.java @@ -243,31 +243,22 @@ public static int query(int jobl, int jobr, int l, int r, int i) { } public static void add(int x, int k, int v) { - int cur = x, pre = 0, dist; - while (cur > 0) { - dist = getDist(cur, x); + addTree[x] = add(k, v, 0, n - 1, addTree[x]); + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + int dist = getDist(x, fa); if (k - dist >= 0) { - addTree[cur] = add(k - dist, v, 0, n - 1, addTree[cur]); - if (pre > 0) { - minusTree[pre] = add(k - dist, v, 0, n - 1, minusTree[pre]); - } + addTree[fa] = add(k - dist, v, 0, n - 1, addTree[fa]); + minusTree[cur] = add(k - dist, v, 0, n - 1, minusTree[cur]); } - pre = cur; - cur = centfa[cur]; } } public static int query(int x) { - int ans = 0; - int cur = x, pre = 0, dist; - while (cur > 0) { - dist = getDist(cur, x); - ans += query(dist, n - 1, 0, n - 1, addTree[cur]); - if (pre > 0) { - ans -= query(dist, n - 1, 0, n - 1, minusTree[pre]); - } - pre = cur; - cur = centfa[cur]; + int ans = query(0, n - 1, 0, n - 1, addTree[x]); + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + int dist = getDist(x, fa); + ans += query(dist, n - 1, 0, n - 1, addTree[fa]); + ans -= query(dist, n - 1, 0, n - 1, minusTree[cur]); } return ans; } diff --git a/src/class185/Code02_Game2.java b/src/class185/Code02_Game2.java index d6d96d111..0acc5aa2a 100644 --- a/src/class185/Code02_Game2.java +++ b/src/class185/Code02_Game2.java @@ -162,31 +162,22 @@ //} // //void add(int x, int k, int v) { -// int cur = x, pre = 0, dist; -// while (cur > 0) { -// dist = getDist(cur, x); +// addTree[x] = add(k, v, 0, n - 1, addTree[x]); +// for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { +// int dist = getDist(x, fa); // if (k - dist >= 0) { -// addTree[cur] = add(k - dist, v, 0, n - 1, addTree[cur]); -// if (pre > 0) { -// minusTree[pre] = add(k - dist, v, 0, n - 1, minusTree[pre]); -// } +// addTree[fa] = add(k - dist, v, 0, n - 1, addTree[fa]); +// minusTree[cur] = add(k - dist, v, 0, n - 1, minusTree[cur]); // } -// pre = cur; -// cur = centfa[cur]; // } //} // //int query(int x) { -// int ans = 0; -// int cur = x, pre = 0, dist; -// while (cur > 0) { -// dist = getDist(cur, x); -// ans += query(dist, n - 1, 0, n - 1, addTree[cur]); -// if (pre > 0) { -// ans -= query(dist, n - 1, 0, n - 1, minusTree[pre]); -// } -// pre = cur; -// cur = centfa[cur]; +// int ans = query(0, n - 1, 0, n - 1, addTree[x]); +// for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { +// int dist = getDist(x, fa); +// ans += query(dist, n - 1, 0, n - 1, addTree[fa]); +// ans -= query(dist, n - 1, 0, n - 1, minusTree[cur]); // } // return ans; //} From 327f723ca3baa52999be52dd360682c9f2f2e9db Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 6 Dec 2025 12:04:01 +0800 Subject: [PATCH 1157/1170] modify code --- src/class185/Code03_AtmTree1.java | 39 ++++++++++++------------------- src/class185/Code03_AtmTree2.java | 39 ++++++++++++------------------- 2 files changed, 30 insertions(+), 48 deletions(-) diff --git a/src/class185/Code03_AtmTree1.java b/src/class185/Code03_AtmTree1.java index b53efc829..c70434adb 100644 --- a/src/class185/Code03_AtmTree1.java +++ b/src/class185/Code03_AtmTree1.java @@ -135,18 +135,18 @@ public static void centroidTree(int u, int fa) { } } - public static int add(int jobi, int l, int r, int i) { + public static int add(int jobi, int jobv, int l, int r, int i) { if (i == 0) { i = ++cntt; } if (l == r) { - sum[i]++; + sum[i] += jobv; } else { int mid = (l + r) >> 1; if (jobi <= mid) { - ls[i] = add(jobi, l, mid, ls[i]); + ls[i] = add(jobi, jobv, l, mid, ls[i]); } else { - rs[i] = add(jobi, mid + 1, r, rs[i]); + rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); } sum[i] = sum[ls[i]] + sum[rs[i]]; } @@ -172,31 +172,22 @@ public static int query(int jobl, int jobr, int l, int r, int i) { } public static void add(int x) { - int cur = x, pre = 0, distance; - while (cur > 0) { - distance = getDist(cur, x); - addTree[cur] = add(distance, 0, sumw, addTree[cur]); - if (pre > 0) { - minusTree[pre] = add(distance, 0, sumw, minusTree[pre]); - } - pre = cur; - cur = centfa[cur]; + addTree[x] = add(0, 1, 0, sumw, addTree[x]); + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + int dist = getDist(x, fa); + addTree[fa] = add(dist, 1, 0, sumw, addTree[fa]); + minusTree[cur] = add(dist, 1, 0, sumw, minusTree[cur]); } } public static int query(int x, int limit) { - int ans = 0; - int cur = x, pre = 0, distance; - while (cur > 0) { - distance = getDist(cur, x); - if (limit - distance >= 0) { - ans += query(0, limit - distance, 0, sumw, addTree[cur]); - if (pre > 0) { - ans -= query(0, limit - distance, 0, sumw, minusTree[pre]); - } + int ans = query(0, limit, 0, sumw, addTree[x]); + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + int dist = getDist(x, fa); + if (limit - dist >= 0) { + ans += query(0, limit - dist, 0, sumw, addTree[fa]); + ans -= query(0, limit - dist, 0, sumw, minusTree[cur]); } - pre = cur; - cur = centfa[cur]; } return ans; } diff --git a/src/class185/Code03_AtmTree2.java b/src/class185/Code03_AtmTree2.java index 9e6abf341..b809e451b 100644 --- a/src/class185/Code03_AtmTree2.java +++ b/src/class185/Code03_AtmTree2.java @@ -131,18 +131,18 @@ // } //} // -//int add(int jobi, int l, int r, int i) { +//int add(int jobi, int jobv, int l, int r, int i) { // if (i == 0) { // i = ++cntt; // } // if (l == r) { -// sum[i]++; +// sum[i] += jobv; // } else { // int mid = (l + r) >> 1; // if (jobi <= mid) { -// ls[i] = add(jobi, l, mid, ls[i]); +// ls[i] = add(jobi, jobv, l, mid, ls[i]); // } else { -// rs[i] = add(jobi, mid + 1, r, rs[i]); +// rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); // } // sum[i] = sum[ls[i]] + sum[rs[i]]; // } @@ -168,31 +168,22 @@ //} // //void add(int x) { -// int cur = x, pre = 0, distance; -// while (cur > 0) { -// distance = getDist(cur, x); -// addTree[cur] = add(distance, 0, sumw, addTree[cur]); -// if (pre > 0) { -// minusTree[pre] = add(distance, 0, sumw, minusTree[pre]); -// } -// pre = cur; -// cur = centfa[cur]; +// addTree[x] = add(0, 1, 0, sumw, addTree[x]); +// for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { +// int dist = getDist(x, fa); +// addTree[fa] = add(dist, 1, 0, sumw, addTree[fa]); +// minusTree[cur] = add(dist, 1, 0, sumw, minusTree[cur]); // } //} // //int query(int x, int limit) { -// int ans = 0; -// int cur = x, pre = 0, distance; -// while (cur > 0) { -// distance = getDist(cur, x); -// if (limit - distance >= 0) { -// ans += query(0, limit - distance, 0, sumw, addTree[cur]); -// if (pre > 0) { -// ans -= query(0, limit - distance, 0, sumw, minusTree[pre]); -// } +// int ans = query(0, limit, 0, sumw, addTree[x]); +// for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { +// int dist = getDist(x, fa); +// if (limit - dist >= 0) { +// ans += query(0, limit - dist, 0, sumw, addTree[fa]); +// ans -= query(0, limit - dist, 0, sumw, minusTree[cur]); // } -// pre = cur; -// cur = centfa[cur]; // } // return ans; //} From 293cd33790de5412972568bb3d34e7807cecc35b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 7 Dec 2025 13:35:43 +0800 Subject: [PATCH 1158/1170] modify code --- ...e05_Fantasy1.java => Code04_Fantasy1.java} | 29 +++++++-------- ...e05_Fantasy2.java => Code04_Fantasy2.java} | 35 ++++++++++--------- ...OpenStore1.java => Code05_OpenStore1.java} | 2 +- ...OpenStore2.java => Code05_OpenStore2.java} | 0 4 files changed, 34 insertions(+), 32 deletions(-) rename src/class185/{Code05_Fantasy1.java => Code04_Fantasy1.java} (92%) rename src/class185/{Code05_Fantasy2.java => Code04_Fantasy2.java} (83%) rename src/class185/{Code04_OpenStore1.java => Code05_OpenStore1.java} (99%) rename src/class185/{Code04_OpenStore2.java => Code05_OpenStore2.java} (100%) diff --git a/src/class185/Code05_Fantasy1.java b/src/class185/Code04_Fantasy1.java similarity index 92% rename from src/class185/Code05_Fantasy1.java rename to src/class185/Code04_Fantasy1.java index c94611e70..87533e708 100644 --- a/src/class185/Code05_Fantasy1.java +++ b/src/class185/Code04_Fantasy1.java @@ -2,9 +2,9 @@ // 幻想乡战略游戏,java版 // 树上有n个点,每个点的初始点权是0,给定n-1条边,每条边有边权 -// 如果点x是指挥点,它指挥点y的成本 = x到y的简单路径权值和 * y的点权 -// 树上存在某个最佳的指挥点,指挥所有点的总成本最小,叫做最小指挥总成本 -// 一共m条操作,格式 x v : 先把x的点权增加v,然后打印此时的最小指挥总成本 +// 如果点x是指挥点,它指挥点y的花费 = x到y的简单路径权值和 * y的点权 +// 树上存在某个最佳的指挥点,指挥所有点的总花费最小,叫做最小指挥总花费 +// 一共m条操作,格式 x v : 先把x的点权增加v,然后打印此时的最小指挥总花费 // 注意参数v有可能是负数,但题目保证任何时候,点权不会出现负数 // 1 <= n、m <= 10^5 // 1 <= 边权 <= 1000 @@ -17,7 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_Fantasy1 { +public class Code04_Fantasy1 { public static int MAXN = 100001; public static int n, m; @@ -39,9 +39,9 @@ public class Code05_Fantasy1 { public static boolean[] vis = new boolean[MAXN]; public static int[] centfa = new int[MAXN]; - public static long[] num = new long[MAXN]; - public static long[] xsum = new long[MAXN]; - public static long[] fsum = new long[MAXN]; + public static long[] sum = new long[MAXN]; + public static long[] addCost = new long[MAXN]; + public static long[] minusCost = new long[MAXN]; // 讲解118,递归函数改成迭代所需要的栈 public static int[][] stack = new int[MAXN][5]; @@ -261,21 +261,22 @@ public static void centroidTree(int u, int fa) { } public static void add(int x, int v) { - num[x] += v; + sum[x] += v; for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { int dist = getDist(x, fa); - num[fa] += v; - xsum[fa] += 1L * v * dist; - fsum[cur] += 1L * v * dist; + sum[fa] += v; + addCost[fa] += 1L * v * dist; + minusCost[cur] += 1L * v * dist; } } public static long query(int x) { - long ans = xsum[x]; + long ans = addCost[x]; for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { int dist = getDist(x, fa); - ans += (num[fa] - num[cur]) * dist; - ans += (xsum[fa] - fsum[cur]); + ans += addCost[fa]; + ans -= minusCost[cur]; + ans += (sum[fa] - sum[cur]) * dist; } return ans; } diff --git a/src/class185/Code05_Fantasy2.java b/src/class185/Code04_Fantasy2.java similarity index 83% rename from src/class185/Code05_Fantasy2.java rename to src/class185/Code04_Fantasy2.java index c14342653..8f6681c2d 100644 --- a/src/class185/Code05_Fantasy2.java +++ b/src/class185/Code04_Fantasy2.java @@ -2,9 +2,9 @@ // 幻想乡战略游戏,C++版 // 树上有n个点,每个点的初始点权是0,给定n-1条边,每条边有边权 -// 如果点x是指挥点,它指挥点y的成本 = x到y的简单路径权值和 * y的点权 -// 树上存在某个最佳的指挥点,指挥所有点的总成本最小,叫做最小指挥总成本 -// 一共m条操作,格式 x v : 先把x的点权增加v,然后打印此时的最小指挥总成本 +// 如果点x是指挥点,它指挥点y的花费 = x到y的简单路径权值和 * y的点权 +// 树上存在某个最佳的指挥点,指挥所有点的总花费最小,叫做最小指挥总花费 +// 一共m条操作,格式 x v : 先把x的点权增加v,然后打印此时的最小指挥总花费 // 注意参数v有可能是负数,但题目保证任何时候,点权不会出现负数 // 1 <= n、m <= 10^5 // 1 <= 边权 <= 1000 @@ -37,9 +37,9 @@ //bool vis[MAXN]; //int centfa[MAXN]; // -//long long num[MAXN]; -//long long xsum[MAXN]; -//long long fsum[MAXN]; +//long long sum[MAXN]; +//long long addCost[MAXN]; +//long long minusCost[MAXN]; // //void addEdge(int u, int v, int w) { // nxt[++cntg] = head[u]; @@ -144,21 +144,22 @@ //} // //void add(int x, int v) { -// num[x] += v; -// for (int cur = x, f = centfa[cur]; f > 0; cur = f, f = centfa[cur]) { -// int dist = getDist(x, f); -// num[f] += v; -// xsum[f] += 1LL * v * dist; -// fsum[cur] += 1LL * v * dist; +// sum[x] += v; +// for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { +// int dist = getDist(x, fa); +// sum[fa] += v; +// addCost[fa] += 1LL * v * dist; +// minusCost[cur] += 1LL * v * dist; // } //} // //long long query(int x) { -// long long ans = xsum[x]; -// for (int cur = x, f = centfa[cur]; f > 0; cur = f, f = centfa[cur]) { -// int dist = getDist(x, f); -// ans += (num[f] - num[cur]) * dist; -// ans += (xsum[f] - fsum[cur]); +// long long ans = addCost[x]; +// for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { +// int dist = getDist(x, fa); +// ans += addCost[fa]; +// ans -= minusCost[cur]; +// ans += (sum[fa] - sum[cur]) * dist; // } // return ans; //} diff --git a/src/class185/Code04_OpenStore1.java b/src/class185/Code05_OpenStore1.java similarity index 99% rename from src/class185/Code04_OpenStore1.java rename to src/class185/Code05_OpenStore1.java index 186726855..32f6777bd 100644 --- a/src/class185/Code04_OpenStore1.java +++ b/src/class185/Code05_OpenStore1.java @@ -17,7 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_OpenStore1 { +public class Code05_OpenStore1 { public static int MAXN = 200001; public static int MAXK = 10000001; diff --git a/src/class185/Code04_OpenStore2.java b/src/class185/Code05_OpenStore2.java similarity index 100% rename from src/class185/Code04_OpenStore2.java rename to src/class185/Code05_OpenStore2.java From 8e8e7d078ed28dba041fcac4af54047c8a5ff629 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 7 Dec 2025 15:16:13 +0800 Subject: [PATCH 1159/1170] modify code --- src/class185/Code01_Wave1.java | 1 - src/class185/Code01_Wave2.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/class185/Code01_Wave1.java b/src/class185/Code01_Wave1.java index 5c6a9a117..b92d957c9 100644 --- a/src/class185/Code01_Wave1.java +++ b/src/class185/Code01_Wave1.java @@ -19,7 +19,6 @@ public class Code01_Wave1 { public static int MAXN = 100001; - public static int MAXH = 18; public static int MAXT = 10000001; public static int n, m; public static int[] arr = new int[MAXN]; diff --git a/src/class185/Code01_Wave2.java b/src/class185/Code01_Wave2.java index 67c496b97..64be19f42 100644 --- a/src/class185/Code01_Wave2.java +++ b/src/class185/Code01_Wave2.java @@ -17,7 +17,6 @@ //using namespace std; // //const int MAXN = 100001; -//const int MAXH = 18; //const int MAXT = 10000001; //int n, m; //int arr[MAXN]; From 960ab91b14da88ba4a85546860fd4eb05888c669 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 7 Dec 2025 15:33:52 +0800 Subject: [PATCH 1160/1170] modify code --- src/class185/Code03_AtmTree1.java | 2 +- src/class185/Code03_AtmTree2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class185/Code03_AtmTree1.java b/src/class185/Code03_AtmTree1.java index c70434adb..38b1a136e 100644 --- a/src/class185/Code03_AtmTree1.java +++ b/src/class185/Code03_AtmTree1.java @@ -4,7 +4,7 @@ // 树上有n个点,给定n-1条边,每条边有边权 // 现在关心,从节点x出发到达其他点的距离中,第k小的距离 // 注意,节点x到自己的距离0,不参与距离评比 -// 给定正数k,打印每个节点的第k小距离 +// 给定正数k,打印每个节点的第k小距离,一共n条打印 // 1 <= n <= 15000 // 1 <= k <= 5000 // 1 <= 边权 <= 10 diff --git a/src/class185/Code03_AtmTree2.java b/src/class185/Code03_AtmTree2.java index b809e451b..404c31ab1 100644 --- a/src/class185/Code03_AtmTree2.java +++ b/src/class185/Code03_AtmTree2.java @@ -4,7 +4,7 @@ // 树上有n个点,给定n-1条边,每条边有边权 // 现在关心,从节点x出发到达其他点的距离中,第k小的距离 // 注意,节点x到自己的距离0,不参与距离评比 -// 给定正数k,打印每个节点的第k小距离 +// 给定正数k,打印每个节点的第k小距离,一共n条打印 // 1 <= n <= 15000 // 1 <= k <= 5000 // 1 <= 边权 <= 10 From aafa2ea35331a83eff0fefe1e8a7e905f0dd8e8b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 7 Dec 2025 15:55:18 +0800 Subject: [PATCH 1161/1170] modify code --- src/class185/Code03_AtmTree1.java | 10 +++++----- src/class185/Code03_AtmTree2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class185/Code03_AtmTree1.java b/src/class185/Code03_AtmTree1.java index 38b1a136e..19c08dc97 100644 --- a/src/class185/Code03_AtmTree1.java +++ b/src/class185/Code03_AtmTree1.java @@ -171,12 +171,12 @@ public static int query(int jobl, int jobr, int l, int r, int i) { return ans; } - public static void add(int x) { - addTree[x] = add(0, 1, 0, sumw, addTree[x]); + public static void add(int x, int v) { + addTree[x] = add(0, v, 0, sumw, addTree[x]); for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { int dist = getDist(x, fa); - addTree[fa] = add(dist, 1, 0, sumw, addTree[fa]); - minusTree[cur] = add(dist, 1, 0, sumw, minusTree[cur]); + addTree[fa] = add(dist, v, 0, sumw, addTree[fa]); + minusTree[cur] = add(dist, v, 0, sumw, minusTree[cur]); } } @@ -223,7 +223,7 @@ public static void main(String[] args) throws Exception { dfs(1, 0, 0); centroidTree(getCentroid(1, 0), 0); for (int i = 1; i <= n; i++) { - add(i); + add(i, 1); } for (int i = 1; i <= n; i++) { out.println(compute(i)); diff --git a/src/class185/Code03_AtmTree2.java b/src/class185/Code03_AtmTree2.java index 404c31ab1..9df591155 100644 --- a/src/class185/Code03_AtmTree2.java +++ b/src/class185/Code03_AtmTree2.java @@ -167,12 +167,12 @@ // return ans; //} // -//void add(int x) { -// addTree[x] = add(0, 1, 0, sumw, addTree[x]); +//void add(int x, int v) { +// addTree[x] = add(0, v, 0, sumw, addTree[x]); // for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { // int dist = getDist(x, fa); -// addTree[fa] = add(dist, 1, 0, sumw, addTree[fa]); -// minusTree[cur] = add(dist, 1, 0, sumw, minusTree[cur]); +// addTree[fa] = add(dist, v, 0, sumw, addTree[fa]); +// minusTree[cur] = add(dist, v, 0, sumw, minusTree[cur]); // } //} // @@ -218,7 +218,7 @@ // dfs(1, 0, 0); // centroidTree(getCentroid(1, 0), 0); // for (int i = 1; i <= n; i++) { -// add(i); +// add(i, 1); // } // for (int i = 1; i <= n; i++) { // cout << compute(i) << '\n'; From 51752560fade5e1915dd7c69fff6ace5260a6375 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 7 Dec 2025 23:48:12 +0800 Subject: [PATCH 1162/1170] modify code --- src/class073/Code07_FindKthSum.java | 85 +++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/class073/Code07_FindKthSum.java diff --git a/src/class073/Code07_FindKthSum.java b/src/class073/Code07_FindKthSum.java new file mode 100644 index 000000000..e220b75a5 --- /dev/null +++ b/src/class073/Code07_FindKthSum.java @@ -0,0 +1,85 @@ +package class073; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.PriorityQueue; + +// 同学找到的在线测试,思路来自课上的题目6 +// 找出数组的第K大和 +// 给定一个数组nums和正数k +// 可以选择数组的任何子序列并对其元素求和 +// 希望找到第k大的子序列和,子序列和允许出现重复 +// 空子序列的和视作0,数组中的值可正、可负、可0 +// 测试链接 : https://leetcode.cn/problems/find-the-k-sum-of-an-array/description/ +// +// 转化逻辑如下 : +// 1,先把所有正数加起来,得到sum,这是nums第1大子序列和 +// 2,nums第2大子序列和,要么sum中去掉一个最小的正数,要么sum + (选剩下的非正数字,拼出最大的累加和) +// 3,nums第2大子序列和 = (sum - 最小的正数) 或者 (sum - 选剩下的非正数字,拼出最小的绝对值) +// 4,原始数组记为nums,把每个数转成绝对值的数组记为a +// 5,nums第1大子序列和 = sum = sum - 0,其中0表示数组a取空集的累加和,认为是a的第1小子序列和 +// 6,nums第1大子序列和 = sum - a的第1小子序列和 +// 7,nums第2大子序列和 = sum - a的第2小子序列和 +// 8,nums第k大子序列和 = sum - a的第k小子序列和 +// 9,求a的第k小子序列和即可,注意,a的第1小子序列和,是空集的情况 + +public class Code07_FindKthSum { + + class Solution { + + static class Node { + int idx; + long val; + + public Node(int i, long v) { + idx = i; + val = v; + } + } + + static class NodeCmp implements Comparator { + + @Override + public int compare(Node o1, Node o2) { + if (o1.val != o2.val) { + return Long.compare(o1.val, o2.val); + } else { + return Integer.compare(o1.idx, o2.idx); + } + } + + } + + public long kSum(int[] nums, int k) { + int n = nums.length; + long sum = 0; + for (int i = 0; i < n; i++) { + if (nums[i] > 0) { + sum += nums[i]; + } else { + nums[i] = -nums[i]; + } + } + Arrays.sort(nums); + PriorityQueue heap = new PriorityQueue<>(new NodeCmp()); + // 空集,下标为-1,累加和为0,这是a的第1小子序列和 + heap.add(new Node(-1, 0L)); + // 弹出前k-1小 + for (int i = 1; i < k; i++) { + Node cur = heap.poll(); + int idx = cur.idx; + long val = cur.val; + if (idx + 1 < n) { + heap.add(new Node(idx + 1, val + nums[idx + 1])); + if (idx >= 0) { + heap.add(new Node(idx + 1, val - nums[idx] + nums[idx + 1])); + } + } + } + // sum - a的第k小子序列和 + return sum - heap.poll().val; + } + + } + +} From 1bdeb7efc3bf44a0a067c45be579b42eed26554a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Dec 2025 11:41:03 +0800 Subject: [PATCH 1163/1170] modify code --- src/class185/Code05_OpenStore1.java | 72 ++++++++++++++--------------- src/class185/Code05_OpenStore2.java | 50 ++++++++++---------- 2 files changed, 59 insertions(+), 63 deletions(-) diff --git a/src/class185/Code05_OpenStore1.java b/src/class185/Code05_OpenStore1.java index 32f6777bd..282cb9a6e 100644 --- a/src/class185/Code05_OpenStore1.java +++ b/src/class185/Code05_OpenStore1.java @@ -4,10 +4,8 @@ // 树上有n个人,每个人有年龄,给定n-1条路,每条路有距离 // 一共有m次查询,格式如下 // 查询 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 -// 1 <= n <= 1.5 * 10^5 -// 1 <= m <= 2 * 10^5 -// 0 <= 人的年龄 <= 10^9 -// 1 <= 路的距离 <= 1000 +// 1 <= n <= 1.5 * 10^5 1 <= m <= 2 * 10^5 +// 0 <= 年龄值 <= 10^9 1 <= 距离值 <= 1000 // 本题要求强制在线,得到操作参数的规则,打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3241 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -40,16 +38,16 @@ public class Code05_OpenStore1 { public static boolean[] vis = new boolean[MAXN]; public static int[] centfa = new int[MAXN]; - public static int[] xl = new int[MAXN]; - public static int[] xr = new int[MAXN]; - public static int[] xage = new int[MAXK]; - public static long[] xsum = new long[MAXK]; - public static int cntx; + public static int[] curl = new int[MAXN]; + public static int[] curr = new int[MAXN]; + public static int[] curAge = new int[MAXK]; + public static long[] curSum = new long[MAXK]; + public static int cntc; - public static int[] fl = new int[MAXN]; - public static int[] fr = new int[MAXN]; - public static int[] fage = new int[MAXK]; - public static long[] fsum = new long[MAXK]; + public static int[] fal = new int[MAXN]; + public static int[] far = new int[MAXN]; + public static int[] faAge = new int[MAXK]; + public static long[] faSum = new long[MAXK]; public static int cntf; // 讲解118,递归函数改成迭代所需要的栈 @@ -257,11 +255,11 @@ public static int getCentroid(int u, int fa) { } public static void collect1(int u, int fa, int sum, int rt) { - xage[++cntx] = age[u]; - xsum[cntx] = sum; + curAge[++cntc] = age[u]; + curSum[cntc] = sum; if (centfa[rt] > 0) { - fage[++cntf] = age[u]; - fsum[cntf] = getDist(u, centfa[rt]); + faAge[++cntf] = age[u]; + faSum[cntf] = getDist(u, centfa[rt]); } for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; @@ -278,11 +276,11 @@ public static void collect2(int cur, int father, int psum, int cen) { while (stacksize > 0) { pop(); if (e == -1) { - xage[++cntx] = age[u]; - xsum[cntx] = a; + curAge[++cntc] = age[u]; + curSum[cntc] = a; if (centfa[b] > 0) { - fage[++cntf] = age[u]; - fsum[cntf] = getDist(u, centfa[b]); + faAge[++cntf] = age[u]; + faSum[cntf] = getDist(u, centfa[b]); } e = head[u]; } else { @@ -302,12 +300,12 @@ public static void collect2(int cur, int father, int psum, int cen) { public static void centroidTree(int u, int fa) { centfa[u] = fa; vis[u] = true; - xl[u] = cntx + 1; - fl[u] = cntf + 1; + curl[u] = cntc + 1; + fal[u] = cntf + 1; // collect1(u, 0, 0, u); collect2(u, 0, 0, u); - xr[u] = cntx; - fr[u] = cntf; + curr[u] = cntc; + far[u] = cntf; for (int e = head[u]; e > 0; e = nxt[e]) { int v = to[e]; if (!vis[v]) { @@ -361,19 +359,19 @@ public static void query(int[] age, long[] sum, int l, int r, int agel, int ager } } - public static long compute(int u, int agel, int ager) { - query(xage, xsum, xl[u], xr[u], agel, ager); + public static long compute(int x, int agel, int ager) { + query(curAge, curSum, curl[x], curr[x], agel, ager); long ans = pathSum; long cnt1, sum1, cnt2, sum2; - for (int cur = u, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { - query(xage, xsum, xl[fa], xr[fa], agel, ager); + for (int cur = x, fa = centfa[cur]; fa > 0; cur = fa, fa = centfa[cur]) { + query(curAge, curSum, curl[fa], curr[fa], agel, ager); cnt1 = nodeCnt; sum1 = pathSum; - query(fage, fsum, fl[cur], fr[cur], agel, ager); + query(faAge, faSum, fal[cur], far[cur], agel, ager); cnt2 = nodeCnt; sum2 = pathSum; ans += sum1 - sum2; - ans += (cnt1 - cnt2) * getDist(u, fa); + ans += (cnt1 - cnt2) * getDist(x, fa); } return ans; } @@ -400,13 +398,13 @@ public static void main(String[] args) throws Exception { dfs4(1, 1); centroidTree(getCentroid(1, 0), 0); for (int i = 1; i <= n; i++) { - sort(xage, xsum, xl[i], xr[i]); - for (int j = xl[i] + 1; j <= xr[i]; j++) { - xsum[j] += xsum[j - 1]; + sort(curAge, curSum, curl[i], curr[i]); + for (int j = curl[i] + 1; j <= curr[i]; j++) { + curSum[j] += curSum[j - 1]; } - sort(fage, fsum, fl[i], fr[i]); - for (int j = fl[i] + 1; j <= fr[i]; j++) { - fsum[j] += fsum[j - 1]; + sort(faAge, faSum, fal[i], far[i]); + for (int j = fal[i] + 1; j <= far[i]; j++) { + faSum[j] += faSum[j - 1]; } } long lastAns = 0; diff --git a/src/class185/Code05_OpenStore2.java b/src/class185/Code05_OpenStore2.java index 733399db6..98cefd862 100644 --- a/src/class185/Code05_OpenStore2.java +++ b/src/class185/Code05_OpenStore2.java @@ -4,10 +4,8 @@ // 树上有n个人,每个人有年龄,给定n-1条路,每条路有距离 // 一共有m次查询,格式如下 // 查询 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 -// 1 <= n <= 1.5 * 10^5 -// 1 <= m <= 2 * 10^5 -// 0 <= 人的年龄 <= 10^9 -// 1 <= 路的距离 <= 1000 +// 1 <= n <= 1.5 * 10^5 1 <= m <= 2 * 10^5 +// 0 <= 年龄值 <= 10^9 1 <= 距离值 <= 1000 // 本题要求强制在线,得到操作参数的规则,打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P3241 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -47,14 +45,14 @@ //bool vis[MAXN]; //int centfa[MAXN]; // -//int xl[MAXN]; -//int xr[MAXN]; -//Node xarr[MAXK]; -//int cntx; +//int curl[MAXN]; +//int curr[MAXN]; +//Node curArr[MAXK]; +//int cntc; // -//int fl[MAXN]; -//int fr[MAXN]; -//Node farr[MAXK]; +//int fal[MAXN]; +//int far[MAXN]; +//Node faArr[MAXK]; //int cntf; // //void addEdge(int u, int v, int w) { @@ -147,9 +145,9 @@ //} // //void collect(int u, int f, int sum, int rt) { -// xarr[++cntx] = { age[u], sum }; +// curArr[++cntc] = { age[u], sum }; // if (centfa[rt] > 0) { -// farr[++cntf] = { age[u], getDist(u, centfa[rt]) }; +// faArr[++cntf] = { age[u], getDist(u, centfa[rt]) }; // } // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; @@ -163,11 +161,11 @@ //void centroidTree(int u, int f) { // centfa[u] = f; // vis[u] = true; -// xl[u] = cntx + 1; -// fl[u] = cntf + 1; +// curl[u] = cntc + 1; +// fal[u] = cntf + 1; // collect(u, 0, 0, u); -// xr[u] = cntx; -// fr[u] = cntf; +// curr[u] = cntc; +// far[u] = cntf; // for (int e = head[u]; e; e = nxt[e]) { // int v = to[e]; // if (!vis[v]) { @@ -205,14 +203,14 @@ //} // //long long compute(int u, int agel, int ager) { -// query(xarr, xl[u], xr[u], agel, ager); +// query(curArr, curl[u], curr[u], agel, ager); // long long ans = pathSum; // long long cnt1, sum1, cnt2, sum2; // for (int cur = u, f = centfa[cur]; f > 0; cur = f, f = centfa[cur]) { -// query(xarr, xl[f], xr[f], agel, ager); +// query(curArr, curl[f], curr[f], agel, ager); // cnt1 = nodeCnt; // sum1 = pathSum; -// query(farr, fl[cur], fr[cur], agel, ager); +// query(faArr, fal[cur], far[cur], agel, ager); // cnt2 = nodeCnt; // sum2 = pathSum; // ans += sum1 - sum2; @@ -237,13 +235,13 @@ // dfs2(1, 1); // centroidTree(getCentroid(1, 0), 0); // for (int i = 1; i <= n; i++) { -// sort(xarr + xl[i], xarr + xr[i] + 1, NodeCmp); -// for (int j = xl[i] + 1; j <= xr[i]; j++) { -// xarr[j].sum += xarr[j - 1].sum; +// sort(curArr + curl[i], curArr + curr[i] + 1, NodeCmp); +// for (int j = curl[i] + 1; j <= curr[i]; j++) { +// curArr[j].sum += curArr[j - 1].sum; // } -// sort(farr + fl[i], farr + fr[i] + 1, NodeCmp); -// for (int j = fl[i] + 1; j <= fr[i]; j++) { -// farr[j].sum += farr[j - 1].sum; +// sort(faArr + fal[i], faArr + far[i] + 1, NodeCmp); +// for (int j = fal[i] + 1; j <= far[i]; j++) { +// faArr[j].sum += faArr[j - 1].sum; // } // } // long long lastAns = 0; From 834471caddcc6634b3c5a138e1264060eaec55e9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Dec 2025 12:42:34 +0800 Subject: [PATCH 1164/1170] modify code --- src/class185/Code05_OpenStore1.java | 5 ++--- src/class185/Code05_OpenStore2.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/class185/Code05_OpenStore1.java b/src/class185/Code05_OpenStore1.java index 282cb9a6e..b9ee996aa 100644 --- a/src/class185/Code05_OpenStore1.java +++ b/src/class185/Code05_OpenStore1.java @@ -1,9 +1,8 @@ package class185; // 开店,java版 -// 树上有n个人,每个人有年龄,给定n-1条路,每条路有距离 -// 一共有m次查询,格式如下 -// 查询 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 +// 一共n个人,每个人有年龄,给定n-1条路,每条路有距离,路把人连成一棵树 +// 一共m条查询,格式 u l r : 查询年龄范围[l, r]的所有人,到第u号人的距离总和 // 1 <= n <= 1.5 * 10^5 1 <= m <= 2 * 10^5 // 0 <= 年龄值 <= 10^9 1 <= 距离值 <= 1000 // 本题要求强制在线,得到操作参数的规则,打开测试链接查看 diff --git a/src/class185/Code05_OpenStore2.java b/src/class185/Code05_OpenStore2.java index 98cefd862..ad9b2dfb6 100644 --- a/src/class185/Code05_OpenStore2.java +++ b/src/class185/Code05_OpenStore2.java @@ -1,9 +1,8 @@ package class185; // 开店,C++版 -// 树上有n个人,每个人有年龄,给定n-1条路,每条路有距离 -// 一共有m次查询,格式如下 -// 查询 u l r : 年龄在[l, r]的所有人,打印他们到第u号人的距离总和 +// 一共n个人,每个人有年龄,给定n-1条路,每条路有距离,路把人连成一棵树 +// 一共m条查询,格式 u l r : 查询年龄范围[l, r]的所有人,到第u号人的距离总和 // 1 <= n <= 1.5 * 10^5 1 <= m <= 2 * 10^5 // 0 <= 年龄值 <= 10^9 1 <= 距离值 <= 1000 // 本题要求强制在线,得到操作参数的规则,打开测试链接查看 From 11c8b766d7aedd7bf77675c90713f0f08b68bfc5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Dec 2025 12:49:31 +0800 Subject: [PATCH 1165/1170] modify code --- src/class185/Code05_OpenStore1.java | 10 +++++----- src/class185/Code05_OpenStore2.java | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class185/Code05_OpenStore1.java b/src/class185/Code05_OpenStore1.java index b9ee996aa..cad356500 100644 --- a/src/class185/Code05_OpenStore1.java +++ b/src/class185/Code05_OpenStore1.java @@ -253,7 +253,7 @@ public static int getCentroid(int u, int fa) { return u; } - public static void collect1(int u, int fa, int sum, int rt) { + public static void getList1(int u, int fa, int sum, int rt) { curAge[++cntc] = age[u]; curSum[cntc] = sum; if (centfa[rt] > 0) { @@ -264,12 +264,12 @@ public static void collect1(int u, int fa, int sum, int rt) { int v = to[e]; int w = weight[e]; if (v != fa && !vis[v]) { - collect1(v, u, sum + w, rt); + getList1(v, u, sum + w, rt); } } } - public static void collect2(int cur, int father, int psum, int cen) { + public static void getList2(int cur, int father, int psum, int cen) { stacksize = 0; push(cur, father, psum, cen, -1); while (stacksize > 0) { @@ -301,8 +301,8 @@ public static void centroidTree(int u, int fa) { vis[u] = true; curl[u] = cntc + 1; fal[u] = cntf + 1; - // collect1(u, 0, 0, u); - collect2(u, 0, 0, u); + // getList1(u, 0, 0, u); + getList2(u, 0, 0, u); curr[u] = cntc; far[u] = cntf; for (int e = head[u]; e > 0; e = nxt[e]) { diff --git a/src/class185/Code05_OpenStore2.java b/src/class185/Code05_OpenStore2.java index ad9b2dfb6..9b846409d 100644 --- a/src/class185/Code05_OpenStore2.java +++ b/src/class185/Code05_OpenStore2.java @@ -143,7 +143,7 @@ // return u; //} // -//void collect(int u, int f, int sum, int rt) { +//void getList(int u, int f, int sum, int rt) { // curArr[++cntc] = { age[u], sum }; // if (centfa[rt] > 0) { // faArr[++cntf] = { age[u], getDist(u, centfa[rt]) }; @@ -152,7 +152,7 @@ // int v = to[e]; // int w = weight[e]; // if (v != f && !vis[v]) { -// collect(v, u, sum + w, rt); +// getList(v, u, sum + w, rt); // } // } //} @@ -162,7 +162,7 @@ // vis[u] = true; // curl[u] = cntc + 1; // fal[u] = cntf + 1; -// collect(u, 0, 0, u); +// getList(u, 0, 0, u); // curr[u] = cntc; // far[u] = cntf; // for (int e = head[u]; e; e = nxt[e]) { From 284dcdbda83905f3fcf2b1c14d3c054fd3964482 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Dec 2025 13:06:05 +0800 Subject: [PATCH 1166/1170] modify code --- src/class185/Code05_OpenStore1.java | 14 +++++++++++++- src/class185/Code05_OpenStore2.java | 7 ++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/class185/Code05_OpenStore1.java b/src/class185/Code05_OpenStore1.java index cad356500..1509b56af 100644 --- a/src/class185/Code05_OpenStore1.java +++ b/src/class185/Code05_OpenStore1.java @@ -37,12 +37,14 @@ public class Code05_OpenStore1 { public static boolean[] vis = new boolean[MAXN]; public static int[] centfa = new int[MAXN]; + // cur列表(年龄,到当前重心的距离) public static int[] curl = new int[MAXN]; public static int[] curr = new int[MAXN]; public static int[] curAge = new int[MAXK]; public static long[] curSum = new long[MAXK]; public static int cntc; + // fa列表(年龄,到上级重心的距离) public static int[] fal = new int[MAXN]; public static int[] far = new int[MAXN]; public static int[] faAge = new int[MAXK]; @@ -253,6 +255,9 @@ public static int getCentroid(int u, int fa) { return u; } + // 递归版,java会爆栈,C++可以通过 + // 来到了一片连通区,当前重心是rt,上级重心是centfa[rt] + // 生成两个列表,距离到当前重心的列表,距离到上级重心的列表 public static void getList1(int u, int fa, int sum, int rt) { curAge[++cntc] = age[u]; curSum[cntc] = sum; @@ -269,6 +274,7 @@ public static void getList1(int u, int fa, int sum, int rt) { } } + // getList1的迭代版 public static void getList2(int cur, int father, int psum, int cen) { stacksize = 0; push(cur, father, psum, cen, -1); @@ -313,6 +319,7 @@ public static void centroidTree(int u, int fa) { } } + // 查询x在有序数组arr中的排名 public static int kth(int[] arr, int l, int r, int x) { int ans = r + 1; while (l <= r) { @@ -327,6 +334,8 @@ public static int kth(int[] arr, int l, int r, int x) { return ans; } + // 每个对象两个属性(age, sum),所有对象根据年龄排序 + // java自带的排序慢,手撸双指针快排,C++实现时可以用自带的排序 public static void sort(int[] age, long[] sum, int l, int r) { if (l >= r) return; int i = l, j = r, pivot = age[(l + r) >> 1], tmp1; @@ -346,6 +355,8 @@ public static void sort(int[] age, long[] sum, int l, int r) { public static long nodeCnt, pathSum; + // 下标范围[l...r]代表当前的列表,找到年龄范围[agel, ager]的人 + // 查到的人数设置给nodeCnt,查到的距离总和设置给pathSum public static void query(int[] age, long[] sum, int l, int r, int agel, int ager) { nodeCnt = pathSum = 0; if (l <= r) { @@ -369,7 +380,8 @@ public static long compute(int x, int agel, int ager) { query(faAge, faSum, fal[cur], far[cur], agel, ager); cnt2 = nodeCnt; sum2 = pathSum; - ans += sum1 - sum2; + ans += sum1; + ans -= sum2; ans += (cnt1 - cnt2) * getDist(x, fa); } return ans; diff --git a/src/class185/Code05_OpenStore2.java b/src/class185/Code05_OpenStore2.java index 9b846409d..b29f8a1aa 100644 --- a/src/class185/Code05_OpenStore2.java +++ b/src/class185/Code05_OpenStore2.java @@ -195,7 +195,7 @@ // int a = kth(arr, l, r, agel); // int b = kth(arr, l, r, ager + 1) - 1; // if (a <= b) { -// nodeCnt = 1L + b - a; +// nodeCnt = b - a + 1; // pathSum = arr[b].sum - (a == l ? 0 : arr[a - 1].sum); // } // } @@ -212,8 +212,9 @@ // query(faArr, fal[cur], far[cur], agel, ager); // cnt2 = nodeCnt; // sum2 = pathSum; -// ans += sum1 - sum2; -// ans += (cnt1 - cnt2) * 1LL * getDist(u, f); +// ans += sum1; +// ans -= sum2; +// ans += (cnt1 - cnt2) * getDist(u, f); // } // return ans; //} From b98fa8709a70ffb1a204eced7017f83facb7f807 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Dec 2025 13:10:34 +0800 Subject: [PATCH 1167/1170] modify code --- src/class185/Code05_OpenStore1.java | 4 ++-- src/class185/Code05_OpenStore2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class185/Code05_OpenStore1.java b/src/class185/Code05_OpenStore1.java index 1509b56af..7f785a541 100644 --- a/src/class185/Code05_OpenStore1.java +++ b/src/class185/Code05_OpenStore1.java @@ -17,7 +17,7 @@ public class Code05_OpenStore1 { public static int MAXN = 200001; - public static int MAXK = 10000001; + public static int MAXK = 4000001; public static int n, m, A; public static int[] age = new int[MAXN]; @@ -355,7 +355,7 @@ public static void sort(int[] age, long[] sum, int l, int r) { public static long nodeCnt, pathSum; - // 下标范围[l...r]代表当前的列表,找到年龄范围[agel, ager]的人 + // 下标范围[l...r]代表当前节点的列表,找到年龄范围[agel, ager]的人 // 查到的人数设置给nodeCnt,查到的距离总和设置给pathSum public static void query(int[] age, long[] sum, int l, int r, int agel, int ager) { nodeCnt = pathSum = 0; diff --git a/src/class185/Code05_OpenStore2.java b/src/class185/Code05_OpenStore2.java index b29f8a1aa..9c80db5c3 100644 --- a/src/class185/Code05_OpenStore2.java +++ b/src/class185/Code05_OpenStore2.java @@ -24,7 +24,7 @@ //} // //const int MAXN = 200001; -//const int MAXK = 10000001; +//const int MAXK = 4000001; //int n, m, A; //int age[MAXN]; // From dbb8d16f3efba5077132b8afa8f5d98a87fe16e3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Dec 2025 13:12:56 +0800 Subject: [PATCH 1168/1170] modify code --- src/class185/Code05_OpenStore1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class185/Code05_OpenStore1.java b/src/class185/Code05_OpenStore1.java index 7f785a541..2a3734dc8 100644 --- a/src/class185/Code05_OpenStore1.java +++ b/src/class185/Code05_OpenStore1.java @@ -37,14 +37,14 @@ public class Code05_OpenStore1 { public static boolean[] vis = new boolean[MAXN]; public static int[] centfa = new int[MAXN]; - // cur列表(年龄,到当前重心的距离) + // cur列表(年龄,到当前重心距离) public static int[] curl = new int[MAXN]; public static int[] curr = new int[MAXN]; public static int[] curAge = new int[MAXK]; public static long[] curSum = new long[MAXK]; public static int cntc; - // fa列表(年龄,到上级重心的距离) + // fa列表(年龄,到上级重心距离) public static int[] fal = new int[MAXN]; public static int[] far = new int[MAXN]; public static int[] faAge = new int[MAXK]; From cc360b05e88226fa3c036327ec7c5b3c13a10788 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Dec 2025 15:50:40 +0800 Subject: [PATCH 1169/1170] modify code --- src/class185/Code06_ChengDu1.java | 85 +++++++++++++++---------------- src/class185/Code06_ChengDu2.java | 54 +++++++++++--------- 2 files changed, 70 insertions(+), 69 deletions(-) diff --git a/src/class185/Code06_ChengDu1.java b/src/class185/Code06_ChengDu1.java index ab94b9f34..2cc5cca72 100644 --- a/src/class185/Code06_ChengDu1.java +++ b/src/class185/Code06_ChengDu1.java @@ -34,15 +34,15 @@ public class Code06_ChengDu1 { public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; - public static int[] xl = new int[MAXN]; - public static int[] xr = new int[MAXN]; - public static int[] xid = new int[MAXN]; - public static int cntx; + public static int[] nodel = new int[MAXN]; + public static int[] noder = new int[MAXN]; + public static int[] ncolor = new int[MAXN]; + public static int cntNode; - public static int[] yl = new int[MAXN]; - public static int[] yr = new int[MAXN]; - public static int[] yid = new int[MAXN]; - public static int cnty; + public static int[] quesl = new int[MAXN]; + public static int[] quesr = new int[MAXN]; + public static int[] quesid = new int[MAXN]; + public static int cntQues; public static int[] pos = new int[MAXN]; public static int[] tree = new int[MAXN]; @@ -175,17 +175,14 @@ public static int getCentroid(int u, int fa) { } public static void dfs1(int u, int fa, int nl, int nr) { - xl[++cntx] = nl; - xr[cntx] = nr; - xid[cntx] = color[u]; - for (int e = headq[u]; e > 0; e = nxtq[e]) { - int qui = qid[e]; - int qul = ql[e]; - int qur = qr[e]; - if (qul <= nl && nr <= qur) { - yl[++cnty] = qul; - yr[cnty] = qur; - yid[cnty] = qui; + nodel[++cntNode] = nl; + noder[cntNode] = nr; + ncolor[cntNode] = color[u]; + for (int ei = headq[u]; ei > 0; ei = nxtq[ei]) { + if (ql[ei] <= nl && nr <= qr[ei]) { + quesl[++cntQues] = ql[ei]; + quesr[cntQues] = qr[ei]; + quesid[cntQues] = qid[ei]; } } for (int e = headg[u]; e > 0; e = nxtg[e]) { @@ -197,23 +194,20 @@ public static void dfs1(int u, int fa, int nl, int nr) { } // dfs1的迭代版 - public static void dfs2(int cur, int fa, int nodel, int noder) { + public static void dfs2(int cur, int fa, int nodeMin, int nodeMax) { stacksize = 0; - push(cur, fa, nodel, noder, -1); + push(cur, fa, nodeMin, nodeMax, -1); while (stacksize > 0) { pop(); if (e == -1) { - xl[++cntx] = nl; - xr[cntx] = nr; - xid[cntx] = color[u]; - for (int e = headq[u]; e > 0; e = nxtq[e]) { - int qui = qid[e]; - int qul = ql[e]; - int qur = qr[e]; - if (qul <= nl && nr <= qur) { - yl[++cnty] = qul; - yr[cnty] = qur; - yid[cnty] = qui; + nodel[++cntNode] = nl; + noder[cntNode] = nr; + ncolor[cntNode] = color[u]; + for (int ei = headq[u]; ei > 0; ei = nxtq[ei]) { + if (ql[ei] <= nl && nr <= qr[ei]) { + quesl[++cntQues] = ql[ei]; + quesr[cntQues] = qr[ei]; + quesid[cntQues] = qid[ei]; } } e = headg[u]; @@ -248,25 +242,26 @@ public static void sort(int[] al, int[] ar, int[] ai, int l, int r) { } public static void calc(int u) { - cntx = cnty = 0; + cntNode = 0; + cntQues = 0; // dfs1(u, 0, u, u); dfs2(u, 0, u, u); - sort(xl, xr, xid, 1, cntx); - sort(yl, yr, yid, 1, cnty); - for (int i = 1, j = 1; i <= cnty; i++) { - while (j <= cntx && xr[j] <= yr[i]) { - if (xl[j] > pos[xid[j]]) { - add(pos[xid[j]], -1); - pos[xid[j]] = xl[j]; - add(pos[xid[j]], 1); + sort(nodel, noder, ncolor, 1, cntNode); + sort(quesl, quesr, quesid, 1, cntQues); + for (int i = 1, j = 1; i <= cntQues; i++) { + while (j <= cntNode && noder[j] <= quesr[i]) { + if (nodel[j] > pos[ncolor[j]]) { + add(pos[ncolor[j]], -1); + pos[ncolor[j]] = nodel[j]; + add(pos[ncolor[j]], 1); } j++; } - ans[yid[i]] = Math.max(ans[yid[i]], query(yl[i], n)); + ans[quesid[i]] = Math.max(ans[quesid[i]], query(quesl[i], n)); } - for (int i = 1; i <= cntx; i++) { - add(pos[xid[i]], -1); - pos[xid[i]] = 0; + for (int i = 1; i <= cntNode; i++) { + add(pos[ncolor[i]], -1); + pos[ncolor[i]] = 0; } } diff --git a/src/class185/Code06_ChengDu2.java b/src/class185/Code06_ChengDu2.java index 74e318755..1f03abb4d 100644 --- a/src/class185/Code06_ChengDu2.java +++ b/src/class185/Code06_ChengDu2.java @@ -14,13 +14,21 @@ //using namespace std; // //struct Node { -// int l, r, id; +// int l, r, color; +//}; +// +//struct Ques { +// int l, r, qid; //}; // //bool NodeCmp(Node x, Node y) { // return x.r < y.r; //} // +//bool QuesCmp(Ques x, Ques y) { +// return x.r < y.r; +//} +// //const int MAXN = 100001; //int n, m; //int color[MAXN]; @@ -40,11 +48,11 @@ //bool vis[MAXN]; //int siz[MAXN]; // -//Node arrx[MAXN]; -//int cntx; +//Node nodeArr[MAXN]; +//int cntNode; // -//Node arry[MAXN]; -//int cnty; +//Ques quesArr[MAXN]; +//int cntQues; // //int pos[MAXN]; //int tree[MAXN]; @@ -123,13 +131,10 @@ //} // //void dfs(int u, int fa, int nl, int nr) { -// arrx[++cntx] = { nl, nr, color[u] }; +// nodeArr[++cntNode] = { nl, nr, color[u] }; // for (int e = headq[u]; e > 0; e = nxtq[e]) { -// int qui = qid[e]; -// int qul = ql[e]; -// int qur = qr[e]; -// if (qul <= nl && nr <= qur) { -// arry[++cnty] = { qul, qur, qui }; +// if (ql[e] <= nl && nr <= qr[e]) { +// quesArr[++cntQues] = { ql[e], qr[e], qid[e] }; // } // } // for (int e = headg[u]; e > 0; e = nxtg[e]) { @@ -141,24 +146,25 @@ //} // //void calc(int u) { -// cntx = cnty = 0; +// cntNode = 0; +// cntQues = 0; // dfs(u, 0, u, u); -// sort(arrx + 1, arrx + cntx + 1, NodeCmp); -// sort(arry + 1, arry + cnty + 1, NodeCmp); -// for (int i = 1, j = 1; i <= cnty; i++) { -// while (j <= cntx && arrx[j].r <= arry[i].r) { -// if (arrx[j].l > pos[arrx[j].id]) { -// add(pos[arrx[j].id], -1); -// pos[arrx[j].id] = arrx[j].l; -// add(pos[arrx[j].id], 1); +// sort(nodeArr + 1, nodeArr + cntNode + 1, NodeCmp); +// sort(quesArr + 1, quesArr + cntQues + 1, QuesCmp); +// for (int i = 1, j = 1; i <= cntQues; i++) { +// while (j <= cntNode && nodeArr[j].r <= quesArr[i].r) { +// if (nodeArr[j].l > pos[nodeArr[j].color]) { +// add(pos[nodeArr[j].color], -1); +// pos[nodeArr[j].color] = nodeArr[j].l; +// add(pos[nodeArr[j].color], 1); // } // j++; // } -// ans[arry[i].id] = max(ans[arry[i].id], query(arry[i].l, n)); +// ans[quesArr[i].qid] = max(ans[quesArr[i].qid], query(quesArr[i].l, n)); // } -// for (int i = 1; i <= cntx; i++) { -// add(pos[arrx[i].id], -1); -// pos[arrx[i].id] = 0; +// for (int i = 1; i <= cntNode; i++) { +// add(pos[nodeArr[i].color], -1); +// pos[nodeArr[i].color] = 0; // } //} // From 050a7410c43a54cc9b9a9887f98e2635673dc31b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 8 Dec 2025 17:53:57 +0800 Subject: [PATCH 1170/1170] modify code --- src/class185/Code06_ChengDu1.java | 9 ++++++++- src/class185/Code06_ChengDu2.java | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/class185/Code06_ChengDu1.java b/src/class185/Code06_ChengDu1.java index 2cc5cca72..987922187 100644 --- a/src/class185/Code06_ChengDu1.java +++ b/src/class185/Code06_ChengDu1.java @@ -19,11 +19,13 @@ public class Code06_ChengDu1 { public static int n, m; public static int[] color = new int[MAXN]; + // 建树 public static int[] headg = new int[MAXN]; public static int[] nxtg = new int[MAXN << 1]; public static int[] tog = new int[MAXN << 1]; public static int cntg; + // 每个节点的问题列表 public static int[] headq = new int[MAXN]; public static int[] nxtq = new int[MAXN]; public static int[] ql = new int[MAXN]; @@ -31,22 +33,27 @@ public class Code06_ChengDu1 { public static int[] qid = new int[MAXN]; public static int cntq; + // 点分治 public static boolean[] vis = new boolean[MAXN]; public static int[] siz = new int[MAXN]; + // 每来到一个重心,收集节点列表,nodel和noder是解锁条件,ncolor是节点颜色 public static int[] nodel = new int[MAXN]; public static int[] noder = new int[MAXN]; public static int[] ncolor = new int[MAXN]; public static int cntNode; + // 每来到一个重心,收集问题列表,只收集值得讨论的问题 public static int[] quesl = new int[MAXN]; public static int[] quesr = new int[MAXN]; public static int[] quesid = new int[MAXN]; public static int cntQues; + // pos[v] = i,表示颜色v的左边界,最右位置出现在i public static int[] pos = new int[MAXN]; + // 树状数组 public static int[] tree = new int[MAXN]; - + // 问题答案 public static int[] ans = new int[MAXN]; // 讲解118,递归函数改成迭代所需要的栈 diff --git a/src/class185/Code06_ChengDu2.java b/src/class185/Code06_ChengDu2.java index 1f03abb4d..8433a12ec 100644 --- a/src/class185/Code06_ChengDu2.java +++ b/src/class185/Code06_ChengDu2.java @@ -56,7 +56,6 @@ // //int pos[MAXN]; //int tree[MAXN]; -// //int ans[MAXN]; // //void addEdge(int u, int v) {